@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,225 +1,133 @@
1
1
  import * as Styles from "@universityofmaryland/web-styles-library";
2
- import { jssToCSS } from "@universityofmaryland/web-utilities-library/styles";
2
+ import { ElementBuilder } from "@universityofmaryland/web-builder-library";
3
3
  import { debounce } from "@universityofmaryland/web-utilities-library/performance";
4
- const { token } = Styles;
5
4
  const SMALL = 480;
6
- const ELEMENT_NAME = "umd-element-accordion-item";
7
- const ELEMENT_DECLARATION = "accordion-declaration";
8
- const ELEMENT_CONTAINER = "accordion-container";
9
- const ELEMENT_HEADLINE = "accordion-headline";
10
- const ELEMENT_BODY_WRAPPER = "accordion-body-wrapper";
11
- const ELEMENT_BODY = "accordion-body";
12
- const ATTRIBUTE_THEME = "theme";
13
- const THEME_DARK = "dark";
14
5
  const ANIMATION_TIME = 500;
15
- const IS_THEME_DARK = `[${ATTRIBUTE_THEME}='${THEME_DARK}']`;
16
- const OVERWRITE_THEME_DARK_HEADLINE = `.${ELEMENT_CONTAINER}${IS_THEME_DARK} .${ELEMENT_HEADLINE}`;
17
- const OVERWRITE_THEME_DARK_BODY_WRAPPER = `.${ELEMENT_CONTAINER}${IS_THEME_DARK} .${ELEMENT_BODY_WRAPPER}`;
18
- const OVERWRITE_THEME_DARK_BODY = `.${ELEMENT_CONTAINER}${IS_THEME_DARK} .${ELEMENT_BODY}`;
19
- const OverwriteThemeDark = `
20
- ${OVERWRITE_THEME_DARK_HEADLINE} {
21
- background-color: ${token.color.gray.darker};
22
- }
23
-
24
- ${OVERWRITE_THEME_DARK_HEADLINE} > * {
25
- color: ${token.color.white}
26
- }
27
-
28
- ${OVERWRITE_THEME_DARK_HEADLINE}:before,
29
- ${OVERWRITE_THEME_DARK_HEADLINE}:after {
30
- background-color: ${token.color.gold};
31
- }
32
-
33
- ${OVERWRITE_THEME_DARK_HEADLINE}[aria-expanded='true'],
34
- ${OVERWRITE_THEME_DARK_HEADLINE}:hover,
35
- ${OVERWRITE_THEME_DARK_HEADLINE}:focus {
36
- background-color: ${token.color.gray.darker};
37
- border-top: 2px solid ${token.color.gold};
38
- }
39
-
40
- ${OVERWRITE_THEME_DARK_HEADLINE}[aria-expanded='true'] > *,
41
- ${OVERWRITE_THEME_DARK_HEADLINE}:hover > *,
42
- ${OVERWRITE_THEME_DARK_HEADLINE}:focus > * {
43
- color: ${token.color.gold};
44
- }
45
-
46
- ${OVERWRITE_THEME_DARK_BODY_WRAPPER} {
47
- background-color: ${token.color.gray.darker};
48
- }
49
-
50
- ${OVERWRITE_THEME_DARK_BODY},
51
- ${OVERWRITE_THEME_DARK_BODY} * {
52
- color: ${token.color.white};
53
- }
54
- `;
55
- const bodyStyles = `
56
- ${jssToCSS({
57
- styleObj: {
58
- [`.${ELEMENT_BODY_WRAPPER}`]: Styles.typography.sans.medium
59
- }
60
- })}
61
-
62
- .${ELEMENT_BODY_WRAPPER} {
63
- background-color: ${token.color.gray.lightest};
64
- height: 0;
65
- overflow: hidden;
66
- display: none;
67
- }
68
-
69
- .${ELEMENT_BODY} {
70
- padding: ${token.spacing.md};
71
- }
72
-
73
- @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {
74
- .${ELEMENT_BODY} {
75
- padding: ${token.spacing.lg};
76
- }
77
- }
78
-
79
- .${ELEMENT_BODY} > * {
80
- margin-top: ${token.spacing.sm};
81
- }
82
-
83
- .${ELEMENT_BODY} > *:first-child {
84
- margin-top: 0;
85
- }
86
-
87
- @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {
88
- .${ELEMENT_BODY} > * {
89
- margin-top: ${token.spacing.lg};
90
- }
91
- }
92
- `;
93
- const headlineStyles = `
94
- ${jssToCSS({
95
- styleObj: {
96
- [`.${ELEMENT_HEADLINE}`]: Styles.typography.sans.large
97
- }
98
- })}
99
-
100
- .${ELEMENT_HEADLINE} {
101
- display: flex;
102
- border-top: 2px solid transparent;
103
- padding: ${token.spacing.md};
104
- padding-right: ${token.spacing["4xl"]};
105
- background-color: ${token.color.gray.lightest};
106
- position: relative;
107
- transition: background 0.5s, border 0.5s, color 0.5s, padding 0.5s;
108
- width: 100%;
109
- text-align: left;
110
- color: ${token.color.black};
111
- }
112
-
113
- .${ELEMENT_HEADLINE} > * {
114
- color: ${token.color.black};
115
- }
116
-
117
- @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {
118
- .${ELEMENT_HEADLINE} {
119
- padding: ${token.spacing.lg};
120
- padding-right: ${token.spacing["6xl"]}
121
- }
122
- }
123
-
124
- .${ELEMENT_HEADLINE}:before,
125
- .${ELEMENT_HEADLINE}:after {
126
- content: '';
127
- background-color: ${token.color.red};
128
- position: absolute;
129
- right: ${token.spacing.md};
130
- transition: background 0.5s, height 0.5s, right 0.5s, top 0.5s,
131
- transform 0.5s, width 0.5s;
132
- }
133
-
134
- .${ELEMENT_HEADLINE}:before {
135
- height: 4px;
136
- top: calc(50% - 2px);
137
- width: 16px;
138
- }
139
-
140
- @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {
141
- .${ELEMENT_HEADLINE}:before {
142
- width: 20px;
143
- right: 32px;
6
+ const { token } = Styles;
7
+ const CreateBody = ({ text, isStateOpen, isThemeDark }) => {
8
+ if (!text) return null;
9
+ const bodyContent = new ElementBuilder().withClassName("accordion-body").withStyles({
10
+ element: {
11
+ padding: token.spacing.md,
12
+ ...isThemeDark && {
13
+ color: token.color.white
14
+ },
15
+ [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {
16
+ padding: token.spacing.lg
17
+ },
18
+ "& > *": {
19
+ marginTop: token.spacing.sm,
20
+ [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {
21
+ marginTop: token.spacing.lg
22
+ },
23
+ "&:first-child": { marginTop: "0" }
24
+ },
25
+ "& *": {
26
+ ...isThemeDark && {
27
+ color: token.color.white
28
+ }
29
+ }
144
30
  }
145
- }
146
-
147
- .${ELEMENT_HEADLINE}:after {
148
- height: 16px;
149
- top: calc(50% - 8px);
150
- right: calc(${token.spacing.md} + 6px);
151
- width: 4px;
152
- }
153
-
154
- @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {
155
- .${ELEMENT_HEADLINE}:after {
156
- height: 20px;
157
- top: calc(50% - 10px);
158
- right: calc(${token.spacing.lg} + 8px);
31
+ }).withChild(text).build();
32
+ return new ElementBuilder().withClassName("accordion-body-wrapper").withAria({ hidden: isStateOpen ? "false" : "true" }).styled(Styles.typography.sans.medium).withStyles({
33
+ element: {
34
+ backgroundColor: token.color.gray.lightest,
35
+ height: "0",
36
+ overflow: "hidden",
37
+ display: "none",
38
+ ...isThemeDark && {
39
+ backgroundColor: token.color.gray.darker
40
+ }
159
41
  }
160
- }
161
-
162
- .${ELEMENT_HEADLINE}[aria-expanded='true'],
163
- .${ELEMENT_HEADLINE}:hover,
164
- .${ELEMENT_HEADLINE}:focus {
165
- background-color: ${token.color.gray.lightest};
166
- border-top: 2px solid ${token.color.red};
167
- }
168
-
169
- .${ELEMENT_HEADLINE}[aria-expanded='true'] > *,
170
- .${ELEMENT_HEADLINE}:hover > *,
171
- .${ELEMENT_HEADLINE}:focus > * {
172
- color: ${token.color.red};
173
- }
174
-
175
- .${ELEMENT_HEADLINE}[aria-expanded='true']:after {
176
- transform: rotate(90deg);
177
- }
178
- `;
179
- const STYLES_ACCORDION_ELEMENT = `
180
- .${ELEMENT_DECLARATION} {
181
- container: ${ELEMENT_NAME} / inline-size;
182
- }
183
-
184
- ${headlineStyles}
185
- ${bodyStyles}
186
- ${OverwriteThemeDark}
187
- `;
188
- const CreateBody = ({ text, isOpen }) => {
189
- const contentWrapper = document.createElement("div");
190
- contentWrapper.classList.add(ELEMENT_BODY_WRAPPER);
191
- if (text) {
192
- const wrapper = document.createElement("div");
193
- wrapper.classList.add(ELEMENT_BODY);
194
- contentWrapper.ariaHidden = isOpen ? "false" : "true";
195
- wrapper.appendChild(text);
196
- contentWrapper.appendChild(wrapper);
197
- return contentWrapper;
198
- }
199
- return null;
42
+ }).withChild(bodyContent).build();
200
43
  };
