@universityofmaryland/web-elements-library 1.6.17 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +1 -1
  2. package/dist/atomic/animations/brand/card-stack.js +2 -3
  3. package/dist/atomic/animations/brand/card-stack.js.map +1 -1
  4. package/dist/atomic/animations/brand/chevron-flow.d.ts +1 -7
  5. package/dist/atomic/animations/brand/chevron-flow.d.ts.map +1 -1
  6. package/dist/atomic/animations/brand/chevron-flow.js +82 -159
  7. package/dist/atomic/animations/brand/chevron-flow.js.map +1 -1
  8. package/dist/atomic/animations/brand/chevron-scroll.d.ts +1 -4
  9. package/dist/atomic/animations/brand/chevron-scroll.d.ts.map +1 -1
  10. package/dist/atomic/animations/brand/chevron-scroll.js +89 -143
  11. package/dist/atomic/animations/brand/chevron-scroll.js.map +1 -1
  12. package/dist/atomic/assets/image/caption.d.ts +9 -0
  13. package/dist/atomic/assets/image/caption.d.ts.map +1 -0
  14. package/dist/atomic/assets/image/caption.js +166 -0
  15. package/dist/atomic/assets/image/caption.js.map +1 -0
  16. package/dist/atomic/assets/image/gif.d.ts.map +1 -1
  17. package/dist/atomic/assets/image/gif.js +6 -1
  18. package/dist/atomic/assets/image/gif.js.map +1 -1
  19. package/dist/atomic/assets/image/index.d.ts +1 -0
  20. package/dist/atomic/assets/image/index.d.ts.map +1 -1
  21. package/dist/atomic/assets/image/index.js +2 -0
  22. package/dist/atomic/assets/image/index.js.map +1 -1
  23. package/dist/atomic/assets/video/toggle.d.ts.map +1 -1
  24. package/dist/atomic/assets/video/toggle.js +9 -2
  25. package/dist/atomic/assets/video/toggle.js.map +1 -1
  26. package/dist/atomic/buttons/fullscreen.d.ts +1 -0
  27. package/dist/atomic/buttons/fullscreen.d.ts.map +1 -1
  28. package/dist/atomic/buttons/fullscreen.js +35 -3
  29. package/dist/atomic/buttons/fullscreen.js.map +1 -1
  30. package/dist/atomic/layout/overlay/modal.d.ts +1 -10
  31. package/dist/atomic/layout/overlay/modal.d.ts.map +1 -1
  32. package/dist/atomic/layout/overlay/modal.js +28 -44
  33. package/dist/atomic/layout/overlay/modal.js.map +1 -1
  34. package/dist/atomic/layout/person/columns.js +2 -3
  35. package/dist/atomic/layout/person/columns.js.map +1 -1
  36. package/dist/atomic/text-lockup/date.d.ts +1 -4
  37. package/dist/atomic/text-lockup/date.d.ts.map +1 -1
  38. package/dist/atomic/text-lockup/date.js +42 -75
  39. package/dist/atomic/text-lockup/date.js.map +1 -1
  40. package/dist/composite/accordion/item.d.ts +3 -16
  41. package/dist/composite/accordion/item.d.ts.map +1 -1
  42. package/dist/composite/accordion/item.js +152 -245
  43. package/dist/composite/accordion/item.js.map +1 -1
  44. package/dist/composite/card/block.js +2 -3
  45. package/dist/composite/card/block.js.map +1 -1
  46. package/dist/composite/card/event-time.js +2 -3
  47. package/dist/composite/card/event-time.js.map +1 -1
  48. package/dist/composite/card/list.js +2 -3
  49. package/dist/composite/card/list.js.map +1 -1
  50. package/dist/composite/card/overlay/color.js +3 -3
  51. package/dist/composite/card/overlay/icon.js +3 -3
  52. package/dist/composite/card/overlay/image.d.ts.map +1 -1
  53. package/dist/composite/card/overlay/image.js +9 -12
  54. package/dist/composite/card/overlay/image.js.map +1 -1
  55. package/dist/composite/card/video/block.js +4 -3
  56. package/dist/composite/card/video/block.js.map +1 -1
  57. package/dist/composite/carousel/cards/index.d.ts +1 -8
  58. package/dist/composite/carousel/cards/index.d.ts.map +1 -1
  59. package/dist/composite/carousel/cards/index.js +163 -282
  60. package/dist/composite/carousel/cards/index.js.map +1 -1
  61. package/dist/composite/carousel/default/index.d.ts +9 -15
  62. package/dist/composite/carousel/default/index.d.ts.map +1 -1
  63. package/dist/composite/carousel/default/index.js +78 -129
  64. package/dist/composite/carousel/default/index.js.map +1 -1
  65. package/dist/composite/carousel/elements/equal-width-items.d.ts +37 -0
  66. package/dist/composite/carousel/elements/equal-width-items.d.ts.map +1 -0
  67. package/dist/composite/carousel/elements/{blocks.js → equal-width-items.js} +157 -227
  68. package/dist/composite/carousel/elements/equal-width-items.js.map +1 -0
  69. package/dist/composite/carousel/elements/full-screen.d.ts +3 -2
  70. package/dist/composite/carousel/elements/full-screen.d.ts.map +1 -1
  71. package/dist/composite/carousel/elements/full-screen.js +34 -41
  72. package/dist/composite/carousel/elements/full-screen.js.map +1 -1
  73. package/dist/composite/carousel/elements/image.d.ts +15 -2
  74. package/dist/composite/carousel/elements/image.d.ts.map +1 -1
  75. package/dist/composite/carousel/elements/image.js +176 -151
  76. package/dist/composite/carousel/elements/image.js.map +1 -1
  77. package/dist/composite/carousel/elements/index.d.ts +4 -1
  78. package/dist/composite/carousel/elements/index.d.ts.map +1 -1
  79. package/dist/composite/carousel/elements/indicator-wrapper.d.ts +13 -0
  80. package/dist/composite/carousel/elements/indicator-wrapper.d.ts.map +1 -0
  81. package/dist/composite/carousel/elements/indicator-wrapper.js +67 -0
  82. package/dist/composite/carousel/elements/indicator-wrapper.js.map +1 -0
  83. package/dist/composite/carousel/elements/nav-button.d.ts +82 -0
  84. package/dist/composite/carousel/elements/nav-button.d.ts.map +1 -0
  85. package/dist/composite/carousel/elements/nav-button.js +164 -0
  86. package/dist/composite/carousel/elements/nav-button.js.map +1 -0
  87. package/dist/composite/carousel/elements/overlay.d.ts +3 -2
  88. package/dist/composite/carousel/elements/overlay.d.ts.map +1 -1
  89. package/dist/composite/carousel/elements/overlay.js +85 -55
  90. package/dist/composite/carousel/elements/overlay.js.map +1 -1
  91. package/dist/composite/carousel/image/multiple.d.ts +2 -7
  92. package/dist/composite/carousel/image/multiple.d.ts.map +1 -1
  93. package/dist/composite/carousel/image/multiple.js +85 -150
  94. package/dist/composite/carousel/image/multiple.js.map +1 -1
  95. package/dist/composite/carousel/image/standard.d.ts +2 -7
  96. package/dist/composite/carousel/image/standard.d.ts.map +1 -1
  97. package/dist/composite/carousel/image/standard.js +148 -262
  98. package/dist/composite/carousel/image/standard.js.map +1 -1
  99. package/dist/composite/carousel/thumbnail/index.d.ts +1 -8
  100. package/dist/composite/carousel/thumbnail/index.d.ts.map +1 -1
  101. package/dist/composite/carousel/thumbnail/index.js +72 -113
  102. package/dist/composite/carousel/thumbnail/index.js.map +1 -1
  103. package/dist/composite/carousel/wide/container.d.ts +21 -20
  104. package/dist/composite/carousel/wide/container.d.ts.map +1 -1
  105. package/dist/composite/carousel/wide/container.js +37 -12
  106. package/dist/composite/carousel/wide/container.js.map +1 -1
  107. package/dist/composite/carousel/wide/controls.d.ts +5 -10
  108. package/dist/composite/carousel/wide/controls.d.ts.map +1 -1
  109. package/dist/composite/carousel/wide/controls.js +24 -94
  110. package/dist/composite/carousel/wide/controls.js.map +1 -1
  111. package/dist/composite/carousel/wide/frames.d.ts +18 -10
  112. package/dist/composite/carousel/wide/frames.d.ts.map +1 -1
  113. package/dist/composite/carousel/wide/frames.js +60 -78
  114. package/dist/composite/carousel/wide/frames.js.map +1 -1
  115. package/dist/composite/carousel/wide/index.d.ts.map +1 -1
  116. package/dist/composite/carousel/wide/index.js +11 -19
  117. package/dist/composite/carousel/wide/index.js.map +1 -1
  118. package/dist/composite/hero/custom/expand.js +3 -4
  119. package/dist/composite/hero/custom/expand.js.map +1 -1
  120. package/dist/composite/hero/custom/grid.js +2 -3
  121. package/dist/composite/hero/custom/grid.js.map +1 -1
  122. package/dist/composite/hero/custom/video-arrow.js +4 -3
  123. package/dist/composite/hero/custom/video-arrow.js.map +1 -1
  124. package/dist/composite/hero/logo.js +3 -3
  125. package/dist/composite/hero/minimal.js +3 -3
  126. package/dist/composite/hero/overlay.js +5 -4
  127. package/dist/composite/hero/overlay.js.map +1 -1
  128. package/dist/composite/hero/stacked.js +3 -3
  129. package/dist/composite/hero/standard.js +4 -3
  130. package/dist/composite/hero/standard.js.map +1 -1
  131. package/dist/composite/layout/box/logo.d.ts +1 -4
  132. package/dist/composite/layout/box/logo.d.ts.map +1 -1
  133. package/dist/composite/layout/box/logo.js +55 -103
  134. package/dist/composite/layout/box/logo.js.map +1 -1
  135. package/dist/composite/layout/image/expand.d.ts +1 -4
  136. package/dist/composite/layout/image/expand.d.ts.map +1 -1
  137. package/dist/composite/layout/image/expand.js +136 -243
  138. package/dist/composite/layout/image/expand.js.map +1 -1
  139. package/dist/composite/layout/scroll-top/index.d.ts +1 -7
  140. package/dist/composite/layout/scroll-top/index.d.ts.map +1 -1
  141. package/dist/composite/layout/scroll-top/index.js +65 -77
  142. package/dist/composite/layout/scroll-top/index.js.map +1 -1
  143. package/dist/composite/layout/sticky-columns/index.d.ts +2 -2
  144. package/dist/composite/layout/sticky-columns/index.d.ts.map +1 -1
  145. package/dist/composite/layout/sticky-columns/index.js +42 -70
  146. package/dist/composite/layout/sticky-columns/index.js.map +1 -1
  147. package/dist/composite/media/elements/gif.js +3 -3
  148. package/dist/composite/media/inline/caption.d.ts +4 -2
  149. package/dist/composite/media/inline/caption.d.ts.map +1 -1
  150. package/dist/composite/media/inline/caption.js +56 -67
  151. package/dist/composite/media/inline/caption.js.map +1 -1
  152. package/dist/composite/media/inline/index.d.ts +9 -8
  153. package/dist/composite/media/inline/index.d.ts.map +1 -1
  154. package/dist/composite/media/inline/standard.d.ts +1 -4
  155. package/dist/composite/media/inline/standard.d.ts.map +1 -1
  156. package/dist/composite/media/inline/standard.js +16 -24
  157. package/dist/composite/media/inline/standard.js.map +1 -1
  158. package/dist/composite/media/inline/wrapped.d.ts +4 -2
  159. package/dist/composite/media/inline/wrapped.d.ts.map +1 -1
  160. package/dist/composite/media/inline/wrapped.js +80 -83
  161. package/dist/composite/media/inline/wrapped.js.map +1 -1
  162. package/dist/composite/navigation/utility/alert.js +3 -4
  163. package/dist/composite/navigation/utility/alert.js.map +1 -1
  164. package/dist/composite/pathway/_common.js +4 -3
  165. package/dist/composite/pathway/_common.js.map +1 -1
  166. package/dist/composite/pathway/hero.js +3 -3
  167. package/dist/composite/person/bio/full.js +3 -3
  168. package/dist/composite/person/bio/small.js +2 -3
  169. package/dist/composite/person/bio/small.js.map +1 -1
  170. package/dist/composite/person/block.js +2 -3
  171. package/dist/composite/person/block.js.map +1 -1
  172. package/dist/composite/person/hero.js +3 -3
  173. package/dist/composite/person/list.js +2 -3
  174. package/dist/composite/person/list.js.map +1 -1
  175. package/dist/composite/person/tabular.js +2 -3
  176. package/dist/composite/person/tabular.js.map +1 -1
  177. package/dist/composite/slider/events.d.ts +6 -12
  178. package/dist/composite/slider/events.d.ts.map +1 -1
  179. package/dist/composite/slider/events.js +304 -428
  180. package/dist/composite/slider/events.js.map +1 -1
  181. package/dist/layout/image.d.ts +5 -10
  182. package/dist/layout/image.d.ts.map +1 -1
  183. package/dist/layout/image.js +27 -88
  184. package/dist/layout/image.js.map +1 -1
  185. package/dist/layout/index.d.ts +1 -1
  186. package/dist/layout/index.d.ts.map +1 -1
  187. package/dist/layout.js +2 -2
  188. package/package.json +6 -6
  189. package/dist/composite/carousel/elements/blocks.d.ts +0 -42
  190. package/dist/composite/carousel/elements/blocks.d.ts.map +0 -1
  191. package/dist/composite/carousel/elements/blocks.js.map +0 -1
  192. package/dist/composite/carousel/wide/_elementModel.d.ts +0 -18
  193. package/dist/composite/carousel/wide/_elementModel.d.ts.map +0 -1
  194. package/dist/composite/carousel/wide/_elementModel.js +0 -29
  195. package/dist/composite/carousel/wide/_elementModel.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import * as token from "@universityofmaryland/web-token-library";
