@universityofmaryland/web-feeds-library 1.0.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +1 -1
  2. package/dist/academic.d.ts +2 -0
  3. package/dist/academic.js +5 -0
  4. package/dist/academic.js.map +1 -0
  5. package/dist/academic.mjs +5 -0
  6. package/dist/academic.mjs.map +1 -0
  7. package/dist/composite/academic/slider.d.ts +2 -2
  8. package/dist/composite/academic/slider.d.ts.map +1 -1
  9. package/dist/composite/academic/slider.js +34 -0
  10. package/dist/composite/academic/slider.js.map +1 -0
  11. package/dist/composite/academic/slider.mjs +35 -0
  12. package/dist/composite/academic/slider.mjs.map +1 -0
  13. package/dist/composite/events/common/data.d.ts +1 -1
  14. package/dist/composite/events/common/data.d.ts.map +1 -1
  15. package/dist/composite/events/common/data.js +53 -0
  16. package/dist/composite/events/common/data.js.map +1 -0
  17. package/dist/composite/events/common/data.mjs +53 -0
  18. package/dist/composite/events/common/data.mjs.map +1 -0
  19. package/dist/composite/events/common/display.d.ts.map +1 -1
  20. package/dist/composite/events/common/display.js +144 -0
  21. package/dist/composite/events/common/display.js.map +1 -0
  22. package/dist/composite/events/common/display.mjs +127 -0
  23. package/dist/composite/events/common/display.mjs.map +1 -0
  24. package/dist/composite/events/common/fetch.d.ts.map +1 -1
  25. package/dist/composite/events/common/fetch.js +105 -0
  26. package/dist/composite/events/common/fetch.js.map +1 -0
  27. package/dist/composite/events/common/fetch.mjs +105 -0
  28. package/dist/composite/events/common/fetch.mjs.map +1 -0
  29. package/dist/composite/events/common/queries.js +107 -0
  30. package/dist/composite/events/common/queries.js.map +1 -0
  31. package/dist/composite/events/common/queries.mjs +107 -0
  32. package/dist/composite/events/common/queries.mjs.map +1 -0
  33. package/dist/composite/events/grid.d.ts +2 -2
  34. package/dist/composite/events/grid.d.ts.map +1 -1
  35. package/dist/composite/events/grid.js +88 -0
  36. package/dist/composite/events/grid.js.map +1 -0
  37. package/dist/composite/events/grid.mjs +89 -0
  38. package/dist/composite/events/grid.mjs.map +1 -0
  39. package/dist/composite/events/grouped.d.ts +2 -2
  40. package/dist/composite/events/grouped.d.ts.map +1 -1
  41. package/dist/composite/events/grouped.js +221 -0
  42. package/dist/composite/events/grouped.js.map +1 -0
  43. package/dist/composite/events/grouped.mjs +205 -0
  44. package/dist/composite/events/grouped.mjs.map +1 -0
  45. package/dist/composite/events/list.d.ts +2 -2
  46. package/dist/composite/events/list.d.ts.map +1 -1
  47. package/dist/composite/events/list.js +88 -0
  48. package/dist/composite/events/list.js.map +1 -0
  49. package/dist/composite/events/list.mjs +89 -0
  50. package/dist/composite/events/list.mjs.map +1 -0
  51. package/dist/composite/events/slider.d.ts +2 -2
  52. package/dist/composite/events/slider.d.ts.map +1 -1
  53. package/dist/composite/events/slider.js +35 -0
  54. package/dist/composite/events/slider.js.map +1 -0
  55. package/dist/composite/events/slider.mjs +36 -0
  56. package/dist/composite/events/slider.mjs.map +1 -0
  57. package/dist/composite/news/common/data.d.ts +1 -1
  58. package/dist/composite/news/common/data.d.ts.map +1 -1
  59. package/dist/composite/news/common/data.js +62 -0
  60. package/dist/composite/news/common/data.js.map +1 -0
  61. package/dist/composite/news/common/data.mjs +62 -0
  62. package/dist/composite/news/common/data.mjs.map +1 -0
  63. package/dist/composite/news/common/display.d.ts.map +1 -1
  64. package/dist/composite/news/common/display.js +145 -0
  65. package/dist/composite/news/common/display.js.map +1 -0
  66. package/dist/composite/news/common/display.mjs +128 -0
  67. package/dist/composite/news/common/display.mjs.map +1 -0
  68. package/dist/composite/news/common/fetch.d.ts.map +1 -1
  69. package/dist/composite/news/common/fetch.js +85 -0
  70. package/dist/composite/news/common/fetch.js.map +1 -0
  71. package/dist/composite/news/common/fetch.mjs +85 -0
  72. package/dist/composite/news/common/fetch.mjs.map +1 -0
  73. package/dist/composite/news/common/queries.js +37 -0
  74. package/dist/composite/news/common/queries.js.map +1 -0
  75. package/dist/composite/news/common/queries.mjs +37 -0
  76. package/dist/composite/news/common/queries.mjs.map +1 -0
  77. package/dist/composite/news/featured.d.ts +2 -2
  78. package/dist/composite/news/featured.d.ts.map +1 -1
  79. package/dist/composite/news/featured.js +180 -0
  80. package/dist/composite/news/featured.js.map +1 -0
  81. package/dist/composite/news/featured.mjs +181 -0
  82. package/dist/composite/news/featured.mjs.map +1 -0
  83. package/dist/composite/news/grid.d.ts +2 -2
  84. package/dist/composite/news/grid.d.ts.map +1 -1
  85. package/dist/composite/news/grid.js +96 -0
  86. package/dist/composite/news/grid.js.map +1 -0
  87. package/dist/composite/news/grid.mjs +97 -0
  88. package/dist/composite/news/grid.mjs.map +1 -0
  89. package/dist/composite/news/list.d.ts +2 -2
  90. package/dist/composite/news/list.d.ts.map +1 -1
  91. package/dist/composite/news/list.js +83 -0
  92. package/dist/composite/news/list.js.map +1 -0
  93. package/dist/composite/news/list.mjs +84 -0
  94. package/dist/composite/news/list.mjs.map +1 -0
  95. package/dist/elements/asset.d.ts +1 -1
  96. package/dist/elements/asset.d.ts.map +1 -1
  97. package/dist/elements/asset.js +27 -0
  98. package/dist/elements/asset.js.map +1 -0
  99. package/dist/elements/asset.mjs +27 -0
  100. package/dist/elements/asset.mjs.map +1 -0
  101. package/dist/elements/layout.d.ts +1 -1
  102. package/dist/elements/layout.d.ts.map +1 -1
  103. package/dist/elements/layout.js +121 -0
  104. package/dist/elements/layout.js.map +1 -0
  105. package/dist/elements/layout.mjs +104 -0
  106. package/dist/elements/layout.mjs.map +1 -0
  107. package/dist/elements/text.d.ts.map +1 -1
  108. package/dist/elements/text.js +41 -0
  109. package/dist/elements/text.js.map +1 -0
  110. package/dist/elements/text.mjs +41 -0
  111. package/dist/elements/text.mjs.map +1 -0
  112. package/dist/events.d.ts +2 -0
  113. package/dist/events.js +11 -0
  114. package/dist/events.js.map +1 -0
  115. package/dist/events.mjs +11 -0
  116. package/dist/events.mjs.map +1 -0
  117. package/dist/index.js +9 -1
  118. package/dist/index.js.map +1 -0
  119. package/dist/index.mjs +9 -0
  120. package/dist/index.mjs.map +1 -0
  121. package/dist/macros/aria-live.js +25 -0
  122. package/dist/macros/aria-live.js.map +1 -0
  123. package/dist/macros/aria-live.mjs +26 -0
  124. package/dist/macros/aria-live.mjs.map +1 -0
  125. package/dist/macros/lazy-load.js +63 -0
  126. package/dist/macros/lazy-load.js.map +1 -0
  127. package/dist/macros/lazy-load.mjs +47 -0
  128. package/dist/macros/lazy-load.mjs.map +1 -0
  129. package/dist/macros/loader.js +148 -0
  130. package/dist/macros/loader.js.map +1 -0
  131. package/dist/macros/loader.mjs +132 -0
  132. package/dist/macros/loader.mjs.map +1 -0
  133. package/dist/macros/no-results.d.ts.map +1 -1
  134. package/dist/macros/no-results.js +71 -0
  135. package/dist/macros/no-results.js.map +1 -0
  136. package/dist/macros/no-results.mjs +55 -0
  137. package/dist/macros/no-results.mjs.map +1 -0
  138. package/dist/macros/slider.d.ts.map +1 -1
  139. package/dist/macros/slider.js +104 -0
  140. package/dist/macros/slider.js.map +1 -0
  141. package/dist/macros/slider.mjs +88 -0
  142. package/dist/macros/slider.mjs.map +1 -0
  143. package/dist/news.d.ts +2 -0
  144. package/dist/news.js +9 -0
  145. package/dist/news.js.map +1 -0
  146. package/dist/news.mjs +9 -0
  147. package/dist/news.mjs.map +1 -0
  148. package/dist/utilities/events/index.d.ts.map +1 -1
  149. package/dist/utilities/events/index.js +19 -0
  150. package/dist/utilities/events/index.js.map +1 -0
  151. package/dist/utilities/events/index.mjs +19 -0
  152. package/dist/utilities/events/index.mjs.map +1 -0
  153. package/dist/utilities/network/fetch.d.ts.map +1 -1
  154. package/package.json +31 -5
  155. package/dist/composite/academic/__tests__/index.test.d.ts +0 -2
  156. package/dist/composite/academic/__tests__/index.test.d.ts.map +0 -1
  157. package/dist/composite/academic/__tests__/slider.test.d.ts +0 -2
  158. package/dist/composite/academic/__tests__/slider.test.d.ts.map +0 -1
  159. package/dist/composite/events/__tests__/fetch.test.d.ts +0 -2
  160. package/dist/composite/events/__tests__/fetch.test.d.ts.map +0 -1
  161. package/dist/composite/events/__tests__/grid.test.d.ts +0 -2
  162. package/dist/composite/events/__tests__/grid.test.d.ts.map +0 -1
  163. package/dist/composite/events/__tests__/grouped.test.d.ts +0 -2
  164. package/dist/composite/events/__tests__/grouped.test.d.ts.map +0 -1
  165. package/dist/composite/events/__tests__/list.test.d.ts +0 -2
  166. package/dist/composite/events/__tests__/list.test.d.ts.map +0 -1
  167. package/dist/composite/events/__tests__/slider.test.d.ts +0 -2
  168. package/dist/composite/events/__tests__/slider.test.d.ts.map +0 -1
  169. package/dist/composite/news/__tests__/featured.test.d.ts +0 -2
  170. package/dist/composite/news/__tests__/featured.test.d.ts.map +0 -1
  171. package/dist/composite/news/__tests__/grid.test.d.ts +0 -2
  172. package/dist/composite/news/__tests__/grid.test.d.ts.map +0 -1
  173. package/dist/composite/news/__tests__/list.test.d.ts +0 -2
  174. package/dist/composite/news/__tests__/list.test.d.ts.map +0 -1
  175. package/dist/elements/__tests__/asset.test.d.ts +0 -2
  176. package/dist/elements/__tests__/asset.test.d.ts.map +0 -1
  177. package/dist/elements/__tests__/layout.test.d.ts +0 -2
  178. package/dist/elements/__tests__/layout.test.d.ts.map +0 -1
  179. package/dist/elements/__tests__/text.test.d.ts +0 -2
  180. package/dist/elements/__tests__/text.test.d.ts.map +0 -1
  181. package/dist/index.js.LICENSE.txt +0 -143
  182. package/dist/macros/__tests__/aria-live.test.d.ts +0 -2
  183. package/dist/macros/__tests__/aria-live.test.d.ts.map +0 -1
  184. package/dist/macros/__tests__/lazy-load.test.d.ts +0 -2
  185. package/dist/macros/__tests__/lazy-load.test.d.ts.map +0 -1
  186. package/dist/macros/__tests__/loader.test.d.ts +0 -2
  187. package/dist/macros/__tests__/loader.test.d.ts.map +0 -1
  188. package/dist/macros/__tests__/no-results.test.d.ts +0 -2
  189. package/dist/macros/__tests__/no-results.test.d.ts.map +0 -1
  190. package/dist/macros/__tests__/slider.test.d.ts +0 -2
  191. package/dist/macros/__tests__/slider.test.d.ts.map +0 -1
  192. package/dist/utilities/events/__tests__/events.test.d.ts +0 -2
  193. package/dist/utilities/events/__tests__/events.test.d.ts.map +0 -1
  194. package/dist/utilities/network/__tests__/fetch.test.d.ts +0 -2
  195. package/dist/utilities/network/__tests__/fetch.test.d.ts.map +0 -1
