@universityofmaryland/web-feeds-library 1.3.0-beta.2 → 1.3.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 (88) hide show
  1. package/dist/experts.js +2 -0
  2. package/dist/experts.js.map +1 -1
  3. package/dist/factory/core/createBaseFeed.d.ts.map +1 -1
  4. package/dist/factory/core/createBaseFeed.js +2 -0
  5. package/dist/factory/core/createBaseFeed.js.map +1 -1
  6. package/dist/factory/core/types.d.ts +1 -0
  7. package/dist/factory/core/types.d.ts.map +1 -1
  8. package/dist/feeds/events/grid.js +1 -0
  9. package/dist/feeds/events/grid.js.map +1 -1
  10. package/dist/feeds/events/grouped.js +1 -0
  11. package/dist/feeds/events/grouped.js.map +1 -1
  12. package/dist/feeds/events/list.js +1 -0
  13. package/dist/feeds/events/list.js.map +1 -1
  14. package/dist/feeds/experts/_types.d.ts +8 -2
  15. package/dist/feeds/experts/_types.d.ts.map +1 -1
  16. package/dist/feeds/experts/bio.d.ts.map +1 -1
  17. package/dist/feeds/experts/bio.js +14 -4
  18. package/dist/feeds/experts/bio.js.map +1 -1
  19. package/dist/feeds/experts/grid.js +1 -0
  20. package/dist/feeds/experts/grid.js.map +1 -1
  21. package/dist/feeds/experts/in-the-news.d.ts +4 -0
  22. package/dist/feeds/experts/in-the-news.d.ts.map +1 -0
  23. package/dist/feeds/experts/in-the-news.js +348 -0
  24. package/dist/feeds/experts/in-the-news.js.map +1 -0
  25. package/dist/feeds/experts/index.d.ts +1 -0
  26. package/dist/feeds/experts/index.d.ts.map +1 -1
  27. package/dist/feeds/experts/list.js +1 -0
  28. package/dist/feeds/experts/list.js.map +1 -1
  29. package/dist/feeds/in-the-news/_types.d.ts +14 -0
  30. package/dist/feeds/in-the-news/_types.d.ts.map +1 -0
  31. package/dist/feeds/in-the-news/grid.d.ts +4 -0
  32. package/dist/feeds/in-the-news/grid.d.ts.map +1 -0
  33. package/dist/feeds/in-the-news/grid.js +28 -0
  34. package/dist/feeds/in-the-news/grid.js.map +1 -0
  35. package/dist/feeds/in-the-news/index.d.ts +3 -0
  36. package/dist/feeds/in-the-news/index.d.ts.map +1 -0
  37. package/dist/feeds/in-the-news/list.d.ts +4 -0
  38. package/dist/feeds/in-the-news/list.d.ts.map +1 -0
  39. package/dist/feeds/in-the-news/list.js +29 -0
  40. package/dist/feeds/in-the-news/list.js.map +1 -0
  41. package/dist/feeds/news/featured.d.ts.map +1 -1
  42. package/dist/feeds/news/featured.js +10 -3
  43. package/dist/feeds/news/featured.js.map +1 -1
  44. package/dist/feeds/news/grid.js +1 -0
  45. package/dist/feeds/news/grid.js.map +1 -1
  46. package/dist/feeds/news/list.js +1 -0
  47. package/dist/feeds/news/list.js.map +1 -1
  48. package/dist/in-the-news.d.ts +2 -0
  49. package/dist/in-the-news.js +7 -0
  50. package/dist/in-the-news.js.map +1 -0
  51. package/dist/index.d.ts +1 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +2 -0
  54. package/dist/index.js.map +1 -1
  55. package/dist/strategies/display/experts.d.ts +2 -1
  56. package/dist/strategies/display/experts.d.ts.map +1 -1
  57. package/dist/strategies/display/experts.js +43 -11
  58. package/dist/strategies/display/experts.js.map +1 -1
  59. package/dist/strategies/display/inTheNews.d.ts +4 -0
  60. package/dist/strategies/display/inTheNews.d.ts.map +1 -0
  61. package/dist/strategies/display/inTheNews.js +99 -0
  62. package/dist/strategies/display/inTheNews.js.map +1 -0
  63. package/dist/strategies/display/index.d.ts +2 -1
  64. package/dist/strategies/display/index.d.ts.map +1 -1
  65. package/dist/strategies/fetch/experts.d.ts +1 -1
  66. package/dist/strategies/fetch/experts.d.ts.map +1 -1
  67. package/dist/strategies/fetch/experts.js +11 -8
  68. package/dist/strategies/fetch/experts.js.map +1 -1
  69. package/dist/strategies/fetch/graphql.d.ts.map +1 -1
  70. package/dist/strategies/fetch/graphql.js +6 -3
  71. package/dist/strategies/fetch/graphql.js.map +1 -1
  72. package/dist/strategies/fetch/inTheNews.d.ts +4 -0
  73. package/dist/strategies/fetch/inTheNews.d.ts.map +1 -0
  74. package/dist/strategies/fetch/inTheNews.js +87 -0
  75. package/dist/strategies/fetch/inTheNews.js.map +1 -0
  76. package/dist/strategies/fetch/index.d.ts +2 -0
  77. package/dist/strategies/fetch/index.d.ts.map +1 -1
  78. package/dist/strategies/index.d.ts +3 -3
  79. package/dist/strategies/index.d.ts.map +1 -1
  80. package/dist/types/api.d.ts +1 -0
  81. package/dist/types/api.d.ts.map +1 -1
  82. package/dist/types/data/experts.d.ts +8 -0
  83. package/dist/types/data/experts.d.ts.map +1 -1
  84. package/dist/types/data/inTheNews.d.ts +32 -0
  85. package/dist/types/data/inTheNews.d.ts.map +1 -0
  86. package/dist/types/data/index.d.ts +1 -0
  87. package/dist/types/data/index.d.ts.map +1 -1
  88. package/package.json +6 -1
