@universityofmaryland/web-elements-library 1.6.0 → 1.6.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/_types.d.ts +4 -0
- package/dist/_types.d.ts.map +1 -1
- package/dist/atomic/_types.d.ts +4 -4
- package/dist/atomic/_types.d.ts.map +1 -1
- package/dist/atomic/animations/brand/card-stack.d.ts.map +1 -1
- package/dist/atomic/animations/brand/card-stack.js +4 -2
- package/dist/atomic/animations/brand/card-stack.js.map +1 -1
- package/dist/atomic/assets/image/background.d.ts +2 -0
- package/dist/atomic/assets/image/background.d.ts.map +1 -1
- package/dist/atomic/assets/image/background.js +25 -3
- package/dist/atomic/assets/image/background.js.map +1 -1
- package/dist/atomic/assets/image/gif.d.ts.map +1 -1
- package/dist/atomic/assets/image/gif.js +102 -43
- package/dist/atomic/assets/image/gif.js.map +1 -1
- package/dist/atomic/assets/image/index.d.ts +1 -0
- package/dist/atomic/assets/image/index.d.ts.map +1 -1
- package/dist/atomic/assets/image/index.js +2 -0
- package/dist/atomic/assets/image/index.js.map +1 -1
- package/dist/atomic/assets/image/lazy.d.ts +19 -0
- package/dist/atomic/assets/image/lazy.d.ts.map +1 -0
- package/dist/atomic/assets/image/lazy.js +117 -0
- package/dist/atomic/assets/image/lazy.js.map +1 -0
- package/dist/atomic/assets/video/observed-auto-play.d.ts +3 -1
- package/dist/atomic/assets/video/observed-auto-play.d.ts.map +1 -1
- package/dist/atomic/assets/video/observed-auto-play.js +7 -2
- package/dist/atomic/assets/video/observed-auto-play.js.map +1 -1
- package/dist/atomic/layout/person/columns.d.ts +1 -1
- package/dist/atomic/layout/person/columns.d.ts.map +1 -1
- package/dist/atomic/layout/person/columns.js +18 -17
- package/dist/atomic/layout/person/columns.js.map +1 -1
- package/dist/atomic/text-lockup/person.d.ts +1 -1
- package/dist/atomic/text-lockup/person.d.ts.map +1 -1
- package/dist/atomic/text-lockup/person.js +18 -18
- package/dist/atomic/text-lockup/person.js.map +1 -1
- package/dist/composite/card/_types.d.ts +4 -4
- package/dist/composite/card/_types.d.ts.map +1 -1
- package/dist/composite/card/block.d.ts.map +1 -1
- package/dist/composite/card/block.js +3 -1
- package/dist/composite/card/block.js.map +1 -1
- package/dist/composite/card/list.d.ts.map +1 -1
- package/dist/composite/card/list.js +2 -1
- package/dist/composite/card/list.js.map +1 -1
- package/dist/composite/card/overlay/image.d.ts.map +1 -1
- package/dist/composite/card/overlay/image.js +9 -1
- package/dist/composite/card/overlay/image.js.map +1 -1
- package/dist/composite/carousel/wide/frames.d.ts.map +1 -1
- package/dist/composite/carousel/wide/frames.js +2 -1
- package/dist/composite/carousel/wide/frames.js.map +1 -1
- package/dist/composite/carousel/wide/index.d.ts.map +1 -1
- package/dist/composite/carousel/wide/index.js +2 -1
- package/dist/composite/carousel/wide/index.js.map +1 -1
- package/dist/composite/hero/custom/expand.d.ts.map +1 -1
- package/dist/composite/hero/custom/expand.js +3 -1
- package/dist/composite/hero/custom/expand.js.map +1 -1
- package/dist/composite/hero/custom/grid.d.ts.map +1 -1
- package/dist/composite/hero/custom/grid.js +5 -1
- package/dist/composite/hero/custom/grid.js.map +1 -1
- package/dist/composite/hero/custom/video-arrow.d.ts.map +1 -1
- package/dist/composite/hero/custom/video-arrow.js +2 -0
- package/dist/composite/hero/custom/video-arrow.js.map +1 -1
- package/dist/composite/hero/logo.d.ts.map +1 -1
- package/dist/composite/hero/logo.js +3 -1
- package/dist/composite/hero/logo.js.map +1 -1
- package/dist/composite/hero/minimal.d.ts.map +1 -1
- package/dist/composite/hero/minimal.js +3 -1
- package/dist/composite/hero/minimal.js.map +1 -1
- package/dist/composite/hero/overlay.d.ts.map +1 -1
- package/dist/composite/hero/overlay.js +6 -2
- package/dist/composite/hero/overlay.js.map +1 -1
- package/dist/composite/hero/stacked.d.ts.map +1 -1
- package/dist/composite/hero/stacked.js +5 -1
- package/dist/composite/hero/stacked.js.map +1 -1
- package/dist/composite/hero/standard.d.ts.map +1 -1
- package/dist/composite/hero/standard.js +6 -2
- package/dist/composite/hero/standard.js.map +1 -1
- package/dist/composite/media/elements/gif.d.ts.map +1 -1
- package/dist/composite/media/elements/gif.js +1 -0
- package/dist/composite/media/elements/gif.js.map +1 -1
- package/dist/composite/pathway/_common.d.ts.map +1 -1
- package/dist/composite/pathway/_common.js +1 -0
- package/dist/composite/pathway/_common.js.map +1 -1
- package/dist/composite/pathway/hero.d.ts.map +1 -1
- package/dist/composite/pathway/hero.js +5 -1
- package/dist/composite/pathway/hero.js.map +1 -1
- package/dist/composite/pathway/highlight.d.ts.map +1 -1
- package/dist/composite/pathway/highlight.js +3 -0
- package/dist/composite/pathway/highlight.js.map +1 -1
- package/dist/composite/person/_types.d.ts +4 -4
- package/dist/composite/person/_types.d.ts.map +1 -1
- package/dist/composite/person/bio/full.d.ts.map +1 -1
- package/dist/composite/person/bio/full.js +11 -2
- package/dist/composite/person/bio/full.js.map +1 -1
- package/dist/composite/person/bio/small.d.ts.map +1 -1
- package/dist/composite/person/bio/small.js +10 -1
- package/dist/composite/person/bio/small.js.map +1 -1
- package/dist/composite/person/block.d.ts.map +1 -1
- package/dist/composite/person/block.js +4 -1
- package/dist/composite/person/block.js.map +1 -1
- package/dist/composite/person/hero.d.ts.map +1 -1
- package/dist/composite/person/hero.js +3 -1
- package/dist/composite/person/hero.js.map +1 -1
- package/dist/composite/person/list.d.ts +1 -1
- package/dist/composite/person/list.d.ts.map +1 -1
- package/dist/composite/person/list.js +8 -8
- package/dist/composite/person/list.js.map +1 -1
- package/dist/composite/person/tabular.d.ts +1 -1
- package/dist/composite/person/tabular.d.ts.map +1 -1
- package/dist/composite/person/tabular.js +8 -8
- package/dist/composite/person/tabular.js.map +1 -1
- package/package.json +1 -1
|
@@ -35,6 +35,7 @@ const createCompositeCardBlock = (props) => {
|
|
|
35
35
|
hasBorder,
|
|
36
36
|
hasEyebrowRibbon,
|
|
37
37
|
image: image$1,
|
|
38
|
+
imageLoading = "lazy",
|
|
38
39
|
isAligned,
|
|
39
40
|
isThemeDark,
|
|
40
41
|
isTransparent,
|
|
@@ -55,7 +56,8 @@ const createCompositeCardBlock = (props) => {
|
|
|
55
56
|
element: image$1,
|
|
56
57
|
isScaled: true,
|
|
57
58
|
isAspectStandard: isAligned,
|
|
58
|
-
dateSign
|
|
59
|
+
dateSign,
|
|
60
|
+
imageLoading
|
|
59
61
|
})
|
|
60
62
|
],
|
|
61
63
|
customStyles: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block.js","sources":["../../../source/composite/card/block.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { createMediaQuery } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, layout, textLockup } from 'atomic';\nimport { CardBlockProps } from './_types';\nimport { type UMDElement } from '../../_types';\n\nconst smallBreakpoint = token.media.breakpointValues.small.max;\n\nexport const createCompositeCardBlock = (props: CardBlockProps) => {\n const {\n dateSign,\n hasBorder,\n hasEyebrowRibbon,\n image,\n isAligned,\n isThemeDark,\n isTransparent,\n newsId,\n } = props;\n const shouldImageBeFullWidth = hasEyebrowRibbon;\n const children: UMDElement[] = [];\n const sizingProps = {\n isThemeDark,\n isTransparent,\n hasBorder,\n };\n\n if (image) {\n children.push(\n layout.block.stacked.image({\n children: [\n assets.image.background({\n element: image,\n isScaled: true,\n isAspectStandard: isAligned,\n dateSign,\n }),\n ],\n customStyles: {\n ...(shouldImageBeFullWidth && {\n ...createMediaQuery('max-width', smallBreakpoint, {\n marginBottom: token.spacing.md,\n width: '100%',\n }),\n }),\n },\n ...sizingProps,\n }),\n );\n }\n\n children.push(\n layout.block.stacked.textContainer({\n children: [textLockup.smallScaling(props)],\n ...sizingProps,\n }),\n );\n\n const composite = layout.block.stacked.container({\n children,\n ...sizingProps,\n });\n\n if (newsId) {\n composite?.element.setAttribute('news-id', newsId);\n }\n\n return composite;\n};\n"],"names":["image","layout.block.stacked.image","assets.image.background","layout.block.stacked.textContainer","textLockup.smallScaling","layout.block.stacked.container"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAM,kBAAkB,MAAM,MAAM,iBAAiB,MAAM;AAEpD,MAAM,2BAA2B,CAAC,UAA0B;AACjE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IAAA,OACAA;AAAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,yBAAyB;AAC/B,QAAM,WAAyB,CAAA;AAC/B,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,MAAIA,SAAO;AACT,aAAS;AAAA,MACPC,MAA2B;AAAA,QACzB,UAAU;AAAA,UACRC,sBAAwB;AAAA,YACtB,SAASF;AAAAA,YACT,UAAU;AAAA,YACV,kBAAkB;AAAA,YAClB;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,cAAc;AAAA,UACZ,GAAI,0BAA0B;AAAA,YAC5B,GAAG,iBAAiB,aAAa,iBAAiB;AAAA,cAChD,cAAc,MAAM,QAAQ;AAAA,cAC5B,OAAO;AAAA,YAAA,CACR;AAAA,UAAA;AAAA,QACH;AAAA,QAEF,GAAG;AAAA,MAAA,CACJ;AAAA,IAAA;AAAA,EAEL;AAEA,WAAS;AAAA,IACPG,cAAmC;AAAA,MACjC,UAAU,CAACC,6BAAwB,KAAK,CAAC;AAAA,MACzC,GAAG;AAAA,IAAA,CACJ;AAAA,EAAA;AAGH,QAAM,YAAYC,UAA+B;AAAA,IAC/C;AAAA,IACA,GAAG;AAAA,EAAA,CACJ;AAED,MAAI,QAAQ;AACV,eAAW,QAAQ,aAAa,WAAW,MAAM;AAAA,EACnD;AAEA,SAAO;AACT;"}
|
|
1
|
+
{"version":3,"file":"block.js","sources":["../../../source/composite/card/block.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { createMediaQuery } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, layout, textLockup } from 'atomic';\nimport { CardBlockProps } from './_types';\nimport { type UMDElement } from '../../_types';\n\nconst smallBreakpoint = token.media.breakpointValues.small.max;\n\nexport const createCompositeCardBlock = (props: CardBlockProps) => {\n const {\n dateSign,\n hasBorder,\n hasEyebrowRibbon,\n image,\n imageLoading = 'lazy',\n isAligned,\n isThemeDark,\n isTransparent,\n newsId,\n } = props;\n const shouldImageBeFullWidth = hasEyebrowRibbon;\n const children: UMDElement[] = [];\n const sizingProps = {\n isThemeDark,\n isTransparent,\n hasBorder,\n };\n\n if (image) {\n children.push(\n layout.block.stacked.image({\n children: [\n assets.image.background({\n element: image,\n isScaled: true,\n isAspectStandard: isAligned,\n dateSign,\n imageLoading,\n }),\n ],\n customStyles: {\n ...(shouldImageBeFullWidth && {\n ...createMediaQuery('max-width', smallBreakpoint, {\n marginBottom: token.spacing.md,\n width: '100%',\n }),\n }),\n },\n ...sizingProps,\n }),\n );\n }\n\n children.push(\n layout.block.stacked.textContainer({\n children: [textLockup.smallScaling(props)],\n ...sizingProps,\n }),\n );\n\n const composite = layout.block.stacked.container({\n children,\n ...sizingProps,\n });\n\n if (newsId) {\n composite?.element.setAttribute('news-id', newsId);\n }\n\n return composite;\n};\n"],"names":["image","layout.block.stacked.image","assets.image.background","layout.block.stacked.textContainer","textLockup.smallScaling","layout.block.stacked.container"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAM,kBAAkB,MAAM,MAAM,iBAAiB,MAAM;AAEpD,MAAM,2BAA2B,CAAC,UAA0B;AACjE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IAAA,OACAA;AAAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,yBAAyB;AAC/B,QAAM,WAAyB,CAAA;AAC/B,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,MAAIA,SAAO;AACT,aAAS;AAAA,MACPC,MAA2B;AAAA,QACzB,UAAU;AAAA,UACRC,sBAAwB;AAAA,YACtB,SAASF;AAAAA,YACT,UAAU;AAAA,YACV,kBAAkB;AAAA,YAClB;AAAA,YACA;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,cAAc;AAAA,UACZ,GAAI,0BAA0B;AAAA,YAC5B,GAAG,iBAAiB,aAAa,iBAAiB;AAAA,cAChD,cAAc,MAAM,QAAQ;AAAA,cAC5B,OAAO;AAAA,YAAA,CACR;AAAA,UAAA;AAAA,QACH;AAAA,QAEF,GAAG;AAAA,MAAA,CACJ;AAAA,IAAA;AAAA,EAEL;AAEA,WAAS;AAAA,IACPG,cAAmC;AAAA,MACjC,UAAU,CAACC,6BAAwB,KAAK,CAAC;AAAA,MACzC,GAAG;AAAA,IAAA,CACJ;AAAA,EAAA;AAGH,QAAM,YAAYC,UAA+B;AAAA,IAC/C;AAAA,IACA,GAAG;AAAA,EAAA,CACJ;AAED,MAAI,QAAQ;AACV,eAAW,QAAQ,aAAa,WAAW,MAAM;AAAA,EACnD;AAEA,SAAO;AACT;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../source/composite/card/list.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../source/composite/card/list.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA0GzC,eAAO,MAAM,uBAAuB,GAAI,OAAO,aAAa,kFA4C3D,CAAC"}
|
|
@@ -65,7 +65,8 @@ const makeImageColumn = ({
|
|
|
65
65
|
const backgroundImage = createImageBackground({
|
|
66
66
|
element: image,
|
|
67
67
|
isScaled: isAligned,
|
|
68
|
-
isGifAllowed: false
|
|
68
|
+
isGifAllowed: false,
|
|
69
|
+
imageLoading: "lazy"
|
|
69
70
|
});
|
|
70
71
|
return new ElementBuilder().withClassName("card-list-image-wrapper").withStyles({
|
|
71
72
|
element: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sources":["../../../source/composite/card/list.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport { createMediaQuery } from '@universityofmaryland/web-utilities-library/styles';\nimport { textLockup, assets } from 'atomic';\nimport { CardListProps } from './_types';\nimport { type UMDElement } from '../../_types';\n\nconst smallBreakpoint = token.media.breakpointValues.small.max;\nconst mediumBreakpointStart = token.media.breakpointValues.medium.min;\nconst mediumBreakpoint = token.media.breakpointValues.large.min;\n\nconst makeDateColumn = (dateSign: UMDElement) =>\n new ElementBuilder()\n .withClassName('card-list-date-sign-wrapper')\n .withStyles({\n element: {\n width: `${token.spacing.xl}`,\n order: 1,\n alignSelf: 'flex-start',\n\n ...createMediaQuery('max-width', mediumBreakpoint, {\n display: 'none',\n }),\n ...createMediaQuery('min-width', mediumBreakpoint, {\n width: `${token.spacing['8xl']}`,\n }),\n },\n })\n .withChild(dateSign)\n .build();\n\nconst makeTextColumn = (props: CardListProps) => {\n const lockup = textLockup.small(props);\n\n return new ElementBuilder()\n .withClassName('card-list-text-wrapper')\n .withStyles({\n element: {\n flex: '1 0',\n\n ...createMediaQuery('min-width', mediumBreakpointStart, {\n paddingRight: `${token.spacing.md}`,\n order: '2',\n }),\n\n ...createMediaQuery('min-width', mediumBreakpoint, {\n width: '208px',\n }),\n },\n })\n .withChild(lockup)\n .build();\n};\n\nconst makeImageColumn = ({\n image,\n isAligned,\n}: {\n image: NonNullable<CardListProps['image']>;\n isAligned?: CardListProps['isAligned'];\n}) => {\n const backgroundImage = assets.image.background({\n element: image,\n isScaled: isAligned,\n isGifAllowed: false,\n });\n\n return new ElementBuilder()\n .withClassName('card-list-image-wrapper')\n .withStyles({\n element: {\n ...createMediaQuery('max-width', smallBreakpoint, {\n marginLeft: token.spacing.min,\n marginBottom: token.spacing.md,\n width: '120px',\n float: 'right',\n position: 'relative',\n zIndex: 99,\n\n ...(isAligned && {\n height: '104px',\n }),\n }),\n\n ...createMediaQuery('min-width', mediumBreakpointStart, {\n display: 'block',\n width: '160px',\n order: '3',\n\n ...(isAligned && {\n height: '160px',\n }),\n }),\n\n ...createMediaQuery('min-width', mediumBreakpoint, {\n width: '208px',\n }),\n\n '& img': {\n ...createMediaQuery('max-width', smallBreakpoint, {\n height: 'auto !important',\n }),\n },\n },\n })\n .withChild(backgroundImage)\n .build();\n};\n\nexport const createCompositeCardList = (props: CardListProps) => {\n const { image, isAligned, isThemeDark, dateSign } = props;\n let children: UMDElement[] = [];\n\n if (image) {\n children.push(makeImageColumn({ image, isAligned }));\n }\n\n if (dateSign) {\n children.push(makeDateColumn(dateSign));\n }\n\n children.push(makeTextColumn(props));\n\n const wrapper = new ElementBuilder()\n .withClassName('card-list-wrapper')\n .withStyles({\n element: {\n containerType: 'inline-size',\n\n ...createMediaQuery('min-width', mediumBreakpointStart, {\n display: 'flex',\n justifyContent: 'space-between',\n }),\n },\n })\n .withChildren(...children)\n .build();\n\n return new ElementBuilder()\n .withClassName('card-list-container')\n .withStyles({\n element: {\n height: '100%',\n overflow: 'hidden',\n\n ...(isThemeDark && {\n backgroundColor: token.color.black,\n color: token.color.white,\n }),\n },\n })\n .withChild(wrapper)\n .build();\n};\n"],"names":["textLockup.small","assets.image.background"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"list.js","sources":["../../../source/composite/card/list.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport { createMediaQuery } from '@universityofmaryland/web-utilities-library/styles';\nimport { textLockup, assets } from 'atomic';\nimport { CardListProps } from './_types';\nimport { type UMDElement } from '../../_types';\n\nconst smallBreakpoint = token.media.breakpointValues.small.max;\nconst mediumBreakpointStart = token.media.breakpointValues.medium.min;\nconst mediumBreakpoint = token.media.breakpointValues.large.min;\n\nconst makeDateColumn = (dateSign: UMDElement) =>\n new ElementBuilder()\n .withClassName('card-list-date-sign-wrapper')\n .withStyles({\n element: {\n width: `${token.spacing.xl}`,\n order: 1,\n alignSelf: 'flex-start',\n\n ...createMediaQuery('max-width', mediumBreakpoint, {\n display: 'none',\n }),\n ...createMediaQuery('min-width', mediumBreakpoint, {\n width: `${token.spacing['8xl']}`,\n }),\n },\n })\n .withChild(dateSign)\n .build();\n\nconst makeTextColumn = (props: CardListProps) => {\n const lockup = textLockup.small(props);\n\n return new ElementBuilder()\n .withClassName('card-list-text-wrapper')\n .withStyles({\n element: {\n flex: '1 0',\n\n ...createMediaQuery('min-width', mediumBreakpointStart, {\n paddingRight: `${token.spacing.md}`,\n order: '2',\n }),\n\n ...createMediaQuery('min-width', mediumBreakpoint, {\n width: '208px',\n }),\n },\n })\n .withChild(lockup)\n .build();\n};\n\nconst makeImageColumn = ({\n image,\n isAligned,\n}: {\n image: NonNullable<CardListProps['image']>;\n isAligned?: CardListProps['isAligned'];\n}) => {\n const backgroundImage = assets.image.background({\n element: image,\n isScaled: isAligned,\n isGifAllowed: false,\n imageLoading: 'lazy',\n });\n\n return new ElementBuilder()\n .withClassName('card-list-image-wrapper')\n .withStyles({\n element: {\n ...createMediaQuery('max-width', smallBreakpoint, {\n marginLeft: token.spacing.min,\n marginBottom: token.spacing.md,\n width: '120px',\n float: 'right',\n position: 'relative',\n zIndex: 99,\n\n ...(isAligned && {\n height: '104px',\n }),\n }),\n\n ...createMediaQuery('min-width', mediumBreakpointStart, {\n display: 'block',\n width: '160px',\n order: '3',\n\n ...(isAligned && {\n height: '160px',\n }),\n }),\n\n ...createMediaQuery('min-width', mediumBreakpoint, {\n width: '208px',\n }),\n\n '& img': {\n ...createMediaQuery('max-width', smallBreakpoint, {\n height: 'auto !important',\n }),\n },\n },\n })\n .withChild(backgroundImage)\n .build();\n};\n\nexport const createCompositeCardList = (props: CardListProps) => {\n const { image, isAligned, isThemeDark, dateSign } = props;\n let children: UMDElement[] = [];\n\n if (image) {\n children.push(makeImageColumn({ image, isAligned }));\n }\n\n if (dateSign) {\n children.push(makeDateColumn(dateSign));\n }\n\n children.push(makeTextColumn(props));\n\n const wrapper = new ElementBuilder()\n .withClassName('card-list-wrapper')\n .withStyles({\n element: {\n containerType: 'inline-size',\n\n ...createMediaQuery('min-width', mediumBreakpointStart, {\n display: 'flex',\n justifyContent: 'space-between',\n }),\n },\n })\n .withChildren(...children)\n .build();\n\n return new ElementBuilder()\n .withClassName('card-list-container')\n .withStyles({\n element: {\n height: '100%',\n overflow: 'hidden',\n\n ...(isThemeDark && {\n backgroundColor: token.color.black,\n color: token.color.white,\n }),\n },\n })\n .withChild(wrapper)\n .build();\n};\n"],"names":["textLockup.small","assets.image.background"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../../source/composite/card/overlay/image.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,eAAO,MAAM,QAAQ,uBAAuB,CAAC;AAE7C,eAAO,MAAM,sBAAsB,GAAI,OAAO,gBAAgB;;;;;;;;
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../../source/composite/card/overlay/image.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,eAAO,MAAM,QAAQ,uBAAuB,CAAC;AAE7C,eAAO,MAAM,sBAAsB,GAAI,OAAO,gBAAgB;;;;;;;;CAmN7D,CAAC"}
|
|
@@ -31,7 +31,14 @@ import "../../../atomic/text-lockup/small.js";
|
|
|
31
31
|
import { createTextLockupSmallScaling } from "../../../atomic/text-lockup/small-scaling.js";
|
|
32
32
|
const classRef = "card-overlay-image";
|
|
33
33
|
const createCardOverlayImage = (props) => {
|
|
34
|
-
const {
|
|
34
|
+
const {
|
|
35
|
+
isQuote,
|
|
36
|
+
ctaIcon,
|
|
37
|
+
dateSign,
|
|
38
|
+
backgroundImage,
|
|
39
|
+
text,
|
|
40
|
+
imageLoading = "lazy"
|
|
41
|
+
} = props;
|
|
35
42
|
const children = [];
|
|
36
43
|
const wrapperChildren = [];
|
|
37
44
|
const load = () => {
|
|
@@ -64,6 +71,7 @@ const createCardOverlayImage = (props) => {
|
|
|
64
71
|
element: backgroundImage,
|
|
65
72
|
isScaled: true,
|
|
66
73
|
isGifAllowed: true,
|
|
74
|
+
imageLoading,
|
|
67
75
|
customStyles: {
|
|
68
76
|
position: "absolute",
|
|
69
77
|
top: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.js","sources":["../../../../source/composite/card/overlay/image.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 { createMediaQuery } from '@universityofmaryland/web-utilities-library/styles';\nimport { truncateTextBasedOnSize } from '@universityofmaryland/web-utilities-library/string';\nimport { quote as iconQuote } from '@universityofmaryland/web-icons-library/brand';\nimport { actions, assets, textLockup } from 'atomic';\nimport { CardOverlayProps } from '../_types';\nimport { type UMDElement } from '../../../_types';\n\nexport const classRef = 'card-overlay-image';\n\nexport const createCardOverlayImage = (props: CardOverlayProps) => {\n const {
|
|
1
|
+
{"version":3,"file":"image.js","sources":["../../../../source/composite/card/overlay/image.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 { createMediaQuery } from '@universityofmaryland/web-utilities-library/styles';\nimport { truncateTextBasedOnSize } from '@universityofmaryland/web-utilities-library/string';\nimport { quote as iconQuote } from '@universityofmaryland/web-icons-library/brand';\nimport { actions, assets, textLockup } from 'atomic';\nimport { CardOverlayProps } from '../_types';\nimport { type UMDElement } from '../../../_types';\n\nexport const classRef = 'card-overlay-image';\n\nexport const createCardOverlayImage = (props: CardOverlayProps) => {\n const {\n isQuote,\n ctaIcon,\n dateSign,\n backgroundImage,\n text,\n imageLoading = 'lazy',\n } = props;\n const children: UMDElement[] = [];\n const wrapperChildren: UMDElement[] = [];\n const load = () => {\n const sizeElements = () => {\n const textCopy = text?.innerHTML;\n if (text && textCopy) {\n const modifiedText = truncateTextBasedOnSize({\n text: textCopy,\n size: composite.element.offsetWidth,\n });\n\n text.innerHTML = modifiedText;\n\n if (modifiedText.length >= 220) {\n const assetContainer = composite.element.querySelector(\n `.${imageContainerClass}`,\n );\n if (assetContainer) {\n assetContainer.setAttribute('data-size', 'large');\n }\n }\n }\n };\n\n sizeElements();\n };\n let imageContainerClass: string | null = null;\n\n if (ctaIcon && ctaIcon instanceof HTMLElement) {\n children.push(actions.icon({ ...props, ctaIcon, isThemeLight: false }));\n }\n\n if (backgroundImage) {\n const imageContainer = assets.image.background({\n element: backgroundImage,\n isScaled: true,\n isGifAllowed: true,\n imageLoading,\n customStyles: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n\n [`&:before`]: {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n zIndex: 1,\n opacity: 1,\n transition: `opacity 0.5s ease-in-out`,\n background:\n 'linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, .55) 60%, rgba(0, 0, 0, 0.9) 100%)',\n },\n\n [`&[data-size=\"large\"]:before`]: {\n background:\n 'linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, .55) 30%, rgba(0, 0, 0, 0.9) 100%)',\n },\n\n [`img`]: {\n transform: 'scale(1.025)',\n },\n },\n });\n\n children.push(imageContainer);\n imageContainerClass = imageContainer.element.className;\n }\n\n if (dateSign) {\n wrapperChildren.push(\n new ElementBuilder()\n .styled(Styles.layout.background.box.white)\n .withStyles({\n element: {\n alignSelf: `flex-start`,\n },\n siblingAfter: {\n marginTop: `${token.spacing.min}`,\n },\n })\n .withChild(dateSign)\n .build(),\n );\n }\n\n if (isQuote) {\n const quoteWrapper = new ElementBuilder()\n .withClassName('card-overlay-image-quote-wrapper')\n .withStyles({\n element: {\n width: '41px',\n height: '30px',\n marginBottom: `${token.spacing.xs}`,\n\n '& svg': {\n fill: `${token.color.red}`,\n },\n },\n })\n .withHTML(iconQuote)\n .build();\n\n wrapperChildren.push(quoteWrapper);\n }\n\n wrapperChildren.push(\n textLockup.smallScaling({\n ...props,\n isThemeDark: true,\n }),\n );\n\n const textContent = new ElementBuilder()\n .withClassName('card-overlay-image-text-content')\n .withStyles({\n element: {\n maxWidth: `${token.spacing.maxWidth.smallest}`,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n zIndex: 9,\n position: 'relative',\n\n [' & * ']: {\n color: `${token.color.white}`,\n },\n },\n })\n .withChildren(...wrapperChildren)\n .build();\n\n const textWrapper = new ElementBuilder()\n .withClassName('card-overlay-image-text-wrapper')\n .withStyles({\n element: {\n height: 'auto',\n paddingRight: `${ctaIcon ? token.spacing['2xl'] : 0}`,\n },\n })\n .withChild(textContent)\n .build();\n\n const container = new ElementBuilder()\n .withClassName('card-overlay-image-container')\n .withStyles({\n element: {\n position: 'relative',\n padding: `${token.spacing.lg} ${token.spacing.md}`,\n paddingTop: `${token.spacing['4xl']}`,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'flex-end',\n minHeight: '360px',\n height: '100%',\n overflow: 'hidden',\n\n ...createMediaQuery(\n 'min-width',\n token.media.breakpointValues.medium.min,\n {\n paddingTop: `${token.spacing['8xl']}`,\n minHeight: `424px`,\n },\n ),\n },\n })\n .withChildren(...children, textWrapper)\n .build();\n\n const composite = new ElementBuilder()\n .withClassName(classRef)\n .withStyles({\n element: {\n height: '100%',\n containerType: 'inline-size',\n\n [`&:hover .${imageContainerClass}:before, &:focus .${imageContainerClass}:before`]:\n {\n opacity: 0.7,\n },\n\n ['&:hover img, &:focus img']: {\n transform: 'scale(1)',\n transition: 'transform 0.5s ease-in-out',\n },\n },\n })\n .withChild(container)\n .build();\n\n return {\n ...composite,\n events: {\n load,\n },\n };\n};\n"],"names":["actions.icon","assets.image.background","iconQuote","textLockup.smallScaling"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../../../source/composite/carousel/wide/frames.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../../../source/composite/carousel/wide/frames.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AA2SnD,eAAO,MAAM,qBAAqB,GAChC,QAAQ,iBAAiB,CAAC,QAAQ,CAAC,EACnC,cAAc,OAAO;qBA4CmC,cAAc;;;cAGnC,WAAW;eACT,WAAW;;;cAGV,iBAAiB;cACrB,iBAAiB;;EAIpD,CAAC"}
|
|
@@ -136,7 +136,8 @@ const createMainFrameSlide = (slide, index$1, isThemeDark) => {
|
|
|
136
136
|
children.push(
|
|
137
137
|
createImageBackground({
|
|
138
138
|
element: slide.image,
|
|
139
|
-
isScaled: true
|
|
139
|
+
isScaled: true,
|
|
140
|
+
imageLoading: "lazy"
|
|
140
141
|
})
|
|
141
142
|
);
|
|
142
143
|
if (slideContentWrapper) children.push(slideContentWrapper);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frames.js","sources":["../../../../source/composite/carousel/wide/frames.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\nimport { assets } from 'atomic';\nimport { createElementWithRefs } from './_elementModel';\nimport { createControlButton } from './controls';\nimport { type CarouselWideProps } from '../_types';\nimport { type UMDElement } from '../../../_types';\n\nconst ASPECT_RATIO = '16 / 9';\n\nconst createSlideContent = ({\n slide,\n isThemeDark,\n}: {\n slide: CarouselWideProps['slides'][0];\n isThemeDark?: boolean;\n}) => {\n const children: UMDElement[] = [];\n\n // Create content container first to get reference\n let contentContainer: UMDElement | null = null;\n\n const closeButton = new ElementBuilder('button')\n .withClassName('umd-carousel-wide__slide-content-close')\n .withAttribute('type', 'button')\n .withAttribute('aria-label', 'Close content')\n .withHTML('×')\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n right: 0,\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n fontSize: '20px',\n fontWeight: 'bold',\n padding: token.spacing.min,\n lineHeight: 1,\n color: token.color.gray.dark,\n transition: 'color 0.2s ease',\n\n [`@media (${token.media.queries.large.max})`]: {\n display: 'none',\n },\n\n '&:hover, &:focus': {\n outline: `2px solid ${token.color.blue}`,\n },\n\n ...(isThemeDark && {\n color: token.color.gray.light,\n '&:hover': {\n color: token.color.white,\n },\n }),\n },\n })\n .withModifier((el) => {\n el.addEventListener('click', () => {\n if (contentContainer) contentContainer.element.style.display = 'none';\n });\n })\n .build();\n\n children.push(closeButton);\n\n if (slide.headline) {\n children.push(\n new ElementBuilder(slide.headline)\n .styled(\n Styles.typography.sans.compose('large', {\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n ...(!isThemeDark && {\n color: `${token.color.black}`,\n }),\n },\n siblingAfter: {\n marginTop: token.spacing.sm,\n },\n })\n .build(),\n );\n }\n\n if (slide.text) {\n children.push(\n new ElementBuilder(slide.text)\n .styled(\n Styles.element.text.rich.composeSimple({\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .build(),\n );\n }\n\n if (children.length === 1) return null;\n\n contentContainer = new ElementBuilder()\n .withClassName('umd-carousel-wide__slide-content')\n .withStyles({\n element: {\n backgroundColor: token.color.white,\n border: `1px solid ${token.color.gray.light}`,\n display: 'block',\n padding: token.spacing.md,\n width: '100%',\n position: 'relative',\n opacity: 0,\n transform: 'translateY(20px)',\n transition: 'opacity 0.6s ease-out, transform 0.6s ease-out',\n\n ...(isThemeDark && {\n backgroundColor: token.color.black,\n border: `1px solid ${token.color.gray.dark}`,\n }),\n\n [`@media (${token.media.queries.large.max})`]: {\n borderTop: 'none',\n },\n\n [`@media (${token.media.queries.tablet.min})`]: {\n border: 'none',\n boxShadow: '0 0 5px 0 rgba(0, 0, 0, 0.4)',\n maxWidth: '50%',\n position: 'absolute',\n bottom: token.spacing.sm,\n left: token.spacing.sm,\n\n ...(isThemeDark && {\n border: 'none',\n boxShadow: 'none',\n }),\n },\n },\n })\n .withChildren(...children)\n .build();\n\n return contentContainer;\n};\n\nconst createMainFrameSlide = (\n slide: CarouselWideProps['slides'][0],\n index: number,\n isThemeDark?: boolean,\n) => {\n const children: UMDElement[] = [];\n const slideContentWrapper = createSlideContent({ slide, isThemeDark });\n\n children.push(\n assets.image.background({\n element: slide.image,\n isScaled: true,\n }),\n );\n\n if (slideContentWrapper) children.push(slideContentWrapper);\n\n return new ElementBuilder('figure')\n .withClassName('umd-carousel-wide__slide')\n .withAttribute('data-index', `${index}`)\n .withStyles({\n element: {\n display: 'none',\n opacity: 0,\n transition: 'opacity 0.3s ease-in-out, transform 0.5s ease-in-out',\n transform: 'translateX(0)',\n aspectRatio: ASPECT_RATIO,\n\n [`@media (${token.media.queries.tablet.min})`]: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n },\n\n '&[data-active=\"true\"]': {\n opacity: 1,\n transform: 'translateX(0)',\n zIndex: 2,\n display: 'block',\n },\n\n '&[data-animating=\"true\"]': {\n zIndex: 1,\n display: 'block',\n opacity: 1,\n\n [`@media (${token.media.queries.large.max})`]: {\n position: 'absolute',\n width: '100%',\n top: 0,\n left: 0,\n },\n },\n\n '&[data-direction=\"left\"]': {\n transform: 'translateX(-100%)',\n },\n\n '&[data-direction=\"right\"]': {\n transform: 'translateX(100%)',\n },\n\n '&[data-content-visible=\"true\"] .umd-carousel-wide__slide-content': {\n opacity: 1,\n transform: 'translateY(0)',\n },\n },\n })\n .withChildren(...children)\n .build();\n};\n\nconst createPreviewContainer = (position: 'left' | 'right') => {\n const isPositionLeft = position === 'left';\n return new ElementBuilder()\n .withClassName(\n isPositionLeft\n ? 'umd-carousel-wide__preview--left'\n : 'umd-carousel-wide__preview--right',\n )\n .withAttribute('aria-hidden', 'true')\n .withAttribute('role', 'presentation')\n .withStyles({\n element: {\n display: 'none',\n overflow: 'hidden',\n position: 'relative',\n\n [`@media (${token.media.queries.tablet.min})`]: {\n display: 'flex',\n alignItems: 'flex-end',\n height: '100%',\n },\n\n ['& > * ']: {\n position: 'absolute !important',\n bottom: '0 !important',\n left: '0 !important',\n width: 'auto !important',\n height: '75% !important',\n display: 'block !important',\n aspectRatio: ASPECT_RATIO,\n\n ...(isPositionLeft && {\n right: '0 !important',\n left: 'auto !important',\n }),\n\n ['&:before ']: {\n content: '\"\"',\n position: 'absolute',\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n background: token.color.gray.darker,\n opacity: 0.5,\n zIndex: 1,\n },\n },\n },\n })\n .build();\n};\n\nconst createMainContainer = (\n slides: CarouselWideProps['slides'],\n isThemeDark?: boolean,\n) => {\n const slideElements = slides.map((slide, index) => {\n return createMainFrameSlide(slide, index, isThemeDark);\n });\n\n // Set first slide as active and content visible\n if (slideElements.length > 0) {\n slideElements[0].element.setAttribute('data-active', 'true');\n slideElements[0].element.setAttribute('data-content-visible', 'true');\n }\n\n return {\n component: new ElementBuilder()\n .withClassName('umd-carousel-wide__main-container')\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'hidden',\n },\n })\n .withChildren(...slideElements)\n .build(),\n refs: slideElements.map((el) => el.element),\n };\n};\n\nexport const createFramesContainer = (\n slides: CarouselWideProps['slides'],\n isThemeDark?: boolean,\n) => {\n const previewLeft = createPreviewContainer('left');\n const previewRight = createPreviewContainer('right');\n const previousButton = createControlButton('prev', isThemeDark);\n const nextButton = createControlButton('next', isThemeDark);\n const mainContainer = createMainContainer(slides, isThemeDark);\n\n return createElementWithRefs({\n className: 'umd-carousel-wide__frames-container',\n children: [\n previewLeft,\n mainContainer.component,\n previewRight,\n previousButton,\n nextButton,\n ],\n elementStyles: {\n element: {\n position: 'relative',\n\n [`@media (${token.media.queries.large.max})`]: {\n padding: `0 ${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.tablet.min})`]: {\n display: 'grid',\n gridTemplateColumns: '10vw 1fr 10vw',\n gridGap: token.spacing.md,\n height: '56vw',\n maxHeight: '60vh',\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridTemplateColumns: '15vw 1fr 15vw',\n gridGap: token.spacing.lg,\n },\n\n [`@media (${token.media.queries.highDef.min})`]: {\n gridTemplateColumns: '20vw 1fr 20vw',\n },\n },\n },\n refs: {\n slidesContainer: mainContainer.component.element as HTMLDivElement,\n slides: mainContainer.refs,\n previews: {\n left: previewLeft.element as HTMLElement,\n right: previewRight.element as HTMLElement,\n },\n controls: {\n prev: previousButton.element as HTMLButtonElement,\n next: nextButton.element as HTMLButtonElement,\n },\n },\n });\n};\n"],"names":["index","assets.image.background"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"frames.js","sources":["../../../../source/composite/carousel/wide/frames.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\nimport { assets } from 'atomic';\nimport { createElementWithRefs } from './_elementModel';\nimport { createControlButton } from './controls';\nimport { type CarouselWideProps } from '../_types';\nimport { type UMDElement } from '../../../_types';\n\nconst ASPECT_RATIO = '16 / 9';\n\nconst createSlideContent = ({\n slide,\n isThemeDark,\n}: {\n slide: CarouselWideProps['slides'][0];\n isThemeDark?: boolean;\n}) => {\n const children: UMDElement[] = [];\n\n // Create content container first to get reference\n let contentContainer: UMDElement | null = null;\n\n const closeButton = new ElementBuilder('button')\n .withClassName('umd-carousel-wide__slide-content-close')\n .withAttribute('type', 'button')\n .withAttribute('aria-label', 'Close content')\n .withHTML('×')\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n right: 0,\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n fontSize: '20px',\n fontWeight: 'bold',\n padding: token.spacing.min,\n lineHeight: 1,\n color: token.color.gray.dark,\n transition: 'color 0.2s ease',\n\n [`@media (${token.media.queries.large.max})`]: {\n display: 'none',\n },\n\n '&:hover, &:focus': {\n outline: `2px solid ${token.color.blue}`,\n },\n\n ...(isThemeDark && {\n color: token.color.gray.light,\n '&:hover': {\n color: token.color.white,\n },\n }),\n },\n })\n .withModifier((el) => {\n el.addEventListener('click', () => {\n if (contentContainer) contentContainer.element.style.display = 'none';\n });\n })\n .build();\n\n children.push(closeButton);\n\n if (slide.headline) {\n children.push(\n new ElementBuilder(slide.headline)\n .styled(\n Styles.typography.sans.compose('large', {\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n ...(!isThemeDark && {\n color: `${token.color.black}`,\n }),\n },\n siblingAfter: {\n marginTop: token.spacing.sm,\n },\n })\n .build(),\n );\n }\n\n if (slide.text) {\n children.push(\n new ElementBuilder(slide.text)\n .styled(\n Styles.element.text.rich.composeSimple({\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .build(),\n );\n }\n\n if (children.length === 1) return null;\n\n contentContainer = new ElementBuilder()\n .withClassName('umd-carousel-wide__slide-content')\n .withStyles({\n element: {\n backgroundColor: token.color.white,\n border: `1px solid ${token.color.gray.light}`,\n display: 'block',\n padding: token.spacing.md,\n width: '100%',\n position: 'relative',\n opacity: 0,\n transform: 'translateY(20px)',\n transition: 'opacity 0.6s ease-out, transform 0.6s ease-out',\n\n ...(isThemeDark && {\n backgroundColor: token.color.black,\n border: `1px solid ${token.color.gray.dark}`,\n }),\n\n [`@media (${token.media.queries.large.max})`]: {\n borderTop: 'none',\n },\n\n [`@media (${token.media.queries.tablet.min})`]: {\n border: 'none',\n boxShadow: '0 0 5px 0 rgba(0, 0, 0, 0.4)',\n maxWidth: '50%',\n position: 'absolute',\n bottom: token.spacing.sm,\n left: token.spacing.sm,\n\n ...(isThemeDark && {\n border: 'none',\n boxShadow: 'none',\n }),\n },\n },\n })\n .withChildren(...children)\n .build();\n\n return contentContainer;\n};\n\nconst createMainFrameSlide = (\n slide: CarouselWideProps['slides'][0],\n index: number,\n isThemeDark?: boolean,\n) => {\n const children: UMDElement[] = [];\n const slideContentWrapper = createSlideContent({ slide, isThemeDark });\n\n children.push(\n assets.image.background({\n element: slide.image,\n isScaled: true,\n imageLoading: 'lazy',\n }),\n );\n\n if (slideContentWrapper) children.push(slideContentWrapper);\n\n return new ElementBuilder('figure')\n .withClassName('umd-carousel-wide__slide')\n .withAttribute('data-index', `${index}`)\n .withStyles({\n element: {\n display: 'none',\n opacity: 0,\n transition: 'opacity 0.3s ease-in-out, transform 0.5s ease-in-out',\n transform: 'translateX(0)',\n aspectRatio: ASPECT_RATIO,\n\n [`@media (${token.media.queries.tablet.min})`]: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n },\n\n '&[data-active=\"true\"]': {\n opacity: 1,\n transform: 'translateX(0)',\n zIndex: 2,\n display: 'block',\n },\n\n '&[data-animating=\"true\"]': {\n zIndex: 1,\n display: 'block',\n opacity: 1,\n\n [`@media (${token.media.queries.large.max})`]: {\n position: 'absolute',\n width: '100%',\n top: 0,\n left: 0,\n },\n },\n\n '&[data-direction=\"left\"]': {\n transform: 'translateX(-100%)',\n },\n\n '&[data-direction=\"right\"]': {\n transform: 'translateX(100%)',\n },\n\n '&[data-content-visible=\"true\"] .umd-carousel-wide__slide-content': {\n opacity: 1,\n transform: 'translateY(0)',\n },\n },\n })\n .withChildren(...children)\n .build();\n};\n\nconst createPreviewContainer = (position: 'left' | 'right') => {\n const isPositionLeft = position === 'left';\n return new ElementBuilder()\n .withClassName(\n isPositionLeft\n ? 'umd-carousel-wide__preview--left'\n : 'umd-carousel-wide__preview--right',\n )\n .withAttribute('aria-hidden', 'true')\n .withAttribute('role', 'presentation')\n .withStyles({\n element: {\n display: 'none',\n overflow: 'hidden',\n position: 'relative',\n\n [`@media (${token.media.queries.tablet.min})`]: {\n display: 'flex',\n alignItems: 'flex-end',\n height: '100%',\n },\n\n ['& > * ']: {\n position: 'absolute !important',\n bottom: '0 !important',\n left: '0 !important',\n width: 'auto !important',\n height: '75% !important',\n display: 'block !important',\n aspectRatio: ASPECT_RATIO,\n\n ...(isPositionLeft && {\n right: '0 !important',\n left: 'auto !important',\n }),\n\n ['&:before ']: {\n content: '\"\"',\n position: 'absolute',\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n background: token.color.gray.darker,\n opacity: 0.5,\n zIndex: 1,\n },\n },\n },\n })\n .build();\n};\n\nconst createMainContainer = (\n slides: CarouselWideProps['slides'],\n isThemeDark?: boolean,\n) => {\n const slideElements = slides.map((slide, index) => {\n return createMainFrameSlide(slide, index, isThemeDark);\n });\n\n // Set first slide as active and content visible\n if (slideElements.length > 0) {\n slideElements[0].element.setAttribute('data-active', 'true');\n slideElements[0].element.setAttribute('data-content-visible', 'true');\n }\n\n return {\n component: new ElementBuilder()\n .withClassName('umd-carousel-wide__main-container')\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'hidden',\n },\n })\n .withChildren(...slideElements)\n .build(),\n refs: slideElements.map((el) => el.element),\n };\n};\n\nexport const createFramesContainer = (\n slides: CarouselWideProps['slides'],\n isThemeDark?: boolean,\n) => {\n const previewLeft = createPreviewContainer('left');\n const previewRight = createPreviewContainer('right');\n const previousButton = createControlButton('prev', isThemeDark);\n const nextButton = createControlButton('next', isThemeDark);\n const mainContainer = createMainContainer(slides, isThemeDark);\n\n return createElementWithRefs({\n className: 'umd-carousel-wide__frames-container',\n children: [\n previewLeft,\n mainContainer.component,\n previewRight,\n previousButton,\n nextButton,\n ],\n elementStyles: {\n element: {\n position: 'relative',\n\n [`@media (${token.media.queries.large.max})`]: {\n padding: `0 ${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.tablet.min})`]: {\n display: 'grid',\n gridTemplateColumns: '10vw 1fr 10vw',\n gridGap: token.spacing.md,\n height: '56vw',\n maxHeight: '60vh',\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridTemplateColumns: '15vw 1fr 15vw',\n gridGap: token.spacing.lg,\n },\n\n [`@media (${token.media.queries.highDef.min})`]: {\n gridTemplateColumns: '20vw 1fr 20vw',\n },\n },\n },\n refs: {\n slidesContainer: mainContainer.component.element as HTMLDivElement,\n slides: mainContainer.refs,\n previews: {\n left: previewLeft.element as HTMLElement,\n right: previewRight.element as HTMLElement,\n },\n controls: {\n prev: previousButton.element as HTMLButtonElement,\n next: nextButton.element as HTMLButtonElement,\n },\n },\n });\n};\n"],"names":["index","assets.image.background"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../source/composite/carousel/wide/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../source/composite/carousel/wide/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAwQnD,eAAO,MAAM,2BAA2B,GAAI,OAAO,iBAAiB,kFAuDnE,CAAC"}
|
|
@@ -62,7 +62,8 @@ const createPreviewElement = (slide) => {
|
|
|
62
62
|
const imageCopy = slide.image.cloneNode(true);
|
|
63
63
|
const preview = createImageBackground({
|
|
64
64
|
element: imageCopy,
|
|
65
|
-
isScaled: true
|
|
65
|
+
isScaled: true,
|
|
66
|
+
imageLoading: "lazy"
|
|
66
67
|
});
|
|
67
68
|
preview.element.style.transition = `transform ${PREVIEW_ANIMATION_TIME}ms ease-in-out`;
|
|
68
69
|
return preview.element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../source/composite/carousel/wide/index.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport { assets } from 'atomic';\nimport { createContainer } from './container';\nimport { type CarouselWideProps } from '../_types';\n\ninterface CarouselState {\n currentIndex: number;\n isAnimating: boolean;\n slides: CarouselWideProps['slides'];\n}\n\ninterface CarouselRefs {\n container: HTMLElement;\n slidesContainer: HTMLDivElement;\n slides: HTMLElement[];\n previews: {\n left: HTMLElement;\n right: HTMLElement;\n };\n controls: {\n prev: HTMLButtonElement;\n next: HTMLButtonElement;\n };\n indicator: {\n element: HTMLElement;\n position: (index: number) => void;\n };\n info: HTMLParagraphElement;\n}\n\n// Constants\nconst ANIMATION_TIME: 500 = 500;\nconst PREVIEW_ANIMATION_TIME: 440 = 440; // 60ms faster than main animation\n\n// Pure animation functions\nconst getAdjacentIndices = (\n currentIndex: number,\n totalSlides: number,\n): { leftIndex: number; rightIndex: number } => {\n const lastIndex = totalSlides - 1;\n return {\n leftIndex: currentIndex === 0 ? lastIndex : currentIndex - 1,\n rightIndex: currentIndex === lastIndex ? 0 : currentIndex + 1,\n };\n};\n\nconst positionSlideOffScreen = (\n slide: HTMLElement,\n direction: 'left' | 'right',\n): void => {\n slide.setAttribute('data-direction', direction);\n slide.setAttribute('data-animating', 'true');\n slide.offsetHeight; // Force reflow\n};\n\nconst activateSlideTransition = (\n slide: HTMLElement,\n direction?: 'left' | 'right',\n): void => {\n if (direction) {\n slide.setAttribute('data-direction', direction);\n } else {\n slide.removeAttribute('data-direction');\n slide.setAttribute('data-active', 'true');\n }\n};\n\nconst cleanupSlideTransition = (slide: HTMLElement, isNew: boolean): void => {\n if (isNew) {\n slide.removeAttribute('data-animating');\n } else {\n slide.removeAttribute('data-active');\n slide.removeAttribute('data-direction');\n slide.removeAttribute('data-content-visible');\n }\n};\n\n// Pure preview functions\nconst createPreviewElement = (\n slide: CarouselWideProps['slides'][0],\n): HTMLElement => {\n const imageCopy = slide.image.cloneNode(true) as HTMLImageElement;\n const preview = assets.image.background({\n element: imageCopy,\n isScaled: true,\n });\n\n preview.element.style.transition = `transform ${PREVIEW_ANIMATION_TIME}ms ease-in-out`;\n return preview.element;\n};\n\nconst clearPreviewContainer = (container: HTMLElement): void => {\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n};\n\nconst appendPreviewWithAnimation = (\n container: HTMLElement,\n preview: HTMLElement,\n animationDirection: 'reverse' | 'advance',\n): void => {\n // Position off-screen initially based on animation direction\n // For advance (forward), new content comes from right\n // For reverse (backward), new content comes from left\n preview.style.transform =\n animationDirection === 'advance' ? 'translateX(100%)' : 'translateX(-100%)';\n\n container.appendChild(preview);\n\n // Trigger animation to slide in\n requestAnimationFrame(() => {\n preview.style.transform = 'translateX(0)';\n });\n};\n\nconst animatePreviewOut = (\n preview: HTMLElement,\n animationDirection: 'reverse' | 'advance',\n): Promise<void> => {\n return new Promise((resolve) => {\n // For advance (forward), old content exits to left\n // For reverse (backward), old content exits to right\n preview.style.transform =\n animationDirection === 'advance'\n ? 'translateX(-100%)'\n : 'translateX(100%)';\n\n setTimeout(() => {\n if (preview.parentNode) {\n preview.parentNode.removeChild(preview);\n }\n resolve();\n }, PREVIEW_ANIMATION_TIME);\n });\n};\n\n// State management\nconst updatePreviews = (\n refs: CarouselRefs,\n state: CarouselState,\n direction?: 'reverse' | 'advance',\n): void => {\n const { currentIndex, slides } = state;\n const { leftIndex, rightIndex } = getAdjacentIndices(\n currentIndex,\n slides.length,\n );\n\n // Handle left preview\n if (slides[leftIndex]) {\n const existingLeft = refs.previews.left.firstElementChild as HTMLElement;\n if (existingLeft && direction) {\n animatePreviewOut(existingLeft, direction);\n } else if (existingLeft) {\n clearPreviewContainer(refs.previews.left);\n }\n\n const leftPreview = createPreviewElement(slides[leftIndex]);\n if (direction) {\n appendPreviewWithAnimation(refs.previews.left, leftPreview, direction);\n } else {\n refs.previews.left.appendChild(leftPreview);\n }\n }\n\n // Handle right preview\n if (slides[rightIndex]) {\n const existingRight = refs.previews.right.firstElementChild as HTMLElement;\n if (existingRight && direction) {\n animatePreviewOut(existingRight, direction);\n } else if (existingRight) {\n clearPreviewContainer(refs.previews.right);\n }\n\n const rightPreview = createPreviewElement(slides[rightIndex]);\n if (direction) {\n appendPreviewWithAnimation(refs.previews.right, rightPreview, direction);\n } else {\n refs.previews.right.appendChild(rightPreview);\n }\n }\n};\n\nconst updateInfo = (refs: CarouselRefs, newIndex: number) => {\n refs.info.textContent = `Slide ${newIndex + 1} Selected`;\n};\n\nconst animateSlides = (\n refs: CarouselRefs,\n state: CarouselState,\n newIndex: number,\n direction: 'reverse' | 'advance',\n) => {\n if (state.isAnimating || state.currentIndex === newIndex) return;\n state.isAnimating = true;\n\n const currentSlide = refs.slides[state.currentIndex];\n const newSlide = refs.slides[newIndex];\n\n // Disable controls during animation\n refs.controls.prev.setAttribute('disabled', '');\n refs.controls.next.setAttribute('disabled', '');\n\n // Position new slide off-screen\n const newSlideDirection = direction === 'reverse' ? 'left' : 'right';\n positionSlideOffScreen(newSlide, newSlideDirection);\n\n // Update indicator position\n refs.indicator.position(newIndex);\n\n // Start synchronized animations for all frames\n requestAnimationFrame(() => {\n // Animate main slides\n activateSlideTransition(newSlide);\n const currentSlideDirection = direction === 'reverse' ? 'right' : 'left';\n activateSlideTransition(currentSlide, currentSlideDirection);\n\n // Update previews with animation (this will animate in sync)\n const nextState = { ...state, currentIndex: newIndex };\n updatePreviews(refs, nextState, direction);\n });\n\n // Clean up after animation\n setTimeout(() => {\n // Clean up main slides\n cleanupSlideTransition(currentSlide, false);\n cleanupSlideTransition(newSlide, true);\n\n // Show content with fade-in animation\n newSlide.setAttribute('data-content-visible', 'true');\n\n // Re-enable controls\n refs.controls.prev.removeAttribute('disabled');\n refs.controls.next.removeAttribute('disabled');\n\n // Update state\n state.currentIndex = newIndex;\n state.isAnimating = false;\n\n // Update accessibility info\n updateInfo(refs, newIndex);\n }, ANIMATION_TIME);\n};\n\nconst setupSliderControls = (refs: CarouselRefs, state: CarouselState) => {\n const lastIndex = state.slides.length - 1;\n\n refs.controls.prev.addEventListener('click', () => {\n if (state.isAnimating) return;\n\n const newIndex =\n state.currentIndex === lastIndex ? 0 : state.currentIndex + 1;\n animateSlides(refs, state, newIndex, 'advance');\n });\n\n refs.controls.next.addEventListener('click', () => {\n if (state.isAnimating) return;\n\n const newIndex =\n state.currentIndex === 0 ? lastIndex : state.currentIndex - 1;\n animateSlides(refs, state, newIndex, 'reverse');\n });\n};\n\n// Main component\nexport const createCompositeCarouselWide = (props: CarouselWideProps) => {\n const { title } = props;\n\n // Initialize state early\n const state: CarouselState = {\n currentIndex: 0,\n isAnimating: false,\n slides: props.slides,\n };\n\n const container = createContainer(props, (index: number) => {\n if (state.isAnimating || state.currentIndex === index) return;\n\n const direction = state.currentIndex > index ? 'reverse' : 'advance';\n animateSlides(refs, state, index, direction);\n });\n\n const builder = new ElementBuilder();\n\n builder.withClassName('umd-carousel-wide');\n builder.withChild(container);\n\n if (title) {\n builder.withAttribute('title', title);\n } else {\n builder.withAttribute('title', 'Animated Image Carousel');\n }\n\n builder.withStyles({\n element: {\n container: 'umd-carousel-wide / inline-size',\n display: 'block',\n position: 'relative',\n\n [`@media (${token.media.queries.large.min})`]: {\n paddingBottom: 0,\n },\n },\n });\n\n const composite = builder.build();\n\n // Initialize refs\n const refs: CarouselRefs = {\n container: composite.element,\n ...container.refs,\n };\n\n // Set up event handlers after DOM is ready\n requestAnimationFrame(() => {\n setupSliderControls(refs, state);\n updatePreviews(refs, state); // Initial preview setup without animation\n });\n\n return composite;\n};\n"],"names":["assets.image.background"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../source/composite/carousel/wide/index.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport { assets } from 'atomic';\nimport { createContainer } from './container';\nimport { type CarouselWideProps } from '../_types';\n\ninterface CarouselState {\n currentIndex: number;\n isAnimating: boolean;\n slides: CarouselWideProps['slides'];\n}\n\ninterface CarouselRefs {\n container: HTMLElement;\n slidesContainer: HTMLDivElement;\n slides: HTMLElement[];\n previews: {\n left: HTMLElement;\n right: HTMLElement;\n };\n controls: {\n prev: HTMLButtonElement;\n next: HTMLButtonElement;\n };\n indicator: {\n element: HTMLElement;\n position: (index: number) => void;\n };\n info: HTMLParagraphElement;\n}\n\n// Constants\nconst ANIMATION_TIME: 500 = 500;\nconst PREVIEW_ANIMATION_TIME: 440 = 440; // 60ms faster than main animation\n\n// Pure animation functions\nconst getAdjacentIndices = (\n currentIndex: number,\n totalSlides: number,\n): { leftIndex: number; rightIndex: number } => {\n const lastIndex = totalSlides - 1;\n return {\n leftIndex: currentIndex === 0 ? lastIndex : currentIndex - 1,\n rightIndex: currentIndex === lastIndex ? 0 : currentIndex + 1,\n };\n};\n\nconst positionSlideOffScreen = (\n slide: HTMLElement,\n direction: 'left' | 'right',\n): void => {\n slide.setAttribute('data-direction', direction);\n slide.setAttribute('data-animating', 'true');\n slide.offsetHeight; // Force reflow\n};\n\nconst activateSlideTransition = (\n slide: HTMLElement,\n direction?: 'left' | 'right',\n): void => {\n if (direction) {\n slide.setAttribute('data-direction', direction);\n } else {\n slide.removeAttribute('data-direction');\n slide.setAttribute('data-active', 'true');\n }\n};\n\nconst cleanupSlideTransition = (slide: HTMLElement, isNew: boolean): void => {\n if (isNew) {\n slide.removeAttribute('data-animating');\n } else {\n slide.removeAttribute('data-active');\n slide.removeAttribute('data-direction');\n slide.removeAttribute('data-content-visible');\n }\n};\n\n// Pure preview functions\nconst createPreviewElement = (\n slide: CarouselWideProps['slides'][0],\n): HTMLElement => {\n const imageCopy = slide.image.cloneNode(true) as HTMLImageElement;\n const preview = assets.image.background({\n element: imageCopy,\n isScaled: true,\n imageLoading: 'lazy',\n });\n\n preview.element.style.transition = `transform ${PREVIEW_ANIMATION_TIME}ms ease-in-out`;\n return preview.element;\n};\n\nconst clearPreviewContainer = (container: HTMLElement): void => {\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n};\n\nconst appendPreviewWithAnimation = (\n container: HTMLElement,\n preview: HTMLElement,\n animationDirection: 'reverse' | 'advance',\n): void => {\n // Position off-screen initially based on animation direction\n // For advance (forward), new content comes from right\n // For reverse (backward), new content comes from left\n preview.style.transform =\n animationDirection === 'advance' ? 'translateX(100%)' : 'translateX(-100%)';\n\n container.appendChild(preview);\n\n // Trigger animation to slide in\n requestAnimationFrame(() => {\n preview.style.transform = 'translateX(0)';\n });\n};\n\nconst animatePreviewOut = (\n preview: HTMLElement,\n animationDirection: 'reverse' | 'advance',\n): Promise<void> => {\n return new Promise((resolve) => {\n // For advance (forward), old content exits to left\n // For reverse (backward), old content exits to right\n preview.style.transform =\n animationDirection === 'advance'\n ? 'translateX(-100%)'\n : 'translateX(100%)';\n\n setTimeout(() => {\n if (preview.parentNode) {\n preview.parentNode.removeChild(preview);\n }\n resolve();\n }, PREVIEW_ANIMATION_TIME);\n });\n};\n\n// State management\nconst updatePreviews = (\n refs: CarouselRefs,\n state: CarouselState,\n direction?: 'reverse' | 'advance',\n): void => {\n const { currentIndex, slides } = state;\n const { leftIndex, rightIndex } = getAdjacentIndices(\n currentIndex,\n slides.length,\n );\n\n // Handle left preview\n if (slides[leftIndex]) {\n const existingLeft = refs.previews.left.firstElementChild as HTMLElement;\n if (existingLeft && direction) {\n animatePreviewOut(existingLeft, direction);\n } else if (existingLeft) {\n clearPreviewContainer(refs.previews.left);\n }\n\n const leftPreview = createPreviewElement(slides[leftIndex]);\n if (direction) {\n appendPreviewWithAnimation(refs.previews.left, leftPreview, direction);\n } else {\n refs.previews.left.appendChild(leftPreview);\n }\n }\n\n // Handle right preview\n if (slides[rightIndex]) {\n const existingRight = refs.previews.right.firstElementChild as HTMLElement;\n if (existingRight && direction) {\n animatePreviewOut(existingRight, direction);\n } else if (existingRight) {\n clearPreviewContainer(refs.previews.right);\n }\n\n const rightPreview = createPreviewElement(slides[rightIndex]);\n if (direction) {\n appendPreviewWithAnimation(refs.previews.right, rightPreview, direction);\n } else {\n refs.previews.right.appendChild(rightPreview);\n }\n }\n};\n\nconst updateInfo = (refs: CarouselRefs, newIndex: number) => {\n refs.info.textContent = `Slide ${newIndex + 1} Selected`;\n};\n\nconst animateSlides = (\n refs: CarouselRefs,\n state: CarouselState,\n newIndex: number,\n direction: 'reverse' | 'advance',\n) => {\n if (state.isAnimating || state.currentIndex === newIndex) return;\n state.isAnimating = true;\n\n const currentSlide = refs.slides[state.currentIndex];\n const newSlide = refs.slides[newIndex];\n\n // Disable controls during animation\n refs.controls.prev.setAttribute('disabled', '');\n refs.controls.next.setAttribute('disabled', '');\n\n // Position new slide off-screen\n const newSlideDirection = direction === 'reverse' ? 'left' : 'right';\n positionSlideOffScreen(newSlide, newSlideDirection);\n\n // Update indicator position\n refs.indicator.position(newIndex);\n\n // Start synchronized animations for all frames\n requestAnimationFrame(() => {\n // Animate main slides\n activateSlideTransition(newSlide);\n const currentSlideDirection = direction === 'reverse' ? 'right' : 'left';\n activateSlideTransition(currentSlide, currentSlideDirection);\n\n // Update previews with animation (this will animate in sync)\n const nextState = { ...state, currentIndex: newIndex };\n updatePreviews(refs, nextState, direction);\n });\n\n // Clean up after animation\n setTimeout(() => {\n // Clean up main slides\n cleanupSlideTransition(currentSlide, false);\n cleanupSlideTransition(newSlide, true);\n\n // Show content with fade-in animation\n newSlide.setAttribute('data-content-visible', 'true');\n\n // Re-enable controls\n refs.controls.prev.removeAttribute('disabled');\n refs.controls.next.removeAttribute('disabled');\n\n // Update state\n state.currentIndex = newIndex;\n state.isAnimating = false;\n\n // Update accessibility info\n updateInfo(refs, newIndex);\n }, ANIMATION_TIME);\n};\n\nconst setupSliderControls = (refs: CarouselRefs, state: CarouselState) => {\n const lastIndex = state.slides.length - 1;\n\n refs.controls.prev.addEventListener('click', () => {\n if (state.isAnimating) return;\n\n const newIndex =\n state.currentIndex === lastIndex ? 0 : state.currentIndex + 1;\n animateSlides(refs, state, newIndex, 'advance');\n });\n\n refs.controls.next.addEventListener('click', () => {\n if (state.isAnimating) return;\n\n const newIndex =\n state.currentIndex === 0 ? lastIndex : state.currentIndex - 1;\n animateSlides(refs, state, newIndex, 'reverse');\n });\n};\n\n// Main component\nexport const createCompositeCarouselWide = (props: CarouselWideProps) => {\n const { title } = props;\n\n // Initialize state early\n const state: CarouselState = {\n currentIndex: 0,\n isAnimating: false,\n slides: props.slides,\n };\n\n const container = createContainer(props, (index: number) => {\n if (state.isAnimating || state.currentIndex === index) return;\n\n const direction = state.currentIndex > index ? 'reverse' : 'advance';\n animateSlides(refs, state, index, direction);\n });\n\n const builder = new ElementBuilder();\n\n builder.withClassName('umd-carousel-wide');\n builder.withChild(container);\n\n if (title) {\n builder.withAttribute('title', title);\n } else {\n builder.withAttribute('title', 'Animated Image Carousel');\n }\n\n builder.withStyles({\n element: {\n container: 'umd-carousel-wide / inline-size',\n display: 'block',\n position: 'relative',\n\n [`@media (${token.media.queries.large.min})`]: {\n paddingBottom: 0,\n },\n },\n });\n\n const composite = builder.build();\n\n // Initialize refs\n const refs: CarouselRefs = {\n container: composite.element,\n ...container.refs,\n };\n\n // Set up event handlers after DOM is ready\n requestAnimationFrame(() => {\n setupSliderControls(refs, state);\n updatePreviews(refs, state); // Initial preview setup without animation\n });\n\n return composite;\n};\n"],"names":["assets.image.background"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../../../source/composite/hero/custom/expand.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,KAAK,eAAe,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAExE,UAAU,eAAgB,SAAQ,mBAAmB;IACnD,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACrC;
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../../../source/composite/hero/custom/expand.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,KAAK,eAAe,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAExE,UAAU,eAAgB,SAAQ,mBAAmB;IACnD,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACrC;AA4XD,eAAO,MAAM,yBAAyB,GAAI,OAAO,eAAe;;oCA2B3B;YAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE;;;;;;CAc5D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand.js","sources":["../../../../source/composite/hero/custom/expand.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets } from 'atomic';\nimport { type ElementModel, type ContentElement } from '../../../_types';\nimport { type HeroExpandProps as BaseHeroExpandProps } from '../_types';\n\ninterface HeroExpandProps extends BaseHeroExpandProps {\n eyebrow?: ContentElement;\n additional?: HTMLSlotElement | null;\n}\n\nconst ANIMATION_CONFIG = {\n IMAGE_OVERLAY: {\n NAME: 'img-overlay',\n RANGE: {\n START: '70vh',\n END: '100vh',\n },\n },\n IMAGE_SIZE: {\n NAME: 'img-size',\n INITIAL_HEIGHT: '50vh',\n FINAL_HEIGHT: '100vh',\n RANGE: {\n START: '40vh',\n END: '100vh',\n END_TABLET: '200vh',\n },\n },\n COMPONENT_SIZE: {\n NAME: 'component-size',\n NAME_TABLET: 'component-size-tablet',\n INITIAL_WIDTH: '10%',\n INITIAL_WIDTH_TABLET: '60%',\n FINAL_WIDTH: '100vw',\n RANGE: {\n START: '40vh',\n END: '100vh',\n START_TABLET: '60vh',\n END_TABLET: '200vh',\n },\n },\n} as const;\n\nconst keyFrameImgOverlay = `\n @keyframes ${ANIMATION_CONFIG.IMAGE_OVERLAY.NAME} {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n`;\n\nconst keyFrameImgSize = `\n @keyframes ${ANIMATION_CONFIG.IMAGE_SIZE.NAME} {\n from { height: ${ANIMATION_CONFIG.IMAGE_SIZE.INITIAL_HEIGHT}; }\n to { height: ${ANIMATION_CONFIG.IMAGE_SIZE.FINAL_HEIGHT}; }\n }\n`;\n\nconst keyFrameComponentSize = `\n @keyframes ${ANIMATION_CONFIG.COMPONENT_SIZE.NAME} {\n from { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH}; }\n to { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.FINAL_WIDTH}; }\n }\n\n @keyframes ${ANIMATION_CONFIG.COMPONENT_SIZE.NAME_TABLET} {\n from { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH_TABLET}; }\n to { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.FINAL_WIDTH}; }\n }\n`;\n\nconst createImageOverlay = () =>\n new ElementBuilder()\n .withClassName('hero-expand-image-overlay')\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n width: '100%',\n background: 'rgba(0,0,0,0.65)',\n opacity: 1,\n\n ...withViewTimelineAnimation({\n opacity: 0,\n animation: `${ANIMATION_CONFIG.IMAGE_OVERLAY.NAME} forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.IMAGE_OVERLAY.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_OVERLAY.RANGE.END,\n }),\n },\n })\n .build();\n\nconst createAssetElement = ({\n image,\n video,\n}: Pick<\n HeroExpandProps,\n 'image' | 'video'\n>): ElementModel<HTMLElement> | null => {\n if (video) {\n return assets.video.toggle({\n video,\n additionalElementStyles: {\n width: '100%',\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n\n [`& video`]: {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n },\n },\n });\n }\n if (image) {\n return assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\n });\n }\n\n return null;\n};\n\nconst createImageSize = (props: Pick<HeroExpandProps, 'image' | 'video'>) => {\n const overlay = createImageOverlay();\n const asset = createAssetElement(props);\n\n const container = new ElementBuilder()\n .withClassName('hero-expand-image-size')\n .withStyles({\n element: {\n overflow: 'hidden',\n position: 'relative',\n height: '100%',\n width: '100%',\n\n ...withViewTimelineAnimation({\n height: ANIMATION_CONFIG.IMAGE_SIZE.INITIAL_HEIGHT,\n animation: `${ANIMATION_CONFIG.IMAGE_SIZE.NAME} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.END,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.END_TABLET,\n },\n }),\n },\n });\n\n if (asset) {\n container.withChild(asset);\n }\n container.withChild(overlay);\n\n return container.build();\n};\n\nconst createAssetContainer = (\n props: Pick<HeroExpandProps, 'image' | 'video'>,\n) =>\n new ElementBuilder()\n .withClassName('hero-expand-image-container')\n .withChild(createImageSize(props))\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n width: '100vw',\n height: '100%',\n overflow: 'clip',\n display: 'flex',\n alignItems: 'center',\n\n ...withViewTimelineAnimation({\n width: ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH,\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n animation: `${ANIMATION_CONFIG.COMPONENT_SIZE.NAME} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.END,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n width: ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH_TABLET,\n animation: `${ANIMATION_CONFIG.COMPONENT_SIZE.NAME_TABLET} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart:\n ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.START_TABLET,\n animationRangeEnd: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.END_TABLET,\n },\n }),\n },\n })\n .build();\n\nconst createEyebrow = (eyebrow?: HTMLElement | null) => {\n if (!eyebrow) return null;\n\n return new ElementBuilder(eyebrow)\n .styled(Styles.element.text.decoration.ribbon)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createHeadline = (headline?: HTMLElement | null) => {\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n\n if (!headline) return null;\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.maximum)\n .withStyles({\n element: {\n color: token.color.white,\n fontWeight: 800,\n textTransform: 'uppercase',\n textWrap: 'balance',\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '96px',\n }),\n },\n },\n })\n .build();\n};\n\nconst createTopTextChildren = ({\n eyebrow,\n headline,\n}: Pick<\n HeroExpandProps,\n 'eyebrow' | 'headline'\n>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n const eyebrowElement = createEyebrow(eyebrow);\n if (eyebrowElement) {\n children.push(eyebrowElement);\n }\n\n const headlineElement = createHeadline(headline);\n if (headlineElement) {\n children.push(headlineElement);\n }\n\n return children;\n};\n\nconst createBottomTextChildren = ({\n actions,\n additional,\n}: Pick<\n HeroExpandProps,\n 'actions' | 'additional'\n>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n if (actions) {\n const actionsContainer = new ElementBuilder()\n .withClassName('hero-expand-text-actions')\n .withChild(actions)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.lg,\n },\n })\n .build();\n children.push(actionsContainer);\n }\n\n if (additional) {\n const additionalContainer = new ElementBuilder()\n .withClassName('hero-expand-text-additional')\n .withChild(additional)\n .build();\n children.push(additionalContainer);\n }\n\n return children;\n};\n\nconst createTextContainer = (\n props: Pick<\n HeroExpandProps,\n 'eyebrow' | 'headline' | 'actions' | 'additional'\n >,\n) => {\n const container = new ElementBuilder()\n .withClassName('hero-expand-text-container')\n .withStyles({\n element: {\n position: 'relative',\n height: '100%',\n zIndex: 9999,\n textAlign: 'center',\n padding: `${token.spacing.md} 0`,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['3xl']} 0`,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n\n [`@container (${token.media.queries.highDef.min})`]: {\n padding: `${token.spacing['6xl']} 0`,\n },\n },\n });\n\n const topTextChildren = createTopTextChildren(props);\n if (topTextChildren.length > 0) {\n const topText = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.normal)\n .withChildren(...topTextChildren)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.lg,\n },\n })\n .build();\n container.withChild(topText);\n }\n\n const bottomTextChildren = createBottomTextChildren(props);\n if (bottomTextChildren.length > 0) {\n const bottomText = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.normal)\n .withChildren(...bottomTextChildren)\n .withStyles({\n element: {\n width: '100%',\n },\n })\n .build();\n container.withChild(bottomText);\n }\n\n return container.build();\n};\n\nconst createSticky = (props: HeroExpandProps) => {\n const assetContainer = createAssetContainer(props);\n const textContainer = createTextContainer(props);\n\n return new ElementBuilder()\n .withClassName('hero-expand-sticky')\n .withChildren(assetContainer, textContainer)\n .withStyles({\n element: {\n position: 'relative',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: 0,\n height: '100vh',\n }),\n },\n\n [`@supports (not (animation-timeline: view()))`]: {\n top: '0 !important',\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroExpand = (props: HeroExpandProps) => {\n const sticky = createSticky(props);\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-expand')\n .withChild(sticky)\n .withStyles({\n element: {\n containerType: 'inline-size',\n ...withViewTimelineAnimation({\n position: 'relative',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n height: '200vh',\n },\n }),\n\n ['& img, & video']: {\n display: 'block',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n },\n })\n .build();\n\n const setTopPosition = ({ value }: { value: string | null }) => {\n sticky.element.style.top = value || '0';\n };\n\n composite.styles += keyFrameImgOverlay;\n composite.styles += keyFrameImgSize;\n composite.styles += keyFrameComponentSize;\n\n return {\n ...composite,\n events: {\n setTopPosition,\n },\n };\n};\n"],"names":["assets.video.toggle","assets.image.background"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"expand.js","sources":["../../../../source/composite/hero/custom/expand.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets } from 'atomic';\nimport { type ElementModel, type ContentElement } from '../../../_types';\nimport { type HeroExpandProps as BaseHeroExpandProps } from '../_types';\n\ninterface HeroExpandProps extends BaseHeroExpandProps {\n eyebrow?: ContentElement;\n additional?: HTMLSlotElement | null;\n}\n\nconst ANIMATION_CONFIG = {\n IMAGE_OVERLAY: {\n NAME: 'img-overlay',\n RANGE: {\n START: '70vh',\n END: '100vh',\n },\n },\n IMAGE_SIZE: {\n NAME: 'img-size',\n INITIAL_HEIGHT: '50vh',\n FINAL_HEIGHT: '100vh',\n RANGE: {\n START: '40vh',\n END: '100vh',\n END_TABLET: '200vh',\n },\n },\n COMPONENT_SIZE: {\n NAME: 'component-size',\n NAME_TABLET: 'component-size-tablet',\n INITIAL_WIDTH: '10%',\n INITIAL_WIDTH_TABLET: '60%',\n FINAL_WIDTH: '100vw',\n RANGE: {\n START: '40vh',\n END: '100vh',\n START_TABLET: '60vh',\n END_TABLET: '200vh',\n },\n },\n} as const;\n\nconst keyFrameImgOverlay = `\n @keyframes ${ANIMATION_CONFIG.IMAGE_OVERLAY.NAME} {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n`;\n\nconst keyFrameImgSize = `\n @keyframes ${ANIMATION_CONFIG.IMAGE_SIZE.NAME} {\n from { height: ${ANIMATION_CONFIG.IMAGE_SIZE.INITIAL_HEIGHT}; }\n to { height: ${ANIMATION_CONFIG.IMAGE_SIZE.FINAL_HEIGHT}; }\n }\n`;\n\nconst keyFrameComponentSize = `\n @keyframes ${ANIMATION_CONFIG.COMPONENT_SIZE.NAME} {\n from { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH}; }\n to { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.FINAL_WIDTH}; }\n }\n\n @keyframes ${ANIMATION_CONFIG.COMPONENT_SIZE.NAME_TABLET} {\n from { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH_TABLET}; }\n to { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.FINAL_WIDTH}; }\n }\n`;\n\nconst createImageOverlay = () =>\n new ElementBuilder()\n .withClassName('hero-expand-image-overlay')\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n width: '100%',\n background: 'rgba(0,0,0,0.65)',\n opacity: 1,\n\n ...withViewTimelineAnimation({\n opacity: 0,\n animation: `${ANIMATION_CONFIG.IMAGE_OVERLAY.NAME} forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.IMAGE_OVERLAY.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_OVERLAY.RANGE.END,\n }),\n },\n })\n .build();\n\nconst createAssetElement = ({\n image,\n video,\n}: Pick<\n HeroExpandProps,\n 'image' | 'video'\n>): ElementModel<HTMLElement> | null => {\n if (video) {\n return assets.video.toggle({\n video,\n additionalElementStyles: {\n width: '100%',\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n\n [`& video`]: {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n },\n },\n });\n }\n if (image) {\n return assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\n imageLoading: 'eager',\n imageFetchPriority: 'high',\n });\n }\n\n return null;\n};\n\nconst createImageSize = (props: Pick<HeroExpandProps, 'image' | 'video'>) => {\n const overlay = createImageOverlay();\n const asset = createAssetElement(props);\n\n const container = new ElementBuilder()\n .withClassName('hero-expand-image-size')\n .withStyles({\n element: {\n overflow: 'hidden',\n position: 'relative',\n height: '100%',\n width: '100%',\n\n ...withViewTimelineAnimation({\n height: ANIMATION_CONFIG.IMAGE_SIZE.INITIAL_HEIGHT,\n animation: `${ANIMATION_CONFIG.IMAGE_SIZE.NAME} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.END,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.END_TABLET,\n },\n }),\n },\n });\n\n if (asset) {\n container.withChild(asset);\n }\n container.withChild(overlay);\n\n return container.build();\n};\n\nconst createAssetContainer = (\n props: Pick<HeroExpandProps, 'image' | 'video'>,\n) =>\n new ElementBuilder()\n .withClassName('hero-expand-image-container')\n .withChild(createImageSize(props))\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n width: '100vw',\n height: '100%',\n overflow: 'clip',\n display: 'flex',\n alignItems: 'center',\n\n ...withViewTimelineAnimation({\n width: ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH,\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n animation: `${ANIMATION_CONFIG.COMPONENT_SIZE.NAME} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.END,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n width: ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH_TABLET,\n animation: `${ANIMATION_CONFIG.COMPONENT_SIZE.NAME_TABLET} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart:\n ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.START_TABLET,\n animationRangeEnd: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.END_TABLET,\n },\n }),\n },\n })\n .build();\n\nconst createEyebrow = (eyebrow?: HTMLElement | null) => {\n if (!eyebrow) return null;\n\n return new ElementBuilder(eyebrow)\n .styled(Styles.element.text.decoration.ribbon)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createHeadline = (headline?: HTMLElement | null) => {\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n\n if (!headline) return null;\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.maximum)\n .withStyles({\n element: {\n color: token.color.white,\n fontWeight: 800,\n textTransform: 'uppercase',\n textWrap: 'balance',\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '96px',\n }),\n },\n },\n })\n .build();\n};\n\nconst createTopTextChildren = ({\n eyebrow,\n headline,\n}: Pick<\n HeroExpandProps,\n 'eyebrow' | 'headline'\n>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n const eyebrowElement = createEyebrow(eyebrow);\n if (eyebrowElement) {\n children.push(eyebrowElement);\n }\n\n const headlineElement = createHeadline(headline);\n if (headlineElement) {\n children.push(headlineElement);\n }\n\n return children;\n};\n\nconst createBottomTextChildren = ({\n actions,\n additional,\n}: Pick<\n HeroExpandProps,\n 'actions' | 'additional'\n>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n if (actions) {\n const actionsContainer = new ElementBuilder()\n .withClassName('hero-expand-text-actions')\n .withChild(actions)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.lg,\n },\n })\n .build();\n children.push(actionsContainer);\n }\n\n if (additional) {\n const additionalContainer = new ElementBuilder()\n .withClassName('hero-expand-text-additional')\n .withChild(additional)\n .build();\n children.push(additionalContainer);\n }\n\n return children;\n};\n\nconst createTextContainer = (\n props: Pick<\n HeroExpandProps,\n 'eyebrow' | 'headline' | 'actions' | 'additional'\n >,\n) => {\n const container = new ElementBuilder()\n .withClassName('hero-expand-text-container')\n .withStyles({\n element: {\n position: 'relative',\n height: '100%',\n zIndex: 9999,\n textAlign: 'center',\n padding: `${token.spacing.md} 0`,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['3xl']} 0`,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n\n [`@container (${token.media.queries.highDef.min})`]: {\n padding: `${token.spacing['6xl']} 0`,\n },\n },\n });\n\n const topTextChildren = createTopTextChildren(props);\n if (topTextChildren.length > 0) {\n const topText = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.normal)\n .withChildren(...topTextChildren)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.lg,\n },\n })\n .build();\n container.withChild(topText);\n }\n\n const bottomTextChildren = createBottomTextChildren(props);\n if (bottomTextChildren.length > 0) {\n const bottomText = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.normal)\n .withChildren(...bottomTextChildren)\n .withStyles({\n element: {\n width: '100%',\n },\n })\n .build();\n container.withChild(bottomText);\n }\n\n return container.build();\n};\n\nconst createSticky = (props: HeroExpandProps) => {\n const assetContainer = createAssetContainer(props);\n const textContainer = createTextContainer(props);\n\n return new ElementBuilder()\n .withClassName('hero-expand-sticky')\n .withChildren(assetContainer, textContainer)\n .withStyles({\n element: {\n position: 'relative',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: 0,\n height: '100vh',\n }),\n },\n\n [`@supports (not (animation-timeline: view()))`]: {\n top: '0 !important',\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroExpand = (props: HeroExpandProps) => {\n const sticky = createSticky(props);\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-expand')\n .withChild(sticky)\n .withStyles({\n element: {\n containerType: 'inline-size',\n ...withViewTimelineAnimation({\n position: 'relative',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n height: '200vh',\n },\n }),\n\n ['& img, & video']: {\n display: 'block',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n },\n })\n .build();\n\n const setTopPosition = ({ value }: { value: string | null }) => {\n sticky.element.style.top = value || '0';\n };\n\n composite.styles += keyFrameImgOverlay;\n composite.styles += keyFrameImgSize;\n composite.styles += keyFrameComponentSize;\n\n return {\n ...composite,\n events: {\n setTopPosition,\n },\n };\n};\n"],"names":["assets.video.toggle","assets.image.background"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../../source/composite/hero/custom/grid.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,iBAAiB,CAAC;AAEzE,UAAU,WAAW;IACnB,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACjC;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../../source/composite/hero/custom/grid.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,iBAAiB,CAAC;AAEzE,UAAU,WAAW;IACnB,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACjC;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAuYD,eAAO,MAAM,uBAAuB,GAAI,OAAO,aAAa,yFAwC3D,CAAC"}
|
|
@@ -102,11 +102,15 @@ const createImageWrapper = (image) => createImageBackground({
|
|
|
102
102
|
element: image,
|
|
103
103
|
isScaled: true,
|
|
104
104
|
isGifAllowed: true,
|
|
105
|
-
isShowCaption: true
|
|
105
|
+
isShowCaption: true,
|
|
106
|
+
imageLoading: "eager",
|
|
107
|
+
imageFetchPriority: "high"
|
|
106
108
|
});
|
|
107
109
|
const createVideoWrapper = (video) => createVideoObservedAutoPlay({
|
|
108
110
|
video,
|
|
109
111
|
isAutoplay: true,
|
|
112
|
+
videoPreload: "auto",
|
|
113
|
+
videoFetchPriority: "high",
|
|
110
114
|
additionalElementStyles: {
|
|
111
115
|
additionalElementStyles: {
|
|
112
116
|
width: "100%",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.js","sources":["../../../../source/composite/hero/custom/grid.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { isPreferredReducedMotion } from '@universityofmaryland/web-utilities-library/accessibility';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, textLockup } from 'atomic';\nimport { type ContentElement, type ElementModel } from '../../../_types';\n\ninterface CornerProps {\n images: Array<HTMLImageElement>;\n isCornerLeft: boolean;\n}\n\ninterface CenterProps {\n images: Array<HTMLImageElement>;\n video?: HTMLVideoElement | null;\n}\n\ninterface HeroGridProps {\n headline?: ContentElement;\n text?: ContentElement;\n actions?: ContentElement;\n corners: Array<CornerProps>;\n center: CenterProps | null;\n isThemeDark?: boolean;\n}\n\nconst isPreferReducedMotion = isPreferredReducedMotion();\nconst isScrollTimelineSupported = () =>\n 'ScrollTimeline' in window || CSS.supports('animation-timeline', 'scroll()');\nconst isDisplayWithoutAnimation =\n isPreferReducedMotion || !isScrollTimelineSupported();\n\nconst ANIMATION_RANGES = {\n GRID_COLUMNS: { start: '110vh', end: '230vh' },\n GRID_ROWS: { start: '110vh', end: '230vh' },\n TINT_FADE: { start: '50vh', end: '140vh' },\n} as const;\n\nconst GRID_LAYOUT = {\n COLUMNS: {\n INITIAL: '20% 60% 20%',\n FINAL: '0 100% 0',\n DEFAULT: '25% 50% 25%',\n },\n ROWS: {\n INITIAL: '25vh 1fr 25vh',\n FINAL: '0 1fr 0',\n TRIPLE: '1fr 1fr 1fr',\n },\n} as const;\n\nconst keyFrameColumns = `\n @keyframes grid-columns {\n from {\n grid-template-columns: ${GRID_LAYOUT.COLUMNS.INITIAL};\n }\n to {\n grid-template-columns: ${GRID_LAYOUT.COLUMNS.FINAL};\n grid-gap: 0;\n }\n }\n`;\n\nconst keyFrameRows = `\n @keyframes grid-rows {\n from {\n grid-template-rows: ${GRID_LAYOUT.ROWS.INITIAL};\n }\n to {\n grid-template-rows: ${GRID_LAYOUT.ROWS.FINAL};\n grid-gap: 0;\n }\n }\n`;\n\nconst keyFrameTint = `\n @keyframes tint-fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n`;\n\nconst columnBase = {\n display: 'grid',\n gridAutoFlow: 'row dense',\n gridGap: `${token.spacing.min}`,\n width: '100%',\n height: '100vh',\n\n [`@media (${token.media.queries.tablet.min})`]: {\n gridGap: `${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridGap: `${token.spacing.lg}`,\n },\n\n ['& > *']: {\n overflow: 'hidden',\n position: 'relative',\n },\n};\n\nconst createImageWrapper = (image: HTMLImageElement) =>\n assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\n });\n\nconst createVideoWrapper = (video: HTMLVideoElement) =>\n assets.video.observedAutoPlay({\n video,\n isAutoplay: true,\n additionalElementStyles: {\n additionalElementStyles: {\n width: '100%',\n aspectRatio: '1 / 1',\n position: 'relative',\n overflow: 'hidden',\n\n [`& video`]: {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n },\n },\n },\n });\n\nconst createCorner = ({ images, isCornerLeft }: CornerProps) => {\n const children = images.map((image) => createImageWrapper(image));\n\n return new ElementBuilder()\n .withClassName(\n isCornerLeft ? 'hero-grid-corner-left' : 'hero-grid-corner-right',\n )\n .withChildren(...children)\n .withStyles({\n element: {\n ...columnBase,\n gridTemplateRows: GRID_LAYOUT.ROWS.TRIPLE,\n },\n })\n .withAttribute('role', 'region')\n .withAttribute(\n 'aria-label',\n `${isCornerLeft ? 'Left' : 'Right'} decorative image grid`,\n )\n .build();\n};\n\nconst createCenter = ({ images, video }: CenterProps) => {\n const tint = new ElementBuilder()\n .withClassName('hero-grid-tint')\n .withStyles({\n element: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 9,\n opacity: 0,\n ...withViewTimelineAnimation({\n animation: 'tint-fade ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.TINT_FADE.start,\n animationRangeEnd: ANIMATION_RANGES.TINT_FADE.end,\n }),\n },\n })\n .withAttribute('role', 'region')\n .withAttribute('aria-label', 'Main hero content')\n .build();\n\n const container = new ElementBuilder()\n .withClassName('hero-grid-center')\n .withChild(tint)\n .withStyles({\n element: {\n ...columnBase,\n gridTemplateRows: GRID_LAYOUT.ROWS.INITIAL,\n ...withViewTimelineAnimation({\n animation: 'grid-rows ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.GRID_ROWS.start,\n animationRangeEnd: ANIMATION_RANGES.GRID_ROWS.end,\n }),\n },\n });\n\n if (video) {\n container\n .withChild(createImageWrapper(images[0]))\n .withChild(createVideoWrapper(video))\n .withChild(createImageWrapper(images[1]));\n } else {\n images.forEach((image) => {\n container.withChild(createImageWrapper(image));\n });\n }\n\n return container.build();\n};\n\nconst createHeadline = (\n props: Pick<HeroGridProps, 'headline'>,\n): ElementModel<HTMLElement> | null => {\n const { headline } = props;\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n\n if (!headline) return null;\n\n const desktopStyles = {\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '80px',\n }),\n },\n };\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.extraLarge)\n .withStyles({\n element: {\n color: token.color.white,\n textTransform: 'uppercase',\n textWrap: 'pretty',\n ...desktopStyles,\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createTextContainer = (\n props: Pick<HeroGridProps, 'headline' | 'text' | 'actions' | 'isThemeDark'>,\n) => {\n const { actions, headline, text, isThemeDark } = props;\n let shouldRenderBlackText = null;\n\n if (isDisplayWithoutAnimation && !isThemeDark) {\n shouldRenderBlackText = true;\n }\n\n if (!text && !actions && !headline) {\n return null;\n }\n\n const textContainer = new ElementBuilder()\n .withClassName('hero-expand-text-container')\n .withStyles({\n element: {\n position: 'relative',\n height: '100%',\n zIndex: 9999,\n textAlign: 'center',\n padding: `${token.spacing.md} 0`,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['3xl']} 0`,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n\n [`@container (${token.media.queries.highDef.min})`]: {\n padding: `${token.spacing['6xl']} 0`,\n },\n\n ...withViewTimelineAnimation({\n paddingTop: '140vh',\n }),\n\n ['*']: {\n ...(shouldRenderBlackText && {\n color: `${token.color.black} !important`,\n }),\n },\n },\n })\n .build();\n\n const lock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.smallest)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n position: 'relative',\n },\n })\n .build();\n\n const textLockupElement = textLockup.large({\n headlineComposite: createHeadline(props),\n textLargest: text,\n actions,\n isThemeDark: true,\n });\n\n lock.element.appendChild(textLockupElement.element);\n lock.styles += textLockupElement.styles;\n\n textContainer.element.appendChild(lock.element);\n textContainer.styles += lock.styles;\n\n return textContainer;\n};\n\nconst validateGridProps = (\n props: HeroGridProps,\n): {\n leftCorner: CornerProps;\n rightCorner: CornerProps;\n center: CenterProps;\n} | null => {\n const leftCorner = props.corners.find((c) => c.isCornerLeft);\n const rightCorner = props.corners.find((c) => !c.isCornerLeft);\n\n const errors = [];\n\n // Validate corners\n if (!leftCorner) {\n errors.push('Left corner is required for hero grid');\n } else if (!leftCorner.images || leftCorner.images.length === 0) {\n errors.push('Left corner must have at least one image');\n }\n\n if (!rightCorner) {\n errors.push('Right corner is required for hero grid');\n } else if (!rightCorner.images || rightCorner.images.length === 0) {\n errors.push('Right corner must have at least one image');\n }\n\n // Validate center\n if (!props.center) {\n errors.push('Center is required for hero grid');\n } else {\n if (!props.center.images || props.center.images.length === 0) {\n errors.push('Center must have at least one image');\n } else if (props.center.video && props.center.images.length < 2) {\n errors.push('Center must have at least 2 images when video is provided');\n }\n }\n\n if (errors.length > 0) {\n errors.forEach((error) => console.log('Hero Grid Error:', error));\n return null;\n }\n\n return {\n leftCorner: leftCorner as CornerProps,\n rightCorner: rightCorner as CornerProps,\n center: props.center as CenterProps,\n };\n};\n\nconst createGridLayout = (\n leftCorner: CornerProps,\n rightCorner: CornerProps,\n center: CenterProps,\n) => {\n const gridStyles = {\n gridTemplateColumns: GRID_LAYOUT.COLUMNS.DEFAULT,\n height: '100vh',\n width: '100%',\n display: 'grid',\n gridGap: `${token.spacing.min}`,\n\n [`@media (${token.media.queries.tablet.min})`]: {\n gridGap: `${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridGap: `${token.spacing.lg}`,\n },\n\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: 0,\n animation: 'grid-columns ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.GRID_COLUMNS.start,\n animationRangeEnd: ANIMATION_RANGES.GRID_COLUMNS.end,\n }),\n };\n\n return new ElementBuilder()\n .withClassName('hero-grid-layout')\n .withChildren(\n createCorner(leftCorner),\n createCenter(center),\n createCorner(rightCorner),\n )\n .withStyles({ element: gridStyles })\n .withAttribute('role', 'region')\n .withAttribute('aria-label', 'Hero grid layout')\n .build();\n};\n\nexport const createCompositeHeroGrid = (props: HeroGridProps) => {\n const validated = validateGridProps(props);\n if (!validated) return null;\n\n const { leftCorner, rightCorner, center } = validated;\n const text = createTextContainer(props);\n const grid = createGridLayout(leftCorner, rightCorner, center);\n\n const composite = new ElementBuilder()\n .withClassName('hero-grid-container')\n .withChild(grid)\n .withStyles({\n element: {\n width: '100%',\n display: 'block',\n containerType: 'inline-size',\n ...withViewTimelineAnimation({\n height: '300vh',\n }),\n ['img, video']: {\n objectFit: 'cover',\n width: '100%',\n height: '100%',\n },\n },\n })\n .withAttribute('role', 'main')\n .withAttribute('aria-label', 'Hero section');\n\n if (text) {\n composite.withChild(text);\n }\n\n const built = composite.build();\n\n built.styles += keyFrameColumns;\n built.styles += keyFrameRows;\n built.styles += keyFrameTint;\n\n return built;\n};\n"],"names":["assets.image.background","assets.video.observedAutoPlay","textLockup.large"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grid.js","sources":["../../../../source/composite/hero/custom/grid.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { isPreferredReducedMotion } from '@universityofmaryland/web-utilities-library/accessibility';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, textLockup } from 'atomic';\nimport { type ContentElement, type ElementModel } from '../../../_types';\n\ninterface CornerProps {\n images: Array<HTMLImageElement>;\n isCornerLeft: boolean;\n}\n\ninterface CenterProps {\n images: Array<HTMLImageElement>;\n video?: HTMLVideoElement | null;\n}\n\ninterface HeroGridProps {\n headline?: ContentElement;\n text?: ContentElement;\n actions?: ContentElement;\n corners: Array<CornerProps>;\n center: CenterProps | null;\n isThemeDark?: boolean;\n}\n\nconst isPreferReducedMotion = isPreferredReducedMotion();\nconst isScrollTimelineSupported = () =>\n 'ScrollTimeline' in window || CSS.supports('animation-timeline', 'scroll()');\nconst isDisplayWithoutAnimation =\n isPreferReducedMotion || !isScrollTimelineSupported();\n\nconst ANIMATION_RANGES = {\n GRID_COLUMNS: { start: '110vh', end: '230vh' },\n GRID_ROWS: { start: '110vh', end: '230vh' },\n TINT_FADE: { start: '50vh', end: '140vh' },\n} as const;\n\nconst GRID_LAYOUT = {\n COLUMNS: {\n INITIAL: '20% 60% 20%',\n FINAL: '0 100% 0',\n DEFAULT: '25% 50% 25%',\n },\n ROWS: {\n INITIAL: '25vh 1fr 25vh',\n FINAL: '0 1fr 0',\n TRIPLE: '1fr 1fr 1fr',\n },\n} as const;\n\nconst keyFrameColumns = `\n @keyframes grid-columns {\n from {\n grid-template-columns: ${GRID_LAYOUT.COLUMNS.INITIAL};\n }\n to {\n grid-template-columns: ${GRID_LAYOUT.COLUMNS.FINAL};\n grid-gap: 0;\n }\n }\n`;\n\nconst keyFrameRows = `\n @keyframes grid-rows {\n from {\n grid-template-rows: ${GRID_LAYOUT.ROWS.INITIAL};\n }\n to {\n grid-template-rows: ${GRID_LAYOUT.ROWS.FINAL};\n grid-gap: 0;\n }\n }\n`;\n\nconst keyFrameTint = `\n @keyframes tint-fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n`;\n\nconst columnBase = {\n display: 'grid',\n gridAutoFlow: 'row dense',\n gridGap: `${token.spacing.min}`,\n width: '100%',\n height: '100vh',\n\n [`@media (${token.media.queries.tablet.min})`]: {\n gridGap: `${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridGap: `${token.spacing.lg}`,\n },\n\n ['& > *']: {\n overflow: 'hidden',\n position: 'relative',\n },\n};\n\nconst createImageWrapper = (image: HTMLImageElement) =>\n assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\n imageLoading: 'eager',\n imageFetchPriority: 'high',\n });\n\nconst createVideoWrapper = (video: HTMLVideoElement) =>\n assets.video.observedAutoPlay({\n video,\n isAutoplay: true,\n videoPreload: 'auto',\n videoFetchPriority: 'high',\n additionalElementStyles: {\n additionalElementStyles: {\n width: '100%',\n aspectRatio: '1 / 1',\n position: 'relative',\n overflow: 'hidden',\n\n [`& video`]: {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n },\n },\n },\n });\n\nconst createCorner = ({ images, isCornerLeft }: CornerProps) => {\n const children = images.map((image) => createImageWrapper(image));\n\n return new ElementBuilder()\n .withClassName(\n isCornerLeft ? 'hero-grid-corner-left' : 'hero-grid-corner-right',\n )\n .withChildren(...children)\n .withStyles({\n element: {\n ...columnBase,\n gridTemplateRows: GRID_LAYOUT.ROWS.TRIPLE,\n },\n })\n .withAttribute('role', 'region')\n .withAttribute(\n 'aria-label',\n `${isCornerLeft ? 'Left' : 'Right'} decorative image grid`,\n )\n .build();\n};\n\nconst createCenter = ({ images, video }: CenterProps) => {\n const tint = new ElementBuilder()\n .withClassName('hero-grid-tint')\n .withStyles({\n element: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 9,\n opacity: 0,\n ...withViewTimelineAnimation({\n animation: 'tint-fade ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.TINT_FADE.start,\n animationRangeEnd: ANIMATION_RANGES.TINT_FADE.end,\n }),\n },\n })\n .withAttribute('role', 'region')\n .withAttribute('aria-label', 'Main hero content')\n .build();\n\n const container = new ElementBuilder()\n .withClassName('hero-grid-center')\n .withChild(tint)\n .withStyles({\n element: {\n ...columnBase,\n gridTemplateRows: GRID_LAYOUT.ROWS.INITIAL,\n ...withViewTimelineAnimation({\n animation: 'grid-rows ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.GRID_ROWS.start,\n animationRangeEnd: ANIMATION_RANGES.GRID_ROWS.end,\n }),\n },\n });\n\n if (video) {\n container\n .withChild(createImageWrapper(images[0]))\n .withChild(createVideoWrapper(video))\n .withChild(createImageWrapper(images[1]));\n } else {\n images.forEach((image) => {\n container.withChild(createImageWrapper(image));\n });\n }\n\n return container.build();\n};\n\nconst createHeadline = (\n props: Pick<HeroGridProps, 'headline'>,\n): ElementModel<HTMLElement> | null => {\n const { headline } = props;\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n\n if (!headline) return null;\n\n const desktopStyles = {\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '80px',\n }),\n },\n };\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.extraLarge)\n .withStyles({\n element: {\n color: token.color.white,\n textTransform: 'uppercase',\n textWrap: 'pretty',\n ...desktopStyles,\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createTextContainer = (\n props: Pick<HeroGridProps, 'headline' | 'text' | 'actions' | 'isThemeDark'>,\n) => {\n const { actions, headline, text, isThemeDark } = props;\n let shouldRenderBlackText = null;\n\n if (isDisplayWithoutAnimation && !isThemeDark) {\n shouldRenderBlackText = true;\n }\n\n if (!text && !actions && !headline) {\n return null;\n }\n\n const textContainer = new ElementBuilder()\n .withClassName('hero-expand-text-container')\n .withStyles({\n element: {\n position: 'relative',\n height: '100%',\n zIndex: 9999,\n textAlign: 'center',\n padding: `${token.spacing.md} 0`,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['3xl']} 0`,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n\n [`@container (${token.media.queries.highDef.min})`]: {\n padding: `${token.spacing['6xl']} 0`,\n },\n\n ...withViewTimelineAnimation({\n paddingTop: '140vh',\n }),\n\n ['*']: {\n ...(shouldRenderBlackText && {\n color: `${token.color.black} !important`,\n }),\n },\n },\n })\n .build();\n\n const lock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.smallest)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n position: 'relative',\n },\n })\n .build();\n\n const textLockupElement = textLockup.large({\n headlineComposite: createHeadline(props),\n textLargest: text,\n actions,\n isThemeDark: true,\n });\n\n lock.element.appendChild(textLockupElement.element);\n lock.styles += textLockupElement.styles;\n\n textContainer.element.appendChild(lock.element);\n textContainer.styles += lock.styles;\n\n return textContainer;\n};\n\nconst validateGridProps = (\n props: HeroGridProps,\n): {\n leftCorner: CornerProps;\n rightCorner: CornerProps;\n center: CenterProps;\n} | null => {\n const leftCorner = props.corners.find((c) => c.isCornerLeft);\n const rightCorner = props.corners.find((c) => !c.isCornerLeft);\n\n const errors = [];\n\n // Validate corners\n if (!leftCorner) {\n errors.push('Left corner is required for hero grid');\n } else if (!leftCorner.images || leftCorner.images.length === 0) {\n errors.push('Left corner must have at least one image');\n }\n\n if (!rightCorner) {\n errors.push('Right corner is required for hero grid');\n } else if (!rightCorner.images || rightCorner.images.length === 0) {\n errors.push('Right corner must have at least one image');\n }\n\n // Validate center\n if (!props.center) {\n errors.push('Center is required for hero grid');\n } else {\n if (!props.center.images || props.center.images.length === 0) {\n errors.push('Center must have at least one image');\n } else if (props.center.video && props.center.images.length < 2) {\n errors.push('Center must have at least 2 images when video is provided');\n }\n }\n\n if (errors.length > 0) {\n errors.forEach((error) => console.log('Hero Grid Error:', error));\n return null;\n }\n\n return {\n leftCorner: leftCorner as CornerProps,\n rightCorner: rightCorner as CornerProps,\n center: props.center as CenterProps,\n };\n};\n\nconst createGridLayout = (\n leftCorner: CornerProps,\n rightCorner: CornerProps,\n center: CenterProps,\n) => {\n const gridStyles = {\n gridTemplateColumns: GRID_LAYOUT.COLUMNS.DEFAULT,\n height: '100vh',\n width: '100%',\n display: 'grid',\n gridGap: `${token.spacing.min}`,\n\n [`@media (${token.media.queries.tablet.min})`]: {\n gridGap: `${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridGap: `${token.spacing.lg}`,\n },\n\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: 0,\n animation: 'grid-columns ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.GRID_COLUMNS.start,\n animationRangeEnd: ANIMATION_RANGES.GRID_COLUMNS.end,\n }),\n };\n\n return new ElementBuilder()\n .withClassName('hero-grid-layout')\n .withChildren(\n createCorner(leftCorner),\n createCenter(center),\n createCorner(rightCorner),\n )\n .withStyles({ element: gridStyles })\n .withAttribute('role', 'region')\n .withAttribute('aria-label', 'Hero grid layout')\n .build();\n};\n\nexport const createCompositeHeroGrid = (props: HeroGridProps) => {\n const validated = validateGridProps(props);\n if (!validated) return null;\n\n const { leftCorner, rightCorner, center } = validated;\n const text = createTextContainer(props);\n const grid = createGridLayout(leftCorner, rightCorner, center);\n\n const composite = new ElementBuilder()\n .withClassName('hero-grid-container')\n .withChild(grid)\n .withStyles({\n element: {\n width: '100%',\n display: 'block',\n containerType: 'inline-size',\n ...withViewTimelineAnimation({\n height: '300vh',\n }),\n ['img, video']: {\n objectFit: 'cover',\n width: '100%',\n height: '100%',\n },\n },\n })\n .withAttribute('role', 'main')\n .withAttribute('aria-label', 'Hero section');\n\n if (text) {\n composite.withChild(text);\n }\n\n const built = composite.build();\n\n built.styles += keyFrameColumns;\n built.styles += keyFrameRows;\n built.styles += keyFrameTint;\n\n return built;\n};\n"],"names":["assets.image.background","assets.video.observedAutoPlay","textLockup.large"],"mappings":"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"}
|