@universityofmaryland/web-feeds-library 1.2.3 → 1.3.0-beta.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 (435) hide show
  1. package/README.md +1 -1
  2. package/dist/academic.d.ts +1 -1
  3. package/dist/academic.js +1 -1
  4. package/dist/academic.mjs +1 -1
  5. package/dist/events.d.ts +1 -1
  6. package/dist/events.js +4 -4
  7. package/dist/events.mjs +4 -4
  8. package/dist/experts.d.ts +2 -0
  9. package/dist/experts.js +9 -0
  10. package/dist/experts.js.map +1 -0
  11. package/dist/experts.mjs +9 -0
  12. package/dist/experts.mjs.map +1 -0
  13. package/dist/factory/core/createBaseFeed.d.ts +3 -0
  14. package/dist/factory/core/createBaseFeed.d.ts.map +1 -0
  15. package/dist/factory/core/createBaseFeed.js +114 -0
  16. package/dist/factory/core/createBaseFeed.js.map +1 -0
  17. package/dist/factory/core/createBaseFeed.mjs +114 -0
  18. package/dist/factory/core/createBaseFeed.mjs.map +1 -0
  19. package/dist/factory/core/index.d.ts +3 -0
  20. package/dist/factory/core/index.d.ts.map +1 -0
  21. package/dist/factory/core/types.d.ts +91 -0
  22. package/dist/factory/core/types.d.ts.map +1 -0
  23. package/dist/factory/helpers/displayHandler.d.ts +29 -0
  24. package/dist/factory/helpers/displayHandler.d.ts.map +1 -0
  25. package/dist/factory/helpers/displayHandler.js +187 -0
  26. package/dist/factory/helpers/displayHandler.js.map +1 -0
  27. package/dist/factory/helpers/displayHandler.mjs +169 -0
  28. package/dist/factory/helpers/displayHandler.mjs.map +1 -0
  29. package/dist/factory/helpers/feedHelpers.d.ts +10 -0
  30. package/dist/factory/helpers/feedHelpers.d.ts.map +1 -0
  31. package/dist/factory/helpers/feedHelpers.js +32 -0
  32. package/dist/factory/helpers/feedHelpers.js.map +1 -0
  33. package/dist/factory/helpers/feedHelpers.mjs +32 -0
  34. package/dist/factory/helpers/feedHelpers.mjs.map +1 -0
  35. package/dist/factory/helpers/fetchHandler.d.ts +22 -0
  36. package/dist/factory/helpers/fetchHandler.d.ts.map +1 -0
  37. package/dist/factory/helpers/fetchHandler.js +140 -0
  38. package/dist/factory/helpers/fetchHandler.js.map +1 -0
  39. package/dist/factory/helpers/fetchHandler.mjs +123 -0
  40. package/dist/factory/helpers/fetchHandler.mjs.map +1 -0
  41. package/dist/factory/helpers/index.d.ts +4 -0
  42. package/dist/factory/helpers/index.d.ts.map +1 -0
  43. package/dist/factory/index.d.ts +4 -0
  44. package/dist/factory/index.d.ts.map +1 -0
  45. package/dist/feeds/academic/_types.d.ts.map +1 -0
  46. package/dist/feeds/academic/index.d.ts.map +1 -0
  47. package/dist/feeds/academic/slider.d.ts.map +1 -0
  48. package/dist/feeds/academic/slider.js +10 -0
  49. package/dist/feeds/academic/slider.js.map +1 -0
  50. package/dist/feeds/academic/slider.mjs +11 -0
  51. package/dist/feeds/academic/slider.mjs.map +1 -0
  52. package/dist/feeds/events/_types.d.ts.map +1 -0
  53. package/dist/feeds/events/grid.d.ts.map +1 -0
  54. package/dist/feeds/events/grid.js +31 -0
  55. package/dist/feeds/events/grid.js.map +1 -0
  56. package/dist/feeds/events/grid.mjs +32 -0
  57. package/dist/feeds/events/grid.mjs.map +1 -0
  58. package/dist/feeds/events/grouped.d.ts.map +1 -0
  59. package/dist/feeds/events/grouped.js +353 -0
  60. package/dist/feeds/events/grouped.js.map +1 -0
  61. package/dist/feeds/events/grouped.mjs +337 -0
  62. package/dist/feeds/events/grouped.mjs.map +1 -0
  63. package/dist/feeds/events/index.d.ts.map +1 -0
  64. package/dist/feeds/events/list.d.ts.map +1 -0
  65. package/dist/feeds/events/list.js +32 -0
  66. package/dist/feeds/events/list.js.map +1 -0
  67. package/dist/feeds/events/list.mjs +33 -0
  68. package/dist/feeds/events/list.mjs.map +1 -0
  69. package/dist/feeds/events/slider.d.ts.map +1 -0
  70. package/dist/feeds/events/slider.js +10 -0
  71. package/dist/feeds/events/slider.js.map +1 -0
  72. package/dist/feeds/events/slider.mjs +11 -0
  73. package/dist/feeds/events/slider.mjs.map +1 -0
  74. package/dist/feeds/experts/_types.d.ts +22 -0
  75. package/dist/feeds/experts/_types.d.ts.map +1 -0
  76. package/dist/feeds/experts/bio.d.ts +5 -0
  77. package/dist/feeds/experts/bio.d.ts.map +1 -0
  78. package/dist/feeds/experts/bio.js +146 -0
  79. package/dist/feeds/experts/bio.js.map +1 -0
  80. package/dist/feeds/experts/bio.mjs +147 -0
  81. package/dist/feeds/experts/bio.mjs.map +1 -0
  82. package/dist/feeds/experts/grid.d.ts +5 -0
  83. package/dist/feeds/experts/grid.d.ts.map +1 -0
  84. package/dist/feeds/experts/grid.js +36 -0
  85. package/dist/feeds/experts/grid.js.map +1 -0
  86. package/dist/feeds/experts/grid.mjs +37 -0
  87. package/dist/feeds/experts/grid.mjs.map +1 -0
  88. package/dist/feeds/experts/index.d.ts +4 -0
  89. package/dist/feeds/experts/index.d.ts.map +1 -0
  90. package/dist/feeds/experts/list.d.ts.map +1 -0
  91. package/dist/feeds/experts/list.js +25 -0
  92. package/dist/feeds/experts/list.js.map +1 -0
  93. package/dist/feeds/experts/list.mjs +26 -0
  94. package/dist/feeds/experts/list.mjs.map +1 -0
  95. package/dist/feeds/news/_types.d.ts.map +1 -0
  96. package/dist/feeds/news/featured.d.ts.map +1 -0
  97. package/dist/feeds/news/featured.js +378 -0
  98. package/dist/feeds/news/featured.js.map +1 -0
  99. package/dist/feeds/news/featured.mjs +379 -0
  100. package/dist/feeds/news/featured.mjs.map +1 -0
  101. package/dist/feeds/news/grid.d.ts.map +1 -0
  102. package/dist/feeds/news/grid.js +36 -0
  103. package/dist/feeds/news/grid.js.map +1 -0
  104. package/dist/feeds/news/grid.mjs +37 -0
  105. package/dist/feeds/news/grid.mjs.map +1 -0
  106. package/dist/feeds/news/index.d.ts.map +1 -0
  107. package/dist/feeds/news/list.d.ts +5 -0
  108. package/dist/feeds/news/list.d.ts.map +1 -0
  109. package/dist/feeds/news/list.js +33 -0
  110. package/dist/feeds/news/list.js.map +1 -0
  111. package/dist/feeds/news/list.mjs +34 -0
  112. package/dist/feeds/news/list.mjs.map +1 -0
  113. package/dist/{utilities → helpers}/events/index.d.ts +1 -0
  114. package/dist/helpers/events/index.d.ts.map +1 -0
  115. package/dist/{utilities → helpers}/events/index.js +2 -0
  116. package/dist/helpers/events/index.js.map +1 -0
  117. package/dist/{utilities → helpers}/events/index.mjs +2 -0
  118. package/dist/helpers/events/index.mjs.map +1 -0
  119. package/dist/helpers/grouping/events.d.ts +14 -0
  120. package/dist/helpers/grouping/events.d.ts.map +1 -0
  121. package/dist/helpers/grouping/events.js +147 -0
  122. package/dist/helpers/grouping/events.js.map +1 -0
  123. package/dist/helpers/grouping/events.mjs +147 -0
  124. package/dist/helpers/grouping/events.mjs.map +1 -0
  125. package/dist/helpers/grouping/index.d.ts +2 -0
  126. package/dist/helpers/grouping/index.d.ts.map +1 -0
  127. package/dist/helpers/index.d.ts +5 -0
  128. package/dist/helpers/index.d.ts.map +1 -0
  129. package/dist/helpers/network/fetch.d.ts.map +1 -0
  130. package/dist/helpers/network/index.d.ts.map +1 -0
  131. package/dist/helpers/styles/index.d.ts +2 -0
  132. package/dist/helpers/styles/index.d.ts.map +1 -0
  133. package/dist/helpers/styles/shadow.d.ts +10 -0
  134. package/dist/helpers/styles/shadow.d.ts.map +1 -0
  135. package/dist/helpers/styles/shadow.js +33 -0
  136. package/dist/helpers/styles/shadow.js.map +1 -0
  137. package/dist/helpers/styles/shadow.mjs +16 -0
  138. package/dist/helpers/styles/shadow.mjs.map +1 -0
  139. package/dist/index.d.ts +4 -3
  140. package/dist/index.d.ts.map +1 -1
  141. package/dist/index.js +2 -0
  142. package/dist/index.js.map +1 -1
  143. package/dist/index.mjs +2 -0
  144. package/dist/index.mjs.map +1 -1
  145. package/dist/news.d.ts +1 -1
  146. package/dist/news.js +3 -3
  147. package/dist/news.mjs +3 -3
  148. package/dist/states/_types.d.ts +60 -0
  149. package/dist/states/_types.d.ts.map +1 -0
  150. package/dist/states/_types.js +12 -0
  151. package/dist/states/_types.js.map +1 -0
  152. package/dist/states/_types.mjs +12 -0
  153. package/dist/states/_types.mjs.map +1 -0
  154. package/dist/states/announcer.d.ts +16 -0
  155. package/dist/states/announcer.d.ts.map +1 -0
  156. package/dist/states/announcer.js +62 -0
  157. package/dist/states/announcer.js.map +1 -0
  158. package/dist/states/announcer.mjs +62 -0
  159. package/dist/states/announcer.mjs.map +1 -0
  160. package/dist/states/empty.d.ts +17 -0
  161. package/dist/states/empty.d.ts.map +1 -0
  162. package/dist/states/empty.js +121 -0
  163. package/dist/states/empty.js.map +1 -0
  164. package/dist/states/empty.mjs +104 -0
  165. package/dist/states/empty.mjs.map +1 -0
  166. package/dist/states/index.d.ts +10 -0
  167. package/dist/states/index.d.ts.map +1 -0
  168. package/dist/states/loading.d.ts +17 -0
  169. package/dist/states/loading.d.ts.map +1 -0
  170. package/dist/states/loading.js +155 -0
  171. package/dist/states/loading.js.map +1 -0
  172. package/dist/states/loading.mjs +155 -0
  173. package/dist/states/loading.mjs.map +1 -0
  174. package/dist/states/pagination.d.ts +19 -0
  175. package/dist/states/pagination.d.ts.map +1 -0
  176. package/dist/states/pagination.js +119 -0
  177. package/dist/states/pagination.js.map +1 -0
  178. package/dist/states/pagination.mjs +102 -0
  179. package/dist/states/pagination.mjs.map +1 -0
  180. package/dist/strategies/display/events.d.ts +4 -0
  181. package/dist/strategies/display/events.d.ts.map +1 -0
  182. package/dist/strategies/display/events.js +60 -0
  183. package/dist/strategies/display/events.js.map +1 -0
  184. package/dist/strategies/display/events.mjs +60 -0
  185. package/dist/strategies/display/events.mjs.map +1 -0
  186. package/dist/strategies/display/experts.d.ts +19 -0
  187. package/dist/strategies/display/experts.d.ts.map +1 -0
  188. package/dist/strategies/display/experts.js +266 -0
  189. package/dist/strategies/display/experts.js.map +1 -0
  190. package/dist/strategies/display/experts.mjs +266 -0
  191. package/dist/strategies/display/experts.mjs.map +1 -0
  192. package/dist/strategies/display/index.d.ts +5 -0
  193. package/dist/strategies/display/index.d.ts.map +1 -0
  194. package/dist/strategies/display/news.d.ts +4 -0
  195. package/dist/strategies/display/news.d.ts.map +1 -0
  196. package/dist/strategies/display/news.js +58 -0
  197. package/dist/strategies/display/news.js.map +1 -0
  198. package/dist/strategies/display/news.mjs +58 -0
  199. package/dist/strategies/display/news.mjs.map +1 -0
  200. package/dist/strategies/fetch/academic.d.ts +2 -0
  201. package/dist/strategies/fetch/academic.d.ts.map +1 -0
  202. package/dist/strategies/fetch/academic.js +30 -0
  203. package/dist/strategies/fetch/academic.js.map +1 -0
  204. package/dist/strategies/fetch/academic.mjs +30 -0
  205. package/dist/strategies/fetch/academic.mjs.map +1 -0
  206. package/dist/strategies/fetch/events.d.ts +20 -0
  207. package/dist/strategies/fetch/events.d.ts.map +1 -0
  208. package/dist/strategies/fetch/events.js +223 -0
  209. package/dist/strategies/fetch/events.js.map +1 -0
  210. package/dist/strategies/fetch/events.mjs +223 -0
  211. package/dist/strategies/fetch/events.mjs.map +1 -0
  212. package/dist/strategies/fetch/experts.d.ts +4 -0
  213. package/dist/strategies/fetch/experts.d.ts.map +1 -0
  214. package/dist/strategies/fetch/experts.js +189 -0
  215. package/dist/strategies/fetch/experts.js.map +1 -0
  216. package/dist/strategies/fetch/experts.mjs +189 -0
  217. package/dist/strategies/fetch/experts.mjs.map +1 -0
  218. package/dist/strategies/fetch/graphql.d.ts +13 -0
  219. package/dist/strategies/fetch/graphql.d.ts.map +1 -0
  220. package/dist/strategies/fetch/graphql.js +100 -0
  221. package/dist/strategies/fetch/graphql.js.map +1 -0
  222. package/dist/strategies/fetch/graphql.mjs +100 -0
  223. package/dist/strategies/fetch/graphql.mjs.map +1 -0
  224. package/dist/strategies/fetch/index.d.ts +10 -0
  225. package/dist/strategies/fetch/index.d.ts.map +1 -0
  226. package/dist/strategies/fetch/news.d.ts +4 -0
  227. package/dist/strategies/fetch/news.d.ts.map +1 -0
  228. package/dist/strategies/fetch/news.js +95 -0
  229. package/dist/strategies/fetch/news.js.map +1 -0
  230. package/dist/strategies/fetch/news.mjs +95 -0
  231. package/dist/strategies/fetch/news.mjs.map +1 -0
  232. package/dist/strategies/index.d.ts +7 -0
  233. package/dist/strategies/index.d.ts.map +1 -0
  234. package/dist/strategies/layout/featured.d.ts +8 -0
  235. package/dist/strategies/layout/featured.d.ts.map +1 -0
  236. package/dist/strategies/layout/grid.d.ts +7 -0
  237. package/dist/strategies/layout/grid.d.ts.map +1 -0
  238. package/dist/strategies/layout/grid.js +36 -0
  239. package/dist/strategies/layout/grid.js.map +1 -0
  240. package/dist/strategies/layout/grid.mjs +36 -0
  241. package/dist/strategies/layout/grid.mjs.map +1 -0
  242. package/dist/strategies/layout/index.d.ts +4 -0
  243. package/dist/strategies/layout/index.d.ts.map +1 -0
  244. package/dist/types/api.d.ts +34 -0
  245. package/dist/types/api.d.ts.map +1 -0
  246. package/dist/types/core.d.ts +40 -0
  247. package/dist/types/core.d.ts.map +1 -0
  248. package/dist/types/data/academic.d.ts +6 -0
  249. package/dist/types/data/academic.d.ts.map +1 -0
  250. package/dist/types/data/events.d.ts +21 -0
  251. package/dist/types/data/events.d.ts.map +1 -0
  252. package/dist/types/data/experts.d.ts +53 -0
  253. package/dist/types/data/experts.d.ts.map +1 -0
  254. package/dist/types/data/index.d.ts +5 -0
  255. package/dist/types/data/index.d.ts.map +1 -0
  256. package/dist/types/data/news.d.ts +6 -0
  257. package/dist/types/data/news.d.ts.map +1 -0
  258. package/dist/types/feeds.d.ts +35 -0
  259. package/dist/types/feeds.d.ts.map +1 -0
  260. package/dist/types/index.d.ts +5 -0
  261. package/dist/types/index.d.ts.map +1 -0
  262. package/dist/widgets/index.d.ts +2 -0
  263. package/dist/widgets/index.d.ts.map +1 -0
  264. package/dist/widgets/slider.d.ts.map +1 -0
  265. package/dist/{macros → widgets}/slider.js +2 -4
  266. package/dist/{macros/slider.mjs.map → widgets/slider.js.map} +1 -1
  267. package/dist/{macros → widgets}/slider.mjs +2 -4
  268. package/dist/widgets/slider.mjs.map +1 -0
  269. package/package.json +17 -3
  270. package/dist/composite/academic/_types.d.ts.map +0 -1
  271. package/dist/composite/academic/index.d.ts.map +0 -1
  272. package/dist/composite/academic/slider.d.ts.map +0 -1
  273. package/dist/composite/academic/slider.js +0 -34
  274. package/dist/composite/academic/slider.js.map +0 -1
  275. package/dist/composite/academic/slider.mjs +0 -35
  276. package/dist/composite/academic/slider.mjs.map +0 -1
  277. package/dist/composite/events/_types.d.ts.map +0 -1
  278. package/dist/composite/events/common/data.d.ts +0 -48
  279. package/dist/composite/events/common/data.d.ts.map +0 -1
  280. package/dist/composite/events/common/data.js +0 -53
  281. package/dist/composite/events/common/data.js.map +0 -1
  282. package/dist/composite/events/common/data.mjs +0 -53
  283. package/dist/composite/events/common/data.mjs.map +0 -1
  284. package/dist/composite/events/common/display.d.ts +0 -18
  285. package/dist/composite/events/common/display.d.ts.map +0 -1
  286. package/dist/composite/events/common/display.js +0 -147
  287. package/dist/composite/events/common/display.js.map +0 -1
  288. package/dist/composite/events/common/display.mjs +0 -130
  289. package/dist/composite/events/common/display.mjs.map +0 -1
  290. package/dist/composite/events/common/fetch.d.ts +0 -24
  291. package/dist/composite/events/common/fetch.d.ts.map +0 -1
  292. package/dist/composite/events/common/fetch.js +0 -117
  293. package/dist/composite/events/common/fetch.js.map +0 -1
  294. package/dist/composite/events/common/fetch.mjs +0 -117
  295. package/dist/composite/events/common/fetch.mjs.map +0 -1
  296. package/dist/composite/events/common/queries.d.ts +0 -5
  297. package/dist/composite/events/common/queries.d.ts.map +0 -1
  298. package/dist/composite/events/common/queries.js +0 -113
  299. package/dist/composite/events/common/queries.js.map +0 -1
  300. package/dist/composite/events/common/queries.mjs +0 -113
  301. package/dist/composite/events/common/queries.mjs.map +0 -1
  302. package/dist/composite/events/grid.d.ts.map +0 -1
  303. package/dist/composite/events/grid.js +0 -90
  304. package/dist/composite/events/grid.js.map +0 -1
  305. package/dist/composite/events/grid.mjs +0 -91
  306. package/dist/composite/events/grid.mjs.map +0 -1
  307. package/dist/composite/events/grouped.d.ts.map +0 -1
  308. package/dist/composite/events/grouped.js +0 -300
  309. package/dist/composite/events/grouped.js.map +0 -1
  310. package/dist/composite/events/grouped.mjs +0 -284
  311. package/dist/composite/events/grouped.mjs.map +0 -1
  312. package/dist/composite/events/index.d.ts.map +0 -1
  313. package/dist/composite/events/list.d.ts.map +0 -1
  314. package/dist/composite/events/list.js +0 -90
  315. package/dist/composite/events/list.js.map +0 -1
  316. package/dist/composite/events/list.mjs +0 -91
  317. package/dist/composite/events/list.mjs.map +0 -1
  318. package/dist/composite/events/slider.d.ts.map +0 -1
  319. package/dist/composite/events/slider.js +0 -35
  320. package/dist/composite/events/slider.js.map +0 -1
  321. package/dist/composite/events/slider.mjs +0 -36
  322. package/dist/composite/events/slider.mjs.map +0 -1
  323. package/dist/composite/news/_types.d.ts.map +0 -1
  324. package/dist/composite/news/common/data.d.ts +0 -47
  325. package/dist/composite/news/common/data.d.ts.map +0 -1
  326. package/dist/composite/news/common/data.js +0 -62
  327. package/dist/composite/news/common/data.js.map +0 -1
  328. package/dist/composite/news/common/data.mjs +0 -62
  329. package/dist/composite/news/common/data.mjs.map +0 -1
  330. package/dist/composite/news/common/display.d.ts +0 -17
  331. package/dist/composite/news/common/display.d.ts.map +0 -1
  332. package/dist/composite/news/common/display.js +0 -147
  333. package/dist/composite/news/common/display.js.map +0 -1
  334. package/dist/composite/news/common/display.mjs +0 -130
  335. package/dist/composite/news/common/display.mjs.map +0 -1
  336. package/dist/composite/news/common/fetch.d.ts +0 -22
  337. package/dist/composite/news/common/fetch.d.ts.map +0 -1
  338. package/dist/composite/news/common/fetch.js +0 -87
  339. package/dist/composite/news/common/fetch.js.map +0 -1
  340. package/dist/composite/news/common/fetch.mjs +0 -87
  341. package/dist/composite/news/common/fetch.mjs.map +0 -1
  342. package/dist/composite/news/common/queries.d.ts +0 -2
  343. package/dist/composite/news/common/queries.d.ts.map +0 -1
  344. package/dist/composite/news/common/queries.js +0 -37
  345. package/dist/composite/news/common/queries.js.map +0 -1
  346. package/dist/composite/news/common/queries.mjs +0 -37
  347. package/dist/composite/news/common/queries.mjs.map +0 -1
  348. package/dist/composite/news/featured.d.ts.map +0 -1
  349. package/dist/composite/news/featured.js +0 -182
  350. package/dist/composite/news/featured.js.map +0 -1
  351. package/dist/composite/news/featured.mjs +0 -183
  352. package/dist/composite/news/featured.mjs.map +0 -1
  353. package/dist/composite/news/grid.d.ts.map +0 -1
  354. package/dist/composite/news/grid.js +0 -98
  355. package/dist/composite/news/grid.js.map +0 -1
  356. package/dist/composite/news/grid.mjs +0 -99
  357. package/dist/composite/news/grid.mjs.map +0 -1
  358. package/dist/composite/news/index.d.ts.map +0 -1
  359. package/dist/composite/news/list.d.ts.map +0 -1
  360. package/dist/composite/news/list.js +0 -85
  361. package/dist/composite/news/list.js.map +0 -1
  362. package/dist/composite/news/list.mjs +0 -86
  363. package/dist/composite/news/list.mjs.map +0 -1
  364. package/dist/elements/asset.d.ts +0 -10
  365. package/dist/elements/asset.d.ts.map +0 -1
  366. package/dist/elements/asset.js +0 -27
  367. package/dist/elements/asset.js.map +0 -1
  368. package/dist/elements/asset.mjs +0 -27
  369. package/dist/elements/asset.mjs.map +0 -1
  370. package/dist/elements/index.d.ts +0 -4
  371. package/dist/elements/index.d.ts.map +0 -1
  372. package/dist/elements/layout.d.ts +0 -27
  373. package/dist/elements/layout.d.ts.map +0 -1
  374. package/dist/elements/layout.js +0 -121
  375. package/dist/elements/layout.js.map +0 -1
  376. package/dist/elements/layout.mjs +0 -104
  377. package/dist/elements/layout.mjs.map +0 -1
  378. package/dist/elements/text.d.ts +0 -12
  379. package/dist/elements/text.d.ts.map +0 -1
  380. package/dist/elements/text.js +0 -41
  381. package/dist/elements/text.js.map +0 -1
  382. package/dist/elements/text.mjs +0 -41
  383. package/dist/elements/text.mjs.map +0 -1
  384. package/dist/macros/aria-live.d.ts +0 -11
  385. package/dist/macros/aria-live.d.ts.map +0 -1
  386. package/dist/macros/aria-live.js +0 -25
  387. package/dist/macros/aria-live.js.map +0 -1
  388. package/dist/macros/aria-live.mjs +0 -26
  389. package/dist/macros/aria-live.mjs.map +0 -1
  390. package/dist/macros/index.d.ts +0 -6
  391. package/dist/macros/index.d.ts.map +0 -1
  392. package/dist/macros/lazy-load.d.ts +0 -19
  393. package/dist/macros/lazy-load.d.ts.map +0 -1
  394. package/dist/macros/lazy-load.js +0 -63
  395. package/dist/macros/lazy-load.js.map +0 -1
  396. package/dist/macros/lazy-load.mjs +0 -47
  397. package/dist/macros/lazy-load.mjs.map +0 -1
  398. package/dist/macros/loader.d.ts +0 -18
  399. package/dist/macros/loader.d.ts.map +0 -1
  400. package/dist/macros/loader.js +0 -148
  401. package/dist/macros/loader.js.map +0 -1
  402. package/dist/macros/loader.mjs +0 -132
  403. package/dist/macros/loader.mjs.map +0 -1
  404. package/dist/macros/no-results.d.ts +0 -15
  405. package/dist/macros/no-results.d.ts.map +0 -1
  406. package/dist/macros/no-results.js +0 -71
  407. package/dist/macros/no-results.js.map +0 -1
  408. package/dist/macros/no-results.mjs +0 -55
  409. package/dist/macros/no-results.mjs.map +0 -1
  410. package/dist/macros/slider.d.ts.map +0 -1
  411. package/dist/macros/slider.js.map +0 -1
  412. package/dist/utilities/events/index.d.ts.map +0 -1
  413. package/dist/utilities/events/index.js.map +0 -1
  414. package/dist/utilities/events/index.mjs.map +0 -1
  415. package/dist/utilities/index.d.ts +0 -3
  416. package/dist/utilities/index.d.ts.map +0 -1
  417. package/dist/utilities/network/fetch.d.ts.map +0 -1
  418. package/dist/utilities/network/index.d.ts.map +0 -1
  419. /package/dist/{composite → feeds}/academic/_types.d.ts +0 -0
  420. /package/dist/{composite → feeds}/academic/index.d.ts +0 -0
  421. /package/dist/{composite → feeds}/academic/slider.d.ts +0 -0
  422. /package/dist/{composite → feeds}/events/_types.d.ts +0 -0
  423. /package/dist/{composite → feeds}/events/grid.d.ts +0 -0
  424. /package/dist/{composite → feeds}/events/grouped.d.ts +0 -0
  425. /package/dist/{composite → feeds}/events/index.d.ts +0 -0
  426. /package/dist/{composite → feeds}/events/list.d.ts +0 -0
  427. /package/dist/{composite → feeds}/events/slider.d.ts +0 -0
  428. /package/dist/{composite/news → feeds/experts}/list.d.ts +0 -0
  429. /package/dist/{composite → feeds}/news/_types.d.ts +0 -0
  430. /package/dist/{composite → feeds}/news/featured.d.ts +0 -0
  431. /package/dist/{composite → feeds}/news/grid.d.ts +0 -0
  432. /package/dist/{composite → feeds}/news/index.d.ts +0 -0
  433. /package/dist/{utilities → helpers}/network/fetch.d.ts +0 -0
  434. /package/dist/{utilities → helpers}/network/index.d.ts +0 -0
  435. /package/dist/{macros → widgets}/slider.d.ts +0 -0