201
44
  const CreateHeadline = ({
202
45
  headline,
203
- isOpen,
46
+ isThemeDark,
47
+ isStateOpen,
204
48
  open,
205
49
  close
206
50
  }) => {
207
- const headlineContainer = document.createElement("button");
208
- headlineContainer.classList.add(ELEMENT_HEADLINE);
209
- headlineContainer.ariaExpanded = isOpen ? "true" : "false";
210
- if (headline) {
211
- headlineContainer.appendChild(headline);
212
- headlineContainer.addEventListener("click", () => {
213
- const isExpanded = headlineContainer.ariaExpanded == "true";
214
- if (isExpanded) {
215
- close({ hasAnimation: true });
216
- } else {
217
- open({ hasAnimation: true });
51
+ if (!headline) return null;
52
+ return new ElementBuilder("button").withClassName("accordion-headline").withAria({ expanded: isStateOpen ? "true" : "false" }).withChild(headline).on("click", (event) => {
53
+ const button = event.currentTarget;
54
+ const isExpanded = button.ariaExpanded === "true";
55
+ if (isExpanded) {
56
+ close({ hasAnimation: true });
57
+ } else {
58
+ open({ hasAnimation: true });
59
+ }
60
+ }).styled(Styles.typography.sans.large).withStyles({
61
+ element: {
62
+ display: "flex",
63
+ borderTop: "2px solid transparent",
64
+ padding: token.spacing.md,
65
+ paddingRight: token.spacing["4xl"],
66
+ backgroundColor: token.color.gray.lightest,
67
+ position: "relative",
68
+ transition: "background 0.5s, border 0.5s, color 0.5s, padding 0.5s",
69
+ width: "100%",
70
+ textAlign: "left",
71
+ color: token.color.black,
72
+ ...isThemeDark && {
73
+ backgroundColor: token.color.gray.darker
74
+ },
75
+ [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {
76
+ padding: token.spacing.lg,
77
+ paddingRight: token.spacing["6xl"]
78
+ },
79
+ "& > *": {
80
+ ...isThemeDark && {
81
+ color: token.color.white
82
+ }
83
+ },
84
+ "&:before, &:after": {
85
+ content: "''",
86
+ backgroundColor: token.color.red,
87
+ position: "absolute",
88
+ right: token.spacing.md,
89
+ transition: "background 0.5s, height 0.5s, right 0.5s, top 0.5s, transform 0.5s, width 0.5s",
90
+ ...isThemeDark && {
91
+ backgroundColor: token.color.gold
92
+ }
93
+ },
94
+ "&:before": {
95
+ height: "4px",
96
+ top: "calc(50% - 2px)",
97
+ width: "16px",
98
+ [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {
99
+ width: "20px",
100
+ right: "32px"
101
+ }
102
+ },
103
+ "&:after": {
104
+ height: "16px",
105
+ top: "calc(50% - 8px)",
106
+ right: `calc(${token.spacing.md} + 6px)`,
107
+ width: "4px",
108
+ [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {
109
+ height: "20px",
110
+ top: "calc(50% - 10px)",
111
+ right: `calc(${token.spacing.lg} + 8px)`
112
+ }
113
+ },
114
+ "&[aria-expanded='true'], &:hover, &:focus": {
115
+ borderTop: `2px solid ${token.color.red}`,
116
+ ...isThemeDark && {
117
+ borderTop: `2px solid ${token.color.gold}`
118
+ }
119
+ },
120
+ "&[aria-expanded='true'] > *, &:hover > *, &:focus > *": {
121
+ color: token.color.red,
122
+ ...isThemeDark && {
123
+ color: token.color.gold
124
+ }
125
+ },
126
+ "&[aria-expanded='true']:after": {
127
+ transform: "rotate(90deg)"
218
128
  }
219
- });
220
- return headlineContainer;
221
- }
222
- return null;
129
+ }
130
+ }).build();
223
131
  };
224
132
  const ActionAnimation = ({
225
133
  container,
@@ -230,29 +138,31 @@ const ActionAnimation = ({
230
138
  "button"
231
139
  );
232
140
  const bodyWrapperElement = container.querySelector(
233
- `.${ELEMENT_BODY_WRAPPER}`
234
- );
235
- const bodyElement = container.querySelector(
236
- `.${ELEMENT_BODY}`
141
+ ".accordion-body-wrapper"
237
142
  );
143
+ const bodyElement = container.querySelector(".accordion-body");
238
144
  if (!headlineContainer || !bodyWrapperElement || !bodyElement) {
239
- throw new Error("headlineContainer or bodyWrapperElement is not found");
145
+ console.warn("headlineContainer or bodyWrapperElement is not found");
146
+ return;
240
147
  }
241
- if (hasAnimation)
242
- bodyWrapperElement.style.transition = `height ${ANIMATION_TIME}ms ease-in-out`;
243
- if (isOpening) {
148
+ const animateOpen = () => {
244
149
  bodyWrapperElement.style.display = "block";
245
150
  setTimeout(() => {
246
151
  headlineContainer.ariaExpanded = "true";
247
152
  bodyWrapperElement.ariaHidden = "false";
248
153
  }, 100);
249
- } else {
154
+ };
155
+ const animateClose = () => {
250
156
  headlineContainer.ariaExpanded = "false";
251
157
  bodyWrapperElement.ariaHidden = "true";
252
158
  setTimeout(() => {
253
159
  bodyWrapperElement.style.display = "none";
254
160
  }, ANIMATION_TIME + 50);
255
- }
161
+ };
162
+ if (hasAnimation)
163
+ bodyWrapperElement.style.transition = `height ${ANIMATION_TIME}ms ease-in-out`;
164
+ if (isOpening) animateOpen();
165
+ else animateClose();
256
166
  setTimeout(() => {
257
167
  const bodyHeight = bodyElement.offsetHeight;
258
168
  bodyWrapperElement.style.height = isOpening ? `${bodyHeight}px` : "0";
@@ -262,52 +172,49 @@ const ActionAnimation = ({
262
172
  }, 100 + ANIMATION_TIME);
263
173
  };
264
174
  const createCompositeAccordionItem = (props) => (() => {
265
- const { isThemeDark, isThemeLight, isStateOpen = false } = props;
266
- const declaration = document.createElement("div");
267
- const container = document.createElement("div");
175
+ const { isStateOpen = false, context } = props;
176
+ const containerBuilder = new ElementBuilder().withClassName(
177
+ "accordion-container"
178
+ );
179
+ const container = containerBuilder.getElement();
268
180
  let isOpen = isStateOpen;
269
181
  const open = (props2) => {
270
182
  ActionAnimation({ ...props2, container, isOpening: true });
271
183
  isOpen = true;
184
+ context?.dispatchEvent(
185
+ new CustomEvent("accordion:open", { bubbles: true, composed: true })
186
+ );
272
187
  };
273
188
  const close = (props2) => {
274
189
  ActionAnimation({ ...props2, container, isOpening: false });
275
190
  isOpen = false;
191
+ context?.dispatchEvent(
192
+ new CustomEvent("accordion:close", { bubbles: true, composed: true })
193
+ );
276
194
  };
277
195
  const EventSize = () => {
278
196
  if (!isOpen) return;
279
197
  const bodyElement = container.querySelector(
280
- `.${ELEMENT_BODY}`
198
+ ".accordion-body"
281
199
  );
282
200
  const bodyWrapperElement = container.querySelector(
283
- `.${ELEMENT_BODY_WRAPPER}`
201
+ ".accordion-body-wrapper"
284
202
  );
285
203
  bodyWrapperElement.style.height = `${bodyElement.offsetHeight}px`;
286
204
  };
287
- const resize = () => {
288
- EventSize();
289
- };
290
- const headline = CreateHeadline({ ...props, isOpen, open, close });
291
- const body = CreateBody({ ...props, isOpen });
292
- if (headline) container.appendChild(headline);
293
- if (body) container.appendChild(body);
294
- container.classList.add(ELEMENT_CONTAINER);
295
- if (isThemeLight) container.setAttribute(ATTRIBUTE_THEME, "light");
296
- if (isThemeDark) container.setAttribute(ATTRIBUTE_THEME, "dark");
297
- declaration.appendChild(container);
298
- declaration.classList.add(ELEMENT_DECLARATION);
205
+ const headline = CreateHeadline({ ...props, isStateOpen, open, close });
206
+ const body = CreateBody({ ...props, isStateOpen });
207
+ const containerModel = containerBuilder.withChildren(headline, body).build();
299
208
  if (isStateOpen) {
300
- open({ hasAnimation: false });
209
+ ActionAnimation({ container, isOpening: true, hasAnimation: false });
210
+ isOpen = true;
301
211
  }
302
- window.addEventListener("resize", debounce(resize, 20));
303
- return {
304
- element: declaration,
305
- styles: STYLES_ACCORDION_ELEMENT,
306
- events: {
307
- open,
308
- close
212
+ window.addEventListener("resize", debounce(EventSize, 20));
213
+ return new ElementBuilder().withClassName("accordion-declaration").withStyles({
214
+ element: {
215
+ container: "umd-element-accordion-item / inline-size"
309
216
  }
310
- };
217
+ }).withChild(containerModel).withEvents({ open, close }).build();
311
218
  })();
312
219
  export {
313
220
  createCompositeAccordionItem
@@ -1 +1 @@
1
- {"version":3,"file":"item.js","sources":["../../../source/composite/accordion/item.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport { jssToCSS } from '@universityofmaryland/web-utilities-library/styles';\nimport { debounce } from '@universityofmaryland/web-utilities-library/performance';\n\ntype TypeHeadlineText = { headline?: HTMLElement | null };\ntype TypeBodyText = { text?: HTMLElement | null };\ntype TypeAccordionState = { isOpen: boolean };\ntype StateProps = {\n hasAnimation?: boolean;\n};\n\ntype TypeAccordionProps = TypeHeadlineText &\n TypeBodyText & {\n isThemeLight?: boolean;\n isThemeDark?: boolean;\n isStateOpen: boolean;\n };\n\ntype TypeHeadlineProps = TypeHeadlineText &\n TypeAccordionState & {\n close: (arg: StateProps) => void;\n open: (arg: StateProps) => void;\n };\n\ntype TypeBodyProps = TypeBodyText & TypeAccordionState;\n\ntype ActionAnimationProps = StateProps & {\n container: HTMLDivElement;\n isOpening: boolean;\n};\n\nconst { token } = Styles;\n\nconst SMALL = 480;\n\nconst ELEMENT_NAME = 'umd-element-accordion-item';\nconst ELEMENT_DECLARATION = 'accordion-declaration';\nconst ELEMENT_CONTAINER = 'accordion-container';\nconst ELEMENT_HEADLINE = 'accordion-headline';\nconst ELEMENT_BODY_WRAPPER = 'accordion-body-wrapper';\nconst ELEMENT_BODY = 'accordion-body';\n\nconst ATTRIBUTE_THEME = 'theme';\nconst THEME_DARK = 'dark';\nconst ANIMATION_TIME = 500;\n\nconst IS_THEME_DARK = `[${ATTRIBUTE_THEME}='${THEME_DARK}']`;\n\nconst OVERWRITE_THEME_DARK_HEADLINE = `.${ELEMENT_CONTAINER}${IS_THEME_DARK} .${ELEMENT_HEADLINE}`;\nconst OVERWRITE_THEME_DARK_BODY_WRAPPER = `.${ELEMENT_CONTAINER}${IS_THEME_DARK} .${ELEMENT_BODY_WRAPPER}`;\nconst OVERWRITE_THEME_DARK_BODY = `.${ELEMENT_CONTAINER}${IS_THEME_DARK} .${ELEMENT_BODY}`;\n\n// prettier-ignore\nconst OverwriteThemeDark = `\n ${OVERWRITE_THEME_DARK_HEADLINE} {\n background-color: ${token.color.gray.darker};\n }\n\n ${OVERWRITE_THEME_DARK_HEADLINE} > * {\n color: ${token.color.white}\n }\n\n ${OVERWRITE_THEME_DARK_HEADLINE}:before,\n ${OVERWRITE_THEME_DARK_HEADLINE}:after {\n background-color: ${token.color.gold};\n }\n\n ${OVERWRITE_THEME_DARK_HEADLINE}[aria-expanded='true'],\n ${OVERWRITE_THEME_DARK_HEADLINE}:hover,\n ${OVERWRITE_THEME_DARK_HEADLINE}:focus {\n background-color: ${token.color.gray.darker};\n border-top: 2px solid ${token.color.gold};\n }\n\n ${OVERWRITE_THEME_DARK_HEADLINE}[aria-expanded='true'] > *,\n ${OVERWRITE_THEME_DARK_HEADLINE}:hover > *,\n ${OVERWRITE_THEME_DARK_HEADLINE}:focus > * {\n color: ${token.color.gold};\n }\n\n ${OVERWRITE_THEME_DARK_BODY_WRAPPER} {\n background-color: ${token.color.gray.darker};\n }\n\n ${OVERWRITE_THEME_DARK_BODY},\n ${OVERWRITE_THEME_DARK_BODY} * {\n color: ${token.color.white};\n }\n`;\n\n// prettier-ignore\nconst bodyStyles = `\n ${jssToCSS({\n styleObj: {\n [`.${ELEMENT_BODY_WRAPPER}`]: Styles.typography.sans.medium\n },\n })}\n\n .${ELEMENT_BODY_WRAPPER} {\n background-color: ${token.color.gray.lightest};\n height: 0;\n overflow: hidden;\n display: none;\n }\n\n .${ELEMENT_BODY} {\n padding: ${token.spacing.md};\n }\n\n @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {\n .${ELEMENT_BODY} {\n padding: ${token.spacing.lg};\n }\n }\n\n .${ELEMENT_BODY} > * {\n margin-top: ${token.spacing.sm};\n }\n\n .${ELEMENT_BODY} > *:first-child {\n margin-top: 0;\n }\n\n @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {\n .${ELEMENT_BODY} > * {\n margin-top: ${token.spacing.lg};\n }\n }\n`;\n\n// prettier-ignore\nconst headlineStyles = `\n ${jssToCSS({\n styleObj: {\n [`.${ELEMENT_HEADLINE}`]: Styles.typography.sans.large,\n },\n })}\n\n .${ELEMENT_HEADLINE} {\n display: flex;\n border-top: 2px solid transparent;\n padding: ${token.spacing.md};\n padding-right: ${token.spacing['4xl']};\n background-color: ${token.color.gray.lightest};\n position: relative;\n transition: background 0.5s, border 0.5s, color 0.5s, padding 0.5s;\n width: 100%;\n text-align: left;\n color: ${token.color.black};\n }\n\n .${ELEMENT_HEADLINE} > * {\n color: ${token.color.black};\n }\n\n @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {\n .${ELEMENT_HEADLINE} {\n padding: ${token.spacing.lg};\n padding-right: ${token.spacing['6xl']}\n }\n }\n\n .${ELEMENT_HEADLINE}:before,\n .${ELEMENT_HEADLINE}:after {\n content: '';\n background-color: ${token.color.red};\n position: absolute;\n right: ${token.spacing.md};\n transition: background 0.5s, height 0.5s, right 0.5s, top 0.5s,\n transform 0.5s, width 0.5s;\n }\n\n .${ELEMENT_HEADLINE}:before {\n height: 4px;\n top: calc(50% - 2px);\n width: 16px;\n }\n\n @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {\n .${ELEMENT_HEADLINE}:before {\n width: 20px;\n right: 32px;\n }\n }\n\n .${ELEMENT_HEADLINE}:after {\n height: 16px;\n top: calc(50% - 8px);\n right: calc(${token.spacing.md} + 6px);\n width: 4px;\n }\n\n @container ${ELEMENT_NAME} (min-width: ${SMALL}px) {\n .${ELEMENT_HEADLINE}:after {\n height: 20px;\n top: calc(50% - 10px);\n right: calc(${token.spacing.lg} + 8px);\n }\n }\n\n .${ELEMENT_HEADLINE}[aria-expanded='true'],\n .${ELEMENT_HEADLINE}:hover,\n .${ELEMENT_HEADLINE}:focus {\n background-color: ${token.color.gray.lightest};\n border-top: 2px solid ${token.color.red};\n }\n\n .${ELEMENT_HEADLINE}[aria-expanded='true'] > *,\n .${ELEMENT_HEADLINE}:hover > *,\n .${ELEMENT_HEADLINE}:focus > * {\n color: ${token.color.red};\n }\n\n .${ELEMENT_HEADLINE}[aria-expanded='true']:after {\n transform: rotate(90deg);\n }\n`;\n\nconst STYLES_ACCORDION_ELEMENT = `\n .${ELEMENT_DECLARATION} {\n container: ${ELEMENT_NAME} / inline-size;\n }\n\n ${headlineStyles}\n ${bodyStyles}\n ${OverwriteThemeDark}\n`;\n\nconst CreateBody = ({ text, isOpen }: TypeBodyProps) => {\n const contentWrapper = document.createElement('div');\n\n contentWrapper.classList.add(ELEMENT_BODY_WRAPPER);\n\n if (text) {\n const wrapper = document.createElement('div');\n wrapper.classList.add(ELEMENT_BODY);\n contentWrapper.ariaHidden = isOpen ? 'false' : 'true';\n wrapper.appendChild(text);\n contentWrapper.appendChild(wrapper);\n\n return contentWrapper;\n }\n\n return null;\n};\n\nconst CreateHeadline = ({\n headline,\n isOpen,\n open,\n close,\n}: TypeHeadlineProps) => {\n const headlineContainer = document.createElement('button');\n\n headlineContainer.classList.add(ELEMENT_HEADLINE);\n headlineContainer.ariaExpanded = isOpen ? 'true' : 'false';\n\n if (headline) {\n headlineContainer.appendChild(headline);\n\n headlineContainer.addEventListener('click', () => {\n const isExpanded = headlineContainer.ariaExpanded == 'true';\n\n if (isExpanded) {\n close({ hasAnimation: true });\n } else {\n open({ hasAnimation: true });\n }\n });\n\n return headlineContainer;\n }\n\n return null;\n};\n\nconst ActionAnimation = ({\n container,\n isOpening = true,\n hasAnimation = true,\n}: ActionAnimationProps) => {\n const headlineContainer = container.querySelector(\n 'button',\n ) as HTMLButtonElement;\n const bodyWrapperElement = container.querySelector(\n `.${ELEMENT_BODY_WRAPPER}`,\n ) as HTMLElement;\n const bodyElement = container.querySelector(\n `.${ELEMENT_BODY}`,\n ) as HTMLElement;\n\n if (!headlineContainer || !bodyWrapperElement || !bodyElement) {\n throw new Error('headlineContainer or bodyWrapperElement is not found');\n }\n\n if (hasAnimation)\n bodyWrapperElement.style.transition = `height ${ANIMATION_TIME}ms ease-in-out`;\n\n if (isOpening) {\n bodyWrapperElement.style.display = 'block';\n\n setTimeout(() => {\n headlineContainer.ariaExpanded = 'true';\n bodyWrapperElement.ariaHidden = 'false';\n }, 100);\n } else {\n headlineContainer.ariaExpanded = 'false';\n bodyWrapperElement.ariaHidden = 'true';\n\n setTimeout(() => {\n bodyWrapperElement.style.display = 'none';\n }, ANIMATION_TIME + 50);\n }\n\n setTimeout(() => {\n const bodyHeight = bodyElement.offsetHeight;\n bodyWrapperElement.style.height = isOpening ? `${bodyHeight}px` : '0';\n }, 100);\n\n setTimeout(() => {\n bodyWrapperElement.style.transition = 'none';\n }, 100 + ANIMATION_TIME);\n};\n\nexport const createCompositeAccordionItem = (props: TypeAccordionProps) =>\n (() => {\n const { isThemeDark, isThemeLight, isStateOpen = false } = props;\n const declaration = document.createElement('div');\n const container = document.createElement('div');\n let isOpen = isStateOpen;\n\n const open = (props: StateProps) => {\n ActionAnimation({ ...props, container, isOpening: true });\n isOpen = true;\n };\n const close = (props: StateProps) => {\n ActionAnimation({ ...props, container, isOpening: false });\n isOpen = false;\n };\n const EventSize = () => {\n if (!isOpen) return;\n const bodyElement = container.querySelector(\n `.${ELEMENT_BODY}`,\n ) as HTMLElement;\n const bodyWrapperElement = container.querySelector(\n `.${ELEMENT_BODY_WRAPPER}`,\n ) as HTMLElement;\n\n bodyWrapperElement.style.height = `${bodyElement.offsetHeight}px`;\n };\n const resize = () => {\n EventSize();\n };\n\n const headline = CreateHeadline({ ...props, isOpen, open, close });\n const body = CreateBody({ ...props, isOpen });\n\n if (headline) container.appendChild(headline);\n if (body) container.appendChild(body);\n\n container.classList.add(ELEMENT_CONTAINER);\n if (isThemeLight) container.setAttribute(ATTRIBUTE_THEME, 'light');\n if (isThemeDark) container.setAttribute(ATTRIBUTE_THEME, 'dark');\n\n declaration.appendChild(container);\n declaration.classList.add(ELEMENT_DECLARATION);\n\n if (isStateOpen) {\n open({ hasAnimation: false });\n }\n\n window.addEventListener('resize', debounce(resize, 20));\n\n return {\n element: declaration,\n styles: STYLES_ACCORDION_ELEMENT,\n events: {\n open,\n close,\n },\n };\n })();\n"],"names":["props"],"mappings":"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"}
1
+ {"version":3,"file":"item.js","sources":["../../../source/composite/accordion/item.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';\n\ntype TypeAccordionProps = {\n headline?: HTMLElement | null;\n text?: HTMLElement | null;\n isThemeLight?: boolean;\n isThemeDark?: boolean;\n isStateOpen: boolean;\n context?: HTMLElement;\n};\n\ntype StateProps = {\n hasAnimation?: boolean;\n};\n\ntype StateFunctions = {\n open: (props: StateProps) => void;\n close: (props: StateProps) => void;\n};\n\ntype ActionAnimationProps = StateProps & {\n container: HTMLDivElement;\n isOpening: boolean;\n};\n\nconst SMALL = 480;\nconst ANIMATION_TIME = 500;\n\nconst { token } = Styles;\n\nconst CreateBody = ({ text, isStateOpen, isThemeDark }: TypeAccordionProps) => {\n if (!text) return null;\n\n const bodyContent = new ElementBuilder()\n .withClassName('accordion-body')\n .withStyles({\n element: {\n padding: token.spacing.md,\n ...(isThemeDark && {\n color: token.color.white,\n }),\n [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {\n padding: token.spacing.lg,\n },\n '& > *': {\n marginTop: token.spacing.sm,\n [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {\n marginTop: token.spacing.lg,\n },\n '&:first-child': { marginTop: '0' },\n },\n '& *': {\n ...(isThemeDark && {\n color: token.color.white,\n }),\n },\n },\n })\n .withChild(text)\n .build();\n\n return new ElementBuilder()\n .withClassName('accordion-body-wrapper')\n .withAria({ hidden: isStateOpen ? 'false' : 'true' })\n .styled(Styles.typography.sans.medium)\n .withStyles({\n element: {\n backgroundColor: token.color.gray.lightest,\n height: '0',\n overflow: 'hidden',\n display: 'none',\n ...(isThemeDark && {\n backgroundColor: token.color.gray.darker,\n }),\n },\n })\n .withChild(bodyContent)\n .build();\n};\n\nconst CreateHeadline = ({\n headline,\n isThemeDark,\n isStateOpen,\n open,\n close,\n}: TypeAccordionProps & StateFunctions) => {\n if (!headline) return null;\n\n return new ElementBuilder('button')\n .withClassName('accordion-headline')\n .withAria({ expanded: isStateOpen ? 'true' : 'false' })\n .withChild(headline)\n .on('click', (event) => {\n const button = event.currentTarget as HTMLButtonElement;\n const isExpanded = button.ariaExpanded === 'true';\n\n if (isExpanded) {\n close({ hasAnimation: true });\n } else {\n open({ hasAnimation: true });\n }\n })\n .styled(Styles.typography.sans.large)\n .withStyles({\n element: {\n display: 'flex',\n borderTop: '2px solid transparent',\n padding: token.spacing.md,\n paddingRight: token.spacing['4xl'],\n backgroundColor: token.color.gray.lightest,\n position: 'relative',\n transition: 'background 0.5s, border 0.5s, color 0.5s, padding 0.5s',\n width: '100%',\n textAlign: 'left',\n color: token.color.black,\n ...(isThemeDark && {\n backgroundColor: token.color.gray.darker,\n }),\n [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {\n padding: token.spacing.lg,\n paddingRight: token.spacing['6xl'],\n },\n '& > *': {\n ...(isThemeDark && {\n color: token.color.white,\n }),\n },\n '&:before, &:after': {\n content: \"''\",\n backgroundColor: token.color.red,\n position: 'absolute',\n right: token.spacing.md,\n transition:\n 'background 0.5s, height 0.5s, right 0.5s, top 0.5s, transform 0.5s, width 0.5s',\n ...(isThemeDark && {\n backgroundColor: token.color.gold,\n }),\n },\n '&:before': {\n height: '4px',\n top: 'calc(50% - 2px)',\n width: '16px',\n [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {\n width: '20px',\n right: '32px',\n },\n },\n '&:after': {\n height: '16px',\n top: 'calc(50% - 8px)',\n right: `calc(${token.spacing.md} + 6px)`,\n width: '4px',\n [`@container umd-element-accordion-item (min-width: ${SMALL}px)`]: {\n height: '20px',\n top: 'calc(50% - 10px)',\n right: `calc(${token.spacing.lg} + 8px)`,\n },\n },\n \"&[aria-expanded='true'], &:hover, &:focus\": {\n borderTop: `2px solid ${token.color.red}`,\n ...(isThemeDark && {\n borderTop: `2px solid ${token.color.gold}`,\n }),\n },\n \"&[aria-expanded='true'] > *, &:hover > *, &:focus > *\": {\n color: token.color.red,\n ...(isThemeDark && {\n color: token.color.gold,\n }),\n },\n \"&[aria-expanded='true']:after\": {\n transform: 'rotate(90deg)',\n },\n },\n })\n .build();\n};\n\nconst ActionAnimation = ({\n container,\n isOpening = true,\n hasAnimation = true,\n}: ActionAnimationProps) => {\n const headlineContainer = container.querySelector(\n 'button',\n ) as HTMLButtonElement;\n const bodyWrapperElement = container.querySelector(\n '.accordion-body-wrapper',\n ) as HTMLElement;\n const bodyElement = container.querySelector('.accordion-body') as HTMLElement;\n\n if (!headlineContainer || !bodyWrapperElement || !bodyElement) {\n console.warn('headlineContainer or bodyWrapperElement is not found');\n return;\n }\n\n const animateOpen = () => {\n bodyWrapperElement.style.display = 'block';\n setTimeout(() => {\n headlineContainer.ariaExpanded = 'true';\n bodyWrapperElement.ariaHidden = 'false';\n }, 100);\n };\n\n const animateClose = () => {\n headlineContainer.ariaExpanded = 'false';\n bodyWrapperElement.ariaHidden = 'true';\n setTimeout(() => {\n bodyWrapperElement.style.display = 'none';\n }, ANIMATION_TIME + 50);\n };\n\n if (hasAnimation)\n bodyWrapperElement.style.transition = `height ${ANIMATION_TIME}ms ease-in-out`;\n\n if (isOpening) animateOpen();\n else animateClose();\n\n setTimeout(() => {\n const bodyHeight = bodyElement.offsetHeight;\n bodyWrapperElement.style.height = isOpening ? `${bodyHeight}px` : '0';\n }, 100);\n\n setTimeout(() => {\n bodyWrapperElement.style.transition = 'none';\n }, 100 + ANIMATION_TIME);\n};\n\nexport const createCompositeAccordionItem = (props: TypeAccordionProps) =>\n (() => {\n const { isStateOpen = false, context } = props;\n const containerBuilder = new ElementBuilder().withClassName(\n 'accordion-container',\n );\n const container = containerBuilder.getElement() as HTMLDivElement;\n\t\tlet isOpen = isStateOpen;\n\n const open = (props: StateProps) => {\n ActionAnimation({ ...props, container, isOpening: true });\n isOpen = true;\n context?.dispatchEvent(\n new CustomEvent('accordion:open', { bubbles: true, composed: true }),\n );\n };\n\n const close = (props: StateProps) => {\n ActionAnimation({ ...props, container, isOpening: false });\n isOpen = false;\n context?.dispatchEvent(\n new CustomEvent('accordion:close', { bubbles: true, composed: true }),\n );\n };\n\t\t\n const EventSize = () => {\n if (!isOpen) return;\n const bodyElement = container.querySelector(\n '.accordion-body',\n ) as HTMLElement;\n const bodyWrapperElement = container.querySelector(\n '.accordion-body-wrapper',\n ) as HTMLElement;\n\n bodyWrapperElement.style.height = `${bodyElement.offsetHeight}px`;\n };\n\n const headline = CreateHeadline({ ...props, isStateOpen, open, close });\n const body = CreateBody({ ...props, isStateOpen });\n\n const containerModel = containerBuilder\n .withChildren(headline, body)\n .build();\n\n if (isStateOpen) {\n // Initial render: animate open without dispatching an event — the\n // accordion:open/close events represent toggles, not initial state.\n ActionAnimation({ container, isOpening: true, hasAnimation: false });\n isOpen = true;\n }\n\n window.addEventListener('resize', debounce(EventSize, 20));\n\n return new ElementBuilder()\n .withClassName('accordion-declaration')\n .withStyles({\n element: {\n container: 'umd-element-accordion-item / inline-size',\n },\n })\n .withChild(containerModel)\n .withEvents({ open, close })\n .build();\n })();\n"],"names":["props"],"mappings":"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"}
@@ -13,7 +13,6 @@ import "@universityofmaryland/web-icons-library/files";
13
13
  import "@universityofmaryland/web-icons-library/brand";
14
14
  import "@universityofmaryland/web-icons-library/arrows";
15
15
  import "@universityofmaryland/web-utilities-library/performance";
16
- import "../../atomic/animations/brand/chevron-scroll.js";
17
16
  import "../../atomic/animations/brand/card-stack.js";
18
17
  import { createImageBackground } from "../../atomic/assets/image/background.js";
19
18
  import "@universityofmaryland/web-styles-library";
@@ -22,10 +21,10 @@ import "@universityofmaryland/web-icons-library/location";
22
21
  import "@universityofmaryland/web-icons-library/calendar";
23
22
  import "@universityofmaryland/web-utilities-library/theme";
24
23
  import { image, textContainer, container } from "../../atomic/layout/block/stacked.js";
25
- import "../../atomic/layout/overlay/modal.js";
26
24
  import "../../atomic/layout/person/columns.js";
27
25
  import "@universityofmaryland/web-icons-library/social";
28
- import "../../atomic/text-lockup/date.js";
26
+ import "@universityofmaryland/web-utilities-library/string";
27
+ import "@universityofmaryland/web-utilities-library/animation";
29
28
  import "../../atomic/text-lockup/small.js";
30
29
  import { createTextLockupSmallScaling } from "../../atomic/text-lockup/small-scaling.js";
31
30
  const smallBreakpoint = token.media.breakpointValues.small.max;
@@ -1 +1 @@
1
- {"version":3,"file":"block.js","sources":["../../../source/composite/card/block.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { createMediaQuery } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, layout, textLockup } from 'atomic';\nimport { CardBlockProps } from './_types';\nimport { type UMDElement } from '../../_types';\n\nconst smallBreakpoint = token.media.breakpointValues.small.max;\n\nexport const createCompositeCardBlock = (props: CardBlockProps) => {\n const {\n dateSign,\n hasBorder,\n hasEyebrowRibbon,\n image,\n imageLoading = 'lazy',\n isAligned,\n isThemeDark,\n isTransparent,\n newsId,\n } = props;\n const shouldImageBeFullWidth = hasEyebrowRibbon;\n const children: UMDElement[] = [];\n const sizingProps = {\n isThemeDark,\n isTransparent,\n hasBorder,\n };\n\n if (image) {\n children.push(\n layout.block.stacked.image({\n children: [\n assets.image.background({\n element: image,\n isScaled: true,\n isAspectStandard: isAligned,\n dateSign,\n imageLoading,\n }),\n ],\n customStyles: {\n ...(shouldImageBeFullWidth && {\n ...createMediaQuery('max-width', smallBreakpoint, {\n marginBottom: token.spacing.md,\n width: '100%',\n }),\n }),\n },\n ...sizingProps,\n }),\n );\n }\n\n children.push(\n layout.block.stacked.textContainer({\n children: [textLockup.smallScaling(props)],\n ...sizingProps,\n hasImage: !!image,\n }),\n );\n\n const composite = layout.block.stacked.container({\n children,\n ...sizingProps,\n });\n\n if (newsId) {\n composite?.element.setAttribute('news-id', newsId);\n }\n\n return composite;\n};\n"],"names":["image","layout.block.stacked.image","assets.image.background","layout.block.stacked.textContainer","textLockup.smallScaling","layout.block.stacked.container"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAM,kBAAkB,MAAM,MAAM,iBAAiB,MAAM;AAEpD,MAAM,2BAA2B,CAAC,UAA0B;AACjE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IAAA,OACAA;AAAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,yBAAyB;AAC/B,QAAM,WAAyB,CAAA;AAC/B,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,MAAIA,SAAO;AACT,aAAS;AAAA,MACPC,MAA2B;AAAA,QACzB,UAAU;AAAA,UACRC,sBAAwB;AAAA,YACtB,SAASF;AAAAA,YACT,UAAU;AAAA,YACV,kBAAkB;AAAA,YAClB;AAAA,YACA;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,cAAc;AAAA,UACZ,GAAI,0BAA0B;AAAA,YAC5B,GAAG,iBAAiB,aAAa,iBAAiB;AAAA,cAChD,cAAc,MAAM,QAAQ;AAAA,cAC5B,OAAO;AAAA,YAAA,CACR;AAAA,UAAA;AAAA,QACH;AAAA,QAEF,GAAG;AAAA,MAAA,CACJ;AAAA,IAAA;AAAA,EAEL;AAEA,WAAS;AAAA,IACPG,cAAmC;AAAA,MACjC,UAAU,CAACC,6BAAwB,KAAK,CAAC;AAAA,MACzC,GAAG;AAAA,MACH,UAAU,CAAC,CAACJ;AAAAA,IAAA,CACb;AAAA,EAAA;AAGH,QAAM,YAAYK,UAA+B;AAAA,IAC/C;AAAA,IACA,GAAG;AAAA,EAAA,CACJ;AAED,MAAI,QAAQ;AACV,eAAW,QAAQ,aAAa,WAAW,MAAM;AAAA,EACnD;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"block.js","sources":["../../../source/composite/card/block.ts"],"sourcesContent":["import * as token from '@universityofmaryland/web-token-library';\nimport { createMediaQuery } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, layout, textLockup } from 'atomic';\nimport { CardBlockProps } from './_types';\nimport { type UMDElement } from '../../_types';\n\nconst smallBreakpoint = token.media.breakpointValues.small.max;\n\nexport const createCompositeCardBlock = (props: CardBlockProps) => {\n const {\n dateSign,\n hasBorder,\n hasEyebrowRibbon,\n image,\n imageLoading = 'lazy',\n isAligned,\n isThemeDark,\n isTransparent,\n newsId,\n } = props;\n const shouldImageBeFullWidth = hasEyebrowRibbon;\n const children: UMDElement[] = [];\n const sizingProps = {\n isThemeDark,\n isTransparent,\n hasBorder,\n };\n\n if (image) {\n children.push(\n layout.block.stacked.image({\n children: [\n assets.image.background({\n element: image,\n isScaled: true,\n isAspectStandard: isAligned,\n dateSign,\n imageLoading,\n }),\n ],\n customStyles: {\n ...(shouldImageBeFullWidth && {\n ...createMediaQuery('max-width', smallBreakpoint, {\n marginBottom: token.spacing.md,\n width: '100%',\n }),\n }),\n },\n ...sizingProps,\n }),\n );\n }\n\n children.push(\n layout.block.stacked.textContainer({\n children: [textLockup.smallScaling(props)],\n ...sizingProps,\n hasImage: !!image,\n }),\n );\n\n const composite = layout.block.stacked.container({\n children,\n ...sizingProps,\n });\n\n if (newsId) {\n composite?.element.setAttribute('news-id', newsId);\n }\n\n return composite;\n};\n"],"names":["image","layout.block.stacked.image","assets.image.background","layout.block.stacked.textContainer","textLockup.smallScaling","layout.block.stacked.container"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAM,kBAAkB,MAAM,MAAM,iBAAiB,MAAM;AAEpD,MAAM,2BAA2B,CAAC,UAA0B;AACjE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IAAA,OACAA;AAAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,yBAAyB;AAC/B,QAAM,WAAyB,CAAA;AAC/B,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,MAAIA,SAAO;AACT,aAAS;AAAA,MACPC,MAA2B;AAAA,QACzB,UAAU;AAAA,UACRC,sBAAwB;AAAA,YACtB,SAASF;AAAAA,YACT,UAAU;AAAA,YACV,kBAAkB;AAAA,YAClB;AAAA,YACA;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,cAAc;AAAA,UACZ,GAAI,0BAA0B;AAAA,YAC5B,GAAG,iBAAiB,aAAa,iBAAiB;AAAA,cAChD,cAAc,MAAM,QAAQ;AAAA,cAC5B,OAAO;AAAA,YAAA,CACR;AAAA,UAAA;AAAA,QACH;AAAA,QAEF,GAAG;AAAA,MAAA,CACJ;AAAA,IAAA;AAAA,EAEL;AAEA,WAAS;AAAA,IACPG,cAAmC;AAAA,MACjC,UAAU,CAACC,6BAAwB,KAAK,CAAC;AAAA,MACzC,GAAG;AAAA,MACH,UAAU,CAAC,CAACJ;AAAAA,IAAA,CACb;AAAA,EAAA;AAGH,QAAM,YAAYK,UAA+B;AAAA,IAC/C;AAAA,IACA,GAAG;AAAA,EAAA,CACJ;AAED,MAAI,QAAQ;AACV,eAAW,QAAQ,aAAa,WAAW,MAAM;AAAA,EACnD;AAEA,SAAO;AACT;"}
@@ -17,17 +17,16 @@ import "@universityofmaryland/web-icons-library/files";
17
17
  import "@universityofmaryland/web-icons-library/brand";
18
18
  import "@universityofmaryland/web-icons-library/arrows";
19
19
  import "@universityofmaryland/web-utilities-library/performance";
20
- import "../../atomic/animations/brand/chevron-scroll.js";
21
20
  import "../../atomic/animations/brand/card-stack.js";
22
21
  import { createImageBackground } from "../../atomic/assets/image/background.js";
23
22
  import "@universityofmaryland/web-styles-library";
24
23
  import "@universityofmaryland/web-utilities-library/accessibility";
25
24
  import "@universityofmaryland/web-icons-library/calendar";
26
25
  import "../../atomic/layout/block/stacked.js";
27
- import "../../atomic/layout/overlay/modal.js";
28
26
  import "../../atomic/layout/person/columns.js";
29
27
  import "@universityofmaryland/web-icons-library/social";
30
- import "../../atomic/text-lockup/date.js";
28
+ import "@universityofmaryland/web-utilities-library/string";
29
+ import "@universityofmaryland/web-utilities-library/animation";
31
30
  import { createTextLockupSmall } from "../../atomic/text-lockup/small.js";
32
31
  const mediumBreakpointStart = token.media.breakpointValues.medium.min;
33
32
  const smallBreakpoint = token.media.breakpointValues.small.max;