@universityofmaryland/web-feeds-library 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,217 +1,281 @@
1
1
  # University of Maryland Feeds Library
2
2
 
3
- [![Feeds Version](https://img.shields.io/badge/Feeds-v1.0.6-blue)](https://www.npmjs.com/package/@universityofmaryland/web-feeds-library)
3
+ [![Feeds Version](https://img.shields.io/badge/Feeds-v1.0.8-blue)](https://www.npmjs.com/package/@universityofmaryland/web-feeds-library)
4
4
 
5
- A collection of dynamic feed components for displaying University of Maryland content feeds including news articles, events, and academic information. This library simplifies the integration of live, updating content from UMD sources while maintaining brand consistency and performance optimization.
5
+ Dynamic content feed components for displaying University of Maryland news, events, and academic information with automatic updates, caching, and brand-compliant styling.
6
6
 
7
7
  ## Overview
8
8
 
9
- The UMD Feeds Library provides ready-to-use feed components that can be integrated into any web project. These components are designed to follow UMD brand guidelines and accessibility standards while providing a seamless way to display dynamic content. The library handles all aspects of content fetching, caching, error handling, and rendering, allowing developers to focus on integration rather than implementation details.
9
+ The UMD Feeds Library simplifies the integration of dynamic UMD content into any web application. It provides pre-built components for displaying news articles, event calendars, and academic program information that automatically sync with UMD data sources. Built on the Elements Library and styled with the Styles Library, these components ensure consistent presentation while handling all complexities of data fetching, caching, error handling, and responsive layouts.
10
10
 
11
11
  ## Installation
12
12
 
13
13
  ```bash
14
+ # Using npm
14
15
  npm install @universityofmaryland/web-feeds-library
15
- # or
16
+
17
+ # Using yarn
16
18
  yarn add @universityofmaryland/web-feeds-library
17
19
  ```
18
20
 
19
- ## Features
21
+ ### Peer Dependencies
20
22
 
21
- - **Responsive Layouts**: Grid, list, and featured layouts that work across all screen sizes
22
- - **Multiple Feed Types**: Support for news, events, and academic content
23
- - **Customizable**: Theme options, column configuration, and layout variations
24
- - **Accessibility**: ARIA-compliant with screen reader support
25
- - **Lazy Loading**: Optional lazy loading for improved performance
23
+ For complete styling and functionality:
26
24
 
27
- ## Usage
25
+ ```bash
26
+ npm install @universityofmaryland/web-styles-library
27
+ npm install @universityofmaryland/web-elements-library
28
+ ```
28
29
 
29
- ### Basic Example
30
+ ## Quick Start
30
31
 
31
- ```typescript
32
- import * as Feeds from '@universityofmaryland/web-feeds-library';
32
+ ```javascript
33
+ import { news, events } from '@universityofmaryland/web-feeds-library';
33
34
 
34
- // Create a news grid component
35
- const newsGrid = Feeds.news.grid({
35
+ // Create a news grid
36
+ const newsGrid = news.grid({
36
37
  token: 'your-api-token',
37
38
  numberOfColumnsToShow: 3,
38
39
  isThemeDark: false,
39
40
  });
40
41
 
41
- // Add to DOM
42
+ // Add to your page
42
43
  document.querySelector('.news-container').appendChild(newsGrid.element);
43
44
  ```
44
45
 
45
- ## Available Feed Components
46
+ ## Feed Types
46
47
 
47
48
  ### News Feeds
48
49
 
49
- ```typescript
50
- // Grid layout for news
51
- const newsGrid = Feeds.news.grid({ token: 'your-api-token' });
50
+ Display UMD news articles in various layouts:
52
51
 
53
- // List layout for news
54
- const newsList = Feeds.news.list({ token: 'your-api-token' });
52
+ ```javascript
53
+ import { news } from '@universityofmaryland/web-feeds-library';
54
+
55
+ // Grid layout - Responsive card grid
56
+ const newsGrid = news.grid({
57
+ token: 'your-api-token',
58
+ numberOfColumnsToShow: 3,
59
+ isThemeDark: false,
60
+ isTransparent: false,
61
+ });
55
62
 
56
- // Featured news layout with prominent article
57
- const newsFeatured = Feeds.news.featured({
63
+ // List layout - Vertical article list
64
+ const newsList = news.list({
65
+ token: 'your-api-token',
66
+ });
67
+
68
+ // Featured layout - Hero article with sidebar
69
+ const newsFeatured = news.featured({
58
70
  token: 'your-api-token',
59
71
  isLazyLoad: true,
72
+ isLayoutReversed: false,
60
73
  });
61
74
  ```
62
75
 
63
76
  ### Event Feeds
64
77
 
65
- ```typescript
66
- // Grid layout for events
67
- const eventsGrid = Feeds.events.grid({ token: 'your-api-token' });
78
+ Display UMD events with calendar integration:
68
79
 
69
- // List layout for events
70
- const eventsList = Feeds.events.list({ token: 'your-api-token' });
80
+ ```javascript
81
+ import { events } from '@universityofmaryland/web-feeds-library';
71
82
 
72
- // Slider for events
73
- const eventsSlider = Feeds.events.slider({ token: 'your-api-token' });
83
+ // Grid layout - Event cards
84
+ const eventsGrid = events.grid({
85
+ token: 'your-api-token',
86
+ numberOfColumnsToShow: 3,
87
+ });
88
+
89
+ // List layout - Chronological list
90
+ const eventsList = events.list({
91
+ token: 'your-api-token',
92
+ });
93
+
94
+ // Slider - Horizontal scroll
95
+ const eventsSlider = events.slider({
96
+ token: 'your-api-token',
97
+ });
74
98
  ```
75
99
 
76
100
  ### Academic Feeds
77
101
 
78
- ```typescript
79
- // Slider for academic events
80
- const academicSlider = Feeds.academic.slider({ token: 'your-api-token' });
102
+ Display academic programs and information:
103
+
104
+ ```javascript
105
+ import { academic } from '@universityofmaryland/web-feeds-library';
106
+
107
+ // Academic event slider
108
+ const academicSlider = academic.slider({
109
+ token: 'your-api-token',
110
+ department: 'engineering',
111
+ programType: 'graduate',
112
+ });
81
113
  ```
82
114
 
83
- ## Component Configuration
115
+ ## Integration with Other Packages
84
116
 
85
- All feed components accept these common properties:
117
+ ### Styles Package Integration
86
118
 
87
- - `token` (required): API token for authentication
88
- - `isThemeDark`: Enable dark theme styling (default: false)
89
- - `isTransparent`: Use transparent background for cards (default: false)
119
+ Feeds automatically use UMD styles for consistent appearance:
90
120
 
91
- Grid-specific options:
121
+ ```html
122
+ <!-- Feeds inherit grid and spacing utilities -->
123
+ <div class="umd-layout-space-vertical-landing">
124
+ <div id="news-feed"></div>
125
+ </div>
126
+ ```
92
127
 
93
- - `numberOfColumnsToShow`: Number of columns to display (default: 3)
128
+ ### Elements Package Usage
94
129
 
95
- Featured layout options:
130
+ Feeds are built using Elements for rendering:
96
131
 
97
- - `isLazyLoad`: Enable lazy loading of additional content
98
- - `isLayoutReversed`: Reverse the layout order
99
- - `overwriteStickyPosition`: Custom sticky position value
132
+ - Card elements for item display
133
+ - Grid layouts from layout elements
134
+ - Typography from text elements
100
135
 
101
- ### Custom Filtering and Sorting
136
+ ### Components Package Compatibility
102
137
 
103
- You can customize how feed items are filtered and sorted:
138
+ Feeds can be wrapped in web components:
104
139
 
105
- ```typescript
106
- import * as Feeds from '@universityofmaryland/web-feeds-library';
140
+ ```javascript
141
+ import { Components } from '@universityofmaryland/web-components-library';
142
+ import { news } from '@universityofmaryland/web-feeds-library';
107
143
 
108
- const newsGrid = Feeds.news.grid({
109
- token: 'your-api-token',
110
- filters: {
111
- categories: ['research', 'campus-life'],
112
- tags: ['featured'],
113
- dateRange: {
114
- start: '2023-01-01',
115
- end: '2023-12-31',
116
- },
117
- },
118
- sortBy: 'date', // 'date', 'title', 'popularity'
119
- sortDirection: 'desc', // 'asc' or 'desc'
120
- });
144
+ // Initialize feed component wrapper
145
+ Components.feed.newsList();
146
+ // Feed will render inside the component
121
147
  ```
122
148
 
123
- ### Event Handling
149
+ ## Configuration Options
150
+
151
+ ### Common Properties
124
152
 
125
- All feed components emit events that you can listen for. You can use the standard event listeners or our utility functions for better TypeScript support:
153
+ All feeds accept these base properties:
126
154
 
127
155
  ```typescript
128
- import * as Feeds from '@universityofmaryland/web-feeds-library';
129
- import { events } from '@universityofmaryland/web-feeds-library/utilities';
156
+ interface BaseFeedProps {
157
+ token: string; // Required: API authentication token
158
+ isThemeDark?: boolean; // Dark theme styling
159
+ isTransparent?: boolean; // Transparent card backgrounds
160
+ }
161
+ ```
130
162
 
131
- const eventsFeed = Feeds.events.list({ token: 'your-api-token' });
132
- const container = document.querySelector('.events-container');
133
- container.appendChild(eventsFeed.element);
163
+ ### Layout-Specific Options
134
164
 
135
- // Method 1: Standard event listener approach
136
- eventsFeed.element.addEventListener(events.eventNames.FEED_LOADED, (event) => {
137
- console.log('Feed loaded with', event.detail.items.length, 'items');
138
- });
165
+ **Grid Layout:**
139
166
 
140
- eventsFeed.element.addEventListener(events.eventNames.FEED_ERROR, (event) => {
141
- console.error('Feed error:', event.detail.error);
142
- });
167
+ ```typescript
168
+ interface GridProps extends BaseFeedProps {
169
+ numberOfColumnsToShow?: number; // 1-4, default: 3
170
+ }
171
+ ```
143
172
 
144
- // Method 2: Using the utility helper (provides proper type information)
145
- events.listen(eventsFeed.element, events.eventNames.FEED_LOADED, (detail) => {
146
- console.log('Feed loaded with', detail.items.length, 'items');
147
- });
173
+ **Featured Layout:**
174
+
175
+ ```typescript
176
+ interface FeaturedProps extends BaseFeedProps {
177
+ isLazyLoad?: boolean;
178
+ isLayoutReversed?: boolean;
179
+ }
180
+ ```
181
+
182
+ ### Event Handling
183
+
184
+ ```javascript
185
+ import { events } from '@universityofmaryland/web-feeds-library';
148
186
 
149
- // With cleanup function for easy removal
150
- const removeListener = events.listen(
151
- eventsFeed.element,
152
- events.eventNames.FEED_ERROR,
153
- (detail) => {
154
- console.error('Feed error:', detail.error);
187
+ const eventsFeed = events.list({
188
+ token: 'your-api-token',
189
+ onLoad: (items) => {
190
+ console.log(`Loaded ${items.length} events`);
191
+ },
192
+ onError: (error) => {
193
+ console.error('Feed error:', error);
194
+ // Show fallback content
195
+ },
196
+ onItemClick: (item) => {
197
+ // Custom click handler
198
+ console.log('Clicked:', item.title);
155
199
  },
156
- );
200
+ });
157
201
 
158
- // Later you should remove the listener if needed
159
- // removeListener();
202
+ // Listen for feed updates
203
+ eventsFeed.element.addEventListener('feed:update', (e) => {
204
+ console.log('Feed updated with new items');
205
+ });
160
206
  ```
161
207
 
162
- ## Performance Considerations
208
+ ## Performance Features
163
209
 
164
- The Feeds library is optimized for performance:
210
+ ### Lazy Loading
165
211
 
166
- - Content is lazy-loaded when elements enter the viewport
167
- - Network requests are cached and debounced
168
- - Images are optimized and responsive
169
- - Content is efficiently rendered with minimal DOM operations
212
+ Load content as users scroll:
170
213
 
171
- ## Accessibility
214
+ ```javascript
215
+ const lazyFeed = news.featured({
216
+ token: 'your-api-token',
217
+ isLazyLoad: true,
218
+ });
219
+ ```
172
220
 
173
- All feed components are built with accessibility in mind:
221
+ ## TypeScript Support
174
222
 
175
- - WCAG 2.1 AA compliant
176
- - Proper semantic markup with ARIA attributes
177
- - Keyboard navigable
178
- - Screen reader announcements for dynamic content updates
179
- - Support for reduced motion preferences
223
+ Full TypeScript definitions included:
180
224
 
181
- ## Testing
225
+ ```typescript
226
+ import type {
227
+ NewsFeedProps,
228
+ EventsFeedProps,
229
+ FeedItem,
230
+ FeedEvents,
231
+ } from '@universityofmaryland/web-feeds-library';
232
+
233
+ const newsProps: NewsFeedProps = {
234
+ token: 'token',
235
+ numberOfColumnsToShow: 3,
236
+ isThemeDark: false,
237
+ };
238
+ ```
182
239
 
183
- The library uses Jest for unit testing. To run tests:
240
+ ## Browser Support
184
241
 
185
- ```bash
186
- # Run all tests
187
- npm run test
242
+ - Chrome 90+
243
+ - Firefox 88+
244
+ - Safari 14+
245
+ - Edge 90+
188
246
 
189
- # Run tests in watch mode during development
190
- npm run test:watch
247
+ ## Accessibility
191
248
 
192
- # Run tests with coverage report
193
- npm run test:coverage
194
- ```
249
+ All feed components are WCAG 2.1 AA compliant:
250
+
251
+ - Semantic HTML markup
252
+ - ARIA live regions for updates
253
+ - Keyboard navigation
254
+ - Screen reader announcements
255
+ - Skip links for long lists
195
256
 
196
- ## Release Process
257
+ ## Documentation
197
258
 
198
- The release process requires all tests to pass before publishing:
259
+ - **[Feed Components](./)** - Complete reference
260
+ - **[Design System](https://designsystem.umd.edu)** - Full design system docs
261
+
262
+ ## Testing
199
263
 
200
264
  ```bash
201
- npm run release
202
- ```
265
+ # Run tests
266
+ npm test
203
267
 
204
- This will:
268
+ # Watch mode
269
+ npm run test:watch
205
270
 
206
- 1. Run all tests (and abort if any tests fail)
207
- 2. Clean the distribution directory
208
- 3. Build the project
209
- 4. Publish the package
271
+ # Coverage report
272
+ npm run test:coverage
273
+ ```
210
274
 
211
275
  ## Contributing
212
276
 
213
- For contribution guidelines, please refer to the main repository README.
277
+ See the [main repository](https://github.com/umd-digital/design-system) for contribution guidelines.
214
278
 
215
279
  ## License
216
280
 
217
- This project is licensed under the University of Maryland license.
281
+ University of Maryland
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=grouped.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped.test.d.ts","sourceRoot":"","sources":["../../../../source/composite/events/__tests__/grouped.test.ts"],"names":[],"mappings":""}
@@ -39,6 +39,7 @@ export declare const display: ({ entry, isThemeDark, }: {
39
39
  text: HTMLDivElement | null;
40
40
  eventMeta: {
41
41
  element: HTMLElement;
42
+ className: string;
42
43
  styles: string;
43
44
  };
44
45
  isThemeDark: boolean | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../source/composite/events/common/data.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,SAAS,MAAM,SAAS,CAAC;AACrC,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,WAAW,EACZ,MAAM,WAAW,CAAC;AAEnB,UAAU,aAAc,SAAQ,YAAY;IAC1C,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,UAAU,YAAa,SAAQ,WAAW;CAAG;AAE7C,eAAO,MAAM,iBAAiB,UAAW,aAAa;;;;;;;;;;;;;;;;;;;;;;;CAMpD,CAAC;AAEH,eAAO,MAAM,YAAY,UAChB,YAAY,KAClB,SAAS,CAAC,oBAuBZ,CAAC;AAEF,eAAO,MAAM,OAAO,4BAGjB;IACD,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;;;;;;;;CAWC,CAAC"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../source/composite/events/common/data.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,SAAS,MAAM,SAAS,CAAC;AACrC,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,WAAW,EACZ,MAAM,WAAW,CAAC;AAEnB,UAAU,aAAc,SAAQ,YAAY;IAC1C,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,UAAU,YAAa,SAAQ,WAAW;CAAG;AAE7C,eAAO,MAAM,iBAAiB,UAAW,aAAa;;;;;;;;;;;;;;;;;;;;;;;CAMpD,CAAC;AAEH,eAAO,MAAM,YAAY,UAChB,YAAY,KAClB,SAAS,CAAC,oBAuBZ,CAAC;AAEF,eAAO,MAAM,OAAO,4BAGjB;IACD,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;;;;;;;;;CAWC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../source/composite/events/common/fetch.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EACb,MAAM,WAAW,CAAC;AAEnB,UAAU,aAAc,SAAQ,YAAY;CAAG;AAE/C,UAAU,WAAY,SAAQ,iBAAiB;IAC7C,kBAAkB,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAC9D,gBAAgB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAED,eAAO,MAAM,wBAAwB,kCAAkC,CAAC;AAExE,KAAK,kBAAkB,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,GAAG;IACtD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AA6EF,eAAO,MAAM,IAAI,UAAiB,aAAa,kBAqB9C,CAAC;AAEF,eAAO,MAAM,KAAK,UAAiB,WAAW,kBA2B7C,CAAC"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../source/composite/events/common/fetch.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EACb,MAAM,WAAW,CAAC;AAEnB,UAAU,aAAc,SAAQ,YAAY;CAAG;AAE/C,UAAU,WAAY,SAAQ,iBAAiB;IAC7C,kBAAkB,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAC9D,gBAAgB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAED,eAAO,MAAM,wBAAwB,kCAAkC,CAAC;AAExE,KAAK,kBAAkB,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,GAAG;IACtD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAyEF,eAAO,MAAM,IAAI,UAAiB,aAAa,kBAqB9C,CAAC;AAEF,eAAO,MAAM,KAAK,UAAiB,WAAW,kBA2B7C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type ListProps } from './_types';
2
+ import { type ElementModel } from '../../_types';
3
+ declare const _default: (props: ListProps) => ElementModel;
4
+ export default _default;
5
+ //# sourceMappingURL=grouped.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped.d.ts","sourceRoot":"","sources":["../../../source/composite/events/grouped.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,SAAS,EAAoC,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;gCAuG1B,SAAS,KAAG,YAAY;AAA/C,wBA0IO"}
@@ -1,4 +1,5 @@
1
1
  export { default as grid } from './grid';
2
2
  export { default as list } from './list';
3
3
  export { default as slider } from './slider';
4
+ export { default as grouped } from './grouped';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/composite/events/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkBzC,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAiBzC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/composite/events/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkBzC,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAiBzC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAkB7C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"featured.d.ts","sourceRoot":"","sources":["../../../source/composite/news/featured.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;gCAE1B,aAAa,KAAG,YAAY;AAAnD,wBAiMO"}
1
+ {"version":3,"file":"featured.d.ts","sourceRoot":"","sources":["../../../source/composite/news/featured.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;gCAE1B,aAAa,KAAG,YAAY;AAAnD,wBAgMO"}
@@ -21,6 +21,7 @@ export declare const gridOffsetGap: ({ count, isLayoutReversed, overwriteStickyP
21
21
  overwriteStickyPosition?: number;
22
22
  }) => {
23
23
  element: HTMLElement;
24
+ className: string;
24
25
  styles: string;
25
26
  };
26
27
  //# sourceMappingURL=layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../source/elements/layout.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,QAAO;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAe7D,CAAC;AAEL,eAAO,MAAM,IAAI,eAEd;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,KAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAiBtC,CAAC;AAEL,eAAO,MAAM,OAAO,eAEjB;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAetC,CAAC;AAEL,eAAO,MAAM,aAAa,0DAIvB;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,KAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAgCtC,CAAC"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../source/elements/layout.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,QAAO;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAe7D,CAAC;AAEL,eAAO,MAAM,IAAI,eAEd;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,KAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAiBtC,CAAC;AAEL,eAAO,MAAM,OAAO,eAEjB;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAetC,CAAC;AAEL,eAAO,MAAM,aAAa,0DAIvB;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;;;;CAyCG,CAAC"}
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- !function(e,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n(require("@universityofmaryland/web-styles-library"),require("@universityofmaryland/web-elements-library"));else if("function"==typeof define&&define.amd)define(["@universityofmaryland/web-styles-library","@universityofmaryland/web-elements-library"],n);else{var t="object"==typeof exports?n(require("@universityofmaryland/web-styles-library"),require("@universityofmaryland/web-elements-library")):n(e["@universityofmaryland/web-styles-library"],e["@universityofmaryland/web-elements-library"]);for(var a in t)("object"==typeof exports?exports:e)[a]=t[a]}}(self,((__WEBPACK_EXTERNAL_MODULE__708__,__WEBPACK_EXTERNAL_MODULE__149__)=>(()=>{"use strict";var __webpack_modules__={572:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n academic: () => (/* reexport */ academic_namespaceObject),\n events: () => (/* reexport */ composite_events_namespaceObject),\n news: () => (/* reexport */ news_namespaceObject)\n});\n\n// NAMESPACE OBJECT: ./source/composite/academic/index.ts\nvar academic_namespaceObject = {};\n__webpack_require__.r(academic_namespaceObject);\n__webpack_require__.d(academic_namespaceObject, {\n slider: () => (academic_slider)\n});\n\n// NAMESPACE OBJECT: ./source/composite/events/index.ts\nvar composite_events_namespaceObject = {};\n__webpack_require__.r(composite_events_namespaceObject);\n__webpack_require__.d(composite_events_namespaceObject, {\n grid: () => (events_grid),\n list: () => (list),\n slider: () => (events_slider)\n});\n\n// NAMESPACE OBJECT: ./source/composite/news/index.ts\nvar news_namespaceObject = {};\n__webpack_require__.r(news_namespaceObject);\n__webpack_require__.d(news_namespaceObject, {\n featured: () => (featured),\n grid: () => (news_grid),\n list: () => (news_list)\n});\n\n;// CONCATENATED MODULE: ./source/macros/aria-live.ts\nconst create = ({ message }) => {\n const container = document.createElement('div');\n const textElement = document.createElement('p');\n container.setAttribute('aria-live', 'polite');\n container.setAttribute('role', 'status');\n container.classList.add('sr-only');\n textElement.innerHTML = message;\n container.appendChild(textElement);\n return container;\n};\nconst update = ({ container, message, }) => {\n const element = container.querySelector(`[aria-live]`);\n const textElement = element.querySelector('p');\n if (textElement)\n textElement.innerHTML = message;\n};\n/* harmony default export */ const aria_live = ({\n create,\n update,\n});\n\n// EXTERNAL MODULE: external \"@universityofmaryland/web-styles-library\"\nvar web_styles_library_ = __webpack_require__(708);\n// EXTERNAL MODULE: external \"@universityofmaryland/web-elements-library\"\nvar web_elements_library_ = __webpack_require__(149);\n;// CONCATENATED MODULE: ./source/macros/lazy-load.ts\n\n\nconst lazy_load_create = ({ callback, isThemeDark, isLazyLoad, totalEntries, offset, }) => {\n if (!isLazyLoad)\n return;\n if (!totalEntries)\n return;\n if (!offset)\n return;\n if (!callback)\n return;\n if (offset >= totalEntries)\n return;\n const composite = web_elements_library_.Model.ElementModel.layout.alignedCenter({\n element: document.createElement('div'),\n isThemeDark,\n elementStyles: {\n element: {\n marginTop: `${web_styles_library_.token.spacing.lg}`,\n },\n },\n });\n const ctaButton = web_elements_library_.Model.ElementModel.actions.outlineOptions({\n element: document.createElement('button'),\n isThemeDark,\n });\n ctaButton.element.innerHTML = 'Load more';\n ctaButton.element.addEventListener('click', callback);\n composite.element.appendChild(ctaButton.element);\n composite.styles += ctaButton.styles;\n return composite;\n};\nconst remove = ({ container }) => {\n const button = container.querySelector(`.${web_styles_library_.layout.alignment.block.center.className}`);\n if (button)\n button.remove();\n};\n/* harmony default export */ const lazy_load = ({\n remove,\n create: lazy_load_create,\n});\n\n;// CONCATENATED MODULE: ./source/macros/loader.ts\nconst ID_UMD_LOADER = 'umd-loader-container';\nconst loader_styles = `\n @keyframes loader-first-animation {\n 0% {\n transform: scale(0);\n }\n 100% {\n transform: scale(1);\n }\n }\n \n @keyframes loader-last-animation {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0);\n }\n }\n \n @keyframes loader-middle-animation {\n 0% {\n transform: translate(0, 0);\n }\n 100% {\n transform: translate(24px, 0);\n }\n }\n\n .${ID_UMD_LOADER} {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 10px 0;\n min-height: 40px;\n position: relative;\n grid-column: 1 / -1;\n }\n\n .${ID_UMD_LOADER} > div {\n position: relative;\n }\n\n .${ID_UMD_LOADER} > div > div {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--grayDark);\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\n }\n\n .${ID_UMD_LOADER} > div > div:first-child {\n left: 5px;\n animation: loader-first-animation 0.6s infinite;\n }\n\n .${ID_UMD_LOADER} > div > div:nth-child(2) {\n left: 5px;\n animation: loader-middle-animation 0.6s infinite;\n }\n\n .${ID_UMD_LOADER} > div > div:nth-child(3) {\n left: 24px;\n animation: loader-middle-animation 0.6s infinite;\n }\n\n .${ID_UMD_LOADER} > div > div:last-child {\n left: 45px;\n animation: loader-last-animation 0.6s infinite;\n }\n`;\nconst loader_create = () => {\n const container = document.createElement('div');\n const wrapper = document.createElement('div');\n const innerElmOne = document.createElement('div');\n const innerElmTwo = document.createElement('div');\n const innerElmThree = document.createElement('div');\n const innerElmFour = document.createElement('div');\n container.classList.add(ID_UMD_LOADER);\n wrapper.appendChild(innerElmOne);\n wrapper.appendChild(innerElmTwo);\n wrapper.appendChild(innerElmThree);\n wrapper.appendChild(innerElmFour);\n container.appendChild(wrapper);\n return container;\n};\nconst loader_remove = ({ container }) => {\n const loader = container.querySelector(`.${ID_UMD_LOADER}`);\n if (loader)\n loader.remove();\n};\nconst display = ({ container }) => {\n const loader = loader_create();\n container.appendChild(loader);\n};\n/* harmony default export */ const macros_loader = ({\n create: loader_create,\n display,\n remove: loader_remove,\n});\n\n;// CONCATENATED MODULE: ./source/macros/no-results.ts\n\n\n/* harmony default export */ const no_results = (({ message, linkUrl, linkText, isThemeDark, isAlignedCenter = true, }) => {\n const composite = web_elements_library_.Model.ElementModel.layout.gridStacked({\n element: document.createElement('div'),\n isThemeDark,\n elementStyles: {\n element: {\n [`& *`]: {\n textAlign: isAlignedCenter ? 'center' : 'left',\n },\n [`& *:not(:first-child)`]: {\n marginTop: `${web_styles_library_.token.spacing.md}`,\n },\n },\n },\n });\n const headline = web_elements_library_.Model.ElementModel.headline.sansExtraLarge({\n element: document.createElement('p'),\n isThemeDark,\n elementStyles: {\n element: {\n textTransform: 'uppercase',\n },\n },\n });\n headline.element.innerHTML = message || 'No results found';\n composite.element.appendChild(headline.element);\n composite.styles += headline.styles;\n if (linkUrl && linkText) {\n const link = document.createElement('a');\n link.innerHTML = linkText;\n link.setAttribute('href', linkUrl);\n link.setAttribute('target', '_blank');\n link.setAttribute('rel', 'noopener noreferrer');\n const ctaButton = web_elements_library_.Atomic.actions.options({\n element: link,\n isTypeOutline: true,\n isThemeDark,\n });\n composite.element.appendChild(ctaButton.element);\n composite.styles += ctaButton.styles;\n }\n return composite;\n});\n\n;// CONCATENATED MODULE: ./source/macros/slider.ts\n\n\nconst { FetchGraphQL } = web_elements_library_.Utilities.network;\n/* harmony default export */ const slider = (({ token, query, url, categories, isThemeDark, headline, actions, }) => {\n const dataSlider = document.createElement('div');\n const slider = web_elements_library_.Composite.slider.events({\n isThemeDark,\n dataSlider,\n headline,\n actions,\n });\n let variables = { startDate: new Date().toDateString() };\n let shadowRoot = null;\n const setShadowStyles = async ({ shadowRoot, styles, }) => {\n const styleElement = document.createElement('style');\n const optimizedCss = await web_styles_library_.utilities.transform.css.removeDuplicates(styles);\n styleElement.textContent = optimizedCss;\n shadowRoot.appendChild(styleElement);\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const loadEvents = async () => {\n if (categories) {\n const related = categories.split(',');\n variables.related = related;\n }\n const fetchVariables = {\n query,\n url,\n token,\n variables,\n };\n const feedData = await FetchGraphQL(fetchVariables);\n const slides = feedData?.data?.entries?.events.map((data, i) => {\n const headline = document.createElement('p');\n headline.textContent = data.title;\n const dateSign = web_elements_library_.Atomic.events.sign({\n startMonth: data.startMonth,\n startDay: data.startDay,\n endDay: data.endDay,\n endMonth: data.endMonth,\n isThemeDark,\n });\n const textLockup = web_elements_library_.Atomic.textLockup.date({\n headline,\n isThemeDark,\n dateSign,\n });\n if (i === 0) {\n slider.styles += textLockup.styles;\n slider.styles += dateSign.styles;\n }\n return textLockup;\n });\n slides?.forEach((slide) => dataSlider.appendChild(slide.element));\n if (shadowRoot)\n setShadowStyles({ shadowRoot, styles: slider.styles });\n setTimeout(() => {\n slider.events.load();\n }, 100);\n };\n loadEvents();\n return {\n ...slider,\n events: {\n callback,\n },\n };\n});\n\n;// CONCATENATED MODULE: ./source/macros/index.ts\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./source/composite/academic/slider.ts\n\nconst QUERY_DATA = `\n title\n url\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n`;\nconst query = `\n query getEvents($startDate: String!, $related: [QueryArgument]) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: 12\n calendarId: [4, 2]\n ) {\n ${QUERY_DATA}\n }\n }\n }\n`;\n/* harmony default export */ const academic_slider = ((props) => slider({\n ...props,\n query,\n url: 'https://provost.umd.edu/graphql',\n}));\n\n;// CONCATENATED MODULE: ./source/composite/academic/index.ts\n\n\n;// CONCATENATED MODULE: ./source/elements/asset.ts\nconst standard = ({ images, url, }) => {\n const image = images[0];\n const imageElement = document.createElement('img');\n imageElement.src = image.url;\n imageElement.alt = image.altText;\n if (url) {\n const link = document.createElement('a');\n link.setAttribute('target', '_blank');\n link.setAttribute('href', url);\n link.setAttribute('aria-label', `Maryland Today Article with image ${image.altText}`);\n link.appendChild(imageElement);\n return link;\n }\n return imageElement;\n};\n\n;// CONCATENATED MODULE: ./source/elements/layout.ts\n\n\nconst stacked = () => web_elements_library_.Model.ElementModel.layout.gridStacked({\n element: document.createElement('div'),\n elementStyles: {\n element: {\n gridGap: `${web_styles_library_.token.spacing.md}`,\n [` > *`]: {\n containerType: 'inline-size',\n },\n [`& .${web_styles_library_.element.asset.image.wrapperScaled.className}`]: {\n alignSelf: 'flex-start',\n },\n },\n },\n});\nconst grid = ({ count = 2, }) => web_elements_library_.Model.ElementModel.layout.grid({\n element: document.createElement('div'),\n elementStyles: {\n element: {\n [` > *`]: {\n containerType: 'inline-size',\n [`@media (${web_styles_library_.token.media.queries.large.min})`]: {\n minHeight: '560px !important',\n },\n },\n },\n },\n isGap: false,\n isColumnsTwo: count === 2,\n isColumnsThree: count === 3,\n isColumnsFour: count === 4,\n});\nconst gridGap = ({ count = 2, }) => web_elements_library_.Model.ElementModel.layout.grid({\n element: document.createElement('div'),\n elementStyles: {\n element: {\n [` > *`]: {\n alignSelf: 'flex-start',\n containerType: 'inline-size',\n },\n },\n },\n isGap: true,\n isColumnsTwo: count === 2,\n isColumnsThree: count === 3,\n isColumnsFour: count === 4,\n});\nconst gridOffsetGap = ({ count = 2, isLayoutReversed, overwriteStickyPosition = 0, }) => web_elements_library_.Model.ElementModel.layout.grid({\n element: document.createElement('div'),\n elementStyles: {\n element: {\n [` > *`]: {\n alignSelf: 'flex-start',\n containerType: 'inline-size',\n },\n [` > *:first-child`]: {\n order: isLayoutReversed ? 2 : -1,\n },\n [`& .${web_styles_library_.element.composite.card.overlay.image.tint.className}`]: {\n [`@media (${web_styles_library_.token.media.queries.large.min})`]: {\n minHeight: '560px !important',\n height: 'inherit',\n position: 'sticky',\n top: `${overwriteStickyPosition}px`,\n },\n [`*`]: {\n color: `${web_styles_library_.token.color.white}`,\n },\n },\n },\n },\n isGap: true,\n isColumnsTwo: count === 2,\n isColumnsThree: count === 3,\n isColumnsFour: count === 4,\n});\n\n;// CONCATENATED MODULE: ./source/elements/text.ts\nconst summary = ({ text }) => {\n if (text) {\n const textElement = document.createElement('div');\n const textNode = document.createElement('p');\n textNode.innerHTML = text;\n textElement.appendChild(textNode);\n return textElement;\n }\n return null;\n};\nconst headline = ({ text, url }) => {\n if (text && url) {\n const headline = document.createElement('p');\n const headlineLink = document.createElement('a');\n headlineLink.href = url;\n headlineLink.innerHTML = text;\n headlineLink.target = '_blank';\n headlineLink.rel = 'noopener noreferrer';\n headline.appendChild(headlineLink);\n return headline;\n }\n return null;\n};\nconst date = ({ date, dateFormatted, }) => {\n if (date && dateFormatted) {\n const dateElement = document.createElement('time');\n dateElement.innerHTML = dateFormatted;\n dateElement.setAttribute('datetime', date);\n return dateElement;\n }\n return null;\n};\n\n;// CONCATENATED MODULE: ./source/elements/index.ts\n\n\n\n\n;// CONCATENATED MODULE: ./source/composite/events/common/queries.ts\nconst EVENTS_COUNT_QUERY = `\nquery getEventsCount($startDate: String!, $related: [QueryArgument]) {\n count: solspace_calendar {\n events(relatedTo: $related, loadOccurrences: true, startsAfterOrAt: $startDate) {\n ... on communications_Event {\n id\n }\n ... on submission_Event {\n id\n }\n }\n }\n}\n`;\nconst EVENTS_QUERY = `\nquery getEvents($startDate: String!, $related: [QueryArgument], $limit: Int, $offset: Int) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: $limit\n offset: $offset\n ) {\n ... on communications_Event {\n id\n title\n url\n startDayOfWeek: startDate @formatDateTime(format: \"D\")\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n startStamp: startDate @formatDateTime(format: \"Y-m-d\")\n startTime: startDate @formatDateTime(format: \"g:ia\")\n endDayOfWeek: endDate @formatDateTime(format: \"D\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n endTime: endDate @formatDateTime(format: \"g:ia\")\n allDay\n desciption: commonRichText\n summary: commonRichTextTwo\n image: commonAssetHeroImageSingle {\n title\n commonPlainTextTwo: alt\n url\n }\n location: categoriesCampusBuildingSingle {\n title\n }\n link: commonEntriesLinkSingle {\n ... on links_links_Entry {\n type: linksDropdownSelector\n externalUrl: commonPlainTextThree\n altTitle: commonPlainTextTwo\n title\n internalLinks: calendarEntriesEvent {\n id\n url\n }\n }\n }\n }\n ... on submission_Event {\n id\n title\n url\n startDayOfWeek: startDate @formatDateTime(format: \"D\")\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n startStamp: startDate @formatDateTime(format: \"Y-m-d\")\n startTime: startDate @formatDateTime(format: \"g:ia\")\n endDayOfWeek: endDate @formatDateTime(format: \"D\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n endTime: endDate @formatDateTime(format: \"g:ia\")\n allDay\n desciption: commonRichText\n summary: commonRichTextTwo\n image: commonAssetHeroImageSingle {\n title\n commonPlainTextTwo: alt\n url\n }\n location: categoriesCampusBuildingSingle {\n title\n }\n link: commonEntriesLinkSingle {\n ... on links_links_Entry {\n type: linksDropdownSelector\n externalUrl: commonPlainTextThree\n altTitle: commonPlainTextTwo\n title\n internalLinks: calendarEntriesEvent {\n id\n url\n }\n }\n }\n }\n }\n }\n}\n`;\n\n;// CONCATENATED MODULE: ./source/composite/events/common/data.ts\n\n\n\nconst lazyLoadVariables = (props) => ({\n ...props,\n totalEntries: props.getTotalEntries(),\n offset: props.getOffset(),\n container: props.getContainer(),\n callback: () => load(props),\n});\nconst apiVariables = (props) => {\n const { categories, getOffset, token, numberOfRowsToStart, numberOfColumnsToShow = 1, } = props;\n const obj = {\n offset: getOffset(),\n token,\n limit: numberOfRowsToStart,\n };\n if (numberOfColumnsToShow) {\n obj.limit = numberOfColumnsToShow * numberOfRowsToStart;\n }\n if (categories) {\n obj.related = categories;\n }\n return obj;\n};\nconst data_display = ({ entry, isThemeDark, }) => ({\n headline: headline({\n text: entry.title,\n url: entry.url,\n }),\n text: summary({ text: entry.summary }),\n eventMeta: web_elements_library_.Atomic.events.meta({\n ...entry,\n isThemeDark,\n }),\n isThemeDark,\n});\n\n;// CONCATENATED MODULE: ./source/composite/events/common/fetch.ts\n\n\n\n\nconst ID_GRID_LAYOUT_CONTAINER = 'umd-grid-gap-layout-container';\nconst fetchFeed = async ({ limit, related, offset, token, query, }) => {\n if (!token)\n throw new Error('Token not found');\n const variables = {\n startDate: new Date().toDateString(),\n limit,\n related,\n offset,\n };\n return await web_elements_library_.Utilities.network.FetchGraphQL({\n query,\n url: 'https://calendar.umd.edu/graphql',\n token: token,\n variables,\n });\n};\nconst getCount = async ({ variables }) => {\n const feedData = await fetchFeed({\n ...variables,\n query: EVENTS_COUNT_QUERY,\n });\n console.log(feedData);\n if (!feedData || !feedData.data || feedData.message) {\n if (feedData.message)\n console.error(feedData.message);\n return null;\n }\n return feedData?.data?.count?.events?.length || 0;\n};\nconst getEntries = async ({ variables, }) => {\n const feedData = await fetchFeed({ ...variables, query: EVENTS_QUERY });\n const graceFail = ({ message }) => {\n throw new Error(message);\n };\n if (!feedData ||\n !feedData.data ||\n !feedData.data.entries ||\n feedData.message) {\n if (!feedData)\n graceFail({ message: 'Feed not found' });\n if (!feedData.data)\n graceFail({ message: 'Feed data not found' });\n if (!feedData.data.entries)\n graceFail({ message: 'Feed entries not found' });\n if (!feedData.data.entries.events)\n graceFail({ message: 'Feed events not found' });\n if (!feedData.message)\n graceFail({ message: `Feed data errors: ${feedData.message}` });\n }\n console.log('Feed data fetched successfully:', feedData);\n return feedData.data.entries.events;\n};\nconst load = async (props) => {\n const { getContainer, getOffset, displayResults, getTotalEntries } = props;\n const container = getContainer();\n const currentCount = getOffset();\n const totalEntries = getTotalEntries();\n lazy_load.remove({ container });\n macros_loader.display({ container });\n getEntries({\n variables: apiVariables(props),\n }).then((feedData) => {\n displayResults({ feedData });\n aria_live.update({\n container,\n message: `Showing ${currentCount + feedData.length} of ${totalEntries} articles`,\n });\n });\n};\nconst start = async (props) => {\n const { displayNoResults, displayResultStart, setTotalEntries } = props;\n await getCount({\n variables: apiVariables(props),\n }).then((count) => {\n if (count === 0) {\n displayNoResults({ ...props });\n return;\n }\n if (count) {\n setTotalEntries(count);\n }\n if (count === null) {\n displayNoResults({\n ...props,\n message: 'An error occurred while fetching the data.',\n });\n return;\n }\n });\n getEntries({\n variables: apiVariables(props),\n }).then((feedData) => displayResultStart({ ...props, feedData }));\n};\n\n;// CONCATENATED MODULE: ./source/utilities/events/index.ts\nconst eventNames = {\n FEED_LOADED: 'feed:loaded',\n FEED_ERROR: 'feed:error',\n};\nconst dispatch = (element, eventName, detail) => {\n const event = new CustomEvent(eventName, {\n detail,\n bubbles: true,\n cancelable: true,\n });\n return element.dispatchEvent(event);\n};\nconst listen = (element, eventName, callback, options) => {\n const eventListener = (event) => {\n const customEvent = event;\n callback(customEvent.detail);\n };\n element.addEventListener(eventName, eventListener, options);\n return () => {\n element.removeEventListener(eventName, eventListener, options);\n };\n};\n\n;// CONCATENATED MODULE: ./source/utilities/index.ts\n\n\n\n;// CONCATENATED MODULE: ./source/composite/events/common/display.ts\n\n\n\n\n\nconst display_ID_GRID_LAYOUT_CONTAINER = 'umd-grid-gap-layout-container';\nconst setShadowStyles = async ({ shadowRoot, styles, }) => {\n const styleElement = document.createElement('style');\n const optimizedCss = await web_styles_library_.utilities.transform.css.removeDuplicates(styles);\n styleElement.textContent = optimizedCss;\n shadowRoot.appendChild(styleElement);\n};\nconst noResults = ({ getContainer, getStyles, getShadowRoot, setStyles, isThemeDark, message = 'No events found', linkUrl = 'https://calendar.umd.edu', linkText = 'View all events', }) => {\n const container = getContainer();\n const shadowRoot = getShadowRoot();\n const noResultsContent = no_results({\n message,\n linkUrl,\n linkText,\n isThemeDark,\n });\n const ariaLiveContent = aria_live.create({\n message,\n });\n container.innerHTML = '';\n container.appendChild(noResultsContent.element);\n container.appendChild(ariaLiveContent);\n setStyles(noResultsContent.styles);\n dispatch(container, eventNames.FEED_ERROR, {\n error: 'No results found',\n message,\n });\n setTimeout(() => {\n const styles = getStyles();\n if (shadowRoot) {\n setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n }, 100);\n};\nconst resultLoad = async (props) => {\n const { entries, getContainer, setStyles, setOffset } = props;\n const container = getContainer();\n const grid = container.querySelector(`#${display_ID_GRID_LAYOUT_CONTAINER}`);\n macros_loader.remove({ container });\n lazy_load.remove({ container });\n setOffset(entries.length);\n return new Promise((resolve) => {\n entries.forEach((entry) => {\n grid.appendChild(entry.element);\n setStyles(entry.styles);\n });\n const lazyLoadButton = lazy_load.create(lazyLoadVariables({\n ...props,\n callback: load,\n }));\n if (lazyLoadButton) {\n container.appendChild(lazyLoadButton.element);\n setStyles(lazyLoadButton.styles);\n }\n resolve();\n });\n};\nconst resultStart = (props) => {\n const { feedData, numberOfColumnsToShow = 1, numberOfRowsToStart, isLazyLoad, displayResults, getContainer, getTotalEntries, setOffset, setStyles, layoutElement, } = props;\n const container = getContainer();\n const totalEntries = getTotalEntries();\n const showAmount = numberOfColumnsToShow || 1 * numberOfRowsToStart;\n const message = isLazyLoad\n ? `Showing ${showAmount} of ${totalEntries} articles`\n : `Showing ${showAmount} articles`;\n layoutElement.element.setAttribute('id', display_ID_GRID_LAYOUT_CONTAINER);\n container.appendChild(layoutElement.element);\n setStyles(layoutElement.styles);\n dispatch(container, eventNames.FEED_LOADED, {\n items: feedData,\n count: feedData.length,\n total: totalEntries || feedData.length,\n });\n displayResults({ feedData });\n container.appendChild(aria_live.create({\n message,\n }));\n};\n\n;// CONCATENATED MODULE: ./source/composite/events/grid.ts\n\n\n\n\n\n\n/* harmony default export */ const events_grid = ((props) => (() => {\n const { isThemeDark, isTransparent, numberOfColumnsToShow } = props;\n const loader = macros_loader.create();\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader_styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const displayResults = async ({ feedData }) => {\n await resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) => web_elements_library_.Composite.card.block({\n ...data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n isTransparent,\n })),\n });\n if (shadowRoot) {\n setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n const layoutElement = gridGap({\n count: numberOfColumnsToShow,\n });\n container.appendChild(loader);\n start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: resultStart,\n displayNoResults: noResults,\n layoutElement,\n isThemeDark,\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/events/list.ts\n\n\n\n\n\n\n/* harmony default export */ const list = ((props) => (() => {\n const { isThemeDark } = props;\n const loader = macros_loader.create();\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader_styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const displayResults = async ({ feedData }) => {\n await resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) => web_elements_library_.Composite.card.list({\n ...data_display({ entry, isThemeDark }),\n dateSign: web_elements_library_.Atomic.events.sign({\n ...entry,\n isThemeDark,\n isLargeSize: true,\n }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n })),\n });\n if (shadowRoot) {\n setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n container.appendChild(loader);\n start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: resultStart,\n displayNoResults: noResults,\n layoutElement: stacked(),\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/events/slider.ts\n\nconst slider_QUERY_DATA = `\n title\n url\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n`;\nconst slider_query = `\n query getEvents($startDate: String!, $related: [QueryArgument]) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: 12\n ) {\n ... on submission_Event {\n ${slider_QUERY_DATA}\n }\n }\n }\n }\n`;\n/* harmony default export */ const events_slider = ((props) => slider({\n ...props,\n query: slider_query,\n url: 'https://calendar.umd.edu/graphql',\n}));\n\n;// CONCATENATED MODULE: ./source/composite/events/index.ts\n\n\n\n\n;// CONCATENATED MODULE: ./source/composite/news/common/queries.ts\nconst ARTICLES_QUERY = `\n query getArticles($related: [QueryArgument], $relatedToAll: [QueryArgument], $limit: Int, $offset: Int, $not: [QueryArgument]) {\n entryCount(section: \"articles\", relatedTo: $related,relatedToAll: $relatedToAll)\n entries(\n section: \"articles\",\n relatedTo: $related,\n relatedToAll: $relatedToAll,\n limit: $limit,\n offset: $offset,\n id: $not\n ) {\n ... on articles_today_Entry {\n id\n title\n date: postDate\n dateFormatted: postDate @formatDateTime(format: \"M d, Y\")\n summary: genericText\n url\n image:articlesHeroImage {\n url\n ... on hero_Asset {\n id\n altText: genericText\n }\n }\n categories:categoryTodaySectionMultiple {\n title\n url\n }\n }\n }\n }\n`;\n\n;// CONCATENATED MODULE: ./source/composite/news/common/data.ts\n\n\nconst data_lazyLoadVariables = (props) => ({\n ...props,\n totalEntries: props.getTotalEntries(),\n offset: props.getOffset(),\n container: props.getContainer(),\n callback: () => fetch_load(props),\n});\nconst data_apiVariables = (props) => {\n const { isUnion, categories, getOffset, token, numberOfRowsToStart, numberOfColumnsToShow = 1, entriesToRemove, } = props;\n const obj = {\n offset: getOffset(),\n token,\n limit: numberOfRowsToStart,\n };\n if (numberOfColumnsToShow) {\n obj.limit = numberOfColumnsToShow * numberOfRowsToStart;\n }\n if (!isUnion && categories) {\n obj.relatedToAll = categories;\n }\n if (isUnion && categories) {\n obj.related = categories;\n }\n if (entriesToRemove) {\n obj.not = ['not', ...entriesToRemove];\n }\n return obj;\n};\nconst common_data_display = ({ entry, isThemeDark, }) => ({\n newsId: entry.id.toString(),\n headline: headline({\n text: entry.title,\n url: entry.url,\n }),\n text: summary({ text: entry.summary }),\n date: date({\n date: entry.date,\n dateFormatted: entry.dateFormatted,\n }),\n isThemeDark,\n});\n\n;// CONCATENATED MODULE: ./source/composite/news/common/fetch.ts\n\n\n\n\nconst fetch_ID_GRID_LAYOUT_CONTAINER = 'umd-grid-gap-layout-container';\nconst fetch_getEntries = async ({ limit, not, offset, related, relatedToAll, token, }) => {\n if (!token)\n throw new Error('Token not found');\n const graceFail = ({ message }) => {\n console.error(message);\n };\n const variables = {\n limit,\n related,\n relatedToAll,\n offset,\n not,\n };\n const feedData = await web_elements_library_.Utilities.network.FetchGraphQL({\n query: ARTICLES_QUERY,\n url: 'https://today.umd.edu/graphql',\n token: token,\n variables,\n });\n if (!feedData ||\n !feedData.data ||\n !feedData.data.entries ||\n feedData.message) {\n if (!feedData)\n graceFail({ message: 'Feed not found' });\n if (feedData?.message)\n graceFail({ message: `Feed data errors: ${feedData.message}` });\n return null;\n }\n return {\n entries: feedData.data.entries,\n count: feedData.data.entryCount,\n };\n};\nconst fetch_load = async (props) => {\n const { getContainer, getOffset, displayResults, getTotalEntries } = props;\n const container = getContainer();\n const currentCount = getOffset();\n const totalEntries = getTotalEntries();\n lazy_load.remove({ container });\n macros_loader.display({ container });\n fetch_getEntries(data_apiVariables(props)).then((feedData) => {\n if (feedData) {\n displayResults({ feedData: feedData.entries });\n aria_live.update({\n container,\n message: `Showing ${currentCount + feedData.entries.length} of ${totalEntries} articles`,\n });\n }\n });\n};\nconst fetch_start = async (props) => {\n const { displayNoResults, displayResultStart, setTotalEntries } = props;\n fetch_getEntries(data_apiVariables(props)).then((feedData) => {\n if (!feedData || !feedData.entries) {\n displayNoResults({\n ...props,\n message: 'An error occurred while fetching the data.',\n });\n return;\n }\n const totalEntries = feedData.count;\n if (totalEntries === 0) {\n displayNoResults({ ...props });\n return;\n }\n setTotalEntries(totalEntries);\n return displayResultStart({ ...props, feedData: feedData.entries });\n });\n};\n\n;// CONCATENATED MODULE: ./source/composite/news/common/display.ts\n\n\n\n\n\nconst common_display_ID_GRID_LAYOUT_CONTAINER = 'umd-grid-gap-layout-container';\nconst display_setShadowStyles = async ({ shadowRoot, styles, }) => {\n const styleElement = document.createElement('style');\n const optimizedCss = await web_styles_library_.utilities.transform.css.removeDuplicates(styles);\n styleElement.textContent = optimizedCss;\n shadowRoot.appendChild(styleElement);\n};\nconst display_noResults = ({ getContainer, getStyles, getShadowRoot, setStyles, message = 'No results found', linkUrl = 'https://today.umd.edu', linkText = 'View all articles', isThemeDark, }) => {\n const container = getContainer();\n const shadowRoot = getShadowRoot();\n const noResultsContent = no_results({\n message,\n linkUrl,\n linkText,\n isThemeDark,\n });\n const ariaLiveContent = aria_live.create({\n message,\n });\n container.innerHTML = '';\n container.appendChild(noResultsContent.element);\n container.appendChild(ariaLiveContent);\n setStyles(noResultsContent.styles);\n dispatch(container, eventNames.FEED_ERROR, {\n error: 'No results found',\n message,\n });\n setTimeout(() => {\n const styles = getStyles();\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n }, 100);\n};\nconst display_resultLoad = async (props) => {\n const { entries, getContainer, setStyles, setOffset } = props;\n const container = getContainer();\n const grid = container.querySelector(`#${common_display_ID_GRID_LAYOUT_CONTAINER}`);\n macros_loader.remove({ container });\n lazy_load.remove({ container });\n setOffset(entries.length);\n return new Promise((resolve) => {\n entries.forEach((entry) => {\n grid.appendChild(entry.element);\n setStyles(entry.styles);\n });\n const lazyLoadButton = lazy_load.create(data_lazyLoadVariables({\n ...props,\n callback: fetch_load,\n }));\n if (lazyLoadButton) {\n container.appendChild(lazyLoadButton.element);\n setStyles(lazyLoadButton.styles);\n }\n resolve();\n });\n};\nconst display_resultStart = (props) => {\n const { feedData, numberOfColumnsToShow = 1, numberOfRowsToStart, isLazyLoad, displayResults, getContainer, getTotalEntries, setTotalEntries, setStyles, layoutElement, } = props;\n const container = getContainer();\n const totalEntries = getTotalEntries();\n const showAmount = numberOfColumnsToShow || 1 * numberOfRowsToStart;\n const message = isLazyLoad\n ? `Showing ${showAmount} of ${totalEntries} articles`\n : `Showing ${showAmount} articles`;\n if (totalEntries)\n setTotalEntries(totalEntries);\n layoutElement.element.setAttribute('id', common_display_ID_GRID_LAYOUT_CONTAINER);\n container.appendChild(layoutElement.element);\n setStyles(layoutElement.styles);\n dispatch(container, eventNames.FEED_LOADED, {\n items: feedData,\n count: feedData.length,\n total: totalEntries || feedData.length,\n });\n displayResults({ feedData });\n container.appendChild(aria_live.create({\n message,\n }));\n};\n\n;// CONCATENATED MODULE: ./source/composite/news/featured.ts\n\n\n\n\n\n\n\n/* harmony default export */ const featured = ((props) => (() => {\n const { isThemeDark, isLazyLoad, isLayoutReversed, isTransparent, overwriteStickyPosition, } = props;\n const loader = macros_loader.create();\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let numberOfColumnsToShow = 3;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader_styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const setPosition = (position) => {\n const overlayElement = container.querySelector(`.${web_styles_library_.element.composite.card.overlay.image.tint.className}`);\n if (overlayElement)\n overlayElement.style.top = `${position}px`;\n };\n const layoutElement = gridGap({ count: 2 });\n const displayGridOffsetResults = async ({ feedData }) => {\n let entries = [];\n if (feedData.length >= 2) {\n const offsetLayout = gridOffsetGap({\n count: 2,\n isLayoutReversed,\n overwriteStickyPosition,\n });\n const firstEntry = feedData[0];\n const overlayCard = web_elements_library_.Composite.card.overlay.image({\n ...common_data_display({ entry: firstEntry }),\n backgroundImage: standard({\n images: firstEntry.image,\n url: firstEntry.url,\n }),\n });\n offsetLayout.element.appendChild(overlayCard.element);\n offsetLayout.element.appendChild(layoutElement.element);\n container.appendChild(offsetLayout.element);\n setStyles(offsetLayout.styles);\n setStyles(overlayCard.styles);\n entries = feedData.slice(1, 3).map((entry) => web_elements_library_.Composite.card.block({\n ...common_data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: true,\n isTransparent,\n }));\n }\n else {\n entries = feedData.map((entry) => web_elements_library_.Composite.card.overlay.image({\n ...common_data_display({ entry, isThemeDark }),\n backgroundImage: standard({\n images: entry.image,\n url: entry.url,\n }),\n }));\n container.appendChild(layoutElement.element);\n }\n await display_resultLoad({\n ...props,\n ...helperFunctions,\n numberOfColumnsToShow: 2,\n displayResults,\n entries,\n });\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n const displayResults = async ({ feedData }) => {\n const entries = feedData.map((entry) => web_elements_library_.Composite.card.block({\n ...common_data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: true,\n isTransparent,\n }));\n await display_resultLoad({\n ...props,\n ...helperFunctions,\n numberOfColumnsToShow: 2,\n displayResults,\n entries,\n });\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n const resultStart = (props) => {\n const { feedData, setOffset, getOffset } = props;\n const totalEntries = getTotalEntries();\n const showAmount = 3;\n const message = isLazyLoad\n ? `Showing ${showAmount} of ${totalEntries} articles`\n : `Showing ${showAmount} articles`;\n setOffset(getOffset() + 1);\n if (totalEntries)\n setTotalEntries(totalEntries);\n layoutElement.element.setAttribute('id', common_display_ID_GRID_LAYOUT_CONTAINER);\n setStyles(layoutElement.styles);\n displayGridOffsetResults({ feedData });\n container.appendChild(aria_live.create({\n message,\n }));\n };\n container.appendChild(loader);\n fetch_start({\n ...props,\n ...helperFunctions,\n numberOfColumnsToShow,\n displayResults,\n displayResultStart: resultStart,\n displayNoResults: display_noResults,\n layoutElement,\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n setPosition,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/news/grid.ts\n\n\n\n\n\n\n/* harmony default export */ const news_grid = ((props) => (() => {\n const { isThemeDark, isTransparent, numberOfColumnsToShow, isTypeOverlay } = props;\n const loader = macros_loader.create();\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader_styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const displayResults = async ({ feedData }) => {\n const entries = feedData.map((entry) => {\n if (isTypeOverlay) {\n return web_elements_library_.Composite.card.overlay.image({\n ...common_data_display({ entry }),\n backgroundImage: standard({\n images: entry.image,\n url: entry.url,\n }),\n });\n }\n return web_elements_library_.Composite.card.block({\n ...common_data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: true,\n isTransparent,\n });\n });\n await display_resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries,\n });\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n const layoutElement = isTypeOverlay\n ? grid({ count: numberOfColumnsToShow })\n : gridGap({ count: numberOfColumnsToShow });\n container.appendChild(loader);\n fetch_start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: display_resultStart,\n displayNoResults: display_noResults,\n layoutElement,\n isThemeDark,\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/news/list.ts\n\n\n\n\n\n\n/* harmony default export */ const news_list = ((props) => (() => {\n const { isThemeDark } = props;\n const loader = macros_loader.create();\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader_styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const displayResults = async ({ feedData }) => {\n await display_resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) => web_elements_library_.Composite.card.list({\n ...common_data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n })),\n });\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n container.appendChild(loader);\n fetch_start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: display_resultStart,\n displayNoResults: display_noResults,\n layoutElement: stacked(),\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/news/index.ts\n\n\n\n\n;// CONCATENATED MODULE: ./source/index.ts\n\n\n\n\n\n//# sourceURL=webpack://@universityofmaryland/web-feeds-library/./source/index.ts_+_30_modules?")},149:e=>{e.exports=__WEBPACK_EXTERNAL_MODULE__149__},708:e=>{e.exports=__WEBPACK_EXTERNAL_MODULE__708__}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(572);return __webpack_exports__})()));
1
+ !function(e,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n(require("@universityofmaryland/web-styles-library"),require("@universityofmaryland/web-elements-library"));else if("function"==typeof define&&define.amd)define(["@universityofmaryland/web-styles-library","@universityofmaryland/web-elements-library"],n);else{var t="object"==typeof exports?n(require("@universityofmaryland/web-styles-library"),require("@universityofmaryland/web-elements-library")):n(e["@universityofmaryland/web-styles-library"],e["@universityofmaryland/web-elements-library"]);for(var s in t)("object"==typeof exports?exports:e)[s]=t[s]}}(self,((__WEBPACK_EXTERNAL_MODULE__708__,__WEBPACK_EXTERNAL_MODULE__149__)=>(()=>{"use strict";var __webpack_modules__={314:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n academic: () => (/* reexport */ academic_namespaceObject),\n events: () => (/* reexport */ composite_events_namespaceObject),\n news: () => (/* reexport */ news_namespaceObject)\n});\n\n// NAMESPACE OBJECT: ./source/composite/academic/index.ts\nvar academic_namespaceObject = {};\n__webpack_require__.r(academic_namespaceObject);\n__webpack_require__.d(academic_namespaceObject, {\n slider: () => (academic_slider)\n});\n\n// NAMESPACE OBJECT: ./source/composite/events/index.ts\nvar composite_events_namespaceObject = {};\n__webpack_require__.r(composite_events_namespaceObject);\n__webpack_require__.d(composite_events_namespaceObject, {\n grid: () => (events_grid),\n grouped: () => (grouped),\n list: () => (list),\n slider: () => (events_slider)\n});\n\n// NAMESPACE OBJECT: ./source/composite/news/index.ts\nvar news_namespaceObject = {};\n__webpack_require__.r(news_namespaceObject);\n__webpack_require__.d(news_namespaceObject, {\n featured: () => (featured),\n grid: () => (news_grid),\n list: () => (news_list)\n});\n\n;// CONCATENATED MODULE: ./source/macros/aria-live.ts\nconst create = ({ message }) => {\n const container = document.createElement('div');\n const textElement = document.createElement('p');\n container.setAttribute('aria-live', 'polite');\n container.setAttribute('role', 'status');\n container.classList.add('sr-only');\n textElement.innerHTML = message;\n container.appendChild(textElement);\n return container;\n};\nconst update = ({ container, message, }) => {\n const element = container.querySelector(`[aria-live]`);\n const textElement = element.querySelector('p');\n if (textElement)\n textElement.innerHTML = message;\n};\n/* harmony default export */ const aria_live = ({\n create,\n update,\n});\n\n// EXTERNAL MODULE: external \"@universityofmaryland/web-styles-library\"\nvar web_styles_library_ = __webpack_require__(708);\n// EXTERNAL MODULE: external \"@universityofmaryland/web-elements-library\"\nvar web_elements_library_ = __webpack_require__(149);\n;// CONCATENATED MODULE: ./source/macros/lazy-load.ts\n\n\nconst lazy_load_create = ({ callback, isThemeDark, isLazyLoad, totalEntries, offset, }) => {\n if (!isLazyLoad)\n return;\n if (!totalEntries)\n return;\n if (!offset)\n return;\n if (!callback)\n return;\n if (offset >= totalEntries)\n return;\n const composite = web_elements_library_.Model.ElementModel.layout.alignedCenter({\n element: document.createElement('div'),\n isThemeDark,\n elementStyles: {\n element: {\n marginTop: `${web_styles_library_.token.spacing.lg}`,\n },\n },\n });\n const ctaButton = web_elements_library_.Model.ElementModel.actions.outlineOptions({\n element: document.createElement('button'),\n isThemeDark,\n });\n ctaButton.element.innerHTML = 'Load more';\n ctaButton.element.addEventListener('click', callback);\n composite.element.appendChild(ctaButton.element);\n composite.styles += ctaButton.styles;\n return composite;\n};\nconst remove = ({ container }) => {\n const button = container.querySelector(`.${web_styles_library_.layout.alignment.block.center.className}`);\n if (button)\n button.remove();\n};\n/* harmony default export */ const lazy_load = ({\n remove,\n create: lazy_load_create,\n});\n\n;// CONCATENATED MODULE: ./source/macros/loader.ts\n\n\nconst ID_UMD_LOADER = 'umd-loader-container';\nconst keyframes = `\n @keyframes loader-first-animation {\n 0% {\n transform: scale(0);\n }\n 100% {\n transform: scale(1);\n }\n }\n \n @keyframes loader-last-animation {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0);\n }\n }\n \n @keyframes loader-middle-animation {\n 0% {\n transform: translate(0, 0);\n }\n 100% {\n transform: translate(24px, 0);\n }\n }\n`;\nconst loader_create = ({ isThemeDark }) => {\n const defaultDotStyles = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: `${web_styles_library_.token.color.gray.dark}`,\n animationTimingFunction: 'cubic-bezier(0, 1, 1, 0)',\n ...(isThemeDark && {\n background: `${web_styles_library_.token.color.gray.light}`,\n }),\n };\n const innerElmOne = web_elements_library_.Model.ElementModel.createDiv({\n className: `${ID_UMD_LOADER}-one`,\n elementStyles: {\n element: {\n ...defaultDotStyles,\n left: '5px',\n animation: 'loader-first-animation 0.6s infinite',\n },\n },\n });\n const innerElmTwo = web_elements_library_.Model.ElementModel.createDiv({\n className: `${ID_UMD_LOADER}-two`,\n elementStyles: {\n element: {\n ...defaultDotStyles,\n left: '5px',\n animation: 'loader-middle-animation 0.6s infinite',\n },\n },\n });\n const innerElmThree = web_elements_library_.Model.ElementModel.createDiv({\n className: `${ID_UMD_LOADER}-three`,\n elementStyles: {\n element: {\n ...defaultDotStyles,\n left: '24px',\n animation: 'loader-middle-animation 0.6s infinite',\n },\n },\n });\n const innerElmFour = web_elements_library_.Model.ElementModel.createDiv({\n className: `${ID_UMD_LOADER}-four`,\n elementStyles: {\n element: {\n ...defaultDotStyles,\n left: '45px',\n animation: 'loader-last-animation 0.6s infinite',\n },\n },\n });\n const wrapper = web_elements_library_.Model.ElementModel.createDiv({\n className: `${ID_UMD_LOADER}-wrapper`,\n children: [innerElmOne, innerElmTwo, innerElmThree, innerElmFour],\n elementStyles: {\n element: {\n position: 'relative',\n },\n },\n });\n const composite = web_elements_library_.Model.ElementModel.createDiv({\n className: ID_UMD_LOADER,\n children: [wrapper],\n elementStyles: {\n element: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '10px 0',\n minHeight: '40px',\n position: 'relative',\n gridColumn: '1 / -1',\n },\n },\n });\n composite.styles += keyframes;\n return composite;\n};\nconst loader_remove = ({ container }) => {\n const loader = container.querySelector(`.${ID_UMD_LOADER}`);\n if (loader)\n loader.remove();\n};\nconst display = ({ container, isThemeDark, }) => {\n const loader = loader_create({ isThemeDark });\n container.appendChild(loader.element);\n};\n/* harmony default export */ const macros_loader = ({\n create: loader_create,\n display,\n remove: loader_remove,\n});\n\n;// CONCATENATED MODULE: ./source/macros/no-results.ts\n\n\n/* harmony default export */ const no_results = (({ message, linkUrl, linkText, isThemeDark, isAlignedCenter = true, }) => {\n const composite = web_elements_library_.Model.ElementModel.layout.gridStacked({\n element: document.createElement('div'),\n isThemeDark,\n elementStyles: {\n element: {\n [`& *`]: {\n textAlign: isAlignedCenter ? 'center' : 'left',\n },\n [`& *:not(:first-child)`]: {\n marginTop: `${web_styles_library_.token.spacing.md}`,\n },\n },\n },\n });\n const headline = web_elements_library_.Model.ElementModel.headline.sansExtraLarge({\n element: document.createElement('p'),\n isThemeDark,\n elementStyles: {\n element: {\n textTransform: 'uppercase',\n },\n },\n });\n headline.element.innerHTML = message || 'No results found';\n composite.element.appendChild(headline.element);\n composite.styles += headline.styles;\n if (linkUrl && linkText) {\n const link = document.createElement('a');\n link.innerHTML = linkText;\n link.setAttribute('href', linkUrl);\n link.setAttribute('target', '_blank');\n link.setAttribute('rel', 'noopener noreferrer');\n const ctaButton = web_elements_library_.Atomic.actions.options({\n element: link,\n isTypeOutline: true,\n isThemeDark,\n });\n composite.element.appendChild(ctaButton.element);\n composite.styles += ctaButton.styles;\n }\n return composite;\n});\n\n;// CONCATENATED MODULE: ./source/macros/slider.ts\n\n\nconst { FetchGraphQL } = web_elements_library_.Utilities.network;\n/* harmony default export */ const slider = (({ token, query, url, categories, isThemeDark, headline, actions, }) => {\n const dataSlider = document.createElement('div');\n const slider = web_elements_library_.Composite.slider.events({\n isThemeDark,\n dataSlider,\n headline,\n actions,\n });\n let variables = { startDate: new Date().toDateString() };\n let shadowRoot = null;\n const setShadowStyles = async ({ shadowRoot, styles, }) => {\n const styleElement = document.createElement('style');\n const optimizedCss = await web_styles_library_.utilities.transform.css.removeDuplicates(styles);\n styleElement.textContent = optimizedCss;\n shadowRoot.appendChild(styleElement);\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const loadEvents = async () => {\n if (categories) {\n const related = categories.split(',');\n variables.related = related;\n }\n const fetchVariables = {\n query,\n url,\n token,\n variables,\n };\n const feedData = await FetchGraphQL(fetchVariables);\n const slides = feedData?.data?.entries?.events.map((data, i) => {\n const headline = document.createElement('p');\n headline.textContent = data.title;\n const dateSign = web_elements_library_.Atomic.events.sign({\n startMonth: data.startMonth,\n startDay: data.startDay,\n endDay: data.endDay,\n endMonth: data.endMonth,\n isThemeDark,\n });\n const textLockup = web_elements_library_.Atomic.textLockup.date({\n headline,\n isThemeDark,\n dateSign,\n });\n if (i === 0) {\n slider.styles += textLockup.styles;\n slider.styles += dateSign.styles;\n }\n return textLockup;\n });\n slides?.forEach((slide) => dataSlider.appendChild(slide.element));\n if (shadowRoot)\n setShadowStyles({ shadowRoot, styles: slider.styles });\n setTimeout(() => {\n slider.events.load();\n }, 100);\n };\n loadEvents();\n return {\n ...slider,\n events: {\n callback,\n },\n };\n});\n\n;// CONCATENATED MODULE: ./source/macros/index.ts\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./source/composite/academic/slider.ts\n\nconst QUERY_DATA = `\n title\n url\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n`;\nconst query = `\n query getEvents($startDate: String!, $related: [QueryArgument]) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: 12\n calendarId: [4, 2]\n ) {\n ${QUERY_DATA}\n }\n }\n }\n`;\n/* harmony default export */ const academic_slider = ((props) => slider({\n ...props,\n query,\n url: 'https://provost.umd.edu/graphql',\n}));\n\n;// CONCATENATED MODULE: ./source/composite/academic/index.ts\n\n\n;// CONCATENATED MODULE: ./source/elements/asset.ts\nconst standard = ({ images, url, }) => {\n const image = images[0];\n const imageElement = document.createElement('img');\n imageElement.src = image.url;\n imageElement.alt = image.altText;\n if (url) {\n const link = document.createElement('a');\n link.setAttribute('target', '_blank');\n link.setAttribute('href', url);\n link.setAttribute('aria-label', `Maryland Today Article with image ${image.altText}`);\n link.appendChild(imageElement);\n return link;\n }\n return imageElement;\n};\n\n;// CONCATENATED MODULE: ./source/elements/layout.ts\n\n\nconst stacked = () => web_elements_library_.Model.ElementModel.layout.gridStacked({\n element: document.createElement('div'),\n elementStyles: {\n element: {\n gridGap: `${web_styles_library_.token.spacing.md}`,\n [` > *`]: {\n containerType: 'inline-size',\n },\n [`& .${web_styles_library_.element.asset.image.wrapperScaled.className}`]: {\n alignSelf: 'flex-start',\n },\n },\n },\n});\nconst grid = ({ count = 2, }) => web_elements_library_.Model.ElementModel.layout.grid({\n element: document.createElement('div'),\n elementStyles: {\n element: {\n [` > *`]: {\n containerType: 'inline-size',\n [`@media (${web_styles_library_.token.media.queries.large.min})`]: {\n minHeight: '560px !important',\n },\n },\n },\n },\n isGap: false,\n isColumnsTwo: count === 2,\n isColumnsThree: count === 3,\n isColumnsFour: count === 4,\n});\nconst gridGap = ({ count = 2, }) => web_elements_library_.Model.ElementModel.layout.grid({\n element: document.createElement('div'),\n elementStyles: {\n element: {\n [` > *`]: {\n alignSelf: 'flex-start',\n containerType: 'inline-size',\n },\n },\n },\n isGap: true,\n isColumnsTwo: count === 2,\n isColumnsThree: count === 3,\n isColumnsFour: count === 4,\n});\nconst gridOffsetGap = ({ count = 2, isLayoutReversed, overwriteStickyPosition = 0, }) => web_elements_library_.Model.ElementModel.layout.grid({\n element: document.createElement('div'),\n elementStyles: {\n element: {\n [` > *`]: {\n alignSelf: 'flex-start',\n containerType: 'inline-size',\n },\n [` > *:first-child`]: {\n order: isLayoutReversed ? 2 : -1,\n },\n [`& .${web_elements_library_.Composite.card.overlay.imageClassRef}`]: {\n [`@media (${web_styles_library_.token.media.queries.large.min})`]: {\n height: 'inherit',\n position: 'sticky',\n top: `${overwriteStickyPosition}px`,\n },\n [`*`]: {\n color: `${web_styles_library_.token.color.white}`,\n },\n [`& > div`]: {\n [`@media (${web_styles_library_.token.media.queries.large.min})`]: {\n minHeight: '560px !important',\n },\n },\n [`.${web_styles_library_.element.asset.image.wrapperScaled.className}`]: {\n position: 'absolute',\n },\n },\n },\n },\n isGap: true,\n isColumnsTwo: count === 2,\n isColumnsThree: count === 3,\n isColumnsFour: count === 4,\n});\n\n;// CONCATENATED MODULE: ./source/elements/text.ts\nconst summary = ({ text }) => {\n if (text) {\n const textElement = document.createElement('div');\n const textNode = document.createElement('p');\n textNode.innerHTML = text;\n textElement.appendChild(textNode);\n return textElement;\n }\n return null;\n};\nconst headline = ({ text, url }) => {\n if (text && url) {\n const headline = document.createElement('p');\n const headlineLink = document.createElement('a');\n headlineLink.href = url;\n headlineLink.innerHTML = text;\n headlineLink.target = '_blank';\n headlineLink.rel = 'noopener noreferrer';\n headline.appendChild(headlineLink);\n return headline;\n }\n return null;\n};\nconst date = ({ date, dateFormatted, }) => {\n if (date && dateFormatted) {\n const dateElement = document.createElement('time');\n dateElement.innerHTML = dateFormatted;\n dateElement.setAttribute('datetime', date);\n return dateElement;\n }\n return null;\n};\n\n;// CONCATENATED MODULE: ./source/elements/index.ts\n\n\n\n\n;// CONCATENATED MODULE: ./source/composite/events/common/queries.ts\nconst EVENTS_COUNT_QUERY = `\nquery getEventsCount($startDate: String!, $related: [QueryArgument]) {\n count: solspace_calendar {\n events(relatedTo: $related, loadOccurrences: true, startsAfterOrAt: $startDate) {\n ... on communications_Event {\n id\n }\n ... on submission_Event {\n id\n }\n }\n }\n}\n`;\nconst EVENTS_QUERY = `\nquery getEvents($startDate: String!, $related: [QueryArgument], $limit: Int, $offset: Int) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: $limit\n offset: $offset\n ) {\n ... on communications_Event {\n id\n title\n url\n startDayOfWeek: startDate @formatDateTime(format: \"D\")\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n startStamp: startDate @formatDateTime(format: \"Y-m-d\")\n startTime: startDate @formatDateTime(format: \"g:ia\")\n endDayOfWeek: endDate @formatDateTime(format: \"D\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n endTime: endDate @formatDateTime(format: \"g:ia\")\n allDay\n desciption: commonRichText\n summary: commonRichTextTwo\n image: commonAssetHeroImageSingle {\n title\n commonPlainTextTwo: alt\n url\n }\n location: categoriesCampusBuildingSingle {\n title\n }\n link: commonEntriesLinkSingle {\n ... on links_links_Entry {\n type: linksDropdownSelector\n externalUrl: commonPlainTextThree\n altTitle: commonPlainTextTwo\n title\n internalLinks: calendarEntriesEvent {\n id\n url\n }\n }\n }\n }\n ... on submission_Event {\n id\n title\n url\n startDayOfWeek: startDate @formatDateTime(format: \"D\")\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n startStamp: startDate @formatDateTime(format: \"Y-m-d\")\n startTime: startDate @formatDateTime(format: \"g:ia\")\n endDayOfWeek: endDate @formatDateTime(format: \"D\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n endTime: endDate @formatDateTime(format: \"g:ia\")\n allDay\n desciption: commonRichText\n summary: commonRichTextTwo\n image: commonAssetHeroImageSingle {\n title\n commonPlainTextTwo: alt\n url\n }\n location: categoriesCampusBuildingSingle {\n title\n }\n link: commonEntriesLinkSingle {\n ... on links_links_Entry {\n type: linksDropdownSelector\n externalUrl: commonPlainTextThree\n altTitle: commonPlainTextTwo\n title\n internalLinks: calendarEntriesEvent {\n id\n url\n }\n }\n }\n }\n }\n }\n}\n`;\n\n;// CONCATENATED MODULE: ./source/composite/events/common/data.ts\n\n\n\nconst lazyLoadVariables = (props) => ({\n ...props,\n totalEntries: props.getTotalEntries(),\n offset: props.getOffset(),\n container: props.getContainer(),\n callback: () => load(props),\n});\nconst apiVariables = (props) => {\n const { categories, getOffset, token, numberOfRowsToStart, numberOfColumnsToShow = 1, } = props;\n const obj = {\n offset: getOffset(),\n token,\n limit: numberOfRowsToStart,\n };\n if (numberOfColumnsToShow) {\n obj.limit = numberOfColumnsToShow * numberOfRowsToStart;\n }\n if (categories) {\n obj.related = categories;\n }\n return obj;\n};\nconst data_display = ({ entry, isThemeDark, }) => ({\n headline: headline({\n text: entry.title,\n url: entry.url,\n }),\n text: summary({ text: entry.summary }),\n eventMeta: web_elements_library_.Atomic.events.meta({\n ...entry,\n isThemeDark,\n }),\n isThemeDark,\n});\n\n;// CONCATENATED MODULE: ./source/composite/events/common/fetch.ts\n\n\n\n\nconst ID_GRID_LAYOUT_CONTAINER = 'umd-grid-gap-layout-container';\nconst fetchFeed = async ({ limit, related, offset, token, query, }) => {\n if (!token)\n throw new Error('Token not found');\n const variables = {\n startDate: new Date().toDateString(),\n limit,\n related,\n offset,\n };\n return await web_elements_library_.Utilities.network.FetchGraphQL({\n query,\n url: 'https://calendar.umd.edu/graphql',\n token: token,\n variables,\n });\n};\nconst getCount = async ({ variables }) => {\n const feedData = await fetchFeed({\n ...variables,\n query: EVENTS_COUNT_QUERY,\n });\n if (!feedData || !feedData.data || feedData.message) {\n if (feedData.message)\n console.error(feedData.message);\n return null;\n }\n return feedData?.data?.count?.events?.length || 0;\n};\nconst getEntries = async ({ variables, }) => {\n const feedData = await fetchFeed({ ...variables, query: EVENTS_QUERY });\n const graceFail = ({ message }) => {\n throw new Error(message);\n };\n if (!feedData ||\n !feedData.data ||\n !feedData.data.entries ||\n feedData.message) {\n if (!feedData)\n graceFail({ message: 'Feed not found' });\n if (!feedData.data)\n graceFail({ message: 'Feed data not found' });\n if (!feedData.data.entries)\n graceFail({ message: 'Feed entries not found' });\n if (!feedData.data.entries.events)\n graceFail({ message: 'Feed events not found' });\n if (!feedData.message)\n graceFail({ message: `Feed data errors: ${feedData.message}` });\n }\n return feedData.data.entries.events;\n};\nconst load = async (props) => {\n const { getContainer, getOffset, displayResults, getTotalEntries } = props;\n const container = getContainer();\n const currentCount = getOffset();\n const totalEntries = getTotalEntries();\n lazy_load.remove({ container });\n macros_loader.display({ container });\n getEntries({\n variables: apiVariables(props),\n }).then((feedData) => {\n displayResults({ feedData });\n aria_live.update({\n container,\n message: `Showing ${currentCount + feedData.length} of ${totalEntries} articles`,\n });\n });\n};\nconst start = async (props) => {\n const { displayNoResults, displayResultStart, setTotalEntries } = props;\n await getCount({\n variables: apiVariables(props),\n }).then((count) => {\n if (count === 0) {\n displayNoResults({ ...props });\n return;\n }\n if (count) {\n setTotalEntries(count);\n }\n if (count === null) {\n displayNoResults({\n ...props,\n message: 'An error occurred while fetching the data.',\n });\n return;\n }\n });\n getEntries({\n variables: apiVariables(props),\n }).then((feedData) => displayResultStart({ ...props, feedData }));\n};\n\n;// CONCATENATED MODULE: ./source/utilities/events/index.ts\nconst eventNames = {\n FEED_LOADED: 'feed:loaded',\n FEED_ERROR: 'feed:error',\n};\nconst dispatch = (element, eventName, detail) => {\n const event = new CustomEvent(eventName, {\n detail,\n bubbles: true,\n cancelable: true,\n });\n return element.dispatchEvent(event);\n};\nconst listen = (element, eventName, callback, options) => {\n const eventListener = (event) => {\n const customEvent = event;\n callback(customEvent.detail);\n };\n element.addEventListener(eventName, eventListener, options);\n return () => {\n element.removeEventListener(eventName, eventListener, options);\n };\n};\n\n;// CONCATENATED MODULE: ./source/utilities/index.ts\n\n\n\n;// CONCATENATED MODULE: ./source/composite/events/common/display.ts\n\n\n\n\n\nconst display_ID_GRID_LAYOUT_CONTAINER = 'umd-grid-gap-layout-container';\nconst setShadowStyles = async ({ shadowRoot, styles, }) => {\n const styleElement = document.createElement('style');\n const optimizedCss = await web_styles_library_.utilities.transform.css.removeDuplicates(styles);\n styleElement.textContent = optimizedCss;\n shadowRoot.appendChild(styleElement);\n};\nconst noResults = ({ getContainer, getStyles, getShadowRoot, setStyles, isThemeDark, message = 'No events found', linkUrl = 'https://calendar.umd.edu', linkText = 'View all events', }) => {\n const container = getContainer();\n const shadowRoot = getShadowRoot();\n const noResultsContent = no_results({\n message,\n linkUrl,\n linkText,\n isThemeDark,\n });\n const ariaLiveContent = aria_live.create({\n message,\n });\n container.innerHTML = '';\n container.appendChild(noResultsContent.element);\n container.appendChild(ariaLiveContent);\n setStyles(noResultsContent.styles);\n dispatch(container, eventNames.FEED_ERROR, {\n error: 'No results found',\n message,\n });\n setTimeout(() => {\n const styles = getStyles();\n if (shadowRoot) {\n setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n }, 100);\n};\nconst resultLoad = async (props) => {\n const { entries, getContainer, setStyles, setOffset } = props;\n const container = getContainer();\n const grid = container.querySelector(`#${display_ID_GRID_LAYOUT_CONTAINER}`);\n macros_loader.remove({ container });\n lazy_load.remove({ container });\n setOffset(entries.length);\n return new Promise((resolve) => {\n entries.forEach((entry) => {\n grid.appendChild(entry.element);\n setStyles(entry.styles);\n });\n const lazyLoadButton = lazy_load.create(lazyLoadVariables({\n ...props,\n callback: load,\n }));\n if (lazyLoadButton) {\n container.appendChild(lazyLoadButton.element);\n setStyles(lazyLoadButton.styles);\n }\n resolve();\n });\n};\nconst resultStart = (props) => {\n const { feedData, numberOfColumnsToShow = 1, numberOfRowsToStart, isLazyLoad, displayResults, getContainer, getTotalEntries, setOffset, setStyles, layoutElement, } = props;\n const container = getContainer();\n const totalEntries = getTotalEntries();\n const showAmount = numberOfColumnsToShow || 1 * numberOfRowsToStart;\n const message = isLazyLoad\n ? `Showing ${showAmount} of ${totalEntries} articles`\n : `Showing ${showAmount} articles`;\n layoutElement.element.setAttribute('id', display_ID_GRID_LAYOUT_CONTAINER);\n container.appendChild(layoutElement.element);\n setStyles(layoutElement.styles);\n dispatch(container, eventNames.FEED_LOADED, {\n items: feedData,\n count: feedData.length,\n total: totalEntries || feedData.length,\n });\n displayResults({ feedData });\n container.appendChild(aria_live.create({\n message,\n }));\n};\n\n;// CONCATENATED MODULE: ./source/composite/events/grid.ts\n\n\n\n\n\n\n/* harmony default export */ const events_grid = ((props) => (() => {\n const { isThemeDark, isTransparent, numberOfColumnsToShow } = props;\n const loader = macros_loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const displayResults = async ({ feedData }) => {\n await resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) => web_elements_library_.Composite.card.block({\n ...data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n isTransparent,\n })),\n });\n if (shadowRoot) {\n setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n const layoutElement = gridGap({\n count: numberOfColumnsToShow,\n });\n container.appendChild(loader.element);\n start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: resultStart,\n displayNoResults: noResults,\n layoutElement,\n isThemeDark,\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/events/list.ts\n\n\n\n\n\n\n/* harmony default export */ const list = ((props) => (() => {\n const { isThemeDark } = props;\n const loader = macros_loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const displayResults = async ({ feedData }) => {\n await resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) => web_elements_library_.Composite.card.list({\n ...data_display({ entry, isThemeDark }),\n dateSign: web_elements_library_.Atomic.events.sign({\n ...entry,\n isThemeDark,\n isLargeSize: true,\n }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n })),\n });\n if (shadowRoot) {\n setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n container.appendChild(loader.element);\n start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: resultStart,\n displayNoResults: noResults,\n layoutElement: stacked(),\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/events/slider.ts\n\nconst slider_QUERY_DATA = `\n title\n url\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n`;\nconst slider_query = `\n query getEvents($startDate: String!, $related: [QueryArgument]) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: 12\n ) {\n ... on submission_Event {\n ${slider_QUERY_DATA}\n }\n }\n }\n }\n`;\n/* harmony default export */ const events_slider = ((props) => slider({\n ...props,\n query: slider_query,\n url: 'https://calendar.umd.edu/graphql',\n}));\n\n;// CONCATENATED MODULE: ./source/composite/events/grouped.ts\n\n\n\n\n\n\n\nconst getDateBanner = (dateStamp) => {\n const dateParts = dateStamp.split('T')[0].split('-');\n const year = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1;\n const day = parseInt(dateParts[2], 10);\n const eventDate = new Date(year, month, day);\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n const weekFromNow = new Date();\n weekFromNow.setDate(currentDate.getDate() + 7);\n weekFromNow.setHours(0, 0, 0, 0);\n if (eventDate.getFullYear() === currentDate.getFullYear() &&\n eventDate.getMonth() === currentDate.getMonth() &&\n eventDate.getDate() === currentDate.getDate()) {\n return 'Today';\n }\n if (eventDate.getTime() > currentDate.getTime() &&\n eventDate.getTime() <= weekFromNow.getTime()) {\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n return days[eventDate.getDay()];\n }\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n const months = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ];\n return `${days[eventDate.getDay()]}, ${months[eventDate.getMonth()]} ${eventDate.getDate()}`;\n};\nconst groupEventsByDate = (events) => {\n const grouped = events.reduce((acc, event) => {\n const dateKey = event.startStamp;\n if (!acc[dateKey]) {\n acc[dateKey] = {\n date: getDateBanner(event.startStamp),\n events: [],\n };\n }\n acc[dateKey].events.push(event);\n return acc;\n }, {});\n return Object.values(grouped).sort((a, b) => {\n const dateA = new Date(Object.keys(grouped).find((key) => grouped[key] === a) || '');\n const dateB = new Date(Object.keys(grouped).find((key) => grouped[key] === b) || '');\n return dateA.getTime() - dateB.getTime();\n });\n};\n/* harmony default export */ const grouped = ((props) => (() => {\n const { isThemeDark } = props;\n const loader = macros_loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const groupLayout = () => {\n return web_elements_library_.Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped',\n elementStyles: {\n element: {},\n },\n });\n };\n const displayResults = async ({ feedData }) => {\n const groupedEvents = groupEventsByDate(feedData);\n const entries = [];\n let actualEventCount = 0;\n groupedEvents.forEach((group) => {\n const dateHeadline = document.createElement('p');\n dateHeadline.textContent = group.date;\n entries.push(web_elements_library_.Model.ElementModel.text.ribbon({\n element: dateHeadline,\n elementStyles: {\n element: {\n margin: `${web_styles_library_.token.spacing.lg} 0`,\n },\n },\n }));\n const dateEntries = group.events.map((entry) => web_elements_library_.Composite.card.list({\n ...data_display({ entry, isThemeDark }),\n dateSign: web_elements_library_.Atomic.events.sign({\n ...entry,\n isThemeDark,\n isLargeSize: false,\n }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n }));\n actualEventCount += group.events.length;\n entries.push(web_elements_library_.Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped-entries',\n children: [...dateEntries],\n elementStyles: {\n element: {\n [` > *:not(:last-child)`]: {\n paddingBottom: web_styles_library_.token.spacing.lg,\n marginBottom: web_styles_library_.token.spacing.lg,\n },\n },\n },\n }));\n });\n const originalSetOffset = helperFunctions.setOffset;\n helperFunctions.setOffset = () => originalSetOffset(actualEventCount);\n await resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries,\n });\n helperFunctions.setOffset = originalSetOffset;\n if (shadowRoot) {\n setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n container.appendChild(loader.element);\n start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: resultStart,\n displayNoResults: noResults,\n layoutElement: groupLayout(),\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/events/index.ts\n\n\n\n\n\n;// CONCATENATED MODULE: ./source/composite/news/common/queries.ts\nconst ARTICLES_QUERY = `\n query getArticles($related: [QueryArgument], $relatedToAll: [QueryArgument], $limit: Int, $offset: Int, $not: [QueryArgument]) {\n entryCount(section: \"articles\", relatedTo: $related,relatedToAll: $relatedToAll)\n entries(\n section: \"articles\",\n relatedTo: $related,\n relatedToAll: $relatedToAll,\n limit: $limit,\n offset: $offset,\n id: $not\n ) {\n ... on articles_today_Entry {\n id\n title\n date: postDate\n dateFormatted: postDate @formatDateTime(format: \"M d, Y\")\n summary: genericText\n url\n image:articlesHeroImage {\n url\n ... on hero_Asset {\n id\n altText: genericText\n }\n }\n categories:categoryTodaySectionMultiple {\n title\n url\n }\n }\n }\n }\n`;\n\n;// CONCATENATED MODULE: ./source/composite/news/common/data.ts\n\n\nconst data_lazyLoadVariables = (props) => ({\n ...props,\n totalEntries: props.getTotalEntries(),\n offset: props.getOffset(),\n container: props.getContainer(),\n callback: () => fetch_load(props),\n});\nconst data_apiVariables = (props) => {\n const { isUnion, categories, getOffset, token, numberOfRowsToStart, numberOfColumnsToShow = 1, entriesToRemove, } = props;\n const obj = {\n offset: getOffset(),\n token,\n limit: numberOfRowsToStart,\n };\n if (numberOfColumnsToShow) {\n obj.limit = numberOfColumnsToShow * numberOfRowsToStart;\n }\n if (!isUnion && categories) {\n obj.relatedToAll = categories;\n }\n if (isUnion && categories) {\n obj.related = categories;\n }\n if (entriesToRemove) {\n obj.not = ['not', ...entriesToRemove];\n }\n return obj;\n};\nconst common_data_display = ({ entry, isThemeDark, }) => ({\n newsId: entry.id.toString(),\n headline: headline({\n text: entry.title,\n url: entry.url,\n }),\n text: summary({ text: entry.summary }),\n date: date({\n date: entry.date,\n dateFormatted: entry.dateFormatted,\n }),\n isThemeDark,\n});\n\n;// CONCATENATED MODULE: ./source/composite/news/common/fetch.ts\n\n\n\n\nconst fetch_ID_GRID_LAYOUT_CONTAINER = 'umd-grid-gap-layout-container';\nconst fetch_getEntries = async ({ limit, not, offset, related, relatedToAll, token, }) => {\n if (!token)\n throw new Error('Token not found');\n const graceFail = ({ message }) => {\n console.error(message);\n };\n const variables = {\n limit,\n related,\n relatedToAll,\n offset,\n not,\n };\n const feedData = await web_elements_library_.Utilities.network.FetchGraphQL({\n query: ARTICLES_QUERY,\n url: 'https://today.umd.edu/graphql',\n token: token,\n variables,\n });\n if (!feedData ||\n !feedData.data ||\n !feedData.data.entries ||\n feedData.message) {\n if (!feedData)\n graceFail({ message: 'Feed not found' });\n if (feedData?.message)\n graceFail({ message: `Feed data errors: ${feedData.message}` });\n return null;\n }\n return {\n entries: feedData.data.entries,\n count: feedData.data.entryCount,\n };\n};\nconst fetch_load = async (props) => {\n const { getContainer, getOffset, displayResults, getTotalEntries } = props;\n const container = getContainer();\n const currentCount = getOffset();\n const totalEntries = getTotalEntries();\n lazy_load.remove({ container });\n macros_loader.display({ container });\n fetch_getEntries(data_apiVariables(props)).then((feedData) => {\n if (feedData) {\n displayResults({ feedData: feedData.entries });\n aria_live.update({\n container,\n message: `Showing ${currentCount + feedData.entries.length} of ${totalEntries} articles`,\n });\n }\n });\n};\nconst fetch_start = async (props) => {\n const { displayNoResults, displayResultStart, setTotalEntries } = props;\n fetch_getEntries(data_apiVariables(props)).then((feedData) => {\n if (!feedData || !feedData.entries) {\n displayNoResults({\n ...props,\n message: 'An error occurred while fetching the data.',\n });\n return;\n }\n const totalEntries = feedData.count;\n if (totalEntries === 0) {\n displayNoResults({ ...props });\n return;\n }\n setTotalEntries(totalEntries);\n return displayResultStart({ ...props, feedData: feedData.entries });\n });\n};\n\n;// CONCATENATED MODULE: ./source/composite/news/common/display.ts\n\n\n\n\n\nconst common_display_ID_GRID_LAYOUT_CONTAINER = 'umd-grid-gap-layout-container';\nconst display_setShadowStyles = async ({ shadowRoot, styles, }) => {\n const styleElement = document.createElement('style');\n const optimizedCss = await web_styles_library_.utilities.transform.css.removeDuplicates(styles);\n styleElement.textContent = optimizedCss;\n shadowRoot.appendChild(styleElement);\n};\nconst display_noResults = ({ getContainer, getStyles, getShadowRoot, setStyles, message = 'No results found', linkUrl = 'https://today.umd.edu', linkText = 'View all articles', isThemeDark, }) => {\n const container = getContainer();\n const shadowRoot = getShadowRoot();\n const noResultsContent = no_results({\n message,\n linkUrl,\n linkText,\n isThemeDark,\n });\n const ariaLiveContent = aria_live.create({\n message,\n });\n container.innerHTML = '';\n container.appendChild(noResultsContent.element);\n container.appendChild(ariaLiveContent);\n setStyles(noResultsContent.styles);\n dispatch(container, eventNames.FEED_ERROR, {\n error: 'No results found',\n message,\n });\n setTimeout(() => {\n const styles = getStyles();\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n }, 100);\n};\nconst display_resultLoad = async (props) => {\n const { entries, getContainer, setStyles, setOffset } = props;\n const container = getContainer();\n const grid = container.querySelector(`#${common_display_ID_GRID_LAYOUT_CONTAINER}`);\n macros_loader.remove({ container });\n lazy_load.remove({ container });\n setOffset(entries.length);\n return new Promise((resolve) => {\n entries.forEach((entry) => {\n grid.appendChild(entry.element);\n setStyles(entry.styles);\n });\n const lazyLoadButton = lazy_load.create(data_lazyLoadVariables({\n ...props,\n callback: fetch_load,\n }));\n if (lazyLoadButton) {\n container.appendChild(lazyLoadButton.element);\n setStyles(lazyLoadButton.styles);\n }\n resolve();\n });\n};\nconst display_resultStart = (props) => {\n const { feedData, numberOfColumnsToShow = 1, numberOfRowsToStart, isLazyLoad, displayResults, getContainer, getTotalEntries, setTotalEntries, setStyles, layoutElement, } = props;\n const container = getContainer();\n const totalEntries = getTotalEntries();\n const showAmount = numberOfColumnsToShow || 1 * numberOfRowsToStart;\n const message = isLazyLoad\n ? `Showing ${showAmount} of ${totalEntries} articles`\n : `Showing ${showAmount} articles`;\n if (totalEntries)\n setTotalEntries(totalEntries);\n layoutElement.element.setAttribute('id', common_display_ID_GRID_LAYOUT_CONTAINER);\n container.appendChild(layoutElement.element);\n setStyles(layoutElement.styles);\n dispatch(container, eventNames.FEED_LOADED, {\n items: feedData,\n count: feedData.length,\n total: totalEntries || feedData.length,\n });\n displayResults({ feedData });\n container.appendChild(aria_live.create({\n message,\n }));\n};\n\n;// CONCATENATED MODULE: ./source/composite/news/featured.ts\n\n\n\n\n\n\n/* harmony default export */ const featured = ((props) => (() => {\n const { isThemeDark, isLazyLoad, isLayoutReversed, isTransparent, overwriteStickyPosition, } = props;\n const loader = macros_loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let numberOfColumnsToShow = 3;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const setPosition = (position) => {\n const overlayElement = container.querySelector(`.${web_elements_library_.Composite.card.overlay.imageClassRef}`);\n if (overlayElement)\n overlayElement.style.top = `${position}px`;\n };\n const layoutElement = gridGap({ count: 2 });\n const displayGridOffsetResults = async ({ feedData }) => {\n let entries = [];\n if (feedData.length >= 2) {\n const offsetLayout = gridOffsetGap({\n count: 2,\n isLayoutReversed,\n overwriteStickyPosition,\n });\n const firstEntry = feedData[0];\n const overlayCard = web_elements_library_.Composite.card.overlay.image({\n ...common_data_display({ entry: firstEntry }),\n backgroundImage: standard({\n images: firstEntry.image,\n url: firstEntry.url,\n }),\n });\n offsetLayout.element.appendChild(overlayCard.element);\n offsetLayout.element.appendChild(layoutElement.element);\n container.appendChild(offsetLayout.element);\n setStyles(offsetLayout.styles);\n setStyles(overlayCard.styles);\n entries = feedData.slice(1, 3).map((entry) => web_elements_library_.Composite.card.block({\n ...common_data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: true,\n isTransparent,\n }));\n }\n else {\n entries = feedData.map((entry) => web_elements_library_.Composite.card.overlay.image({\n ...common_data_display({ entry, isThemeDark }),\n backgroundImage: standard({\n images: entry.image,\n url: entry.url,\n }),\n }));\n container.appendChild(layoutElement.element);\n }\n await display_resultLoad({\n ...props,\n ...helperFunctions,\n numberOfColumnsToShow: 2,\n displayResults,\n entries,\n });\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n const displayResults = async ({ feedData }) => {\n const entries = feedData.map((entry) => web_elements_library_.Composite.card.block({\n ...common_data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: true,\n isTransparent,\n }));\n await display_resultLoad({\n ...props,\n ...helperFunctions,\n numberOfColumnsToShow: 2,\n displayResults,\n entries,\n });\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n const resultStart = (props) => {\n const { feedData, setOffset, getOffset } = props;\n const totalEntries = getTotalEntries();\n const showAmount = 3;\n const message = isLazyLoad\n ? `Showing ${showAmount} of ${totalEntries} articles`\n : `Showing ${showAmount} articles`;\n setOffset(getOffset() + 1);\n if (totalEntries)\n setTotalEntries(totalEntries);\n layoutElement.element.setAttribute('id', common_display_ID_GRID_LAYOUT_CONTAINER);\n setStyles(layoutElement.styles);\n displayGridOffsetResults({ feedData });\n container.appendChild(aria_live.create({\n message,\n }));\n };\n container.appendChild(loader.element);\n fetch_start({\n ...props,\n ...helperFunctions,\n numberOfColumnsToShow,\n displayResults,\n displayResultStart: resultStart,\n displayNoResults: display_noResults,\n layoutElement,\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n setPosition,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/news/grid.ts\n\n\n\n\n\n\n/* harmony default export */ const news_grid = ((props) => (() => {\n const { isThemeDark, isTransparent, numberOfColumnsToShow, isTypeOverlay } = props;\n const loader = macros_loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const displayResults = async ({ feedData }) => {\n const entries = feedData.map((entry) => {\n if (isTypeOverlay) {\n return web_elements_library_.Composite.card.overlay.image({\n ...common_data_display({ entry }),\n backgroundImage: standard({\n images: entry.image,\n url: entry.url,\n }),\n });\n }\n return web_elements_library_.Composite.card.block({\n ...common_data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: true,\n isTransparent,\n });\n });\n await display_resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries,\n });\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n const layoutElement = isTypeOverlay\n ? grid({ count: numberOfColumnsToShow })\n : gridGap({ count: numberOfColumnsToShow });\n container.appendChild(loader.element);\n fetch_start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: display_resultStart,\n displayNoResults: display_noResults,\n layoutElement,\n isThemeDark,\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/news/list.ts\n\n\n\n\n\n\n/* harmony default export */ const news_list = ((props) => (() => {\n const { isThemeDark } = props;\n const loader = macros_loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count) => (totalEntries = count);\n const setOffset = (count) => (offset = offset + count);\n const setStyles = (additonalStyles) => (styles += additonalStyles);\n const getContainer = () => container;\n const getTotalEntries = () => totalEntries;\n const getOffset = () => offset;\n const getStyles = () => styles;\n const getShadowRoot = () => shadowRoot;\n let totalEntries = 0;\n let offset = 0;\n let styles = `\n ${loader.styles}\n `;\n let shadowRoot = null;\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n const callback = (shadow) => {\n shadowRoot = shadow;\n };\n const displayResults = async ({ feedData }) => {\n await display_resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) => web_elements_library_.Composite.card.list({\n ...common_data_display({ entry, isThemeDark }),\n image: standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n })),\n });\n if (shadowRoot) {\n display_setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n container.appendChild(loader.element);\n fetch_start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: display_resultStart,\n displayNoResults: display_noResults,\n layoutElement: stacked(),\n });\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n})());\n\n;// CONCATENATED MODULE: ./source/composite/news/index.ts\n\n\n\n\n;// CONCATENATED MODULE: ./source/index.ts\n\n\n\n\n\n//# sourceURL=webpack://@universityofmaryland/web-feeds-library/./source/index.ts_+_31_modules?")},149:e=>{e.exports=__WEBPACK_EXTERNAL_MODULE__149__},708:e=>{e.exports=__WEBPACK_EXTERNAL_MODULE__708__}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(314);return __webpack_exports__})()));
@@ -94,6 +94,10 @@
94
94
  !*** ./source/composite/academic/index.ts ***!
95
95
  \********************************************/
96
96
 
97
+ /*!********************************************!*\
98
+ !*** ./source/composite/events/grouped.ts ***!
99
+ \********************************************/
100
+
97
101
  /*!*********************************************!*\
98
102
  !*** ./source/composite/academic/slider.ts ***!
99
103
  \*********************************************/
@@ -1,6 +1,6 @@
1
1
  export { default as ariaLive } from './aria-live';
2
2
  export { default as buttonLazyLoad } from './lazy-load';
3
- export { default as loader, styles as loaderStyles } from './loader';
3
+ export { default as loader } from './loader';
4
4
  export { default as noResults } from './no-results';
5
5
  export { default as slider } from './slider';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/macros/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/macros/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC"}
@@ -1,8 +1,14 @@
1
- export declare const styles = "\n @keyframes loader-first-animation {\n 0% {\n transform: scale(0);\n }\n 100% {\n transform: scale(1);\n }\n }\n \n @keyframes loader-last-animation {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0);\n }\n }\n \n @keyframes loader-middle-animation {\n 0% {\n transform: translate(0, 0);\n }\n 100% {\n transform: translate(24px, 0);\n }\n }\n\n .umd-loader-container {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 10px 0;\n min-height: 40px;\n position: relative;\n grid-column: 1 / -1;\n }\n\n .umd-loader-container > div {\n position: relative;\n }\n\n .umd-loader-container > div > div {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--grayDark);\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\n }\n\n .umd-loader-container > div > div:first-child {\n left: 5px;\n animation: loader-first-animation 0.6s infinite;\n }\n\n .umd-loader-container > div > div:nth-child(2) {\n left: 5px;\n animation: loader-middle-animation 0.6s infinite;\n }\n\n .umd-loader-container > div > div:nth-child(3) {\n left: 24px;\n animation: loader-middle-animation 0.6s infinite;\n }\n\n .umd-loader-container > div > div:last-child {\n left: 45px;\n animation: loader-last-animation 0.6s infinite;\n }\n";
2
1
  declare const _default: {
3
- create: () => HTMLDivElement;
4
- display: ({ container }: {
2
+ create: ({ isThemeDark }: {
3
+ isThemeDark?: boolean;
4
+ }) => {
5
+ element: HTMLElement;
6
+ className: string;
7
+ styles: string;
8
+ };
9
+ display: ({ container, isThemeDark, }: {
5
10
  container: HTMLElement;
11
+ isThemeDark?: boolean;
6
12
  }) => void;
7
13
  remove: ({ container }: {
8
14
  container: HTMLElement;
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../source/macros/loader.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,29CAwElB,CAAC;;;6BA4B8B;QAAE,SAAS,EAAE,WAAW,CAAA;KAAE;4BAN3B;QAAE,SAAS,EAAE,WAAW,CAAA;KAAE;;AAYzD,wBAIE"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../source/macros/loader.ts"],"names":[],"mappings":";8BAkCiC;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;;;;;2CAmGvD;QACD,SAAS,EAAE,WAAW,CAAC;QACvB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB;4BAZ8B;QAAE,SAAS,EAAE,WAAW,CAAA;KAAE;;AAkBzD,wBAIE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@universityofmaryland/web-feeds-library",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "UMD Feed Elements",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -24,12 +24,6 @@
24
24
  "test:snapshot": "jest --updateSnapshot"
25
25
  },
26
26
  "dependencies": {
27
- "@types/postcss-js": "^4.0.4",
28
- "postcss-js": "^4.0.1",
29
- "tw-to-css": "^0.0.12"
30
- },
31
- "peerDependencies": {
32
- "@universityofmaryland/web-elements-library": "*",
33
- "@universityofmaryland/web-styles-library": "^1.1.0"
27
+ "@types/postcss-js": "^4.0.4"
34
28
  }
35
29
  }