@@ -0,0 +1,348 @@
1
+ import { ElementBuilder } from "@universityofmaryland/web-builder-library";
2
+ import * as token from "@universityofmaryland/web-token-library";
3
+ import { card } from "@universityofmaryland/web-elements-library/composite";
4
+ import { gridOffset, stacked } from "@universityofmaryland/web-elements-library/layout";
5
+ import { LoadingState } from "../../states/loading.js";
6
+ import { EmptyState } from "../../states/empty.js";
7
+ import { PaginationState } from "../../states/pagination.js";
8
+ import { Announcer } from "../../states/announcer.js";
9
+ import { expertsFetchStrategy } from "../../strategies/fetch/experts.js";
10
+ import { inTheNewsFetchStrategy } from "../../strategies/fetch/inTheNews.js";
11
+ import { expertsDisplayStrategy } from "../../strategies/display/experts.js";
12
+ import { inTheNewsDisplayStrategy } from "../../strategies/display/inTheNews.js";
13
+ import { dispatch, eventNames } from "../../helpers/events/index.js";
14
+ import { setShadowStyles } from "../../helpers/styles/shadow.js";
15
+ const DEFAULT_ROWS_TO_START = 5;
16
+ const MIN_ROWS_TO_START = 2;
17
+ const MAX_ROWS_TO_START = 10;
18
+ const LOAD_MORE_ITEMS = 5;
19
+ const normalizeRowCount = (rows) => {
20
+ if (rows === void 0) return DEFAULT_ROWS_TO_START;
21
+ return Math.max(MIN_ROWS_TO_START, Math.min(MAX_ROWS_TO_START, rows));
22
+ };
23
+ const createExpertFetchProps = (token2, expertId) => ({
24
+ token: token2,
25
+ limit: 1,
26
+ offset: 0,
27
+ ids: [expertId]
28
+ });
29
+ const createNewsFetchProps = (token2, expertId, numberOfRowsToStart, offset) => ({
30
+ token: token2,
31
+ expertId,
32
+ numberOfRowsToStart,
33
+ getOffset: () => offset
34
+ });
35
+ const createAnnouncerMessage = (showing, total, isLazyLoad) => isLazyLoad ? `Showing ${showing} of ${total} news articles` : `Showing ${showing} news articles`;
36
+ class InTheNewsFeedState {
37
+ constructor(initialStyles) {
38
+ this.stylesArray = [];
39
+ this.shadowRoot = null;
40
+ this.totalEntries = 0;
41
+ this.offset = 0;
42
+ this.pagination = null;
43
+ this.stylesArray.push(initialStyles);
44
+ }
45
+ addStyles(styles) {
46
+ this.stylesArray.push(styles);
47
+ }
48
+ setShadowRoot(shadow) {
49
+ this.shadowRoot = shadow;
50
+ }
51
+ async updateShadowStyles() {
52
+ if (!this.shadowRoot) return;
53
+ await setShadowStyles({
54
+ shadowRoot: this.shadowRoot,
55
+ styles: this.getStyles()
56
+ });
57
+ }
58
+ getStyles() {
59
+ return this.stylesArray.join("\n");
60
+ }
61
+ getShadowCallback() {
62
+ return (shadow) => this.setShadowRoot(shadow);
63
+ }
64
+ getOffset() {
65
+ return this.offset;
66
+ }
67
+ setOffset(value) {
68
+ this.offset = value;
69
+ }
70
+ incrementOffset(count) {
71
+ this.offset += count;
72
+ }
73
+ getTotalEntries() {
74
+ return this.totalEntries;
75
+ }
76
+ setTotalEntries(total) {
77
+ this.totalEntries = total;
78
+ }
79
+ getPagination() {
80
+ return this.pagination;
81
+ }
82
+ setPagination(pagination) {
83
+ this.pagination = pagination;
84
+ }
85
+ }
86
+ const createExpertOverlayCard = (expert, isThemeDark) => expertsDisplayStrategy.mapEntryToCard(expert, {
87
+ isOverlay: true,
88
+ isThemeDark
89
+ });
90
+ const createNewsListContainer = (entries, state, isThemeDark) => {
91
+ const stackedLayout = stacked({ isThemeDark, showDividers: true, gap: "0" });
92
+ stackedLayout.element.id = "umd-expert-in-the-news-list";
93
+ state.addStyles(stackedLayout.styles);
94
+ entries.forEach((entry) => {
95
+ const newsCard = inTheNewsDisplayStrategy.mapEntryToCard(entry, {
96
+ isThemeDark,
97
+ cardType: "list"
98
+ });
99
+ stackedLayout.element.appendChild(newsCard.element);
100
+ state.addStyles(newsCard.styles);
101
+ });
102
+ return stackedLayout.element;
103
+ };
104
+ const appendNewsEntries = (container, entries, state, isThemeDark) => {
105
+ const listContainer = container.querySelector(
106
+ "#umd-expert-in-the-news-list"
107
+ );
108
+ if (!listContainer) return;
109
+ entries.forEach((entry) => {
110
+ const newsCard = inTheNewsDisplayStrategy.mapEntryToCard(entry, {
111
+ isThemeDark,
112
+ cardType: "list"
113
+ });
114
+ listContainer.appendChild(newsCard.element);
115
+ state.addStyles(newsCard.styles);
116
+ });
117
+ };
118
+ const renderLayout = async (container, expert, newsEntries, state, props, loadMore) => {
119
+ const { isThemeDark = false, isLazyLoad = false } = props;
120
+ const offsetLayout = gridOffset({
121
+ columns: 2,
122
+ isLayoutReversed: false
123
+ });
124
+ const expertCard = createExpertOverlayCard(expert, isThemeDark);
125
+ state.addStyles(expertCard.styles);
126
+ state.addStyles(`
127
+ .${card.overlay.imageClassRef} {
128
+ height: inherit;
129
+ }
130
+
131
+ @media (${token.media.queries.tablet.min}) {
132
+ .${card.overlay.imageClassRef} .card-overlay-image-container {
133
+ min-height: 560px;
134
+ }
135
+ }
136
+
137
+ .${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {
138
+ position: absolute;
139
+ }
140
+ `);
141
+ const rightColumn = document.createElement("div");
142
+ rightColumn.className = "expert-in-the-news-right-column";
143
+ const newsList = createNewsListContainer(newsEntries, state, isThemeDark);
144
+ rightColumn.appendChild(newsList);
145
+ offsetLayout.element.appendChild(expertCard.element);
146
+ offsetLayout.element.appendChild(rightColumn);
147
+ container.appendChild(offsetLayout.element);
148
+ state.addStyles(offsetLayout.styles);
149
+ state.setOffset(newsEntries.length);
150
+ if (isLazyLoad && state.getTotalEntries() > state.getOffset()) {
151
+ const pagination = new PaginationState({
152
+ totalEntries: state.getTotalEntries(),
153
+ offset: state.getOffset(),
154
+ isLazyLoad: true,
155
+ callback: loadMore
156
+ });
157
+ const paginationElement = pagination.render(rightColumn);
158
+ if (paginationElement) state.addStyles(paginationElement.styles);
159
+ state.setPagination(pagination);
160
+ }
161
+ const announcer = new Announcer({
162
+ message: createAnnouncerMessage(
163
+ state.getOffset(),
164
+ state.getTotalEntries(),
165
+ isLazyLoad
166
+ )
167
+ });
168
+ container.appendChild(announcer.getElement());
169
+ await state.updateShadowStyles();
170
+ };
171
+ const renderError = async (container, message, state, isThemeDark) => {
172
+ const emptyState = new EmptyState({ message, isThemeDark });
173
+ emptyState.render(container);
174
+ state.addStyles(emptyState.styles);
175
+ await state.updateShadowStyles();
176
+ };
177
+ const renderLayoutWithNoNews = async (container, expert, state, isThemeDark) => {
178
+ const offsetLayout = gridOffset({
179
+ columns: 2,
180
+ isLayoutReversed: false
181
+ });
182
+ const expertCard = createExpertOverlayCard(expert, isThemeDark);
183
+ state.addStyles(expertCard.styles);
184
+ state.addStyles(`
185
+ .${card.overlay.imageClassRef} {
186
+ height: inherit;
187
+ }
188
+
189
+ @media (${token.media.queries.tablet.min}) {
190
+ .${card.overlay.imageClassRef} .card-overlay-image-container {
191
+ min-height: 560px;
192
+ }
193
+ }
194
+
195
+ .${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {
196
+ position: absolute;
197
+ }
198
+ `);
199
+ const rightColumn = document.createElement("div");
200
+ rightColumn.className = "expert-in-the-news-right-column";
201
+ const emptyState = new EmptyState({
202
+ message: "No news articles found for this expert",
203
+ isThemeDark
204
+ });
205
+ emptyState.render(rightColumn);
206
+ state.addStyles(emptyState.styles);
207
+ offsetLayout.element.appendChild(expertCard.element);
208
+ offsetLayout.element.appendChild(rightColumn);
209
+ container.appendChild(offsetLayout.element);
210
+ state.addStyles(offsetLayout.styles);
211
+ await state.updateShadowStyles();
212
+ };
213
+ const logError = (errorType, expertId, error) => {
214
+ const messages = {
215
+ expert_not_found: `No expert found with ID "${expertId}". Verify the expert ID is correct.`,
216
+ no_news: `No news articles found for expert "${expertId}".`,
217
+ graphql_error: `GraphQL error occurred for expert "${expertId}".`
218
+ };
219
+ console.warn(`[Expert In The News Feed] ${messages[errorType]}`, error || "");
220
+ };
221
+ const expertsInTheNews = (props) => {
222
+ const { token: token2, expertId, isThemeDark = false, isLazyLoad = false } = props;
223
+ const numberOfRowsToStart = normalizeRowCount(props.numberOfRowsToStart);
224
+ const containerBuilder = new ElementBuilder("div").withClassName(
225
+ "expert-in-the-news-feed"
226
+ );
227
+ const container = containerBuilder.getElement();
228
+ const loading = new LoadingState({ isThemeDark });
229
+ const state = new InTheNewsFeedState(loading.styles);
230
+ const loadMore = async () => {
231
+ const pagination = state.getPagination();
232
+ if (pagination) pagination.remove();
233
+ loading.show(container);
234
+ const fetchProps = createNewsFetchProps(
235
+ token2,
236
+ expertId,
237
+ LOAD_MORE_ITEMS,
238
+ state.getOffset()
239
+ );
240
+ const variables = inTheNewsFetchStrategy.composeApiVariables(fetchProps);
241
+ const entries = await inTheNewsFetchStrategy.fetchEntries(variables);
242
+ loading.hide();
243
+ if (!entries || entries.length === 0) return;
244
+ appendNewsEntries(container, entries, state, isThemeDark);
245
+ state.incrementOffset(entries.length);
246
+ if (pagination) {
247
+ pagination.updateState(state.getOffset(), state.getTotalEntries());
248
+ if (pagination.styles) state.addStyles(pagination.styles);
249
+ await state.updateShadowStyles();
250
+ }
251
+ const existingAnnouncer = container.querySelector(
252
+ '[role="status"]'
253
+ );
254
+ if (existingAnnouncer) {
255
+ existingAnnouncer.textContent = createAnnouncerMessage(
256
+ state.getOffset(),
257
+ state.getTotalEntries(),
258
+ isLazyLoad
259
+ );
260
+ }
261
+ dispatch(
262
+ container,
263
+ eventNames.FEED_LOADED_MORE,
264
+ { items: entries, count: entries.length, total: state.getTotalEntries() }
265
+ );
266
+ };
267
+ const initialize = async () => {
268
+ if (!expertId) {
269
+ await renderError(container, "Expert ID is required", state, isThemeDark);
270
+ return;
271
+ }
272
+ loading.show(container);
273
+ try {
274
+ const expertFetchProps = createExpertFetchProps(token2, expertId);
275
+ const expertVariables = expertsFetchStrategy.composeApiVariables(expertFetchProps);
276
+ const newsFetchProps = createNewsFetchProps(
277
+ token2,
278
+ expertId,
279
+ numberOfRowsToStart,
280
+ 0
281
+ );
282
+ const newsVariables = inTheNewsFetchStrategy.composeApiVariables(newsFetchProps);
283
+ const [expertEntries, newsCount, newsEntries] = await Promise.all([
284
+ expertsFetchStrategy.fetchEntries(expertVariables),
285
+ inTheNewsFetchStrategy.fetchCount(newsVariables),
286
+ inTheNewsFetchStrategy.fetchEntries(newsVariables)
287
+ ]);
288
+ loading.hide();
289
+ if (!expertEntries || expertEntries.length === 0) {
290
+ logError("expert_not_found", expertId);
291
+ await renderError(container, "Expert not found", state, isThemeDark);
292
+ return;
293
+ }
294
+ if (!newsEntries || newsEntries.length === 0) {
295
+ logError("no_news", expertId);
296
+ await renderLayoutWithNoNews(
297
+ container,
298
+ expertEntries[0],
299
+ state,
300
+ isThemeDark
301
+ );
302
+ return;
303
+ }
304
+ state.setTotalEntries(newsCount || newsEntries.length);
305
+ dispatch(
306
+ container,
307
+ eventNames.FEED_LOADED,
308
+ {
309
+ expert: expertEntries[0],
310
+ newsItems: newsEntries,
311
+ newsCount: newsEntries.length,
312
+ total: state.getTotalEntries()
313
+ }
314
+ );
315
+ await renderLayout(
316
+ container,
317
+ expertEntries[0],
318
+ newsEntries,
319
+ state,
320
+ props,
321
+ loadMore
322
+ );
323
+ } catch (error) {
324
+ loading.hide();
325
+ logError("graphql_error", expertId, error);
326
+ await renderError(
327
+ container,
328
+ "Failed to load content",
329
+ state,
330
+ isThemeDark
331
+ );
332
+ }
333
+ };
334
+ initialize();
335
+ return {
336
+ element: containerBuilder.build().element,
337
+ get styles() {
338
+ return state.getStyles();
339
+ },
340
+ events: {
341
+ callback: state.getShadowCallback()
342
+ }
343
+ };
344
+ };
345
+ export {
346
+ expertsInTheNews
347
+ };
348
+ //# sourceMappingURL=in-the-news.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-the-news.js","sources":["../../../source/feeds/experts/in-the-news.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport { card } from '@universityofmaryland/web-elements-library/composite';\nimport { gridOffset, stacked } from '@universityofmaryland/web-elements-library/layout';\nimport {\n LoadingState,\n PaginationState,\n EmptyState,\n Announcer,\n} from '../../states';\nimport { expertsFetchStrategy } from '../../strategies/fetch/experts';\nimport { inTheNewsFetchStrategy } from '../../strategies/fetch/inTheNews';\nimport { expertsDisplayStrategy } from '../../strategies/display/experts';\nimport { inTheNewsDisplayStrategy } from '../../strategies/display/inTheNews';\nimport {\n events as eventUtilities,\n styles as styleUtilities,\n} from '../../helpers';\nimport { type InTheNewsProps } from './_types';\nimport { type ElementModel } from '../../_types';\nimport { type ExpertEntry, type InTheNewsEntry } from 'types/data';\n\nconst DEFAULT_ROWS_TO_START = 5;\nconst MIN_ROWS_TO_START = 2;\nconst MAX_ROWS_TO_START = 10;\nconst LOAD_MORE_ITEMS = 5;\n\nconst normalizeRowCount = (rows?: number): number => {\n if (rows === undefined) return DEFAULT_ROWS_TO_START;\n return Math.max(MIN_ROWS_TO_START, Math.min(MAX_ROWS_TO_START, rows));\n};\n\nconst createExpertFetchProps = (token: string, expertId: string) => ({\n token,\n limit: 1,\n offset: 0,\n ids: [expertId],\n});\n\nconst createNewsFetchProps = (\n token: string,\n expertId: string,\n numberOfRowsToStart: number,\n offset: number,\n) => ({\n token,\n expertId,\n numberOfRowsToStart,\n getOffset: () => offset,\n});\n\nconst createAnnouncerMessage = (\n showing: number,\n total: number,\n isLazyLoad: boolean,\n): string =>\n isLazyLoad\n ? `Showing ${showing} of ${total} news articles`\n : `Showing ${showing} news articles`;\n\nclass InTheNewsFeedState {\n private stylesArray: string[] = [];\n private shadowRoot: ShadowRoot | null = null;\n private totalEntries: number = 0;\n private offset: number = 0;\n private pagination: PaginationState | null = null;\n\n constructor(initialStyles: string) {\n this.stylesArray.push(initialStyles);\n }\n\n addStyles(styles: string): void {\n this.stylesArray.push(styles);\n }\n\n setShadowRoot(shadow: ShadowRoot): void {\n this.shadowRoot = shadow;\n }\n\n async updateShadowStyles(): Promise<void> {\n if (!this.shadowRoot) return;\n await styleUtilities.setShadowStyles({\n shadowRoot: this.shadowRoot,\n styles: this.getStyles(),\n });\n }\n\n getStyles(): string {\n return this.stylesArray.join('\\n');\n }\n\n getShadowCallback(): (shadow: ShadowRoot) => void {\n return (shadow) => this.setShadowRoot(shadow);\n }\n\n getOffset(): number {\n return this.offset;\n }\n\n setOffset(value: number): void {\n this.offset = value;\n }\n\n incrementOffset(count: number): void {\n this.offset += count;\n }\n\n getTotalEntries(): number {\n return this.totalEntries;\n }\n\n setTotalEntries(total: number): void {\n this.totalEntries = total;\n }\n\n getPagination(): PaginationState | null {\n return this.pagination;\n }\n\n setPagination(pagination: PaginationState | null): void {\n this.pagination = pagination;\n }\n}\n\nconst createExpertOverlayCard = (\n expert: ExpertEntry,\n isThemeDark: boolean,\n): ElementModel =>\n expertsDisplayStrategy.mapEntryToCard(expert, {\n isOverlay: true,\n isThemeDark,\n });\n\nconst createNewsListContainer = (\n entries: InTheNewsEntry[],\n state: InTheNewsFeedState,\n isThemeDark: boolean,\n): HTMLElement => {\n const stackedLayout = stacked({ isThemeDark, showDividers: true, gap: '0' });\n stackedLayout.element.id = 'umd-expert-in-the-news-list';\n state.addStyles(stackedLayout.styles);\n\n entries.forEach((entry) => {\n const newsCard = inTheNewsDisplayStrategy.mapEntryToCard(entry, {\n isThemeDark,\n cardType: 'list',\n });\n stackedLayout.element.appendChild(newsCard.element);\n state.addStyles(newsCard.styles);\n });\n\n return stackedLayout.element;\n};\n\nconst appendNewsEntries = (\n container: HTMLElement,\n entries: InTheNewsEntry[],\n state: InTheNewsFeedState,\n isThemeDark: boolean,\n): void => {\n const listContainer = container.querySelector(\n '#umd-expert-in-the-news-list',\n ) as HTMLElement;\n\n if (!listContainer) return;\n\n entries.forEach((entry) => {\n const newsCard = inTheNewsDisplayStrategy.mapEntryToCard(entry, {\n isThemeDark,\n cardType: 'list',\n });\n listContainer.appendChild(newsCard.element);\n state.addStyles(newsCard.styles);\n });\n};\n\nconst renderLayout = async (\n container: HTMLElement,\n expert: ExpertEntry,\n newsEntries: InTheNewsEntry[],\n state: InTheNewsFeedState,\n props: InTheNewsProps,\n loadMore: () => Promise<void>,\n): Promise<void> => {\n const { isThemeDark = false, isLazyLoad = false } = props;\n\n const offsetLayout = gridOffset({\n columns: 2,\n isLayoutReversed: false,\n });\n\n const expertCard = createExpertOverlayCard(expert, isThemeDark);\n state.addStyles(expertCard.styles);\n\n state.addStyles(`\n .${card.overlay.imageClassRef} {\n height: inherit;\n }\n\n @media (${token.media.queries.tablet.min}) {\n .${card.overlay.imageClassRef} .card-overlay-image-container {\n min-height: 560px;\n }\n }\n\n .${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {\n position: absolute;\n }\n `);\n\n const rightColumn = document.createElement('div');\n rightColumn.className = 'expert-in-the-news-right-column';\n\n const newsList = createNewsListContainer(newsEntries, state, isThemeDark);\n rightColumn.appendChild(newsList);\n\n offsetLayout.element.appendChild(expertCard.element);\n offsetLayout.element.appendChild(rightColumn);\n container.appendChild(offsetLayout.element);\n\n state.addStyles(offsetLayout.styles);\n state.setOffset(newsEntries.length);\n\n if (isLazyLoad && state.getTotalEntries() > state.getOffset()) {\n const pagination = new PaginationState({\n totalEntries: state.getTotalEntries(),\n offset: state.getOffset(),\n isLazyLoad: true,\n callback: loadMore,\n });\n\n const paginationElement = pagination.render(rightColumn);\n if (paginationElement) state.addStyles(paginationElement.styles);\n state.setPagination(pagination);\n }\n\n const announcer = new Announcer({\n message: createAnnouncerMessage(\n state.getOffset(),\n state.getTotalEntries(),\n isLazyLoad,\n ),\n });\n container.appendChild(announcer.getElement());\n\n await state.updateShadowStyles();\n};\n\nconst renderError = async (\n container: HTMLElement,\n message: string,\n state: InTheNewsFeedState,\n isThemeDark: boolean,\n): Promise<void> => {\n const emptyState = new EmptyState({ message, isThemeDark });\n emptyState.render(container);\n state.addStyles(emptyState.styles);\n await state.updateShadowStyles();\n};\n\nconst renderLayoutWithNoNews = async (\n container: HTMLElement,\n expert: ExpertEntry,\n state: InTheNewsFeedState,\n isThemeDark: boolean,\n): Promise<void> => {\n const offsetLayout = gridOffset({\n columns: 2,\n isLayoutReversed: false,\n });\n\n const expertCard = createExpertOverlayCard(expert, isThemeDark);\n state.addStyles(expertCard.styles);\n\n state.addStyles(`\n .${card.overlay.imageClassRef} {\n height: inherit;\n }\n\n @media (${token.media.queries.tablet.min}) {\n .${card.overlay.imageClassRef} .card-overlay-image-container {\n min-height: 560px;\n }\n }\n\n .${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {\n position: absolute;\n }\n `);\n\n const rightColumn = document.createElement('div');\n rightColumn.className = 'expert-in-the-news-right-column';\n\n const emptyState = new EmptyState({\n message: 'No news articles found for this expert',\n isThemeDark,\n });\n emptyState.render(rightColumn);\n state.addStyles(emptyState.styles);\n\n offsetLayout.element.appendChild(expertCard.element);\n offsetLayout.element.appendChild(rightColumn);\n container.appendChild(offsetLayout.element);\n\n state.addStyles(offsetLayout.styles);\n await state.updateShadowStyles();\n};\n\nconst logError = (\n errorType: 'expert_not_found' | 'no_news' | 'graphql_error',\n expertId: string,\n error?: unknown,\n): void => {\n const messages = {\n expert_not_found: `No expert found with ID \"${expertId}\". Verify the expert ID is correct.`,\n no_news: `No news articles found for expert \"${expertId}\".`,\n graphql_error: `GraphQL error occurred for expert \"${expertId}\".`,\n };\n console.warn(`[Expert In The News Feed] ${messages[errorType]}`, error || '');\n};\n\nexport const expertsInTheNews = (props: InTheNewsProps): ElementModel => {\n const { token, expertId, isThemeDark = false, isLazyLoad = false } = props;\n const numberOfRowsToStart = normalizeRowCount(props.numberOfRowsToStart);\n\n const containerBuilder = new ElementBuilder('div').withClassName(\n 'expert-in-the-news-feed',\n );\n const container = containerBuilder.getElement();\n\n const loading = new LoadingState({ isThemeDark });\n const state = new InTheNewsFeedState(loading.styles);\n\n const loadMore = async (): Promise<void> => {\n const pagination = state.getPagination();\n if (pagination) pagination.remove();\n\n loading.show(container);\n\n const fetchProps = createNewsFetchProps(\n token,\n expertId,\n LOAD_MORE_ITEMS,\n state.getOffset(),\n );\n const variables = inTheNewsFetchStrategy.composeApiVariables(fetchProps);\n const entries = await inTheNewsFetchStrategy.fetchEntries(variables);\n\n loading.hide();\n\n if (!entries || entries.length === 0) return;\n\n appendNewsEntries(container, entries, state, isThemeDark);\n state.incrementOffset(entries.length);\n\n if (pagination) {\n pagination.updateState(state.getOffset(), state.getTotalEntries());\n if (pagination.styles) state.addStyles(pagination.styles);\n await state.updateShadowStyles();\n }\n\n const existingAnnouncer = container.querySelector(\n '[role=\"status\"]',\n ) as HTMLElement;\n if (existingAnnouncer) {\n existingAnnouncer.textContent = createAnnouncerMessage(\n state.getOffset(),\n state.getTotalEntries(),\n isLazyLoad,\n );\n }\n\n eventUtilities.dispatch(\n container,\n eventUtilities.eventNames.FEED_LOADED_MORE,\n { items: entries, count: entries.length, total: state.getTotalEntries() },\n );\n };\n\n const initialize = async (): Promise<void> => {\n if (!expertId) {\n await renderError(container, 'Expert ID is required', state, isThemeDark);\n return;\n }\n\n loading.show(container);\n\n try {\n const expertFetchProps = createExpertFetchProps(token, expertId);\n const expertVariables =\n expertsFetchStrategy.composeApiVariables(expertFetchProps);\n\n const newsFetchProps = createNewsFetchProps(\n token,\n expertId,\n numberOfRowsToStart,\n 0,\n );\n const newsVariables =\n inTheNewsFetchStrategy.composeApiVariables(newsFetchProps);\n\n const [expertEntries, newsCount, newsEntries] = await Promise.all([\n expertsFetchStrategy.fetchEntries(expertVariables),\n inTheNewsFetchStrategy.fetchCount(newsVariables),\n inTheNewsFetchStrategy.fetchEntries(newsVariables),\n ]);\n\n loading.hide();\n\n if (!expertEntries || expertEntries.length === 0) {\n logError('expert_not_found', expertId);\n await renderError(container, 'Expert not found', state, isThemeDark);\n return;\n }\n\n if (!newsEntries || newsEntries.length === 0) {\n logError('no_news', expertId);\n await renderLayoutWithNoNews(\n container,\n expertEntries[0],\n state,\n isThemeDark,\n );\n return;\n }\n\n state.setTotalEntries(newsCount || newsEntries.length);\n\n eventUtilities.dispatch(\n container,\n eventUtilities.eventNames.FEED_LOADED,\n {\n expert: expertEntries[0],\n newsItems: newsEntries,\n newsCount: newsEntries.length,\n total: state.getTotalEntries(),\n },\n );\n\n await renderLayout(\n container,\n expertEntries[0],\n newsEntries,\n state,\n props,\n loadMore,\n );\n } catch (error) {\n loading.hide();\n logError('graphql_error', expertId, error);\n await renderError(\n container,\n 'Failed to load content',\n state,\n isThemeDark,\n );\n }\n };\n\n initialize();\n\n return {\n element: containerBuilder.build().element,\n get styles() {\n return state.getStyles();\n },\n events: {\n callback: state.getShadowCallback(),\n },\n };\n};\n"],"names":["token","styleUtilities.setShadowStyles","eventUtilities.dispatch","eventUtilities.eventNames"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export { expertsGrid as grid } from './grid';
2
2
  export { expertsList as list } from './list';
