@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,378 @@
1
+ "use strict";
2
+ const webBuilderLibrary = require("@universityofmaryland/web-builder-library");
3
+ const composite = require("@universityofmaryland/web-elements-library/composite");
4
+ const layout = require("@universityofmaryland/web-elements-library/layout");
5
+ const loading = require("../../states/loading.js");
6
+ const empty = require("../../states/empty.js");
7
+ const pagination = require("../../states/pagination.js");
8
+ const announcer = require("../../states/announcer.js");
9
+ const news = require("../../strategies/fetch/news.js");
10
+ const news$1 = require("../../strategies/display/news.js");
11
+ const index = require("../../helpers/events/index.js");
12
+ const shadow = require("../../helpers/styles/shadow.js");
13
+ const INITIAL_ITEMS = 3;
14
+ const LOAD_MORE_ITEMS = 2;
15
+ const createFetchProps = (props, offset) => ({
16
+ token: props.token,
17
+ categories: props.categories,
18
+ isUnion: props.isUnion,
19
+ numberOfRowsToStart: offset === 0 ? INITIAL_ITEMS : LOAD_MORE_ITEMS,
20
+ numberOfColumnsToShow: 1,
21
+ getOffset: () => offset
22
+ });
23
+ const createImageConfig = (entry) => ({
24
+ imageUrl: entry.image[0]?.url,
25
+ altText: entry.image[0]?.altText || "News Article Image",
26
+ linkUrl: entry.url,
27
+ linkLabel: "Maryland Today Article with image"
28
+ });
29
+ const createAnnouncerMessage = (offset, total, isLazyLoad) => {
30
+ return isLazyLoad ? `Showing ${offset} of ${total} articles` : `Showing ${offset} articles`;
31
+ };
32
+ class FeaturedFeedState {
33
+ /**
34
+ * Initialize state with initial styles
35
+ *
36
+ * @param initialStyles - Initial CSS styles
37
+ */
38
+ constructor(initialStyles) {
39
+ this.stylesArray = [];
40
+ this.shadowRoot = null;
41
+ this.totalEntries = 0;
42
+ this.offset = 0;
43
+ this.hasRenderedOffset = false;
44
+ this.pagination = null;
45
+ this.stylesArray.push(initialStyles);
46
+ }
47
+ /**
48
+ * Add styles to the accumulated styles
49
+ *
50
+ * @param styles - CSS styles to add
51
+ */
52
+ addStyles(styles) {
53
+ this.stylesArray.push(styles);
54
+ }
55
+ /**
56
+ * Set shadow root reference for style updates
57
+ *
58
+ * @param shadow - Shadow root element
59
+ */
60
+ setShadowRoot(shadow2) {
61
+ this.shadowRoot = shadow2;
62
+ }
63
+ /**
64
+ * Update shadow DOM styles
65
+ *
66
+ * @returns Promise that resolves when styles are updated
67
+ */
68
+ async updateShadowStyles() {
69
+ if (!this.shadowRoot) return;
70
+ await shadow.setShadowStyles({
71
+ shadowRoot: this.shadowRoot,
72
+ styles: this.getStyles()
73
+ });
74
+ }
75
+ /**
76
+ * Get accumulated styles as single string
77
+ *
78
+ * @returns Combined CSS styles
79
+ */
80
+ getStyles() {
81
+ return this.stylesArray.join("\n");
82
+ }
83
+ /**
84
+ * Get shadow root callback for events
85
+ *
86
+ * @returns Callback function for shadow root
87
+ */
88
+ getShadowCallback() {
89
+ return (shadow2) => this.setShadowRoot(shadow2);
90
+ }
91
+ /**
92
+ * Get current offset
93
+ *
94
+ * @returns Current offset
95
+ */
96
+ getOffset() {
97
+ return this.offset;
98
+ }
99
+ /**
100
+ * Set offset to specific value
101
+ *
102
+ * @param value - New offset value
103
+ */
104
+ setOffset(value) {
105
+ this.offset = value;
106
+ }
107
+ /**
108
+ * Increment offset by count
109
+ *
110
+ * @param count - Number to increment by
111
+ */
112
+ incrementOffset(count) {
113
+ this.offset += count;
114
+ }
115
+ /**
116
+ * Get total entries
117
+ *
118
+ * @returns Total entries
119
+ */
120
+ getTotalEntries() {
121
+ return this.totalEntries;
122
+ }
123
+ /**
124
+ * Set total entries
125
+ *
126
+ * @param total - Total entries
127
+ */
128
+ setTotalEntries(total) {
129
+ this.totalEntries = total;
130
+ }
131
+ /**
132
+ * Check if offset layout has been rendered
133
+ *
134
+ * @returns True if offset layout rendered
135
+ */
136
+ hasOffset() {
137
+ return this.hasRenderedOffset;
138
+ }
139
+ /**
140
+ * Mark offset layout as rendered
141
+ */
142
+ markOffsetRendered() {
143
+ this.hasRenderedOffset = true;
144
+ }
145
+ /**
146
+ * Get pagination state
147
+ *
148
+ * @returns Pagination state or null
149
+ */
150
+ getPagination() {
151
+ return this.pagination;
152
+ }
153
+ /**
154
+ * Set pagination state
155
+ *
156
+ * @param pagination - Pagination state
157
+ */
158
+ setPagination(pagination2) {
159
+ this.pagination = pagination2;
160
+ }
161
+ }
162
+ const createOverlayCard = (entry, state, isThemeDark) => {
163
+ const overlayCard = news$1.newsDisplayStrategy.mapEntryToCard(entry, {
164
+ isOverlay: true,
165
+ isThemeDark,
166
+ imageConfig: () => createImageConfig(entry)
167
+ });
168
+ state.addStyles(`
169
+ ${overlayCard.styles}
170
+
171
+ .${composite.card.overlay.imageClassRef} {
172
+ height: inherit;
173
+ }
174
+
175
+ .${composite.card.overlay.imageClassRef} .umd-asset-image-wrapper-scaled {
176
+ position: absolute;
177
+ }
178
+ `);
179
+ return overlayCard;
180
+ };
181
+ const createBlockCards = (entries, state, options) => {
182
+ return entries.map((entry) => {
183
+ const blockCard = news$1.newsDisplayStrategy.mapEntryToCard(entry, {
184
+ isThemeDark: options.isThemeDark,
185
+ isTransparent: options.isTransparent,
186
+ isAligned: true,
187
+ imageConfig: () => createImageConfig(entry)
188
+ });
189
+ state.addStyles(blockCard.styles);
190
+ return blockCard;
191
+ });
192
+ };
193
+ const renderFeaturedLayout = async (container, entries, state, props, loadMore) => {
194
+ const {
195
+ isThemeDark = false,
196
+ isTransparent = false,
197
+ isLayoutReversed = false,
198
+ overwriteStickyPosition,
199
+ isLazyLoad = false
200
+ } = props;
201
+ if (entries.length < 2 || state.hasOffset()) {
202
+ return renderStandardGrid(container, entries, state, {
203
+ isThemeDark,
204
+ isTransparent
205
+ });
206
+ }
207
+ state.markOffsetRendered();
208
+ const offsetLayout = layout.gridOffset({
209
+ columns: 2,
210
+ isLayoutReversed,
211
+ stickyTopPosition: overwriteStickyPosition
212
+ });
213
+ const gridLayout = layout.gridGap({ columns: 2 });
214
+ gridLayout.element.setAttribute("id", "umd-featured-news-grid-container");
215
+ const overlayCard = createOverlayCard(entries[0], state, isThemeDark);
216
+ const blockCards = createBlockCards(entries.slice(1, 3), state, {
217
+ isThemeDark,
218
+ isTransparent
219
+ });
220
+ blockCards.forEach((card2) => {
221
+ gridLayout.element.appendChild(card2.element);
222
+ });
223
+ offsetLayout.element.appendChild(overlayCard.element);
224
+ offsetLayout.element.appendChild(gridLayout.element);
225
+ container.appendChild(offsetLayout.element);
226
+ state.addStyles(offsetLayout.styles);
227
+ state.addStyles(gridLayout.styles);
228
+ state.setOffset(3);
229
+ if (isLazyLoad && state.getTotalEntries() > state.getOffset()) {
230
+ const pagination$1 = new pagination.PaginationState({
231
+ totalEntries: state.getTotalEntries(),
232
+ offset: state.getOffset(),
233
+ isLazyLoad: true,
234
+ callback: loadMore
235
+ });
236
+ const paginationElement = pagination$1.render(container);
237
+ if (paginationElement) state.addStyles(paginationElement.styles);
238
+ state.setPagination(pagination$1);
239
+ }
240
+ const message = createAnnouncerMessage(
241
+ INITIAL_ITEMS,
242
+ state.getTotalEntries(),
243
+ isLazyLoad
244
+ );
245
+ const announcer$1 = new announcer.Announcer({ message });
246
+ container.appendChild(announcer$1.getElement());
247
+ await state.updateShadowStyles();
248
+ };
249
+ const renderStandardGrid = async (container, entries, state, options) => {
250
+ let gridContainer = container.querySelector(
251
+ "#umd-featured-news-grid-container"
252
+ );
253
+ if (!gridContainer) {
254
+ const gridLayout = layout.gridGap({ columns: 2 });
255
+ gridLayout.element.setAttribute("id", "umd-featured-news-grid-container");
256
+ container.appendChild(gridLayout.element);
257
+ state.addStyles(gridLayout.styles);
258
+ gridContainer = gridLayout.element;
259
+ }
260
+ const blockCards = createBlockCards(entries, state, options);
261
+ blockCards.forEach((card2) => {
262
+ gridContainer.appendChild(card2.element);
263
+ });
264
+ state.incrementOffset(entries.length);
265
+ await state.updateShadowStyles();
266
+ };
267
+ const renderError = async (container, message, state, isThemeDark) => {
268
+ const emptyState = new empty.EmptyState({ message, isThemeDark });
269
+ emptyState.render(container);
270
+ state.addStyles(emptyState.styles);
271
+ await state.updateShadowStyles();
272
+ };
273
+ const featured = (props) => {
274
+ const {
275
+ token,
276
+ categories,
277
+ isUnion,
278
+ isThemeDark = false,
279
+ isLazyLoad = false,
280
+ isTransparent = false
281
+ } = props;
282
+ const containerBuilder = new webBuilderLibrary.ElementBuilder("div").withClassName(
283
+ "featured-news-feed"
284
+ );
285
+ const container = containerBuilder.getElement();
286
+ const loading$1 = new loading.LoadingState({ isThemeDark });
287
+ const state = new FeaturedFeedState(loading$1.styles);
288
+ const loadMore = async () => {
289
+ const pagination2 = state.getPagination();
290
+ if (pagination2) {
291
+ pagination2.remove();
292
+ }
293
+ loading$1.show(container);
294
+ const fetchProps = createFetchProps(
295
+ { token, categories, isUnion },
296
+ state.getOffset()
297
+ );
298
+ const variables = news.newsFetchStrategy.composeApiVariables(fetchProps);
299
+ const entries = await news.newsFetchStrategy.fetchEntries(variables);
300
+ loading$1.hide();
301
+ if (!entries || entries.length === 0) return;
302
+ await renderStandardGrid(container, entries, state, {
303
+ isThemeDark,
304
+ isTransparent
305
+ });
306
+ if (pagination2) {
307
+ pagination2.updateState(state.getOffset(), state.getTotalEntries());
308
+ if (pagination2.styles) state.addStyles(pagination2.styles);
309
+ await state.updateShadowStyles();
310
+ }
311
+ const existingAnnouncer = container.querySelector(
312
+ '[role="status"]'
313
+ );
314
+ if (existingAnnouncer) {
315
+ existingAnnouncer.textContent = createAnnouncerMessage(
316
+ state.getOffset(),
317
+ state.getTotalEntries(),
318
+ isLazyLoad
319
+ );
320
+ }
321
+ index.dispatch(
322
+ container,
323
+ index.eventNames.FEED_LOADED_MORE,
324
+ {
325
+ items: entries,
326
+ count: entries.length,
327
+ total: state.getTotalEntries()
328
+ }
329
+ );
330
+ };
331
+ const initialize = async () => {
332
+ loading$1.show(container);
333
+ const fetchProps = createFetchProps({ token, categories, isUnion }, 0);
334
+ const variables = news.newsFetchStrategy.composeApiVariables(fetchProps);
335
+ const [count, entries] = await Promise.all([
336
+ news.newsFetchStrategy.fetchCount(variables),
337
+ news.newsFetchStrategy.fetchEntries(variables)
338
+ ]);
339
+ loading$1.hide();
340
+ if (!entries || entries.length === 0) {
341
+ await renderError(
342
+ container,
343
+ "No news articles found",
344
+ state,
345
+ isThemeDark
346
+ );
347
+ return;
348
+ }
349
+ state.setTotalEntries(count || entries.length);
350
+ index.dispatch(container, index.eventNames.FEED_LOADED, {
351
+ items: entries,
352
+ count: entries.length,
353
+ total: state.getTotalEntries()
354
+ });
355
+ await renderFeaturedLayout(container, entries, state, props, loadMore);
356
+ };
357
+ initialize();
358
+ const model = containerBuilder.build();
359
+ const setPosition = (position) => {
360
+ const overlayElement = container.querySelector(
361
+ `.${composite.card.overlay.imageClassRef}`
362
+ );
363
+ if (overlayElement) overlayElement.style.top = `${position}px`;
364
+ };
365
+ return {
366
+ element: model.element,
367
+ get styles() {
368
+ return state.getStyles();
369
+ },
370
+ events: {
371
+ callback: state.getShadowCallback(),
372
+ setPosition
373
+ // Custom event for sticky position control
374
+ }
375
+ };
376
+ };
377
+ module.exports = featured;
378
+ //# sourceMappingURL=featured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featured.js","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":["shadow","styleUtilities.setShadowStyles","pagination","newsDisplayStrategy","card","gridOffset","gridGap","PaginationState","announcer","Announcer","EmptyState","ElementBuilder","loading","LoadingState","newsFetchStrategy","eventUtilities.dispatch","eventUtilities.eventNames"],"mappings":"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"}