2
+ import { ElementBuilder } from "@universityofmaryland/web-builder-library";
3
+ import { combineStyles } from "@universityofmaryland/web-utilities-library/styles";
2
4
  import { close_large } from "@universityofmaryland/web-icons-library/controls";
3
- import "@universityofmaryland/web-builder-library";
4
5
  import "@universityofmaryland/web-styles-library/element";
5
6
  import "@universityofmaryland/web-styles-library/layout";
6
7
  import "@universityofmaryland/web-styles-library/animation";
@@ -12,7 +13,6 @@ import "@universityofmaryland/web-icons-library/files";
12
13
  import "@universityofmaryland/web-icons-library/brand";
13
14
  import "@universityofmaryland/web-icons-library/arrows";
14
15
  import "@universityofmaryland/web-utilities-library/performance";
15
- import "../../../atomic/animations/brand/chevron-scroll.js";
16
16
  import "../../../atomic/animations/brand/card-stack.js";
17
17
  import "@universityofmaryland/web-styles-library";
18
18
  import "@universityofmaryland/web-utilities-library/accessibility";
@@ -23,49 +23,42 @@ import "../../../atomic/layout/block/stacked.js";
23
23
  import { createModal } from "../../../atomic/layout/overlay/modal.js";
24
24
  import "../../../atomic/layout/person/columns.js";
