@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 +188 -124
- package/dist/composite/events/__tests__/grouped.test.d.ts +2 -0
- package/dist/composite/events/__tests__/grouped.test.d.ts.map +1 -0
- package/dist/composite/events/common/data.d.ts +1 -0
- package/dist/composite/events/common/data.d.ts.map +1 -1
- package/dist/composite/events/common/fetch.d.ts.map +1 -1
- package/dist/composite/events/grouped.d.ts +5 -0
- package/dist/composite/events/grouped.d.ts.map +1 -0
- package/dist/composite/events/index.d.ts +1 -0
- package/dist/composite/events/index.d.ts.map +1 -1
- package/dist/composite/news/featured.d.ts.map +1 -1
- package/dist/elements/layout.d.ts +1 -0
- package/dist/elements/layout.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.LICENSE.txt +4 -0
- package/dist/macros/index.d.ts +1 -1
- package/dist/macros/index.d.ts.map +1 -1
- package/dist/macros/loader.d.ts +9 -3
- package/dist/macros/loader.d.ts.map +1 -1
- package/package.json +2 -8
package/README.md
CHANGED
|
@@ -1,217 +1,281 @@
|
|
|
1
1
|
# University of Maryland Feeds Library
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@universityofmaryland/web-feeds-library)
|
|
4
4
|
|
|
5
|
-
|
|
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
|
|
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
|
-
|
|
16
|
+
|
|
17
|
+
# Using yarn
|
|
16
18
|
yarn add @universityofmaryland/web-feeds-library
|
|
17
19
|
```
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
### Peer Dependencies
|
|
20
22
|
|
|
21
|
-
|
|
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
|
-
|
|
25
|
+
```bash
|
|
26
|
+
npm install @universityofmaryland/web-styles-library
|
|
27
|
+
npm install @universityofmaryland/web-elements-library
|
|
28
|
+
```
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
## Quick Start
|
|
30
31
|
|
|
31
|
-
```
|
|
32
|
-
import
|
|
32
|
+
```javascript
|
|
33
|
+
import { news, events } from '@universityofmaryland/web-feeds-library';
|
|
33
34
|
|
|
34
|
-
// Create a news grid
|
|
35
|
-
const newsGrid =
|
|
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
|
|
42
|
+
// Add to your page
|
|
42
43
|
document.querySelector('.news-container').appendChild(newsGrid.element);
|
|
43
44
|
```
|
|
44
45
|
|
|
45
|
-
##
|
|
46
|
+
## Feed Types
|
|
46
47
|
|
|
47
48
|
### News Feeds
|
|
48
49
|
|
|
49
|
-
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
//
|
|
57
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
70
|
-
|
|
80
|
+
```javascript
|
|
81
|
+
import { events } from '@universityofmaryland/web-feeds-library';
|
|
71
82
|
|
|
72
|
-
//
|
|
73
|
-
const
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
##
|
|
115
|
+
## Integration with Other Packages
|
|
84
116
|
|
|
85
|
-
|
|
117
|
+
### Styles Package Integration
|
|
86
118
|
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
128
|
+
### Elements Package Usage
|
|
94
129
|
|
|
95
|
-
|
|
130
|
+
Feeds are built using Elements for rendering:
|
|
96
131
|
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
132
|
+
- Card elements for item display
|
|
133
|
+
- Grid layouts from layout elements
|
|
134
|
+
- Typography from text elements
|
|
100
135
|
|
|
101
|
-
###
|
|
136
|
+
### Components Package Compatibility
|
|
102
137
|
|
|
103
|
-
|
|
138
|
+
Feeds can be wrapped in web components:
|
|
104
139
|
|
|
105
|
-
```
|
|
106
|
-
import
|
|
140
|
+
```javascript
|
|
141
|
+
import { Components } from '@universityofmaryland/web-components-library';
|
|
142
|
+
import { news } from '@universityofmaryland/web-feeds-library';
|
|
107
143
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
149
|
+
## Configuration Options
|
|
150
|
+
|
|
151
|
+
### Common Properties
|
|
124
152
|
|
|
125
|
-
All
|
|
153
|
+
All feeds accept these base properties:
|
|
126
154
|
|
|
127
155
|
```typescript
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
132
|
-
const container = document.querySelector('.events-container');
|
|
133
|
-
container.appendChild(eventsFeed.element);
|
|
163
|
+
### Layout-Specific Options
|
|
134
164
|
|
|
135
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
167
|
+
```typescript
|
|
168
|
+
interface GridProps extends BaseFeedProps {
|
|
169
|
+
numberOfColumnsToShow?: number; // 1-4, default: 3
|
|
170
|
+
}
|
|
171
|
+
```
|
|
143
172
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
//
|
|
159
|
-
|
|
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
|
|
208
|
+
## Performance Features
|
|
163
209
|
|
|
164
|
-
|
|
210
|
+
### Lazy Loading
|
|
165
211
|
|
|
166
|
-
|
|
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
|
-
|
|
214
|
+
```javascript
|
|
215
|
+
const lazyFeed = news.featured({
|
|
216
|
+
token: 'your-api-token',
|
|
217
|
+
isLazyLoad: true,
|
|
218
|
+
});
|
|
219
|
+
```
|
|
172
220
|
|
|
173
|
-
|
|
221
|
+
## TypeScript Support
|
|
174
222
|
|
|
175
|
-
|
|
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
|
-
|
|
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
|
-
|
|
240
|
+
## Browser Support
|
|
184
241
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
242
|
+
- Chrome 90+
|
|
243
|
+
- Firefox 88+
|
|
244
|
+
- Safari 14+
|
|
245
|
+
- Edge 90+
|
|
188
246
|
|
|
189
|
-
|
|
190
|
-
npm run test:watch
|
|
247
|
+
## Accessibility
|
|
191
248
|
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
##
|
|
257
|
+
## Documentation
|
|
197
258
|
|
|
198
|
-
|
|
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
|
-
|
|
202
|
-
|
|
265
|
+
# Run tests
|
|
266
|
+
npm test
|
|
203
267
|
|
|
204
|
-
|
|
268
|
+
# Watch mode
|
|
269
|
+
npm run test:watch
|
|
205
270
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
4. Publish the package
|
|
271
|
+
# Coverage report
|
|
272
|
+
npm run test:coverage
|
|
273
|
+
```
|
|
210
274
|
|
|
211
275
|
## Contributing
|
|
212
276
|
|
|
213
|
-
|
|
277
|
+
See the [main repository](https://github.com/umd-digital/design-system) for contribution guidelines.
|
|
214
278
|
|
|
215
279
|
## License
|
|
216
280
|
|
|
217
|
-
|
|
281
|
+
University of Maryland
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grouped.test.d.ts","sourceRoot":"","sources":["../../../../source/composite/events/__tests__/grouped.test.ts"],"names":[],"mappings":""}
|
|
@@ -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
|
|
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;
|
|
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 @@
|
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/composite/events/index.ts"],"names":[],"mappings":"
|
|
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":"
|
|
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"}
|
|
@@ -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,
|
|
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
|
\*********************************************/
|
package/dist/macros/index.d.ts
CHANGED
|
@@ -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
|
|
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,
|
|
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"}
|
package/dist/macros/loader.d.ts
CHANGED
|
@@ -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: (
|
|
4
|
-
|
|
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":"
|
|
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.
|
|
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
|
}
|