@universityofmaryland/web-elements-library 1.6.16 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +1 -1
  2. package/dist/atomic/animations/brand/card-stack.js +2 -3
  3. package/dist/atomic/animations/brand/card-stack.js.map +1 -1
  4. package/dist/atomic/animations/brand/chevron-flow.d.ts +1 -7
  5. package/dist/atomic/animations/brand/chevron-flow.d.ts.map +1 -1
  6. package/dist/atomic/animations/brand/chevron-flow.js +82 -159
  7. package/dist/atomic/animations/brand/chevron-flow.js.map +1 -1
  8. package/dist/atomic/animations/brand/chevron-scroll.d.ts +1 -4
  9. package/dist/atomic/animations/brand/chevron-scroll.d.ts.map +1 -1
  10. package/dist/atomic/animations/brand/chevron-scroll.js +89 -143
  11. package/dist/atomic/animations/brand/chevron-scroll.js.map +1 -1
  12. package/dist/atomic/assets/image/caption.d.ts +9 -0
  13. package/dist/atomic/assets/image/caption.d.ts.map +1 -0
  14. package/dist/atomic/assets/image/caption.js +166 -0
  15. package/dist/atomic/assets/image/caption.js.map +1 -0
  16. package/dist/atomic/assets/image/gif.d.ts.map +1 -1
  17. package/dist/atomic/assets/image/gif.js +6 -1
  18. package/dist/atomic/assets/image/gif.js.map +1 -1
  19. package/dist/atomic/assets/image/index.d.ts +1 -0
  20. package/dist/atomic/assets/image/index.d.ts.map +1 -1
  21. package/dist/atomic/assets/image/index.js +2 -0
  22. package/dist/atomic/assets/image/index.js.map +1 -1
  23. package/dist/atomic/assets/video/toggle.d.ts.map +1 -1
  24. package/dist/atomic/assets/video/toggle.js +9 -2
  25. package/dist/atomic/assets/video/toggle.js.map +1 -1
  26. package/dist/atomic/buttons/fullscreen.d.ts +1 -0
  27. package/dist/atomic/buttons/fullscreen.d.ts.map +1 -1
  28. package/dist/atomic/buttons/fullscreen.js +35 -3
  29. package/dist/atomic/buttons/fullscreen.js.map +1 -1
  30. package/dist/atomic/layout/overlay/modal.d.ts +1 -10
  31. package/dist/atomic/layout/overlay/modal.d.ts.map +1 -1
  32. package/dist/atomic/layout/overlay/modal.js +28 -44
  33. package/dist/atomic/layout/overlay/modal.js.map +1 -1
  34. package/dist/atomic/layout/person/columns.js +2 -3
  35. package/dist/atomic/layout/person/columns.js.map +1 -1
  36. package/dist/atomic/text-lockup/date.d.ts +1 -4
  37. package/dist/atomic/text-lockup/date.d.ts.map +1 -1
  38. package/dist/atomic/text-lockup/date.js +42 -75
  39. package/dist/atomic/text-lockup/date.js.map +1 -1
  40. package/dist/composite/accordion/item.d.ts +3 -16
  41. package/dist/composite/accordion/item.d.ts.map +1 -1
  42. package/dist/composite/accordion/item.js +152 -245
  43. package/dist/composite/accordion/item.js.map +1 -1
  44. package/dist/composite/card/block.js +2 -3
  45. package/dist/composite/card/block.js.map +1 -1
  46. package/dist/composite/card/event-time.js +2 -3
  47. package/dist/composite/card/event-time.js.map +1 -1
  48. package/dist/composite/card/list.js +2 -3
  49. package/dist/composite/card/list.js.map +1 -1
  50. package/dist/composite/card/overlay/color.js +3 -3
  51. package/dist/composite/card/overlay/icon.js +3 -3
  52. package/dist/composite/card/overlay/image.d.ts.map +1 -1
  53. package/dist/composite/card/overlay/image.js +9 -12
  54. package/dist/composite/card/overlay/image.js.map +1 -1
  55. package/dist/composite/card/video/block.js +4 -3
  56. package/dist/composite/card/video/block.js.map +1 -1
  57. package/dist/composite/carousel/cards/index.d.ts +1 -8
  58. package/dist/composite/carousel/cards/index.d.ts.map +1 -1
  59. package/dist/composite/carousel/cards/index.js +163 -282
  60. package/dist/composite/carousel/cards/index.js.map +1 -1
  61. package/dist/composite/carousel/default/index.d.ts +9 -15
  62. package/dist/composite/carousel/default/index.d.ts.map +1 -1
  63. package/dist/composite/carousel/default/index.js +78 -129
  64. package/dist/composite/carousel/default/index.js.map +1 -1
  65. package/dist/composite/carousel/elements/equal-width-items.d.ts +37 -0
  66. package/dist/composite/carousel/elements/equal-width-items.d.ts.map +1 -0
  67. package/dist/composite/carousel/elements/{blocks.js → equal-width-items.js} +157 -227
  68. package/dist/composite/carousel/elements/equal-width-items.js.map +1 -0
  69. package/dist/composite/carousel/elements/full-screen.d.ts +3 -2
  70. package/dist/composite/carousel/elements/full-screen.d.ts.map +1 -1
  71. package/dist/composite/carousel/elements/full-screen.js +34 -41
  72. package/dist/composite/carousel/elements/full-screen.js.map +1 -1
  73. package/dist/composite/carousel/elements/image.d.ts +15 -2
  74. package/dist/composite/carousel/elements/image.d.ts.map +1 -1
  75. package/dist/composite/carousel/elements/image.js +176 -151
  76. package/dist/composite/carousel/elements/image.js.map +1 -1
  77. package/dist/composite/carousel/elements/index.d.ts +4 -1
  78. package/dist/composite/carousel/elements/index.d.ts.map +1 -1
  79. package/dist/composite/carousel/elements/indicator-wrapper.d.ts +13 -0
  80. package/dist/composite/carousel/elements/indicator-wrapper.d.ts.map +1 -0
  81. package/dist/composite/carousel/elements/indicator-wrapper.js +67 -0
  82. package/dist/composite/carousel/elements/indicator-wrapper.js.map +1 -0
  83. package/dist/composite/carousel/elements/nav-button.d.ts +82 -0
  84. package/dist/composite/carousel/elements/nav-button.d.ts.map +1 -0
  85. package/dist/composite/carousel/elements/nav-button.js +164 -0
  86. package/dist/composite/carousel/elements/nav-button.js.map +1 -0
  87. package/dist/composite/carousel/elements/overlay.d.ts +3 -2
  88. package/dist/composite/carousel/elements/overlay.d.ts.map +1 -1
  89. package/dist/composite/carousel/elements/overlay.js +85 -55
  90. package/dist/composite/carousel/elements/overlay.js.map +1 -1
  91. package/dist/composite/carousel/image/multiple.d.ts +2 -7
  92. package/dist/composite/carousel/image/multiple.d.ts.map +1 -1
  93. package/dist/composite/carousel/image/multiple.js +85 -150
  94. package/dist/composite/carousel/image/multiple.js.map +1 -1
  95. package/dist/composite/carousel/image/standard.d.ts +2 -7
  96. package/dist/composite/carousel/image/standard.d.ts.map +1 -1
  97. package/dist/composite/carousel/image/standard.js +148 -262
  98. package/dist/composite/carousel/image/standard.js.map +1 -1
  99. package/dist/composite/carousel/thumbnail/index.d.ts +1 -8
  100. package/dist/composite/carousel/thumbnail/index.d.ts.map +1 -1
  101. package/dist/composite/carousel/thumbnail/index.js +72 -113
  102. package/dist/composite/carousel/thumbnail/index.js.map +1 -1
  103. package/dist/composite/carousel/wide/container.d.ts +21 -20
  104. package/dist/composite/carousel/wide/container.d.ts.map +1 -1
  105. package/dist/composite/carousel/wide/container.js +37 -12
  106. package/dist/composite/carousel/wide/container.js.map +1 -1
  107. package/dist/composite/carousel/wide/controls.d.ts +5 -10
  108. package/dist/composite/carousel/wide/controls.d.ts.map +1 -1
  109. package/dist/composite/carousel/wide/controls.js +24 -94
  110. package/dist/composite/carousel/wide/controls.js.map +1 -1
  111. package/dist/composite/carousel/wide/frames.d.ts +18 -10
  112. package/dist/composite/carousel/wide/frames.d.ts.map +1 -1
  113. package/dist/composite/carousel/wide/frames.js +60 -78
  114. package/dist/composite/carousel/wide/frames.js.map +1 -1
  115. package/dist/composite/carousel/wide/index.d.ts.map +1 -1
  116. package/dist/composite/carousel/wide/index.js +11 -19
  117. package/dist/composite/carousel/wide/index.js.map +1 -1
  118. package/dist/composite/hero/custom/expand.js +3 -4
  119. package/dist/composite/hero/custom/expand.js.map +1 -1
  120. package/dist/composite/hero/custom/grid.js +2 -3
  121. package/dist/composite/hero/custom/grid.js.map +1 -1
  122. package/dist/composite/hero/custom/video-arrow.js +4 -3
  123. package/dist/composite/hero/custom/video-arrow.js.map +1 -1
  124. package/dist/composite/hero/logo.js +3 -3
  125. package/dist/composite/hero/minimal.js +3 -3
  126. package/dist/composite/hero/overlay.js +5 -4
  127. package/dist/composite/hero/overlay.js.map +1 -1
  128. package/dist/composite/hero/stacked.js +3 -3
  129. package/dist/composite/hero/standard.js +4 -3
  130. package/dist/composite/hero/standard.js.map +1 -1
  131. package/dist/composite/layout/box/logo.d.ts +1 -4
  132. package/dist/composite/layout/box/logo.d.ts.map +1 -1
  133. package/dist/composite/layout/box/logo.js +55 -103
  134. package/dist/composite/layout/box/logo.js.map +1 -1
  135. package/dist/composite/layout/image/expand.d.ts +1 -4
  136. package/dist/composite/layout/image/expand.d.ts.map +1 -1
  137. package/dist/composite/layout/image/expand.js +136 -243
  138. package/dist/composite/layout/image/expand.js.map +1 -1
  139. package/dist/composite/layout/scroll-top/index.d.ts +1 -7
  140. package/dist/composite/layout/scroll-top/index.d.ts.map +1 -1
  141. package/dist/composite/layout/scroll-top/index.js +65 -77
  142. package/dist/composite/layout/scroll-top/index.js.map +1 -1
  143. package/dist/composite/layout/sticky-columns/index.d.ts +2 -2
  144. package/dist/composite/layout/sticky-columns/index.d.ts.map +1 -1
  145. package/dist/composite/layout/sticky-columns/index.js +42 -70
  146. package/dist/composite/layout/sticky-columns/index.js.map +1 -1
  147. package/dist/composite/media/elements/gif.js +3 -3
  148. package/dist/composite/media/inline/caption.d.ts +4 -2
  149. package/dist/composite/media/inline/caption.d.ts.map +1 -1
  150. package/dist/composite/media/inline/caption.js +56 -67
  151. package/dist/composite/media/inline/caption.js.map +1 -1
  152. package/dist/composite/media/inline/index.d.ts +9 -8
  153. package/dist/composite/media/inline/index.d.ts.map +1 -1
  154. package/dist/composite/media/inline/standard.d.ts +1 -4
  155. package/dist/composite/media/inline/standard.d.ts.map +1 -1
  156. package/dist/composite/media/inline/standard.js +16 -24
  157. package/dist/composite/media/inline/standard.js.map +1 -1
  158. package/dist/composite/media/inline/wrapped.d.ts +4 -2
  159. package/dist/composite/media/inline/wrapped.d.ts.map +1 -1
  160. package/dist/composite/media/inline/wrapped.js +80 -83
  161. package/dist/composite/media/inline/wrapped.js.map +1 -1
  162. package/dist/composite/navigation/elements/slider/slide-first.d.ts.map +1 -1
  163. package/dist/composite/navigation/elements/slider/slide-first.js +4 -1
  164. package/dist/composite/navigation/elements/slider/slide-first.js.map +1 -1
  165. package/dist/composite/navigation/utility/alert.js +3 -4
  166. package/dist/composite/navigation/utility/alert.js.map +1 -1
  167. package/dist/composite/pathway/_common.js +4 -3
  168. package/dist/composite/pathway/_common.js.map +1 -1
  169. package/dist/composite/pathway/hero.js +3 -3
  170. package/dist/composite/person/bio/full.js +3 -3
  171. package/dist/composite/person/bio/small.js +2 -3
  172. package/dist/composite/person/bio/small.js.map +1 -1
  173. package/dist/composite/person/block.js +2 -3
  174. package/dist/composite/person/block.js.map +1 -1
  175. package/dist/composite/person/hero.js +3 -3
  176. package/dist/composite/person/list.js +2 -3
  177. package/dist/composite/person/list.js.map +1 -1
  178. package/dist/composite/person/tabular.js +2 -3
  179. package/dist/composite/person/tabular.js.map +1 -1
  180. package/dist/composite/slider/events.d.ts +6 -12
  181. package/dist/composite/slider/events.d.ts.map +1 -1
  182. package/dist/composite/slider/events.js +304 -428
  183. package/dist/composite/slider/events.js.map +1 -1
  184. package/dist/layout/image.d.ts +5 -10
  185. package/dist/layout/image.d.ts.map +1 -1
  186. package/dist/layout/image.js +27 -88
  187. package/dist/layout/image.js.map +1 -1
  188. package/dist/layout/index.d.ts +1 -1
  189. package/dist/layout/index.d.ts.map +1 -1
  190. package/dist/layout.js +2 -2
  191. package/package.json +5 -5
  192. package/dist/composite/carousel/elements/blocks.d.ts +0 -42
  193. package/dist/composite/carousel/elements/blocks.d.ts.map +0 -1
  194. package/dist/composite/carousel/elements/blocks.js.map +0 -1
  195. package/dist/composite/carousel/wide/_elementModel.d.ts +0 -18
  196. package/dist/composite/carousel/wide/_elementModel.d.ts.map +0 -1
  197. package/dist/composite/carousel/wide/_elementModel.js +0 -29
  198. package/dist/composite/carousel/wide/_elementModel.js.map +0 -1