25
25
  import "@universityofmaryland/web-icons-library/social";
26
- import "../../../atomic/text-lockup/date.js";
26
+ import "@universityofmaryland/web-utilities-library/string";
27
+ import "@universityofmaryland/web-utilities-library/animation";
27
28
  import "../../../atomic/text-lockup/small.js";
28
- const ELEMENT_CLOSE_BUTTON = "carousel-fixed-screen-button";
29
- const STYLES_FIXED_FULL_SCREEN = `
30
-
31
-
32
- .${ELEMENT_CLOSE_BUTTON} {
33
- position: absolute;
34
- top: 10px;
35
- right: 10px;
36
- }
37
-
38
- @media (${token.media.queries.tablet.min}) {
39
- .${ELEMENT_CLOSE_BUTTON} {
40
- top: calc(10vh - 22px);
41
- right: calc(10vw - 22px);
29
+ const createCompositeCarouselFullScreen = ({ content }) => {
30
+ const modal = createModal({ content });
31
+ const modalEvents = modal.events;
32
+ const closeButtonModel = new ElementBuilder("button").withClassName("carousel-fixed-screen-button").withAttribute("type", "button").withAria({ label: "Close" }).withHTML(close_large).withStyles({
33
+ element: {
34
+ position: "absolute",
35
+ top: "10px",
36
+ right: "10px",
37
+ [`@media (${token.media.queries.tablet.min})`]: {
38
+ top: "calc(10vh - 22px)",
39
+ right: "calc(10vw - 22px)"
40
+ },
41
+ "& svg": {
42
+ fill: token.color.white,
43
+ width: "20px",
44
+ height: "20px"
45
+ }
42
46
  }
43
- }
44
-
45
- .${ELEMENT_CLOSE_BUTTON} > svg {
46
- fill: ${token.color.white};
47
- width: 20px;
48
- height: 20px;
49
- }
50
- `;
51
- const createCompositeCarouselFullScreen = ({ content, callback }) => {
52
- const modal = createModal({ content, callback });
53
- const closeButton = document.createElement("button");
54
- let styles = STYLES_FIXED_FULL_SCREEN;
55
- styles += modal.styles;
56
- closeButton.setAttribute("type", "button");
57
- closeButton.setAttribute("aria-label", "Close");
58
- closeButton.classList.add(ELEMENT_CLOSE_BUTTON);
59
- closeButton.innerHTML = close_large;
60
- closeButton.addEventListener("click", modal.events.hide);
61
- modal.element.appendChild(closeButton);
47
+ }).on("click", () => {
48
+ if (!modalEvents) {
49
+ return;
50
+ }
51
+ modalEvents.hide();
52
+ }).build();
53
+ modal.element.appendChild(closeButtonModel.element);
54
+ const show = modalEvents ? modalEvents.show : () => {
55
+ };
56
+ const hide = modalEvents ? modalEvents.hide : () => {
57
+ };
62
58
  return {
63
59
  element: modal.element,
64
- styles,
65
- events: {
66
- show: modal.events.show,
67
- hide: modal.events.hide
68
- }
60
+ styles: combineStyles(modal.styles, closeButtonModel.styles),
61
+ events: { show, hide }
69
62
  };
