@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.
- package/README.md +1 -1
- package/dist/academic.d.ts +1 -1
- package/dist/academic.js +4 -4
- package/dist/academic.js.map +1 -1
- package/dist/events.d.ts +1 -1
- package/dist/events.js +10 -10
- package/dist/events.js.map +1 -1
- package/dist/experts.d.ts +2 -0
- package/dist/experts.js +9 -0
- package/dist/experts.js.map +1 -0
- package/dist/factory/core/createBaseFeed.d.ts +3 -0
- package/dist/factory/core/createBaseFeed.d.ts.map +1 -0
- package/dist/factory/core/createBaseFeed.js +116 -0
- package/dist/factory/core/createBaseFeed.js.map +1 -0
- package/dist/factory/core/index.d.ts +3 -0
- package/dist/factory/core/index.d.ts.map +1 -0
- package/dist/factory/core/types.d.ts +92 -0
- package/dist/factory/core/types.d.ts.map +1 -0
- package/dist/factory/helpers/displayHandler.d.ts +29 -0
- package/dist/factory/helpers/displayHandler.d.ts.map +1 -0
- package/dist/factory/helpers/displayHandler.js +169 -0
- package/dist/factory/helpers/displayHandler.js.map +1 -0
- package/dist/factory/helpers/feedHelpers.d.ts +10 -0
- package/dist/factory/helpers/feedHelpers.d.ts.map +1 -0
- package/dist/factory/helpers/feedHelpers.js +32 -0
- package/dist/factory/helpers/feedHelpers.js.map +1 -0
- package/dist/factory/helpers/fetchHandler.d.ts +22 -0
- package/dist/factory/helpers/fetchHandler.d.ts.map +1 -0
- package/dist/factory/helpers/fetchHandler.js +123 -0
- package/dist/factory/helpers/fetchHandler.js.map +1 -0
- package/dist/factory/helpers/index.d.ts +4 -0
- package/dist/factory/helpers/index.d.ts.map +1 -0
- package/dist/factory/index.d.ts +4 -0
- package/dist/factory/index.d.ts.map +1 -0
- package/dist/feeds/academic/_types.d.ts.map +1 -0
- package/dist/feeds/academic/index.d.ts +2 -0
- package/dist/feeds/academic/index.d.ts.map +1 -0
- package/dist/feeds/academic/slider.d.ts +4 -0
- package/dist/feeds/academic/slider.d.ts.map +1 -0
- package/dist/feeds/academic/slider.js +11 -0
- package/dist/feeds/academic/slider.js.map +1 -0
- package/dist/feeds/events/_types.d.ts.map +1 -0
- package/dist/feeds/events/grid.d.ts +4 -0
- package/dist/feeds/events/grid.d.ts.map +1 -0
- package/dist/feeds/events/grid.js +32 -0
- package/dist/feeds/events/grid.js.map +1 -0
- package/dist/feeds/events/grouped.d.ts +4 -0
- package/dist/feeds/events/grouped.d.ts.map +1 -0
- package/dist/feeds/events/grouped.js +337 -0
- package/dist/feeds/events/grouped.js.map +1 -0
- package/dist/feeds/events/index.d.ts +5 -0
- package/dist/feeds/events/index.d.ts.map +1 -0
- package/dist/feeds/events/list.d.ts +4 -0
- package/dist/feeds/events/list.d.ts.map +1 -0
- package/dist/feeds/events/list.js +33 -0
- package/dist/feeds/events/list.js.map +1 -0
- package/dist/feeds/events/slider.d.ts +4 -0
- package/dist/feeds/events/slider.d.ts.map +1 -0
- package/dist/feeds/events/slider.js +11 -0
- package/dist/feeds/events/slider.js.map +1 -0
- package/dist/feeds/experts/_types.d.ts +23 -0
- package/dist/feeds/experts/_types.d.ts.map +1 -0
- package/dist/feeds/experts/bio.d.ts +4 -0
- package/dist/feeds/experts/bio.d.ts.map +1 -0
- package/dist/feeds/experts/bio.js +147 -0
- package/dist/feeds/experts/bio.js.map +1 -0
- package/dist/feeds/experts/grid.d.ts +4 -0
- package/dist/feeds/experts/grid.d.ts.map +1 -0
- package/dist/feeds/experts/grid.js +37 -0
- package/dist/feeds/experts/grid.js.map +1 -0
- package/dist/feeds/experts/index.d.ts +4 -0
- package/dist/feeds/experts/index.d.ts.map +1 -0
- package/dist/feeds/experts/list.d.ts +4 -0
- package/dist/feeds/experts/list.d.ts.map +1 -0
- package/dist/feeds/experts/list.js +26 -0
- package/dist/feeds/experts/list.js.map +1 -0
- package/dist/feeds/news/_types.d.ts.map +1 -0
- package/dist/feeds/news/featured.d.ts +4 -0
- package/dist/feeds/news/featured.d.ts.map +1 -0
- package/dist/feeds/news/featured.js +379 -0
- package/dist/feeds/news/featured.js.map +1 -0
- package/dist/feeds/news/grid.d.ts +4 -0
- package/dist/feeds/news/grid.d.ts.map +1 -0
- package/dist/feeds/news/grid.js +37 -0
- package/dist/feeds/news/grid.js.map +1 -0
- package/dist/feeds/news/index.d.ts +4 -0
- package/dist/feeds/news/index.d.ts.map +1 -0
- package/dist/feeds/news/list.d.ts +4 -0
- package/dist/feeds/news/list.d.ts.map +1 -0
- package/dist/feeds/news/list.js +34 -0
- package/dist/feeds/news/list.js.map +1 -0
- package/dist/{utilities → helpers}/events/index.d.ts +1 -0
- package/dist/helpers/events/index.d.ts.map +1 -0
- package/dist/{utilities/events/index.mjs → helpers/events/index.js} +3 -1
- package/dist/helpers/events/index.js.map +1 -0
- package/dist/helpers/grouping/events.d.ts +14 -0
- package/dist/helpers/grouping/events.d.ts.map +1 -0
- package/dist/helpers/grouping/events.js +147 -0
- package/dist/helpers/grouping/events.js.map +1 -0
- package/dist/helpers/grouping/index.d.ts +2 -0
- package/dist/helpers/grouping/index.d.ts.map +1 -0
- package/dist/helpers/index.d.ts +5 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/network/fetch.d.ts.map +1 -0
- package/dist/helpers/network/index.d.ts.map +1 -0
- package/dist/helpers/styles/index.d.ts +2 -0
- package/dist/helpers/styles/index.d.ts.map +1 -0
- package/dist/helpers/styles/shadow.d.ts +10 -0
- package/dist/helpers/styles/shadow.d.ts.map +1 -0
- package/dist/helpers/styles/shadow.js +16 -0
- package/dist/helpers/styles/shadow.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -8
- package/dist/index.js.map +1 -1
- package/dist/news.d.ts +1 -1
- package/dist/news.js +8 -8
- package/dist/news.js.map +1 -1
- package/dist/states/_types.d.ts +36 -0
- package/dist/states/_types.d.ts.map +1 -0
- package/dist/states/_types.js +12 -0
- package/dist/states/_types.js.map +1 -0
- package/dist/states/announcer.d.ts +14 -0
- package/dist/states/announcer.d.ts.map +1 -0
- package/dist/states/announcer.js +62 -0
- package/dist/states/announcer.js.map +1 -0
- package/dist/states/empty.d.ts +15 -0
- package/dist/states/empty.d.ts.map +1 -0
- package/dist/states/empty.js +104 -0
- package/dist/states/empty.js.map +1 -0
- package/dist/states/index.d.ts +6 -0
- package/dist/states/index.d.ts.map +1 -0
- package/dist/states/loading.d.ts +15 -0
- package/dist/states/loading.d.ts.map +1 -0
- package/dist/{macros/loader.mjs → states/loading.js} +71 -28
- package/dist/states/loading.js.map +1 -0
- package/dist/states/pagination.d.ts +17 -0
- package/dist/states/pagination.d.ts.map +1 -0
- package/dist/states/pagination.js +102 -0
- package/dist/states/pagination.js.map +1 -0
- package/dist/strategies/display/events.d.ts +4 -0
- package/dist/strategies/display/events.d.ts.map +1 -0
- package/dist/strategies/display/events.js +60 -0
- package/dist/strategies/display/events.js.map +1 -0
- package/dist/strategies/display/experts.d.ts +19 -0
- package/dist/strategies/display/experts.d.ts.map +1 -0
- package/dist/strategies/display/experts.js +266 -0
- package/dist/strategies/display/experts.js.map +1 -0
- package/dist/strategies/display/index.d.ts +5 -0
- package/dist/strategies/display/index.d.ts.map +1 -0
- package/dist/strategies/display/news.d.ts +4 -0
- package/dist/strategies/display/news.d.ts.map +1 -0
- package/dist/strategies/display/news.js +58 -0
- package/dist/strategies/display/news.js.map +1 -0
- package/dist/strategies/fetch/academic.d.ts +2 -0
- package/dist/strategies/fetch/academic.d.ts.map +1 -0
- package/dist/strategies/fetch/academic.js +30 -0
- package/dist/strategies/fetch/academic.js.map +1 -0
- package/dist/strategies/fetch/events.d.ts +20 -0
- package/dist/strategies/fetch/events.d.ts.map +1 -0
- package/dist/strategies/fetch/events.js +223 -0
- package/dist/strategies/fetch/events.js.map +1 -0
- package/dist/strategies/fetch/experts.d.ts +4 -0
- package/dist/strategies/fetch/experts.d.ts.map +1 -0
- package/dist/strategies/fetch/experts.js +194 -0
- package/dist/strategies/fetch/experts.js.map +1 -0
- package/dist/strategies/fetch/graphql.d.ts +13 -0
- package/dist/strategies/fetch/graphql.d.ts.map +1 -0
- package/dist/strategies/fetch/graphql.js +104 -0
- package/dist/strategies/fetch/graphql.js.map +1 -0
- package/dist/strategies/fetch/index.d.ts +10 -0
- package/dist/strategies/fetch/index.d.ts.map +1 -0
- package/dist/strategies/fetch/news.d.ts +4 -0
- package/dist/strategies/fetch/news.d.ts.map +1 -0
- package/dist/strategies/fetch/news.js +95 -0
- package/dist/strategies/fetch/news.js.map +1 -0
- package/dist/strategies/index.d.ts +7 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/layout/featured.d.ts +8 -0
- package/dist/strategies/layout/featured.d.ts.map +1 -0
- package/dist/strategies/layout/grid.d.ts +7 -0
- package/dist/strategies/layout/grid.d.ts.map +1 -0
- package/dist/strategies/layout/grid.js +36 -0
- package/dist/strategies/layout/grid.js.map +1 -0
- package/dist/strategies/layout/index.d.ts +4 -0
- package/dist/strategies/layout/index.d.ts.map +1 -0
- package/dist/types/api.d.ts +34 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/core.d.ts +40 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/data/academic.d.ts +6 -0
- package/dist/types/data/academic.d.ts.map +1 -0
- package/dist/types/data/events.d.ts +21 -0
- package/dist/types/data/events.d.ts.map +1 -0
- package/dist/types/data/experts.d.ts +53 -0
- package/dist/types/data/experts.d.ts.map +1 -0
- package/dist/types/data/index.d.ts +5 -0
- package/dist/types/data/index.d.ts.map +1 -0
- package/dist/types/data/news.d.ts +6 -0
- package/dist/types/data/news.d.ts.map +1 -0
- package/dist/types/feeds.d.ts +35 -0
- package/dist/types/feeds.d.ts.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/widgets/index.d.ts +2 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/{macros → widgets}/slider.d.ts +1 -2
- package/dist/widgets/slider.d.ts.map +1 -0
- package/dist/{macros/slider.mjs → widgets/slider.js} +10 -10
- package/dist/widgets/slider.js.map +1 -0
- package/package.json +18 -12
- package/dist/academic.mjs +0 -5
- package/dist/academic.mjs.map +0 -1
- package/dist/composite/academic/_types.d.ts.map +0 -1
- package/dist/composite/academic/index.d.ts +0 -2
- package/dist/composite/academic/index.d.ts.map +0 -1
- package/dist/composite/academic/slider.d.ts +0 -5
- package/dist/composite/academic/slider.d.ts.map +0 -1
- package/dist/composite/academic/slider.js +0 -36
- package/dist/composite/academic/slider.js.map +0 -1
- package/dist/composite/academic/slider.mjs +0 -37
- package/dist/composite/academic/slider.mjs.map +0 -1
- package/dist/composite/events/_types.d.ts.map +0 -1
- package/dist/composite/events/common/data.d.ts +0 -44
- package/dist/composite/events/common/data.d.ts.map +0 -1
- package/dist/composite/events/common/data.js +0 -54
- package/dist/composite/events/common/data.js.map +0 -1
- package/dist/composite/events/common/data.mjs +0 -54
- package/dist/composite/events/common/data.mjs.map +0 -1
- package/dist/composite/events/common/display.d.ts +0 -18
- package/dist/composite/events/common/display.d.ts.map +0 -1
- package/dist/composite/events/common/display.js +0 -147
- package/dist/composite/events/common/display.js.map +0 -1
- package/dist/composite/events/common/display.mjs +0 -130
- package/dist/composite/events/common/display.mjs.map +0 -1
- package/dist/composite/events/common/fetch.d.ts +0 -24
- package/dist/composite/events/common/fetch.d.ts.map +0 -1
- package/dist/composite/events/common/fetch.js +0 -119
- package/dist/composite/events/common/fetch.js.map +0 -1
- package/dist/composite/events/common/fetch.mjs +0 -119
- package/dist/composite/events/common/fetch.mjs.map +0 -1
- package/dist/composite/events/common/queries.d.ts +0 -5
- package/dist/composite/events/common/queries.d.ts.map +0 -1
- package/dist/composite/events/common/queries.js +0 -113
- package/dist/composite/events/common/queries.js.map +0 -1
- package/dist/composite/events/common/queries.mjs +0 -113
- package/dist/composite/events/common/queries.mjs.map +0 -1
- package/dist/composite/events/grid.d.ts +0 -5
- package/dist/composite/events/grid.d.ts.map +0 -1
- package/dist/composite/events/grid.js +0 -92
- package/dist/composite/events/grid.js.map +0 -1
- package/dist/composite/events/grid.mjs +0 -93
- package/dist/composite/events/grid.mjs.map +0 -1
- package/dist/composite/events/grouped.d.ts +0 -5
- package/dist/composite/events/grouped.d.ts.map +0 -1
- package/dist/composite/events/grouped.js +0 -290
- package/dist/composite/events/grouped.js.map +0 -1
- package/dist/composite/events/grouped.mjs +0 -274
- package/dist/composite/events/grouped.mjs.map +0 -1
- package/dist/composite/events/index.d.ts +0 -5
- package/dist/composite/events/index.d.ts.map +0 -1
- package/dist/composite/events/list.d.ts +0 -5
- package/dist/composite/events/list.d.ts.map +0 -1
- package/dist/composite/events/list.js +0 -92
- package/dist/composite/events/list.js.map +0 -1
- package/dist/composite/events/list.mjs +0 -93
- package/dist/composite/events/list.mjs.map +0 -1
- package/dist/composite/events/slider.d.ts +0 -5
- package/dist/composite/events/slider.d.ts.map +0 -1
- package/dist/composite/events/slider.js +0 -37
- package/dist/composite/events/slider.js.map +0 -1
- package/dist/composite/events/slider.mjs +0 -38
- package/dist/composite/events/slider.mjs.map +0 -1
- package/dist/composite/news/_types.d.ts.map +0 -1
- package/dist/composite/news/common/data.d.ts +0 -47
- package/dist/composite/news/common/data.d.ts.map +0 -1
- package/dist/composite/news/common/data.js +0 -63
- package/dist/composite/news/common/data.js.map +0 -1
- package/dist/composite/news/common/data.mjs +0 -63
- package/dist/composite/news/common/data.mjs.map +0 -1
- package/dist/composite/news/common/display.d.ts +0 -17
- package/dist/composite/news/common/display.d.ts.map +0 -1
- package/dist/composite/news/common/display.js +0 -147
- package/dist/composite/news/common/display.js.map +0 -1
- package/dist/composite/news/common/display.mjs +0 -130
- package/dist/composite/news/common/display.mjs.map +0 -1
- package/dist/composite/news/common/fetch.d.ts +0 -22
- package/dist/composite/news/common/fetch.d.ts.map +0 -1
- package/dist/composite/news/common/fetch.js +0 -89
- package/dist/composite/news/common/fetch.js.map +0 -1
- package/dist/composite/news/common/fetch.mjs +0 -89
- package/dist/composite/news/common/fetch.mjs.map +0 -1
- package/dist/composite/news/common/queries.d.ts +0 -2
- package/dist/composite/news/common/queries.d.ts.map +0 -1
- package/dist/composite/news/common/queries.js +0 -37
- package/dist/composite/news/common/queries.js.map +0 -1
- package/dist/composite/news/common/queries.mjs +0 -37
- package/dist/composite/news/common/queries.mjs.map +0 -1
- package/dist/composite/news/featured.d.ts +0 -5
- package/dist/composite/news/featured.d.ts.map +0 -1
- package/dist/composite/news/featured.js +0 -184
- package/dist/composite/news/featured.js.map +0 -1
- package/dist/composite/news/featured.mjs +0 -185
- package/dist/composite/news/featured.mjs.map +0 -1
- package/dist/composite/news/grid.d.ts +0 -5
- package/dist/composite/news/grid.d.ts.map +0 -1
- package/dist/composite/news/grid.js +0 -100
- package/dist/composite/news/grid.js.map +0 -1
- package/dist/composite/news/grid.mjs +0 -101
- package/dist/composite/news/grid.mjs.map +0 -1
- package/dist/composite/news/index.d.ts +0 -4
- package/dist/composite/news/index.d.ts.map +0 -1
- package/dist/composite/news/list.d.ts +0 -5
- package/dist/composite/news/list.d.ts.map +0 -1
- package/dist/composite/news/list.js +0 -87
- package/dist/composite/news/list.js.map +0 -1
- package/dist/composite/news/list.mjs +0 -88
- package/dist/composite/news/list.mjs.map +0 -1
- package/dist/elements/asset.d.ts +0 -10
- package/dist/elements/asset.d.ts.map +0 -1
- package/dist/elements/asset.js +0 -27
- package/dist/elements/asset.js.map +0 -1
- package/dist/elements/asset.mjs +0 -27
- package/dist/elements/asset.mjs.map +0 -1
- package/dist/elements/index.d.ts +0 -4
- package/dist/elements/index.d.ts.map +0 -1
- package/dist/elements/layout.d.ts +0 -15
- package/dist/elements/layout.d.ts.map +0 -1
- package/dist/elements/layout.js +0 -113
- package/dist/elements/layout.js.map +0 -1
- package/dist/elements/layout.mjs +0 -96
- package/dist/elements/layout.mjs.map +0 -1
- package/dist/elements/text.d.ts +0 -12
- package/dist/elements/text.d.ts.map +0 -1
- package/dist/elements/text.js +0 -41
- package/dist/elements/text.js.map +0 -1
- package/dist/elements/text.mjs +0 -41
- package/dist/elements/text.mjs.map +0 -1
- package/dist/events.mjs +0 -11
- package/dist/events.mjs.map +0 -1
- package/dist/index.mjs +0 -9
- package/dist/index.mjs.map +0 -1
- package/dist/macros/aria-live.d.ts +0 -11
- package/dist/macros/aria-live.d.ts.map +0 -1
- package/dist/macros/aria-live.js +0 -25
- package/dist/macros/aria-live.js.map +0 -1
- package/dist/macros/aria-live.mjs +0 -26
- package/dist/macros/aria-live.mjs.map +0 -1
- package/dist/macros/index.d.ts +0 -6
- package/dist/macros/index.d.ts.map +0 -1
- package/dist/macros/lazy-load.d.ts +0 -16
- package/dist/macros/lazy-load.d.ts.map +0 -1
- package/dist/macros/lazy-load.js +0 -54
- package/dist/macros/lazy-load.js.map +0 -1
- package/dist/macros/lazy-load.mjs +0 -38
- package/dist/macros/lazy-load.mjs.map +0 -1
- package/dist/macros/loader.d.ts +0 -15
- package/dist/macros/loader.d.ts.map +0 -1
- package/dist/macros/loader.js +0 -128
- package/dist/macros/loader.js.map +0 -1
- package/dist/macros/loader.mjs.map +0 -1
- package/dist/macros/no-results.d.ts +0 -12
- package/dist/macros/no-results.d.ts.map +0 -1
- package/dist/macros/no-results.js +0 -66
- package/dist/macros/no-results.js.map +0 -1
- package/dist/macros/no-results.mjs +0 -50
- package/dist/macros/no-results.mjs.map +0 -1
- package/dist/macros/slider.d.ts.map +0 -1
- package/dist/macros/slider.js +0 -103
- package/dist/macros/slider.js.map +0 -1
- package/dist/macros/slider.mjs.map +0 -1
- package/dist/news.mjs +0 -9
- package/dist/news.mjs.map +0 -1
- package/dist/utilities/events/index.d.ts.map +0 -1
- package/dist/utilities/events/index.js +0 -19
- package/dist/utilities/events/index.js.map +0 -1
- package/dist/utilities/events/index.mjs.map +0 -1
- package/dist/utilities/index.d.ts +0 -3
- package/dist/utilities/index.d.ts.map +0 -1
- package/dist/utilities/network/fetch.d.ts.map +0 -1
- package/dist/utilities/network/index.d.ts.map +0 -1
- /package/dist/{composite → feeds}/academic/_types.d.ts +0 -0
- /package/dist/{composite → feeds}/events/_types.d.ts +0 -0
- /package/dist/{composite → feeds}/news/_types.d.ts +0 -0
- /package/dist/{utilities → helpers}/network/fetch.d.ts +0 -0
- /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
|
-
|
|
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:
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
container
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
152
|
+
LoadingState,
|
|
153
|
+
createLoadingElement
|
|
111
154
|
};
|
|
112
|
-
//# sourceMappingURL=
|
|
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":";;;AAMA,MAAM,gBAAgB;AAEtB,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyCX,SAAS,qBAAqB,SAA6B,IAAkB;AAClF,QAAM,EAAE,cAAc,MAAA,IAAU;AAEhC,QAAM,mBAAmB;AAAA,IACvB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY,cAAc,MAAM,MAAM,KAAK,QAAQ,MAAM,MAAM,KAAK;AAAA,IACpE,yBAAyB;AAAA,EAAA;AAG3B,QAAM,cAAc,IAAI,eAAA,EACrB,cAAc,GAAG,aAAa,MAAM,EACpC,WAAW;AAAA,IACV,SAAS;AAAA,MACP,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,IAAA;AAAA,EACb,CACD,EACA,MAAA;AAEH,QAAM,cAAc,IAAI,eAAA,EACrB,cAAc,GAAG,aAAa,MAAM,EACpC,WAAW;AAAA,IACV,SAAS;AAAA,MACP,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,IAAA;AAAA,EACb,CACD,EACA,MAAA;AAEH,QAAM,gBAAgB,IAAI,eAAA,EACvB,cAAc,GAAG,aAAa,QAAQ,EACtC,WAAW;AAAA,IACV,SAAS;AAAA,MACP,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,IAAA;AAAA,EACb,CACD,EACA,MAAA;AAEH,QAAM,eAAe,IAAI,eAAA,EACtB,cAAc,GAAG,aAAa,OAAO,EACrC,WAAW;AAAA,IACV,SAAS;AAAA,MACP,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,IAAA;AAAA,EACb,CACD,EACA,MAAA;AAEH,QAAM,UAAU,IAAI,iBACjB,cAAc,GAAG,aAAa,UAAU,EACxC,UAAU,WAAW,EACrB,UAAU,WAAW,EACrB,UAAU,aAAa,EACvB,UAAU,YAAY,EACtB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,IAAA;AAAA,EACZ,CACD,EACA,MAAA;AAEH,QAAM,YAAY,IAAI,eAAA,EACnB,cAAc,aAAa,EAC3B,UAAU,OAAO,EACjB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAAA,EACd,CACD,EACA,MAAA;AAEH,YAAU,UAAU;AAEpB,SAAO;AACT;AAeO,MAAM,aAAa;AAAA,EAKxB,YAAY,SAA6B,IAAI;AAH7C,SAAQ,YAAgC;AACxC,SAAQ,YAAqB;AAG3B,SAAK,QAAQ,qBAAqB,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,WAA8B;AACjC,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY;AACjB,gBAAU,YAAY,KAAK,MAAM,OAAO;AACxC,WAAK,YAAY;AAEjB,gBAAU;AAAA,QACR,IAAI,YAAY,eAAe,eAAe;AAAA,UAC5C,SAAS;AAAA,UACT,QAAQ,EAAE,WAAW,KAAK,MAAI;AAAA,QAAE,CACjC;AAAA,MAAA;AAAA,IAEL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,QAAI,KAAK,aAAa,KAAK,MAAM,QAAQ,YAAY;AACnD,WAAK,MAAM,QAAQ,OAAA;AACnB,WAAK,YAAY;AAEjB,UAAI,KAAK,WAAW;AAClB,aAAK,UAAU;AAAA,UACb,IAAI,YAAY,eAAe,aAAa;AAAA,YAC1C,SAAS;AAAA,YACT,QAAQ,EAAE,WAAW,KAAK,MAAI;AAAA,UAAE,CACjC;AAAA,QAAA;AAAA,MAEL;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,KAAA;AACL,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAuB;AACzB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAiB;AACnB,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;"}
|
|
@@ -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 @@
|
|
|
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
|