@@ -1,5 +1,2 @@
1
- export declare const createAnimationChevronScroll: () => {
2
- element: HTMLDivElement;
3
- styles: string;
4
- };
1
+ export declare const createAnimationChevronScroll: () => import('../../../../builder/dist/index.d.ts').ElementModel<HTMLElement>;
5
2
  //# sourceMappingURL=chevron-scroll.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chevron-scroll.d.ts","sourceRoot":"","sources":["../../../../source/atomic/animations/brand/chevron-scroll.ts"],"names":[],"mappings":"AAwJA,eAAO,MAAM,4BAA4B;;;CAyBnC,CAAC"}
1
+ {"version":3,"file":"chevron-scroll.d.ts","sourceRoot":"","sources":["../../../../source/atomic/animations/brand/chevron-scroll.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,4BAA4B,qFA+GnC,CAAC"}
@@ -1,167 +1,113 @@
1
1
  import * as token from "@universityofmaryland/web-token-library";
2
+ import { ElementBuilder } from "@universityofmaryland/web-builder-library";
3
+ import { withViewTimelineAnimation } from "@universityofmaryland/web-utilities-library/styles";
2
4
  const ICON_CHEVRON_BIG = `<svg width="252" height="306" aria-hidden="true" viewBox="0 0 252 306" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M126 0H0L126 152.706L0 305.411H126L252 152.706L126 0Z" /></svg>`;
3
5
  const ICON_CHEVRON_SMALL = `<svg width="144" height="202" aria-hidden="true" viewBox="0 0 144 202" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M60.3972 0H0L83.6028 100.765L0 201.529H60.3972L144 100.765L60.3972 0Z" /></svg>`;
4
- const ELEMENT_ANIMATION_BRAND_LOGO = "brand-logo-container";
5
- const ELEMENT_FIRST_CHEVRON = "brand-logo-first-chevron";
6
- const ELEMENT_SECOND_CHEVRON = "brand-logo-second-chevron";
7
- const ELEMENT_THIRD_CHEVRON = "brand-logo-third-chevron";
8
- const FirstChevronStyles = `
6
+ const KEYFRAMES = `
9
7
  @keyframes chevron-one {
10
8
  from { transform: translateX(-80%); }
11
9
  to { transform: translateX(40%); }
12
10
  }
13
11
 
14
- .${ELEMENT_FIRST_CHEVRON} {
15
- top: 0;
16
- transform: translateX(-80%);
17
- }
18
-
19
- .${ELEMENT_FIRST_CHEVRON} svg {
20
- fill: ${token.color.gold};
21
- }
22
-
23
- @media (prefers-reduced-motion: no-preference) {
24
- @supports (animation-timeline: scroll()) {
25
- .${ELEMENT_FIRST_CHEVRON} {
26
- transform: translateX(40%);
27
- animation: chevron-one forwards;
28
- animation-timeline: view();
29
- animation-range-start: cover;
30
- animation-range-end: contain;
31
- }
32
- }
33
- }
34
- `;
35
- const SecondChevronStyles = `
36
12
  @keyframes chevron-two {
37
13
  from { transform: translateX(-40%); }
38
14
  to { transform: translateX(24%); }
39
15
  }
40
16
 
41
- .${ELEMENT_SECOND_CHEVRON} {
42
- top: 10%;
43
- z-index: 99;
44
- transform: translateX(-40%);
45
- }
46
-
47
- @media (${token.media.queries.highDef.min}) {
48
- .${ELEMENT_SECOND_CHEVRON} {
49
- top: 95px;
50
- }
51
- }
52
-
53
- .${ELEMENT_SECOND_CHEVRON} svg {
54
- fill: ${token.color.red};
55
- }
56
-
57
- @media (prefers-reduced-motion: no-preference) {
58
- @supports (animation-timeline: scroll()) {
59
- .${ELEMENT_SECOND_CHEVRON} {
60
- transform: translateX(24%);
61
- animation: chevron-two forwards;
62
- animation-timeline: view();
63
- animation-range-start: cover;
64
- animation-range-end: contain;
65
- }
66
- }
67
- }
68
- `;
69
- const ThirdChevronStyles = `
70
17
  @keyframes chevron-three {
71
18
  from { transform: translateX(-30%); }
72
19
  to { transform: translateX(60%); }
73
20
  }
74
-
75
- .${ELEMENT_THIRD_CHEVRON} {
76
- top: 25%;
77
- transform: translateX(-30%);
78
- }
79
-
80
- @media (${token.media.queries.highDef.min}) {
81
- .${ELEMENT_THIRD_CHEVRON} {
82
- top: 195px;
21
+ `;
22
+ const createAnimationChevronScroll = () => (() => {
23
+ const firstChevron = new ElementBuilder().withClassName("brand-logo-first-chevron").withHTML(ICON_CHEVRON_SMALL).withStyles({
24
+ element: {
25
+ top: "0",
26
+ transform: "translateX(-80%)",
27
+ "& svg": {
28
+ fill: token.color.gold,
29
+ height: "7vw",
30
+ width: "5vw",
31
+ [`@media (${token.media.queries.highDef.min})`]: {
32
+ height: "202px",
33
+ width: "144px"
34
+ }
35
+ },
36
+ ...withViewTimelineAnimation({
37
+ transform: "translateX(40%)",
38
+ animation: "chevron-one forwards",
39
+ animationTimeline: "view()",
40
+ animationRangeStart: "cover",
41
+ animationRangeEnd: "contain"
42
+ })
83
43
  }
84
- }
85
-
86
- .${ELEMENT_THIRD_CHEVRON} svg {
87
- fill: ${token.color.black};
88
- }
89
-
90
- @media (prefers-reduced-motion: no-preference) {
91
- @supports (animation-timeline: scroll()) {
92
- .${ELEMENT_THIRD_CHEVRON} {
93
- transform: translateX(60%);
94
- animation: chevron-three forwards;
95
- animation-timeline: view();
96
- animation-range-start: 0;
97
- animation-range-end: 100vh;
98
- }
44
+ }).build();
45
+ const secondChevron = new ElementBuilder().withClassName("brand-logo-second-chevron").withHTML(ICON_CHEVRON_BIG).withStyles({
46
+ element: {
47
+ top: "10%",
48
+ zIndex: 99,
49
+ transform: "translateX(-40%)",
50
+ "& svg": {
51
+ fill: token.color.red,
52
+ height: "10vw",
53
+ width: "8.2vw",
54
+ [`@media (${token.media.queries.highDef.min})`]: {
55
+ height: "306px",
56
+ width: "252px"
57
+ }
58
+ },
59
+ [`@media (${token.media.queries.highDef.min})`]: {
60
+ top: "95px"
61
+ },
62
+ ...withViewTimelineAnimation({
63
+ transform: "translateX(24%)",
64
+ animation: "chevron-two forwards",
65
+ animationTimeline: "view()",
66
+ animationRangeStart: "cover",
67
+ animationRangeEnd: "contain"
68
+ })
99
69
  }
100
- }
101
- `;
102
- const STYLES_ANIMATION_BRAND_LOGO = `
103
- .${ELEMENT_ANIMATION_BRAND_LOGO} {
104
- position: relative;
105
- height: 50vw;
106
- width: 100vw;
107
- }
108
-
109
- .${ELEMENT_ANIMATION_BRAND_LOGO} > * {
110
- position: absolute;
111
- height: 100%;
112
- right: 0;
113
- transform: none;
114
- }
115
-
116
- .${ELEMENT_SECOND_CHEVRON} svg,
117
- .${ELEMENT_THIRD_CHEVRON} svg {
118
- height: 10vw;
119
- width: 8.2vw;
120
- }
121
-
122
- @media (${token.media.queries.highDef.min}) {
123
- .${ELEMENT_SECOND_CHEVRON} svg,
124
- .${ELEMENT_THIRD_CHEVRON} svg {
125
- height: 306px;
126
- width: 252px;
70
+ }).build();
71
+ const thirdChevron = new ElementBuilder().withClassName("brand-logo-third-chevron").withHTML(ICON_CHEVRON_BIG).withStyles({
72
+ element: {
73
+ top: "25%",
74
+ transform: "translateX(-30%)",
75
+ "& svg": {
76
+ fill: token.color.black,
77
+ height: "10vw",
78
+ width: "8.2vw",
79
+ [`@media (${token.media.queries.highDef.min})`]: {
80
+ height: "306px",
81
+ width: "252px"
82
+ }
83
+ },
84
+ [`@media (${token.media.queries.highDef.min})`]: {
85
+ top: "195px"
86
+ },
87
+ ...withViewTimelineAnimation({
88
+ transform: "translateX(60%)",
89
+ animation: "chevron-three forwards",
90
+ animationTimeline: "view()",
91
+ animationRangeStart: "0",
92
+ animationRangeEnd: "100vh"
93
+ })
127
94
  }
128
- }
129
-
130
- .${FirstChevronStyles} svg {
131
- height: 7vw;
132
- width: 5vw;
133
- }
134
-
135
- @media (${token.media.queries.highDef.min}) {
136
- .${FirstChevronStyles} svg {
137
- height: 202px;
138
- width: 144px;
95
+ }).build();
96
+ const container = new ElementBuilder().withClassName("brand-logo-container").withStyles({
97
+ element: {
98
+ position: "relative",
99
+ height: "50vw",
100
+ width: "100vw",
101
+ "& > *": {
102
+ position: "absolute",
103
+ height: "100%",
104
+ right: "0",
105
+ transform: "none"
106
+ }
139
107
  }
140
- }
141
-
142
- ${FirstChevronStyles}
143
- ${SecondChevronStyles}
144
- ${ThirdChevronStyles}
145
- `;
146
- const createAnimationChevronScroll = () => (() => {
147
- const container = document.createElement("div");
148
- const first = document.createElement("div");
149
- const second = document.createElement("div");
150
- const third = document.createElement("div");
151
- first.classList.add(ELEMENT_FIRST_CHEVRON);
152
- first.innerHTML = ICON_CHEVRON_SMALL;
153
- second.classList.add(ELEMENT_SECOND_CHEVRON);
154
- second.innerHTML = ICON_CHEVRON_BIG;
155
- third.classList.add(ELEMENT_THIRD_CHEVRON);
156
- third.innerHTML = ICON_CHEVRON_BIG;
157
- container.classList.add(ELEMENT_ANIMATION_BRAND_LOGO);
158
- container.appendChild(first);
159
- container.appendChild(second);
160
- container.appendChild(third);
161
- return {
162
- element: container,
163
- styles: STYLES_ANIMATION_BRAND_LOGO
164
- };
108
+ }).withChildren(firstChevron, secondChevron, thirdChevron).build();
109
+ container.styles += KEYFRAMES;
110
+ return container;
165
111
  })();
166
112
  export {
167
113
  createAnimationChevronScroll
@@ -1 +1 @@
1
- {"version":3,"file":"chevron-scroll.js","sources":["../../../../source/atomic/animations/brand/chevron-scroll.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\n\nconst ICON_CHEVRON_BIG = `<svg width=\"252\" height=\"306\" aria-hidden=\"true\" viewBox=\"0 0 252 306\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M126 0H0L126 152.706L0 305.411H126L252 152.706L126 0Z\" /></svg>`;\nconst ICON_CHEVRON_SMALL = `<svg width=\"144\" height=\"202\" aria-hidden=\"true\" viewBox=\"0 0 144 202\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M60.3972 0H0L83.6028 100.765L0 201.529H60.3972L144 100.765L60.3972 0Z\" /></svg>`;\n\nconst ELEMENT_ANIMATION_BRAND_LOGO = 'brand-logo-container';\nconst ELEMENT_FIRST_CHEVRON = 'brand-logo-first-chevron';\nconst ELEMENT_SECOND_CHEVRON = 'brand-logo-second-chevron';\nconst ELEMENT_THIRD_CHEVRON = 'brand-logo-third-chevron';\n\nconst FirstChevronStyles = `\n @keyframes chevron-one {\n from { transform: translateX(-80%); }\n to { transform: translateX(40%); }\n }\n\n .${ELEMENT_FIRST_CHEVRON} {\n top: 0;\n transform: translateX(-80%);\n }\n\n .${ELEMENT_FIRST_CHEVRON} svg {\n fill: ${token.color.gold};\n }\n\n @media (prefers-reduced-motion: no-preference) {\n @supports (animation-timeline: scroll()) {\n .${ELEMENT_FIRST_CHEVRON} {\n transform: translateX(40%);\n animation: chevron-one forwards;\n animation-timeline: view();\n animation-range-start: cover;\n animation-range-end: contain;\n }\n }\n }\n`;\n\nconst SecondChevronStyles = `\n @keyframes chevron-two {\n from { transform: translateX(-40%); }\n to { transform: translateX(24%); }\n }\n\n .${ELEMENT_SECOND_CHEVRON} {\n top: 10%;\n z-index: 99;\n transform: translateX(-40%);\n }\n\n @media (${token.media.queries.highDef.min}) {\n .${ELEMENT_SECOND_CHEVRON} {\n top: 95px;\n }\n }\n\n .${ELEMENT_SECOND_CHEVRON} svg {\n fill: ${token.color.red};\n }\n\n @media (prefers-reduced-motion: no-preference) {\n @supports (animation-timeline: scroll()) {\n .${ELEMENT_SECOND_CHEVRON} {\n transform: translateX(24%);\n animation: chevron-two forwards;\n animation-timeline: view();\n animation-range-start: cover;\n animation-range-end: contain;\n }\n }\n }\n`;\n\nconst ThirdChevronStyles = `\n @keyframes chevron-three {\n from { transform: translateX(-30%); }\n to { transform: translateX(60%); }\n }\n\n .${ELEMENT_THIRD_CHEVRON} {\n top: 25%;\n transform: translateX(-30%);\n }\n\n @media (${token.media.queries.highDef.min}) {\n .${ELEMENT_THIRD_CHEVRON} {\n top: 195px;\n }\n }\n\n .${ELEMENT_THIRD_CHEVRON} svg {\n fill: ${token.color.black};\n }\n\n @media (prefers-reduced-motion: no-preference) {\n @supports (animation-timeline: scroll()) {\n .${ELEMENT_THIRD_CHEVRON} {\n transform: translateX(60%);\n animation: chevron-three forwards;\n animation-timeline: view();\n animation-range-start: 0;\n animation-range-end: 100vh;\n }\n }\n }\n`;\n\nconst STYLES_ANIMATION_BRAND_LOGO = `\n .${ELEMENT_ANIMATION_BRAND_LOGO} {\n position: relative;\n height: 50vw;\n width: 100vw;\n }\n\n .${ELEMENT_ANIMATION_BRAND_LOGO} > * {\n position: absolute;\n height: 100%;\n right: 0;\n transform: none;\n }\n\n .${ELEMENT_SECOND_CHEVRON} svg,\n .${ELEMENT_THIRD_CHEVRON} svg {\n height: 10vw;\n width: 8.2vw;\n }\n\n @media (${token.media.queries.highDef.min}) {\n .${ELEMENT_SECOND_CHEVRON} svg,\n .${ELEMENT_THIRD_CHEVRON} svg {\n height: 306px;\n width: 252px;\n }\n }\n\n .${FirstChevronStyles} svg {\n height: 7vw;\n width: 5vw;\n }\n\n @media (${token.media.queries.highDef.min}) {\n .${FirstChevronStyles} svg {\n height: 202px;\n width: 144px;\n }\n }\n\n ${FirstChevronStyles} \n ${SecondChevronStyles} \n ${ThirdChevronStyles} \n`;\n\nexport const createAnimationChevronScroll = () =>\n (() => {\n const container = document.createElement('div');\n const first = document.createElement('div');\n const second = document.createElement('div');\n const third = document.createElement('div');\n\n first.classList.add(ELEMENT_FIRST_CHEVRON);\n first.innerHTML = ICON_CHEVRON_SMALL;\n\n second.classList.add(ELEMENT_SECOND_CHEVRON);\n second.innerHTML = ICON_CHEVRON_BIG;\n\n third.classList.add(ELEMENT_THIRD_CHEVRON);\n third.innerHTML = ICON_CHEVRON_BIG;\n\n container.classList.add(ELEMENT_ANIMATION_BRAND_LOGO);\n container.appendChild(first);\n container.appendChild(second);\n container.appendChild(third);\n\n return {\n element: container,\n styles: STYLES_ANIMATION_BRAND_LOGO,\n };\n })();\n"],"names":[],"mappings":";AAEA,MAAM,mBAAmB;AACzB,MAAM,qBAAqB;AAE3B,MAAM,+BAA+B;AACrC,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,wBAAwB;AAE9B,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMtB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,KAKrB,qBAAqB;AAAA,YACd,MAAM,MAAM,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,SAKnB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW9B,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMvB,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMf,MAAM,MAAM,QAAQ,QAAQ,GAAG;AAAA,OACpC,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,KAKxB,sBAAsB;AAAA,YACf,MAAM,MAAM,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,SAKlB,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW/B,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMtB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,YAKd,MAAM,MAAM,QAAQ,QAAQ,GAAG;AAAA,OACpC,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,KAKvB,qBAAqB;AAAA,YACd,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,SAKpB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW9B,MAAM,8BAA8B;AAAA,KAC/B,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAM5B,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAO5B,sBAAsB;AAAA,KACtB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,YAKd,MAAM,MAAM,QAAQ,QAAQ,GAAG;AAAA,OACpC,sBAAsB;AAAA,OACtB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMvB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,YAKX,MAAM,MAAM,QAAQ,QAAQ,GAAG;AAAA,OACpC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMrB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA;AAGf,MAAM,+BAA+B,OACzC,MAAM;AACL,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,QAAM,QAAQ,SAAS,cAAc,KAAK;AAE1C,QAAM,UAAU,IAAI,qBAAqB;AACzC,QAAM,YAAY;AAElB,SAAO,UAAU,IAAI,sBAAsB;AAC3C,SAAO,YAAY;AAEnB,QAAM,UAAU,IAAI,qBAAqB;AACzC,QAAM,YAAY;AAElB,YAAU,UAAU,IAAI,4BAA4B;AACpD,YAAU,YAAY,KAAK;AAC3B,YAAU,YAAY,MAAM;AAC5B,YAAU,YAAY,KAAK;AAE3B,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,EAAA;AAEZ,GAAA;"}
1
+ {"version":3,"file":"chevron-scroll.js","sources":["../../../../source/atomic/animations/brand/chevron-scroll.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\n\nconst ICON_CHEVRON_BIG = `<svg width=\"252\" height=\"306\" aria-hidden=\"true\" viewBox=\"0 0 252 306\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M126 0H0L126 152.706L0 305.411H126L252 152.706L126 0Z\" /></svg>`;\nconst ICON_CHEVRON_SMALL = `<svg width=\"144\" height=\"202\" aria-hidden=\"true\" viewBox=\"0 0 144 202\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M60.3972 0H0L83.6028 100.765L0 201.529H60.3972L144 100.765L60.3972 0Z\" /></svg>`;\n\nconst KEYFRAMES = `\n @keyframes chevron-one {\n from { transform: translateX(-80%); }\n to { transform: translateX(40%); }\n }\n\n @keyframes chevron-two {\n from { transform: translateX(-40%); }\n to { transform: translateX(24%); }\n }\n\n @keyframes chevron-three {\n from { transform: translateX(-30%); }\n to { transform: translateX(60%); }\n }\n`;\n\nexport const createAnimationChevronScroll = () =>\n (() => {\n const firstChevron = new ElementBuilder()\n .withClassName('brand-logo-first-chevron')\n .withHTML(ICON_CHEVRON_SMALL)\n .withStyles({\n element: {\n top: '0',\n transform: 'translateX(-80%)',\n '& svg': {\n fill: token.color.gold,\n height: '7vw',\n width: '5vw',\n [`@media (${token.media.queries.highDef.min})`]: {\n height: '202px',\n width: '144px',\n },\n },\n ...withViewTimelineAnimation({\n transform: 'translateX(40%)',\n animation: 'chevron-one forwards',\n animationTimeline: 'view()',\n animationRangeStart: 'cover',\n animationRangeEnd: 'contain',\n }),\n },\n })\n .build();\n\n const secondChevron = new ElementBuilder()\n .withClassName('brand-logo-second-chevron')\n .withHTML(ICON_CHEVRON_BIG)\n .withStyles({\n element: {\n top: '10%',\n zIndex: 99,\n transform: 'translateX(-40%)',\n '& svg': {\n fill: token.color.red,\n height: '10vw',\n width: '8.2vw',\n [`@media (${token.media.queries.highDef.min})`]: {\n height: '306px',\n width: '252px',\n },\n },\n [`@media (${token.media.queries.highDef.min})`]: {\n top: '95px',\n },\n ...withViewTimelineAnimation({\n transform: 'translateX(24%)',\n animation: 'chevron-two forwards',\n animationTimeline: 'view()',\n animationRangeStart: 'cover',\n animationRangeEnd: 'contain',\n }),\n },\n })\n .build();\n\n const thirdChevron = new ElementBuilder()\n .withClassName('brand-logo-third-chevron')\n .withHTML(ICON_CHEVRON_BIG)\n .withStyles({\n element: {\n top: '25%',\n transform: 'translateX(-30%)',\n '& svg': {\n fill: token.color.black,\n height: '10vw',\n width: '8.2vw',\n [`@media (${token.media.queries.highDef.min})`]: {\n height: '306px',\n width: '252px',\n },\n },\n [`@media (${token.media.queries.highDef.min})`]: {\n top: '195px',\n },\n ...withViewTimelineAnimation({\n transform: 'translateX(60%)',\n animation: 'chevron-three forwards',\n animationTimeline: 'view()',\n animationRangeStart: '0',\n animationRangeEnd: '100vh',\n }),\n },\n })\n .build();\n\n const container = new ElementBuilder()\n .withClassName('brand-logo-container')\n .withStyles({\n element: {\n position: 'relative',\n height: '50vw',\n width: '100vw',\n '& > *': {\n position: 'absolute',\n height: '100%',\n right: '0',\n transform: 'none',\n },\n },\n })\n .withChildren(firstChevron, secondChevron, thirdChevron)\n .build();\n\n container.styles += KEYFRAMES;\n\n return container;\n })();\n"],"names":[],"mappings":";;;AAIA,MAAM,mBAAmB;AACzB,MAAM,qBAAqB;AAE3B,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBX,MAAM,+BAA+B,OACzC,MAAM;AACL,QAAM,eAAe,IAAI,eAAA,EACtB,cAAc,0BAA0B,EACxC,SAAS,kBAAkB,EAC3B,WAAW;AAAA,IACV,SAAS;AAAA,MACP,KAAK;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,QACP,MAAM,MAAM,MAAM;AAAA,QAClB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,CAAC,WAAW,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,UAC/C,QAAQ;AAAA,UACR,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,MAEF,GAAG,0BAA0B;AAAA,QAC3B,WAAW;AAAA,QACX,WAAW;AAAA,QACX,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,QACrB,mBAAmB;AAAA,MAAA,CACpB;AAAA,IAAA;AAAA,EACH,CACD,EACA,MAAA;AAEH,QAAM,gBAAgB,IAAI,eAAA,EACvB,cAAc,2BAA2B,EACzC,SAAS,gBAAgB,EACzB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,SAAS;AAAA,QACP,MAAM,MAAM,MAAM;AAAA,QAClB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,CAAC,WAAW,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,UAC/C,QAAQ;AAAA,UACR,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,MAEF,CAAC,WAAW,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,QAC/C,KAAK;AAAA,MAAA;AAAA,MAEP,GAAG,0BAA0B;AAAA,QAC3B,WAAW;AAAA,QACX,WAAW;AAAA,QACX,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,QACrB,mBAAmB;AAAA,MAAA,CACpB;AAAA,IAAA;AAAA,EACH,CACD,EACA,MAAA;AAEH,QAAM,eAAe,IAAI,eAAA,EACtB,cAAc,0BAA0B,EACxC,SAAS,gBAAgB,EACzB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,KAAK;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,QACP,MAAM,MAAM,MAAM;AAAA,QAClB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,CAAC,WAAW,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,UAC/C,QAAQ;AAAA,UACR,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,MAEF,CAAC,WAAW,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,QAC/C,KAAK;AAAA,MAAA;AAAA,MAEP,GAAG,0BAA0B;AAAA,QAC3B,WAAW;AAAA,QACX,WAAW;AAAA,QACX,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,QACrB,mBAAmB;AAAA,MAAA,CACpB;AAAA,IAAA;AAAA,EACH,CACD,EACA,MAAA;AAEH,QAAM,YAAY,IAAI,eAAA,EACnB,cAAc,sBAAsB,EACpC,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,EACF,CACD,EACA,aAAa,cAAc,eAAe,YAAY,EACtD,MAAA;AAEH,YAAU,UAAU;AAEpB,SAAO;AACT,GAAA;"}
@@ -0,0 +1,9 @@
1
+ import { ElementModel } from '../../../../builder/dist/index.d.ts';
2
+ export declare const createCaption: {
3
+ create: (isToggleCaption: boolean, image: HTMLImageElement) => ElementModel | null;
4
+ bindToggle: (root: ParentNode) => void;
5
+ Elements: {
6
+ container: string;
7
+ };
8
+ };
9
+ //# sourceMappingURL=caption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caption.d.ts","sourceRoot":"","sources":["../../../../source/atomic/assets/image/caption.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,2CAA2C,CAAC;AA8MnD,eAAO,MAAM,aAAa;8BAPP,OAAO,SACjB,gBAAgB,KACtB,YAAY,GAAG,IAAI;uBA1KI,UAAU,KAAG,IAAI;;;;CAqL1C,CAAC"}
@@ -0,0 +1,166 @@
1
+ import * as token from "@universityofmaryland/web-token-library";
2
+ import * as typography from "@universityofmaryland/web-styles-library/typography";
3
+ import { ElementBuilder } from "@universityofmaryland/web-builder-library";
4
+ const ATTRIBUTE_CAPTION = "data-caption";
5
+ const ATTRIBUTE_CREDIT = "data-credit";
6
+ let captionInstanceCount = 0;
7
+ const INDICATOR_CLASS = "image-caption-toggle-indicator";
8
+ const TOGGLE_CLASS = "image-caption-toggle";
9
+ const toggleCaption = (event) => {
10
+ event.stopPropagation();
11
+ const button = event.currentTarget;
12
+ const container = button.closest(`.${TOGGLE_CLASS}`);
13
+ if (!container) return;
14
+ const isExpanded = button.getAttribute("aria-expanded") === "true";
15
+ button.setAttribute("aria-expanded", String(!isExpanded));
16
+ if (isExpanded) {
17
+ container.removeAttribute("data-expanded");
18
+ } else {
19
+ container.setAttribute("data-expanded", "");
20
+ }
21
+ };
22
+ const bindToggle = (root) => {
23
+ root.querySelectorAll(`.${INDICATOR_CLASS}`).forEach((button) => button.addEventListener("click", toggleCaption));
24
+ };
25
+ const getCaptionText = (image) => {
26
+ if (image.hasAttribute(ATTRIBUTE_CAPTION)) {
27
+ console.log(
28
+ `Attribute "data-caption" is deprecated. Use "data-credit" instead. This attribute will be removed in version 2.0.`
29
+ );
30
+ }
31
+ return image.getAttribute(ATTRIBUTE_CREDIT) || image.getAttribute(ATTRIBUTE_CAPTION);
32
+ };
33
+ const makeBlockCaption = (image) => {
34
+ const text = getCaptionText(image);
35
+ if (!text) return null;
36
+ return new ElementBuilder("span").withClassName("image-caption-block").styled(typography.sans.min).withStyles({
37
+ element: {
38
+ position: "absolute",
39
+ bottom: 0,
40
+ right: 0,
41
+ padding: token.spacing.min,
42
+ color: token.color.white,
43
+ backgroundColor: "rgba(0, 0, 0, 0.5)"
44
+ }
45
+ }).withText(text).build();
46
+ };
47
+ const makeToggleCaption = (image) => {
48
+ const text = getCaptionText(image);
49
+ if (!text) return null;
50
+ const captionId = `image-caption-text-${captionInstanceCount += 1}`;
51
+ const indicator = new ElementBuilder("button").withClassName(INDICATOR_CLASS).withAttributes({
52
+ type: "button",
53
+ "aria-expanded": "false",
54
+ "aria-controls": captionId,
55
+ "aria-label": "Toggle caption"
56
+ }).on("click", toggleCaption).withStyles({
57
+ element: {
58
+ appearance: "none",
59
+ WebkitAppearance: "none",
60
+ border: "none",
61
+ margin: 0,
62
+ padding: 0,
63
+ cursor: "pointer",
64
+ pointerEvents: "auto",
65
+ touchAction: "manipulation",
66
+ WebkitTapHighlightColor: "transparent",
67
+ width: token.spacing.lg,
68
+ height: token.spacing.lg,
69
+ position: "relative",
70
+ display: "block",
71
+ flexShrink: 0,
72
+ borderRadius: "50%",
73
+ backgroundColor: token.color.gray.darker,
74
+ color: token.color.white,
75
+ transition: "background-color 0.5s ease, color 0.5s ease",
76
+ "@media (hover: hover)": {
77
+ "&:hover": {
78
+ backgroundColor: token.color.white,
79
+ color: token.color.gray.darker
80
+ }
81
+ },
82
+ "&::before": {
83
+ content: "''",
84
+ position: "absolute",
85
+ width: "3px",
86
+ height: "3px",
87
+ borderRadius: "50%",
88
+ backgroundColor: "currentColor",
89
+ top: "50%",
90
+ left: "50%",
91
+ transform: "translate(-50%, -50%)",
92
+ boxShadow: "-6px 0 0 currentColor, 6px 0 0 currentColor",
93
+ transition: "opacity 0.1s ease"
94
+ },
95
+ "&::after": {
96
+ content: "'✕'",
97
+ position: "absolute",
98
+ top: "50%",
99
+ left: "50%",
100
+ transform: "translate(-50%, -50%)",
101
+ fontSize: "14px",
102
+ lineHeight: 1,
103
+ opacity: 0,
104
+ transition: "opacity 0.1s ease"
105
+ }
106
+ }
107
+ }).build();
108
+ const captionText = new ElementBuilder("span").withClassName("image-caption-toggle-text").withAttribute("id", captionId).withText(text).styled(typography.sans.smaller).withStyles({
109
+ element: {
110
+ display: "none",
111
+ overflow: "auto",
112
+ boxSizing: "border-box",
113
+ maxHeight: "100%",
114
+ pointerEvents: "auto",
115
+ color: token.color.white,
116
+ backgroundColor: token.color.gray.darker,
117
+ border: `${token.spacing.sm} solid ${token.color.gray.darker}`,
118
+ borderRadius: "2px",
119
+ lineHeight: 1.1,
120
+ scrollbarWidth: "none",
121
+ "&::-webkit-scrollbar": { display: "none" }
122
+ }
123
+ }).build();
124
+ const model = new ElementBuilder("div").withClassName(TOGGLE_CLASS).withStyles({
125
+ element: {
126
+ position: "absolute",
127
+ inset: `auto ${token.spacing.sm} ${token.spacing.sm} auto`,
128
+ display: "inline-flex",
129
+ flexDirection: "row-reverse",
130
+ alignItems: "center",
131
+ zIndex: 99,
132
+ userSelect: "none",
133
+ maxWidth: `calc(100% - (${token.spacing.sm} * 2))`,
134
+ maxHeight: `calc(100% - (${token.spacing.sm} * 2))`,
135
+ "&[data-expanded]": {
136
+ width: `calc(100% - (${token.spacing.sm} * 2))`,
137
+ height: `calc(100% - (${token.spacing.sm} * 2))`,
138
+ gap: token.spacing.sm,
139
+ alignItems: "flex-end",
140
+ pointerEvents: "none",
141
+ "& .image-caption-toggle-text": {
142
+ display: "block",
143
+ flex: 1
144
+ },
145
+ "& .image-caption-toggle-indicator::before": { opacity: 0 },
146
+ "& .image-caption-toggle-indicator::after": { opacity: 1 }
147
+ }
148
+ }
149
+ }).withChildren(indicator, captionText).build();
150
+ return model;
151
+ };
152
+ const create = (isToggleCaption, image) => {
153
+ if (isToggleCaption) return makeToggleCaption(image);
154
+ return makeBlockCaption(image);
155
+ };
156
+ const createCaption = {
157
+ create,
158
+ bindToggle,
159
+ Elements: {
160
+ container: "image-container"
161
+ }
162
+ };
163
+ export {
164
+ createCaption
165
+ };
166
+ //# sourceMappingURL=caption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caption.js","sources":["../../../../source/atomic/assets/image/caption.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport * as typography from '@universityofmaryland/web-styles-library/typography';\nimport {\n ElementBuilder,\n type ElementModel,\n} from '@universityofmaryland/web-builder-library';\n\nconst ATTRIBUTE_CAPTION = 'data-caption';\nconst ATTRIBUTE_CREDIT = 'data-credit';\n\nlet captionInstanceCount = 0;\n\nconst INDICATOR_CLASS = 'image-caption-toggle-indicator';\nconst TOGGLE_CLASS = 'image-caption-toggle';\n\nconst toggleCaption = (event: Event) => {\n event.stopPropagation();\n\n const button = event.currentTarget as HTMLElement;\n const container = button.closest(`.${TOGGLE_CLASS}`);\n if (!container) return;\n\n const isExpanded = button.getAttribute('aria-expanded') === 'true';\n button.setAttribute('aria-expanded', String(!isExpanded));\n\n if (isExpanded) {\n container.removeAttribute('data-expanded');\n } else {\n container.setAttribute('data-expanded', '');\n }\n};\n\n// cloneNode(true) does not copy listeners added via addEventListener, so a\n// cloned subtree (e.g. carousel slides duplicated for infinite scroll) loses\n// its caption toggle behavior. Consumers that clone caption markup must call\n// this on the clone to restore interactivity.\nconst bindToggle = (root: ParentNode): void => {\n root\n .querySelectorAll(`.${INDICATOR_CLASS}`)\n .forEach((button) => button.addEventListener('click', toggleCaption));\n};\n\nconst getCaptionText = (image: HTMLImageElement): string | null => {\n if (image.hasAttribute(ATTRIBUTE_CAPTION)) {\n console.log(\n `Attribute \"data-caption\" is deprecated. Use \"data-credit\" instead. This attribute will be removed in version 2.0.`,\n );\n }\n return (\n image.getAttribute(ATTRIBUTE_CREDIT) ||\n image.getAttribute(ATTRIBUTE_CAPTION)\n );\n};\n\nconst makeBlockCaption = (image: HTMLImageElement): ElementModel | null => {\n const text = getCaptionText(image);\n if (!text) return null;\n\n return new ElementBuilder('span')\n .withClassName('image-caption-block')\n .styled(typography.sans.min)\n .withStyles({\n element: {\n position: 'absolute',\n bottom: 0,\n right: 0,\n padding: token.spacing.min,\n color: token.color.white,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n },\n })\n .withText(text)\n .build();\n};\n\nconst makeToggleCaption = (image: HTMLImageElement): ElementModel | null => {\n const text = getCaptionText(image);\n if (!text) return null;\n\n const captionId = `image-caption-text-${(captionInstanceCount += 1)}`;\n\n const indicator = new ElementBuilder('button')\n .withClassName(INDICATOR_CLASS)\n .withAttributes({\n type: 'button',\n 'aria-expanded': 'false',\n 'aria-controls': captionId,\n 'aria-label': 'Toggle caption',\n })\n .on('click', toggleCaption)\n .withStyles({\n element: {\n appearance: 'none',\n WebkitAppearance: 'none',\n border: 'none',\n margin: 0,\n padding: 0,\n cursor: 'pointer',\n pointerEvents: 'auto',\n touchAction: 'manipulation',\n WebkitTapHighlightColor: 'transparent',\n width: token.spacing.lg,\n height: token.spacing.lg,\n position: 'relative',\n display: 'block',\n flexShrink: 0,\n borderRadius: '50%',\n backgroundColor: token.color.gray.darker,\n color: token.color.white,\n transition: 'background-color 0.5s ease, color 0.5s ease',\n\n '@media (hover: hover)': {\n '&:hover': {\n backgroundColor: token.color.white,\n color: token.color.gray.darker,\n },\n },\n '&::before': {\n content: \"''\",\n position: 'absolute',\n width: '3px',\n height: '3px',\n borderRadius: '50%',\n backgroundColor: 'currentColor',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n boxShadow: '-6px 0 0 currentColor, 6px 0 0 currentColor',\n transition: 'opacity 0.1s ease',\n },\n '&::after': {\n content: \"'✕'\",\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n fontSize: '14px',\n lineHeight: 1,\n opacity: 0,\n transition: 'opacity 0.1s ease',\n },\n },\n })\n .build();\n\n const captionText = new ElementBuilder('span')\n .withClassName('image-caption-toggle-text')\n .withAttribute('id', captionId)\n .withText(text)\n .styled(typography.sans.smaller)\n .withStyles({\n element: {\n display: 'none',\n overflow: 'auto',\n boxSizing: 'border-box',\n maxHeight: '100%',\n pointerEvents: 'auto',\n color: token.color.white,\n backgroundColor: token.color.gray.darker,\n border: `${token.spacing.sm} solid ${token.color.gray.darker}`,\n borderRadius: '2px',\n lineHeight: 1.1,\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': { display: 'none' },\n },\n })\n .build();\n\n const model = new ElementBuilder('div')\n .withClassName(TOGGLE_CLASS)\n .withStyles({\n element: {\n position: 'absolute',\n inset: `auto ${token.spacing.sm} ${token.spacing.sm} auto`,\n display: 'inline-flex',\n flexDirection: 'row-reverse',\n alignItems: 'center',\n zIndex: 99,\n userSelect: 'none',\n maxWidth: `calc(100% - (${token.spacing.sm} * 2))`,\n maxHeight: `calc(100% - (${token.spacing.sm} * 2))`,\n\n '&[data-expanded]': {\n width: `calc(100% - (${token.spacing.sm} * 2))`,\n height: `calc(100% - (${token.spacing.sm} * 2))`,\n gap: token.spacing.sm,\n alignItems: 'flex-end',\n pointerEvents: 'none',\n '& .image-caption-toggle-text': {\n display: 'block',\n flex: 1,\n },\n '& .image-caption-toggle-indicator::before': { opacity: 0 },\n '& .image-caption-toggle-indicator::after': { opacity: 1 },\n },\n },\n })\n .withChildren(indicator, captionText)\n .build();\n\n return model;\n};\n\nconst create = (\n isToggleCaption: boolean,\n image: HTMLImageElement,\n): ElementModel | null => {\n if (isToggleCaption) return makeToggleCaption(image);\n return makeBlockCaption(image);\n};\n\nexport const createCaption = {\n create,\n bindToggle,\n Elements: {\n container: 'image-container',\n },\n};\n"],"names":[],"mappings":";;;AAOA,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AAEzB,IAAI,uBAAuB;AAE3B,MAAM,kBAAkB;AACxB,MAAM,eAAe;AAErB,MAAM,gBAAgB,CAAC,UAAiB;AACtC,QAAM,gBAAA;AAEN,QAAM,SAAS,MAAM;AACrB,QAAM,YAAY,OAAO,QAAQ,IAAI,YAAY,EAAE;AACnD,MAAI,CAAC,UAAW;AAEhB,QAAM,aAAa,OAAO,aAAa,eAAe,MAAM;AAC5D,SAAO,aAAa,iBAAiB,OAAO,CAAC,UAAU,CAAC;AAExD,MAAI,YAAY;AACd,cAAU,gBAAgB,eAAe;AAAA,EAC3C,OAAO;AACL,cAAU,aAAa,iBAAiB,EAAE;AAAA,EAC5C;AACF;AAMA,MAAM,aAAa,CAAC,SAA2B;AAC7C,OACG,iBAAiB,IAAI,eAAe,EAAE,EACtC,QAAQ,CAAC,WAAW,OAAO,iBAAiB,SAAS,aAAa,CAAC;AACxE;AAEA,MAAM,iBAAiB,CAAC,UAA2C;AACjE,MAAI,MAAM,aAAa,iBAAiB,GAAG;AACzC,YAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EAEJ;AACA,SACE,MAAM,aAAa,gBAAgB,KACnC,MAAM,aAAa,iBAAiB;AAExC;AAEA,MAAM,mBAAmB,CAAC,UAAiD;AACzE,QAAM,OAAO,eAAe,KAAK;AACjC,MAAI,CAAC,KAAM,QAAO;AAElB,SAAO,IAAI,eAAe,MAAM,EAC7B,cAAc,qBAAqB,EACnC,OAAO,WAAW,KAAK,GAAG,EAC1B,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS,MAAM,QAAQ;AAAA,MACvB,OAAO,MAAM,MAAM;AAAA,MACnB,iBAAiB;AAAA,IAAA;AAAA,EACnB,CACD,EACA,SAAS,IAAI,EACb,MAAA;AACL;AAEA,MAAM,oBAAoB,CAAC,UAAiD;AAC1E,QAAM,OAAO,eAAe,KAAK;AACjC,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,YAAY,sBAAuB,wBAAwB,CAAE;AAEnE,QAAM,YAAY,IAAI,eAAe,QAAQ,EAC1C,cAAc,eAAe,EAC7B,eAAe;AAAA,IACd,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,cAAc;AAAA,EAAA,CACf,EACA,GAAG,SAAS,aAAa,EACzB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,aAAa;AAAA,MACb,yBAAyB;AAAA,MACzB,OAAO,MAAM,QAAQ;AAAA,MACrB,QAAQ,MAAM,QAAQ;AAAA,MACtB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,iBAAiB,MAAM,MAAM,KAAK;AAAA,MAClC,OAAO,MAAM,MAAM;AAAA,MACnB,YAAY;AAAA,MAEZ,yBAAyB;AAAA,QACvB,WAAW;AAAA,UACT,iBAAiB,MAAM,MAAM;AAAA,UAC7B,OAAO,MAAM,MAAM,KAAK;AAAA,QAAA;AAAA,MAC1B;AAAA,MAEF,aAAa;AAAA,QACX,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,KAAK;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,QACX,WAAW;AAAA,QACX,YAAY;AAAA,MAAA;AAAA,MAEd,YAAY;AAAA,QACV,SAAS;AAAA,QACT,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,YAAY;AAAA,MAAA;AAAA,IACd;AAAA,EACF,CACD,EACA,MAAA;AAEH,QAAM,cAAc,IAAI,eAAe,MAAM,EAC1C,cAAc,2BAA2B,EACzC,cAAc,MAAM,SAAS,EAC7B,SAAS,IAAI,EACb,OAAO,WAAW,KAAK,OAAO,EAC9B,WAAW;AAAA,IACV,SAAS;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,eAAe;AAAA,MACf,OAAO,MAAM,MAAM;AAAA,MACnB,iBAAiB,MAAM,MAAM,KAAK;AAAA,MAClC,QAAQ,GAAG,MAAM,QAAQ,EAAE,UAAU,MAAM,MAAM,KAAK,MAAM;AAAA,MAC5D,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,wBAAwB,EAAE,SAAS,OAAA;AAAA,IAAO;AAAA,EAC5C,CACD,EACA,MAAA;AAEH,QAAM,QAAQ,IAAI,eAAe,KAAK,EACnC,cAAc,YAAY,EAC1B,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MACV,OAAO,QAAQ,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE;AAAA,MACnD,SAAS;AAAA,MACT,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU,gBAAgB,MAAM,QAAQ,EAAE;AAAA,MAC1C,WAAW,gBAAgB,MAAM,QAAQ,EAAE;AAAA,MAE3C,oBAAoB;AAAA,QAClB,OAAO,gBAAgB,MAAM,QAAQ,EAAE;AAAA,QACvC,QAAQ,gBAAgB,MAAM,QAAQ,EAAE;AAAA,QACxC,KAAK,MAAM,QAAQ;AAAA,QACnB,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,gCAAgC;AAAA,UAC9B,SAAS;AAAA,UACT,MAAM;AAAA,QAAA;AAAA,QAER,6CAA6C,EAAE,SAAS,EAAA;AAAA,QACxD,4CAA4C,EAAE,SAAS,EAAA;AAAA,MAAE;AAAA,IAC3D;AAAA,EACF,CACD,EACA,aAAa,WAAW,WAAW,EACnC,MAAA;AAEH,SAAO;AACT;AAEA,MAAM,SAAS,CACb,iBACA,UACwB;AACxB,MAAI,gBAAiB,QAAO,kBAAkB,KAAK;AACnD,SAAO,iBAAiB,KAAK;AAC/B;AAEO,MAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,UAAU;AAAA,IACR,WAAW;AAAA,EAAA;AAEf;"}
@@ -1 +1 @@
1
- {"version":3,"file":"gif.d.ts","sourceRoot":"","sources":["../../../../source/atomic/assets/image/gif.ts"],"names":[],"mappings":"AA+NA,eAAO,MAAM,cAAc,GAAI,cAE5B;IACD,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;CAC/C,yGA4BA,CAAC"}
1
+ {"version":3,"file":"gif.d.ts","sourceRoot":"","sources":["../../../../source/atomic/assets/image/gif.ts"],"names":[],"mappings":"AAsOA,eAAO,MAAM,cAAc,GAAI,cAE5B;IACD,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;CAC/C,yGA4BA,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import * as Styles from "@universityofmaryland/web-styles-library";
2
2
  import { ElementBuilder } from "@universityofmaryland/web-builder-library";
3
+ import { isPreferredReducedMotion } from "@universityofmaryland/web-utilities-library/accessibility";
3
4
  import { debounce } from "@universityofmaryland/web-utilities-library/performance";
4
5
  import { pause, play } from "@universityofmaryland/web-icons-library/controls";
5
6
  const extractImageElement = (element) => {
@@ -130,7 +131,11 @@ const applyGifToggle = (image, container, state) => {
130
131
  }
131
132
  setupLazyLoading(container, image, canvas, button, state, () => {
132
133
  sizeCanvas();
133
- setButtonPlay();
134
+ if (isPreferredReducedMotion()) {
135
+ setButtonPause();
136
+ } else {
137
+ setButtonPlay();
138
+ }
134
139
  });
135
140
  window.addEventListener(
136
141
  "resize",
@@ -1 +1 @@
1
- {"version":3,"file":"gif.js","sources":["../../../../source/atomic/assets/image/gif.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { debounce } from '@universityofmaryland/web-utilities-library/performance';\nimport {\n pause as iconPause,\n play as iconPlay,\n} from '@universityofmaryland/web-icons-library/controls';\n\n/**\n * GIF loading state interface\n */\ninterface GifState {\n isLoaded: boolean;\n isPlaying: boolean;\n originalSrc: string;\n}\n\nconst extractImageElement = (\n element: HTMLImageElement | HTMLAnchorElement,\n): HTMLImageElement | null => {\n if (element instanceof HTMLImageElement) {\n return element;\n }\n\n if (element instanceof HTMLAnchorElement) {\n return element.querySelector('img');\n }\n\n return null;\n};\n\n/**\n * Renders the first frame of the GIF to the canvas\n */\nconst renderFirstFrame = (\n image: HTMLImageElement,\n canvas: HTMLCanvasElement,\n container: HTMLElement,\n) => {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n canvas.width = containerWidth;\n canvas.height = containerHeight;\n\n // Calculate dimensions to maintain aspect ratio while covering\n const imgRatio = image.naturalWidth / image.naturalHeight;\n const containerRatio = containerWidth / containerHeight;\n\n let drawWidth: number;\n let drawHeight: number;\n let offsetX = 0;\n let offsetY = 0;\n\n if (imgRatio > containerRatio) {\n drawHeight = containerHeight;\n drawWidth = image.naturalWidth * (containerHeight / image.naturalHeight);\n offsetX = (containerWidth - drawWidth) / 2;\n } else {\n drawWidth = containerWidth;\n drawHeight = image.naturalHeight * (containerWidth / image.naturalWidth);\n offsetY = (containerHeight - drawHeight) / 2;\n }\n\n ctx.clearRect(0, 0, containerWidth, containerHeight);\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(image, offsetX, offsetY, drawWidth, drawHeight);\n};\n\n/**\n * Sets up the IntersectionObserver for lazy loading the GIF\n */\nconst setupLazyLoading = (\n container: HTMLElement,\n image: HTMLImageElement,\n canvas: HTMLCanvasElement,\n button: HTMLButtonElement,\n state: GifState,\n onLoad: () => void,\n) => {\n // Handle non-browser environments\n if (typeof IntersectionObserver === 'undefined') {\n // Load immediately if IntersectionObserver is not available\n state.isLoaded = true;\n button.style.display = 'flex';\n onLoad();\n return null;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && !state.isLoaded) {\n state.isLoaded = true;\n\n // Restore the original src to load the animated GIF\n image.src = state.originalSrc;\n\n // Show the button once loaded\n image.addEventListener(\n 'load',\n () => {\n button.style.display = 'flex';\n onLoad();\n },\n { once: true },\n );\n\n observer.disconnect();\n }\n });\n },\n {\n threshold: 0.1,\n rootMargin: '50px', // Start loading slightly before visible\n },\n );\n\n observer.observe(container);\n\n return observer;\n};\n\nconst applyGifToggle = (\n image: HTMLImageElement,\n container: HTMLElement,\n state: GifState,\n) => {\n const canvas = document.createElement('canvas');\n const button = document.createElement('button');\n\n const setButtonPlay = () => {\n button.setAttribute('aria-label', 'Pause');\n button.innerHTML = iconPause;\n canvas.style.opacity = '0';\n image.style.opacity = '1';\n state.isPlaying = true;\n };\n\n const setButtonPause = () => {\n button.setAttribute('aria-label', 'Play');\n button.innerHTML = iconPlay;\n canvas.style.opacity = '1';\n image.style.opacity = '0';\n state.isPlaying = false;\n };\n\n const sizeCanvas = () => {\n if (!container) return;\n const img = container.querySelector('img');\n const canvasEl = container.querySelector('canvas') as HTMLCanvasElement;\n\n if (!canvasEl || !img) return;\n\n // Set canvas display dimensions to match container\n canvasEl.style.width = '100%';\n canvasEl.style.height = `${img.clientHeight}px`;\n canvasEl.style.position = 'absolute';\n canvasEl.style.top = '0';\n canvasEl.style.left = '0';\n\n if (state.isLoaded && img.complete && img.naturalWidth > 0) {\n renderFirstFrame(img, canvasEl, container);\n }\n };\n\n // Initialize button but hide until GIF is loaded\n button.setAttribute('type', 'button');\n button.style.display = 'none';\n\n button.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (state.isPlaying) {\n setButtonPause();\n } else {\n setButtonPlay();\n }\n });\n\n // Add canvas immediately for placeholder\n container.appendChild(canvas);\n container.appendChild(button);\n\n // Initially hide the animated image (show canvas placeholder)\n image.style.opacity = '0';\n image.style.transition = 'opacity 0.2s ease-in-out';\n canvas.style.opacity = '1';\n canvas.style.transition = 'opacity 0.2s ease-in-out';\n\n // Handle initial image load for first frame capture\n const captureFirstFrame = () => {\n sizeCanvas();\n renderFirstFrame(image, canvas, container);\n };\n\n // If image is already loaded (from cache), capture first frame immediately\n if (image.complete && image.naturalWidth > 0) {\n captureFirstFrame();\n } else {\n image.addEventListener('load', captureFirstFrame, { once: true });\n }\n\n // Set up lazy loading observer\n setupLazyLoading(container, image, canvas, button, state, () => {\n // Once loaded, render the first frame properly and set to play\n sizeCanvas();\n setButtonPlay();\n });\n\n // Handle resize\n window.addEventListener(\n 'resize',\n debounce(() => {\n sizeCanvas();\n }, 50),\n );\n};\n\nexport const createImageGif = ({\n element,\n}: {\n element: HTMLImageElement | HTMLAnchorElement;\n}) => {\n const image = extractImageElement(element);\n\n if (!image) {\n throw new Error('No valid image element found');\n }\n\n // Store original src and create state\n const state: GifState = {\n isLoaded: false,\n isPlaying: false,\n originalSrc: image.src,\n };\n\n const isAnchor = element instanceof HTMLAnchorElement;\n const container = isAnchor ? element : document.createElement('div');\n\n const composite = new ElementBuilder(container)\n .styled(Styles.element.asset.gif.toggle)\n .withModifier((el) => {\n if (!isAnchor) {\n el.appendChild(element);\n }\n applyGifToggle(image, el, state);\n })\n .build();\n\n return composite;\n};\n"],"names":["iconPause","iconPlay"],"mappings":";;;;AAiBA,MAAM,sBAAsB,CAC1B,YAC4B;AAC5B,MAAI,mBAAmB,kBAAkB;AACvC,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,mBAAmB;AACxC,WAAO,QAAQ,cAAc,KAAK;AAAA,EACpC;AAEA,SAAO;AACT;AAKA,MAAM,mBAAmB,CACvB,OACA,QACA,cACG;AACH,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK;AAEV,QAAM,iBAAiB,UAAU;AACjC,QAAM,kBAAkB,UAAU;AAElC,SAAO,QAAQ;AACf,SAAO,SAAS;AAGhB,QAAM,WAAW,MAAM,eAAe,MAAM;AAC5C,QAAM,iBAAiB,iBAAiB;AAExC,MAAI;AACJ,MAAI;AACJ,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,WAAW,gBAAgB;AAC7B,iBAAa;AACb,gBAAY,MAAM,gBAAgB,kBAAkB,MAAM;AAC1D,eAAW,iBAAiB,aAAa;AAAA,EAC3C,OAAO;AACL,gBAAY;AACZ,iBAAa,MAAM,iBAAiB,iBAAiB,MAAM;AAC3D,eAAW,kBAAkB,cAAc;AAAA,EAC7C;AAEA,MAAI,UAAU,GAAG,GAAG,gBAAgB,eAAe;AACnD,MAAI,wBAAwB;AAC5B,MAAI,UAAU,OAAO,SAAS,SAAS,WAAW,UAAU;AAC9D;AAKA,MAAM,mBAAmB,CACvB,WACA,OACA,QACA,QACA,OACA,WACG;AAEH,MAAI,OAAO,yBAAyB,aAAa;AAE/C,UAAM,WAAW;AACjB,WAAO,MAAM,UAAU;AACvB,WAAA;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,IAAI;AAAA,IACnB,CAAC,YAAY;AACX,cAAQ,QAAQ,CAAC,UAAU;AACzB,YAAI,MAAM,kBAAkB,CAAC,MAAM,UAAU;AAC3C,gBAAM,WAAW;AAGjB,gBAAM,MAAM,MAAM;AAGlB,gBAAM;AAAA,YACJ;AAAA,YACA,MAAM;AACJ,qBAAO,MAAM,UAAU;AACvB,qBAAA;AAAA,YACF;AAAA,YACA,EAAE,MAAM,KAAA;AAAA,UAAK;AAGf,mBAAS,WAAA;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,WAAW;AAAA,MACX,YAAY;AAAA;AAAA,IAAA;AAAA,EACd;AAGF,WAAS,QAAQ,SAAS;AAE1B,SAAO;AACT;AAEA,MAAM,iBAAiB,CACrB,OACA,WACA,UACG;AACH,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,SAAS,SAAS,cAAc,QAAQ;AAE9C,QAAM,gBAAgB,MAAM;AAC1B,WAAO,aAAa,cAAc,OAAO;AACzC,WAAO,YAAYA;AACnB,WAAO,MAAM,UAAU;AACvB,UAAM,MAAM,UAAU;AACtB,UAAM,YAAY;AAAA,EACpB;AAEA,QAAM,iBAAiB,MAAM;AAC3B,WAAO,aAAa,cAAc,MAAM;AACxC,WAAO,YAAYC;AACnB,WAAO,MAAM,UAAU;AACvB,UAAM,MAAM,UAAU;AACtB,UAAM,YAAY;AAAA,EACpB;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,UAAW;AAChB,UAAM,MAAM,UAAU,cAAc,KAAK;AACzC,UAAM,WAAW,UAAU,cAAc,QAAQ;AAEjD,QAAI,CAAC,YAAY,CAAC,IAAK;AAGvB,aAAS,MAAM,QAAQ;AACvB,aAAS,MAAM,SAAS,GAAG,IAAI,YAAY;AAC3C,aAAS,MAAM,WAAW;AAC1B,aAAS,MAAM,MAAM;AACrB,aAAS,MAAM,OAAO;AAEtB,QAAI,MAAM,YAAY,IAAI,YAAY,IAAI,eAAe,GAAG;AAC1D,uBAAiB,KAAK,UAAU,SAAS;AAAA,IAC3C;AAAA,EACF;AAGA,SAAO,aAAa,QAAQ,QAAQ;AACpC,SAAO,MAAM,UAAU;AAEvB,SAAO,iBAAiB,SAAS,CAAC,UAAU;AAC1C,UAAM,eAAA;AACN,UAAM,gBAAA;AAEN,QAAI,MAAM,WAAW;AACnB,qBAAA;AAAA,IACF,OAAO;AACL,oBAAA;AAAA,IACF;AAAA,EACF,CAAC;AAGD,YAAU,YAAY,MAAM;AAC5B,YAAU,YAAY,MAAM;AAG5B,QAAM,MAAM,UAAU;AACtB,QAAM,MAAM,aAAa;AACzB,SAAO,MAAM,UAAU;AACvB,SAAO,MAAM,aAAa;AAG1B,QAAM,oBAAoB,MAAM;AAC9B,eAAA;AACA,qBAAiB,OAAO,QAAQ,SAAS;AAAA,EAC3C;AAGA,MAAI,MAAM,YAAY,MAAM,eAAe,GAAG;AAC5C,sBAAA;AAAA,EACF,OAAO;AACL,UAAM,iBAAiB,QAAQ,mBAAmB,EAAE,MAAM,MAAM;AAAA,EAClE;AAGA,mBAAiB,WAAW,OAAO,QAAQ,QAAQ,OAAO,MAAM;AAE9D,eAAA;AACA,kBAAA;AAAA,EACF,CAAC;AAGD,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM;AACb,iBAAA;AAAA,IACF,GAAG,EAAE;AAAA,EAAA;AAET;AAEO,MAAM,iBAAiB,CAAC;AAAA,EAC7B;AACF,MAEM;AACJ,QAAM,QAAQ,oBAAoB,OAAO;AAEzC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAGA,QAAM,QAAkB;AAAA,IACtB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa,MAAM;AAAA,EAAA;AAGrB,QAAM,WAAW,mBAAmB;AACpC,QAAM,YAAY,WAAW,UAAU,SAAS,cAAc,KAAK;AAEnE,QAAM,YAAY,IAAI,eAAe,SAAS,EAC3C,OAAO,OAAO,QAAQ,MAAM,IAAI,MAAM,EACtC,aAAa,CAAC,OAAO;AACpB,QAAI,CAAC,UAAU;AACb,SAAG,YAAY,OAAO;AAAA,IACxB;AACA,mBAAe,OAAO,IAAI,KAAK;AAAA,EACjC,CAAC,EACA,MAAA;AAEH,SAAO;AACT;"}
1
+ {"version":3,"file":"gif.js","sources":["../../../../source/atomic/assets/image/gif.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { isPreferredReducedMotion } from '@universityofmaryland/web-utilities-library/accessibility';\nimport { debounce } from '@universityofmaryland/web-utilities-library/performance';\nimport {\n pause as iconPause,\n play as iconPlay,\n} from '@universityofmaryland/web-icons-library/controls';\n\n/**\n * GIF loading state interface\n */\ninterface GifState {\n isLoaded: boolean;\n isPlaying: boolean;\n originalSrc: string;\n}\n\nconst extractImageElement = (\n element: HTMLImageElement | HTMLAnchorElement,\n): HTMLImageElement | null => {\n if (element instanceof HTMLImageElement) {\n return element;\n }\n\n if (element instanceof HTMLAnchorElement) {\n return element.querySelector('img');\n }\n\n return null;\n};\n\n/**\n * Renders the first frame of the GIF to the canvas\n */\nconst renderFirstFrame = (\n image: HTMLImageElement,\n canvas: HTMLCanvasElement,\n container: HTMLElement,\n) => {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n canvas.width = containerWidth;\n canvas.height = containerHeight;\n\n // Calculate dimensions to maintain aspect ratio while covering\n const imgRatio = image.naturalWidth / image.naturalHeight;\n const containerRatio = containerWidth / containerHeight;\n\n let drawWidth: number;\n let drawHeight: number;\n let offsetX = 0;\n let offsetY = 0;\n\n if (imgRatio > containerRatio) {\n drawHeight = containerHeight;\n drawWidth = image.naturalWidth * (containerHeight / image.naturalHeight);\n offsetX = (containerWidth - drawWidth) / 2;\n } else {\n drawWidth = containerWidth;\n drawHeight = image.naturalHeight * (containerWidth / image.naturalWidth);\n offsetY = (containerHeight - drawHeight) / 2;\n }\n\n ctx.clearRect(0, 0, containerWidth, containerHeight);\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(image, offsetX, offsetY, drawWidth, drawHeight);\n};\n\n/**\n * Sets up the IntersectionObserver for lazy loading the GIF\n */\nconst setupLazyLoading = (\n container: HTMLElement,\n image: HTMLImageElement,\n canvas: HTMLCanvasElement,\n button: HTMLButtonElement,\n state: GifState,\n onLoad: () => void,\n) => {\n // Handle non-browser environments\n if (typeof IntersectionObserver === 'undefined') {\n // Load immediately if IntersectionObserver is not available\n state.isLoaded = true;\n button.style.display = 'flex';\n onLoad();\n return null;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && !state.isLoaded) {\n state.isLoaded = true;\n\n // Restore the original src to load the animated GIF\n image.src = state.originalSrc;\n\n // Show the button once loaded\n image.addEventListener(\n 'load',\n () => {\n button.style.display = 'flex';\n onLoad();\n },\n { once: true },\n );\n\n observer.disconnect();\n }\n });\n },\n {\n threshold: 0.1,\n rootMargin: '50px', // Start loading slightly before visible\n },\n );\n\n observer.observe(container);\n\n return observer;\n};\n\nconst applyGifToggle = (\n image: HTMLImageElement,\n container: HTMLElement,\n state: GifState,\n) => {\n const canvas = document.createElement('canvas');\n const button = document.createElement('button');\n\n const setButtonPlay = () => {\n button.setAttribute('aria-label', 'Pause');\n button.innerHTML = iconPause;\n canvas.style.opacity = '0';\n image.style.opacity = '1';\n state.isPlaying = true;\n };\n\n const setButtonPause = () => {\n button.setAttribute('aria-label', 'Play');\n button.innerHTML = iconPlay;\n canvas.style.opacity = '1';\n image.style.opacity = '0';\n state.isPlaying = false;\n };\n\n const sizeCanvas = () => {\n if (!container) return;\n const img = container.querySelector('img');\n const canvasEl = container.querySelector('canvas') as HTMLCanvasElement;\n\n if (!canvasEl || !img) return;\n\n // Set canvas display dimensions to match container\n canvasEl.style.width = '100%';\n canvasEl.style.height = `${img.clientHeight}px`;\n canvasEl.style.position = 'absolute';\n canvasEl.style.top = '0';\n canvasEl.style.left = '0';\n\n if (state.isLoaded && img.complete && img.naturalWidth > 0) {\n renderFirstFrame(img, canvasEl, container);\n }\n };\n\n // Initialize button but hide until GIF is loaded\n button.setAttribute('type', 'button');\n button.style.display = 'none';\n\n button.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (state.isPlaying) {\n setButtonPause();\n } else {\n setButtonPlay();\n }\n });\n\n // Add canvas immediately for placeholder\n container.appendChild(canvas);\n container.appendChild(button);\n\n // Initially hide the animated image (show canvas placeholder)\n image.style.opacity = '0';\n image.style.transition = 'opacity 0.2s ease-in-out';\n canvas.style.opacity = '1';\n canvas.style.transition = 'opacity 0.2s ease-in-out';\n\n // Handle initial image load for first frame capture\n const captureFirstFrame = () => {\n sizeCanvas();\n renderFirstFrame(image, canvas, container);\n };\n\n // If image is already loaded (from cache), capture first frame immediately\n if (image.complete && image.naturalWidth > 0) {\n captureFirstFrame();\n } else {\n image.addEventListener('load', captureFirstFrame, { once: true });\n }\n\n // Set up lazy loading observer\n setupLazyLoading(container, image, canvas, button, state, () => {\n // Once loaded, render the first frame properly. Respect the user's\n // reduced-motion preference: start paused (first frame) rather than\n // auto-animating, leaving the play button for manual playback.\n sizeCanvas();\n if (isPreferredReducedMotion()) {\n setButtonPause();\n } else {\n setButtonPlay();\n }\n });\n\n // Handle resize\n window.addEventListener(\n 'resize',\n debounce(() => {\n sizeCanvas();\n }, 50),\n );\n};\n\nexport const createImageGif = ({\n element,\n}: {\n element: HTMLImageElement | HTMLAnchorElement;\n}) => {\n const image = extractImageElement(element);\n\n if (!image) {\n throw new Error('No valid image element found');\n }\n\n // Store original src and create state\n const state: GifState = {\n isLoaded: false,\n isPlaying: false,\n originalSrc: image.src,\n };\n\n const isAnchor = element instanceof HTMLAnchorElement;\n const container = isAnchor ? element : document.createElement('div');\n\n const composite = new ElementBuilder(container)\n .styled(Styles.element.asset.gif.toggle)\n .withModifier((el) => {\n if (!isAnchor) {\n el.appendChild(element);\n }\n applyGifToggle(image, el, state);\n })\n .build();\n\n return composite;\n};\n"],"names":["iconPause","iconPlay"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export { createImageBackground as background } from './background';
2
+ export { createCaption as caption } from './caption';
2
3
  export { createImageGif as gif } from './gif';
3
4
  export { createLazyImage as lazy, type LazyImageOptions, type LazyImageResult } from './lazy';
4
5
  export { imagePlaceholder as placeholder } from './placeholder';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../source/atomic/assets/image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,cAAc,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC9F,OAAO,EAAE,gBAAgB,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../source/atomic/assets/image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,cAAc,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC9F,OAAO,EAAE,gBAAgB,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import { createImageBackground } from "./background.js";
2
+ import { createCaption } from "./caption.js";
2
3
  import { createImageGif } from "./gif.js";
3
4
  import { createLazyImage } from "./lazy.js";
4
5
  import { imagePlaceholder } from "./placeholder.js";
5
6
  export {
6
7
  createImageBackground as background,
8
+ createCaption as caption,
7
9
  createImageGif as gif,
8
10
  createLazyImage as lazy,
9
11
  imagePlaceholder as placeholder
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../../../source/atomic/assets/video/toggle.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAED,eAAO,MAAM,iBAAiB,GAAI,OAAO,UAAU,kFA4E7C,CAAC"}
1
+ {"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../../../source/atomic/assets/video/toggle.ts"],"names":[],"mappings":"AAQA,UAAU,UAAU;IAClB,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAED,eAAO,MAAM,iBAAiB,GAAI,OAAO,UAAU,kFAqF7C,CAAC"}