70
63
  };
71
64
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"full-screen.js","sources":["../../../../source/composite/carousel/elements/full-screen.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { close_large as iconCloseLarge } from '@universityofmaryland/web-icons-library/controls';\nimport { layout } from 'atomic';\n\ntype TypeFixedFullScreenProps = {\n content: HTMLElement;\n callback: () => void;\n};\n\nconst ELEMENT_CLOSE_BUTTON = 'carousel-fixed-screen-button';\n\nconst STYLES_FIXED_FULL_SCREEN = `\n\n\n .${ELEMENT_CLOSE_BUTTON} {\n position: absolute;\n top: 10px;\n right: 10px;\n }\n\n @media (${token.media.queries.tablet.min}) {\n .${ELEMENT_CLOSE_BUTTON} {\n top: calc(10vh - 22px);\n right: calc(10vw - 22px);\n }\n }\n\n .${ELEMENT_CLOSE_BUTTON} > svg {\n fill: ${token.color.white};\n width: 20px;\n height: 20px;\n }\n`;\n\nexport const createCompositeCarouselFullScreen = ({ content, callback }: TypeFixedFullScreenProps) => {\n const modal = layout.overlay.modal({ content, callback });\n const closeButton = document.createElement('button');\n let styles = STYLES_FIXED_FULL_SCREEN;\n\n styles += modal.styles;\n\n closeButton.setAttribute('type', 'button');\n closeButton.setAttribute('aria-label', 'Close');\n closeButton.classList.add(ELEMENT_CLOSE_BUTTON);\n closeButton.innerHTML = iconCloseLarge;\n closeButton.addEventListener('click', modal.events.hide);\n\n modal.element.appendChild(closeButton);\n\n return {\n element: modal.element,\n styles,\n events: {\n show: modal.events.show,\n hide: modal.events.hide,\n },\n };\n};\n"],"names":["layout.overlay.modal","iconCloseLarge"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,uBAAuB;AAE7B,MAAM,2BAA2B;AAAA;AAAA;AAAA,KAG5B,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMb,MAAM,MAAM,QAAQ,OAAO,GAAG;AAAA,OACnC,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMtB,oBAAoB;AAAA,YACb,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAMtB,MAAM,oCAAoC,CAAC,EAAE,SAAS,eAAyC;AACpG,QAAM,QAAQA,YAAqB,EAAE,SAAS,UAAU;AACxD,QAAM,cAAc,SAAS,cAAc,QAAQ;AACnD,MAAI,SAAS;AAEb,YAAU,MAAM;AAEhB,cAAY,aAAa,QAAQ,QAAQ;AACzC,cAAY,aAAa,cAAc,OAAO;AAC9C,cAAY,UAAU,IAAI,oBAAoB;AAC9C,cAAY,YAAYC;AACxB,cAAY,iBAAiB,SAAS,MAAM,OAAO,IAAI;AAEvD,QAAM,QAAQ,YAAY,WAAW;AAErC,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,MAAM,MAAM,OAAO;AAAA,MACnB,MAAM,MAAM,OAAO;AAAA,IAAA;AAAA,EACrB;AAEJ;"}
1
+ {"version":3,"file":"full-screen.js","sources":["../../../../source/composite/carousel/elements/full-screen.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { combineStyles } from '@universityofmaryland/web-utilities-library/styles';\nimport { close_large as iconCloseLarge } from '@universityofmaryland/web-icons-library/controls';\nimport { layout } from 'atomic';\n\ntype TypeFixedFullScreenProps = {\n content: HTMLElement;\n callback: () => void;\n};\n\ntype FullScreenModel = {\n element: HTMLElement;\n styles: string;\n events: {\n show: () => void;\n hide: () => void;\n };\n};\n\nexport const createCompositeCarouselFullScreen = ({ content }: TypeFixedFullScreenProps) => {\n const modal = layout.overlay.modal({ content });\n const modalEvents = modal.events;\n\n const closeButtonModel = new ElementBuilder('button')\n .withClassName('carousel-fixed-screen-button')\n .withAttribute('type', 'button')\n .withAria({ label: 'Close' })\n .withHTML(iconCloseLarge)\n .withStyles({\n element: {\n position: 'absolute',\n top: '10px',\n right: '10px',\n [`@media (${token.media.queries.tablet.min})`]: {\n top: 'calc(10vh - 22px)',\n right: 'calc(10vw - 22px)',\n },\n '& svg': {\n fill: token.color.white,\n width: '20px',\n height: '20px',\n },\n },\n })\n .on('click', () => {\n if (!modalEvents) {\n return;\n }\n modalEvents.hide();\n })\n .build();\n\n modal.element.appendChild(closeButtonModel.element);\n\n const show = modalEvents ? modalEvents.show : () => {};\n const hide = modalEvents ? modalEvents.hide : () => {};\n\n return {\n element: modal.element,\n styles: combineStyles(modal.styles, closeButtonModel.styles),\n events: { show, hide },\n } as FullScreenModel;\n};\n"],"names":["layout.overlay.modal","iconCloseLarge"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,MAAM,oCAAoC,CAAC,EAAE,cAAwC;AAC1F,QAAM,QAAQA,YAAqB,EAAE,SAAS;AAC9C,QAAM,cAAc,MAAM;AAE1B,QAAM,mBAAmB,IAAI,eAAe,QAAQ,EACjD,cAAc,8BAA8B,EAC5C,cAAc,QAAQ,QAAQ,EAC9B,SAAS,EAAE,OAAO,QAAA,CAAS,EAC3B,SAASC,WAAc,EACvB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MACV,KAAK;AAAA,MACL,OAAO;AAAA,MACP,CAAC,WAAW,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,QAC9C,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,MAAM,MAAM,MAAM;AAAA,QAClB,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA;AAAA,IACV;AAAA,EACF,CACD,EACA,GAAG,SAAS,MAAM;AACjB,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AACA,gBAAY,KAAA;AAAA,EACd,CAAC,EACA,MAAA;AAEH,QAAM,QAAQ,YAAY,iBAAiB,OAAO;AAElD,QAAM,OAAO,cAAc,YAAY,OAAO,MAAM;AAAA,EAAC;AACrD,QAAM,OAAO,cAAc,YAAY,OAAO,MAAM;AAAA,EAAC;AAErD,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,QAAQ,cAAc,MAAM,QAAQ,iBAAiB,MAAM;AAAA,IAC3D,QAAQ,EAAE,MAAM,KAAA;AAAA,EAAK;AAEzB;"}
@@ -2,10 +2,22 @@ type TypeCarouselImageProps = {
2
2
  slides: HTMLElement[];
3
3
  callback?: (index: number) => void;
4
4
  maxHeight?: number;
5
+ isThemeDark?: boolean;
6
+ includeButtonWrapper?: boolean;
5
7
  };
6
- export declare const createCompositeCarouselImage: (props: TypeCarouselImageProps) => {
7
- element: HTMLDivElement;
8
+ type CarouselImageModel = {
9
+ element: HTMLElement;
8
10
  styles: string;
11
+ buttons: {
12
+ prev: {
13
+ element: HTMLElement;
14
+ styles: string;
15
+ };
16
+ next: {
17
+ element: HTMLElement;
18
+ styles: string;
19
+ };
20
+ };
9
21
  events: {
10
22
  Load: () => void;
11
23
  EventMoveTo: (index: number) => void;
@@ -14,5 +26,6 @@ export declare const createCompositeCarouselImage: (props: TypeCarouselImageProp
14
26
  EventSlideRight: () => void;
15
27
  };
16
28
  };
29
+ export declare const createCompositeCarouselImage: (props: TypeCarouselImageProps) => CarouselImageModel;
17
30
  export {};
18
31
  //# sourceMappingURL=image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../../source/composite/carousel/elements/image.ts"],"names":[],"mappings":"AAMA,KAAK,sBAAsB,GAAG;IAC5B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAwNF,eAAO,MAAM,4BAA4B,GAAI,OAAO,sBAAsB;;;;;6BA6B1C,MAAM;;;;;CAyEhC,CAAC"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../../source/composite/carousel/elements/image.ts"],"names":[],"mappings":"AAOA,KAAK,sBAAsB,GAAG;IAC5B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,IAAI,EAAE;YAAE,OAAO,EAAE,WAAW,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE;YAAE,OAAO,EAAE,WAAW,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAC5G,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,IAAI,CAAC;QACjB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QACrC,WAAW,EAAE,MAAM,IAAI,CAAC;QACxB,cAAc,EAAE,MAAM,IAAI,CAAC;QAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;KAC7B,CAAC;CACH,CAAC;AAqLF,eAAO,MAAM,4BAA4B,GAAI,OAAO,sBAAsB,uBAuKpE,CAAC"}
@@ -1,142 +1,118 @@
1
1
  import * as token from "@universityofmaryland/web-token-library";
2
+ import { ElementBuilder } from "@universityofmaryland/web-builder-library";
2
3
  import { debounce } from "@universityofmaryland/web-utilities-library/performance";
3
4
  import { getResponsiveImageSize } from "@universityofmaryland/web-utilities-library/media";
4
5
  import { setupSwipeDetection } from "@universityofmaryland/web-utilities-library/events";
5
- import { arrow_right } from "@universityofmaryland/web-icons-library/arrows";
6
+ import { createCarouselNavButton, buttonColorsOnGray } from "./nav-button.js";
6
7
  const ANIMATION_DURATION = 500;
7
8
  const ATTRIBUTE_ACTIVE_SLIDE = "data-active-slide";
8
- const ELEMENT_CAROUSEL_DECLARATION = "carousel-image-slider-container";
9
- const ELEMENT_CAROUSEL_CONTAINER = "carousel-image-slider";
10
- const ELEMENT_CAROUSEL_SLIDE = "carousel-image-slide";
11
- const ELEMENT_CAROUSEL_SLIDER_BUTTON = "carousel-slider-button";
12
- const OVERWRITE_ACTIVE_SLIDE = `.${ELEMENT_CAROUSEL_SLIDE}[${ATTRIBUTE_ACTIVE_SLIDE}]`;
13
- const SliderButtons = `
14
- .${ELEMENT_CAROUSEL_SLIDER_BUTTON} {
15
- background-color: ${token.color.white};
16
- display: flex;
17
- justify-content: center;
18
- align-items: center;
19
- height: 40px;
20
- width: 40px;
21
- position: absolute;
22
- top: 50%;
23
- z-index: 99;
24
- }
25
-
26
- .${ELEMENT_CAROUSEL_SLIDER_BUTTON}:first-of-type {
27
- left: ${token.spacing.sm};
28
- }
29
-
30
- .${ELEMENT_CAROUSEL_SLIDER_BUTTON}:first-of-type svg {
31
- transform: rotate(180deg);
32
- }
33
-
34
- .${ELEMENT_CAROUSEL_SLIDER_BUTTON}:last-of-type {
35
- right: ${token.spacing.sm};
36
- }
37
-
38
- .${ELEMENT_CAROUSEL_SLIDER_BUTTON} svg {
39
- fill: ${token.color.black};
40
- width: 16px;
41
- }
42
- `;
43
- const SlideStyles = `
44
- .${ELEMENT_CAROUSEL_SLIDE} {
45
- height: 100%;
46
- width: 100%;
47
- position: absolute;
48
- left: 100%;
49
- display: none;
50
- transition: transform ${ANIMATION_DURATION}ms ease-in-out;
51
- }
52
-
53
- ${OVERWRITE_ACTIVE_SLIDE} {
54
- z-index: 99;
55
- left: 0;
56
- display: block;
57
- transform: translateX(0);
58
- }
59
- `;
60
- const SliderStyles = `
61
- .${ELEMENT_CAROUSEL_CONTAINER} {
62
- position: relative;
63
- }
64
- `;
65
- const STYLES_CAROUSEL_IMAGE_ELEMENT = `
66
- .${ELEMENT_CAROUSEL_DECLARATION} {
67
- overflow: hidden;
68
- }
69
-
70
- ${SliderStyles}
71
- ${SlideStyles}
72
- ${SliderButtons}
73
- `;
9
+ const BUTTON_CLASS_NEXT = "carousel-slider-button--next";
10
+ const BUTTON_CLASS_PREV = "carousel-slider-button--prev";
74
11
  const CreateButton = ({
75
12
  EventSlide,
76
- isRight = true
13
+ isRight = true,
14
+ isThemeDark
77
15
  }) => {
78
- const button = document.createElement("button");
79
- button.setAttribute("type", "button");
80
- button.classList.add(ELEMENT_CAROUSEL_SLIDER_BUTTON);
81
- button.innerHTML = arrow_right;
82
- if (!isRight) {
83
- button.setAttribute("aria-label", "Previous");
84
- } else {
85
- button.setAttribute("aria-label", "Next");
86
- }
87
- button.addEventListener("click", (event) => {
16
+ const buttonClassName = isRight ? BUTTON_CLASS_NEXT : BUTTON_CLASS_PREV;
17
+ const buttonDirection = isRight ? "next" : "prev";
18
+ return createCarouselNavButton({
19
+ className: buttonClassName,
20
+ direction: buttonDirection
21
+ }).withStyles({
22
+ element: {
23
+ position: "relative",
24
+ top: "auto",
25
+ left: "auto",
26
+ right: "auto",
27
+ zIndex: 99,
28
+ ...buttonColorsOnGray(isThemeDark),
29
+ [`@media (${token.media.queries.desktop.min})`]: {
30
+ position: "absolute",
31
+ top: "50%",
32
+ left: 0,
33
+ right: "auto",
34
+ ...isRight && {
35
+ left: "auto",
36
+ right: 0
37
+ }
38
+ }
39
+ }
40
+ }).on("click", (event) => {
41
+ const button = event.currentTarget;
88
42
  event.stopPropagation();
89
- if (isRight) EventSlide({});
90
- if (!isRight) EventSlide({ forward: false });
43
+ if (isRight) {
44
+ EventSlide({});
45
+ } else {
46
+ EventSlide({ forward: false });
47
+ }
91
48
  button.disabled = true;
92
49
  setTimeout(() => {
93
50
  button.disabled = false;
94
51
  }, ANIMATION_DURATION + 100);
95
- });
96
- return button;
52
+ }).build();
53
+ };
54
+ const CreateSlide = ({ slide }) => {
55
+ return new ElementBuilder(slide).withClassName("carousel-image-slide").withStyles({
56
+ element: {
57
+ height: "100%",
58
+ width: "100%",
59
+ position: "absolute",
60
+ left: "100%",
61
+ display: "none",
62
+ transition: `transform ${ANIMATION_DURATION}ms ease-in-out`,
63
+ "&[data-active-slide]": {
64
+ zIndex: 99,
65
+ left: 0,
66
+ display: "block",
67
+ transform: "translateX(0)"
68
+ }
69
+ }
70
+ }).build();
97
71
  };
98
72
  const SetCarouselSize = ({
99
73
  slider,
100
74
  activeSlide,
101
- transition = false,
102
75
  maxHeight
103
76
  }) => {
104
77
  const windowHeight = window.innerHeight - 48;
105
78
  const children = Array.from(activeSlide.children);
106
- const buttons = Array.from(
107
- slider.querySelectorAll(`.${ELEMENT_CAROUSEL_SLIDER_BUTTON}`)
108
- );
79
+ const sliderContainer = slider.parentElement;
80
+ const sliderWrapper = sliderContainer && sliderContainer.parentElement;
81
+ const buttonRoot = sliderWrapper || sliderContainer;
82
+ const buttons = buttonRoot ? Array.from(buttonRoot.querySelectorAll(`.${BUTTON_CLASS_PREV}, .${BUTTON_CLASS_NEXT}`)) : [];
109
83
  const img = activeSlide.querySelector("img");
110
- const maxWindowHeight = maxHeight ? maxHeight > windowHeight ? windowHeight : maxHeight : windowHeight;
84
+ const maxWindowHeight = Math.min(maxHeight || windowHeight, windowHeight);
111
85
  const imageSize = getResponsiveImageSize({
112
86
  image: img,
113
87
  parentNode: slider,
114
88
  maxWindowHeight
115
89
  });
116
- const imageContainer = children.find(
117
- (child) => child.contains(img)
118
- );
90
+ const imageContainer = children.find((child) => child.contains(img));
91
+ const isMobile = window.matchMedia(`(${token.media.queries.tablet.max})`).matches;
119
92
  let size = imageSize;
120
93
  imageContainer.style.height = `${imageSize}px`;
94
+ if (isMobile) {
95
+ buttons.forEach((button) => {
96
+ button.style.top = "";
97
+ });
98
+ } else {
99
+ buttons.forEach((button) => {
100
+ button.style.top = `${imageSize / 2 - button.offsetHeight / 2}px`;
101
+ });
102
+ }
121
103
  if (children.length > 1) {
122
- size = children.reduce((acc, currentElement) => {
123
- return currentElement.offsetHeight + acc;
104
+ size = children.reduce((accumulator, currentElement) => {
105
+ return currentElement.offsetHeight + accumulator;
124
106
  }, 0);
125
107
  }
126
- buttons.forEach((button) => button.style.top = `${imageSize / 2}px`);
127
- if (transition) {
128
- slider.style.transition = `height ${ANIMATION_DURATION}ms ease-in-out`;
129
- } else {
130
- slider.style.transition = `none`;
131
- }
132
108
  slider.style.height = `${size}px`;
133
109
  };
134
110
  const SlideActiveSlide = ({
135
111
  slide,
136
112
  isRight = true
137
113
  }) => {
138
- const transformDirection = isRight ? "translateX(-100%)" : "translateX(100%)";
139
- slide.style.transform = `${transformDirection}`;
114
+ const transformDirection = isRight ? "-100%" : "100%";
115
+ slide.style.transform = `translateX(${transformDirection})`;
140
116
  setTimeout(() => {
141
117
  slide.removeAttribute(ATTRIBUTE_ACTIVE_SLIDE);
142
118
  }, ANIMATION_DURATION);
@@ -149,14 +125,14 @@ const SlideUpcomingSlide = ({
149
125
  isRight = true
150
126
  }) => {
151
127
  const amount = "90";
152
- const transformDirection = isRight ? `translateX(-${amount}%)` : `translateX(${amount}%)`;
128
+ const translate = isRight ? `translateX(-${amount}%)` : `translateX(${amount}%)`;
153
129
  const startingPosition = isRight ? `${amount}%` : `-${amount}%`;
154
130
  slide.style.zIndex = "9";
155
131
  slide.style.transition = `transform ${ANIMATION_DURATION}ms ease-in-out`;
156
132
  slide.style.display = "block";
157
133
  slide.style.left = `${startingPosition}`;
158
134
  setTimeout(() => {
159
- slide.style.transform = `${transformDirection}`;
135
+ slide.style.transform = translate;
160
136
  }, 1);
161
137
  setTimeout(() => {
162
138
  slide.style.transition = "none";
@@ -169,92 +145,141 @@ const SlideUpcomingSlide = ({
169
145
  }, ANIMATION_DURATION + 100);
170
146
  };
171
147
  const createCompositeCarouselImage = (props) => (() => {
172
- const { slides, callback, maxHeight } = props;
173
- const container = document.createElement("div");
174
- const slider = document.createElement("div");
148
+ const { slides, callback, maxHeight, isThemeDark, includeButtonWrapper = true } = props;
175
149
  let activeIndex = 0;
176
- let styles = STYLES_CAROUSEL_IMAGE_ELEMENT;
150
+ let sliderElement = null;
177
151
  const EventSlide = ({ forward = true }) => {
178
152
  SlideActiveSlide({ slide: slides[activeIndex], isRight: forward });
179
153
  if (forward) {
180
154
  activeIndex = activeIndex + 1;
181
- if (activeIndex >= slides.length) activeIndex = 0;
155
+ if (activeIndex >= slides.length) {
156
+ activeIndex = 0;
157
+ }
182
158
  } else {
183
159
  activeIndex = activeIndex - 1;
184
- if (activeIndex < 0) activeIndex = slides.length - 1;
160
+ if (activeIndex < 0) {
161
+ activeIndex = slides.length - 1;
162
+ }
185
163
  }
186
164
  SlideUpcomingSlide({ slide: slides[activeIndex], isRight: forward });
187
- SetCarouselSize({
188
- slider,
189
- activeSlide: slides[activeIndex],
190
- transition: true,
191
- maxHeight
192
- });
193
- if (callback) callback(activeIndex);
165
+ if (sliderElement) {
166
+ SetCarouselSize({
167
+ slider: sliderElement,
168
+ activeSlide: slides[activeIndex],
169
+ maxHeight
170
+ });
171
+ }
172
+ if (callback) {
173
+ callback(activeIndex);
174
+ }
194
175
  };
195
176
  const EventMoveTo = (index) => {
196
177
  SlideActiveSlide({ slide: slides[activeIndex], isRight: true });
197
178
  activeIndex = index;
198
179
  SlideUpcomingSlide({ slide: slides[activeIndex], isRight: true });
199
- SetCarouselSize({
200
- slider,
201
- activeSlide: slides[activeIndex],
202
- transition: true,
203
- maxHeight
204
- });
205
- if (callback) callback(activeIndex);
180
+ if (sliderElement) {
181
+ SetCarouselSize({
182
+ slider: sliderElement,
183
+ activeSlide: slides[activeIndex],
184
+ maxHeight
185
+ });
186
+ }
187
+ if (callback) {
188
+ callback(activeIndex);
189
+ }
206
190
  };
207
191
  const EventSlideLeft = () => EventSlide({ forward: false });
208
192
  const EventSlideRight = () => EventSlide({ forward: true });
209
193
  const EventSwipe = () => {
210
- const swipes = (isrightswipe) => {
211
- if (!isrightswipe) {
194
+ const swipes = (isRightSwipe) => {
195
+ if (!isRightSwipe) {
212
196
  EventSlide({ forward: true });
213
197
  } else {
214
198
  EventSlide({ forward: false });
215
199
  }
216
200
  };
217
- setupSwipeDetection({
218
- container: slider,
219
- callback: swipes
220
- });
201
+ if (sliderElement) {
202
+ setupSwipeDetection({ container: sliderElement, callback: swipes });
203
+ }
221
204
  };
222
205
  const EventResize = () => {
223
- SetCarouselSize({ slider, activeSlide: slides[activeIndex], maxHeight });
206
+ if (!sliderElement || sliderElement.offsetWidth === 0) {
207
+ return;
208
+ }
209
+ SetCarouselSize({
210
+ slider: sliderElement,
211
+ activeSlide: slides[activeIndex],
212
+ maxHeight
213
+ });
224
214
  };
225
215
  const Load = () => {
226
216
  const setSize = () => {
217
+ if (!sliderElement) return;
227
218
  const activeSlide = slides[activeIndex];
228
- SetCarouselSize({ slider, activeSlide, maxHeight });
219
+ SetCarouselSize({ slider: sliderElement, activeSlide, maxHeight });
229
220
  activeSlide.setAttribute(ATTRIBUTE_ACTIVE_SLIDE, "");
230
221
  };
231
222
  setTimeout(setSize, 100);
232
223
  setTimeout(setSize, 300);
233
224
  };
234
- slider.classList.add(ELEMENT_CAROUSEL_CONTAINER);
235
- slides.forEach((slide) => slide.classList.add(ELEMENT_CAROUSEL_SLIDE));
236
- slider.append(...slides);
237
- slider.appendChild(CreateButton({ EventSlide, isRight: false }));
238
- slider.appendChild(
239
- CreateButton({
240
- EventSlide,
241
- isRight: true
242
- })
243
- );
244
- container.classList.add(ELEMENT_CAROUSEL_DECLARATION);
245
- container.appendChild(slider);
225
+ const prevButtonModel = CreateButton({ EventSlide, isRight: false, isThemeDark });
226
+ const nextButtonModel = CreateButton({ EventSlide, isRight: true, isThemeDark });
227
+ const slidesElements = slides.map((slide) => CreateSlide({ slide }));
228
+ const sliderModel = new ElementBuilder().withClassName("carousel-image-slider").withStyles({
229
+ element: {
230
+ position: "relative",
231
+ overflow: "hidden",
232
+ width: "100%"
233
+ }
234
+ }).ref((element) => {
235
+ sliderElement = element;
236
+ }).withChildren(...slidesElements).build();
237
+ const containerBuilder = new ElementBuilder().withClassName("carousel-image-slider-container").withStyles({
238
+ element: {
239
+ position: "relative",
240
+ width: "100%",
241
+ ...includeButtonWrapper && {
242
+ display: "flex",
243
+ flexWrap: "wrap",
244
+ justifyContent: "center",
245
+ [`@media (${token.media.queries.desktop.min})`]: {
246
+ display: "block"
247
+ }
248
+ }
249
+ }
250
+ }).withChild(sliderModel);
251
+ if (includeButtonWrapper) {
252
+ const buttonWrapperModel = new ElementBuilder().withClassName("carousel-image-slider-buttons").withStyles({
253
+ element: {
254
+ display: "flex",
255
+ justifyContent: "center",
256
+ gap: token.spacing.min,
257
+ width: "100%",
258
+ marginTop: token.spacing.md,
259
+ marginBottom: token.spacing.md,
260
+ [`@media (${token.media.queries.desktop.min})`]: {
261
+ width: "auto",
262
+ marginTop: 0,
263
+ marginBottom: 0
264
+ }
265
+ }
266
+ }).withChildren(prevButtonModel, nextButtonModel).build();
267
+ containerBuilder.withChild(buttonWrapperModel);
268
+ }
269
+ const containerModel = containerBuilder.withEvents({
270
+ Load,
271
+ EventMoveTo,
272
+ EventResize,
273
+ EventSlideLeft,
274
+ EventSlideRight
275
+ }).build();
246
276
  window.addEventListener("resize", debounce(EventResize, 10));
247
277
  EventSwipe();
248
278
  return {
249
- element: container,
250
- styles,
251
- events: {
252
- Load,
253
- EventMoveTo,
254
- EventResize,
255
- EventSlideLeft,
256
- EventSlideRight
257
- }
279
+ element: containerModel.element,
280
+ styles: containerModel.styles,
281
+ buttons: { prev: prevButtonModel, next: nextButtonModel },
282
+ events: containerModel.events
258
283
  };
259
284
  })();
260
285
  export {