@@ -0,0 +1,379 @@
1
+ import { ElementBuilder } from "@universityofmaryland/web-builder-library";
2
+ import { card } from "@universityofmaryland/web-elements-library/composite";
3
+ import { gridOffset, gridGap } from "@universityofmaryland/web-elements-library/layout";
4
+ import { LoadingState } from "../../states/loading.mjs";
5
+ import { EmptyState } from "../../states/empty.mjs";
6
+ import { PaginationState } from "../../states/pagination.mjs";
7
+ import { Announcer } from "../../states/announcer.mjs";
8
+ import { newsFetchStrategy } from "../../strategies/fetch/news.mjs";
9
+ import { newsDisplayStrategy } from "../../strategies/display/news.mjs";
10
+ import { dispatch, eventNames } from "../../helpers/events/index.mjs";
11
+ import { setShadowStyles } from "../../helpers/styles/shadow.mjs";
12
+ const INITIAL_ITEMS = 3;
13
+ const LOAD_MORE_ITEMS = 2;
14
+ const createFetchProps = (props, offset) => ({
15
+ token: props.token,
16
+ categories: props.categories,
17
+ isUnion: props.isUnion,
18
+ numberOfRowsToStart: offset === 0 ? INITIAL_ITEMS : LOAD_MORE_ITEMS,
19
+ numberOfColumnsToShow: 1,
20
+ getOffset: () => offset
21
+ });
22
+ const createImageConfig = (entry) => ({
23
+ imageUrl: entry.image[0]?.url,
24
+ altText: entry.image[0]?.altText || "News Article Image",
25
+ linkUrl: entry.url,
26
+ linkLabel: "Maryland Today Article with image"
27
+ });
28
+ const createAnnouncerMessage = (offset, total, isLazyLoad) => {
29
+ return isLazyLoad ? `Showing ${offset} of ${total} articles` : `Showing ${offset} articles`;
30
+ };
31
+ class FeaturedFeedState {
32
+ /**
33
+ * Initialize state with initial styles
34
+ *
35
+ * @param initialStyles - Initial CSS styles
36
+ */
37
+ constructor(initialStyles) {
38
+ this.stylesArray = [];
39
+ this.shadowRoot = null;
40
+ this.totalEntries = 0;
41
+ this.offset = 0;
42
+ this.hasRenderedOffset = false;
43
+ this.pagination = null;
44
+ this.stylesArray.push(initialStyles);
45
+ }
46
+ /**
47
+ * Add styles to the accumulated styles
48
+ *
49
+ * @param styles - CSS styles to add
50
+ */
51
+ addStyles(styles) {
52
+ this.stylesArray.push(styles);
53
+ }
54
+ /**
55
+ * Set shadow root reference for style updates
56
+ *
57
+ * @param shadow - Shadow root element
58
+ */
59
+ setShadowRoot(shadow) {
60
+ this.shadowRoot = shadow;
61
+ }
62
+ /**
63
+ * Update shadow DOM styles
64
+ *
65
+ * @returns Promise that resolves when styles are updated
66
+ */
67
+ async updateShadowStyles() {
68
+ if (!this.shadowRoot) return;
69
+ await setShadowStyles({
70
+ shadowRoot: this.shadowRoot,
71
+ styles: this.getStyles()
72
+ });
73
+ }
74
+ /**
75
+ * Get accumulated styles as single string
76
+ *
77
+ * @returns Combined CSS styles
78
+ */
79
+ getStyles() {
80
+ return this.stylesArray.join("\n");
81
+ }
82
+ /**
83
+ * Get shadow root callback for events
84
+ *
85
+ * @returns Callback function for shadow root
86
+ */
87
+ getShadowCallback() {
88
+ return (shadow) => this.setShadowRoot(shadow);
89
+ }
90
+ /**
91
+ * Get current offset
92
+ *
93
+ * @returns Current offset
94
+ */
95
+ getOffset() {
96
+ return this.offset;
97
+ }
98
+ /**
99
+ * Set offset to specific value
100
+ *
101
+ * @param value - New offset value
102
+ */
103
+ setOffset(value) {
104
+ this.offset = value;
105
+ }
106
+ /**
107
+ * Increment offset by count
108
+ *
109
+ * @param count - Number to increment by
110
+ */
111
+ incrementOffset(count) {
112
+ this.offset += count;
113
+ }
114
+ /**
115
+ * Get total entries
116
+ *
117
+ * @returns Total entries
118
+ */
119
+ getTotalEntries() {
120
+ return this.totalEntries;
121
+ }
122
+ /**
123
+ * Set total entries
124
+ *
125
+ * @param total - Total entries
126
+ */
127
+ setTotalEntries(total) {
128
+ this.totalEntries = total;
129
+ }
130
+ /**
131
+ * Check if offset layout has been rendered
132
+ *
133
+ * @returns True if offset layout rendered
134
+ */
135
+ hasOffset() {
136
+ return this.hasRenderedOffset;
137
+ }
138
+ /**
139
+ * Mark offset layout as rendered
140
+ */
141
+ markOffsetRendered() {
142
+ this.hasRenderedOffset = true;
143
+ }
144
+ /**
145
+ * Get pagination state
146
+ *
147
+ * @returns Pagination state or null
148
+ */
149
+ getPagination() {
150
+ return this.pagination;
151
+ }
152
+ /**
153
+ * Set pagination state
154
+ *
155
+ * @param pagination - Pagination state
156
+ */
157
+ setPagination(pagination) {
158
+ this.pagination = pagination;
159
+ }
160
+ }
161
+ const createOverlayCard = (entry, state, isThemeDark) => {
162
+ const overlayCard = newsDisplayStrategy.mapEntryToCard(entry, {
163
+ isOverlay: true,
164
+ isThemeDark,
165
+ imageConfig: () => createImageConfig(entry)
166
+ });
167
+ state.addStyles(`
168
+ ${overlayCard.styles}
169
+
170
+ .${card.overlay.imageClassRef} {
171
+ height: inherit;
172
+ }
173
+
174
+ .${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {
175
+ position: absolute;
176
+ }
177
+ `);
178
+ return overlayCard;
179
+ };
180
+ const createBlockCards = (entries, state, options) => {
181
+ return entries.map((entry) => {
182
+ const blockCard = newsDisplayStrategy.mapEntryToCard(entry, {
183
+ isThemeDark: options.isThemeDark,
184
+ isTransparent: options.isTransparent,
185
+ isAligned: true,
186
+ imageConfig: () => createImageConfig(entry)
187
+ });
188
+ state.addStyles(blockCard.styles);
189
+ return blockCard;
190
+ });
191
+ };
192
+ const renderFeaturedLayout = async (container, entries, state, props, loadMore) => {
193
+ const {
194
+ isThemeDark = false,
195
+ isTransparent = false,
196
+ isLayoutReversed = false,
197
+ overwriteStickyPosition,
198
+ isLazyLoad = false
199
+ } = props;
200
+ if (entries.length < 2 || state.hasOffset()) {
201
+ return renderStandardGrid(container, entries, state, {
202
+ isThemeDark,
203
+ isTransparent
204
+ });
205
+ }
206
+ state.markOffsetRendered();
207
+ const offsetLayout = gridOffset({
208
+ columns: 2,
209
+ isLayoutReversed,
210
+ stickyTopPosition: overwriteStickyPosition
211
+ });
212
+ const gridLayout = gridGap({ columns: 2 });
213
+ gridLayout.element.setAttribute("id", "umd-featured-news-grid-container");
214
+ const overlayCard = createOverlayCard(entries[0], state, isThemeDark);
215
+ const blockCards = createBlockCards(entries.slice(1, 3), state, {
216
+ isThemeDark,
217
+ isTransparent
218
+ });
219
+ blockCards.forEach((card2) => {
220
+ gridLayout.element.appendChild(card2.element);
221
+ });
222
+ offsetLayout.element.appendChild(overlayCard.element);
223
+ offsetLayout.element.appendChild(gridLayout.element);
224
+ container.appendChild(offsetLayout.element);
225
+ state.addStyles(offsetLayout.styles);
226
+ state.addStyles(gridLayout.styles);
227
+ state.setOffset(3);
228
+ if (isLazyLoad && state.getTotalEntries() > state.getOffset()) {
229
+ const pagination = new PaginationState({
230
+ totalEntries: state.getTotalEntries(),
231
+ offset: state.getOffset(),
232
+ isLazyLoad: true,
233
+ callback: loadMore
234
+ });
235
+ const paginationElement = pagination.render(container);
236
+ if (paginationElement) state.addStyles(paginationElement.styles);
237
+ state.setPagination(pagination);
238
+ }
239
+ const message = createAnnouncerMessage(
240
+ INITIAL_ITEMS,
241
+ state.getTotalEntries(),
242
+ isLazyLoad
243
+ );
244
+ const announcer = new Announcer({ message });
245
+ container.appendChild(announcer.getElement());
246
+ await state.updateShadowStyles();
247
+ };
248
+ const renderStandardGrid = async (container, entries, state, options) => {
249
+ let gridContainer = container.querySelector(
250
+ "#umd-featured-news-grid-container"
251
+ );
252
+ if (!gridContainer) {
253
+ const gridLayout = gridGap({ columns: 2 });
254
+ gridLayout.element.setAttribute("id", "umd-featured-news-grid-container");
255
+ container.appendChild(gridLayout.element);
256
+ state.addStyles(gridLayout.styles);
257
+ gridContainer = gridLayout.element;
258
+ }
259
+ const blockCards = createBlockCards(entries, state, options);
260
+ blockCards.forEach((card2) => {
261
+ gridContainer.appendChild(card2.element);
262
+ });
263
+ state.incrementOffset(entries.length);
264
+ await state.updateShadowStyles();
265
+ };
266
+ const renderError = async (container, message, state, isThemeDark) => {
267
+ const emptyState = new EmptyState({ message, isThemeDark });
268
+ emptyState.render(container);
269
+ state.addStyles(emptyState.styles);
270
+ await state.updateShadowStyles();
271
+ };
272
+ const featured = (props) => {
273
+ const {
274
+ token,
275
+ categories,
276
+ isUnion,
277
+ isThemeDark = false,
278
+ isLazyLoad = false,
279
+ isTransparent = false
280
+ } = props;
281
+ const containerBuilder = new ElementBuilder("div").withClassName(
282
+ "featured-news-feed"
283
+ );
284
+ const container = containerBuilder.getElement();
285
+ const loading = new LoadingState({ isThemeDark });
286
+ const state = new FeaturedFeedState(loading.styles);
287
+ const loadMore = async () => {
288
+ const pagination = state.getPagination();
289
+ if (pagination) {
290
+ pagination.remove();
291
+ }
292
+ loading.show(container);
293
+ const fetchProps = createFetchProps(
294
+ { token, categories, isUnion },
295
+ state.getOffset()
296
+ );
297
+ const variables = newsFetchStrategy.composeApiVariables(fetchProps);
298
+ const entries = await newsFetchStrategy.fetchEntries(variables);
299
+ loading.hide();
300
+ if (!entries || entries.length === 0) return;
301
+ await renderStandardGrid(container, entries, state, {
302
+ isThemeDark,
303
+ isTransparent
304
+ });
305
+ if (pagination) {
306
+ pagination.updateState(state.getOffset(), state.getTotalEntries());
307
+ if (pagination.styles) state.addStyles(pagination.styles);
308
+ await state.updateShadowStyles();
309
+ }
310
+ const existingAnnouncer = container.querySelector(
311
+ '[role="status"]'
312
+ );
313
+ if (existingAnnouncer) {
314
+ existingAnnouncer.textContent = createAnnouncerMessage(
315
+ state.getOffset(),
316
+ state.getTotalEntries(),
317
+ isLazyLoad
318
+ );
319
+ }
320
+ dispatch(
321
+ container,
322
+ eventNames.FEED_LOADED_MORE,
323
+ {
324
+ items: entries,
325
+ count: entries.length,
326
+ total: state.getTotalEntries()
327
+ }
328
+ );
329
+ };
330
+ const initialize = async () => {
331
+ loading.show(container);
332
+ const fetchProps = createFetchProps({ token, categories, isUnion }, 0);
333
+ const variables = newsFetchStrategy.composeApiVariables(fetchProps);
334
+ const [count, entries] = await Promise.all([
335
+ newsFetchStrategy.fetchCount(variables),
336
+ newsFetchStrategy.fetchEntries(variables)
337
+ ]);
338
+ loading.hide();
339
+ if (!entries || entries.length === 0) {
340
+ await renderError(
341
+ container,
342
+ "No news articles found",
343
+ state,
344
+ isThemeDark
345
+ );
346
+ return;
347
+ }
348
+ state.setTotalEntries(count || entries.length);
349
+ dispatch(container, eventNames.FEED_LOADED, {
350
+ items: entries,
351
+ count: entries.length,
352
+ total: state.getTotalEntries()
353
+ });
354
+ await renderFeaturedLayout(container, entries, state, props, loadMore);
355
+ };
356
+ initialize();
357
+ const model = containerBuilder.build();
358
+ const setPosition = (position) => {
359
+ const overlayElement = container.querySelector(
360
+ `.${card.overlay.imageClassRef}`
361
+ );
362
+ if (overlayElement) overlayElement.style.top = `${position}px`;
363
+ };
364
+ return {
365
+ element: model.element,
366
+ get styles() {
367
+ return state.getStyles();
368
+ },
369
+ events: {
370
+ callback: state.getShadowCallback(),
371
+ setPosition
372
+ // Custom event for sticky position control
373
+ }
374
+ };
375
+ };
376
+ export {
377
+ featured as default
378
+ };
379
+ //# sourceMappingURL=featured.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featured.mjs","sources":["../../../source/feeds/news/featured.ts"],"sourcesContent":["/**\n * News Featured Feed (Refactored with Element Builder)\n *\n * Displays news articles with a featured layout:\n * - First article: Large overlay card with sticky positioning\n * - Next 2 articles: Block cards in grid layout\n * - Additional articles: Lazy-loaded block cards\n *\n * Uses Element Builder pattern for clean, declarative construction.\n *\n * @module feeds/news/featured\n */\n\nimport { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { card } from '@universityofmaryland/web-elements-library/composite';\nimport {\n gridGap,\n gridOffset,\n} from '@universityofmaryland/web-elements-library/layout';\nimport {\n LoadingState,\n PaginationState,\n EmptyState,\n Announcer,\n} from '../../states';\nimport { newsFetchStrategy } from '../../strategies/fetch/news';\nimport { newsDisplayStrategy } from '../../strategies/display/news';\nimport {\n events as eventUtilities,\n styles as styleUtilities,\n} from '../../helpers';\nimport { type FeaturedProps } from './_types';\nimport { type ElementModel } from '../../_types';\nimport { type NewsEntry } from 'types/data';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Featured layout displays 3 items initially: 1 overlay + 2 block cards */\nconst INITIAL_ITEMS = 3;\n\n/** Lazy loading adds 2 items at a time to fill a row in the 2-column grid */\nconst LOAD_MORE_ITEMS = 2;\n\n// ============================================================================\n// PURE HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Create base props for fetch strategy\n *\n * @param props - Feed props\n * @param offset - Current offset\n * @returns Base props object for strategy's composeApiVariables\n */\nconst createFetchProps = (\n props: Pick<FeaturedProps, 'token' | 'categories' | 'isUnion'>,\n offset: number,\n) => ({\n token: props.token,\n categories: props.categories,\n isUnion: props.isUnion,\n numberOfRowsToStart: offset === 0 ? INITIAL_ITEMS : LOAD_MORE_ITEMS,\n numberOfColumnsToShow: 1,\n getOffset: () => offset,\n});\n\n/**\n * Create image configuration for news entry\n *\n * @param entry - News entry\n * @returns Image config object\n */\nconst createImageConfig = (entry: NewsEntry) => ({\n imageUrl: entry.image[0]?.url,\n altText: entry.image[0]?.altText || 'News Article Image',\n linkUrl: entry.url,\n linkLabel: 'Maryland Today Article with image',\n});\n\n/**\n * Create announcer message\n *\n * @param offset - Current offset\n * @param total - Total entries\n * @param isLazyLoad - Lazy load enabled\n * @returns Announcer message\n */\nconst createAnnouncerMessage = (\n offset: number,\n total: number,\n isLazyLoad: boolean,\n): string => {\n return isLazyLoad\n ? `Showing ${offset} of ${total} articles`\n : `Showing ${offset} articles`;\n};\n\n// ============================================================================\n// STATE MANAGER CLASS\n// ============================================================================\n\n/**\n * Manages featured feed state and shadow DOM synchronization\n *\n * Encapsulates all mutable state including pagination, offset,\n * and shadow DOM management.\n */\nclass FeaturedFeedState {\n private stylesArray: string[] = [];\n private shadowRoot: ShadowRoot | null = null;\n private totalEntries: number = 0;\n private offset: number = 0;\n private hasRenderedOffset: boolean = false;\n private pagination: PaginationState | null = null;\n\n /**\n * Initialize state with initial styles\n *\n * @param initialStyles - Initial CSS styles\n */\n constructor(initialStyles: string) {\n this.stylesArray.push(initialStyles);\n }\n\n /**\n * Add styles to the accumulated styles\n *\n * @param styles - CSS styles to add\n */\n addStyles(styles: string): void {\n this.stylesArray.push(styles);\n }\n\n /**\n * Set shadow root reference for style updates\n *\n * @param shadow - Shadow root element\n */\n setShadowRoot(shadow: ShadowRoot): void {\n this.shadowRoot = shadow;\n }\n\n /**\n * Update shadow DOM styles\n *\n * @returns Promise that resolves when styles are updated\n */\n async updateShadowStyles(): Promise<void> {\n if (!this.shadowRoot) return;\n await styleUtilities.setShadowStyles({\n shadowRoot: this.shadowRoot,\n styles: this.getStyles(),\n });\n }\n\n /**\n * Get accumulated styles as single string\n *\n * @returns Combined CSS styles\n */\n getStyles(): string {\n return this.stylesArray.join('\\n');\n }\n\n /**\n * Get shadow root callback for events\n *\n * @returns Callback function for shadow root\n */\n getShadowCallback(): (shadow: ShadowRoot) => void {\n return (shadow) => this.setShadowRoot(shadow);\n }\n\n /**\n * Get current offset\n *\n * @returns Current offset\n */\n getOffset(): number {\n return this.offset;\n }\n\n /**\n * Set offset to specific value\n *\n * @param value - New offset value\n */\n setOffset(value: number): void {\n this.offset = value;\n }\n\n /**\n * Increment offset by count\n *\n * @param count - Number to increment by\n */\n incrementOffset(count: number): void {\n this.offset += count;\n }\n\n /**\n * Get total entries\n *\n * @returns Total entries\n */\n getTotalEntries(): number {\n return this.totalEntries;\n }\n\n /**\n * Set total entries\n *\n * @param total - Total entries\n */\n setTotalEntries(total: number): void {\n this.totalEntries = total;\n }\n\n /**\n * Check if offset layout has been rendered\n *\n * @returns True if offset layout rendered\n */\n hasOffset(): boolean {\n return this.hasRenderedOffset;\n }\n\n /**\n * Mark offset layout as rendered\n */\n markOffsetRendered(): void {\n this.hasRenderedOffset = true;\n }\n\n /**\n * Get pagination state\n *\n * @returns Pagination state or null\n */\n getPagination(): PaginationState | null {\n return this.pagination;\n }\n\n /**\n * Set pagination state\n *\n * @param pagination - Pagination state\n */\n setPagination(pagination: PaginationState | null): void {\n this.pagination = pagination;\n }\n}\n\n// ============================================================================\n// RENDERING FUNCTIONS\n// ============================================================================\n\n/**\n * Create overlay card for featured entry\n *\n * @param entry - News entry\n * @param state - State manager\n * @param isThemeDark - Dark theme flag\n * @returns Overlay card element model\n */\nconst createOverlayCard = (\n entry: NewsEntry,\n state: FeaturedFeedState,\n isThemeDark: boolean,\n): ElementModel => {\n const overlayCard = newsDisplayStrategy.mapEntryToCard(entry, {\n isOverlay: true,\n isThemeDark,\n imageConfig: () => createImageConfig(entry),\n });\n\n // Add custom overlay styles\n state.addStyles(`\n ${overlayCard.styles}\n\n .${card.overlay.imageClassRef} {\n height: inherit;\n }\n\n .${card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {\n position: absolute;\n }\n `);\n\n return overlayCard;\n};\n\n/**\n * Create block cards for entries\n *\n * @param entries - News entries\n * @param state - State manager\n * @param options - Card options\n * @returns Array of block card element models\n */\nconst createBlockCards = (\n entries: NewsEntry[],\n state: FeaturedFeedState,\n options: { isThemeDark: boolean; isTransparent: boolean },\n): ElementModel[] => {\n return entries.map((entry) => {\n const blockCard = newsDisplayStrategy.mapEntryToCard(entry, {\n isThemeDark: options.isThemeDark,\n isTransparent: options.isTransparent,\n isAligned: true,\n imageConfig: () => createImageConfig(entry),\n });\n\n state.addStyles(blockCard.styles);\n return blockCard;\n });\n};\n\n/**\n * Render featured layout (initial load only)\n *\n * @param container - Container element\n * @param entries - News entries\n * @param state - State manager\n * @param props - Feed props\n * @param loadMore - Load more callback\n * @returns Promise that resolves when rendering is complete\n */\nconst renderFeaturedLayout = async (\n container: HTMLElement,\n entries: NewsEntry[],\n state: FeaturedFeedState,\n props: FeaturedProps,\n loadMore: () => Promise<void>,\n): Promise<void> => {\n const {\n isThemeDark = false,\n isTransparent = false,\n isLayoutReversed = false,\n overwriteStickyPosition,\n isLazyLoad = false,\n } = props;\n\n // Fall back to standard grid if not enough entries or already rendered\n if (entries.length < 2 || state.hasOffset()) {\n return renderStandardGrid(container, entries, state, {\n isThemeDark,\n isTransparent,\n });\n }\n\n state.markOffsetRendered();\n\n // Create offset layout\n const offsetLayout = gridOffset({\n columns: 2,\n isLayoutReversed,\n stickyTopPosition: overwriteStickyPosition,\n });\n\n // Create grid for remaining items\n const gridLayout = gridGap({ columns: 2 });\n gridLayout.element.setAttribute('id', 'umd-featured-news-grid-container');\n\n // First item: overlay card\n const overlayCard = createOverlayCard(entries[0], state, isThemeDark);\n\n // Next 2 items: block cards\n const blockCards = createBlockCards(entries.slice(1, 3), state, {\n isThemeDark,\n isTransparent,\n });\n\n // Append block cards to grid\n blockCards.forEach((card) => {\n gridLayout.element.appendChild(card.element);\n });\n\n // Assemble offset layout\n offsetLayout.element.appendChild(overlayCard.element);\n offsetLayout.element.appendChild(gridLayout.element);\n container.appendChild(offsetLayout.element);\n\n state.addStyles(offsetLayout.styles);\n state.addStyles(gridLayout.styles);\n state.setOffset(3); // We've shown 3 items\n\n // Add pagination if needed\n if (isLazyLoad && state.getTotalEntries() > state.getOffset()) {\n const pagination = new PaginationState({\n totalEntries: state.getTotalEntries(),\n offset: state.getOffset(),\n isLazyLoad: true,\n callback: loadMore,\n });\n\n const paginationElement = pagination.render(container);\n if (paginationElement) state.addStyles(paginationElement.styles);\n state.setPagination(pagination);\n }\n\n // Announcer\n const message = createAnnouncerMessage(\n INITIAL_ITEMS,\n state.getTotalEntries(),\n isLazyLoad,\n );\n const announcer = new Announcer({ message });\n container.appendChild(announcer.getElement());\n\n await state.updateShadowStyles();\n};\n\n/**\n * Render standard grid (for lazy-loaded items or fallback)\n *\n * @param container - Container element\n * @param entries - News entries\n * @param state - State manager\n * @param options - Rendering options\n * @returns Promise that resolves when rendering is complete\n */\nconst renderStandardGrid = async (\n container: HTMLElement,\n entries: NewsEntry[],\n state: FeaturedFeedState,\n options: { isThemeDark: boolean; isTransparent: boolean },\n): Promise<void> => {\n let gridContainer = container.querySelector(\n '#umd-featured-news-grid-container',\n ) as HTMLElement;\n\n // Create grid if it doesn't exist\n if (!gridContainer) {\n const gridLayout = gridGap({ columns: 2 });\n gridLayout.element.setAttribute('id', 'umd-featured-news-grid-container');\n container.appendChild(gridLayout.element);\n state.addStyles(gridLayout.styles);\n gridContainer = gridLayout.element;\n }\n\n // Create and append block cards\n const blockCards = createBlockCards(entries, state, options);\n blockCards.forEach((card) => {\n gridContainer.appendChild(card.element);\n });\n\n state.incrementOffset(entries.length);\n\n await state.updateShadowStyles();\n};\n\n/**\n * Render error state\n *\n * @param container - Container element\n * @param message - Error message\n * @param state - State manager\n * @param isThemeDark - Dark theme flag\n * @returns Promise that resolves when rendering is complete\n */\nconst renderError = async (\n container: HTMLElement,\n message: string,\n state: FeaturedFeedState,\n isThemeDark: boolean,\n): Promise<void> => {\n const emptyState = new EmptyState({ message, isThemeDark });\n emptyState.render(container);\n state.addStyles(emptyState.styles);\n await state.updateShadowStyles();\n};\n\n// ============================================================================\n// MAIN EXPORT\n// ============================================================================\n\n/**\n * Create a featured news feed\n *\n * Displays news with featured layout: overlay card + grid.\n * Uses Element Builder pattern for clean construction.\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element, styles, and events\n *\n * @example\n * ```typescript\n * const feed = newsFeatured({\n * token: 'my-token',\n * isLazyLoad: true,\n * });\n * ```\n *\n * @example\n * ```typescript\n * // With custom sticky position\n * const feed = newsFeatured({\n * token: 'my-token',\n * overwriteStickyPosition: 100,\n * isLayoutReversed: true,\n * });\n * ```\n */\nexport default (props: FeaturedProps): ElementModel => {\n const {\n token,\n categories,\n isUnion,\n isThemeDark = false,\n isLazyLoad = false,\n isTransparent = false,\n } = props;\n\n // Create container using ElementBuilder\n const containerBuilder = new ElementBuilder('div').withClassName(\n 'featured-news-feed',\n );\n\n // Get element for manipulation (non-destructive)\n const container = containerBuilder.getElement();\n\n // Initialize state management\n const loading = new LoadingState({ isThemeDark });\n const state = new FeaturedFeedState(loading.styles);\n\n /**\n * Load more articles (for lazy loading)\n */\n const loadMore = async (): Promise<void> => {\n // Remove pagination button\n const pagination = state.getPagination();\n if (pagination) {\n pagination.remove();\n }\n\n // Show loading indicator\n loading.show(container);\n\n // Load more items\n const fetchProps = createFetchProps(\n { token, categories, isUnion },\n state.getOffset(),\n );\n const variables = newsFetchStrategy.composeApiVariables(fetchProps);\n\n const entries = await newsFetchStrategy.fetchEntries(variables);\n\n // Hide loading indicator\n loading.hide();\n\n if (!entries || entries.length === 0) return;\n\n await renderStandardGrid(container, entries, state, {\n isThemeDark,\n isTransparent,\n });\n\n // Update pagination state\n if (pagination) {\n pagination.updateState(state.getOffset(), state.getTotalEntries());\n if (pagination.styles) state.addStyles(pagination.styles);\n await state.updateShadowStyles();\n }\n\n // Update announcer\n const existingAnnouncer = container.querySelector(\n '[role=\"status\"]',\n ) as HTMLElement;\n if (existingAnnouncer) {\n existingAnnouncer.textContent = createAnnouncerMessage(\n state.getOffset(),\n state.getTotalEntries(),\n isLazyLoad,\n );\n }\n\n // Dispatch update event\n eventUtilities.dispatch(\n container,\n eventUtilities.eventNames.FEED_LOADED_MORE,\n {\n items: entries,\n count: entries.length,\n total: state.getTotalEntries(),\n },\n );\n };\n\n /**\n * Initialize feed\n */\n const initialize = async (): Promise<void> => {\n loading.show(container);\n\n // Fetch initial items\n const fetchProps = createFetchProps({ token, categories, isUnion }, 0);\n const variables = newsFetchStrategy.composeApiVariables(fetchProps);\n\n const [count, entries] = await Promise.all([\n newsFetchStrategy.fetchCount(variables),\n newsFetchStrategy.fetchEntries(variables),\n ]);\n\n loading.hide();\n\n // Handle no results\n if (!entries || entries.length === 0) {\n await renderError(\n container,\n 'No news articles found',\n state,\n isThemeDark,\n );\n return;\n }\n\n state.setTotalEntries(count || entries.length);\n\n // Dispatch loaded event\n eventUtilities.dispatch(container, eventUtilities.eventNames.FEED_LOADED, {\n items: entries,\n count: entries.length,\n total: state.getTotalEntries(),\n });\n\n // Render featured layout\n await renderFeaturedLayout(container, entries, state, props, loadMore);\n };\n\n // Start initialization\n initialize();\n\n // Build and return element model\n const model = containerBuilder.build();\n\n // Custom event: allow external control of sticky position\n const setPosition = (position: number) => {\n const overlayElement = container.querySelector(\n `.${card.overlay.imageClassRef}`,\n ) as HTMLElement;\n if (overlayElement) overlayElement.style.top = `${position}px`;\n };\n\n return {\n element: model.element,\n get styles() {\n return state.getStyles();\n },\n events: {\n callback: state.getShadowCallback(),\n setPosition, // Custom event for sticky position control\n },\n };\n};\n"],"names":["styleUtilities.setShadowStyles","card","eventUtilities.dispatch","eventUtilities.eventNames"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../source/feeds/news/grid.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;yBA6BjC,OAAO,UAAU,KAAG,YAAY;AAAhD,wBAiBE"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ const createBaseFeed = require("../../factory/core/createBaseFeed.js");
3
+ require("@universityofmaryland/web-builder-library");
4
+ require("@universityofmaryland/web-styles-library");
5
+ require("@universityofmaryland/web-styles-library/typography");
6
+ require("@universityofmaryland/web-utilities-library/theme");
7
+ require("@universityofmaryland/web-elements-library");
8
+ require("@universityofmaryland/web-elements-library/composite");
9
+ require("@universityofmaryland/web-elements-library/atomic");
10
+ require("@universityofmaryland/web-utilities-library/elements");
11
+ const news$1 = require("../../strategies/display/news.js");
12
+ require("@universityofmaryland/web-utilities-library/network");
13
+ require("../../strategies/fetch/events.js");
14
+ const news = require("../../strategies/fetch/news.js");
15
+ require("../../strategies/fetch/experts.js");
16
+ const grid$1 = require("../../strategies/layout/grid.js");
17
+ require("@universityofmaryland/web-elements-library/layout");
18
+ const grid = (props) => {
19
+ const { isTypeOverlay = false } = props;
20
+ return createBaseFeed.createBaseFeed({
21
+ ...props,
22
+ isOverlay: isTypeOverlay,
23
+ isAligned: !isTypeOverlay,
24
+ fetchStrategy: news.newsFetchStrategy,
25
+ displayStrategy: news$1.newsDisplayStrategy,
26
+ layoutStrategy: isTypeOverlay ? grid$1.gridLayout : grid$1.gridGapLayout,
27
+ imageConfig: (entry) => ({
28
+ imageUrl: entry.image[0].url,
29
+ altText: entry.image[0].altText || "News Article Image",
30
+ linkUrl: entry.url,
31
+ linkLabel: "Maryland Today Article with image"
32
+ })
33
+ });
34
+ };
35
+ module.exports = grid;
36
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sources":["../../../source/feeds/news/grid.ts"],"sourcesContent":["/**\n * News Grid Feed (Factory Pattern)\n *\n * Grid layout for news article entries using the feed factory pattern.\n * This is the NEW implementation using factory + strategies.\n *\n * @module composite/news/grid-new\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n newsFetchStrategy,\n newsDisplayStrategy,\n gridLayout,\n gridGapLayout,\n} from 'strategies';\nimport { type BlockProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create a news grid feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * // Standard grid with gap\n * const feed = newsGrid({\n * token: 'my-token',\n * numberOfColumnsToShow: 3,\n * numberOfRowsToStart: 2,\n * isLazyLoad: true,\n * });\n *\n * // Overlay grid\n * const overlayFeed = newsGrid({\n * token: 'my-token',\n * numberOfColumnsToShow: 3,\n * numberOfRowsToStart: 2,\n * isTypeOverlay: true,\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport default (props: BlockProps): ElementModel => {\n const { isTypeOverlay = false } = props;\n\n return createBaseFeed({\n ...props,\n isOverlay: isTypeOverlay,\n isAligned: !isTypeOverlay,\n fetchStrategy: newsFetchStrategy,\n displayStrategy: newsDisplayStrategy,\n layoutStrategy: isTypeOverlay ? gridLayout : gridGapLayout,\n imageConfig: (entry) => ({\n imageUrl: entry.image[0].url,\n altText: entry.image[0].altText || 'News Article Image',\n linkUrl: entry.url,\n linkLabel: 'Maryland Today Article with image',\n }),\n });\n};\n"],"names":["createBaseFeed","newsFetchStrategy","newsDisplayStrategy","gridLayout","gridGapLayout"],"mappings":";;;;;;;;;;;;;;;;;AA8CA,MAAA,OAAe,CAAC,UAAoC;AAClD,QAAM,EAAE,gBAAgB,MAAA,IAAU;AAElC,SAAOA,8BAAe;AAAA,IACpB,GAAG;AAAA,IACH,WAAW;AAAA,IACX,WAAW,CAAC;AAAA,IACZ,eAAeC,KAAAA;AAAAA,IACf,iBAAiBC,OAAAA;AAAAA,IACjB,gBAAgB,gBAAgBC,OAAAA,aAAaC,OAAAA;AAAAA,IAC7C,aAAa,CAAC,WAAW;AAAA,MACvB,UAAU,MAAM,MAAM,CAAC,EAAE;AAAA,MACzB,SAAS,MAAM,MAAM,CAAC,EAAE,WAAW;AAAA,MACnC,SAAS,MAAM;AAAA,MACf,WAAW;AAAA,IAAA;AAAA,EACb,CACD;AACH;;"}
@@ -0,0 +1,37 @@
1
+ import { createBaseFeed } from "../../factory/core/createBaseFeed.mjs";
2
+ import "@universityofmaryland/web-builder-library";
3
+ import "@universityofmaryland/web-styles-library";
4
+ import "@universityofmaryland/web-styles-library/typography";
5
+ import "@universityofmaryland/web-utilities-library/theme";
6
+ import "@universityofmaryland/web-elements-library";
7
+ import "@universityofmaryland/web-elements-library/composite";
8
+ import "@universityofmaryland/web-elements-library/atomic";
9
+ import "@universityofmaryland/web-utilities-library/elements";
10
+ import { newsDisplayStrategy } from "../../strategies/display/news.mjs";
11
+ import "@universityofmaryland/web-utilities-library/network";
12
+ import "../../strategies/fetch/events.mjs";
13
+ import { newsFetchStrategy } from "../../strategies/fetch/news.mjs";
14
+ import "../../strategies/fetch/experts.mjs";
15
+ import { gridLayout, gridGapLayout } from "../../strategies/layout/grid.mjs";
16
+ import "@universityofmaryland/web-elements-library/layout";
17
+ const grid = (props) => {
18
+ const { isTypeOverlay = false } = props;
19
+ return createBaseFeed({
20
+ ...props,
21
+ isOverlay: isTypeOverlay,
22
+ isAligned: !isTypeOverlay,
23
+ fetchStrategy: newsFetchStrategy,
24
+ displayStrategy: newsDisplayStrategy,
25
+ layoutStrategy: isTypeOverlay ? gridLayout : gridGapLayout,
26
+ imageConfig: (entry) => ({
27
+ imageUrl: entry.image[0].url,
28
+ altText: entry.image[0].altText || "News Article Image",
29
+ linkUrl: entry.url,
30
+ linkLabel: "Maryland Today Article with image"
31
+ })
32
+ });
33
+ };
34
+ export {
35
+ grid as default
36
+ };
37
+ //# sourceMappingURL=grid.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.mjs","sources":["../../../source/feeds/news/grid.ts"],"sourcesContent":["/**\n * News Grid Feed (Factory Pattern)\n *\n * Grid layout for news article entries using the feed factory pattern.\n * This is the NEW implementation using factory + strategies.\n *\n * @module composite/news/grid-new\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n newsFetchStrategy,\n newsDisplayStrategy,\n gridLayout,\n gridGapLayout,\n} from 'strategies';\nimport { type BlockProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create a news grid feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * // Standard grid with gap\n * const feed = newsGrid({\n * token: 'my-token',\n * numberOfColumnsToShow: 3,\n * numberOfRowsToStart: 2,\n * isLazyLoad: true,\n * });\n *\n * // Overlay grid\n * const overlayFeed = newsGrid({\n * token: 'my-token',\n * numberOfColumnsToShow: 3,\n * numberOfRowsToStart: 2,\n * isTypeOverlay: true,\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport default (props: BlockProps): ElementModel => {\n const { isTypeOverlay = false } = props;\n\n return createBaseFeed({\n ...props,\n isOverlay: isTypeOverlay,\n isAligned: !isTypeOverlay,\n fetchStrategy: newsFetchStrategy,\n displayStrategy: newsDisplayStrategy,\n layoutStrategy: isTypeOverlay ? gridLayout : gridGapLayout,\n imageConfig: (entry) => ({\n imageUrl: entry.image[0].url,\n altText: entry.image[0].altText || 'News Article Image',\n linkUrl: entry.url,\n linkLabel: 'Maryland Today Article with image',\n }),\n });\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AA8CA,MAAA,OAAe,CAAC,UAAoC;AAClD,QAAM,EAAE,gBAAgB,MAAA,IAAU;AAElC,SAAO,eAAe;AAAA,IACpB,GAAG;AAAA,IACH,WAAW;AAAA,IACX,WAAW,CAAC;AAAA,IACZ,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,gBAAgB,gBAAgB,aAAa;AAAA,IAC7C,aAAa,CAAC,WAAW;AAAA,MACvB,UAAU,MAAM,MAAM,CAAC,EAAE;AAAA,MACzB,SAAS,MAAM,MAAM,CAAC,EAAE,WAAW;AAAA,MACnC,SAAS,MAAM;AAAA,MACf,WAAW;AAAA,IAAA;AAAA,EACb,CACD;AACH;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/feeds/news/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqBjD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAoBzC,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ListProps } from './_types';
2
+ import { ElementModel } from '../../_types';
3
+ declare const _default: (props: ListProps) => ElementModel;
4
+ export default _default;
5
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../source/feeds/news/list.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;yBAoBjC,OAAO,SAAS,KAAG,YAAY;AAA/C,wBAcK"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ const createBaseFeed = require("../../factory/core/createBaseFeed.js");
3
+ require("@universityofmaryland/web-builder-library");
4
+ require("@universityofmaryland/web-styles-library");
5
+ require("@universityofmaryland/web-styles-library/typography");
6
+ require("@universityofmaryland/web-utilities-library/theme");
7
+ require("@universityofmaryland/web-elements-library");
8
+ require("@universityofmaryland/web-elements-library/composite");
9
+ require("@universityofmaryland/web-elements-library/atomic");
10
+ require("@universityofmaryland/web-utilities-library/elements");
11
+ const news$1 = require("../../strategies/display/news.js");
12
+ require("@universityofmaryland/web-utilities-library/network");
13
+ require("../../strategies/fetch/events.js");
14
+ const news = require("../../strategies/fetch/news.js");
15
+ require("../../strategies/fetch/experts.js");
16
+ const grid = require("../../strategies/layout/grid.js");
17
+ require("@universityofmaryland/web-elements-library/layout");
18
+ const list = (props) => createBaseFeed.createBaseFeed({
19
+ ...props,
20
+ cardType: "list",
21
+ isAligned: false,
22
+ fetchStrategy: news.newsFetchStrategy,
23
+ displayStrategy: news$1.newsDisplayStrategy,
24
+ layoutStrategy: grid.stackedLayout,
25
+ imageConfig: (entry) => ({
26
+ imageUrl: entry.image[0].url,
27
+ altText: entry.image[0].altText || "News Article Image",
28
+ linkUrl: entry.url,
29
+ linkLabel: "Maryland Today Article with image"
30
+ })
31
+ });
32
+ module.exports = list;
33
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sources":["../../../source/feeds/news/list.ts"],"sourcesContent":["/**\n * News List Feed (Factory Pattern)\n *\n * List layout for news article entries using the feed factory pattern.\n * This is the NEW implementation using factory + strategies.\n *\n * @module composite/news/list-new\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n newsFetchStrategy,\n newsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create a news list feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = newsList({\n * token: 'my-token',\n * numberOfRowsToStart: 5,\n * isLazyLoad: true,\n * categories: ['research', 'campus-life'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport default (props: ListProps): ElementModel =>\n createBaseFeed({\n ...props,\n cardType: 'list',\n isAligned: false,\n fetchStrategy: newsFetchStrategy,\n displayStrategy: newsDisplayStrategy,\n layoutStrategy: stackedLayout,\n imageConfig: (entry) => ({\n imageUrl: entry.image[0].url,\n altText: entry.image[0].altText || 'News Article Image',\n linkUrl: entry.url,\n linkLabel: 'Maryland Today Article with image',\n }),\n });\n"],"names":["createBaseFeed","newsFetchStrategy","newsDisplayStrategy","stackedLayout"],"mappings":";;;;;;;;;;;;;;;;;AAoCA,MAAA,OAAe,CAAC,UACdA,eAAAA,eAAe;AAAA,EACb,GAAG;AAAA,EACH,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAeC,KAAAA;AAAAA,EACf,iBAAiBC,OAAAA;AAAAA,EACjB,gBAAgBC,KAAAA;AAAAA,EAChB,aAAa,CAAC,WAAW;AAAA,IACvB,UAAU,MAAM,MAAM,CAAC,EAAE;AAAA,IACzB,SAAS,MAAM,MAAM,CAAC,EAAE,WAAW;AAAA,IACnC,SAAS,MAAM;AAAA,IACf,WAAW;AAAA,EAAA;AAEf,CAAC;;"}
@@ -0,0 +1,34 @@
1
+ import { createBaseFeed } from "../../factory/core/createBaseFeed.mjs";
2
+ import "@universityofmaryland/web-builder-library";
3
+ import "@universityofmaryland/web-styles-library";
4
+ import "@universityofmaryland/web-styles-library/typography";
5
+ import "@universityofmaryland/web-utilities-library/theme";
6
+ import "@universityofmaryland/web-elements-library";
7
+ import "@universityofmaryland/web-elements-library/composite";
8
+ import "@universityofmaryland/web-elements-library/atomic";
9
+ import "@universityofmaryland/web-utilities-library/elements";
10
+ import { newsDisplayStrategy } from "../../strategies/display/news.mjs";
11
+ import "@universityofmaryland/web-utilities-library/network";
12
+ import "../../strategies/fetch/events.mjs";
13
+ import { newsFetchStrategy } from "../../strategies/fetch/news.mjs";
14
+ import "../../strategies/fetch/experts.mjs";
15
+ import { stackedLayout } from "../../strategies/layout/grid.mjs";
16
+ import "@universityofmaryland/web-elements-library/layout";
17
+ const list = (props) => createBaseFeed({
18
+ ...props,
19
+ cardType: "list",
20
+ isAligned: false,
21
+ fetchStrategy: newsFetchStrategy,
22
+ displayStrategy: newsDisplayStrategy,
23
+ layoutStrategy: stackedLayout,
24
+ imageConfig: (entry) => ({
25
+ imageUrl: entry.image[0].url,
26
+ altText: entry.image[0].altText || "News Article Image",
27
+ linkUrl: entry.url,
28
+ linkLabel: "Maryland Today Article with image"
29
+ })
30
+ });
31
+ export {
32
+ list as default
33
+ };
34
+ //# sourceMappingURL=list.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.mjs","sources":["../../../source/feeds/news/list.ts"],"sourcesContent":["/**\n * News List Feed (Factory Pattern)\n *\n * List layout for news article entries using the feed factory pattern.\n * This is the NEW implementation using factory + strategies.\n *\n * @module composite/news/list-new\n */\n\nimport { createBaseFeed } from 'factory';\nimport {\n newsFetchStrategy,\n newsDisplayStrategy,\n stackedLayout,\n} from 'strategies';\nimport { type ListProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\n/**\n * Create a news list feed\n *\n * @param props - Feed configuration\n * @returns ElementModel with feed element and styles\n *\n * @example\n * ```typescript\n * const feed = newsList({\n * token: 'my-token',\n * numberOfRowsToStart: 5,\n * isLazyLoad: true,\n * categories: ['research', 'campus-life'],\n * });\n *\n * document.body.appendChild(feed.element);\n * ```\n */\nexport default (props: ListProps): ElementModel =>\n createBaseFeed({\n ...props,\n cardType: 'list',\n isAligned: false,\n fetchStrategy: newsFetchStrategy,\n displayStrategy: newsDisplayStrategy,\n layoutStrategy: stackedLayout,\n imageConfig: (entry) => ({\n imageUrl: entry.image[0].url,\n altText: entry.image[0].altText || 'News Article Image',\n linkUrl: entry.url,\n linkLabel: 'Maryland Today Article with image',\n }),\n });\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAoCA,MAAA,OAAe,CAAC,UACd,eAAe;AAAA,EACb,GAAG;AAAA,EACH,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,aAAa,CAAC,WAAW;AAAA,IACvB,UAAU,MAAM,MAAM,CAAC,EAAE;AAAA,IACzB,SAAS,MAAM,MAAM,CAAC,EAAE,WAAW;AAAA,IACnC,SAAS,MAAM;AAAA,IACf,WAAW;AAAA,EAAA;AAEf,CAAC;"}
@@ -1,5 +1,6 @@
1
1
  export declare const eventNames: {
2
2
  FEED_LOADED: string;
3
+ FEED_LOADED_MORE: string;
3
4
  FEED_ERROR: string;
4
5
  };
5
6
  export interface FeedEventDetails {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/helpers/events/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU;;;;CAStB,CAAC;AAKF,MAAM,WAAW,gBAAgB;IAE/B,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IAGd,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAGvB,IAAI,CAAC,EAAE,GAAG,CAAC;IAGX,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAuBD,eAAO,MAAM,QAAQ,GACnB,SAAS,WAAW,EACpB,WAAW,MAAM,EACjB,QAAQ,gBAAgB,KACvB,OAQF,CAAC;AA0BF,eAAO,MAAM,MAAM,GACjB,SAAS,WAAW,EACpB,WAAW,MAAM,EACjB,UAAU,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,EAC5C,UAAU,uBAAuB,KAChC,CAAC,MAAM,IAAI,CAWb,CAAC"}
@@ -3,6 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const eventNames = {
4
4
  /** Triggered when a feed has finished loading its content */
5
5
  FEED_LOADED: "feed:loaded",
6
+ /** Triggered when a feed loads more content (lazy loading/pagination) */
7
+ FEED_LOADED_MORE: "feed:loaded:more",
6
8
  /** Triggered when an error occurs during feed loading or processing */
7
9
  FEED_ERROR: "feed:error"
8
10
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../source/helpers/events/index.ts"],"sourcesContent":["/**\n * Event names supported by the feeds library.\n * These can be used for consistent event handling across implementations.\n */\nexport const eventNames = {\n /** Triggered when a feed has finished loading its content */\n FEED_LOADED: 'feed:loaded',\n\n /** Triggered when a feed loads more content (lazy loading/pagination) */\n FEED_LOADED_MORE: 'feed:loaded:more',\n\n /** Triggered when an error occurs during feed loading or processing */\n FEED_ERROR: 'feed:error',\n};\n\n/**\n * Custom event details for different feed events.\n */\nexport interface FeedEventDetails {\n /** Items in the feed that have been loaded */\n items?: any[];\n\n /** Error information if a feed failed to load */\n error?: Error | string;\n\n /** Information about a specific item that was clicked */\n item?: any;\n\n /** Additional custom data that may be included with any event */\n [key: string]: any;\n}\n\n/**\n * Dispatches a custom feed event on the specified element.\n *\n * @param element - The element to dispatch the event on\n * @param eventName - Name of the event to dispatch (use eventNames constants for consistency)\n * @param detail - Event details to include\n * @returns True if the event was dispatched successfully and not cancelled\n *\n * @example\n * ```typescript\n * import { events } from '@universityofmaryland/web-feeds-library/utilities';\n *\n * // Dispatch a feed loaded event\n * events.dispatch(feedContainer, events.eventNames.FEED_LOADED, { items: loadedItems });\n *\n * // Listen for feed loaded events\n * feedContainer.addEventListener(events.eventNames.FEED_LOADED, (event) => {\n * console.log('Feed loaded with', event.detail.items.length, 'items');\n * });\n * ```\n */\nexport const dispatch = (\n element: HTMLElement,\n eventName: string,\n detail: FeedEventDetails,\n): boolean => {\n const event = new CustomEvent(eventName, {\n detail,\n bubbles: true,\n cancelable: true,\n });\n\n return element.dispatchEvent(event);\n};\n\n/**\n * Adds an event listener for a specific feed event with proper TypeScript typings for the event detail.\n *\n * @param element - The element to attach the event listener to\n * @param eventName - Name of the event to listen for (use eventNames constants for consistency)\n * @param callback - Function to call when the event is triggered\n * @param options - Standard addEventListener options (capture, once, passive, etc.)\n * @returns A function that removes the event listener when called\n *\n * @example\n * ```typescript\n * import { events } from '@universityofmaryland/web-feeds-library/utilities';\n *\n * // Add a typed event listener\n * const removeListener = events.listen(\n * feedContainer,\n * events.eventNames.FEED_LOADED,\n * (detail) => console.log('Feed loaded with', detail.items.length, 'items')\n * );\n *\n * // Later, if needed:\n * removeListener();\n * ```\n */\nexport const listen = (\n element: HTMLElement,\n eventName: string,\n callback: (detail: FeedEventDetails) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n const eventListener = (event: Event) => {\n const customEvent = event as CustomEvent<FeedEventDetails>;\n callback(customEvent.detail);\n };\n\n element.addEventListener(eventName, eventListener, options);\n\n return () => {\n element.removeEventListener(eventName, eventListener, options);\n };\n};\n"],"names":[],"mappings":";;AAIO,MAAM,aAAa;AAAA;AAAA,EAExB,aAAa;AAAA;AAAA,EAGb,kBAAkB;AAAA;AAAA,EAGlB,YAAY;AACd;AAwCO,MAAM,WAAW,CACtB,SACA,WACA,WACY;AACZ,QAAM,QAAQ,IAAI,YAAY,WAAW;AAAA,IACvC;AAAA,IACA,SAAS;AAAA,IACT,YAAY;AAAA,EAAA,CACb;AAED,SAAO,QAAQ,cAAc,KAAK;AACpC;;;"}