@universityofmaryland/web-elements-library 1.6.14 → 1.6.16

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # University of Maryland Web Elements Library
2
2
 
3
- [![Elements Version](https://img.shields.io/badge/Elements-v1.6.14-blue)](https://www.npmjs.com/package/@universityofmaryland/web-elements-library)
3
+ [![Elements Version](https://img.shields.io/badge/Elements-v1.6.16-blue)](https://www.npmjs.com/package/@universityofmaryland/web-elements-library)
4
4
 
5
5
  Foundational UI building blocks for the UMD Design System, providing atomic elements that combine to create complex, accessible, and brand-compliant University of Maryland digital experiences.
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../source/composite/navigation/elements/drawer/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iCAAiC,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAsD,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAE1G,MAAM,MAAM,yBAAyB,GAAG,yBAAyB,GAAG;IAClE,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF,KAAK,sBAAsB,GAAG,yBAAyB,GACrD,qBAAqB,GACrB,iCAAiC,CAAC;AAEpC,MAAM,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAwMrD,eAAO,MAAM,+BAA+B;2BA7FL,yBAAyB;;;;;;;CAgG/D,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../source/composite/navigation/elements/drawer/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iCAAiC,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAEL,yBAAyB,EAC1B,MAAM,WAAW,CAAC;AAGnB,MAAM,MAAM,yBAAyB,GAAG,yBAAyB,GAAG;IAClE,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF,KAAK,sBAAsB,GAAG,yBAAyB,GACrD,qBAAqB,GACrB,iCAAiC,CAAC;AAEpC,MAAM,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAmNrD,eAAO,MAAM,+BAA+B;2BA7FL,yBAAyB;;;;;;;CAgG/D,CAAC"}
@@ -2,11 +2,19 @@ import * as token from "@universityofmaryland/web-token-library";
2
2
  import { handleKeyboardNavigation } from "@universityofmaryland/web-utilities-library/events";
3
3
  import { close_large } from "@universityofmaryland/web-icons-library/controls";
4
4
  import { createCompositeNavigationSlider } from "../slider/index.js";
5
+ import { createCompositeNavigationSlides } from "../slider/slides.js";
5
6
  const ANIMATION_TIME = 300;
6
7
  const ELEMENT_NAV_DRAWER_CONTAINER = "nav-drawer-container";
7
8
  const ELEMENT_NAV_DRAWER_OVERLAY = "nav-drawer-overlay";
8
9
  const ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER = "nav-drawer-overlay-wrapper";
9
10
  const ELEMENT_NAV_DRAWER_CLOSE_BUTTON = "nav-drawer-close-button";
11
+ const OVERWRITE_NAV_SLIDER_OVERFLOW = `.${createCompositeNavigationSlides.Elements.overflow}`;
12
+ const slidesWrapper = `
13
+ ${OVERWRITE_NAV_SLIDER_OVERFLOW} {
14
+ overflow-y: scroll;
15
+ height: 100%;
16
+ }
17
+ `;
10
18
  const DrawerButtonClose = `
11
19
  .${ELEMENT_NAV_DRAWER_CLOSE_BUTTON} {
12
20
  background-color: ${token.color.red};
@@ -66,6 +74,7 @@ const STYLES_NAV_DRAWER_ELEMENT = `
66
74
  ${createCompositeNavigationSlider.Styles}
67
75
  ${DrawerButtonClose}
68
76
  ${DrawerContainer}
77
+ ${slidesWrapper}
69
78
  `;
70
79
  const CreateDrawerButton = (element) => {
71
80
  const drawerCloseButton = document.createElement("button");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../source/composite/navigation/elements/drawer/index.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { handleKeyboardNavigation } from '@universityofmaryland/web-utilities-library/events';\nimport { close_large as iconCloseLarge } from '@universityofmaryland/web-icons-library/controls';\nimport { TypeMenuDisplayButtonRequirements } from '../menu-button';\nimport { createCompositeNavigationSlider as NavDrawerSlider, TypeNavSliderRequirements } from '../slider';\n\nexport type TypeNavDrawerRequirements = TypeNavSliderRequirements & {\n context?: HTMLElement;\n};\n\ntype TypeDrawerCloseButton = {\n eventClose: () => void;\n};\n\ntype CombinedNavDrawerProps = TypeNavDrawerRequirements &\n TypeDrawerCloseButton &\n TypeMenuDisplayButtonRequirements;\n\nexport type TypeDrawerProps = CombinedNavDrawerProps;\n\nconst ANIMATION_TIME = 300;\n\nconst ELEMENT_NAV_DRAWER_CONTAINER = 'nav-drawer-container';\nconst ELEMENT_NAV_DRAWER_OVERLAY = 'nav-drawer-overlay';\nconst ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER = 'nav-drawer-overlay-wrapper';\nconst ELEMENT_NAV_DRAWER_CLOSE_BUTTON = 'nav-drawer-close-button';\n\n// prettier-ignore\nconst DrawerButtonClose = `\n .${ELEMENT_NAV_DRAWER_CLOSE_BUTTON} {\n background-color: ${token.color.red};\n display: flex;\n align-items: center;\n justify-content: center;\n height: ${token.spacing['2xl']};\n width: ${token.spacing['2xl']};\n padding: 12px;\n transition: background .5s ease-in-out;\n order: 2;\n }\n\n .${ELEMENT_NAV_DRAWER_CLOSE_BUTTON}:hover,\n .${ELEMENT_NAV_DRAWER_CLOSE_BUTTON}:focus {\n background-color: ${token.color.redDark};\n }\n\n .${ELEMENT_NAV_DRAWER_CLOSE_BUTTON} svg {\n fill: ${token.color.white};\n }\n`;\n\n// prettier-ignore\nconst DrawerContainer = `\n .${ELEMENT_NAV_DRAWER_CONTAINER} {\n position: fixed;\n bottom: 0;\n left: 0;\n top: 0;\n display: none;\n z-index: 999999;\n }\n\n .${ELEMENT_NAV_DRAWER_OVERLAY} {\n position: fixed;\n top: 0;\n left: 0;\n height: 100vh;\n width: 100vw;\n background-color: rgba(0,0,0,0.5);\n transition: opacity ${ANIMATION_TIME}ms ease-in-out;\n cursor: pointer;\n opacity: 0;\n }\n\n .${ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER} {\n display: flex;\n height: 100%;\n transition: transform ${ANIMATION_TIME + 100}ms ease-in-out;\n transform: translateX(-100%);\n }\n\n .${ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER} > *:not(.${ELEMENT_NAV_DRAWER_CLOSE_BUTTON}) {\n height: 100% !important;\n }\n`;\n\nconst STYLES_NAV_DRAWER_ELEMENT = `\n ${NavDrawerSlider.Styles}\n ${DrawerButtonClose}\n ${DrawerContainer}\n`;\n\nconst CreateDrawerButton = (element: TypeDrawerCloseButton) => {\n const drawerCloseButton = document.createElement('button');\n\n drawerCloseButton.innerHTML = iconCloseLarge;\n drawerCloseButton.classList.add(ELEMENT_NAV_DRAWER_CLOSE_BUTTON);\n drawerCloseButton.setAttribute('aria-label', 'Close navigation drawer');\n drawerCloseButton.addEventListener('click', element.eventClose.bind(element));\n\n return drawerCloseButton;\n};\n\nconst CreateNavDrawerContainer = (props: TypeDrawerProps) => {\n const { eventClose } = props;\n const bodyOverlay = document.createElement('div');\n const bodyOverlayWrapper = document.createElement('div');\n const closeButton = CreateDrawerButton(props);\n const slider = NavDrawerSlider.CreateElement({\n ...props,\n displayType: 'drawer-nav',\n });\n\n bodyOverlayWrapper.classList.add(ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER);\n\n bodyOverlayWrapper.appendChild(closeButton);\n bodyOverlayWrapper.appendChild(slider.container);\n\n bodyOverlay.classList.add(ELEMENT_NAV_DRAWER_OVERLAY);\n bodyOverlay.addEventListener('click', eventClose.bind(props));\n bodyOverlay.appendChild(bodyOverlayWrapper);\n\n return bodyOverlay;\n};\n\nconst CreateNavDrawerElement = (props: TypeNavDrawerRequirements) =>\n (() => {\n const { context, primarySlideLinks } = props;\n const body = document.querySelector('body') as HTMLBodyElement;\n const elementContainer = document.createElement('div');\n\n if (!primarySlideLinks) return null;\n\n const eventClose = () => {\n const bodyOverlay = elementContainer.querySelector(\n `.${ELEMENT_NAV_DRAWER_OVERLAY}`,\n ) as HTMLDivElement;\n const bodyOverlayWrapper = bodyOverlay.querySelector(\n `.${ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER}`,\n ) as HTMLDivElement;\n const slider = bodyOverlay.querySelector(\n `.${NavDrawerSlider.Elements.slider}`,\n ) as HTMLDivElement;\n\n bodyOverlay.style.opacity = '0';\n bodyOverlayWrapper.style.transform = 'translateX(-100%)';\n\n setTimeout(() => {\n bodyOverlay.removeAttribute('style');\n bodyOverlayWrapper.removeAttribute('style');\n body.style.overflow = 'auto';\n elementContainer.style.display = 'none';\n }, ANIMATION_TIME + 100);\n\n if (slider) {\n slider.style.overflowY = `hidden`;\n }\n };\n\n const eventOpen = () => {\n const bodyOverlay = elementContainer.querySelector(\n `.${ELEMENT_NAV_DRAWER_OVERLAY}`,\n ) as HTMLDivElement;\n const bodyOverlayWrapper = bodyOverlay.querySelector(\n `.${ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER}`,\n ) as HTMLDivElement;\n const closeButton = bodyOverlayWrapper.querySelector(\n `.${ELEMENT_NAV_DRAWER_CLOSE_BUTTON}`,\n ) as HTMLButtonElement;\n const slider = bodyOverlayWrapper.querySelector(\n `.${NavDrawerSlider.Elements.slider}`,\n ) as HTMLDivElement;\n const activeSlide = bodyOverlayWrapper.querySelector(\n `.${NavDrawerSlider.Elements.slider} div[data-active]`,\n ) as HTMLDivElement;\n\n elementContainer.style.display = 'block';\n bodyOverlay.style.display = 'block';\n bodyOverlayWrapper.style.display = 'flex';\n\n setTimeout(() => {\n bodyOverlay.style.opacity = '1';\n bodyOverlayWrapper.style.transform = 'translateX(0)';\n body.style.overflow = 'hidden';\n closeButton.focus();\n\n handleKeyboardNavigation({\n element: elementContainer,\n action: () => eventClose(),\n shadowDomContext: context,\n });\n }, 100);\n\n setTimeout(() => {\n if (!activeSlide || !slider) return;\n if (activeSlide.offsetHeight > elementContainer.offsetHeight) {\n slider.style.overflowY = `scroll`;\n }\n }, 200);\n };\n\n const children = CreateNavDrawerContainer({\n ...props,\n eventOpen,\n eventClose,\n });\n\n elementContainer.classList.add(ELEMENT_NAV_DRAWER_CONTAINER);\n elementContainer.appendChild(children);\n\n return {\n element: elementContainer,\n events: {\n eventOpen,\n },\n };\n })();\n\nexport const createCompositeNavigationDrawer = {\n CreateElement: CreateNavDrawerElement,\n Styles: STYLES_NAV_DRAWER_ELEMENT,\n};\n"],"names":["NavDrawerSlider","iconCloseLarge"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../source/composite/navigation/elements/drawer/index.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { handleKeyboardNavigation } from '@universityofmaryland/web-utilities-library/events';\nimport { close_large as iconCloseLarge } from '@universityofmaryland/web-icons-library/controls';\nimport { TypeMenuDisplayButtonRequirements } from '../menu-button';\nimport {\n createCompositeNavigationSlider as NavDrawerSlider,\n TypeNavSliderRequirements,\n} from '../slider';\nimport { createCompositeNavigationSlides as NavDrawerSlides } from '../slider/slides';\n\nexport type TypeNavDrawerRequirements = TypeNavSliderRequirements & {\n context?: HTMLElement;\n};\n\ntype TypeDrawerCloseButton = {\n eventClose: () => void;\n};\n\ntype CombinedNavDrawerProps = TypeNavDrawerRequirements &\n TypeDrawerCloseButton &\n TypeMenuDisplayButtonRequirements;\n\nexport type TypeDrawerProps = CombinedNavDrawerProps;\n\nconst ANIMATION_TIME = 300;\n\nconst ELEMENT_NAV_DRAWER_CONTAINER = 'nav-drawer-container';\nconst ELEMENT_NAV_DRAWER_OVERLAY = 'nav-drawer-overlay';\nconst ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER = 'nav-drawer-overlay-wrapper';\nconst ELEMENT_NAV_DRAWER_CLOSE_BUTTON = 'nav-drawer-close-button';\n\nconst OVERWRITE_NAV_SLIDER_OVERFLOW = `.${NavDrawerSlides.Elements.overflow}`;\n\n// prettier-ignore\nconst slidesWrapper = `\n ${OVERWRITE_NAV_SLIDER_OVERFLOW} {\n overflow-y: scroll;\n height: 100%;\n }\n`;\n\n// prettier-ignore\nconst DrawerButtonClose = `\n .${ELEMENT_NAV_DRAWER_CLOSE_BUTTON} {\n background-color: ${token.color.red};\n display: flex;\n align-items: center;\n justify-content: center;\n height: ${token.spacing['2xl']};\n width: ${token.spacing['2xl']};\n padding: 12px;\n transition: background .5s ease-in-out;\n order: 2;\n }\n\n .${ELEMENT_NAV_DRAWER_CLOSE_BUTTON}:hover,\n .${ELEMENT_NAV_DRAWER_CLOSE_BUTTON}:focus {\n background-color: ${token.color.redDark};\n }\n\n .${ELEMENT_NAV_DRAWER_CLOSE_BUTTON} svg {\n fill: ${token.color.white};\n }\n`;\n\n// prettier-ignore\nconst DrawerContainer = `\n .${ELEMENT_NAV_DRAWER_CONTAINER} {\n position: fixed;\n bottom: 0;\n left: 0;\n top: 0;\n display: none;\n z-index: 999999;\n }\n\n .${ELEMENT_NAV_DRAWER_OVERLAY} {\n position: fixed;\n top: 0;\n left: 0;\n height: 100vh;\n width: 100vw;\n background-color: rgba(0,0,0,0.5);\n transition: opacity ${ANIMATION_TIME}ms ease-in-out;\n cursor: pointer;\n opacity: 0;\n }\n\n .${ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER} {\n display: flex;\n height: 100%;\n transition: transform ${ANIMATION_TIME + 100}ms ease-in-out;\n transform: translateX(-100%);\n }\n\n .${ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER} > *:not(.${ELEMENT_NAV_DRAWER_CLOSE_BUTTON}) {\n height: 100% !important;\n }\n`;\n\nconst STYLES_NAV_DRAWER_ELEMENT = `\n ${NavDrawerSlider.Styles}\n ${DrawerButtonClose}\n ${DrawerContainer}\n ${slidesWrapper}\n`;\n\nconst CreateDrawerButton = (element: TypeDrawerCloseButton) => {\n const drawerCloseButton = document.createElement('button');\n\n drawerCloseButton.innerHTML = iconCloseLarge;\n drawerCloseButton.classList.add(ELEMENT_NAV_DRAWER_CLOSE_BUTTON);\n drawerCloseButton.setAttribute('aria-label', 'Close navigation drawer');\n drawerCloseButton.addEventListener('click', element.eventClose.bind(element));\n\n return drawerCloseButton;\n};\n\nconst CreateNavDrawerContainer = (props: TypeDrawerProps) => {\n const { eventClose } = props;\n const bodyOverlay = document.createElement('div');\n const bodyOverlayWrapper = document.createElement('div');\n const closeButton = CreateDrawerButton(props);\n const slider = NavDrawerSlider.CreateElement({\n ...props,\n displayType: 'drawer-nav',\n });\n\n bodyOverlayWrapper.classList.add(ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER);\n\n bodyOverlayWrapper.appendChild(closeButton);\n bodyOverlayWrapper.appendChild(slider.container);\n\n bodyOverlay.classList.add(ELEMENT_NAV_DRAWER_OVERLAY);\n bodyOverlay.addEventListener('click', eventClose.bind(props));\n bodyOverlay.appendChild(bodyOverlayWrapper);\n\n return bodyOverlay;\n};\n\nconst CreateNavDrawerElement = (props: TypeNavDrawerRequirements) =>\n (() => {\n const { context, primarySlideLinks } = props;\n const body = document.querySelector('body') as HTMLBodyElement;\n const elementContainer = document.createElement('div');\n\n if (!primarySlideLinks) return null;\n\n const eventClose = () => {\n const bodyOverlay = elementContainer.querySelector(\n `.${ELEMENT_NAV_DRAWER_OVERLAY}`,\n ) as HTMLDivElement;\n const bodyOverlayWrapper = bodyOverlay.querySelector(\n `.${ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER}`,\n ) as HTMLDivElement;\n const slider = bodyOverlay.querySelector(\n `.${NavDrawerSlider.Elements.slider}`,\n ) as HTMLDivElement;\n\n bodyOverlay.style.opacity = '0';\n bodyOverlayWrapper.style.transform = 'translateX(-100%)';\n\n setTimeout(() => {\n bodyOverlay.removeAttribute('style');\n bodyOverlayWrapper.removeAttribute('style');\n body.style.overflow = 'auto';\n elementContainer.style.display = 'none';\n }, ANIMATION_TIME + 100);\n\n if (slider) {\n slider.style.overflowY = `hidden`;\n }\n };\n\n const eventOpen = () => {\n const bodyOverlay = elementContainer.querySelector(\n `.${ELEMENT_NAV_DRAWER_OVERLAY}`,\n ) as HTMLDivElement;\n const bodyOverlayWrapper = bodyOverlay.querySelector(\n `.${ELEMENT_NAV_DRAWER_OVERLAY_WRAPPER}`,\n ) as HTMLDivElement;\n const closeButton = bodyOverlayWrapper.querySelector(\n `.${ELEMENT_NAV_DRAWER_CLOSE_BUTTON}`,\n ) as HTMLButtonElement;\n const slider = bodyOverlayWrapper.querySelector(\n `.${NavDrawerSlider.Elements.slider}`,\n ) as HTMLDivElement;\n const activeSlide = bodyOverlayWrapper.querySelector(\n `.${NavDrawerSlider.Elements.slider} div[data-active]`,\n ) as HTMLDivElement;\n\n elementContainer.style.display = 'block';\n bodyOverlay.style.display = 'block';\n bodyOverlayWrapper.style.display = 'flex';\n\n setTimeout(() => {\n bodyOverlay.style.opacity = '1';\n bodyOverlayWrapper.style.transform = 'translateX(0)';\n body.style.overflow = 'hidden';\n closeButton.focus();\n\n handleKeyboardNavigation({\n element: elementContainer,\n action: () => eventClose(),\n shadowDomContext: context,\n });\n }, 100);\n\n setTimeout(() => {\n if (!activeSlide || !slider) return;\n if (activeSlide.offsetHeight > elementContainer.offsetHeight) {\n slider.style.overflowY = `scroll`;\n }\n }, 200);\n };\n\n const children = CreateNavDrawerContainer({\n ...props,\n eventOpen,\n eventClose,\n });\n\n elementContainer.classList.add(ELEMENT_NAV_DRAWER_CONTAINER);\n elementContainer.appendChild(children);\n\n return {\n element: elementContainer,\n events: {\n eventOpen,\n },\n };\n })();\n\nexport const createCompositeNavigationDrawer = {\n CreateElement: CreateNavDrawerElement,\n Styles: STYLES_NAV_DRAWER_ELEMENT,\n};\n"],"names":["NavDrawerSlides","NavDrawerSlider","iconCloseLarge"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../source/composite/navigation/elements/slider/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,cAAc,EACf,MAAM,UAAU,CAAC;AAIlB,KAAK,eAAe,GAAG,cAAc,CAAC;AAEtC,MAAM,MAAM,yBAAyB,GAAG;IACtC,iBAAiB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjD,mBAAmB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,oBAAoB,CAAC,EAAE,eAAe,EAAE,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,yBAAyB,CAAC;AAuU7E,eAAO,MAAM,+BAA+B;2BAjKL,yBAAyB;;;;;;;;;;CAuK/D,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../source/composite/navigation/elements/slider/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,cAAc,EACf,MAAM,UAAU,CAAC;AAIlB,KAAK,eAAe,GAAG,cAAc,CAAC;AAEtC,MAAM,MAAM,yBAAyB,GAAG;IACtC,iBAAiB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjD,mBAAmB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,oBAAoB,CAAC,EAAE,eAAe,EAAE,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,yBAAyB,CAAC;AAiV7E,eAAO,MAAM,+BAA+B;2BA3KL,yBAAyB;;;;;;;;;;CAiL/D,CAAC"}
@@ -179,47 +179,52 @@ const CreateNavSliderElement = (props) => (() => {
179
179
  }, ANIMATION_TIME);
180
180
  };
181
181
  const eventSlide = ({ isRight = false }) => {
182
+ if (isAnimating) return;
182
183
  const activeSlide = elementContainer.querySelector(
183
184
  `[${ATTRIBUTE_ACTIVE_SLIDE}]`
184
185
  );
185
186
  const upcomingSlide = isRight ? getUpcomingSlideParent() : getUpcomingSlide();
186
- const slides = [activeSlide, upcomingSlide];
187
187
  if (!upcomingSlide) {
188
188
  console.error("Missing slide for slide event");
189
189
  return null;
190
190
  }
191
+ if (!activeSlide) throw new Error("Missing slide for slide event");
192
+ const slides = [activeSlide, upcomingSlide];
191
193
  const firstLink = upcomingSlide.querySelector("a");
192
- const animate = () => {
193
- let startPositionForUpcomingSlide = "100%";
194
- let transitionPosition = "-100%";
195
- if (isRight) {
196
- startPositionForUpcomingSlide = "-100%";
197
- transitionPosition = "100%";
198
- }
199
- upcomingSlide.style.left = startPositionForUpcomingSlide;
200
- upcomingSlide.style.display = "block";
201
- setTimeout(() => {
202
- slides.forEach((slide) => {
203
- slide.style.transition = `transform ${ANIMATION_TIME}ms ease-in-out`;
204
- slide.style.transform = `translateX(${transitionPosition})`;
205
- });
206
- setCurrentSlide({ element: upcomingSlide, withTransition: true });
207
- }, 100);
208
- setTimeout(() => {
209
- slides.forEach((slide) => {
210
- slide.style.transition = "none";
211
- slide.style.transform = "translateX(0)";
212
- slide.style.left = "0";
213
- slide.removeAttribute("style");
214
- });
215
- upcomingSlide.setAttribute(ATTRIBUTE_ACTIVE_SLIDE, "");
216
- activeSlide.removeAttribute(ATTRIBUTE_ACTIVE_SLIDE);
217
- if (firstLink) firstLink.focus();
218
- }, ANIMATION_TIME + 100);
194
+ const startPositionForUpcomingSlide = isRight ? "-100%" : "100%";
195
+ const transitionPosition = isRight ? "100%" : "-100%";
196
+ isAnimating = true;
197
+ upcomingSlide.style.left = startPositionForUpcomingSlide;
198
+ upcomingSlide.style.display = "block";
199
+ let rafId = requestAnimationFrame(() => {
200
+ rafId = null;
201
+ slides.forEach((slide) => {
202
+ slide.style.transition = `transform ${ANIMATION_TIME}ms ease-in-out`;
203
+ slide.style.transform = `translateX(${transitionPosition})`;
204
+ });
205
+ setCurrentSlide({ element: upcomingSlide, withTransition: true });
206
+ });
207
+ let cleanedUp = false;
208
+ const cleanup = () => {
209
+ if (cleanedUp) return;
210
+ cleanedUp = true;
211
+ if (rafId !== null) cancelAnimationFrame(rafId);
212
+ activeSlide.removeEventListener("transitionend", onTransitionEnd);
213
+ upcomingSlide.setAttribute(ATTRIBUTE_ACTIVE_SLIDE, "");
214
+ activeSlide.removeAttribute(ATTRIBUTE_ACTIVE_SLIDE);
215
+ slides.forEach((slide) => {
216
+ slide.removeAttribute("style");
217
+ });
218
+ if (firstLink) firstLink.focus({ preventScroll: true });
219
+ isAnimating = false;
220
+ };
221
+ const onTransitionEnd = (event) => {
222
+ if (event.target !== activeSlide) return;
223
+ if (event.propertyName !== "transform") return;
224
+ cleanup();
219
225
  };
220
- if (!upcomingSlide || !activeSlide)
221
- throw new Error("Missing slide for slide event");
222
- animate();
226
+ activeSlide.addEventListener("transitionend", onTransitionEnd);
227
+ setTimeout(cleanup, ANIMATION_TIME + 100);
223
228
  if (upcomingSlide.offsetHeight > elementContainer.offsetHeight) {
224
229
  setTimeout(() => {
225
230
  upcomingSlide.style.overflowY = `scroll`;
@@ -249,6 +254,7 @@ const CreateNavSliderElement = (props) => (() => {
249
254
  const GetContainer = () => elementContainer;
250
255
  let upcomingSlideRef = null;
251
256
  let currentSlide = null;
257
+ let isAnimating = false;
252
258
  const children = CreateChildrenElements({
253
259
  ...props,
254
260
  GetContainer,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../source/composite/navigation/elements/slider/index.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { debounce } from '@universityofmaryland/web-utilities-library/performance';\nimport { findParent } from '@universityofmaryland/web-utilities-library/dom';\nimport {\n createCompositeNavigationSlides as Slides,\n TypeSlideProps,\n} from './slides';\nimport { createCompositeNavigationSliderFirst as SlideFirst } from './slide-first';\nimport { createCompositeNavigationSliderAction as SlideAction } from './action';\n\ntype TypeSubElements = TypeSlideProps;\n\nexport type TypeNavSliderRequirements = {\n primarySlideLinks?: HTMLElement | null;\n primarySlidesSecondaryLinks?: HTMLElement | null;\n primarySlideContent?: HTMLElement | null;\n childrenSlides?: HTMLElement | null;\n childrenSlideContent?: HTMLSlotElement[];\n displayType?: string;\n};\n\nexport type TypeNavSliderProps = TypeSubElements & TypeNavSliderRequirements;\n\nconst ANIMATION_TIME = 300;\nconst ATTRIBUTE_CHILD_REF = 'data-child-ref';\nconst ATTRIBUTE_PARENT_REF = 'data-parent-ref';\nconst ATTRIBUTE_ACTIVE_SLIDE = 'data-active';\nconst ATTRIBUTE_ACTIVE_SELECTED = 'data-selected';\nconst ATTRIBUTE_DATA_SLIDE = 'data-slide';\nconst ATTRIBUTE_DISPLAY_TYPE = 'display-type';\n\nconst DISPLAY_TYPE_DRAWER = 'drawer-nav';\nconst DISPLAY_TYPE_INTERIOR_NAV = 'interior-nav';\n\nconst ELEMENT_NAVIGATION_SLIDER_CONTAINER = 'navigation-slider-container';\nconst ELEMENT_NAVIGATION_SLIDER = 'navigation-slider';\nconst ELEMENT_SLIDER_DECORATIVE_LINE = 'navigation-slider-decorative-line';\n\nconst IS_DISPLAY_DRAWER = `[${ATTRIBUTE_DISPLAY_TYPE}=${DISPLAY_TYPE_DRAWER}]`;\nconst IS_DISPLAY_INTERIOR = `[${ATTRIBUTE_DISPLAY_TYPE}=${DISPLAY_TYPE_INTERIOR_NAV}]`;\n\nconst OVERWRITE_DISPLAY_DRAWER_CONTAINER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_DRAWER}`;\nconst OVERWRITE_DISPLAY_DRAWER_DECORATION = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_DRAWER} .${ELEMENT_SLIDER_DECORATIVE_LINE}`;\nconst OVERWRITE_DISPLAY_DRAWER_SLIDE_WRAPPER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_DRAWER} .${Slides.Elements.wrapper}`;\nconst OVERWRITE_DISPLAY_DRAWER_ACTION_CONTAINER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_DRAWER} .${SlideAction.Elements.container}`;\n\nconst OVERWRITE_DISPLAY_INTERIOR_ACTION_CONTAINER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_INTERIOR} .${SlideAction.Elements.container}`;\nconst OVERWRITE_DISPLAY_INTERIOR_SECONDARY_CONTAINER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_INTERIOR} .${SlideFirst.Elements.secondaryContainer} .${SlideAction.Elements.container}`;\nconst OVERWRITE_DISPLAY_INTERIOR_HEADLINE = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_INTERIOR} .${Slides.Elements.headline}`;\n\n// prettier-ignore\nconst OverwriteDisplayDrawer = `\n ${OVERWRITE_DISPLAY_DRAWER_CONTAINER} {\n background-color: ${token.color.white};\n padding: ${token.spacing['2xl']} 0;\n width: calc(100vw - ${token.spacing['8xl']});\n max-width: 400px;\n min-width: 227px;\n }\n\n ${OVERWRITE_DISPLAY_DRAWER_SLIDE_WRAPPER} {\n padding: 0 ${token.spacing.md};\n }\n\n ${OVERWRITE_DISPLAY_DRAWER_DECORATION} {\n display: block;\n }\n\n ${OVERWRITE_DISPLAY_DRAWER_ACTION_CONTAINER} {\n padding-left: ${token.spacing.sm};\n }\n`;\n\n// prettier-ignore\nconst OverwriteDisplayInterior = `\n ${OVERWRITE_DISPLAY_INTERIOR_ACTION_CONTAINER} {\n border-bottom: 1px solid ${token.color.gray.light};\n padding-bottom: ${token.spacing.md};\n margin-bottom: ${token.spacing.md};\n }\n\n ${OVERWRITE_DISPLAY_INTERIOR_SECONDARY_CONTAINER}:last-child {\n margin-bottom: 0;\n }\n\n ${OVERWRITE_DISPLAY_INTERIOR_HEADLINE} {\n border-bottom: 1px solid ${token.color.gray.light};\n padding-bottom: ${token.spacing.md};\n margin-bottom: ${token.spacing.md};\n }\n`;\n\n// prettier-ignore\nconst DecorativeLineStyles = `\n .${ELEMENT_SLIDER_DECORATIVE_LINE} {\n position: absolute;\n left: 0;\n bottom: 0;\n width: 100%;\n height: 8px;\n background-color: ${token.color.red};\n display: none;\n }\n`;\n\n// prettier-ignore\nconst SliderStyles = `\n .${ELEMENT_NAVIGATION_SLIDER} {\n position: relative;\n overflow: hidden;\n height: 100%;\n }\n\n .${ELEMENT_NAVIGATION_SLIDER} > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${token.color.white};\n display: none;\n }\n\n .${ELEMENT_NAVIGATION_SLIDER} > *[${ATTRIBUTE_ACTIVE_SLIDE}] {\n display: block;\n }\n`;\n\nconst SelectedLinkStyles = `\n .${ELEMENT_NAVIGATION_SLIDER_CONTAINER} a[${ATTRIBUTE_ACTIVE_SELECTED}] {\n position: relative;\n }\n\n .${ELEMENT_NAVIGATION_SLIDER_CONTAINER} a[${ATTRIBUTE_ACTIVE_SELECTED}] span {\n display: inline;\n position: relative;\n background-position: left calc(100% - 0px);\n background-repeat: no-repeat;\n background-size: 100% 2.5px;\n background-image: linear-gradient(#ffd200, #ffd200);\n }\n`;\n\n// prettier-ignore\nconst STYLES_NAV_SLIDER_ELEMENT = `\n .${ELEMENT_NAVIGATION_SLIDER_CONTAINER} {\n position: relative;\n height: 100%;\n cursor: default;\n }\n\n ${Slides.Styles}\n ${DecorativeLineStyles}\n ${SliderStyles}\n ${SelectedLinkStyles}\n ${OverwriteDisplayDrawer}\n ${OverwriteDisplayInterior}\n`;\n\nconst CreateChildrenElements = (props: TypeNavSliderProps) => {\n const { displayType } = props;\n const sliderContainer = document.createElement('div');\n const slider = document.createElement('div');\n const decorativeLine = document.createElement('div');\n const isDisplayDrawerNav = displayType === DISPLAY_TYPE_DRAWER;\n let displayTypeSetting = DISPLAY_TYPE_INTERIOR_NAV;\n\n if (isDisplayDrawerNav) displayTypeSetting = DISPLAY_TYPE_DRAWER;\n\n Slides.CreateElement({ ...props, slider });\n\n slider.classList.add(ELEMENT_NAVIGATION_SLIDER);\n\n decorativeLine.classList.add(ELEMENT_SLIDER_DECORATIVE_LINE);\n sliderContainer.appendChild(decorativeLine);\n\n sliderContainer.setAttribute(ATTRIBUTE_DISPLAY_TYPE, displayTypeSetting);\n sliderContainer.classList.add(ELEMENT_NAVIGATION_SLIDER_CONTAINER);\n sliderContainer.appendChild(slider);\n\n sliderContainer.addEventListener('click', (event) => {\n event.stopPropagation();\n });\n\n return sliderContainer;\n};\n\nconst CreateNavSliderElement = (props: TypeNavSliderRequirements) =>\n (() => {\n const elementContainer = document.createElement('div');\n const getUpcomingSlide = () => {\n const upcomingSlide = elementContainer.querySelector(\n `[${ATTRIBUTE_PARENT_REF}=${upcomingSlideRef}]`,\n ) as HTMLDivElement;\n\n return upcomingSlide;\n };\n const getUpcomingSlideParent = () => {\n const upcomingSlide = elementContainer.querySelector(\n `[${ATTRIBUTE_CHILD_REF}=${upcomingSlideRef}]`,\n ) as HTMLDivElement;\n const parent = findParent({\n element: upcomingSlide,\n attr: ATTRIBUTE_DATA_SLIDE,\n });\n\n return parent;\n };\n const sizeContainer = ({\n withTransition = false,\n }: {\n withTransition?: boolean;\n }) => {\n let containerSize = 500;\n if (currentSlide) {\n const children = Array.from(currentSlide.children) as HTMLDivElement[];\n containerSize = children.reduce((acc, currentElement) => {\n return acc + currentElement.offsetHeight;\n }, 50);\n }\n\n elementContainer.style.height = `${containerSize}px`;\n if (withTransition)\n elementContainer.style.transition = `height ${ANIMATION_TIME}ms ease-in-out`;\n\n setTimeout(() => {\n elementContainer.style.transition = 'none';\n }, ANIMATION_TIME);\n };\n const eventSlide = ({ isRight = false }: { isRight?: boolean }) => {\n const activeSlide = elementContainer.querySelector(\n `[${ATTRIBUTE_ACTIVE_SLIDE}]`,\n ) as HTMLDivElement;\n const upcomingSlide = isRight\n ? getUpcomingSlideParent()\n : getUpcomingSlide();\n const slides = [activeSlide, upcomingSlide];\n\n if (!upcomingSlide) {\n console.error('Missing slide for slide event');\n return null;\n }\n const firstLink = upcomingSlide.querySelector('a') as HTMLAnchorElement;\n\n const animate = () => {\n let startPositionForUpcomingSlide = '100%';\n let transitionPosition = '-100%';\n\n if (isRight) {\n startPositionForUpcomingSlide = '-100%';\n transitionPosition = '100%';\n }\n\n upcomingSlide.style.left = startPositionForUpcomingSlide;\n upcomingSlide.style.display = 'block';\n\n setTimeout(() => {\n slides.forEach((slide) => {\n slide.style.transition = `transform ${ANIMATION_TIME}ms ease-in-out`;\n slide.style.transform = `translateX(${transitionPosition})`;\n });\n setCurrentSlide({ element: upcomingSlide, withTransition: true });\n }, 100);\n\n setTimeout(() => {\n slides.forEach((slide) => {\n slide.style.transition = 'none';\n slide.style.transform = 'translateX(0)';\n slide.style.left = '0';\n slide.removeAttribute('style');\n });\n\n upcomingSlide.setAttribute(ATTRIBUTE_ACTIVE_SLIDE, '');\n activeSlide.removeAttribute(ATTRIBUTE_ACTIVE_SLIDE);\n if (firstLink) firstLink.focus();\n }, ANIMATION_TIME + 100);\n };\n\n if (!upcomingSlide || !activeSlide)\n throw new Error('Missing slide for slide event');\n\n animate();\n\n if (upcomingSlide.offsetHeight > elementContainer.offsetHeight) {\n setTimeout(() => {\n upcomingSlide.style.overflowY = `scroll`;\n upcomingSlide.style.height = `100%`;\n }, ANIMATION_TIME + 100);\n }\n };\n const setUpcomingSlide = (arg: string) => {\n upcomingSlideRef = arg;\n };\n const setCurrentSlide = ({\n element,\n withTransition = false,\n }: {\n element: HTMLElement;\n withTransition?: boolean;\n }) => {\n currentSlide = element;\n\n setTimeout(() => {\n sizeContainer({ withTransition });\n }, 100);\n };\n const eventSlideLeft = () => eventSlide({ isRight: false });\n const eventSlideRight = () => eventSlide({ isRight: true });\n const eventReize = () => {\n setTimeout(() => {\n sizeContainer({ withTransition: false });\n }, 200);\n };\n const GetContainer = () => elementContainer;\n let upcomingSlideRef: string | null = null;\n let currentSlide: HTMLElement | null = null;\n\n const children = CreateChildrenElements({\n ...props,\n GetContainer,\n eventSlideLeft,\n eventSlideRight,\n setUpcomingSlide,\n setCurrentSlide,\n ATTRIBUTE_CHILD_REF,\n ATTRIBUTE_PARENT_REF,\n ATTRIBUTE_DATA_SLIDE,\n ATTRIBUTE_ACTIVE_SLIDE,\n currentSlide,\n });\n\n elementContainer.appendChild(children);\n\n window.addEventListener(\n 'resize',\n debounce(() => {\n eventReize();\n }, 20),\n );\n\n return {\n container: elementContainer,\n events: {\n resize: eventReize,\n },\n };\n })();\n\nexport const createCompositeNavigationSlider = {\n CreateElement: CreateNavSliderElement,\n Styles: STYLES_NAV_SLIDER_ELEMENT,\n Elements: {\n slider: ELEMENT_NAVIGATION_SLIDER,\n },\n};\n"],"names":["Slides","SlideAction","SlideFirst","children"],"mappings":";;;;;;AAuBA,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;AAC7B,MAAM,yBAAyB;AAC/B,MAAM,4BAA4B;AAClC,MAAM,uBAAuB;AAC7B,MAAM,yBAAyB;AAE/B,MAAM,sBAAsB;AAC5B,MAAM,4BAA4B;AAElC,MAAM,sCAAsC;AAC5C,MAAM,4BAA4B;AAClC,MAAM,iCAAiC;AAEvC,MAAM,oBAAoB,IAAI,sBAAsB,IAAI,mBAAmB;AAC3E,MAAM,sBAAsB,IAAI,sBAAsB,IAAI,yBAAyB;AAEnF,MAAM,qCAAqC,IAAI,mCAAmC,GAAG,iBAAiB;AACtG,MAAM,sCAAsC,IAAI,mCAAmC,GAAG,iBAAiB,KAAK,8BAA8B;AAC1I,MAAM,yCAAyC,IAAI,mCAAmC,GAAG,iBAAiB,KAAKA,gCAAO,SAAS,OAAO;AACtI,MAAM,4CAA4C,IAAI,mCAAmC,GAAG,iBAAiB,KAAKC,sCAAY,SAAS,SAAS;AAEhJ,MAAM,8CAA8C,IAAI,mCAAmC,GAAG,mBAAmB,KAAKA,sCAAY,SAAS,SAAS;AACpJ,MAAM,iDAAiD,IAAI,mCAAmC,GAAG,mBAAmB,KAAKC,qCAAW,SAAS,kBAAkB,KAAKD,sCAAY,SAAS,SAAS;AAClM,MAAM,sCAAsC,IAAI,mCAAmC,GAAG,mBAAmB,KAAKD,gCAAO,SAAS,QAAQ;AAGtI,MAAM,yBAAyB;AAAA,IAC3B,kCAAkC;AAAA,wBACd,MAAM,MAAM,KAAK;AAAA,eAC1B,MAAM,QAAQ,KAAK,CAAC;AAAA,0BACT,MAAM,QAAQ,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK1C,sCAAsC;AAAA,iBACzB,MAAM,QAAQ,EAAE;AAAA;AAAA;AAAA,IAG7B,mCAAmC;AAAA;AAAA;AAAA;AAAA,IAInC,yCAAyC;AAAA,oBACzB,MAAM,QAAQ,EAAE;AAAA;AAAA;AAKpC,MAAM,2BAA2B;AAAA,IAC7B,2CAA2C;AAAA,+BAChB,MAAM,MAAM,KAAK,KAAK;AAAA,sBAC/B,MAAM,QAAQ,EAAE;AAAA,qBACjB,MAAM,QAAQ,EAAE;AAAA;AAAA;AAAA,IAGjC,8CAA8C;AAAA;AAAA;AAAA;AAAA,IAI9C,mCAAmC;AAAA,+BACR,MAAM,MAAM,KAAK,KAAK;AAAA,sBAC/B,MAAM,QAAQ,EAAE;AAAA,qBACjB,MAAM,QAAQ,EAAE;AAAA;AAAA;AAKrC,MAAM,uBAAuB;AAAA,KACxB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMX,MAAM,MAAM,GAAG;AAAA;AAAA;AAAA;AAMvC,MAAM,eAAe;AAAA,KAChB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMzB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMN,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA,KAIpC,yBAAyB,QAAQ,sBAAsB;AAAA;AAAA;AAAA;AAK5D,MAAM,qBAAqB;AAAA,KACtB,mCAAmC,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA,KAIlE,mCAAmC,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWvE,MAAM,4BAA4B;AAAA,KAC7B,mCAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMpCA,gCAAO,MAAM;AAAA,IACb,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA;AAG5B,MAAM,yBAAyB,CAAC,UAA8B;AAC5D,QAAM,EAAE,gBAAgB;AACxB,QAAM,kBAAkB,SAAS,cAAc,KAAK;AACpD,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,QAAM,iBAAiB,SAAS,cAAc,KAAK;AACnD,QAAM,qBAAqB,gBAAgB;AAC3C,MAAI,qBAAqB;AAEzB,MAAI,mBAAoB,sBAAqB;AAE7CA,kCAAO,cAAc,EAAE,GAAG,OAAO,QAAQ;AAEzC,SAAO,UAAU,IAAI,yBAAyB;AAE9C,iBAAe,UAAU,IAAI,8BAA8B;AAC3D,kBAAgB,YAAY,cAAc;AAE1C,kBAAgB,aAAa,wBAAwB,kBAAkB;AACvE,kBAAgB,UAAU,IAAI,mCAAmC;AACjE,kBAAgB,YAAY,MAAM;AAElC,kBAAgB,iBAAiB,SAAS,CAAC,UAAU;AACnD,UAAM,gBAAA;AAAA,EACR,CAAC;AAED,SAAO;AACT;AAEA,MAAM,yBAAyB,CAAC,WAC7B,MAAM;AACL,QAAM,mBAAmB,SAAS,cAAc,KAAK;AACrD,QAAM,mBAAmB,MAAM;AAC7B,UAAM,gBAAgB,iBAAiB;AAAA,MACrC,IAAI,oBAAoB,IAAI,gBAAgB;AAAA,IAAA;AAG9C,WAAO;AAAA,EACT;AACA,QAAM,yBAAyB,MAAM;AACnC,UAAM,gBAAgB,iBAAiB;AAAA,MACrC,IAAI,mBAAmB,IAAI,gBAAgB;AAAA,IAAA;AAE7C,UAAM,SAAS,WAAW;AAAA,MACxB,SAAS;AAAA,MACT,MAAM;AAAA,IAAA,CACP;AAED,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,CAAC;AAAA,IACrB,iBAAiB;AAAA,EAAA,MAGb;AACJ,QAAI,gBAAgB;AACpB,QAAI,cAAc;AAChB,YAAMG,YAAW,MAAM,KAAK,aAAa,QAAQ;AACjD,sBAAgBA,UAAS,OAAO,CAAC,KAAK,mBAAmB;AACvD,eAAO,MAAM,eAAe;AAAA,MAC9B,GAAG,EAAE;AAAA,IACP;AAEA,qBAAiB,MAAM,SAAS,GAAG,aAAa;AAChD,QAAI;AACF,uBAAiB,MAAM,aAAa,UAAU,cAAc;AAE9D,eAAW,MAAM;AACf,uBAAiB,MAAM,aAAa;AAAA,IACtC,GAAG,cAAc;AAAA,EACnB;AACA,QAAM,aAAa,CAAC,EAAE,UAAU,YAAmC;AACjE,UAAM,cAAc,iBAAiB;AAAA,MACnC,IAAI,sBAAsB;AAAA,IAAA;AAE5B,UAAM,gBAAgB,UAClB,uBAAA,IACA,iBAAA;AACJ,UAAM,SAAS,CAAC,aAAa,aAAa;AAE1C,QAAI,CAAC,eAAe;AAClB,cAAQ,MAAM,+BAA+B;AAC7C,aAAO;AAAA,IACT;AACA,UAAM,YAAY,cAAc,cAAc,GAAG;AAEjD,UAAM,UAAU,MAAM;AACpB,UAAI,gCAAgC;AACpC,UAAI,qBAAqB;AAEzB,UAAI,SAAS;AACX,wCAAgC;AAChC,6BAAqB;AAAA,MACvB;AAEA,oBAAc,MAAM,OAAO;AAC3B,oBAAc,MAAM,UAAU;AAE9B,iBAAW,MAAM;AACf,eAAO,QAAQ,CAAC,UAAU;AACxB,gBAAM,MAAM,aAAa,aAAa,cAAc;AACpD,gBAAM,MAAM,YAAY,cAAc,kBAAkB;AAAA,QAC1D,CAAC;AACD,wBAAgB,EAAE,SAAS,eAAe,gBAAgB,MAAM;AAAA,MAClE,GAAG,GAAG;AAEN,iBAAW,MAAM;AACf,eAAO,QAAQ,CAAC,UAAU;AACxB,gBAAM,MAAM,aAAa;AACzB,gBAAM,MAAM,YAAY;AACxB,gBAAM,MAAM,OAAO;AACnB,gBAAM,gBAAgB,OAAO;AAAA,QAC/B,CAAC;AAED,sBAAc,aAAa,wBAAwB,EAAE;AACrD,oBAAY,gBAAgB,sBAAsB;AAClD,YAAI,qBAAqB,MAAA;AAAA,MAC3B,GAAG,iBAAiB,GAAG;AAAA,IACzB;AAEA,QAAI,CAAC,iBAAiB,CAAC;AACrB,YAAM,IAAI,MAAM,+BAA+B;AAEjD,YAAA;AAEA,QAAI,cAAc,eAAe,iBAAiB,cAAc;AAC9D,iBAAW,MAAM;AACf,sBAAc,MAAM,YAAY;AAChC,sBAAc,MAAM,SAAS;AAAA,MAC/B,GAAG,iBAAiB,GAAG;AAAA,IACzB;AAAA,EACF;AACA,QAAM,mBAAmB,CAAC,QAAgB;AACxC,uBAAmB;AAAA,EACrB;AACA,QAAM,kBAAkB,CAAC;AAAA,IACvB;AAAA,IACA,iBAAiB;AAAA,EAAA,MAIb;AACJ,mBAAe;AAEf,eAAW,MAAM;AACf,oBAAc,EAAE,gBAAgB;AAAA,IAClC,GAAG,GAAG;AAAA,EACR;AACA,QAAM,iBAAiB,MAAM,WAAW,EAAE,SAAS,OAAO;AAC1D,QAAM,kBAAkB,MAAM,WAAW,EAAE,SAAS,MAAM;AAC1D,QAAM,aAAa,MAAM;AACvB,eAAW,MAAM;AACf,oBAAc,EAAE,gBAAgB,OAAO;AAAA,IACzC,GAAG,GAAG;AAAA,EACR;AACA,QAAM,eAAe,MAAM;AAC3B,MAAI,mBAAkC;AACtC,MAAI,eAAmC;AAEvC,QAAM,WAAW,uBAAuB;AAAA,IACtC,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,mBAAiB,YAAY,QAAQ;AAErC,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM;AACb,iBAAA;AAAA,IACF,GAAG,EAAE;AAAA,EAAA;AAGP,SAAO;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,MACN,QAAQ;AAAA,IAAA;AAAA,EACV;AAEJ,GAAA;AAEK,MAAM,kCAAkC;AAAA,EAC7C,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,UAAU;AAAA,IACR,QAAQ;AAAA,EAAA;AAEZ;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../source/composite/navigation/elements/slider/index.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { debounce } from '@universityofmaryland/web-utilities-library/performance';\nimport { findParent } from '@universityofmaryland/web-utilities-library/dom';\nimport {\n createCompositeNavigationSlides as Slides,\n TypeSlideProps,\n} from './slides';\nimport { createCompositeNavigationSliderFirst as SlideFirst } from './slide-first';\nimport { createCompositeNavigationSliderAction as SlideAction } from './action';\n\ntype TypeSubElements = TypeSlideProps;\n\nexport type TypeNavSliderRequirements = {\n primarySlideLinks?: HTMLElement | null;\n primarySlidesSecondaryLinks?: HTMLElement | null;\n primarySlideContent?: HTMLElement | null;\n childrenSlides?: HTMLElement | null;\n childrenSlideContent?: HTMLSlotElement[];\n displayType?: string;\n};\n\nexport type TypeNavSliderProps = TypeSubElements & TypeNavSliderRequirements;\n\nconst ANIMATION_TIME = 300;\nconst ATTRIBUTE_CHILD_REF = 'data-child-ref';\nconst ATTRIBUTE_PARENT_REF = 'data-parent-ref';\nconst ATTRIBUTE_ACTIVE_SLIDE = 'data-active';\nconst ATTRIBUTE_ACTIVE_SELECTED = 'data-selected';\nconst ATTRIBUTE_DATA_SLIDE = 'data-slide';\nconst ATTRIBUTE_DISPLAY_TYPE = 'display-type';\n\nconst DISPLAY_TYPE_DRAWER = 'drawer-nav';\nconst DISPLAY_TYPE_INTERIOR_NAV = 'interior-nav';\n\nconst ELEMENT_NAVIGATION_SLIDER_CONTAINER = 'navigation-slider-container';\nconst ELEMENT_NAVIGATION_SLIDER = 'navigation-slider';\nconst ELEMENT_SLIDER_DECORATIVE_LINE = 'navigation-slider-decorative-line';\n\nconst IS_DISPLAY_DRAWER = `[${ATTRIBUTE_DISPLAY_TYPE}=${DISPLAY_TYPE_DRAWER}]`;\nconst IS_DISPLAY_INTERIOR = `[${ATTRIBUTE_DISPLAY_TYPE}=${DISPLAY_TYPE_INTERIOR_NAV}]`;\n\nconst OVERWRITE_DISPLAY_DRAWER_CONTAINER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_DRAWER}`;\nconst OVERWRITE_DISPLAY_DRAWER_DECORATION = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_DRAWER} .${ELEMENT_SLIDER_DECORATIVE_LINE}`;\nconst OVERWRITE_DISPLAY_DRAWER_SLIDE_WRAPPER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_DRAWER} .${Slides.Elements.wrapper}`;\nconst OVERWRITE_DISPLAY_DRAWER_ACTION_CONTAINER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_DRAWER} .${SlideAction.Elements.container}`;\n\nconst OVERWRITE_DISPLAY_INTERIOR_ACTION_CONTAINER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_INTERIOR} .${SlideAction.Elements.container}`;\nconst OVERWRITE_DISPLAY_INTERIOR_SECONDARY_CONTAINER = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_INTERIOR} .${SlideFirst.Elements.secondaryContainer} .${SlideAction.Elements.container}`;\nconst OVERWRITE_DISPLAY_INTERIOR_HEADLINE = `.${ELEMENT_NAVIGATION_SLIDER_CONTAINER}${IS_DISPLAY_INTERIOR} .${Slides.Elements.headline}`;\n\n// prettier-ignore\nconst OverwriteDisplayDrawer = `\n ${OVERWRITE_DISPLAY_DRAWER_CONTAINER} {\n background-color: ${token.color.white};\n padding: ${token.spacing['2xl']} 0;\n width: calc(100vw - ${token.spacing['8xl']});\n max-width: 400px;\n min-width: 227px;\n }\n\n ${OVERWRITE_DISPLAY_DRAWER_SLIDE_WRAPPER} {\n padding: 0 ${token.spacing.md};\n }\n\n ${OVERWRITE_DISPLAY_DRAWER_DECORATION} {\n display: block;\n }\n\n ${OVERWRITE_DISPLAY_DRAWER_ACTION_CONTAINER} {\n padding-left: ${token.spacing.sm};\n }\n`;\n\n// prettier-ignore\nconst OverwriteDisplayInterior = `\n ${OVERWRITE_DISPLAY_INTERIOR_ACTION_CONTAINER} {\n border-bottom: 1px solid ${token.color.gray.light};\n padding-bottom: ${token.spacing.md};\n margin-bottom: ${token.spacing.md};\n }\n\n ${OVERWRITE_DISPLAY_INTERIOR_SECONDARY_CONTAINER}:last-child {\n margin-bottom: 0;\n }\n\n ${OVERWRITE_DISPLAY_INTERIOR_HEADLINE} {\n border-bottom: 1px solid ${token.color.gray.light};\n padding-bottom: ${token.spacing.md};\n margin-bottom: ${token.spacing.md};\n }\n`;\n\n// prettier-ignore\nconst DecorativeLineStyles = `\n .${ELEMENT_SLIDER_DECORATIVE_LINE} {\n position: absolute;\n left: 0;\n bottom: 0;\n width: 100%;\n height: 8px;\n background-color: ${token.color.red};\n display: none;\n }\n`;\n\n// prettier-ignore\nconst SliderStyles = `\n .${ELEMENT_NAVIGATION_SLIDER} {\n position: relative;\n overflow: hidden;\n height: 100%;\n }\n\n .${ELEMENT_NAVIGATION_SLIDER} > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${token.color.white};\n display: none;\n }\n\n .${ELEMENT_NAVIGATION_SLIDER} > *[${ATTRIBUTE_ACTIVE_SLIDE}] {\n display: block;\n }\n`;\n\nconst SelectedLinkStyles = `\n .${ELEMENT_NAVIGATION_SLIDER_CONTAINER} a[${ATTRIBUTE_ACTIVE_SELECTED}] {\n position: relative;\n }\n\n .${ELEMENT_NAVIGATION_SLIDER_CONTAINER} a[${ATTRIBUTE_ACTIVE_SELECTED}] span {\n display: inline;\n position: relative;\n background-position: left calc(100% - 0px);\n background-repeat: no-repeat;\n background-size: 100% 2.5px;\n background-image: linear-gradient(#ffd200, #ffd200);\n }\n`;\n\n// prettier-ignore\nconst STYLES_NAV_SLIDER_ELEMENT = `\n .${ELEMENT_NAVIGATION_SLIDER_CONTAINER} {\n position: relative;\n height: 100%;\n cursor: default;\n }\n\n ${Slides.Styles}\n ${DecorativeLineStyles}\n ${SliderStyles}\n ${SelectedLinkStyles}\n ${OverwriteDisplayDrawer}\n ${OverwriteDisplayInterior}\n`;\n\nconst CreateChildrenElements = (props: TypeNavSliderProps) => {\n const { displayType } = props;\n const sliderContainer = document.createElement('div');\n const slider = document.createElement('div');\n const decorativeLine = document.createElement('div');\n const isDisplayDrawerNav = displayType === DISPLAY_TYPE_DRAWER;\n let displayTypeSetting = DISPLAY_TYPE_INTERIOR_NAV;\n\n if (isDisplayDrawerNav) displayTypeSetting = DISPLAY_TYPE_DRAWER;\n\n Slides.CreateElement({ ...props, slider });\n\n slider.classList.add(ELEMENT_NAVIGATION_SLIDER);\n\n decorativeLine.classList.add(ELEMENT_SLIDER_DECORATIVE_LINE);\n sliderContainer.appendChild(decorativeLine);\n\n sliderContainer.setAttribute(ATTRIBUTE_DISPLAY_TYPE, displayTypeSetting);\n sliderContainer.classList.add(ELEMENT_NAVIGATION_SLIDER_CONTAINER);\n sliderContainer.appendChild(slider);\n\n sliderContainer.addEventListener('click', (event) => {\n event.stopPropagation();\n });\n\n return sliderContainer;\n};\n\nconst CreateNavSliderElement = (props: TypeNavSliderRequirements) =>\n (() => {\n const elementContainer = document.createElement('div');\n const getUpcomingSlide = () => {\n const upcomingSlide = elementContainer.querySelector(\n `[${ATTRIBUTE_PARENT_REF}=${upcomingSlideRef}]`,\n ) as HTMLDivElement;\n\n return upcomingSlide;\n };\n const getUpcomingSlideParent = () => {\n const upcomingSlide = elementContainer.querySelector(\n `[${ATTRIBUTE_CHILD_REF}=${upcomingSlideRef}]`,\n ) as HTMLDivElement;\n const parent = findParent({\n element: upcomingSlide,\n attr: ATTRIBUTE_DATA_SLIDE,\n });\n\n return parent;\n };\n const sizeContainer = ({\n withTransition = false,\n }: {\n withTransition?: boolean;\n }) => {\n let containerSize = 500;\n if (currentSlide) {\n const children = Array.from(currentSlide.children) as HTMLDivElement[];\n containerSize = children.reduce((acc, currentElement) => {\n return acc + currentElement.offsetHeight;\n }, 50);\n }\n\n elementContainer.style.height = `${containerSize}px`;\n if (withTransition)\n elementContainer.style.transition = `height ${ANIMATION_TIME}ms ease-in-out`;\n\n setTimeout(() => {\n elementContainer.style.transition = 'none';\n }, ANIMATION_TIME);\n };\n const eventSlide = ({ isRight = false }: { isRight?: boolean }) => {\n if (isAnimating) return;\n\n const activeSlide = elementContainer.querySelector(\n `[${ATTRIBUTE_ACTIVE_SLIDE}]`,\n ) as HTMLDivElement;\n const upcomingSlide = isRight\n ? getUpcomingSlideParent()\n : getUpcomingSlide();\n\n if (!upcomingSlide) {\n console.error('Missing slide for slide event');\n return null;\n }\n if (!activeSlide) throw new Error('Missing slide for slide event');\n\n const slides = [activeSlide, upcomingSlide];\n const firstLink = upcomingSlide.querySelector('a') as HTMLAnchorElement;\n const startPositionForUpcomingSlide = isRight ? '-100%' : '100%';\n const transitionPosition = isRight ? '100%' : '-100%';\n\n isAnimating = true;\n\n upcomingSlide.style.left = startPositionForUpcomingSlide;\n upcomingSlide.style.display = 'block';\n\n // Defer to next frame so display:block is committed before the transition starts.\n let rafId: number | null = requestAnimationFrame(() => {\n rafId = null;\n slides.forEach((slide) => {\n slide.style.transition = `transform ${ANIMATION_TIME}ms ease-in-out`;\n slide.style.transform = `translateX(${transitionPosition})`;\n });\n setCurrentSlide({ element: upcomingSlide, withTransition: true });\n });\n\n let cleanedUp = false;\n const cleanup = () => {\n if (cleanedUp) return;\n cleanedUp = true;\n if (rafId !== null) cancelAnimationFrame(rafId);\n activeSlide.removeEventListener('transitionend', onTransitionEnd);\n\n // Toggle data-active before wiping styles so CSS display:none wins.\n upcomingSlide.setAttribute(ATTRIBUTE_ACTIVE_SLIDE, '');\n activeSlide.removeAttribute(ATTRIBUTE_ACTIVE_SLIDE);\n\n slides.forEach((slide) => {\n slide.removeAttribute('style');\n });\n\n if (firstLink) firstLink.focus({ preventScroll: true });\n isAnimating = false;\n };\n const onTransitionEnd = (event: TransitionEvent) => {\n // Ignore bubbled transitions from descendants (e.g. chevron icons).\n if (event.target !== activeSlide) return;\n if (event.propertyName !== 'transform') return;\n cleanup();\n };\n activeSlide.addEventListener('transitionend', onTransitionEnd);\n setTimeout(cleanup, ANIMATION_TIME + 100);\n\n if (upcomingSlide.offsetHeight > elementContainer.offsetHeight) {\n setTimeout(() => {\n upcomingSlide.style.overflowY = `scroll`;\n upcomingSlide.style.height = `100%`;\n }, ANIMATION_TIME + 100);\n }\n };\n const setUpcomingSlide = (arg: string) => {\n upcomingSlideRef = arg;\n };\n const setCurrentSlide = ({\n element,\n withTransition = false,\n }: {\n element: HTMLElement;\n withTransition?: boolean;\n }) => {\n currentSlide = element;\n\n setTimeout(() => {\n sizeContainer({ withTransition });\n }, 100);\n };\n const eventSlideLeft = () => eventSlide({ isRight: false });\n const eventSlideRight = () => eventSlide({ isRight: true });\n const eventReize = () => {\n setTimeout(() => {\n sizeContainer({ withTransition: false });\n }, 200);\n };\n const GetContainer = () => elementContainer;\n let upcomingSlideRef: string | null = null;\n let currentSlide: HTMLElement | null = null;\n let isAnimating = false;\n\n const children = CreateChildrenElements({\n ...props,\n GetContainer,\n eventSlideLeft,\n eventSlideRight,\n setUpcomingSlide,\n setCurrentSlide,\n ATTRIBUTE_CHILD_REF,\n ATTRIBUTE_PARENT_REF,\n ATTRIBUTE_DATA_SLIDE,\n ATTRIBUTE_ACTIVE_SLIDE,\n currentSlide,\n });\n\n elementContainer.appendChild(children);\n\n window.addEventListener(\n 'resize',\n debounce(() => {\n eventReize();\n }, 20),\n );\n\n return {\n container: elementContainer,\n events: {\n resize: eventReize,\n },\n };\n })();\n\nexport const createCompositeNavigationSlider = {\n CreateElement: CreateNavSliderElement,\n Styles: STYLES_NAV_SLIDER_ELEMENT,\n Elements: {\n slider: ELEMENT_NAVIGATION_SLIDER,\n },\n};\n"],"names":["Slides","SlideAction","SlideFirst","children"],"mappings":";;;;;;AAuBA,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;AAC7B,MAAM,yBAAyB;AAC/B,MAAM,4BAA4B;AAClC,MAAM,uBAAuB;AAC7B,MAAM,yBAAyB;AAE/B,MAAM,sBAAsB;AAC5B,MAAM,4BAA4B;AAElC,MAAM,sCAAsC;AAC5C,MAAM,4BAA4B;AAClC,MAAM,iCAAiC;AAEvC,MAAM,oBAAoB,IAAI,sBAAsB,IAAI,mBAAmB;AAC3E,MAAM,sBAAsB,IAAI,sBAAsB,IAAI,yBAAyB;AAEnF,MAAM,qCAAqC,IAAI,mCAAmC,GAAG,iBAAiB;AACtG,MAAM,sCAAsC,IAAI,mCAAmC,GAAG,iBAAiB,KAAK,8BAA8B;AAC1I,MAAM,yCAAyC,IAAI,mCAAmC,GAAG,iBAAiB,KAAKA,gCAAO,SAAS,OAAO;AACtI,MAAM,4CAA4C,IAAI,mCAAmC,GAAG,iBAAiB,KAAKC,sCAAY,SAAS,SAAS;AAEhJ,MAAM,8CAA8C,IAAI,mCAAmC,GAAG,mBAAmB,KAAKA,sCAAY,SAAS,SAAS;AACpJ,MAAM,iDAAiD,IAAI,mCAAmC,GAAG,mBAAmB,KAAKC,qCAAW,SAAS,kBAAkB,KAAKD,sCAAY,SAAS,SAAS;AAClM,MAAM,sCAAsC,IAAI,mCAAmC,GAAG,mBAAmB,KAAKD,gCAAO,SAAS,QAAQ;AAGtI,MAAM,yBAAyB;AAAA,IAC3B,kCAAkC;AAAA,wBACd,MAAM,MAAM,KAAK;AAAA,eAC1B,MAAM,QAAQ,KAAK,CAAC;AAAA,0BACT,MAAM,QAAQ,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK1C,sCAAsC;AAAA,iBACzB,MAAM,QAAQ,EAAE;AAAA;AAAA;AAAA,IAG7B,mCAAmC;AAAA;AAAA;AAAA;AAAA,IAInC,yCAAyC;AAAA,oBACzB,MAAM,QAAQ,EAAE;AAAA;AAAA;AAKpC,MAAM,2BAA2B;AAAA,IAC7B,2CAA2C;AAAA,+BAChB,MAAM,MAAM,KAAK,KAAK;AAAA,sBAC/B,MAAM,QAAQ,EAAE;AAAA,qBACjB,MAAM,QAAQ,EAAE;AAAA;AAAA;AAAA,IAGjC,8CAA8C;AAAA;AAAA;AAAA;AAAA,IAI9C,mCAAmC;AAAA,+BACR,MAAM,MAAM,KAAK,KAAK;AAAA,sBAC/B,MAAM,QAAQ,EAAE;AAAA,qBACjB,MAAM,QAAQ,EAAE;AAAA;AAAA;AAKrC,MAAM,uBAAuB;AAAA,KACxB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMX,MAAM,MAAM,GAAG;AAAA;AAAA;AAAA;AAMvC,MAAM,eAAe;AAAA,KAChB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMzB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMN,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA,KAIpC,yBAAyB,QAAQ,sBAAsB;AAAA;AAAA;AAAA;AAK5D,MAAM,qBAAqB;AAAA,KACtB,mCAAmC,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA,KAIlE,mCAAmC,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWvE,MAAM,4BAA4B;AAAA,KAC7B,mCAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMpCA,gCAAO,MAAM;AAAA,IACb,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA;AAG5B,MAAM,yBAAyB,CAAC,UAA8B;AAC5D,QAAM,EAAE,gBAAgB;AACxB,QAAM,kBAAkB,SAAS,cAAc,KAAK;AACpD,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,QAAM,iBAAiB,SAAS,cAAc,KAAK;AACnD,QAAM,qBAAqB,gBAAgB;AAC3C,MAAI,qBAAqB;AAEzB,MAAI,mBAAoB,sBAAqB;AAE7CA,kCAAO,cAAc,EAAE,GAAG,OAAO,QAAQ;AAEzC,SAAO,UAAU,IAAI,yBAAyB;AAE9C,iBAAe,UAAU,IAAI,8BAA8B;AAC3D,kBAAgB,YAAY,cAAc;AAE1C,kBAAgB,aAAa,wBAAwB,kBAAkB;AACvE,kBAAgB,UAAU,IAAI,mCAAmC;AACjE,kBAAgB,YAAY,MAAM;AAElC,kBAAgB,iBAAiB,SAAS,CAAC,UAAU;AACnD,UAAM,gBAAA;AAAA,EACR,CAAC;AAED,SAAO;AACT;AAEA,MAAM,yBAAyB,CAAC,WAC7B,MAAM;AACL,QAAM,mBAAmB,SAAS,cAAc,KAAK;AACrD,QAAM,mBAAmB,MAAM;AAC7B,UAAM,gBAAgB,iBAAiB;AAAA,MACrC,IAAI,oBAAoB,IAAI,gBAAgB;AAAA,IAAA;AAG9C,WAAO;AAAA,EACT;AACA,QAAM,yBAAyB,MAAM;AACnC,UAAM,gBAAgB,iBAAiB;AAAA,MACrC,IAAI,mBAAmB,IAAI,gBAAgB;AAAA,IAAA;AAE7C,UAAM,SAAS,WAAW;AAAA,MACxB,SAAS;AAAA,MACT,MAAM;AAAA,IAAA,CACP;AAED,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,CAAC;AAAA,IACrB,iBAAiB;AAAA,EAAA,MAGb;AACJ,QAAI,gBAAgB;AACpB,QAAI,cAAc;AAChB,YAAMG,YAAW,MAAM,KAAK,aAAa,QAAQ;AACjD,sBAAgBA,UAAS,OAAO,CAAC,KAAK,mBAAmB;AACvD,eAAO,MAAM,eAAe;AAAA,MAC9B,GAAG,EAAE;AAAA,IACP;AAEA,qBAAiB,MAAM,SAAS,GAAG,aAAa;AAChD,QAAI;AACF,uBAAiB,MAAM,aAAa,UAAU,cAAc;AAE9D,eAAW,MAAM;AACf,uBAAiB,MAAM,aAAa;AAAA,IACtC,GAAG,cAAc;AAAA,EACnB;AACA,QAAM,aAAa,CAAC,EAAE,UAAU,YAAmC;AACjE,QAAI,YAAa;AAEjB,UAAM,cAAc,iBAAiB;AAAA,MACnC,IAAI,sBAAsB;AAAA,IAAA;AAE5B,UAAM,gBAAgB,UAClB,uBAAA,IACA,iBAAA;AAEJ,QAAI,CAAC,eAAe;AAClB,cAAQ,MAAM,+BAA+B;AAC7C,aAAO;AAAA,IACT;AACA,QAAI,CAAC,YAAa,OAAM,IAAI,MAAM,+BAA+B;AAEjE,UAAM,SAAS,CAAC,aAAa,aAAa;AAC1C,UAAM,YAAY,cAAc,cAAc,GAAG;AACjD,UAAM,gCAAgC,UAAU,UAAU;AAC1D,UAAM,qBAAqB,UAAU,SAAS;AAE9C,kBAAc;AAEd,kBAAc,MAAM,OAAO;AAC3B,kBAAc,MAAM,UAAU;AAG9B,QAAI,QAAuB,sBAAsB,MAAM;AACrD,cAAQ;AACR,aAAO,QAAQ,CAAC,UAAU;AACxB,cAAM,MAAM,aAAa,aAAa,cAAc;AACpD,cAAM,MAAM,YAAY,cAAc,kBAAkB;AAAA,MAC1D,CAAC;AACD,sBAAgB,EAAE,SAAS,eAAe,gBAAgB,MAAM;AAAA,IAClE,CAAC;AAED,QAAI,YAAY;AAChB,UAAM,UAAU,MAAM;AACpB,UAAI,UAAW;AACf,kBAAY;AACZ,UAAI,UAAU,KAAM,sBAAqB,KAAK;AAC9C,kBAAY,oBAAoB,iBAAiB,eAAe;AAGhE,oBAAc,aAAa,wBAAwB,EAAE;AACrD,kBAAY,gBAAgB,sBAAsB;AAElD,aAAO,QAAQ,CAAC,UAAU;AACxB,cAAM,gBAAgB,OAAO;AAAA,MAC/B,CAAC;AAED,UAAI,UAAW,WAAU,MAAM,EAAE,eAAe,MAAM;AACtD,oBAAc;AAAA,IAChB;AACA,UAAM,kBAAkB,CAAC,UAA2B;AAElD,UAAI,MAAM,WAAW,YAAa;AAClC,UAAI,MAAM,iBAAiB,YAAa;AACxC,cAAA;AAAA,IACF;AACA,gBAAY,iBAAiB,iBAAiB,eAAe;AAC7D,eAAW,SAAS,iBAAiB,GAAG;AAExC,QAAI,cAAc,eAAe,iBAAiB,cAAc;AAC9D,iBAAW,MAAM;AACf,sBAAc,MAAM,YAAY;AAChC,sBAAc,MAAM,SAAS;AAAA,MAC/B,GAAG,iBAAiB,GAAG;AAAA,IACzB;AAAA,EACF;AACA,QAAM,mBAAmB,CAAC,QAAgB;AACxC,uBAAmB;AAAA,EACrB;AACA,QAAM,kBAAkB,CAAC;AAAA,IACvB;AAAA,IACA,iBAAiB;AAAA,EAAA,MAIb;AACJ,mBAAe;AAEf,eAAW,MAAM;AACf,oBAAc,EAAE,gBAAgB;AAAA,IAClC,GAAG,GAAG;AAAA,EACR;AACA,QAAM,iBAAiB,MAAM,WAAW,EAAE,SAAS,OAAO;AAC1D,QAAM,kBAAkB,MAAM,WAAW,EAAE,SAAS,MAAM;AAC1D,QAAM,aAAa,MAAM;AACvB,eAAW,MAAM;AACf,oBAAc,EAAE,gBAAgB,OAAO;AAAA,IACzC,GAAG,GAAG;AAAA,EACR;AACA,QAAM,eAAe,MAAM;AAC3B,MAAI,mBAAkC;AACtC,MAAI,eAAmC;AACvC,MAAI,cAAc;AAElB,QAAM,WAAW,uBAAuB;AAAA,IACtC,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,mBAAiB,YAAY,QAAQ;AAErC,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM;AACb,iBAAA;AAAA,IACF,GAAG,EAAE;AAAA,EAAA;AAGP,SAAO;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,MACN,QAAQ;AAAA,IAAA;AAAA,EACV;AAEJ,GAAA;AAEK,MAAM,kCAAkC;AAAA,EAC7C,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,UAAU;AAAA,IACR,QAAQ;AAAA,EAAA;AAEZ;"}
@@ -17,6 +17,7 @@ export declare const createCompositeNavigationSlides: {
17
17
  Styles: string;
18
18
  Elements: {
19
19
  container: string;
20
+ overflow: string;
20
21
  wrapper: string;
21
22
  headline: string;
22
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"slides.d.ts","sourceRoot":"","sources":["../../../../../source/composite/navigation/elements/slider/slides.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,mBAAmB,EAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,eAAe,EAChB,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,cAAc,GAAG,eAAe,GAC1C,mBAAmB,GAAG;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,oBAAoB,CAAC,EAAE,eAAe,EAAE,CAAC;IACzC,iBAAiB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjD,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAMJ,KAAK,oBAAoB,GAAG,cAAc,GAAG;IAC3C,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAuPF,eAAO,MAAM,+BAA+B;2BAnGZ,oBAAoB;;;;;;;CA2GnD,CAAC"}
1
+ {"version":3,"file":"slides.d.ts","sourceRoot":"","sources":["../../../../../source/composite/navigation/elements/slider/slides.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,mBAAmB,EAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,eAAe,EAChB,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,cAAc,GAAG,eAAe,GAC1C,mBAAmB,GAAG;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,oBAAoB,CAAC,EAAE,eAAe,EAAE,CAAC;IACzC,iBAAiB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjD,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAMJ,KAAK,oBAAoB,GAAG,cAAc,GAAG;IAC3C,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAmPF,eAAO,MAAM,+BAA+B;2BAvGZ,oBAAoB;;;;;;;;CAgHnD,CAAC"}
@@ -6,6 +6,7 @@ import { chevron_down } from "@universityofmaryland/web-icons-library/controls";
6
6
  import { createCompositeNavigationSliderFirst } from "./slide-first.js";
7
7
  import { createCompositeNavigationSliderAction } from "./action.js";
8
8
  const ELEMENT_NAV_SLIDE_CONTAINER = "nav-slide-container";
9
+ const ELEMENT_NAV_SLIDE_OVERFLOW = "nav-slide-overflow";
9
10
  const ELEMENT_NAV_SLIDE_WRAPPER = "nav-slide-wrapper";
10
11
  const ELEMENT_NAV_SLIDE_HEADLINE = "nav-slide-headline";
11
12
  const ELEMENT_NAV_SLIDE_BACK_BUTTON = "nav-slide-action-back-button";
@@ -15,12 +16,6 @@ const ContentStyles = `
15
16
  margin-top: ${token.spacing.lg};
16
17
  }
17
18
  `;
18
- const WrapperStyles = `
19
- .${ELEMENT_NAV_SLIDE_WRAPPER} {
20
- overflow-y: scroll;
21
- height: 100%;
22
- }
23
- `;
24
19
  const BackButtonStyles = `
25
20
  .${ELEMENT_NAV_SLIDE_BACK_BUTTON} {
26
21
  display: block;
@@ -75,7 +70,6 @@ const STYLES_NAV_SLIDES = `
75
70
  ${BackButtonStyles}
76
71
  ${HeadlineStyles}
77
72
  ${ContentStyles}
78
- ${WrapperStyles}
79
73
  ${createCompositeNavigationSliderAction.Styles}
80
74
  ${createCompositeNavigationSliderFirst.Styles}
81
75
  `;
@@ -155,6 +149,7 @@ const CreateNavSlides = (props) => {
155
149
  slides.forEach((slide, i) => {
156
150
  const contentRef = slide.getAttribute("content-slot");
157
151
  const sliderContainer = document.createElement("div");
152
+ const sliderOverflow = document.createElement("div");
158
153
  const sliderWrapper = document.createElement("div");
159
154
  const isSlideActive = slide.hasAttribute(ATTRIBUTE_ACTIVE_SLIDE);
160
155
  const parentRef = slide.getAttribute(ATTRIBUTE_PARENT_REF);
@@ -176,22 +171,24 @@ const CreateNavSlides = (props) => {
176
171
  sliderContainer.setAttribute(`${ATTRIBUTE_DATA_SLIDE}`, "");
177
172
  sliderContainer.classList.add(ELEMENT_NAV_SLIDE_CONTAINER);
178
173
  sliderContainer.setAttribute(`${ATTRIBUTE_PARENT_REF}`, `${parentRef}`);
174
+ sliderOverflow.classList.add(ELEMENT_NAV_SLIDE_OVERFLOW);
179
175
  if (slideBackButton) sliderWrapper.appendChild(slideBackButton);
180
176
  sliderWrapper.appendChild(slideHeadline);
181
177
  sliderWrapper.appendChild(slideActions);
182
178
  sliderWrapper.classList.add(ELEMENT_NAV_SLIDE_WRAPPER);
183
- sliderContainer.appendChild(sliderWrapper);
179
+ sliderOverflow.appendChild(sliderWrapper);
184
180
  if (contentRef) {
185
181
  const additionalContent = childrenSlideContent?.find(
186
182
  (element) => element.getAttribute("name") === contentRef
187
183
  );
188
184
  if (additionalContent) {
189
185
  const contentContainer = document.createElement("div");
190
- contentContainer.appendChild(additionalContent);
186
+ sliderOverflow.appendChild(additionalContent);
191
187
  contentContainer.classList.add(ELEMENT_NAV_SLIDE_CONTENT);
192
188
  sliderContainer.appendChild(contentContainer);
193
189
  }
194
190
  }
191
+ sliderContainer.appendChild(sliderOverflow);
195
192
  slider.appendChild(sliderContainer);
196
193
  if (i === slides.length - 1) {
197
194
  setTimeout(() => {
@@ -205,6 +202,7 @@ const createCompositeNavigationSlides = {
205
202
  Styles: STYLES_NAV_SLIDES,
206
203
  Elements: {
207
204
  container: ELEMENT_NAV_SLIDE_CONTAINER,
205
+ overflow: ELEMENT_NAV_SLIDE_OVERFLOW,
208
206
  wrapper: ELEMENT_NAV_SLIDE_WRAPPER,
209
207
  headline: ELEMENT_NAV_SLIDE_HEADLINE
210
208
  }
@@ -1 +1 @@
1
- {"version":3,"file":"slides.js","sources":["../../../../../source/composite/navigation/elements/slider/slides.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport * as typography from '@universityofmaryland/web-styles-library/typography';\nimport { jssToCSS } from '@universityofmaryland/web-utilities-library/styles';\nimport { cloneElementWithoutAttributes } from '@universityofmaryland/web-utilities-library/dom';\nimport { chevron_down as iconChevronDown } from '@universityofmaryland/web-icons-library/controls';\nimport {\n createCompositeNavigationSliderFirst as FirstSlide,\n TypeFirstSlideProps,\n TypeFirstSlide,\n} from './slide-first';\nimport {\n createCompositeNavigationSliderAction as SlideAction,\n TypeActionProps,\n} from './action';\n\nexport type TypeSlideProps = TypeActionProps &\n TypeFirstSlideProps & {\n ATTRIBUTE_DATA_SLIDE: string;\n ATTRIBUTE_ACTIVE_SLIDE: string;\n childrenSlides?: HTMLElement | null;\n childrenSlideContent?: HTMLSlotElement[];\n primarySlideLinks?: HTMLElement | null;\n primarySlidesSecondaryLinks?: HTMLElement | null;\n eventSlideRight: () => void;\n };\n\ntype TypeSlideBackContainer = TypeSlideProps & {\n parentRef: string;\n};\n\ntype TypeDrawerChildSlide = TypeSlideProps & {\n slider: HTMLElement;\n};\n\ntype TypeSlideFirstContainer = TypeDrawerChildSlide & TypeFirstSlide;\n\ntype TypeSliderSlideActions = TypeSlideProps & {\n slide: HTMLDivElement;\n};\n\nconst ELEMENT_NAV_SLIDE_CONTAINER = 'nav-slide-container';\nconst ELEMENT_NAV_SLIDE_WRAPPER = 'nav-slide-wrapper';\nconst ELEMENT_NAV_SLIDE_HEADLINE = 'nav-slide-headline';\nconst ELEMENT_NAV_SLIDE_BACK_BUTTON = 'nav-slide-action-back-button';\nconst ELEMENT_NAV_SLIDE_CONTENT = 'nav-slide-action-content';\n\n// prettier-ignore\nconst ContentStyles = `\n * + .${ELEMENT_NAV_SLIDE_CONTENT} {\n margin-top: ${token.spacing.lg};\n }\n`;\n\n// prettier-ignore\nconst WrapperStyles = `\n .${ELEMENT_NAV_SLIDE_WRAPPER} {\n overflow-y: scroll;\n height: 100%;\n }\n`;\n\n// prettier-ignore\nconst BackButtonStyles = `\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} {\n display: block;\n border-bottom: 1px solid ${token.color.black};\n margin-bottom: ${token.spacing.sm};\n padding-bottom: ${token.spacing.sm};\n }\n\n @media (min-width: 480px) {\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} {\n margin-bottom: ${token.spacing.md};\n padding-bottom: ${token.spacing.md};\n }\n }\n\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} button {\n text-transform: uppercase;\n font-weight: 600;\n letter-Spacing: 1px;\n display: flex;\n align-items: center;\n color: ${token.color.black};\n }\n\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} button:hover,\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} button:focus {\n text-decoration: underline;\n }\n\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} button svg {\n fill: ${token.color.red};\n width: 12px;\n height: 12px;\n margin-right: ${token.spacing.min};\n transform: rotate(90deg);\n }\n`;\n\n// prettier-ignore\nconst HeadlineStyles = `\n ${jssToCSS({\n styleObj: {\n [`.${ELEMENT_NAV_SLIDE_HEADLINE}`]: typography.sans.large,\n },\n })}\n\n .${ELEMENT_NAV_SLIDE_HEADLINE} {\n margin-bottom: ${token.spacing.md};\n font-weight: 700;\n color: ${token.color.black};\n }\n`;\n\n// prettier-ignore\nconst STYLES_NAV_SLIDES = `\n ${BackButtonStyles}\n ${HeadlineStyles}\n ${ContentStyles}\n ${WrapperStyles}\n ${SlideAction.Styles}\n ${FirstSlide.Styles}\n`;\n\nconst createSlideBackButton = (props: TypeSlideBackContainer) => {\n const { eventSlideRight, parentRef, setUpcomingSlide } = props;\n\n if (!parentRef) return;\n const backButtonContainer = document.createElement('div');\n const slideBackButton = document.createElement('button');\n\n slideBackButton.innerHTML = `${iconChevronDown} Back`;\n slideBackButton.setAttribute('type', 'button');\n slideBackButton.setAttribute('aria-label', 'Previous level of navigation');\n slideBackButton.addEventListener('click', () => {\n setUpcomingSlide(parentRef);\n eventSlideRight();\n });\n\n backButtonContainer.classList.add(ELEMENT_NAV_SLIDE_BACK_BUTTON);\n backButtonContainer.appendChild(slideBackButton);\n\n return backButtonContainer;\n};\n\nconst createSlideHeadline = ({ link }: { link: HTMLAnchorElement }) => {\n const slideHeadline = document.createElement('p');\n\n slideHeadline.appendChild(cloneElementWithoutAttributes({ element: link }));\n slideHeadline.classList.add(ELEMENT_NAV_SLIDE_HEADLINE);\n\n return slideHeadline;\n};\n\nconst createSlideActions = (props: TypeSliderSlideActions) => {\n const { slide } = props;\n\n const slideActionsContainer = document.createElement('div');\n const clonedSlide = slide.cloneNode(true) as HTMLDivElement;\n const links = Array.from(\n clonedSlide.querySelectorAll('a'),\n ) as HTMLAnchorElement[];\n\n if (links.length > 0) {\n links.forEach((link) =>\n slideActionsContainer.appendChild(\n SlideAction.CreateElement({ ...props, link }),\n ),\n );\n }\n\n return slideActionsContainer;\n};\n\nconst CreateFirstSlide = (props: TypeSlideFirstContainer) => {\n const { slider } = props;\n slider.appendChild(FirstSlide.CreateElement(props));\n};\n\nconst CreateNavSlides = (props: TypeDrawerChildSlide) => {\n const {\n slider,\n setCurrentSlide,\n childrenSlides,\n childrenSlideContent,\n primarySlideLinks,\n primarySlidesSecondaryLinks,\n ATTRIBUTE_PARENT_REF,\n ATTRIBUTE_CHILD_REF,\n ATTRIBUTE_ACTIVE_SLIDE,\n ATTRIBUTE_DATA_SLIDE,\n } = props;\n let isContextMenu = false;\n if (!childrenSlides) {\n CreateFirstSlide({ ...props, isContextMenu });\n return;\n }\n\n const slides = Array.from(\n childrenSlides.querySelectorAll(`[${ATTRIBUTE_PARENT_REF}]`),\n ) as HTMLDivElement[];\n const primaryLinks = primarySlideLinks\n ? Array.from(primarySlideLinks.querySelectorAll('a'))\n : [];\n const secondaryLinks = primarySlidesSecondaryLinks\n ? Array.from(primarySlidesSecondaryLinks.querySelectorAll(':scope > *'))\n : [];\n const childLinks = Array.from(\n childrenSlides.querySelectorAll(`[${ATTRIBUTE_CHILD_REF}]`),\n ) as HTMLAnchorElement[];\n const parentOptions = [\n ...primaryLinks,\n ...secondaryLinks,\n ...childLinks,\n ] as HTMLAnchorElement[];\n\n slides.forEach((slide, i) => {\n const contentRef = slide.getAttribute('content-slot');\n const sliderContainer = document.createElement('div');\n const sliderWrapper = document.createElement('div');\n const isSlideActive = slide.hasAttribute(ATTRIBUTE_ACTIVE_SLIDE);\n const parentRef = slide.getAttribute(ATTRIBUTE_PARENT_REF) as string;\n const parentElement = parentOptions.find(\n (option) => option.getAttribute(ATTRIBUTE_CHILD_REF) === parentRef,\n );\n\n if (!parentElement) {\n console.error(`No parent reference found for ${parentRef}`);\n return;\n }\n\n const slideBackButton = createSlideBackButton({ ...props, parentRef });\n const slideHeadline = createSlideHeadline({ link: parentElement });\n const slideActions = createSlideActions({ ...props, slide });\n\n // Context Menu\n if (isSlideActive) {\n sliderContainer.setAttribute(`${ATTRIBUTE_ACTIVE_SLIDE}`, ``);\n setCurrentSlide({ element: sliderContainer });\n isContextMenu = true;\n }\n\n sliderContainer.setAttribute(`${ATTRIBUTE_DATA_SLIDE}`, '');\n sliderContainer.classList.add(ELEMENT_NAV_SLIDE_CONTAINER);\n sliderContainer.setAttribute(`${ATTRIBUTE_PARENT_REF}`, `${parentRef}`);\n\n if (slideBackButton) sliderWrapper.appendChild(slideBackButton);\n sliderWrapper.appendChild(slideHeadline);\n sliderWrapper.appendChild(slideActions);\n\n sliderWrapper.classList.add(ELEMENT_NAV_SLIDE_WRAPPER);\n sliderContainer.appendChild(sliderWrapper);\n\n if (contentRef) {\n const additionalContent = childrenSlideContent?.find(\n (element) => element.getAttribute('name') === contentRef,\n );\n\n if (additionalContent) {\n const contentContainer = document.createElement('div');\n\n contentContainer.appendChild(additionalContent);\n contentContainer.classList.add(ELEMENT_NAV_SLIDE_CONTENT);\n\n sliderContainer.appendChild(contentContainer);\n }\n }\n\n slider.appendChild(sliderContainer);\n\n if (i === slides.length - 1) {\n setTimeout(() => {\n CreateFirstSlide({ ...props, isContextMenu });\n }, 100);\n }\n });\n};\n\nexport const createCompositeNavigationSlides = {\n CreateElement: CreateNavSlides,\n Styles: STYLES_NAV_SLIDES,\n Elements: {\n container: ELEMENT_NAV_SLIDE_CONTAINER,\n wrapper: ELEMENT_NAV_SLIDE_WRAPPER,\n headline: ELEMENT_NAV_SLIDE_HEADLINE,\n },\n};\n"],"names":["SlideAction","FirstSlide","iconChevronDown"],"mappings":"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"}
1
+ {"version":3,"file":"slides.js","sources":["../../../../../source/composite/navigation/elements/slider/slides.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport * as typography from '@universityofmaryland/web-styles-library/typography';\nimport { jssToCSS } from '@universityofmaryland/web-utilities-library/styles';\nimport { cloneElementWithoutAttributes } from '@universityofmaryland/web-utilities-library/dom';\nimport { chevron_down as iconChevronDown } from '@universityofmaryland/web-icons-library/controls';\nimport {\n createCompositeNavigationSliderFirst as FirstSlide,\n TypeFirstSlideProps,\n TypeFirstSlide,\n} from './slide-first';\nimport {\n createCompositeNavigationSliderAction as SlideAction,\n TypeActionProps,\n} from './action';\n\nexport type TypeSlideProps = TypeActionProps &\n TypeFirstSlideProps & {\n ATTRIBUTE_DATA_SLIDE: string;\n ATTRIBUTE_ACTIVE_SLIDE: string;\n childrenSlides?: HTMLElement | null;\n childrenSlideContent?: HTMLSlotElement[];\n primarySlideLinks?: HTMLElement | null;\n primarySlidesSecondaryLinks?: HTMLElement | null;\n eventSlideRight: () => void;\n };\n\ntype TypeSlideBackContainer = TypeSlideProps & {\n parentRef: string;\n};\n\ntype TypeDrawerChildSlide = TypeSlideProps & {\n slider: HTMLElement;\n};\n\ntype TypeSlideFirstContainer = TypeDrawerChildSlide & TypeFirstSlide;\n\ntype TypeSliderSlideActions = TypeSlideProps & {\n slide: HTMLDivElement;\n};\n\nconst ELEMENT_NAV_SLIDE_CONTAINER = 'nav-slide-container';\nconst ELEMENT_NAV_SLIDE_OVERFLOW = 'nav-slide-overflow';\nconst ELEMENT_NAV_SLIDE_WRAPPER = 'nav-slide-wrapper';\nconst ELEMENT_NAV_SLIDE_HEADLINE = 'nav-slide-headline';\nconst ELEMENT_NAV_SLIDE_BACK_BUTTON = 'nav-slide-action-back-button';\nconst ELEMENT_NAV_SLIDE_CONTENT = 'nav-slide-action-content';\n\n// prettier-ignore\nconst ContentStyles = `\n * + .${ELEMENT_NAV_SLIDE_CONTENT} {\n margin-top: ${token.spacing.lg};\n }\n`;\n\n// prettier-ignore\nconst BackButtonStyles = `\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} {\n display: block;\n border-bottom: 1px solid ${token.color.black};\n margin-bottom: ${token.spacing.sm};\n padding-bottom: ${token.spacing.sm};\n }\n\n @media (min-width: 480px) {\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} {\n margin-bottom: ${token.spacing.md};\n padding-bottom: ${token.spacing.md};\n }\n }\n\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} button {\n text-transform: uppercase;\n font-weight: 600;\n letter-Spacing: 1px;\n display: flex;\n align-items: center;\n color: ${token.color.black};\n }\n\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} button:hover,\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} button:focus {\n text-decoration: underline;\n }\n\n .${ELEMENT_NAV_SLIDE_BACK_BUTTON} button svg {\n fill: ${token.color.red};\n width: 12px;\n height: 12px;\n margin-right: ${token.spacing.min};\n transform: rotate(90deg);\n }\n`;\n\n// prettier-ignore\nconst HeadlineStyles = `\n ${jssToCSS({\n styleObj: {\n [`.${ELEMENT_NAV_SLIDE_HEADLINE}`]: typography.sans.large,\n },\n })}\n\n .${ELEMENT_NAV_SLIDE_HEADLINE} {\n margin-bottom: ${token.spacing.md};\n font-weight: 700;\n color: ${token.color.black};\n }\n`;\n\n// prettier-ignore\nconst STYLES_NAV_SLIDES = `\n ${BackButtonStyles}\n ${HeadlineStyles}\n ${ContentStyles}\n ${SlideAction.Styles}\n ${FirstSlide.Styles}\n`;\n\nconst createSlideBackButton = (props: TypeSlideBackContainer) => {\n const { eventSlideRight, parentRef, setUpcomingSlide } = props;\n\n if (!parentRef) return;\n const backButtonContainer = document.createElement('div');\n const slideBackButton = document.createElement('button');\n\n slideBackButton.innerHTML = `${iconChevronDown} Back`;\n slideBackButton.setAttribute('type', 'button');\n slideBackButton.setAttribute('aria-label', 'Previous level of navigation');\n slideBackButton.addEventListener('click', () => {\n setUpcomingSlide(parentRef);\n eventSlideRight();\n });\n\n backButtonContainer.classList.add(ELEMENT_NAV_SLIDE_BACK_BUTTON);\n backButtonContainer.appendChild(slideBackButton);\n\n return backButtonContainer;\n};\n\nconst createSlideHeadline = ({ link }: { link: HTMLAnchorElement }) => {\n const slideHeadline = document.createElement('p');\n\n slideHeadline.appendChild(cloneElementWithoutAttributes({ element: link }));\n slideHeadline.classList.add(ELEMENT_NAV_SLIDE_HEADLINE);\n\n return slideHeadline;\n};\n\nconst createSlideActions = (props: TypeSliderSlideActions) => {\n const { slide } = props;\n\n const slideActionsContainer = document.createElement('div');\n const clonedSlide = slide.cloneNode(true) as HTMLDivElement;\n const links = Array.from(\n clonedSlide.querySelectorAll('a'),\n ) as HTMLAnchorElement[];\n\n if (links.length > 0) {\n links.forEach((link) =>\n slideActionsContainer.appendChild(\n SlideAction.CreateElement({ ...props, link }),\n ),\n );\n }\n\n return slideActionsContainer;\n};\n\nconst CreateFirstSlide = (props: TypeSlideFirstContainer) => {\n const { slider } = props;\n slider.appendChild(FirstSlide.CreateElement(props));\n};\n\nconst CreateNavSlides = (props: TypeDrawerChildSlide) => {\n const {\n slider,\n setCurrentSlide,\n childrenSlides,\n childrenSlideContent,\n primarySlideLinks,\n primarySlidesSecondaryLinks,\n ATTRIBUTE_PARENT_REF,\n ATTRIBUTE_CHILD_REF,\n ATTRIBUTE_ACTIVE_SLIDE,\n ATTRIBUTE_DATA_SLIDE,\n } = props;\n let isContextMenu = false;\n if (!childrenSlides) {\n CreateFirstSlide({ ...props, isContextMenu });\n return;\n }\n\n const slides = Array.from(\n childrenSlides.querySelectorAll(`[${ATTRIBUTE_PARENT_REF}]`),\n ) as HTMLDivElement[];\n const primaryLinks = primarySlideLinks\n ? Array.from(primarySlideLinks.querySelectorAll('a'))\n : [];\n const secondaryLinks = primarySlidesSecondaryLinks\n ? Array.from(primarySlidesSecondaryLinks.querySelectorAll(':scope > *'))\n : [];\n const childLinks = Array.from(\n childrenSlides.querySelectorAll(`[${ATTRIBUTE_CHILD_REF}]`),\n ) as HTMLAnchorElement[];\n const parentOptions = [\n ...primaryLinks,\n ...secondaryLinks,\n ...childLinks,\n ] as HTMLAnchorElement[];\n\n slides.forEach((slide, i) => {\n const contentRef = slide.getAttribute('content-slot');\n const sliderContainer = document.createElement('div');\n const sliderOverflow = document.createElement('div');\n const sliderWrapper = document.createElement('div');\n const isSlideActive = slide.hasAttribute(ATTRIBUTE_ACTIVE_SLIDE);\n const parentRef = slide.getAttribute(ATTRIBUTE_PARENT_REF) as string;\n const parentElement = parentOptions.find(\n (option) => option.getAttribute(ATTRIBUTE_CHILD_REF) === parentRef,\n );\n\n if (!parentElement) {\n console.error(`No parent reference found for ${parentRef}`);\n return;\n }\n\n const slideBackButton = createSlideBackButton({ ...props, parentRef });\n const slideHeadline = createSlideHeadline({ link: parentElement });\n const slideActions = createSlideActions({ ...props, slide });\n\n // Context Menu\n if (isSlideActive) {\n sliderContainer.setAttribute(`${ATTRIBUTE_ACTIVE_SLIDE}`, ``);\n setCurrentSlide({ element: sliderContainer });\n isContextMenu = true;\n }\n\n sliderContainer.setAttribute(`${ATTRIBUTE_DATA_SLIDE}`, '');\n sliderContainer.classList.add(ELEMENT_NAV_SLIDE_CONTAINER);\n sliderContainer.setAttribute(`${ATTRIBUTE_PARENT_REF}`, `${parentRef}`);\n\n sliderOverflow.classList.add(ELEMENT_NAV_SLIDE_OVERFLOW);\n\n if (slideBackButton) sliderWrapper.appendChild(slideBackButton);\n sliderWrapper.appendChild(slideHeadline);\n sliderWrapper.appendChild(slideActions);\n\n sliderWrapper.classList.add(ELEMENT_NAV_SLIDE_WRAPPER);\n sliderOverflow.appendChild(sliderWrapper);\n\n if (contentRef) {\n const additionalContent = childrenSlideContent?.find(\n (element) => element.getAttribute('name') === contentRef,\n );\n\n if (additionalContent) {\n const contentContainer = document.createElement('div');\n\n sliderOverflow.appendChild(additionalContent);\n contentContainer.classList.add(ELEMENT_NAV_SLIDE_CONTENT);\n\n sliderContainer.appendChild(contentContainer);\n }\n }\n\n sliderContainer.appendChild(sliderOverflow);\n slider.appendChild(sliderContainer);\n\n if (i === slides.length - 1) {\n setTimeout(() => {\n CreateFirstSlide({ ...props, isContextMenu });\n }, 100);\n }\n });\n};\n\nexport const createCompositeNavigationSlides = {\n CreateElement: CreateNavSlides,\n Styles: STYLES_NAV_SLIDES,\n Elements: {\n container: ELEMENT_NAV_SLIDE_CONTAINER,\n overflow: ELEMENT_NAV_SLIDE_OVERFLOW,\n wrapper: ELEMENT_NAV_SLIDE_WRAPPER,\n headline: ELEMENT_NAV_SLIDE_HEADLINE,\n },\n};\n"],"names":["SlideAction","FirstSlide","iconChevronDown"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@universityofmaryland/web-elements-library",
3
- "version": "1.6.14",
3
+ "version": "1.6.16",
4
4
  "description": "UMD Web Elements",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -41,7 +41,7 @@
41
41
  "@types/postcss-js": "^4.0.4",
42
42
  "@universityofmaryland/web-builder-library": "^1.0.3",
43
43
  "@universityofmaryland/web-icons-library": "^1.0.4",
44
- "@universityofmaryland/web-styles-library": "^1.8.9",
44
+ "@universityofmaryland/web-styles-library": "^1.8.10",
45
45
  "@universityofmaryland/web-token-library": "^1.0.1",
46
46
  "@universityofmaryland/web-utilities-library": "^1.0.5"
47
47
  },