@@ -0,0 +1,89 @@
1
+ import { Composite } from "@universityofmaryland/web-elements-library";
2
+ import { standard } from "../../elements/asset.mjs";
3
+ import { gridGap } from "../../elements/layout.mjs";
4
+ import "@universityofmaryland/web-styles-library";
5
+ import loader from "../../macros/loader.mjs";
6
+ import "../../macros/slider.mjs";
7
+ import { start } from "./common/fetch.mjs";
8
+ import { noResults, resultStart, resultLoad, setShadowStyles } from "./common/display.mjs";
9
+ import { display } from "./common/data.mjs";
10
+ const grid = (props) => (() => {
11
+ const { isThemeDark, isTransparent, numberOfColumnsToShow } = props;
12
+ const loader$1 = loader.create({ isThemeDark });
13
+ const container = document.createElement("div");
14
+ const setTotalEntries = (count) => totalEntries = count;
15
+ const setOffset = (count) => offset = offset + count;
16
+ const setStyles = (additonalStyles) => styles += additonalStyles;
17
+ const getContainer = () => container;
18
+ const getTotalEntries = () => totalEntries;
19
+ const getOffset = () => offset;
20
+ const getStyles = () => styles;
21
+ const getShadowRoot = () => shadowRoot;
22
+ let totalEntries = 0;
23
+ let offset = 0;
24
+ let styles = `
25
+ ${loader$1.styles}
26
+ `;
27
+ let shadowRoot = null;
28
+ const helperFunctions = {
29
+ setTotalEntries,
30
+ setOffset,
31
+ setStyles,
32
+ getContainer,
33
+ getOffset,
34
+ getTotalEntries,
35
+ getStyles,
36
+ getShadowRoot
37
+ };
38
+ const callback = (shadow) => {
39
+ shadowRoot = shadow;
40
+ };
41
+ const displayResults = async ({ feedData }) => {
42
+ await resultLoad({
43
+ ...props,
44
+ ...helperFunctions,
45
+ displayResults,
46
+ entries: feedData.map(
47
+ (entry) => Composite.card.block({
48
+ ...display({ entry, isThemeDark }),
49
+ image: standard({
50
+ images: entry.image,
51
+ url: entry.url
52
+ }),
53
+ isAligned: false,
54
+ isTransparent
55
+ })
56
+ )
57
+ });
58
+ if (shadowRoot) {
59
+ setShadowStyles({
60
+ shadowRoot,
61
+ styles
62
+ });
63
+ }
64
+ };
65
+ const layoutElement = gridGap({
66
+ count: numberOfColumnsToShow
67
+ });
68
+ container.appendChild(loader$1.element);
69
+ start({
70
+ ...props,
71
+ ...helperFunctions,
72
+ displayResults,
73
+ displayResultStart: resultStart,
74
+ displayNoResults: noResults,
75
+ layoutElement,
76
+ isThemeDark
77
+ });
78
+ return {
79
+ element: container,
80
+ styles,
81
+ events: {
82
+ callback
83
+ }
84
+ };
85
+ })();
86
+ export {
87
+ grid as default
88
+ };
89
+ //# sourceMappingURL=grid.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.mjs","sources":["../../../source/composite/events/grid.ts"],"sourcesContent":["import { Composite } from '@universityofmaryland/web-elements-library';\nimport * as feedElements from 'elements';\nimport * as feedMacros from 'macros';\nimport * as feedFetch from './common/fetch';\nimport * as feedDisplay from './common/display';\nimport * as dataComposed from './common/data';\nimport { type BlockProps, type FeedDisplay } from './_types';\nimport { type ElementModel } from '../../_types';\n\nexport default (props: BlockProps): ElementModel =>\n (() => {\n const { isThemeDark, isTransparent, numberOfColumnsToShow } = props;\n const loader = feedMacros.loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count: number) => (totalEntries = count);\n const setOffset = (count: number) => (offset = offset + count);\n const setStyles = (additonalStyles: string) => (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: ShadowRoot | null = null;\n\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n\n const callback = (shadow: ShadowRoot) => {\n shadowRoot = shadow;\n };\n\n const displayResults = async ({ feedData }: FeedDisplay) => {\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries: feedData.map((entry) =>\n Composite.card.block({\n ...dataComposed.display({ entry, isThemeDark }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n isTransparent,\n }),\n ),\n });\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n const layoutElement = feedElements.layout.gridGap({\n count: numberOfColumnsToShow,\n });\n container.appendChild(loader.element);\n\n feedFetch.start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: feedDisplay.resultStart,\n displayNoResults: feedDisplay.noResults,\n layoutElement,\n isThemeDark,\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["loader","feedMacros.loader","feedDisplay.resultLoad","dataComposed.display","feedElements.asset.standard","feedDisplay.setShadowStyles","feedElements.layout.gridGap","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":";;;;;;;;;AASA,MAAA,OAAe,CAAC,WACb,MAAM;AACL,QAAM,EAAE,aAAa,eAAe,sBAAA,IAA0B;AAC9D,QAAMA,WAASC,OAAkB,OAAO,EAAE,aAAa;AACvD,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,QAAM,kBAAkB,CAAC,UAAmB,eAAe;AAC3D,QAAM,YAAY,CAAC,UAAmB,SAAS,SAAS;AACxD,QAAM,YAAY,CAAC,oBAA6B,UAAU;AAC1D,QAAM,eAAe,MAAM;AAC3B,QAAM,kBAAkB,MAAM;AAC9B,QAAM,YAAY,MAAM;AACxB,QAAM,YAAY,MAAM;AACxB,QAAM,gBAAgB,MAAM;AAC5B,MAAI,eAAe;AACnB,MAAI,SAAS;AACb,MAAI,SAAS;AAAA,QACTD,SAAO,MAAM;AAAA;AAEjB,MAAI,aAAgC;AAEpC,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,WAAW,CAAC,WAAuB;AACvC,iBAAa;AAAA,EACf;AAEA,QAAM,iBAAiB,OAAO,EAAE,eAA4B;AAC1D,UAAME,WAAuB;AAAA,MAC3B,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,SAAS,SAAS;AAAA,QAAI,CAAC,UACrB,UAAU,KAAK,MAAM;AAAA,UACnB,GAAGC,QAAqB,EAAE,OAAO,aAAa;AAAA,UAC9C,OAAOC,SAA4B;AAAA,YACjC,QAAQ,MAAM;AAAA,YACd,KAAK,MAAM;AAAA,UAAA,CACZ;AAAA,UACD,WAAW;AAAA,UACX;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,IACH,CACD;AAED,QAAI,YAAY;AACdC,sBAA4B;AAAA,QAC1B;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAAA,EACF;AAEA,QAAM,gBAAgBC,QAA4B;AAAA,IAChD,OAAO;AAAA,EAAA,CACR;AACD,YAAU,YAAYN,SAAO,OAAO;AAEpCO,QAAgB;AAAA,IACd,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA,oBAAoBC;AAAAA,IACpB,kBAAkBC;AAAAA,IAClB;AAAA,IACA;AAAA,EAAA,CACD;AAED,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EACF;AAEJ,GAAA;"}
@@ -1,5 +1,5 @@
1
- import { type ListProps } from './_types';
2
- import { type ElementModel } from '../../_types';
1
+ import { ListProps } from './_types';
2
+ import { ElementModel } from '../../_types';
3
3
  declare const _default: (props: ListProps) => ElementModel;
