@universityofmaryland/web-feeds-library 1.2.6 → 1.3.0-beta.1

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 (386) hide show
  1. package/README.md +1 -1
  2. package/dist/academic.d.ts +1 -1
  3. package/dist/academic.js +4 -4
  4. package/dist/academic.js.map +1 -1
  5. package/dist/events.d.ts +1 -1
  6. package/dist/events.js +10 -10
  7. package/dist/events.js.map +1 -1
  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/factory/core/createBaseFeed.d.ts +3 -0
  12. package/dist/factory/core/createBaseFeed.d.ts.map +1 -0
  13. package/dist/factory/core/createBaseFeed.js +116 -0
  14. package/dist/factory/core/createBaseFeed.js.map +1 -0
  15. package/dist/factory/core/index.d.ts +3 -0
  16. package/dist/factory/core/index.d.ts.map +1 -0
  17. package/dist/factory/core/types.d.ts +92 -0
  18. package/dist/factory/core/types.d.ts.map +1 -0
  19. package/dist/factory/helpers/displayHandler.d.ts +29 -0
  20. package/dist/factory/helpers/displayHandler.d.ts.map +1 -0
  21. package/dist/factory/helpers/displayHandler.js +169 -0
  22. package/dist/factory/helpers/displayHandler.js.map +1 -0
  23. package/dist/factory/helpers/feedHelpers.d.ts +10 -0
  24. package/dist/factory/helpers/feedHelpers.d.ts.map +1 -0
  25. package/dist/factory/helpers/feedHelpers.js +32 -0
  26. package/dist/factory/helpers/feedHelpers.js.map +1 -0
  27. package/dist/factory/helpers/fetchHandler.d.ts +22 -0
  28. package/dist/factory/helpers/fetchHandler.d.ts.map +1 -0
  29. package/dist/factory/helpers/fetchHandler.js +123 -0
  30. package/dist/factory/helpers/fetchHandler.js.map +1 -0
  31. package/dist/factory/helpers/index.d.ts +4 -0
  32. package/dist/factory/helpers/index.d.ts.map +1 -0
  33. package/dist/factory/index.d.ts +4 -0
  34. package/dist/factory/index.d.ts.map +1 -0
  35. package/dist/feeds/academic/_types.d.ts.map +1 -0
  36. package/dist/feeds/academic/index.d.ts +2 -0
  37. package/dist/feeds/academic/index.d.ts.map +1 -0
  38. package/dist/feeds/academic/slider.d.ts +4 -0
  39. package/dist/feeds/academic/slider.d.ts.map +1 -0
  40. package/dist/feeds/academic/slider.js +11 -0
  41. package/dist/feeds/academic/slider.js.map +1 -0
  42. package/dist/feeds/events/_types.d.ts.map +1 -0
  43. package/dist/feeds/events/grid.d.ts +4 -0
  44. package/dist/feeds/events/grid.d.ts.map +1 -0
  45. package/dist/feeds/events/grid.js +32 -0
  46. package/dist/feeds/events/grid.js.map +1 -0
  47. package/dist/feeds/events/grouped.d.ts +4 -0
  48. package/dist/feeds/events/grouped.d.ts.map +1 -0
  49. package/dist/feeds/events/grouped.js +337 -0
  50. package/dist/feeds/events/grouped.js.map +1 -0
  51. package/dist/feeds/events/index.d.ts +5 -0
  52. package/dist/feeds/events/index.d.ts.map +1 -0
  53. package/dist/feeds/events/list.d.ts +4 -0
  54. package/dist/feeds/events/list.d.ts.map +1 -0
  55. package/dist/feeds/events/list.js +33 -0
  56. package/dist/feeds/events/list.js.map +1 -0
  57. package/dist/feeds/events/slider.d.ts +4 -0
  58. package/dist/feeds/events/slider.d.ts.map +1 -0
  59. package/dist/feeds/events/slider.js +11 -0
  60. package/dist/feeds/events/slider.js.map +1 -0
  61. package/dist/feeds/experts/_types.d.ts +23 -0
  62. package/dist/feeds/experts/_types.d.ts.map +1 -0
  63. package/dist/feeds/experts/bio.d.ts +4 -0
  64. package/dist/feeds/experts/bio.d.ts.map +1 -0
  65. package/dist/feeds/experts/bio.js +147 -0
  66. package/dist/feeds/experts/bio.js.map +1 -0
  67. package/dist/feeds/experts/grid.d.ts +4 -0
  68. package/dist/feeds/experts/grid.d.ts.map +1 -0
  69. package/dist/feeds/experts/grid.js +37 -0
  70. package/dist/feeds/experts/grid.js.map +1 -0
  71. package/dist/feeds/experts/index.d.ts +4 -0
  72. package/dist/feeds/experts/index.d.ts.map +1 -0
  73. package/dist/feeds/experts/list.d.ts +4 -0
  74. package/dist/feeds/experts/list.d.ts.map +1 -0
  75. package/dist/feeds/experts/list.js +26 -0
  76. package/dist/feeds/experts/list.js.map +1 -0
  77. package/dist/feeds/news/_types.d.ts.map +1 -0
  78. package/dist/feeds/news/featured.d.ts +4 -0
  79. package/dist/feeds/news/featured.d.ts.map +1 -0
  80. package/dist/feeds/news/featured.js +379 -0
  81. package/dist/feeds/news/featured.js.map +1 -0
  82. package/dist/feeds/news/grid.d.ts +4 -0
  83. package/dist/feeds/news/grid.d.ts.map +1 -0
  84. package/dist/feeds/news/grid.js +37 -0
  85. package/dist/feeds/news/grid.js.map +1 -0
  86. package/dist/feeds/news/index.d.ts +4 -0
  87. package/dist/feeds/news/index.d.ts.map +1 -0
  88. package/dist/feeds/news/list.d.ts +4 -0
  89. package/dist/feeds/news/list.d.ts.map +1 -0
  90. package/dist/feeds/news/list.js +34 -0
  91. package/dist/feeds/news/list.js.map +1 -0
  92. package/dist/{utilities → helpers}/events/index.d.ts +1 -0
  93. package/dist/helpers/events/index.d.ts.map +1 -0
  94. package/dist/{utilities/events/index.mjs → helpers/events/index.js} +3 -1
  95. package/dist/helpers/events/index.js.map +1 -0
  96. package/dist/helpers/grouping/events.d.ts +14 -0
  97. package/dist/helpers/grouping/events.d.ts.map +1 -0
  98. package/dist/helpers/grouping/events.js +147 -0
  99. package/dist/helpers/grouping/events.js.map +1 -0
  100. package/dist/helpers/grouping/index.d.ts +2 -0
  101. package/dist/helpers/grouping/index.d.ts.map +1 -0
  102. package/dist/helpers/index.d.ts +5 -0
  103. package/dist/helpers/index.d.ts.map +1 -0
  104. package/dist/helpers/network/fetch.d.ts.map +1 -0
  105. package/dist/helpers/network/index.d.ts.map +1 -0
  106. package/dist/helpers/styles/index.d.ts +2 -0
  107. package/dist/helpers/styles/index.d.ts.map +1 -0
  108. package/dist/helpers/styles/shadow.d.ts +10 -0
  109. package/dist/helpers/styles/shadow.d.ts.map +1 -0
  110. package/dist/helpers/styles/shadow.js +16 -0
  111. package/dist/helpers/styles/shadow.js.map +1 -0
  112. package/dist/index.d.ts +4 -3
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +10 -8
  115. package/dist/index.js.map +1 -1
  116. package/dist/news.d.ts +1 -1
  117. package/dist/news.js +8 -8
  118. package/dist/news.js.map +1 -1
  119. package/dist/states/_types.d.ts +36 -0
  120. package/dist/states/_types.d.ts.map +1 -0
  121. package/dist/states/_types.js +12 -0
  122. package/dist/states/_types.js.map +1 -0
  123. package/dist/states/announcer.d.ts +14 -0
  124. package/dist/states/announcer.d.ts.map +1 -0
  125. package/dist/states/announcer.js +62 -0
  126. package/dist/states/announcer.js.map +1 -0
  127. package/dist/states/empty.d.ts +15 -0
  128. package/dist/states/empty.d.ts.map +1 -0
  129. package/dist/states/empty.js +104 -0
  130. package/dist/states/empty.js.map +1 -0
  131. package/dist/states/index.d.ts +6 -0
  132. package/dist/states/index.d.ts.map +1 -0
  133. package/dist/states/loading.d.ts +15 -0
  134. package/dist/states/loading.d.ts.map +1 -0
  135. package/dist/{macros/loader.mjs → states/loading.js} +71 -28
  136. package/dist/states/loading.js.map +1 -0
  137. package/dist/states/pagination.d.ts +17 -0
  138. package/dist/states/pagination.d.ts.map +1 -0
  139. package/dist/states/pagination.js +102 -0
  140. package/dist/states/pagination.js.map +1 -0
  141. package/dist/strategies/display/events.d.ts +4 -0
  142. package/dist/strategies/display/events.d.ts.map +1 -0
  143. package/dist/strategies/display/events.js +60 -0
  144. package/dist/strategies/display/events.js.map +1 -0
  145. package/dist/strategies/display/experts.d.ts +19 -0
  146. package/dist/strategies/display/experts.d.ts.map +1 -0
  147. package/dist/strategies/display/experts.js +266 -0
  148. package/dist/strategies/display/experts.js.map +1 -0
  149. package/dist/strategies/display/index.d.ts +5 -0
  150. package/dist/strategies/display/index.d.ts.map +1 -0
  151. package/dist/strategies/display/news.d.ts +4 -0
  152. package/dist/strategies/display/news.d.ts.map +1 -0
  153. package/dist/strategies/display/news.js +58 -0
  154. package/dist/strategies/display/news.js.map +1 -0
  155. package/dist/strategies/fetch/academic.d.ts +2 -0
  156. package/dist/strategies/fetch/academic.d.ts.map +1 -0
  157. package/dist/strategies/fetch/academic.js +30 -0
  158. package/dist/strategies/fetch/academic.js.map +1 -0
  159. package/dist/strategies/fetch/events.d.ts +20 -0
  160. package/dist/strategies/fetch/events.d.ts.map +1 -0
  161. package/dist/strategies/fetch/events.js +223 -0
  162. package/dist/strategies/fetch/events.js.map +1 -0
  163. package/dist/strategies/fetch/experts.d.ts +4 -0
  164. package/dist/strategies/fetch/experts.d.ts.map +1 -0
  165. package/dist/strategies/fetch/experts.js +194 -0
  166. package/dist/strategies/fetch/experts.js.map +1 -0
  167. package/dist/strategies/fetch/graphql.d.ts +13 -0
  168. package/dist/strategies/fetch/graphql.d.ts.map +1 -0
  169. package/dist/strategies/fetch/graphql.js +104 -0
  170. package/dist/strategies/fetch/graphql.js.map +1 -0
  171. package/dist/strategies/fetch/index.d.ts +10 -0
  172. package/dist/strategies/fetch/index.d.ts.map +1 -0
  173. package/dist/strategies/fetch/news.d.ts +4 -0
  174. package/dist/strategies/fetch/news.d.ts.map +1 -0
  175. package/dist/strategies/fetch/news.js +95 -0
  176. package/dist/strategies/fetch/news.js.map +1 -0
  177. package/dist/strategies/index.d.ts +7 -0
  178. package/dist/strategies/index.d.ts.map +1 -0
  179. package/dist/strategies/layout/featured.d.ts +8 -0
  180. package/dist/strategies/layout/featured.d.ts.map +1 -0
  181. package/dist/strategies/layout/grid.d.ts +7 -0
  182. package/dist/strategies/layout/grid.d.ts.map +1 -0
  183. package/dist/strategies/layout/grid.js +36 -0
  184. package/dist/strategies/layout/grid.js.map +1 -0
  185. package/dist/strategies/layout/index.d.ts +4 -0
  186. package/dist/strategies/layout/index.d.ts.map +1 -0
  187. package/dist/types/api.d.ts +34 -0
  188. package/dist/types/api.d.ts.map +1 -0
  189. package/dist/types/core.d.ts +40 -0
  190. package/dist/types/core.d.ts.map +1 -0
  191. package/dist/types/data/academic.d.ts +6 -0
  192. package/dist/types/data/academic.d.ts.map +1 -0
  193. package/dist/types/data/events.d.ts +21 -0
  194. package/dist/types/data/events.d.ts.map +1 -0
  195. package/dist/types/data/experts.d.ts +53 -0
  196. package/dist/types/data/experts.d.ts.map +1 -0
  197. package/dist/types/data/index.d.ts +5 -0
  198. package/dist/types/data/index.d.ts.map +1 -0
  199. package/dist/types/data/news.d.ts +6 -0
  200. package/dist/types/data/news.d.ts.map +1 -0
  201. package/dist/types/feeds.d.ts +35 -0
  202. package/dist/types/feeds.d.ts.map +1 -0
  203. package/dist/types/index.d.ts +5 -0
  204. package/dist/types/index.d.ts.map +1 -0
  205. package/dist/widgets/index.d.ts +2 -0
  206. package/dist/widgets/index.d.ts.map +1 -0
  207. package/dist/{macros → widgets}/slider.d.ts +1 -2
  208. package/dist/widgets/slider.d.ts.map +1 -0
  209. package/dist/{macros/slider.mjs → widgets/slider.js} +10 -10
  210. package/dist/widgets/slider.js.map +1 -0
  211. package/package.json +18 -12
  212. package/dist/academic.mjs +0 -5
  213. package/dist/academic.mjs.map +0 -1
  214. package/dist/composite/academic/_types.d.ts.map +0 -1
  215. package/dist/composite/academic/index.d.ts +0 -2
  216. package/dist/composite/academic/index.d.ts.map +0 -1
  217. package/dist/composite/academic/slider.d.ts +0 -5
  218. package/dist/composite/academic/slider.d.ts.map +0 -1
  219. package/dist/composite/academic/slider.js +0 -36
  220. package/dist/composite/academic/slider.js.map +0 -1
  221. package/dist/composite/academic/slider.mjs +0 -37
  222. package/dist/composite/academic/slider.mjs.map +0 -1
  223. package/dist/composite/events/_types.d.ts.map +0 -1
  224. package/dist/composite/events/common/data.d.ts +0 -44
  225. package/dist/composite/events/common/data.d.ts.map +0 -1
  226. package/dist/composite/events/common/data.js +0 -54
  227. package/dist/composite/events/common/data.js.map +0 -1
  228. package/dist/composite/events/common/data.mjs +0 -54
  229. package/dist/composite/events/common/data.mjs.map +0 -1
  230. package/dist/composite/events/common/display.d.ts +0 -18
  231. package/dist/composite/events/common/display.d.ts.map +0 -1
  232. package/dist/composite/events/common/display.js +0 -147
  233. package/dist/composite/events/common/display.js.map +0 -1
  234. package/dist/composite/events/common/display.mjs +0 -130
  235. package/dist/composite/events/common/display.mjs.map +0 -1
  236. package/dist/composite/events/common/fetch.d.ts +0 -24
  237. package/dist/composite/events/common/fetch.d.ts.map +0 -1
  238. package/dist/composite/events/common/fetch.js +0 -119
  239. package/dist/composite/events/common/fetch.js.map +0 -1
  240. package/dist/composite/events/common/fetch.mjs +0 -119
  241. package/dist/composite/events/common/fetch.mjs.map +0 -1
  242. package/dist/composite/events/common/queries.d.ts +0 -5
  243. package/dist/composite/events/common/queries.d.ts.map +0 -1
  244. package/dist/composite/events/common/queries.js +0 -113
  245. package/dist/composite/events/common/queries.js.map +0 -1
  246. package/dist/composite/events/common/queries.mjs +0 -113
  247. package/dist/composite/events/common/queries.mjs.map +0 -1
  248. package/dist/composite/events/grid.d.ts +0 -5
  249. package/dist/composite/events/grid.d.ts.map +0 -1
  250. package/dist/composite/events/grid.js +0 -92
  251. package/dist/composite/events/grid.js.map +0 -1
  252. package/dist/composite/events/grid.mjs +0 -93
  253. package/dist/composite/events/grid.mjs.map +0 -1
  254. package/dist/composite/events/grouped.d.ts +0 -5
  255. package/dist/composite/events/grouped.d.ts.map +0 -1
  256. package/dist/composite/events/grouped.js +0 -290
  257. package/dist/composite/events/grouped.js.map +0 -1
  258. package/dist/composite/events/grouped.mjs +0 -274
  259. package/dist/composite/events/grouped.mjs.map +0 -1
  260. package/dist/composite/events/index.d.ts +0 -5
  261. package/dist/composite/events/index.d.ts.map +0 -1
  262. package/dist/composite/events/list.d.ts +0 -5
  263. package/dist/composite/events/list.d.ts.map +0 -1
  264. package/dist/composite/events/list.js +0 -92
  265. package/dist/composite/events/list.js.map +0 -1
  266. package/dist/composite/events/list.mjs +0 -93
  267. package/dist/composite/events/list.mjs.map +0 -1
  268. package/dist/composite/events/slider.d.ts +0 -5
  269. package/dist/composite/events/slider.d.ts.map +0 -1
  270. package/dist/composite/events/slider.js +0 -37
  271. package/dist/composite/events/slider.js.map +0 -1
  272. package/dist/composite/events/slider.mjs +0 -38
  273. package/dist/composite/events/slider.mjs.map +0 -1
  274. package/dist/composite/news/_types.d.ts.map +0 -1
  275. package/dist/composite/news/common/data.d.ts +0 -47
  276. package/dist/composite/news/common/data.d.ts.map +0 -1
  277. package/dist/composite/news/common/data.js +0 -63
  278. package/dist/composite/news/common/data.js.map +0 -1
  279. package/dist/composite/news/common/data.mjs +0 -63
  280. package/dist/composite/news/common/data.mjs.map +0 -1
  281. package/dist/composite/news/common/display.d.ts +0 -17
  282. package/dist/composite/news/common/display.d.ts.map +0 -1
  283. package/dist/composite/news/common/display.js +0 -147
  284. package/dist/composite/news/common/display.js.map +0 -1
  285. package/dist/composite/news/common/display.mjs +0 -130
  286. package/dist/composite/news/common/display.mjs.map +0 -1
  287. package/dist/composite/news/common/fetch.d.ts +0 -22
  288. package/dist/composite/news/common/fetch.d.ts.map +0 -1
  289. package/dist/composite/news/common/fetch.js +0 -89
  290. package/dist/composite/news/common/fetch.js.map +0 -1
  291. package/dist/composite/news/common/fetch.mjs +0 -89
  292. package/dist/composite/news/common/fetch.mjs.map +0 -1
  293. package/dist/composite/news/common/queries.d.ts +0 -2
  294. package/dist/composite/news/common/queries.d.ts.map +0 -1
  295. package/dist/composite/news/common/queries.js +0 -37
  296. package/dist/composite/news/common/queries.js.map +0 -1
  297. package/dist/composite/news/common/queries.mjs +0 -37
  298. package/dist/composite/news/common/queries.mjs.map +0 -1
  299. package/dist/composite/news/featured.d.ts +0 -5
  300. package/dist/composite/news/featured.d.ts.map +0 -1
  301. package/dist/composite/news/featured.js +0 -184
  302. package/dist/composite/news/featured.js.map +0 -1
  303. package/dist/composite/news/featured.mjs +0 -185
  304. package/dist/composite/news/featured.mjs.map +0 -1
  305. package/dist/composite/news/grid.d.ts +0 -5
  306. package/dist/composite/news/grid.d.ts.map +0 -1
  307. package/dist/composite/news/grid.js +0 -100
  308. package/dist/composite/news/grid.js.map +0 -1
  309. package/dist/composite/news/grid.mjs +0 -101
  310. package/dist/composite/news/grid.mjs.map +0 -1
  311. package/dist/composite/news/index.d.ts +0 -4
  312. package/dist/composite/news/index.d.ts.map +0 -1
  313. package/dist/composite/news/list.d.ts +0 -5
  314. package/dist/composite/news/list.d.ts.map +0 -1
  315. package/dist/composite/news/list.js +0 -87
  316. package/dist/composite/news/list.js.map +0 -1
  317. package/dist/composite/news/list.mjs +0 -88
  318. package/dist/composite/news/list.mjs.map +0 -1
  319. package/dist/elements/asset.d.ts +0 -10
  320. package/dist/elements/asset.d.ts.map +0 -1
  321. package/dist/elements/asset.js +0 -27
  322. package/dist/elements/asset.js.map +0 -1
  323. package/dist/elements/asset.mjs +0 -27
  324. package/dist/elements/asset.mjs.map +0 -1
  325. package/dist/elements/index.d.ts +0 -4
  326. package/dist/elements/index.d.ts.map +0 -1
  327. package/dist/elements/layout.d.ts +0 -15
  328. package/dist/elements/layout.d.ts.map +0 -1
  329. package/dist/elements/layout.js +0 -113
  330. package/dist/elements/layout.js.map +0 -1
  331. package/dist/elements/layout.mjs +0 -96
  332. package/dist/elements/layout.mjs.map +0 -1
  333. package/dist/elements/text.d.ts +0 -12
  334. package/dist/elements/text.d.ts.map +0 -1
  335. package/dist/elements/text.js +0 -41
  336. package/dist/elements/text.js.map +0 -1
  337. package/dist/elements/text.mjs +0 -41
  338. package/dist/elements/text.mjs.map +0 -1
  339. package/dist/events.mjs +0 -11
  340. package/dist/events.mjs.map +0 -1
  341. package/dist/index.mjs +0 -9
  342. package/dist/index.mjs.map +0 -1
  343. package/dist/macros/aria-live.d.ts +0 -11
  344. package/dist/macros/aria-live.d.ts.map +0 -1
  345. package/dist/macros/aria-live.js +0 -25
  346. package/dist/macros/aria-live.js.map +0 -1
  347. package/dist/macros/aria-live.mjs +0 -26
  348. package/dist/macros/aria-live.mjs.map +0 -1
  349. package/dist/macros/index.d.ts +0 -6
  350. package/dist/macros/index.d.ts.map +0 -1
  351. package/dist/macros/lazy-load.d.ts +0 -16
  352. package/dist/macros/lazy-load.d.ts.map +0 -1
  353. package/dist/macros/lazy-load.js +0 -54
  354. package/dist/macros/lazy-load.js.map +0 -1
  355. package/dist/macros/lazy-load.mjs +0 -38
  356. package/dist/macros/lazy-load.mjs.map +0 -1
  357. package/dist/macros/loader.d.ts +0 -15
  358. package/dist/macros/loader.d.ts.map +0 -1
  359. package/dist/macros/loader.js +0 -128
  360. package/dist/macros/loader.js.map +0 -1
  361. package/dist/macros/loader.mjs.map +0 -1
  362. package/dist/macros/no-results.d.ts +0 -12
  363. package/dist/macros/no-results.d.ts.map +0 -1
  364. package/dist/macros/no-results.js +0 -66
  365. package/dist/macros/no-results.js.map +0 -1
  366. package/dist/macros/no-results.mjs +0 -50
  367. package/dist/macros/no-results.mjs.map +0 -1
  368. package/dist/macros/slider.d.ts.map +0 -1
  369. package/dist/macros/slider.js +0 -103
  370. package/dist/macros/slider.js.map +0 -1
  371. package/dist/macros/slider.mjs.map +0 -1
  372. package/dist/news.mjs +0 -9
  373. package/dist/news.mjs.map +0 -1
  374. package/dist/utilities/events/index.d.ts.map +0 -1
  375. package/dist/utilities/events/index.js +0 -19
  376. package/dist/utilities/events/index.js.map +0 -1
  377. package/dist/utilities/events/index.mjs.map +0 -1
  378. package/dist/utilities/index.d.ts +0 -3
  379. package/dist/utilities/index.d.ts.map +0 -1
  380. package/dist/utilities/network/fetch.d.ts.map +0 -1
  381. package/dist/utilities/network/index.d.ts.map +0 -1
  382. /package/dist/{composite → feeds}/academic/_types.d.ts +0 -0
  383. /package/dist/{composite → feeds}/events/_types.d.ts +0 -0
  384. /package/dist/{composite → feeds}/news/_types.d.ts +0 -0
  385. /package/dist/{utilities → helpers}/network/fetch.d.ts +0 -0
  386. /package/dist/{utilities → helpers}/network/index.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../source/states/loading.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,UAAU,CAAC;AA6CnE,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,kBAAuB,GAAG,YAAY,CA0FlF;AAeD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,GAAE,kBAAuB;IAO3C,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAkBlC,IAAI,IAAI,IAAI;IAmBZ,OAAO,IAAI,IAAI;IAQf,IAAI,OAAO,IAAI,WAAW,CAEzB;IAKD,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"}