3
3
  export { expertsBio as bio } from './bio';
4
+ export { expertsInTheNews as inTheNews } from './in-the-news';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/feeds/experts/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAM7C,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAO7C,OAAO,EAAE,UAAU,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/feeds/experts/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAM7C,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAO7C,OAAO,EAAE,UAAU,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC;AAO1C,OAAO,EAAE,gBAAgB,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC"}
@@ -12,6 +12,7 @@ import "@universityofmaryland/web-utilities-library/network";
12
12
  import "../../strategies/fetch/events.js";
13
13
  import "../../strategies/fetch/news.js";
14
14
  import { expertsFetchStrategy } from "../../strategies/fetch/experts.js";
15
+ import "../../strategies/fetch/inTheNews.js";
15
16
  import { stackedLayout } from "../../strategies/layout/grid.js";
16
17
  import "@universityofmaryland/web-elements-library/layout";
17
18
  const expertsList = (props) => createBaseFeed({
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sources":["../../../source/feeds/experts/list.ts"],"sourcesContent":["/**\n * Experts List Feed (Factory Pattern)\n *\n * List layout for expert profile entries using the feed factory pattern.\n * Uses person elements for displaying expert profiles in a single-column list.\n *\n * @module feeds/experts/list\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n expertsFetchStrategy,\n expertsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create an experts list feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = expertsList({\n * token: 'my-token',\n * numberOfRowsToStart: 10,\n * cardType: 'list',\n * isLazyLoad: true,\n * categories: ['computer-science', 'engineering'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport const expertsList = (props: ListProps): ElementModel =>\n createBaseFeed({\n ...props,\n fetchStrategy: expertsFetchStrategy,\n displayStrategy: expertsDisplayStrategy,\n layoutStrategy: stackedLayout,\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAqCO,MAAM,cAAc,CAAC,UAC1B,eAAe;AAAA,EACb,GAAG;AAAA,EACH,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAClB,CAAC;"}
1
+ {"version":3,"file":"list.js","sources":["../../../source/feeds/experts/list.ts"],"sourcesContent":["/**\n * Experts List Feed (Factory Pattern)\n *\n * List layout for expert profile entries using the feed factory pattern.\n * Uses person elements for displaying expert profiles in a single-column list.\n *\n * @module feeds/experts/list\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n expertsFetchStrategy,\n expertsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create an experts list feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = expertsList({\n * token: 'my-token',\n * numberOfRowsToStart: 10,\n * cardType: 'list',\n * isLazyLoad: true,\n * categories: ['computer-science', 'engineering'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport const expertsList = (props: ListProps): ElementModel =>\n createBaseFeed({\n ...props,\n fetchStrategy: expertsFetchStrategy,\n displayStrategy: expertsDisplayStrategy,\n layoutStrategy: stackedLayout,\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAqCO,MAAM,cAAc,CAAC,UAC1B,eAAe;AAAA,EACb,GAAG;AAAA,EACH,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAClB,CAAC;"}
@@ -0,0 +1,14 @@
1
+ export interface BaseProps {
2
+ token: string;
3
+ numberOfRowsToStart: number;
4
+ isThemeDark?: boolean;
5
+ isLazyLoad: boolean;
6
+ entriesToRemove?: string[];
7
+ }
8
+ export interface GridProps extends BaseProps {
9
+ numberOfColumnsToShow?: number;
10
+ isTransparent?: boolean;
11
+ }
12
+ export interface ListProps extends BaseProps {
13
+ }
14
+ //# sourceMappingURL=_types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_types.d.ts","sourceRoot":"","sources":["../../../source/feeds/in-the-news/_types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAU,SAAQ,SAAS;CAAG"}
@@ -0,0 +1,4 @@
1
+ import { GridProps } from './_types';
2
+ import { ElementModel } from '../../_types';
3
+ export declare const inTheNewsGrid: (props: GridProps) => ElementModel;
4
+ //# sourceMappingURL=grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../source/feeds/in-the-news/grid.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,KAAG,YAO7C,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { createBaseFeed } from "../../factory/core/createBaseFeed.js";
2
+ import "@universityofmaryland/web-builder-library";
3
+ import "@universityofmaryland/web-styles-library";
4
+ import "@universityofmaryland/web-styles-library/typography";
5
+ import "@universityofmaryland/web-utilities-library/theme";
6
+ import "@universityofmaryland/web-elements-library";
7
+ import "@universityofmaryland/web-elements-library/composite";
8
+ import "@universityofmaryland/web-elements-library/atomic";
9
+ import "@universityofmaryland/web-utilities-library/elements";
10
+ import { inTheNewsDisplayStrategy } from "../../strategies/display/inTheNews.js";
11
+ import "@universityofmaryland/web-utilities-library/network";
12
+ import "../../strategies/fetch/events.js";
13
+ import "../../strategies/fetch/news.js";
14
+ import "../../strategies/fetch/experts.js";
15
+ import { inTheNewsFetchStrategy } from "../../strategies/fetch/inTheNews.js";
16
+ import { gridGapLayout } from "../../strategies/layout/grid.js";
17
+ import "@universityofmaryland/web-elements-library/layout";
18
+ const inTheNewsGrid = (props) => createBaseFeed({
19
+ ...props,
20
+ isAligned: true,
21
+ fetchStrategy: inTheNewsFetchStrategy,
22
+ displayStrategy: inTheNewsDisplayStrategy,
23
+ layoutStrategy: gridGapLayout
24
+ });
25
+ export {
26
+ inTheNewsGrid
27
+ };
28
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sources":["../../../source/feeds/in-the-news/grid.ts"],"sourcesContent":["import { createBaseFeed } from 'factory';\nimport {\n inTheNewsFetchStrategy,\n inTheNewsDisplayStrategy,\n gridGapLayout,\n} from 'strategies';\nimport { type GridProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\nexport const inTheNewsGrid = (props: GridProps): ElementModel =>\n createBaseFeed({\n ...props,\n isAligned: true,\n fetchStrategy: inTheNewsFetchStrategy,\n displayStrategy: inTheNewsDisplayStrategy,\n layoutStrategy: gridGapLayout,\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AASO,MAAM,gBAAgB,CAAC,UAC5B,eAAe;AAAA,EACb,GAAG;AAAA,EACH,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAClB,CAAC;"}
@@ -0,0 +1,3 @@
1
+ export { inTheNewsGrid as grid } from './grid';
2
+ export { inTheNewsList as list } from './list';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/feeds/in-the-news/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ListProps } from './_types';
2
+ import { ElementModel } from '../../_types';
3
+ export declare const inTheNewsList: (props: ListProps) => ElementModel;
4
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../source/feeds/in-the-news/list.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,KAAG,YAQ7C,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { createBaseFeed } from "../../factory/core/createBaseFeed.js";
2
+ import "@universityofmaryland/web-builder-library";
3
+ import "@universityofmaryland/web-styles-library";
4
+ import "@universityofmaryland/web-styles-library/typography";
5
+ import "@universityofmaryland/web-utilities-library/theme";
6
+ import "@universityofmaryland/web-elements-library";
7
+ import "@universityofmaryland/web-elements-library/composite";
8
+ import "@universityofmaryland/web-elements-library/atomic";
9
+ import "@universityofmaryland/web-utilities-library/elements";
10
+ import { inTheNewsDisplayStrategy } from "../../strategies/display/inTheNews.js";
11
+ import "@universityofmaryland/web-utilities-library/network";
12
+ import "../../strategies/fetch/events.js";
13
+ import "../../strategies/fetch/news.js";
14
+ import "../../strategies/fetch/experts.js";
15
+ import { inTheNewsFetchStrategy } from "../../strategies/fetch/inTheNews.js";
16
+ import { stackedLayout } from "../../strategies/layout/grid.js";
17
+ import "@universityofmaryland/web-elements-library/layout";
18
+ const inTheNewsList = (props) => createBaseFeed({
19
+ ...props,
20
+ cardType: "list",
21
+ isAligned: false,
22
+ fetchStrategy: inTheNewsFetchStrategy,
23
+ displayStrategy: inTheNewsDisplayStrategy,
24
+ layoutStrategy: stackedLayout
25
+ });
26
+ export {
27
+ inTheNewsList
28
+ };
29
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sources":["../../../source/feeds/in-the-news/list.ts"],"sourcesContent":["import { createBaseFeed } from 'factory';\nimport {\n inTheNewsFetchStrategy,\n inTheNewsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\nexport const inTheNewsList = (props: ListProps): ElementModel =>\n createBaseFeed({\n ...props,\n cardType: 'list',\n isAligned: false,\n fetchStrategy: inTheNewsFetchStrategy,\n displayStrategy: inTheNewsDisplayStrategy,\n layoutStrategy: stackedLayout,\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AASO,MAAM,gBAAgB,CAAC,UAC5B,eAAe;AAAA,EACb,GAAG;AAAA,EACH,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAClB,CAAC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"featured.d.ts","sourceRoot":"","sources":["../../../source/feeds/news/featured.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AA0djD,eAAO,MAAM,YAAY,GAAI,OAAO,aAAa,KAAG,YAsJnD,CAAC"}
1
+ {"version":3,"file":"featured.d.ts","sourceRoot":"","sources":["../../../source/feeds/news/featured.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAgejD,eAAO,MAAM,YAAY,GAAI,OAAO,aAAa,KAAG,YAsJnD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { ElementBuilder } from "@universityofmaryland/web-builder-library";
2
+ import * as token from "@universityofmaryland/web-token-library";
2
3
  import { card } from "@universityofmaryland/web-elements-library/composite";
3
4
  import { gridOffset, gridGap } from "@universityofmaryland/web-elements-library/layout";
4
5
  import { LoadingState } from "../../states/loading.js";
@@ -171,6 +172,12 @@ const createOverlayCard = (entry, state, isThemeDark) => {
171
172
  height: inherit;
172
173
  }
173
174
 
175
+ @media (${token.media.queries.tablet.min}) {
176
+ .${card.overlay.imageClassRef} .card-overlay-image-container {
177
+ min-height: 560px;
178
+ }
179
+ }
180
+
174
181
  .${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {
175
182
  position: absolute;
176
183
  }
@@ -271,7 +278,7 @@ const renderError = async (container, message, state, isThemeDark) => {
271
278
  };
272
279
  const newsFeatured = (props) => {
273
280
  const {
274
- token,
281
+ token: token2,
275
282
  categories,
276
283
  isUnion,
277
284
  isThemeDark = false,
@@ -291,7 +298,7 @@ const newsFeatured = (props) => {
291
298
  }
292
299
  loading.show(container);
293
300
  const fetchProps = createFetchProps(
294
- { token, categories, isUnion },
301
+ { token: token2, categories, isUnion },
295
302
  state.getOffset()
296
303
  );
297
304
  const variables = newsFetchStrategy.composeApiVariables(fetchProps);
@@ -329,7 +336,7 @@ const newsFeatured = (props) => {
329
336
  };
330
337
  const initialize = async () => {
331
338
  loading.show(container);
332
- const fetchProps = createFetchProps({ token, categories, isUnion }, 0);
339
+ const fetchProps = createFetchProps({ token: token2, categories, isUnion }, 0);
333
340
  const variables = newsFetchStrategy.composeApiVariables(fetchProps);
334
341
  const [count, entries] = await Promise.all([
335
342
  newsFetchStrategy.fetchCount(variables),