4
4
  export default _default;
5
5
  //# sourceMappingURL=grouped.d.ts.map
@@ -1 +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
+ {"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;yBAuGjC,OAAO,SAAS,KAAG,YAAY;AAA/C,wBA0IO"}
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ const Styles = require("@universityofmaryland/web-styles-library");
3
+ const webElementsLibrary = require("@universityofmaryland/web-elements-library");
4
+ const asset = require("../../elements/asset.js");
5
+ const loader = require("../../macros/loader.js");
6
+ require("../../macros/slider.js");
7
+ const fetch = require("./common/fetch.js");
8
+ const display = require("./common/display.js");
9
+ const data = require("./common/data.js");
10
+ function _interopNamespaceDefault(e) {
11
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
12
+ if (e) {
13
+ for (const k in e) {
14
+ if (k !== "default") {
15
+ const d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: () => e[k]
19
+ });
20
+ }
21
+ }
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+ const Styles__namespace = /* @__PURE__ */ _interopNamespaceDefault(Styles);
27
+ const getDateBanner = (dateStamp) => {
28
+ const dateParts = dateStamp.split("T")[0].split("-");
29
+ const year = parseInt(dateParts[0], 10);
30
+ const month = parseInt(dateParts[1], 10) - 1;
31
+ const day = parseInt(dateParts[2], 10);
32
+ const eventDate = new Date(year, month, day);
33
+ const currentDate = /* @__PURE__ */ new Date();
34
+ currentDate.setHours(0, 0, 0, 0);
35
+ const weekFromNow = /* @__PURE__ */ new Date();
36
+ weekFromNow.setDate(currentDate.getDate() + 7);
37
+ weekFromNow.setHours(0, 0, 0, 0);
38
+ if (eventDate.getFullYear() === currentDate.getFullYear() && eventDate.getMonth() === currentDate.getMonth() && eventDate.getDate() === currentDate.getDate()) {
39
+ return "Today";
40
+ }
41
+ if (eventDate.getTime() > currentDate.getTime() && eventDate.getTime() <= weekFromNow.getTime()) {
42
+ const days2 = [
43
+ "Sunday",
44
+ "Monday",
45
+ "Tuesday",
46
+ "Wednesday",
47
+ "Thursday",
48
+ "Friday",
49
+ "Saturday"
50
+ ];
51
+ return days2[eventDate.getDay()];
52
+ }
53
+ const days = [
54
+ "Sunday",
55
+ "Monday",
56
+ "Tuesday",
57
+ "Wednesday",
58
+ "Thursday",
59
+ "Friday",
60
+ "Saturday"
61
+ ];
62
+ const months = [
63
+ "Jan",
64
+ "Feb",
65
+ "Mar",
66
+ "Apr",
67
+ "May",
68
+ "Jun",
69
+ "Jul",
70
+ "Aug",
71
+ "Sep",
72
+ "Oct",
73
+ "Nov",
74
+ "Dec"
75
+ ];
76
+ return `${days[eventDate.getDay()]}, ${months[eventDate.getMonth()]} ${eventDate.getDate()}`;
77
+ };
78
+ const groupEventsByDate = (events) => {
79
+ const grouped2 = events.reduce((acc, event) => {
80
+ const dateKey = event.startStamp;
81
+ if (!acc[dateKey]) {
82
+ acc[dateKey] = {
83
+ date: getDateBanner(event.startStamp),
84
+ events: []
85
+ };
86
+ }
87
+ acc[dateKey].events.push(event);
88
+ return acc;
89
+ }, {});
90
+ return Object.values(grouped2).sort((a, b) => {
91
+ const dateA = new Date(
92
+ Object.keys(grouped2).find((key) => grouped2[key] === a) || ""
93
+ );
94
+ const dateB = new Date(
95
+ Object.keys(grouped2).find((key) => grouped2[key] === b) || ""
96
+ );
97
+ return dateA.getTime() - dateB.getTime();
98
+ });
99
+ };
100
+ const grouped = (props) => (() => {
101
+ const { isThemeDark } = props;
102
+ const loader$1 = loader.create({ isThemeDark });
103
+ const container = document.createElement("div");
104
+ const setTotalEntries = (count) => totalEntries = count;
105
+ const setOffset = (count) => offset = offset + count;
106
+ const setStyles = (additonalStyles) => styles += additonalStyles;
107
+ const getContainer = () => container;
108
+ const getTotalEntries = () => totalEntries;
109
+ const getOffset = () => offset;
110
+ const getStyles = () => styles;
111
+ const getShadowRoot = () => shadowRoot;
112
+ let totalEntries = 0;
113
+ let offset = 0;
114
+ let styles = `
115
+ ${loader$1.styles}
116
+ `;
117
+ let shadowRoot = null;
118
+ const helperFunctions = {
119
+ setTotalEntries,
120
+ setOffset,
121
+ setStyles,
122
+ getContainer,
123
+ getOffset,
124
+ getTotalEntries,
125
+ getStyles,
126
+ getShadowRoot
127
+ };
128
+ const callback = (shadow) => {
129
+ shadowRoot = shadow;
130
+ };
131
+ const groupLayout = () => {
132
+ return webElementsLibrary.Model.ElementModel.createDiv({
133
+ className: "umd-feed-events-grouped",
134
+ elementStyles: {
135
+ element: {}
136
+ }
137
+ });
138
+ };
139
+ const displayResults = async ({ feedData }) => {
140
+ const groupedEvents = groupEventsByDate(feedData);
141
+ const entries = [];
142
+ let actualEventCount = 0;
143
+ groupedEvents.forEach((group) => {
144
+ const dateHeadline = document.createElement("p");
145
+ dateHeadline.textContent = group.date;
146
+ entries.push(
147
+ webElementsLibrary.Model.ElementModel.text.ribbon({
148
+ element: dateHeadline,
149
+ elementStyles: {
150
+ element: {
151
+ margin: `${Styles__namespace.token.spacing.lg} 0`
152
+ }
153
+ }
154
+ })
155
+ );
156
+ const dateEntries = group.events.map(
157
+ (entry) => webElementsLibrary.Composite.card.list({
158
+ ...data.display({ entry, isThemeDark }),
159
+ dateSign: webElementsLibrary.Atomic.events.sign({
160
+ ...entry,
161
+ isThemeDark,
162
+ isLargeSize: false
163
+ }),
164
+ image: asset.standard({
165
+ images: entry.image,
166
+ url: entry.url
167
+ }),
168
+ isAligned: false
169
+ })
170
+ );
171
+ actualEventCount += group.events.length;
172
+ entries.push(
173
+ webElementsLibrary.Model.ElementModel.createDiv({
174
+ className: "umd-feed-events-grouped-entries",
175
+ children: [...dateEntries],
176
+ elementStyles: {
177
+ element: {
178
+ [` > *:not(:last-child)`]: {
179
+ paddingBottom: Styles__namespace.token.spacing.lg,
180
+ marginBottom: Styles__namespace.token.spacing.lg
181
+ }
182
+ }
183
+ }
184
+ })
185
+ );
186
+ });
187
+ const originalSetOffset = helperFunctions.setOffset;
188
+ helperFunctions.setOffset = () => originalSetOffset(actualEventCount);
189
+ await display.resultLoad({
190
+ ...props,
191
+ ...helperFunctions,
192
+ displayResults,
193
+ entries
194
+ });
195
+ helperFunctions.setOffset = originalSetOffset;
196
+ if (shadowRoot) {
197
+ display.setShadowStyles({
198
+ shadowRoot,
199
+ styles
200
+ });
201
+ }
202
+ };
203
+ container.appendChild(loader$1.element);
204
+ fetch.start({
205
+ ...props,
206
+ ...helperFunctions,
207
+ displayResults,
208
+ displayResultStart: display.resultStart,
209
+ displayNoResults: display.noResults,
210
+ layoutElement: groupLayout()
211
+ });
212
+ return {
213
+ element: container,
214
+ styles,
215
+ events: {
216
+ callback
217
+ }
218
+ };
219
+ })();
220
+ module.exports = grouped;
221
+ //# sourceMappingURL=grouped.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped.js","sources":["../../../source/composite/events/grouped.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport {\n Atomic,\n Composite,\n Model,\n} from '@universityofmaryland/web-elements-library';\nimport * as feedElements from 'elements';\nimport * as feedMacros from 'macros';\nimport * as feedFetch from './common/fetch';\nimport * as feedDisplay from './common/display';\nimport * as dataComposed from './common/data';\nimport { type ListProps, type FeedDisplay, type EventType } from './_types';\nimport { type ElementModel } from '../../_types';\n\ninterface GroupedEvent {\n date: string;\n events: EventType[];\n}\n\nconst getDateBanner = (dateStamp: string): string => {\n // Parse the date string more reliably\n // Handle both \"YYYY-MM-DD\" and ISO format strings\n const dateParts = dateStamp.split('T')[0].split('-');\n const year = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1; // Month is 0-indexed\n const day = parseInt(dateParts[2], 10);\n\n // Create dates using local timezone to avoid timezone shifts\n const eventDate = new Date(year, month, day);\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const weekFromNow = new Date();\n weekFromNow.setDate(currentDate.getDate() + 7);\n weekFromNow.setHours(0, 0, 0, 0);\n\n // Check if it's today\n if (\n eventDate.getFullYear() === currentDate.getFullYear() &&\n eventDate.getMonth() === currentDate.getMonth() &&\n eventDate.getDate() === currentDate.getDate()\n ) {\n return 'Today';\n }\n\n // Check if it's within the next 7 days\n if (\n eventDate.getTime() > currentDate.getTime() &&\n eventDate.getTime() <= weekFromNow.getTime()\n ) {\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\n // Otherwise return day of week, month and day\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()]}, ${\n months[eventDate.getMonth()]\n } ${eventDate.getDate()}`;\n};\n\nconst groupEventsByDate = (events: EventType[]): GroupedEvent[] => {\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 }, {} as Record<string, GroupedEvent>);\n\n return Object.values(grouped).sort((a, b) => {\n const dateA = new Date(\n Object.keys(grouped).find((key) => grouped[key] === a) || '',\n );\n const dateB = new Date(\n Object.keys(grouped).find((key) => grouped[key] === b) || '',\n );\n return dateA.getTime() - dateB.getTime();\n });\n};\n\nexport default (props: ListProps): ElementModel =>\n (() => {\n const { isThemeDark } = props;\n const loader = feedMacros.loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count: number) => (totalEntries = count);\n const setOffset = (count: number) => (offset = offset + count);\n const setStyles = (additonalStyles: string) => (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: ShadowRoot | null = null;\n\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n\n const callback = (shadow: ShadowRoot) => {\n shadowRoot = shadow;\n };\n\n const groupLayout = (): { element: HTMLElement; styles: string } => {\n return Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped',\n elementStyles: {\n element: {},\n },\n });\n };\n\n const displayResults = async ({ feedData }: FeedDisplay) => {\n const groupedEvents = groupEventsByDate(feedData);\n const entries: { element: HTMLElement; styles: string }[] = [];\n let actualEventCount = 0;\n\n groupedEvents.forEach((group) => {\n const dateHeadline = document.createElement('p');\n dateHeadline.textContent = group.date;\n\n entries.push(\n Model.ElementModel.text.ribbon({\n element: dateHeadline,\n elementStyles: {\n element: {\n margin: `${Styles.token.spacing.lg} 0`,\n },\n },\n }),\n );\n\n const dateEntries = group.events.map((entry) =>\n Composite.card.list({\n ...dataComposed.display({ entry, isThemeDark }),\n dateSign: Atomic.events.sign({\n ...entry,\n isThemeDark,\n isLargeSize: false,\n }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n }),\n );\n\n actualEventCount += group.events.length;\n\n entries.push(\n Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped-entries',\n children: [...dateEntries],\n elementStyles: {\n element: {\n [` > *:not(:last-child)`]: {\n paddingBottom: Styles.token.spacing.lg,\n marginBottom: Styles.token.spacing.lg,\n },\n },\n },\n }),\n );\n });\n\n // Override the offset with actual event count to fix lazy load\n const originalSetOffset = helperFunctions.setOffset;\n helperFunctions.setOffset = () => originalSetOffset(actualEventCount);\n\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries,\n });\n\n // Restore original setOffset\n helperFunctions.setOffset = originalSetOffset;\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n container.appendChild(loader.element);\n\n feedFetch.start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: feedDisplay.resultStart,\n displayNoResults: feedDisplay.noResults,\n layoutElement: groupLayout(),\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["days","grouped","loader","feedMacros.loader","Model","Styles","Composite","dataComposed.display","Atomic","feedElements.asset.standard","feedDisplay.resultLoad","feedDisplay.setShadowStyles","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ import * as Styles from "@universityofmaryland/web-styles-library";
2
+ import { Model, Composite, Atomic } from "@universityofmaryland/web-elements-library";
3
+ import { standard } from "../../elements/asset.mjs";
4
+ import loader from "../../macros/loader.mjs";
5
+ import "../../macros/slider.mjs";
6
+ import { start } from "./common/fetch.mjs";
7
+ import { noResults, resultStart, resultLoad, setShadowStyles } from "./common/display.mjs";
8
+ import { display } from "./common/data.mjs";
9
+ const getDateBanner = (dateStamp) => {
10
+ const dateParts = dateStamp.split("T")[0].split("-");
11
+ const year = parseInt(dateParts[0], 10);
12
+ const month = parseInt(dateParts[1], 10) - 1;
13
+ const day = parseInt(dateParts[2], 10);
14
+ const eventDate = new Date(year, month, day);
15
+ const currentDate = /* @__PURE__ */ new Date();
16
+ currentDate.setHours(0, 0, 0, 0);
17
+ const weekFromNow = /* @__PURE__ */ new Date();
18
+ weekFromNow.setDate(currentDate.getDate() + 7);
19
+ weekFromNow.setHours(0, 0, 0, 0);
20
+ if (eventDate.getFullYear() === currentDate.getFullYear() && eventDate.getMonth() === currentDate.getMonth() && eventDate.getDate() === currentDate.getDate()) {
21
+ return "Today";
22
+ }
23
+ if (eventDate.getTime() > currentDate.getTime() && eventDate.getTime() <= weekFromNow.getTime()) {
24
+ const days2 = [
25
+ "Sunday",
26
+ "Monday",
27
+ "Tuesday",
28
+ "Wednesday",
29
+ "Thursday",
30
+ "Friday",
31
+ "Saturday"
32
+ ];
33
+ return days2[eventDate.getDay()];
34
+ }
35
+ const days = [
36
+ "Sunday",
37
+ "Monday",
38
+ "Tuesday",
39
+ "Wednesday",
40
+ "Thursday",
41
+ "Friday",
42
+ "Saturday"
43
+ ];
44
+ const months = [
45
+ "Jan",
46
+ "Feb",
47
+ "Mar",
48
+ "Apr",
49
+ "May",
50
+ "Jun",
51
+ "Jul",
52
+ "Aug",
53
+ "Sep",
54
+ "Oct",
55
+ "Nov",
56
+ "Dec"
57
+ ];
58
+ return `${days[eventDate.getDay()]}, ${months[eventDate.getMonth()]} ${eventDate.getDate()}`;
59
+ };
60
+ const groupEventsByDate = (events) => {
61
+ const grouped2 = events.reduce((acc, event) => {
62
+ const dateKey = event.startStamp;
63
+ if (!acc[dateKey]) {
64
+ acc[dateKey] = {
65
+ date: getDateBanner(event.startStamp),
66
+ events: []
67
+ };
68
+ }
69
+ acc[dateKey].events.push(event);
70
+ return acc;
71
+ }, {});
72
+ return Object.values(grouped2).sort((a, b) => {
73
+ const dateA = new Date(
74
+ Object.keys(grouped2).find((key) => grouped2[key] === a) || ""
75
+ );
76
+ const dateB = new Date(
77
+ Object.keys(grouped2).find((key) => grouped2[key] === b) || ""
78
+ );
79
+ return dateA.getTime() - dateB.getTime();
80
+ });
81
+ };
82
+ const grouped = (props) => (() => {
83
+ const { isThemeDark } = props;
84
+ const loader$1 = loader.create({ isThemeDark });
85
+ const container = document.createElement("div");
86
+ const setTotalEntries = (count) => totalEntries = count;
87
+ const setOffset = (count) => offset = offset + count;
88
+ const setStyles = (additonalStyles) => styles += additonalStyles;
89
+ const getContainer = () => container;
90
+ const getTotalEntries = () => totalEntries;
91
+ const getOffset = () => offset;
92
+ const getStyles = () => styles;
93
+ const getShadowRoot = () => shadowRoot;
94
+ let totalEntries = 0;
95
+ let offset = 0;
96
+ let styles = `
97
+ ${loader$1.styles}
98
+ `;
99
+ let shadowRoot = null;
100
+ const helperFunctions = {
101
+ setTotalEntries,
102
+ setOffset,
103
+ setStyles,
104
+ getContainer,
105
+ getOffset,
106
+ getTotalEntries,
107
+ getStyles,
108
+ getShadowRoot
109
+ };
110
+ const callback = (shadow) => {
111
+ shadowRoot = shadow;
112
+ };
113
+ const groupLayout = () => {
114
+ return Model.ElementModel.createDiv({
115
+ className: "umd-feed-events-grouped",
116
+ elementStyles: {
117
+ element: {}
118
+ }
119
+ });
120
+ };
121
+ const displayResults = async ({ feedData }) => {
122
+ const groupedEvents = groupEventsByDate(feedData);
123
+ const entries = [];
124
+ let actualEventCount = 0;
125
+ groupedEvents.forEach((group) => {
126
+ const dateHeadline = document.createElement("p");
127
+ dateHeadline.textContent = group.date;
128
+ entries.push(
129
+ Model.ElementModel.text.ribbon({
130
+ element: dateHeadline,
131
+ elementStyles: {
132
+ element: {
133
+ margin: `${Styles.token.spacing.lg} 0`
134
+ }
135
+ }
136
+ })
137
+ );
138
+ const dateEntries = group.events.map(
139
+ (entry) => Composite.card.list({
140
+ ...display({ entry, isThemeDark }),
141
+ dateSign: Atomic.events.sign({
142
+ ...entry,
143
+ isThemeDark,
144
+ isLargeSize: false
145
+ }),
146
+ image: standard({
147
+ images: entry.image,
148
+ url: entry.url
149
+ }),
150
+ isAligned: false
151
+ })
152
+ );
153
+ actualEventCount += group.events.length;
154
+ entries.push(
155
+ Model.ElementModel.createDiv({
156
+ className: "umd-feed-events-grouped-entries",
157
+ children: [...dateEntries],
158
+ elementStyles: {
159
+ element: {
160
+ [` > *:not(:last-child)`]: {
161
+ paddingBottom: Styles.token.spacing.lg,
162
+ marginBottom: Styles.token.spacing.lg
163
+ }
164
+ }
165
+ }
166
+ })
167
+ );
168
+ });
169
+ const originalSetOffset = helperFunctions.setOffset;
170
+ helperFunctions.setOffset = () => originalSetOffset(actualEventCount);
171
+ await resultLoad({
172
+ ...props,
173
+ ...helperFunctions,
174
+ displayResults,
175
+ entries
176
+ });
177
+ helperFunctions.setOffset = originalSetOffset;
178
+ if (shadowRoot) {
179
+ setShadowStyles({
180
+ shadowRoot,
181
+ styles
182
+ });
183
+ }
184
+ };
185
+ container.appendChild(loader$1.element);
186
+ start({
187
+ ...props,
188
+ ...helperFunctions,
189
+ displayResults,
190
+ displayResultStart: resultStart,
191
+ displayNoResults: noResults,
192
+ layoutElement: groupLayout()
193
+ });
194
+ return {
195
+ element: container,
196
+ styles,
197
+ events: {
198
+ callback
199
+ }
200
+ };
201
+ })();
202
+ export {
203
+ grouped as default
204
+ };
205
+ //# sourceMappingURL=grouped.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped.mjs","sources":["../../../source/composite/events/grouped.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport {\n Atomic,\n Composite,\n Model,\n} from '@universityofmaryland/web-elements-library';\nimport * as feedElements from 'elements';\nimport * as feedMacros from 'macros';\nimport * as feedFetch from './common/fetch';\nimport * as feedDisplay from './common/display';\nimport * as dataComposed from './common/data';\nimport { type ListProps, type FeedDisplay, type EventType } from './_types';\nimport { type ElementModel } from '../../_types';\n\ninterface GroupedEvent {\n date: string;\n events: EventType[];\n}\n\nconst getDateBanner = (dateStamp: string): string => {\n // Parse the date string more reliably\n // Handle both \"YYYY-MM-DD\" and ISO format strings\n const dateParts = dateStamp.split('T')[0].split('-');\n const year = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1; // Month is 0-indexed\n const day = parseInt(dateParts[2], 10);\n\n // Create dates using local timezone to avoid timezone shifts\n const eventDate = new Date(year, month, day);\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const weekFromNow = new Date();\n weekFromNow.setDate(currentDate.getDate() + 7);\n weekFromNow.setHours(0, 0, 0, 0);\n\n // Check if it's today\n if (\n eventDate.getFullYear() === currentDate.getFullYear() &&\n eventDate.getMonth() === currentDate.getMonth() &&\n eventDate.getDate() === currentDate.getDate()\n ) {\n return 'Today';\n }\n\n // Check if it's within the next 7 days\n if (\n eventDate.getTime() > currentDate.getTime() &&\n eventDate.getTime() <= weekFromNow.getTime()\n ) {\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\n // Otherwise return day of week, month and day\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()]}, ${\n months[eventDate.getMonth()]\n } ${eventDate.getDate()}`;\n};\n\nconst groupEventsByDate = (events: EventType[]): GroupedEvent[] => {\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 }, {} as Record<string, GroupedEvent>);\n\n return Object.values(grouped).sort((a, b) => {\n const dateA = new Date(\n Object.keys(grouped).find((key) => grouped[key] === a) || '',\n );\n const dateB = new Date(\n Object.keys(grouped).find((key) => grouped[key] === b) || '',\n );\n return dateA.getTime() - dateB.getTime();\n });\n};\n\nexport default (props: ListProps): ElementModel =>\n (() => {\n const { isThemeDark } = props;\n const loader = feedMacros.loader.create({ isThemeDark });\n const container = document.createElement('div');\n const setTotalEntries = (count: number) => (totalEntries = count);\n const setOffset = (count: number) => (offset = offset + count);\n const setStyles = (additonalStyles: string) => (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: ShadowRoot | null = null;\n\n const helperFunctions = {\n setTotalEntries,\n setOffset,\n setStyles,\n getContainer,\n getOffset,\n getTotalEntries,\n getStyles,\n getShadowRoot,\n };\n\n const callback = (shadow: ShadowRoot) => {\n shadowRoot = shadow;\n };\n\n const groupLayout = (): { element: HTMLElement; styles: string } => {\n return Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped',\n elementStyles: {\n element: {},\n },\n });\n };\n\n const displayResults = async ({ feedData }: FeedDisplay) => {\n const groupedEvents = groupEventsByDate(feedData);\n const entries: { element: HTMLElement; styles: string }[] = [];\n let actualEventCount = 0;\n\n groupedEvents.forEach((group) => {\n const dateHeadline = document.createElement('p');\n dateHeadline.textContent = group.date;\n\n entries.push(\n Model.ElementModel.text.ribbon({\n element: dateHeadline,\n elementStyles: {\n element: {\n margin: `${Styles.token.spacing.lg} 0`,\n },\n },\n }),\n );\n\n const dateEntries = group.events.map((entry) =>\n Composite.card.list({\n ...dataComposed.display({ entry, isThemeDark }),\n dateSign: Atomic.events.sign({\n ...entry,\n isThemeDark,\n isLargeSize: false,\n }),\n image: feedElements.asset.standard({\n images: entry.image,\n url: entry.url,\n }),\n isAligned: false,\n }),\n );\n\n actualEventCount += group.events.length;\n\n entries.push(\n Model.ElementModel.createDiv({\n className: 'umd-feed-events-grouped-entries',\n children: [...dateEntries],\n elementStyles: {\n element: {\n [` > *:not(:last-child)`]: {\n paddingBottom: Styles.token.spacing.lg,\n marginBottom: Styles.token.spacing.lg,\n },\n },\n },\n }),\n );\n });\n\n // Override the offset with actual event count to fix lazy load\n const originalSetOffset = helperFunctions.setOffset;\n helperFunctions.setOffset = () => originalSetOffset(actualEventCount);\n\n await feedDisplay.resultLoad({\n ...props,\n ...helperFunctions,\n displayResults,\n entries,\n });\n\n // Restore original setOffset\n helperFunctions.setOffset = originalSetOffset;\n\n if (shadowRoot) {\n feedDisplay.setShadowStyles({\n shadowRoot,\n styles,\n });\n }\n };\n\n container.appendChild(loader.element);\n\n feedFetch.start({\n ...props,\n ...helperFunctions,\n displayResults,\n displayResultStart: feedDisplay.resultStart,\n displayNoResults: feedDisplay.noResults,\n layoutElement: groupLayout(),\n });\n\n return {\n element: container,\n styles,\n events: {\n callback,\n },\n };\n })();\n"],"names":["days","grouped","loader","feedMacros.loader","dataComposed.display","feedElements.asset.standard","feedDisplay.resultLoad","feedDisplay.setShadowStyles","feedFetch.start","feedDisplay.resultStart","feedDisplay.noResults"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { type ListProps } from './_types';
2
- import { type ElementModel } from '../../_types';
1
+ import { ListProps } from './_types';
2
+ import { ElementModel } from '../../_types';
3
3
  declare const _default: (props: ListProps) => ElementModel;
4
4
  export default _default;
5
5
  //# sourceMappingURL=list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../source/composite/events/list.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;gCAE1B,SAAS,KAAG,YAAY;AAA/C,wBAmFO"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../source/composite/events/list.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;yBAEjC,OAAO,SAAS,KAAG,YAAY;AAA/C,wBAmFO"}