@@ -1,5 +1,6 @@
1
- import * as Styles from "@universityofmaryland/web-styles-library";
2
1
  import { ElementBuilder } from "@universityofmaryland/web-builder-library";
2
+ import { token } from "@universityofmaryland/web-styles-library";
3
+ import { FeedStateEvent } from "./_types.js";
3
4
  const ID_UMD_LOADER = "umd-loader-container";
4
5
  const keyframes = `
5
6
  @keyframes loader-first-animation {
@@ -10,7 +11,7 @@ const keyframes = `
10
11
  transform: scale(1);
11
12
  }
12
13
  }
13
-
14
+
14
15
  @keyframes loader-last-animation {
15
16
  0% {
16
17
  transform: scale(1);
@@ -19,7 +20,7 @@ const keyframes = `
19
20
  transform: scale(0);
20
21
  }
21
22
  }
22
-
23
+
23
24
  @keyframes loader-middle-animation {
24
25
  0% {
25
26
  transform: translate(0, 0);
@@ -29,7 +30,8 @@ const keyframes = `
29
30
  }
30
31
  }
31
32
  `;
32
- const create = ({ isThemeDark }) => {
33
+ function createLoadingElement(config = {}) {
34
+ const { isThemeDark = false } = config;
33
35
  const defaultDotStyles = {
34
36
  position: "absolute",
35
37
  top: "50%",
@@ -37,11 +39,8 @@ const create = ({ isThemeDark }) => {
37
39
  width: "8px",
38
40
  height: "8px",
39
41
  borderRadius: "50%",
40
- background: `${Styles.token.color.gray.dark}`,
41
- animationTimingFunction: "cubic-bezier(0, 1, 1, 0)",
42
- ...isThemeDark && {
43
- background: `${Styles.token.color.gray.light}`
44
- }
42
+ background: isThemeDark ? token.color.gray.light : token.color.gray.dark,
43
+ animationTimingFunction: "cubic-bezier(0, 1, 1, 0)"
45
44
  };
46
45
  const innerElmOne = new ElementBuilder().withClassName(`${ID_UMD_LOADER}-one`).withStyles({
47
46
  element: {
@@ -89,24 +88,68 @@ const create = ({ isThemeDark }) => {
89
88
  }).build();
90
89
  composite.styles += keyframes;
91
90
  return composite;
92
- };
93
- const remove = ({ container }) => {
94
- const loader2 = container.querySelector(`.${ID_UMD_LOADER}`);
95
- if (loader2) loader2.remove();
96
- };
97
- const display = ({
98
- container,
99
- isThemeDark
100
- }) => {
101
- const loader2 = create({ isThemeDark });
102
- container.appendChild(loader2.element);
103
- };
104
- const loader = {
105
- create,
106
- display,
107
- remove
108
- };
91
+ }
92
+ class LoadingState {
93
+ constructor(config = {}) {
94
+ this.container = null;
95
+ this.isVisible = false;
96
+ this.model = createLoadingElement(config);
97
+ }
98
+ /**
99
+ * Show the loading spinner in a container
100
+ */
101
+ show(container) {
102
+ if (!this.isVisible) {
103
+ this.container = container;
104
+ container.appendChild(this.model.element);
105
+ this.isVisible = true;
106
+ container.dispatchEvent(
107
+ new CustomEvent(FeedStateEvent.LOADING_START, {
108
+ bubbles: true,
109
+ detail: { timestamp: Date.now() }
110
+ })
111
+ );
112
+ }
113
+ }
114
+ /**
115
+ * Hide and remove the loading spinner
116
+ */
117
+ hide() {
118
+ if (this.isVisible && this.model.element.parentNode) {
119
+ this.model.element.remove();
120
+ this.isVisible = false;
121
+ if (this.container) {
122
+ this.container.dispatchEvent(
123
+ new CustomEvent(FeedStateEvent.LOADING_END, {
124
+ bubbles: true,
125
+ detail: { timestamp: Date.now() }
126
+ })
127
+ );
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * Cleanup and remove the loading spinner
133
+ */
134
+ destroy() {
135
+ this.hide();
136
+ this.container = null;
137
+ }
138
+ /**
139
+ * Get the loading spinner element
140
+ */
141
+ get element() {
142
+ return this.model.element;
143
+ }
144
+ /**
145
+ * Get the loading spinner styles
146
+ */
147
+ get styles() {
148
+ return this.model.styles;
149
+ }
150
+ }
109
151
  export {
110
- loader as default
152
+ LoadingState,
153
+ createLoadingElement
111
154
  };
112
- //# sourceMappingURL=loader.mjs.map
155
+ //# sourceMappingURL=loading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.js","sources":["../../source/states/loading.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { token } from '@universityofmaryland/web-styles-library';\n\nimport { type ElementModel } from '../_types';\nimport { type LoadingStateConfig, FeedStateEvent } from './_types';\n\nconst ID_UMD_LOADER = 'umd-loader-container';\n\nconst keyframes = `\n @keyframes loader-first-animation {\n 0% {\n transform: scale(0);\n }\n 100% {\n transform: scale(1);\n }\n }\n\n @keyframes loader-last-animation {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0);\n }\n }\n\n @keyframes loader-middle-animation {\n 0% {\n transform: translate(0, 0);\n }\n 100% {\n transform: translate(24px, 0);\n }\n }\n`;\n\n/**\n * Creates a loading spinner element model\n *\n * @param config - Loading state configuration\n * @returns ElementModel with loading spinner\n *\n * @example\n * ```typescript\n * const loading = createLoadingElement({ isThemeDark: false });\n * container.appendChild(loading.element);\n * ```\n */\nexport function createLoadingElement(config: LoadingStateConfig = {}): ElementModel {\n const { isThemeDark = false } = config;\n\n const defaultDotStyles = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: isThemeDark ? token.color.gray.light : token.color.gray.dark,\n animationTimingFunction: 'cubic-bezier(0, 1, 1, 0)',\n };\n\n const innerElmOne = new ElementBuilder()\n .withClassName(`${ID_UMD_LOADER}-one`)\n .withStyles({\n element: {\n ...defaultDotStyles,\n left: '5px',\n animation: 'loader-first-animation 0.6s infinite',\n },\n })\n .build();\n\n const innerElmTwo = new ElementBuilder()\n .withClassName(`${ID_UMD_LOADER}-two`)\n .withStyles({\n element: {\n ...defaultDotStyles,\n left: '5px',\n animation: 'loader-middle-animation 0.6s infinite',\n },\n })\n .build();\n\n const innerElmThree = new ElementBuilder()\n .withClassName(`${ID_UMD_LOADER}-three`)\n .withStyles({\n element: {\n ...defaultDotStyles,\n left: '24px',\n animation: 'loader-middle-animation 0.6s infinite',\n },\n })\n .build();\n\n const innerElmFour = new ElementBuilder()\n .withClassName(`${ID_UMD_LOADER}-four`)\n .withStyles({\n element: {\n ...defaultDotStyles,\n left: '45px',\n animation: 'loader-last-animation 0.6s infinite',\n },\n })\n .build();\n\n const wrapper = new ElementBuilder()\n .withClassName(`${ID_UMD_LOADER}-wrapper`)\n .withChild(innerElmOne)\n .withChild(innerElmTwo)\n .withChild(innerElmThree)\n .withChild(innerElmFour)\n .withStyles({\n element: {\n position: 'relative',\n },\n })\n .build();\n\n const composite = new ElementBuilder()\n .withClassName(ID_UMD_LOADER)\n .withChild(wrapper)\n .withStyles({\n element: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '10px 0',\n minHeight: '40px',\n position: 'relative',\n gridColumn: '1 / -1',\n },\n })\n .build();\n\n composite.styles += keyframes;\n\n return composite;\n}\n\n/**\n * Loading state manager class\n *\n * Manages the lifecycle of a loading spinner with show/hide functionality.\n *\n * @example\n * ```typescript\n * const loading = new LoadingState({ isThemeDark: false });\n * loading.show(container);\n * // ... async operation\n * loading.hide();\n * ```\n */\nexport class LoadingState {\n private model: ElementModel;\n private container: HTMLElement | null = null;\n private isVisible: boolean = false;\n\n constructor(config: LoadingStateConfig = {}) {\n this.model = createLoadingElement(config);\n }\n\n /**\n * Show the loading spinner in a container\n */\n show(container: HTMLElement): void {\n if (!this.isVisible) {\n this.container = container;\n container.appendChild(this.model.element);\n this.isVisible = true;\n\n container.dispatchEvent(\n new CustomEvent(FeedStateEvent.LOADING_START, {\n bubbles: true,\n detail: { timestamp: Date.now() },\n })\n );\n }\n }\n\n /**\n * Hide and remove the loading spinner\n */\n hide(): void {\n if (this.isVisible && this.model.element.parentNode) {\n this.model.element.remove();\n this.isVisible = false;\n\n if (this.container) {\n this.container.dispatchEvent(\n new CustomEvent(FeedStateEvent.LOADING_END, {\n bubbles: true,\n detail: { timestamp: Date.now() },\n })\n );\n }\n }\n }\n\n /**\n * Cleanup and remove the loading spinner\n */\n destroy(): void {\n this.hide();\n this.container = null;\n }\n\n /**\n * Get the loading spinner element\n */\n get element(): HTMLElement {\n return this.model.element;\n }\n\n /**\n * Get the loading spinner styles\n */\n get styles(): string {\n return this.model.styles;\n }\n}\n\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ElementModel } from '../_types';
2
+ import { PaginationStateConfig } from './_types';
3
+ export declare function createPaginationElement(config: PaginationStateConfig): ElementModel | undefined;
4
+ export declare class PaginationState {
5
+ private config;
6
+ private model;
7
+ private container;
8
+ constructor(config: PaginationStateConfig);
9
+ render(container: HTMLElement): ElementModel | undefined;
10
+ remove(): void;
11
+ updateState(offset: number, totalEntries: number): void;
12
+ hasMore(): boolean;
13
+ destroy(): void;
14
+ get element(): HTMLElement | undefined;
15
+ get styles(): string | undefined;
16
+ }
17
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../source/states/pagination.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,qBAAqB,EAAkB,MAAM,UAAU,CAAC;AAsBtE,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,qBAAqB,GAC5B,YAAY,GAAG,SAAS,CAuC1B;AAyBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,SAAS,CAA4B;gBAEjC,MAAM,EAAE,qBAAqB;IASzC,MAAM,CAAC,SAAS,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS;IAWxD,MAAM,IAAI,IAAI;IAUd,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAmBvD,OAAO,IAAI,OAAO;IAQlB,OAAO,IAAI,IAAI;IAQf,IAAI,OAAO,IAAI,WAAW,GAAG,SAAS,CAErC;IAKD,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;CACF"}
@@ -0,0 +1,102 @@
1
+ import * as Styles from "@universityofmaryland/web-styles-library";
2
+ import { ElementBuilder } from "@universityofmaryland/web-builder-library";
3
+ import { FeedStateEvent } from "./_types.js";
4
+ function createPaginationElement(config) {
5
+ const { callback, isLazyLoad, totalEntries, offset } = config;
6
+ if (!isLazyLoad) return;
7
+ if (!totalEntries) return;
8
+ if (!offset) return;
9
+ if (!callback) return;
10
+ if (offset >= totalEntries) return;
11
+ const button = document.createElement("button");
12
+ button.textContent = "Load more";
13
+ button.addEventListener("click", () => {
14
+ callback();
15
+ button.dispatchEvent(
16
+ new CustomEvent(FeedStateEvent.PAGINATION_LOADED, {
17
+ bubbles: true,
18
+ detail: {
19
+ offset,
20
+ totalEntries,
21
+ timestamp: Date.now()
22
+ }
23
+ })
24
+ );
25
+ });
26
+ const ctaButton = new ElementBuilder(button).styled(Styles.element.action.outline.normal).build();
27
+ return new ElementBuilder().styled(Styles.layout.alignment.block.center).withChild(ctaButton).withStyles({
28
+ element: {
29
+ marginTop: `${Styles.token.spacing.lg}`
30
+ }
31
+ }).build();
32
+ }
33
+ class PaginationState {
34
+ constructor(config) {
35
+ this.container = null;
36
+ this.config = config;
37
+ this.model = createPaginationElement(config);
38
+ }
39
+ /**
40
+ * Render the pagination button if applicable
41
+ * @returns ElementModel if rendered, undefined otherwise
42
+ */
43
+ render(container) {
44
+ if (this.model) {
45
+ this.container = container;
46
+ container.appendChild(this.model.element);
47
+ }
48
+ return this.model;
49
+ }
50
+ /**
51
+ * Remove the pagination button from DOM
52
+ */
53
+ remove() {
54
+ if (this.model && this.model.element.parentNode) {
55
+ this.model.element.remove();
56
+ }
57
+ }
58
+ /**
59
+ * Update pagination state with new offset and total
60
+ * Re-creates button if needed
61
+ */
62
+ updateState(offset, totalEntries) {
63
+ this.config.offset = offset;
64
+ this.config.totalEntries = totalEntries;
65
+ this.remove();
66
+ this.model = createPaginationElement(this.config);
67
+ if (this.container && this.model) {
68
+ this.container.appendChild(this.model.element);
69
+ }
70
+ }
71
+ /**
72
+ * Check if more items are available to load
73
+ */
74
+ hasMore() {
75
+ const { offset, totalEntries } = this.config;
76
+ return !!(totalEntries && offset < totalEntries);
77
+ }
78
+ /**
79
+ * Cleanup and remove pagination
80
+ */
81
+ destroy() {
82
+ this.remove();
83
+ this.container = null;
84
+ }
85
+ /**
86
+ * Get the pagination element if it exists
87
+ */
88
+ get element() {
89
+ return this.model?.element;
90
+ }
91
+ /**
92
+ * Get the pagination styles if element exists
93
+ */
94
+ get styles() {
95
+ return this.model?.styles;
96
+ }
97
+ }
98
+ export {
99
+ PaginationState,
100
+ createPaginationElement
101
+ };
102
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sources":["../../source/states/pagination.ts"],"sourcesContent":["import * as Styles from '@universityofmaryland/web-styles-library';\nimport { ElementBuilder } from '@universityofmaryland/web-builder-library';\n\nimport { type ElementModel } from '../_types';\nimport { type PaginationStateConfig, FeedStateEvent } from './_types';\n\n/**\n * Creates a pagination \"Load more\" button element\n *\n * @param config - Pagination state configuration\n * @returns ElementModel with load more button, or undefined if pagination not needed\n *\n * @example\n * ```typescript\n * const pagination = createPaginationElement({\n * callback: () => loadMoreItems(),\n * isThemeDark: false,\n * isLazyLoad: true,\n * totalEntries: 50,\n * offset: 10\n * });\n * if (pagination) {\n * container.appendChild(pagination.element);\n * }\n * ```\n */\nexport function createPaginationElement(\n config: PaginationStateConfig\n): ElementModel | undefined {\n const { callback, isLazyLoad, totalEntries, offset } = config;\n\n // Guard clauses for when pagination is not needed\n if (!isLazyLoad) return;\n if (!totalEntries) return;\n if (!offset) return;\n if (!callback) return;\n if (offset >= totalEntries) return;\n\n const button = document.createElement('button');\n button.textContent = 'Load more'; // Use textContent for security\n button.addEventListener('click', () => {\n callback();\n button.dispatchEvent(\n new CustomEvent(FeedStateEvent.PAGINATION_LOADED, {\n bubbles: true,\n detail: {\n offset,\n totalEntries,\n timestamp: Date.now(),\n },\n })\n );\n });\n\n const ctaButton = new ElementBuilder(button)\n .styled(Styles.element.action.outline.normal)\n .build();\n\n return new ElementBuilder()\n .styled(Styles.layout.alignment.block.center)\n .withChild(ctaButton)\n .withStyles({\n element: {\n marginTop: `${Styles.token.spacing.lg}`,\n },\n })\n .build();\n}\n\n/**\n * Pagination state manager class\n *\n * Manages a \"Load more\" button for paginated feed content.\n *\n * @example\n * ```typescript\n * const pagination = new PaginationState({\n * callback: () => loadMore(),\n * isLazyLoad: true,\n * totalEntries: 50,\n * offset: 10\n * });\n *\n * const button = pagination.render(container);\n * if (button) {\n * // Pagination was rendered\n * }\n *\n * // Later, update state\n * pagination.updateState(20, 50);\n * ```\n */\nexport class PaginationState {\n private config: PaginationStateConfig;\n private model: ElementModel | undefined;\n private container: HTMLElement | null = null;\n\n constructor(config: PaginationStateConfig) {\n this.config = config;\n this.model = createPaginationElement(config);\n }\n\n /**\n * Render the pagination button if applicable\n * @returns ElementModel if rendered, undefined otherwise\n */\n render(container: HTMLElement): ElementModel | undefined {\n if (this.model) {\n this.container = container;\n container.appendChild(this.model.element);\n }\n return this.model;\n }\n\n /**\n * Remove the pagination button from DOM\n */\n remove(): void {\n if (this.model && this.model.element.parentNode) {\n this.model.element.remove();\n }\n }\n\n /**\n * Update pagination state with new offset and total\n * Re-creates button if needed\n */\n updateState(offset: number, totalEntries: number): void {\n this.config.offset = offset;\n this.config.totalEntries = totalEntries;\n\n // Remove old button\n this.remove();\n\n // Create new button if still needed\n this.model = createPaginationElement(this.config);\n\n // Re-render if we have a container\n if (this.container && this.model) {\n this.container.appendChild(this.model.element);\n }\n }\n\n /**\n * Check if more items are available to load\n */\n hasMore(): boolean {\n const { offset, totalEntries } = this.config;\n return !!(totalEntries && offset < totalEntries);\n }\n\n /**\n * Cleanup and remove pagination\n */\n destroy(): void {\n this.remove();\n this.container = null;\n }\n\n /**\n * Get the pagination element if it exists\n */\n get element(): HTMLElement | undefined {\n return this.model?.element;\n }\n\n /**\n * Get the pagination styles if element exists\n */\n get styles(): string | undefined {\n return this.model?.styles;\n }\n}\n\n"],"names":[],"mappings":";;;AA0BO,SAAS,wBACd,QAC0B;AAC1B,QAAM,EAAE,UAAU,YAAY,cAAc,WAAW;AAGvD,MAAI,CAAC,WAAY;AACjB,MAAI,CAAC,aAAc;AACnB,MAAI,CAAC,OAAQ;AACb,MAAI,CAAC,SAAU;AACf,MAAI,UAAU,aAAc;AAE5B,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,cAAc;AACrB,SAAO,iBAAiB,SAAS,MAAM;AACrC,aAAA;AACA,WAAO;AAAA,MACL,IAAI,YAAY,eAAe,mBAAmB;AAAA,QAChD,SAAS;AAAA,QACT,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA,WAAW,KAAK,IAAA;AAAA,QAAI;AAAA,MACtB,CACD;AAAA,IAAA;AAAA,EAEL,CAAC;AAED,QAAM,YAAY,IAAI,eAAe,MAAM,EACxC,OAAO,OAAO,QAAQ,OAAO,QAAQ,MAAM,EAC3C,MAAA;AAEH,SAAO,IAAI,eAAA,EACR,OAAO,OAAO,OAAO,UAAU,MAAM,MAAM,EAC3C,UAAU,SAAS,EACnB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,WAAW,GAAG,OAAO,MAAM,QAAQ,EAAE;AAAA,IAAA;AAAA,EACvC,CACD,EACA,MAAA;AACL;AAyBO,MAAM,gBAAgB;AAAA,EAK3B,YAAY,QAA+B;AAF3C,SAAQ,YAAgC;AAGtC,SAAK,SAAS;AACd,SAAK,QAAQ,wBAAwB,MAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAkD;AACvD,QAAI,KAAK,OAAO;AACd,WAAK,YAAY;AACjB,gBAAU,YAAY,KAAK,MAAM,OAAO;AAAA,IAC1C;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,QAAI,KAAK,SAAS,KAAK,MAAM,QAAQ,YAAY;AAC/C,WAAK,MAAM,QAAQ,OAAA;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,QAAgB,cAA4B;AACtD,SAAK,OAAO,SAAS;AACrB,SAAK,OAAO,eAAe;AAG3B,SAAK,OAAA;AAGL,SAAK,QAAQ,wBAAwB,KAAK,MAAM;AAGhD,QAAI,KAAK,aAAa,KAAK,OAAO;AAChC,WAAK,UAAU,YAAY,KAAK,MAAM,OAAO;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB;AACjB,UAAM,EAAE,QAAQ,aAAA,IAAiB,KAAK;AACtC,WAAO,CAAC,EAAE,gBAAgB,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,OAAA;AACL,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAmC;AACrC,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAA6B;AAC/B,WAAO,KAAK,OAAO;AAAA,EACrB;AACF;"}
@@ -0,0 +1,4 @@
1
+ import { DisplayStrategy } from '../../factory/core/types';
2
+ import { EventEntry } from '../../types/data';
3
+ export declare const eventsDisplayStrategy: DisplayStrategy<EventEntry>;
4
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../source/strategies/display/events.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,eAAe,EAAsB,MAAM,0BAA0B,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAqBxC,eAAO,MAAM,qBAAqB,EAAE,eAAe,CAAC,UAAU,CA4E7D,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { card } from "@universityofmaryland/web-elements-library/composite";
2
+ import { events } from "@universityofmaryland/web-elements-library/atomic";
3
+ import { createTextWithLink, createTextContainer, createImageOrLinkedImage } from "@universityofmaryland/web-utilities-library/elements";
4
+ const eventsDisplayStrategy = {
5
+ layoutType: "grid",
6
+ mapEntryToCard: (entry, options) => {
7
+ const {
8
+ isThemeDark = false,
9
+ isTransparent = false,
10
+ isAligned = false,
11
+ imageConfig,
12
+ cardType = "block"
13
+ } = options;
14
+ const headline = createTextWithLink({
15
+ text: entry.title,
16
+ url: entry.url
17
+ });
18
+ const text = createTextContainer({
19
+ text: entry.summary,
20
+ allowHTML: true
21
+ });
22
+ const eventMeta = events.meta({
23
+ ...entry,
24
+ isThemeDark
25
+ });
26
+ const image = imageConfig ? createImageOrLinkedImage(imageConfig(entry)) : void 0;
27
+ const dateSign = cardType === "list" ? events.sign({
28
+ startMonth: entry.startMonth,
29
+ startDay: entry.startDay,
30
+ endMonth: entry.endMonth,
31
+ endDay: entry.endDay,
32
+ isThemeDark,
33
+ isLargeSize: true
34
+ }) : void 0;
35
+ if (cardType === "list") {
36
+ return card.list({
37
+ headline,
38
+ text,
39
+ eventMeta,
40
+ dateSign,
41
+ image,
42
+ isAligned,
43
+ isThemeDark
44
+ });
45
+ }
46
+ return card.block({
47
+ headline,
48
+ text,
49
+ eventMeta,
50
+ image,
51
+ isAligned,
52
+ isTransparent,
53
+ isThemeDark
54
+ });
55
+ }
56
+ };
57
+ export {
58
+ eventsDisplayStrategy
59
+ };
60
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sources":["../../../source/strategies/display/events.ts"],"sourcesContent":["/**\n * Events Display Strategy\n *\n * Strategy for displaying event entries as cards.\n * Maps event data to card elements with event-specific metadata.\n *\n * @module strategies/display/events\n */\n\nimport { card } from '@universityofmaryland/web-elements-library/composite';\nimport { events as eventElements } from '@universityofmaryland/web-elements-library/atomic';\nimport {\n createTextWithLink,\n createTextContainer,\n createImageOrLinkedImage,\n} from '@universityofmaryland/web-utilities-library/elements';\nimport { DisplayStrategy, CardMappingOptions } from '../../factory/core/types';\nimport { ElementModel } from '../../_types';\nimport { EventEntry } from 'types/data';\n\n/**\n * Events display strategy\n *\n * Maps event entries to card elements with event metadata.\n * Supports both block and list card layouts.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * displayStrategy: eventsDisplayStrategy,\n * imageConfig: (entry) => ({\n * imageUrl: entry.image[0].url,\n * altText: entry.image[0].altText || 'Event Image',\n * linkUrl: entry.url,\n * }),\n * // ...\n * });\n * ```\n */\nexport const eventsDisplayStrategy: DisplayStrategy<EventEntry> = {\n layoutType: 'grid',\n\n mapEntryToCard: (\n entry: EventEntry,\n options: CardMappingOptions,\n ): ElementModel => {\n const {\n isThemeDark = false,\n isTransparent = false,\n isAligned = false,\n imageConfig,\n cardType = 'block',\n } = options;\n\n // Create headline\n const headline = createTextWithLink({\n text: entry.title,\n url: entry.url,\n });\n\n // Create summary text\n const text = createTextContainer({\n text: entry.summary,\n allowHTML: true,\n });\n\n // Create event metadata\n // Pass all entry data to events.meta() - it will handle missing fields gracefully\n const eventMeta = eventElements.meta({\n ...entry,\n isThemeDark,\n } as any);\n\n // Create image (if imageConfig provided)\n const image = imageConfig\n ? createImageOrLinkedImage(imageConfig(entry))\n : undefined;\n\n // Create date sign for list layout\n const dateSign =\n cardType === 'list'\n ? eventElements.sign({\n startMonth: entry.startMonth,\n startDay: entry.startDay,\n endMonth: entry.endMonth,\n endDay: entry.endDay,\n isThemeDark,\n isLargeSize: true,\n })\n : undefined;\n\n // Create card based on type\n if (cardType === 'list') {\n return card.list({\n headline,\n text,\n eventMeta,\n dateSign,\n image,\n isAligned,\n isThemeDark,\n });\n }\n\n // Default to block card\n return card.block({\n headline,\n text,\n eventMeta,\n image,\n isAligned,\n isTransparent,\n isThemeDark,\n });\n },\n};\n"],"names":["eventElements"],"mappings":";;;AAuCO,MAAM,wBAAqD;AAAA,EAChE,YAAY;AAAA,EAEZ,gBAAgB,CACd,OACA,YACiB;AACjB,UAAM;AAAA,MACJ,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ;AAAA,MACA,WAAW;AAAA,IAAA,IACT;AAGJ,UAAM,WAAW,mBAAmB;AAAA,MAClC,MAAM,MAAM;AAAA,MACZ,KAAK,MAAM;AAAA,IAAA,CACZ;AAGD,UAAM,OAAO,oBAAoB;AAAA,MAC/B,MAAM,MAAM;AAAA,MACZ,WAAW;AAAA,IAAA,CACZ;AAID,UAAM,YAAYA,OAAc,KAAK;AAAA,MACnC,GAAG;AAAA,MACH;AAAA,IAAA,CACM;AAGR,UAAM,QAAQ,cACV,yBAAyB,YAAY,KAAK,CAAC,IAC3C;AAGJ,UAAM,WACJ,aAAa,SACTA,OAAc,KAAK;AAAA,MACjB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM;AAAA,MACd;AAAA,MACA,aAAa;AAAA,IAAA,CACd,IACD;AAGN,QAAI,aAAa,QAAQ;AACvB,aAAO,KAAK,KAAK;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAGA,WAAO,KAAK,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AACF;"}
@@ -0,0 +1,19 @@
1
+ import { DisplayStrategy } from '../../factory/core/types';
2
+ import { ExpertEntry } from '../../types/data';
3
+ export declare const buildFullName: (entry: ExpertEntry) => string;
4
+ export declare const mapExpertToBioProps: (entry: ExpertEntry, displayType: "small" | "full", isThemeDark?: boolean) => {
5
+ name: HTMLElement | null;
6
+ pronouns: HTMLElement | null;
7
+ job: HTMLElement | null;
8
+ association: HTMLElement | null;
9
+ email: HTMLElement | null;
10
+ linkedin: HTMLElement | null;
11
+ phone: null;
12
+ address: null;
13
+ additionalContact: null;
14
+ image: HTMLAnchorElement | HTMLImageElement | null;
15
+ description: HTMLElement | null;
16
+ isThemeDark: boolean;
17
+ };
18
+ export declare const expertsDisplayStrategy: DisplayStrategy<ExpertEntry>;
19
+ //# sourceMappingURL=experts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experts.d.ts","sourceRoot":"","sources":["../../../source/strategies/display/experts.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,eAAe,EAAsB,MAAM,0BAA0B,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqFzC,eAAO,MAAM,aAAa,GAAI,OAAO,WAAW,KAAG,MAUlD,CAAC;AAqZF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,WAAW,EAClB,aAAa,OAAO,GAAG,MAAM,EAC7B,cAAa,OAAe;;;;;;;;;;;;;CAmC7B,CAAC;AAqBF,eAAO,MAAM,sBAAsB,EAAE,eAAe,CAAC,WAAW,CAwB/D,CAAC"}
@@ -0,0 +1,266 @@
1
+ import { card, person } from "@universityofmaryland/web-elements-library/composite";
2
+ import { createTextWithLink, createTextContainer, createImageOrLinkedImage } from "@universityofmaryland/web-utilities-library/elements";
3
+ const CONTACT_CONFIGS = [
4
+ {
5
+ key: "email",
6
+ label: () => "Email",
7
+ url: (value) => `mailto:${value}`
8
+ },
9
+ {
10
+ key: "website",
11
+ label: (value) => value,
12
+ url: (value) => value
13
+ },
14
+ {
15
+ key: "linkedin",
16
+ label: (value) => value,
17
+ url: (value) => value
18
+ },
19
+ {
20
+ key: "twitter",
21
+ label: (value) => value,
22
+ url: (value) => value
23
+ }
24
+ ];
25
+ const buildFullName = (entry) => {
26
+ const parts = [
27
+ entry.prefix,
28
+ entry.firstName,
29
+ entry.middleName,
30
+ entry.lastName,
31
+ entry.suffix
32
+ ].filter(Boolean);
33
+ return parts.join(" ");
34
+ };
35
+ const buildProfileUrl = (entry) => {
36
+ return `https://umdrightnow.umd.edu/expert/${entry.slug}`;
37
+ };
38
+ const extractPrimaryJobTitle = (entry) => {
39
+ return entry.organizations?.[0]?.jobs?.[0]?.title || null;
40
+ };
41
+ const extractPrimaryAssociation = (entry) => {
42
+ const campusUnit = entry.organizations?.[0]?.jobs?.[0]?.campusUnits?.[0];
43
+ if (!campusUnit) return null;
44
+ return {
45
+ title: campusUnit.title,
46
+ url: campusUnit.link?.url
47
+ };
48
+ };
49
+ const extractImageData = (entry, fullName) => {
50
+ const headshotUrl = entry.headshot?.[0]?.url;
51
+ if (!headshotUrl) return null;
52
+ return {
53
+ url: headshotUrl,
54
+ altText: fullName
55
+ };
56
+ };
57
+ const extractContactData = (entry) => {
58
+ return {
59
+ email: entry.email || null,
60
+ website: entry.website || null,
61
+ linkedin: entry.linkedin || null,
62
+ twitter: entry.twitter || null
63
+ };
64
+ };
65
+ const extractDescription = (entry, displayType) => {
66
+ return entry.summary?.html || null;
67
+ };
68
+ const extractPronouns = (entry) => {
69
+ return entry.pronouns || null;
70
+ };
71
+ const createNameElement = (fullName, url, containerTag) => {
72
+ return createTextWithLink({
73
+ text: fullName,
74
+ url,
75
+ containerTag
76
+ });
77
+ };
78
+ const createJobElement = (jobTitle) => {
79
+ if (!jobTitle) return null;
80
+ return createTextContainer({ text: jobTitle });
81
+ };
82
+ const createAssociationElement = (association) => {
83
+ if (!association) return null;
84
+ if (association.url) {
85
+ return createTextWithLink({
86
+ text: association.title,
87
+ url: association.url
88
+ });
89
+ }
90
+ return createTextContainer({ text: association.title });
91
+ };
92
+ const createImageElement = (imageData, linkUrl, linkLabel) => {
93
+ if (!imageData) return null;
94
+ return createImageOrLinkedImage({
95
+ imageUrl: imageData.url,
96
+ altText: imageData.altText,
97
+ linkUrl,
98
+ linkLabel
99
+ });
100
+ };
101
+ const createDescriptionElement = (description) => {
102
+ if (!description) return null;
103
+ return createTextContainer({ text: description, allowHTML: true });
104
+ };
105
+ const createPronounsElement = (pronouns) => {
106
+ if (!pronouns) return null;
107
+ return createTextContainer({ text: pronouns });
108
+ };
109
+ const createContactElements = (contactData) => {
110
+ return CONTACT_CONFIGS.reduce(
111
+ (elements, config) => {
112
+ const value = contactData[config.key];
113
+ if (!value) return elements;
114
+ const element = createTextWithLink({
115
+ text: config.label(value),
116
+ url: config.url(value)
117
+ });
118
+ elements[config.key] = element;
119
+ return elements;
120
+ },
121
+ {}
122
+ );
123
+ };
124
+ const createBlockCardProps = (entry, options) => {
125
+ const { isThemeDark = false } = options;
126
+ const fullName = buildFullName(entry);
127
+ const profileUrl = buildProfileUrl(entry);
128
+ const jobTitle = extractPrimaryJobTitle(entry);
129
+ const association = extractPrimaryAssociation(entry);
130
+ const imageData = extractImageData(entry, fullName);
131
+ const pronouns = extractPronouns(entry);
132
+ const name = createNameElement(fullName, profileUrl);
133
+ const job = createJobElement(jobTitle);
134
+ const associationElement = createAssociationElement(association);
135
+ const image = createImageElement(imageData, profileUrl, `View profile for ${fullName}`);
136
+ const pronounsElement = createPronounsElement(pronouns);
137
+ return person.block({
138
+ name,
139
+ pronouns: pronounsElement,
140
+ job,
141
+ association: associationElement,
142
+ image,
143
+ isThemeDark
144
+ });
145
+ };
146
+ const createListCardProps = (entry, options) => {
147
+ const { isThemeDark = false } = options;
148
+ const fullName = buildFullName(entry);
149
+ const profileUrl = buildProfileUrl(entry);
150
+ const jobTitle = extractPrimaryJobTitle(entry);
151
+ const association = extractPrimaryAssociation(entry);
152
+ const imageData = extractImageData(entry, fullName);
153
+ const pronouns = extractPronouns(entry);
154
+ const name = createNameElement(fullName, profileUrl);
155
+ const job = createJobElement(jobTitle);
156
+ const associationElement = createAssociationElement(association);
157
+ const image = createImageElement(imageData, profileUrl, `View profile for ${fullName}`);
158
+ const pronounsElement = createPronounsElement(pronouns);
159
+ return person.list({
160
+ name,
161
+ pronouns: pronounsElement,
162
+ job,
163
+ association: associationElement,
164
+ image,
165
+ isThemeDark
166
+ });
167
+ };
168
+ const createTabularCardProps = (entry, options) => {
169
+ const { isThemeDark = false } = options;
170
+ const fullName = buildFullName(entry);
171
+ const profileUrl = buildProfileUrl(entry);
172
+ const jobTitle = extractPrimaryJobTitle(entry);
173
+ const association = extractPrimaryAssociation(entry);
174
+ const imageData = extractImageData(entry, fullName);
175
+ const contactData = extractContactData(entry);
176
+ const pronouns = extractPronouns(entry);
177
+ const name = createNameElement(fullName, profileUrl);
178
+ const job = createJobElement(jobTitle);
179
+ const associationElement = createAssociationElement(association);
180
+ const image = createImageElement(imageData, profileUrl, `View profile for ${fullName}`);
181
+ const contactElements = createContactElements(contactData);
182
+ const pronounsElement = createPronounsElement(pronouns);
183
+ return person.tabular({
184
+ name,
185
+ pronouns: pronounsElement,
186
+ job,
187
+ association: associationElement,
188
+ image,
189
+ ...contactElements,
190
+ isThemeDark
191
+ });
192
+ };
193
+ const createOverlayCardProps = (entry, options) => {
194
+ const { isThemeDark = false } = options;
195
+ const fullName = buildFullName(entry);
196
+ const profileUrl = buildProfileUrl(entry);
197
+ const jobTitle = extractPrimaryJobTitle(entry);
198
+ const imageData = extractImageData(entry, fullName);
199
+ const headline = createNameElement(fullName, profileUrl);
200
+ const text = createJobElement(jobTitle);
201
+ const backgroundImage = createImageElement(
202
+ imageData,
203
+ profileUrl,
204
+ `View profile for ${fullName}`
205
+ );
206
+ return card.overlay.image({
207
+ headline,
208
+ text,
209
+ backgroundImage,
210
+ isThemeDark
211
+ });
212
+ };
213
+ const mapExpertToBioProps = (entry, displayType, isThemeDark = false) => {
214
+ const fullName = buildFullName(entry);
215
+ const profileUrl = buildProfileUrl(entry);
216
+ const jobTitle = extractPrimaryJobTitle(entry);
217
+ const association = extractPrimaryAssociation(entry);
218
+ const imageData = extractImageData(entry, fullName);
219
+ const contactData = extractContactData(entry);
220
+ const description = extractDescription(entry);
221
+ const pronouns = extractPronouns(entry);
222
+ const name = createNameElement(fullName, profileUrl, "h1");
223
+ const job = createJobElement(jobTitle);
224
+ const associationElement = createAssociationElement(association);
225
+ const image = createImageElement(imageData);
226
+ const descriptionElement = createDescriptionElement(description);
227
+ const contactElements = createContactElements(contactData);
228
+ const pronounsElement = createPronounsElement(pronouns);
229
+ return {
230
+ name,
231
+ pronouns: pronounsElement,
232
+ job,
233
+ association: associationElement,
234
+ email: contactElements.email || null,
235
+ linkedin: contactElements.linkedin || null,
236
+ phone: null,
237
+ address: null,
238
+ additionalContact: null,
239
+ image,
240
+ description: descriptionElement,
241
+ isThemeDark
242
+ };
243
+ };
244
+ const expertsDisplayStrategy = {
245
+ layoutType: "list",
246
+ mapEntryToCard: (entry, options) => {
247
+ const { isOverlay = false, cardType = "block" } = options;
248
+ if (isOverlay && entry.headshot?.[0]?.url) {
249
+ return createOverlayCardProps(entry, options);
250
+ }
251
+ switch (cardType) {
252
+ case "list":
253
+ return createListCardProps(entry, options);
254
+ case "tabular":
255
+ return createTabularCardProps(entry, options);
256
+ default:
257
+ return createBlockCardProps(entry, options);
258
+ }
259
+ }
260
+ };
261
+ export {
262
+ buildFullName,
263
+ expertsDisplayStrategy,
264
+ mapExpertToBioProps
265
+ };
266
+ //# sourceMappingURL=experts.js.map