@universityofmaryland/web-feeds-library 1.2.3 → 1.3.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/academic.d.ts +1 -1
- package/dist/academic.js +1 -1
- package/dist/academic.mjs +1 -1
- package/dist/events.d.ts +1 -1
- package/dist/events.js +4 -4
- package/dist/events.mjs +4 -4
- package/dist/experts.d.ts +2 -0
- package/dist/experts.js +9 -0
- package/dist/experts.js.map +1 -0
- package/dist/experts.mjs +9 -0
- package/dist/experts.mjs.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 +114 -0
- package/dist/factory/core/createBaseFeed.js.map +1 -0
- package/dist/factory/core/createBaseFeed.mjs +114 -0
- package/dist/factory/core/createBaseFeed.mjs.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 +91 -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 +187 -0
- package/dist/factory/helpers/displayHandler.js.map +1 -0
- package/dist/factory/helpers/displayHandler.mjs +169 -0
- package/dist/factory/helpers/displayHandler.mjs.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/feedHelpers.mjs +32 -0
- package/dist/factory/helpers/feedHelpers.mjs.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 +140 -0
- package/dist/factory/helpers/fetchHandler.js.map +1 -0
- package/dist/factory/helpers/fetchHandler.mjs +123 -0
- package/dist/factory/helpers/fetchHandler.mjs.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.map +1 -0
- package/dist/feeds/academic/slider.d.ts.map +1 -0
- package/dist/feeds/academic/slider.js +10 -0
- package/dist/feeds/academic/slider.js.map +1 -0
- package/dist/feeds/academic/slider.mjs +11 -0
- package/dist/feeds/academic/slider.mjs.map +1 -0
- package/dist/feeds/events/_types.d.ts.map +1 -0
- package/dist/feeds/events/grid.d.ts.map +1 -0
- package/dist/feeds/events/grid.js +31 -0
- package/dist/feeds/events/grid.js.map +1 -0
- package/dist/feeds/events/grid.mjs +32 -0
- package/dist/feeds/events/grid.mjs.map +1 -0
- package/dist/feeds/events/grouped.d.ts.map +1 -0
- package/dist/feeds/events/grouped.js +353 -0
- package/dist/feeds/events/grouped.js.map +1 -0
- package/dist/feeds/events/grouped.mjs +337 -0
- package/dist/feeds/events/grouped.mjs.map +1 -0
- package/dist/feeds/events/index.d.ts.map +1 -0
- package/dist/feeds/events/list.d.ts.map +1 -0
- package/dist/feeds/events/list.js +32 -0
- package/dist/feeds/events/list.js.map +1 -0
- package/dist/feeds/events/list.mjs +33 -0
- package/dist/feeds/events/list.mjs.map +1 -0
- package/dist/feeds/events/slider.d.ts.map +1 -0
- package/dist/feeds/events/slider.js +10 -0
- package/dist/feeds/events/slider.js.map +1 -0
- package/dist/feeds/events/slider.mjs +11 -0
- package/dist/feeds/events/slider.mjs.map +1 -0
- package/dist/feeds/experts/_types.d.ts +22 -0
- package/dist/feeds/experts/_types.d.ts.map +1 -0
- package/dist/feeds/experts/bio.d.ts +5 -0
- package/dist/feeds/experts/bio.d.ts.map +1 -0
- package/dist/feeds/experts/bio.js +146 -0
- package/dist/feeds/experts/bio.js.map +1 -0
- package/dist/feeds/experts/bio.mjs +147 -0
- package/dist/feeds/experts/bio.mjs.map +1 -0
- package/dist/feeds/experts/grid.d.ts +5 -0
- package/dist/feeds/experts/grid.d.ts.map +1 -0
- package/dist/feeds/experts/grid.js +36 -0
- package/dist/feeds/experts/grid.js.map +1 -0
- package/dist/feeds/experts/grid.mjs +37 -0
- package/dist/feeds/experts/grid.mjs.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.map +1 -0
- package/dist/feeds/experts/list.js +25 -0
- package/dist/feeds/experts/list.js.map +1 -0
- package/dist/feeds/experts/list.mjs +26 -0
- package/dist/feeds/experts/list.mjs.map +1 -0
- package/dist/feeds/news/_types.d.ts.map +1 -0
- package/dist/feeds/news/featured.d.ts.map +1 -0
- package/dist/feeds/news/featured.js +378 -0
- package/dist/feeds/news/featured.js.map +1 -0
- package/dist/feeds/news/featured.mjs +379 -0
- package/dist/feeds/news/featured.mjs.map +1 -0
- package/dist/feeds/news/grid.d.ts.map +1 -0
- package/dist/feeds/news/grid.js +36 -0
- package/dist/feeds/news/grid.js.map +1 -0
- package/dist/feeds/news/grid.mjs +37 -0
- package/dist/feeds/news/grid.mjs.map +1 -0
- package/dist/feeds/news/index.d.ts.map +1 -0
- package/dist/feeds/news/list.d.ts +5 -0
- package/dist/feeds/news/list.d.ts.map +1 -0
- package/dist/feeds/news/list.js +33 -0
- package/dist/feeds/news/list.js.map +1 -0
- package/dist/feeds/news/list.mjs +34 -0
- package/dist/feeds/news/list.mjs.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 → helpers}/events/index.js +2 -0
- package/dist/helpers/events/index.js.map +1 -0
- package/dist/{utilities → helpers}/events/index.mjs +2 -0
- package/dist/helpers/events/index.mjs.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/events.mjs +147 -0
- package/dist/helpers/grouping/events.mjs.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 +33 -0
- package/dist/helpers/styles/shadow.js.map +1 -0
- package/dist/helpers/styles/shadow.mjs +16 -0
- package/dist/helpers/styles/shadow.mjs.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/dist/news.d.ts +1 -1
- package/dist/news.js +3 -3
- package/dist/news.mjs +3 -3
- package/dist/states/_types.d.ts +60 -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/_types.mjs +12 -0
- package/dist/states/_types.mjs.map +1 -0
- package/dist/states/announcer.d.ts +16 -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/announcer.mjs +62 -0
- package/dist/states/announcer.mjs.map +1 -0
- package/dist/states/empty.d.ts +17 -0
- package/dist/states/empty.d.ts.map +1 -0
- package/dist/states/empty.js +121 -0
- package/dist/states/empty.js.map +1 -0
- package/dist/states/empty.mjs +104 -0
- package/dist/states/empty.mjs.map +1 -0
- package/dist/states/index.d.ts +10 -0
- package/dist/states/index.d.ts.map +1 -0
- package/dist/states/loading.d.ts +17 -0
- package/dist/states/loading.d.ts.map +1 -0
- package/dist/states/loading.js +155 -0
- package/dist/states/loading.js.map +1 -0
- package/dist/states/loading.mjs +155 -0
- package/dist/states/loading.mjs.map +1 -0
- package/dist/states/pagination.d.ts +19 -0
- package/dist/states/pagination.d.ts.map +1 -0
- package/dist/states/pagination.js +119 -0
- package/dist/states/pagination.js.map +1 -0
- package/dist/states/pagination.mjs +102 -0
- package/dist/states/pagination.mjs.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/events.mjs +60 -0
- package/dist/strategies/display/events.mjs.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/experts.mjs +266 -0
- package/dist/strategies/display/experts.mjs.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/display/news.mjs +58 -0
- package/dist/strategies/display/news.mjs.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/academic.mjs +30 -0
- package/dist/strategies/fetch/academic.mjs.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/events.mjs +223 -0
- package/dist/strategies/fetch/events.mjs.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 +189 -0
- package/dist/strategies/fetch/experts.js.map +1 -0
- package/dist/strategies/fetch/experts.mjs +189 -0
- package/dist/strategies/fetch/experts.mjs.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 +100 -0
- package/dist/strategies/fetch/graphql.js.map +1 -0
- package/dist/strategies/fetch/graphql.mjs +100 -0
- package/dist/strategies/fetch/graphql.mjs.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/fetch/news.mjs +95 -0
- package/dist/strategies/fetch/news.mjs.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/grid.mjs +36 -0
- package/dist/strategies/layout/grid.mjs.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/widgets/slider.d.ts.map +1 -0
- package/dist/{macros → widgets}/slider.js +2 -4
- package/dist/{macros/slider.mjs.map → widgets/slider.js.map} +1 -1
- package/dist/{macros → widgets}/slider.mjs +2 -4
- package/dist/widgets/slider.mjs.map +1 -0
- package/package.json +17 -3
- package/dist/composite/academic/_types.d.ts.map +0 -1
- package/dist/composite/academic/index.d.ts.map +0 -1
- package/dist/composite/academic/slider.d.ts.map +0 -1
- package/dist/composite/academic/slider.js +0 -34
- package/dist/composite/academic/slider.js.map +0 -1
- package/dist/composite/academic/slider.mjs +0 -35
- 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 -48
- package/dist/composite/events/common/data.d.ts.map +0 -1
- package/dist/composite/events/common/data.js +0 -53
- package/dist/composite/events/common/data.js.map +0 -1
- package/dist/composite/events/common/data.mjs +0 -53
- 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 -117
- package/dist/composite/events/common/fetch.js.map +0 -1
- package/dist/composite/events/common/fetch.mjs +0 -117
- 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.map +0 -1
- package/dist/composite/events/grid.js +0 -90
- package/dist/composite/events/grid.js.map +0 -1
- package/dist/composite/events/grid.mjs +0 -91
- package/dist/composite/events/grid.mjs.map +0 -1
- package/dist/composite/events/grouped.d.ts.map +0 -1
- package/dist/composite/events/grouped.js +0 -300
- package/dist/composite/events/grouped.js.map +0 -1
- package/dist/composite/events/grouped.mjs +0 -284
- package/dist/composite/events/grouped.mjs.map +0 -1
- package/dist/composite/events/index.d.ts.map +0 -1
- package/dist/composite/events/list.d.ts.map +0 -1
- package/dist/composite/events/list.js +0 -90
- package/dist/composite/events/list.js.map +0 -1
- package/dist/composite/events/list.mjs +0 -91
- package/dist/composite/events/list.mjs.map +0 -1
- package/dist/composite/events/slider.d.ts.map +0 -1
- package/dist/composite/events/slider.js +0 -35
- package/dist/composite/events/slider.js.map +0 -1
- package/dist/composite/events/slider.mjs +0 -36
- 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 -62
- package/dist/composite/news/common/data.js.map +0 -1
- package/dist/composite/news/common/data.mjs +0 -62
- 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 -87
- package/dist/composite/news/common/fetch.js.map +0 -1
- package/dist/composite/news/common/fetch.mjs +0 -87
- 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.map +0 -1
- package/dist/composite/news/featured.js +0 -182
- package/dist/composite/news/featured.js.map +0 -1
- package/dist/composite/news/featured.mjs +0 -183
- package/dist/composite/news/featured.mjs.map +0 -1
- package/dist/composite/news/grid.d.ts.map +0 -1
- package/dist/composite/news/grid.js +0 -98
- package/dist/composite/news/grid.js.map +0 -1
- package/dist/composite/news/grid.mjs +0 -99
- package/dist/composite/news/grid.mjs.map +0 -1
- package/dist/composite/news/index.d.ts.map +0 -1
- package/dist/composite/news/list.d.ts.map +0 -1
- package/dist/composite/news/list.js +0 -85
- package/dist/composite/news/list.js.map +0 -1
- package/dist/composite/news/list.mjs +0 -86
- 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 -27
- package/dist/elements/layout.d.ts.map +0 -1
- package/dist/elements/layout.js +0 -121
- package/dist/elements/layout.js.map +0 -1
- package/dist/elements/layout.mjs +0 -104
- 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/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 -19
- package/dist/macros/lazy-load.d.ts.map +0 -1
- package/dist/macros/lazy-load.js +0 -63
- package/dist/macros/lazy-load.js.map +0 -1
- package/dist/macros/lazy-load.mjs +0 -47
- package/dist/macros/lazy-load.mjs.map +0 -1
- package/dist/macros/loader.d.ts +0 -18
- package/dist/macros/loader.d.ts.map +0 -1
- package/dist/macros/loader.js +0 -148
- package/dist/macros/loader.js.map +0 -1
- package/dist/macros/loader.mjs +0 -132
- package/dist/macros/loader.mjs.map +0 -1
- package/dist/macros/no-results.d.ts +0 -15
- package/dist/macros/no-results.d.ts.map +0 -1
- package/dist/macros/no-results.js +0 -71
- package/dist/macros/no-results.js.map +0 -1
- package/dist/macros/no-results.mjs +0 -55
- package/dist/macros/no-results.mjs.map +0 -1
- package/dist/macros/slider.d.ts.map +0 -1
- package/dist/macros/slider.js.map +0 -1
- package/dist/utilities/events/index.d.ts.map +0 -1
- 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}/academic/index.d.ts +0 -0
- /package/dist/{composite → feeds}/academic/slider.d.ts +0 -0
- /package/dist/{composite → feeds}/events/_types.d.ts +0 -0
- /package/dist/{composite → feeds}/events/grid.d.ts +0 -0
- /package/dist/{composite → feeds}/events/grouped.d.ts +0 -0
- /package/dist/{composite → feeds}/events/index.d.ts +0 -0
- /package/dist/{composite → feeds}/events/list.d.ts +0 -0
- /package/dist/{composite → feeds}/events/slider.d.ts +0 -0
- /package/dist/{composite/news → feeds/experts}/list.d.ts +0 -0
- /package/dist/{composite → feeds}/news/_types.d.ts +0 -0
- /package/dist/{composite → feeds}/news/featured.d.ts +0 -0
- /package/dist/{composite → feeds}/news/grid.d.ts +0 -0
- /package/dist/{composite → feeds}/news/index.d.ts +0 -0
- /package/dist/{utilities → helpers}/network/fetch.d.ts +0 -0
- /package/dist/{utilities → helpers}/network/index.d.ts +0 -0
- /package/dist/{macros → widgets}/slider.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_types.d.ts","sourceRoot":"","sources":["../../source/states/_types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAK9C,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAKD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAKD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CACrC;AAKD,oBAAY,cAAc;IACxB,aAAa,uBAAuB;IACpC,WAAW,qBAAqB;IAChC,WAAW,qBAAqB;IAChC,iBAAiB,2BAA2B;IAC5C,YAAY,sBAAsB;CACnC;AAKD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAKD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,YAAY,CAAC;IACrD,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,WAAW,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5E,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,WAAW,CAAA;KAAE,KAAK,IAAI,CAAC;CACrD;AAKD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,WAAW,CAAC;IACjD,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACtE;AAKD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,YAAY,GAAG,SAAS,CAAC;IACpE,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,WAAW,CAAA;KAAE,KAAK,IAAI,CAAC;CACrD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
var FeedStateEvent = /* @__PURE__ */ ((FeedStateEvent2) => {
|
|
4
|
+
FeedStateEvent2["LOADING_START"] = "feed:loading:start";
|
|
5
|
+
FeedStateEvent2["LOADING_END"] = "feed:loading:end";
|
|
6
|
+
FeedStateEvent2["EMPTY_SHOWN"] = "feed:empty:shown";
|
|
7
|
+
FeedStateEvent2["PAGINATION_LOADED"] = "feed:pagination:loaded";
|
|
8
|
+
FeedStateEvent2["ANNOUNCEMENT"] = "feed:announcement";
|
|
9
|
+
return FeedStateEvent2;
|
|
10
|
+
})(FeedStateEvent || {});
|
|
11
|
+
exports.FeedStateEvent = FeedStateEvent;
|
|
12
|
+
//# sourceMappingURL=_types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_types.js","sources":["../../source/states/_types.ts"],"sourcesContent":["import { type ElementModel } from '../_types';\n\n/**\n * Configuration for loading state\n */\nexport interface LoadingStateConfig {\n isThemeDark?: boolean;\n}\n\n/**\n * Configuration for empty/no results state\n */\nexport interface EmptyStateConfig {\n message?: string;\n linkUrl?: string;\n linkText?: string;\n isThemeDark?: boolean;\n isAlignedCenter?: boolean;\n}\n\n/**\n * Configuration for pagination state\n */\nexport interface PaginationStateConfig {\n callback: () => void;\n isThemeDark?: boolean;\n isLazyLoad: boolean;\n totalEntries: number | null;\n offset: number;\n}\n\n/**\n * Configuration for announcer (aria-live)\n */\nexport interface AnnouncerConfig {\n message: string;\n politeness?: 'polite' | 'assertive';\n}\n\n/**\n * Feed state events for custom event dispatching\n */\nexport enum FeedStateEvent {\n LOADING_START = 'feed:loading:start',\n LOADING_END = 'feed:loading:end',\n EMPTY_SHOWN = 'feed:empty:shown',\n PAGINATION_LOADED = 'feed:pagination:loaded',\n ANNOUNCEMENT = 'feed:announcement',\n}\n\n/**\n * Standard feed state interface\n */\nexport interface FeedState {\n element: HTMLElement;\n styles: string;\n show?: (container: HTMLElement) => void;\n hide?: () => void;\n destroy?: () => void;\n}\n\n/**\n * Legacy loader API (backwards compatible)\n */\nexport interface LoaderLegacyAPI {\n create: (config: LoadingStateConfig) => ElementModel;\n display: (props: { container: HTMLElement; isThemeDark?: boolean }) => void;\n remove: (props: { container: HTMLElement }) => void;\n}\n\n/**\n * Legacy announcer API (backwards compatible)\n */\nexport interface AnnouncerLegacyAPI {\n create: (config: AnnouncerConfig) => HTMLElement;\n update: (props: { container: HTMLElement; message: string }) => void;\n}\n\n/**\n * Legacy pagination API (backwards compatible)\n */\nexport interface PaginationLegacyAPI {\n create: (config: PaginationStateConfig) => ElementModel | undefined;\n remove: (props: { container: HTMLElement }) => void;\n}\n"],"names":["FeedStateEvent"],"mappings":";;AA0CO,IAAK,mCAAAA,oBAAL;AACLA,kBAAA,eAAA,IAAgB;AAChBA,kBAAA,aAAA,IAAc;AACdA,kBAAA,aAAA,IAAc;AACdA,kBAAA,mBAAA,IAAoB;AACpBA,kBAAA,cAAA,IAAe;AALL,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
var FeedStateEvent = /* @__PURE__ */ ((FeedStateEvent2) => {
|
|
2
|
+
FeedStateEvent2["LOADING_START"] = "feed:loading:start";
|
|
3
|
+
FeedStateEvent2["LOADING_END"] = "feed:loading:end";
|
|
4
|
+
FeedStateEvent2["EMPTY_SHOWN"] = "feed:empty:shown";
|
|
5
|
+
FeedStateEvent2["PAGINATION_LOADED"] = "feed:pagination:loaded";
|
|
6
|
+
FeedStateEvent2["ANNOUNCEMENT"] = "feed:announcement";
|
|
7
|
+
return FeedStateEvent2;
|
|
8
|
+
})(FeedStateEvent || {});
|
|
9
|
+
export {
|
|
10
|
+
FeedStateEvent
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=_types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_types.mjs","sources":["../../source/states/_types.ts"],"sourcesContent":["import { type ElementModel } from '../_types';\n\n/**\n * Configuration for loading state\n */\nexport interface LoadingStateConfig {\n isThemeDark?: boolean;\n}\n\n/**\n * Configuration for empty/no results state\n */\nexport interface EmptyStateConfig {\n message?: string;\n linkUrl?: string;\n linkText?: string;\n isThemeDark?: boolean;\n isAlignedCenter?: boolean;\n}\n\n/**\n * Configuration for pagination state\n */\nexport interface PaginationStateConfig {\n callback: () => void;\n isThemeDark?: boolean;\n isLazyLoad: boolean;\n totalEntries: number | null;\n offset: number;\n}\n\n/**\n * Configuration for announcer (aria-live)\n */\nexport interface AnnouncerConfig {\n message: string;\n politeness?: 'polite' | 'assertive';\n}\n\n/**\n * Feed state events for custom event dispatching\n */\nexport enum FeedStateEvent {\n LOADING_START = 'feed:loading:start',\n LOADING_END = 'feed:loading:end',\n EMPTY_SHOWN = 'feed:empty:shown',\n PAGINATION_LOADED = 'feed:pagination:loaded',\n ANNOUNCEMENT = 'feed:announcement',\n}\n\n/**\n * Standard feed state interface\n */\nexport interface FeedState {\n element: HTMLElement;\n styles: string;\n show?: (container: HTMLElement) => void;\n hide?: () => void;\n destroy?: () => void;\n}\n\n/**\n * Legacy loader API (backwards compatible)\n */\nexport interface LoaderLegacyAPI {\n create: (config: LoadingStateConfig) => ElementModel;\n display: (props: { container: HTMLElement; isThemeDark?: boolean }) => void;\n remove: (props: { container: HTMLElement }) => void;\n}\n\n/**\n * Legacy announcer API (backwards compatible)\n */\nexport interface AnnouncerLegacyAPI {\n create: (config: AnnouncerConfig) => HTMLElement;\n update: (props: { container: HTMLElement; message: string }) => void;\n}\n\n/**\n * Legacy pagination API (backwards compatible)\n */\nexport interface PaginationLegacyAPI {\n create: (config: PaginationStateConfig) => ElementModel | undefined;\n remove: (props: { container: HTMLElement }) => void;\n}\n"],"names":["FeedStateEvent"],"mappings":"AA0CO,IAAK,mCAAAA,oBAAL;AACLA,kBAAA,eAAA,IAAgB;AAChBA,kBAAA,aAAA,IAAc;AACdA,kBAAA,aAAA,IAAc;AACdA,kBAAA,mBAAA,IAAoB;AACpBA,kBAAA,cAAA,IAAe;AALL,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AnnouncerConfig, AnnouncerLegacyAPI } from './_types';
|
|
2
|
+
export declare function createAnnouncerElement(config: AnnouncerConfig): HTMLElement;
|
|
3
|
+
export declare class Announcer {
|
|
4
|
+
private element;
|
|
5
|
+
private textElement;
|
|
6
|
+
private politeness;
|
|
7
|
+
constructor(config?: Partial<AnnouncerConfig>);
|
|
8
|
+
announce(message: string): void;
|
|
9
|
+
clear(): void;
|
|
10
|
+
setPoliteness(politeness: 'polite' | 'assertive'): void;
|
|
11
|
+
destroy(): void;
|
|
12
|
+
getElement(): HTMLElement;
|
|
13
|
+
}
|
|
14
|
+
declare const _default: AnnouncerLegacyAPI;
|
|
15
|
+
export default _default;
|
|
16
|
+
//# sourceMappingURL=announcer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcer.d.ts","sourceRoot":"","sources":["../../source/states/announcer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAkB,MAAM,UAAU,CAAC;AAiBzF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,CAgB3E;AAmBD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAyB;gBAE/B,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAsBjD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAoB/B,KAAK,IAAI,IAAI;IAOb,aAAa,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,GAAG,IAAI;IAQvD,OAAO,IAAI,IAAI;IASf,UAAU,IAAI,WAAW;CAG1B;wBAsCI,kBAAkB;AAHvB,wBAGwB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const _types = require("./_types.js");
|
|
4
|
+
class Announcer {
|
|
5
|
+
constructor(config = {}) {
|
|
6
|
+
this.politeness = config.politeness || "polite";
|
|
7
|
+
this.element = document.createElement("div");
|
|
8
|
+
this.element.setAttribute("aria-live", this.politeness);
|
|
9
|
+
this.element.setAttribute("role", "status");
|
|
10
|
+
this.element.classList.add("sr-only");
|
|
11
|
+
this.textElement = document.createElement("p");
|
|
12
|
+
this.element.appendChild(this.textElement);
|
|
13
|
+
if (config.message) {
|
|
14
|
+
this.announce(config.message);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Announce a message to screen readers
|
|
19
|
+
*/
|
|
20
|
+
announce(message) {
|
|
21
|
+
this.textElement.textContent = message;
|
|
22
|
+
this.element.dispatchEvent(
|
|
23
|
+
new CustomEvent(_types.FeedStateEvent.ANNOUNCEMENT, {
|
|
24
|
+
bubbles: true,
|
|
25
|
+
detail: {
|
|
26
|
+
message,
|
|
27
|
+
politeness: this.politeness,
|
|
28
|
+
timestamp: Date.now()
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Clear the announcement
|
|
35
|
+
*/
|
|
36
|
+
clear() {
|
|
37
|
+
this.textElement.textContent = "";
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Change the politeness level
|
|
41
|
+
*/
|
|
42
|
+
setPoliteness(politeness) {
|
|
43
|
+
this.politeness = politeness;
|
|
44
|
+
this.element.setAttribute("aria-live", politeness);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Remove the announcer from DOM
|
|
48
|
+
*/
|
|
49
|
+
destroy() {
|
|
50
|
+
if (this.element.parentNode) {
|
|
51
|
+
this.element.remove();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the announcer element
|
|
56
|
+
*/
|
|
57
|
+
getElement() {
|
|
58
|
+
return this.element;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.Announcer = Announcer;
|
|
62
|
+
//# sourceMappingURL=announcer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcer.js","sources":["../../source/states/announcer.ts"],"sourcesContent":["import { type AnnouncerConfig, type AnnouncerLegacyAPI, FeedStateEvent } from './_types';\n\n/**\n * Creates an ARIA live region for screen reader announcements\n *\n * @param config - Announcer configuration\n * @returns HTMLElement configured as an ARIA live region\n *\n * @example\n * ```typescript\n * const announcer = createAnnouncerElement({\n * message: 'Loading complete, 10 items found',\n * politeness: 'polite'\n * });\n * document.body.appendChild(announcer);\n * ```\n */\nexport function createAnnouncerElement(config: AnnouncerConfig): HTMLElement {\n const { message, politeness = 'polite' } = config;\n\n const container = document.createElement('div');\n const textElement = document.createElement('p');\n\n container.setAttribute('aria-live', politeness);\n container.setAttribute('role', 'status');\n container.classList.add('sr-only');\n\n // Use textContent for security instead of innerHTML\n textElement.textContent = message;\n\n container.appendChild(textElement);\n\n return container;\n}\n\n/**\n * Announcer class for managing ARIA live regions\n *\n * Provides a reusable way to announce dynamic content changes to screen readers.\n *\n * @example\n * ```typescript\n * const announcer = new Announcer({ politeness: 'polite' });\n * document.body.appendChild(announcer.element);\n *\n * // Later, announce something\n * announcer.announce('20 new items loaded');\n *\n * // Cleanup when done\n * announcer.destroy();\n * ```\n */\nexport class Announcer {\n private element: HTMLElement;\n private textElement: HTMLElement;\n private politeness: 'polite' | 'assertive';\n\n constructor(config: Partial<AnnouncerConfig> = {}) {\n this.politeness = config.politeness || 'polite';\n\n // Create the live region\n this.element = document.createElement('div');\n this.element.setAttribute('aria-live', this.politeness);\n this.element.setAttribute('role', 'status');\n this.element.classList.add('sr-only');\n\n // Create text container\n this.textElement = document.createElement('p');\n this.element.appendChild(this.textElement);\n\n // Set initial message if provided\n if (config.message) {\n this.announce(config.message);\n }\n }\n\n /**\n * Announce a message to screen readers\n */\n announce(message: string): void {\n // Use textContent for security\n this.textElement.textContent = message;\n\n // Dispatch custom event for tracking\n this.element.dispatchEvent(\n new CustomEvent(FeedStateEvent.ANNOUNCEMENT, {\n bubbles: true,\n detail: {\n message,\n politeness: this.politeness,\n timestamp: Date.now(),\n },\n })\n );\n }\n\n /**\n * Clear the announcement\n */\n clear(): void {\n this.textElement.textContent = '';\n }\n\n /**\n * Change the politeness level\n */\n setPoliteness(politeness: 'polite' | 'assertive'): void {\n this.politeness = politeness;\n this.element.setAttribute('aria-live', politeness);\n }\n\n /**\n * Remove the announcer from DOM\n */\n destroy(): void {\n if (this.element.parentNode) {\n this.element.remove();\n }\n }\n\n /**\n * Get the announcer element\n */\n getElement(): HTMLElement {\n return this.element;\n }\n}\n\n// =============================================================================\n// Backwards Compatible Exports (Legacy API)\n// =============================================================================\n\n/**\n * @deprecated Use Announcer class or createAnnouncerElement instead\n */\nconst create = (config: AnnouncerConfig): HTMLElement => {\n return createAnnouncerElement(config);\n};\n\n/**\n * @deprecated Use Announcer.announce() instead\n */\nconst update = ({\n container,\n message,\n}: {\n container: HTMLElement;\n message: string;\n}): void => {\n const element = container.querySelector(`[aria-live]`) as HTMLDivElement;\n const textElement = element?.querySelector('p');\n\n if (textElement) {\n textElement.textContent = message; // Use textContent for security\n }\n};\n\n/**\n * Legacy API for backwards compatibility\n * @deprecated Use Announcer class instead\n */\nexport default {\n create,\n update,\n} as AnnouncerLegacyAPI;\n"],"names":["FeedStateEvent"],"mappings":";;;AAoDO,MAAM,UAAU;AAAA,EAKrB,YAAY,SAAmC,IAAI;AACjD,SAAK,aAAa,OAAO,cAAc;AAGvC,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,aAAa,aAAa,KAAK,UAAU;AACtD,SAAK,QAAQ,aAAa,QAAQ,QAAQ;AAC1C,SAAK,QAAQ,UAAU,IAAI,SAAS;AAGpC,SAAK,cAAc,SAAS,cAAc,GAAG;AAC7C,SAAK,QAAQ,YAAY,KAAK,WAAW;AAGzC,QAAI,OAAO,SAAS;AAClB,WAAK,SAAS,OAAO,OAAO;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAuB;AAE9B,SAAK,YAAY,cAAc;AAG/B,SAAK,QAAQ;AAAA,MACX,IAAI,YAAYA,OAAAA,eAAe,cAAc;AAAA,QAC3C,SAAS;AAAA,QACT,QAAQ;AAAA,UACN;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,WAAW,KAAK,IAAA;AAAA,QAAI;AAAA,MACtB,CACD;AAAA,IAAA;AAAA,EAEL;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,YAAY,cAAc;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA0C;AACtD,SAAK,aAAa;AAClB,SAAK,QAAQ,aAAa,aAAa,UAAU;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,QAAQ,YAAY;AAC3B,WAAK,QAAQ,OAAA;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { FeedStateEvent } from "./_types.mjs";
|
|
2
|
+
class Announcer {
|
|
3
|
+
constructor(config = {}) {
|
|
4
|
+
this.politeness = config.politeness || "polite";
|
|
5
|
+
this.element = document.createElement("div");
|
|
6
|
+
this.element.setAttribute("aria-live", this.politeness);
|
|
7
|
+
this.element.setAttribute("role", "status");
|
|
8
|
+
this.element.classList.add("sr-only");
|
|
9
|
+
this.textElement = document.createElement("p");
|
|
10
|
+
this.element.appendChild(this.textElement);
|
|
11
|
+
if (config.message) {
|
|
12
|
+
this.announce(config.message);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Announce a message to screen readers
|
|
17
|
+
*/
|
|
18
|
+
announce(message) {
|
|
19
|
+
this.textElement.textContent = message;
|
|
20
|
+
this.element.dispatchEvent(
|
|
21
|
+
new CustomEvent(FeedStateEvent.ANNOUNCEMENT, {
|
|
22
|
+
bubbles: true,
|
|
23
|
+
detail: {
|
|
24
|
+
message,
|
|
25
|
+
politeness: this.politeness,
|
|
26
|
+
timestamp: Date.now()
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Clear the announcement
|
|
33
|
+
*/
|
|
34
|
+
clear() {
|
|
35
|
+
this.textElement.textContent = "";
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Change the politeness level
|
|
39
|
+
*/
|
|
40
|
+
setPoliteness(politeness) {
|
|
41
|
+
this.politeness = politeness;
|
|
42
|
+
this.element.setAttribute("aria-live", politeness);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Remove the announcer from DOM
|
|
46
|
+
*/
|
|
47
|
+
destroy() {
|
|
48
|
+
if (this.element.parentNode) {
|
|
49
|
+
this.element.remove();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the announcer element
|
|
54
|
+
*/
|
|
55
|
+
getElement() {
|
|
56
|
+
return this.element;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
Announcer
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=announcer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcer.mjs","sources":["../../source/states/announcer.ts"],"sourcesContent":["import { type AnnouncerConfig, type AnnouncerLegacyAPI, FeedStateEvent } from './_types';\n\n/**\n * Creates an ARIA live region for screen reader announcements\n *\n * @param config - Announcer configuration\n * @returns HTMLElement configured as an ARIA live region\n *\n * @example\n * ```typescript\n * const announcer = createAnnouncerElement({\n * message: 'Loading complete, 10 items found',\n * politeness: 'polite'\n * });\n * document.body.appendChild(announcer);\n * ```\n */\nexport function createAnnouncerElement(config: AnnouncerConfig): HTMLElement {\n const { message, politeness = 'polite' } = config;\n\n const container = document.createElement('div');\n const textElement = document.createElement('p');\n\n container.setAttribute('aria-live', politeness);\n container.setAttribute('role', 'status');\n container.classList.add('sr-only');\n\n // Use textContent for security instead of innerHTML\n textElement.textContent = message;\n\n container.appendChild(textElement);\n\n return container;\n}\n\n/**\n * Announcer class for managing ARIA live regions\n *\n * Provides a reusable way to announce dynamic content changes to screen readers.\n *\n * @example\n * ```typescript\n * const announcer = new Announcer({ politeness: 'polite' });\n * document.body.appendChild(announcer.element);\n *\n * // Later, announce something\n * announcer.announce('20 new items loaded');\n *\n * // Cleanup when done\n * announcer.destroy();\n * ```\n */\nexport class Announcer {\n private element: HTMLElement;\n private textElement: HTMLElement;\n private politeness: 'polite' | 'assertive';\n\n constructor(config: Partial<AnnouncerConfig> = {}) {\n this.politeness = config.politeness || 'polite';\n\n // Create the live region\n this.element = document.createElement('div');\n this.element.setAttribute('aria-live', this.politeness);\n this.element.setAttribute('role', 'status');\n this.element.classList.add('sr-only');\n\n // Create text container\n this.textElement = document.createElement('p');\n this.element.appendChild(this.textElement);\n\n // Set initial message if provided\n if (config.message) {\n this.announce(config.message);\n }\n }\n\n /**\n * Announce a message to screen readers\n */\n announce(message: string): void {\n // Use textContent for security\n this.textElement.textContent = message;\n\n // Dispatch custom event for tracking\n this.element.dispatchEvent(\n new CustomEvent(FeedStateEvent.ANNOUNCEMENT, {\n bubbles: true,\n detail: {\n message,\n politeness: this.politeness,\n timestamp: Date.now(),\n },\n })\n );\n }\n\n /**\n * Clear the announcement\n */\n clear(): void {\n this.textElement.textContent = '';\n }\n\n /**\n * Change the politeness level\n */\n setPoliteness(politeness: 'polite' | 'assertive'): void {\n this.politeness = politeness;\n this.element.setAttribute('aria-live', politeness);\n }\n\n /**\n * Remove the announcer from DOM\n */\n destroy(): void {\n if (this.element.parentNode) {\n this.element.remove();\n }\n }\n\n /**\n * Get the announcer element\n */\n getElement(): HTMLElement {\n return this.element;\n }\n}\n\n// =============================================================================\n// Backwards Compatible Exports (Legacy API)\n// =============================================================================\n\n/**\n * @deprecated Use Announcer class or createAnnouncerElement instead\n */\nconst create = (config: AnnouncerConfig): HTMLElement => {\n return createAnnouncerElement(config);\n};\n\n/**\n * @deprecated Use Announcer.announce() instead\n */\nconst update = ({\n container,\n message,\n}: {\n container: HTMLElement;\n message: string;\n}): void => {\n const element = container.querySelector(`[aria-live]`) as HTMLDivElement;\n const textElement = element?.querySelector('p');\n\n if (textElement) {\n textElement.textContent = message; // Use textContent for security\n }\n};\n\n/**\n * Legacy API for backwards compatibility\n * @deprecated Use Announcer class instead\n */\nexport default {\n create,\n update,\n} as AnnouncerLegacyAPI;\n"],"names":[],"mappings":";AAoDO,MAAM,UAAU;AAAA,EAKrB,YAAY,SAAmC,IAAI;AACjD,SAAK,aAAa,OAAO,cAAc;AAGvC,SAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,aAAa,aAAa,KAAK,UAAU;AACtD,SAAK,QAAQ,aAAa,QAAQ,QAAQ;AAC1C,SAAK,QAAQ,UAAU,IAAI,SAAS;AAGpC,SAAK,cAAc,SAAS,cAAc,GAAG;AAC7C,SAAK,QAAQ,YAAY,KAAK,WAAW;AAGzC,QAAI,OAAO,SAAS;AAClB,WAAK,SAAS,OAAO,OAAO;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAuB;AAE9B,SAAK,YAAY,cAAc;AAG/B,SAAK,QAAQ;AAAA,MACX,IAAI,YAAY,eAAe,cAAc;AAAA,QAC3C,SAAS;AAAA,QACT,QAAQ;AAAA,UACN;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,WAAW,KAAK,IAAA;AAAA,QAAI;AAAA,MACtB,CACD;AAAA,IAAA;AAAA,EAEL;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,YAAY,cAAc;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA0C;AACtD,SAAK,aAAa;AAClB,SAAK,QAAQ,aAAa,aAAa,UAAU;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,QAAQ,YAAY;AAC3B,WAAK,QAAQ,OAAA;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ElementModel } from '../_types';
|
|
2
|
+
import { EmptyStateConfig } from './_types';
|
|
3
|
+
export declare function createEmptyElement(config?: EmptyStateConfig): ElementModel;
|
|
4
|
+
export declare class EmptyState {
|
|
5
|
+
private model;
|
|
6
|
+
private container;
|
|
7
|
+
private config;
|
|
8
|
+
constructor(config?: EmptyStateConfig);
|
|
9
|
+
render(container: HTMLElement): void;
|
|
10
|
+
updateMessage(message: string): void;
|
|
11
|
+
destroy(): void;
|
|
12
|
+
get element(): HTMLElement;
|
|
13
|
+
get styles(): string;
|
|
14
|
+
}
|
|
15
|
+
declare const _default: (config?: EmptyStateConfig) => ElementModel;
|
|
16
|
+
export default _default;
|
|
17
|
+
//# sourceMappingURL=empty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"empty.d.ts","sourceRoot":"","sources":["../../source/states/empty.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,gBAAgB,EAAkB,MAAM,UAAU,CAAC;AAkBjE,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,gBAAqB,GAAG,YAAY,CAsD9E;AAiBD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,GAAE,gBAAqB;IAQzC,MAAM,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAkBpC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAWpC,OAAO,IAAI,IAAI;IAUf,IAAI,OAAO,IAAI,WAAW,CAEzB;IAKD,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF;yBAWe,SAAQ,gBAAqB,KAAG,YAAY;AAA5D,wBAEE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const webBuilderLibrary = require("@universityofmaryland/web-builder-library");
|
|
4
|
+
const webElementsLibrary = require("@universityofmaryland/web-elements-library");
|
|
5
|
+
const Styles = require("@universityofmaryland/web-styles-library");
|
|
6
|
+
const theme = require("@universityofmaryland/web-utilities-library/theme");
|
|
7
|
+
const _types = require("./_types.js");
|
|
8
|
+
function _interopNamespaceDefault(e) {
|
|
9
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
10
|
+
if (e) {
|
|
11
|
+
for (const k in e) {
|
|
12
|
+
if (k !== "default") {
|
|
13
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: () => e[k]
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
const Styles__namespace = /* @__PURE__ */ _interopNamespaceDefault(Styles);
|
|
25
|
+
function createEmptyElement(config = {}) {
|
|
26
|
+
const {
|
|
27
|
+
message = "No results found",
|
|
28
|
+
linkUrl,
|
|
29
|
+
linkText,
|
|
30
|
+
isThemeDark = false,
|
|
31
|
+
isAlignedCenter = true
|
|
32
|
+
} = config;
|
|
33
|
+
const headline = new webBuilderLibrary.ElementBuilder(document.createElement("p")).styled(Styles__namespace.typography.sans.compose("extralarge")).withStyles({
|
|
34
|
+
element: {
|
|
35
|
+
textTransform: "uppercase",
|
|
36
|
+
color: theme.theme.foreground(isThemeDark)
|
|
37
|
+
}
|
|
38
|
+
}).build();
|
|
39
|
+
headline.element.textContent = message;
|
|
40
|
+
const composite = new webBuilderLibrary.ElementBuilder().styled(Styles__namespace.layout.grid.stacked).withChild(headline).withStyles({
|
|
41
|
+
element: {
|
|
42
|
+
[`& *`]: {
|
|
43
|
+
textAlign: isAlignedCenter ? "center" : "left"
|
|
44
|
+
},
|
|
45
|
+
[`& *:not(:first-child)`]: {
|
|
46
|
+
marginTop: `${Styles__namespace.token.spacing.md}`
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
if (linkUrl && linkText) {
|
|
51
|
+
const link = document.createElement("a");
|
|
52
|
+
link.textContent = linkText;
|
|
53
|
+
link.setAttribute("href", linkUrl);
|
|
54
|
+
link.setAttribute("target", "_blank");
|
|
55
|
+
link.setAttribute("rel", "noopener noreferrer");
|
|
56
|
+
const ctaButton = webElementsLibrary.Atomic.actions.options({
|
|
57
|
+
element: link,
|
|
58
|
+
isTypeOutline: true,
|
|
59
|
+
isThemeDark
|
|
60
|
+
});
|
|
61
|
+
composite.withChild(ctaButton);
|
|
62
|
+
}
|
|
63
|
+
return composite.build();
|
|
64
|
+
}
|
|
65
|
+
class EmptyState {
|
|
66
|
+
constructor(config = {}) {
|
|
67
|
+
this.container = null;
|
|
68
|
+
this.config = config;
|
|
69
|
+
this.model = createEmptyElement(config);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Render the empty state in a container
|
|
73
|
+
*/
|
|
74
|
+
render(container) {
|
|
75
|
+
this.container = container;
|
|
76
|
+
container.appendChild(this.model.element);
|
|
77
|
+
container.dispatchEvent(
|
|
78
|
+
new CustomEvent(_types.FeedStateEvent.EMPTY_SHOWN, {
|
|
79
|
+
bubbles: true,
|
|
80
|
+
detail: {
|
|
81
|
+
message: this.config.message,
|
|
82
|
+
timestamp: Date.now()
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Update the empty state message
|
|
89
|
+
*/
|
|
90
|
+
updateMessage(message) {
|
|
91
|
+
const headline = this.model.element.querySelector("p");
|
|
92
|
+
if (headline) {
|
|
93
|
+
headline.textContent = message;
|
|
94
|
+
this.config.message = message;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Remove the empty state from DOM
|
|
99
|
+
*/
|
|
100
|
+
destroy() {
|
|
101
|
+
if (this.model.element.parentNode) {
|
|
102
|
+
this.model.element.remove();
|
|
103
|
+
}
|
|
104
|
+
this.container = null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get the empty state element
|
|
108
|
+
*/
|
|
109
|
+
get element() {
|
|
110
|
+
return this.model.element;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get the empty state styles
|
|
114
|
+
*/
|
|
115
|
+
get styles() {
|
|
116
|
+
return this.model.styles;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.EmptyState = EmptyState;
|
|
120
|
+
exports.createEmptyElement = createEmptyElement;
|
|
121
|
+
//# sourceMappingURL=empty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"empty.js","sources":["../../source/states/empty.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { Atomic } from '@universityofmaryland/web-elements-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\n\nimport { type ElementModel } from '../_types';\nimport { type EmptyStateConfig, FeedStateEvent } from './_types';\n\n/**\n * Creates an empty/no results state element\n *\n * @param config - Empty state configuration\n * @returns ElementModel with empty state UI\n *\n * @example\n * ```typescript\n * const empty = createEmptyElement({\n * message: 'No events found',\n * linkUrl: 'https://calendar.umd.edu',\n * linkText: 'View all events'\n * });\n * container.appendChild(empty.element);\n * ```\n */\nexport function createEmptyElement(config: EmptyStateConfig = {}): ElementModel {\n const {\n message = 'No results found',\n linkUrl,\n linkText,\n isThemeDark = false,\n isAlignedCenter = true,\n } = config;\n\n const headline = new ElementBuilder(document.createElement('p'))\n .styled(Styles.typography.sans.compose('extralarge'))\n .withStyles({\n element: {\n textTransform: 'uppercase',\n color: theme.foreground(isThemeDark),\n },\n })\n .build();\n\n // Use textContent for security instead of innerHTML\n headline.element.textContent = message;\n\n const composite = new ElementBuilder()\n .styled(Styles.layout.grid.stacked)\n .withChild(headline)\n .withStyles({\n element: {\n [`& *`]: {\n textAlign: isAlignedCenter ? 'center' : 'left',\n },\n [`& *:not(:first-child)`]: {\n marginTop: `${Styles.token.spacing.md}`,\n },\n },\n });\n\n // Add optional CTA link\n if (linkUrl && linkText) {\n const link = document.createElement('a');\n link.textContent = linkText; // Use textContent for security\n link.setAttribute('href', linkUrl);\n link.setAttribute('target', '_blank');\n link.setAttribute('rel', 'noopener noreferrer');\n\n const ctaButton = Atomic.actions.options({\n element: link,\n isTypeOutline: true,\n isThemeDark,\n });\n\n composite.withChild(ctaButton);\n }\n\n return composite.build();\n}\n\n/**\n * Empty state manager class\n *\n * Manages the display of empty/no results state with optional CTA.\n *\n * @example\n * ```typescript\n * const empty = new EmptyState({\n * message: 'No articles found',\n * linkUrl: 'https://today.umd.edu',\n * linkText: 'View all articles'\n * });\n * empty.render(container);\n * ```\n */\nexport class EmptyState {\n private model: ElementModel;\n private container: HTMLElement | null = null;\n private config: EmptyStateConfig;\n\n constructor(config: EmptyStateConfig = {}) {\n this.config = config;\n this.model = createEmptyElement(config);\n }\n\n /**\n * Render the empty state in a container\n */\n render(container: HTMLElement): void {\n this.container = container;\n container.appendChild(this.model.element);\n\n container.dispatchEvent(\n new CustomEvent(FeedStateEvent.EMPTY_SHOWN, {\n bubbles: true,\n detail: {\n message: this.config.message,\n timestamp: Date.now(),\n },\n })\n );\n }\n\n /**\n * Update the empty state message\n */\n updateMessage(message: string): void {\n const headline = this.model.element.querySelector('p');\n if (headline) {\n headline.textContent = message;\n this.config.message = message;\n }\n }\n\n /**\n * Remove the empty state from DOM\n */\n destroy(): void {\n if (this.model.element.parentNode) {\n this.model.element.remove();\n }\n this.container = null;\n }\n\n /**\n * Get the empty state element\n */\n get element(): HTMLElement {\n return this.model.element;\n }\n\n /**\n * Get the empty state styles\n */\n get styles(): string {\n return this.model.styles;\n }\n}\n\n// =============================================================================\n// Backwards Compatible Export (Legacy API)\n// =============================================================================\n\n/**\n * Create empty state element (legacy function API)\n *\n * @deprecated Use EmptyState class or createEmptyElement function instead\n */\nexport default (config: EmptyStateConfig = {}): ElementModel => {\n return createEmptyElement(config);\n};\n"],"names":["ElementBuilder","Styles","theme","Atomic","FeedStateEvent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwBO,SAAS,mBAAmB,SAA2B,IAAkB;AAC9E,QAAM;AAAA,IACJ,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,kBAAkB;AAAA,EAAA,IAChB;AAEJ,QAAM,WAAW,IAAIA,kBAAAA,eAAe,SAAS,cAAc,GAAG,CAAC,EAC5D,OAAOC,kBAAO,WAAW,KAAK,QAAQ,YAAY,CAAC,EACnD,WAAW;AAAA,IACV,SAAS;AAAA,MACP,eAAe;AAAA,MACf,OAAOC,MAAAA,MAAM,WAAW,WAAW;AAAA,IAAA;AAAA,EACrC,CACD,EACA,MAAA;AAGH,WAAS,QAAQ,cAAc;AAE/B,QAAM,YAAY,IAAIF,kBAAAA,iBACnB,OAAOC,kBAAO,OAAO,KAAK,OAAO,EACjC,UAAU,QAAQ,EAClB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,CAAC,KAAK,GAAG;AAAA,QACP,WAAW,kBAAkB,WAAW;AAAA,MAAA;AAAA,MAE1C,CAAC,uBAAuB,GAAG;AAAA,QACzB,WAAW,GAAGA,kBAAO,MAAM,QAAQ,EAAE;AAAA,MAAA;AAAA,IACvC;AAAA,EACF,CACD;AAGH,MAAI,WAAW,UAAU;AACvB,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,cAAc;AACnB,SAAK,aAAa,QAAQ,OAAO;AACjC,SAAK,aAAa,UAAU,QAAQ;AACpC,SAAK,aAAa,OAAO,qBAAqB;AAE9C,UAAM,YAAYE,mBAAAA,OAAO,QAAQ,QAAQ;AAAA,MACvC,SAAS;AAAA,MACT,eAAe;AAAA,MACf;AAAA,IAAA,CACD;AAED,cAAU,UAAU,SAAS;AAAA,EAC/B;AAEA,SAAO,UAAU,MAAA;AACnB;AAiBO,MAAM,WAAW;AAAA,EAKtB,YAAY,SAA2B,IAAI;AAH3C,SAAQ,YAAgC;AAItC,SAAK,SAAS;AACd,SAAK,QAAQ,mBAAmB,MAAM;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAA8B;AACnC,SAAK,YAAY;AACjB,cAAU,YAAY,KAAK,MAAM,OAAO;AAExC,cAAU;AAAA,MACR,IAAI,YAAYC,OAAAA,eAAe,aAAa;AAAA,QAC1C,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,SAAS,KAAK,OAAO;AAAA,UACrB,WAAW,KAAK,IAAA;AAAA,QAAI;AAAA,MACtB,CACD;AAAA,IAAA;AAAA,EAEL;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAuB;AACnC,UAAM,WAAW,KAAK,MAAM,QAAQ,cAAc,GAAG;AACrD,QAAI,UAAU;AACZ,eAAS,cAAc;AACvB,WAAK,OAAO,UAAU;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,MAAM,QAAQ,YAAY;AACjC,WAAK,MAAM,QAAQ,OAAA;AAAA,IACrB;AACA,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,104 @@
|
|
|
1
|
+
import { ElementBuilder } from "@universityofmaryland/web-builder-library";
|
|
2
|
+
import { Atomic } from "@universityofmaryland/web-elements-library";
|
|
3
|
+
import * as Styles from "@universityofmaryland/web-styles-library";
|
|
4
|
+
import { theme } from "@universityofmaryland/web-utilities-library/theme";
|
|
5
|
+
import { FeedStateEvent } from "./_types.mjs";
|
|
6
|
+
function createEmptyElement(config = {}) {
|
|
7
|
+
const {
|
|
8
|
+
message = "No results found",
|
|
9
|
+
linkUrl,
|
|
10
|
+
linkText,
|
|
11
|
+
isThemeDark = false,
|
|
12
|
+
isAlignedCenter = true
|
|
13
|
+
} = config;
|
|
14
|
+
const headline = new ElementBuilder(document.createElement("p")).styled(Styles.typography.sans.compose("extralarge")).withStyles({
|
|
15
|
+
element: {
|
|
16
|
+
textTransform: "uppercase",
|
|
17
|
+
color: theme.foreground(isThemeDark)
|
|
18
|
+
}
|
|
19
|
+
}).build();
|
|
20
|
+
headline.element.textContent = message;
|
|
21
|
+
const composite = new ElementBuilder().styled(Styles.layout.grid.stacked).withChild(headline).withStyles({
|
|
22
|
+
element: {
|
|
23
|
+
[`& *`]: {
|
|
24
|
+
textAlign: isAlignedCenter ? "center" : "left"
|
|
25
|
+
},
|
|
26
|
+
[`& *:not(:first-child)`]: {
|
|
27
|
+
marginTop: `${Styles.token.spacing.md}`
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
if (linkUrl && linkText) {
|
|
32
|
+
const link = document.createElement("a");
|
|
33
|
+
link.textContent = linkText;
|
|
34
|
+
link.setAttribute("href", linkUrl);
|
|
35
|
+
link.setAttribute("target", "_blank");
|
|
36
|
+
link.setAttribute("rel", "noopener noreferrer");
|
|
37
|
+
const ctaButton = Atomic.actions.options({
|
|
38
|
+
element: link,
|
|
39
|
+
isTypeOutline: true,
|
|
40
|
+
isThemeDark
|
|
41
|
+
});
|
|
42
|
+
composite.withChild(ctaButton);
|
|
43
|
+
}
|
|
44
|
+
return composite.build();
|
|
45
|
+
}
|
|
46
|
+
class EmptyState {
|
|
47
|
+
constructor(config = {}) {
|
|
48
|
+
this.container = null;
|
|
49
|
+
this.config = config;
|
|
50
|
+
this.model = createEmptyElement(config);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Render the empty state in a container
|
|
54
|
+
*/
|
|
55
|
+
render(container) {
|
|
56
|
+
this.container = container;
|
|
57
|
+
container.appendChild(this.model.element);
|
|
58
|
+
container.dispatchEvent(
|
|
59
|
+
new CustomEvent(FeedStateEvent.EMPTY_SHOWN, {
|
|
60
|
+
bubbles: true,
|
|
61
|
+
detail: {
|
|
62
|
+
message: this.config.message,
|
|
63
|
+
timestamp: Date.now()
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Update the empty state message
|
|
70
|
+
*/
|
|
71
|
+
updateMessage(message) {
|
|
72
|
+
const headline = this.model.element.querySelector("p");
|
|
73
|
+
if (headline) {
|
|
74
|
+
headline.textContent = message;
|
|
75
|
+
this.config.message = message;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Remove the empty state from DOM
|
|
80
|
+
*/
|
|
81
|
+
destroy() {
|
|
82
|
+
if (this.model.element.parentNode) {
|
|
83
|
+
this.model.element.remove();
|
|
84
|
+
}
|
|
85
|
+
this.container = null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the empty state element
|
|
89
|
+
*/
|
|
90
|
+
get element() {
|
|
91
|
+
return this.model.element;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the empty state styles
|
|
95
|
+
*/
|
|
96
|
+
get styles() {
|
|
97
|
+
return this.model.styles;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
EmptyState,
|
|
102
|
+
createEmptyElement
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=empty.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"empty.mjs","sources":["../../source/states/empty.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { Atomic } from '@universityofmaryland/web-elements-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\n\nimport { type ElementModel } from '../_types';\nimport { type EmptyStateConfig, FeedStateEvent } from './_types';\n\n/**\n * Creates an empty/no results state element\n *\n * @param config - Empty state configuration\n * @returns ElementModel with empty state UI\n *\n * @example\n * ```typescript\n * const empty = createEmptyElement({\n * message: 'No events found',\n * linkUrl: 'https://calendar.umd.edu',\n * linkText: 'View all events'\n * });\n * container.appendChild(empty.element);\n * ```\n */\nexport function createEmptyElement(config: EmptyStateConfig = {}): ElementModel {\n const {\n message = 'No results found',\n linkUrl,\n linkText,\n isThemeDark = false,\n isAlignedCenter = true,\n } = config;\n\n const headline = new ElementBuilder(document.createElement('p'))\n .styled(Styles.typography.sans.compose('extralarge'))\n .withStyles({\n element: {\n textTransform: 'uppercase',\n color: theme.foreground(isThemeDark),\n },\n })\n .build();\n\n // Use textContent for security instead of innerHTML\n headline.element.textContent = message;\n\n const composite = new ElementBuilder()\n .styled(Styles.layout.grid.stacked)\n .withChild(headline)\n .withStyles({\n element: {\n [`& *`]: {\n textAlign: isAlignedCenter ? 'center' : 'left',\n },\n [`& *:not(:first-child)`]: {\n marginTop: `${Styles.token.spacing.md}`,\n },\n },\n });\n\n // Add optional CTA link\n if (linkUrl && linkText) {\n const link = document.createElement('a');\n link.textContent = linkText; // Use textContent for security\n link.setAttribute('href', linkUrl);\n link.setAttribute('target', '_blank');\n link.setAttribute('rel', 'noopener noreferrer');\n\n const ctaButton = Atomic.actions.options({\n element: link,\n isTypeOutline: true,\n isThemeDark,\n });\n\n composite.withChild(ctaButton);\n }\n\n return composite.build();\n}\n\n/**\n * Empty state manager class\n *\n * Manages the display of empty/no results state with optional CTA.\n *\n * @example\n * ```typescript\n * const empty = new EmptyState({\n * message: 'No articles found',\n * linkUrl: 'https://today.umd.edu',\n * linkText: 'View all articles'\n * });\n * empty.render(container);\n * ```\n */\nexport class EmptyState {\n private model: ElementModel;\n private container: HTMLElement | null = null;\n private config: EmptyStateConfig;\n\n constructor(config: EmptyStateConfig = {}) {\n this.config = config;\n this.model = createEmptyElement(config);\n }\n\n /**\n * Render the empty state in a container\n */\n render(container: HTMLElement): void {\n this.container = container;\n container.appendChild(this.model.element);\n\n container.dispatchEvent(\n new CustomEvent(FeedStateEvent.EMPTY_SHOWN, {\n bubbles: true,\n detail: {\n message: this.config.message,\n timestamp: Date.now(),\n },\n })\n );\n }\n\n /**\n * Update the empty state message\n */\n updateMessage(message: string): void {\n const headline = this.model.element.querySelector('p');\n if (headline) {\n headline.textContent = message;\n this.config.message = message;\n }\n }\n\n /**\n * Remove the empty state from DOM\n */\n destroy(): void {\n if (this.model.element.parentNode) {\n this.model.element.remove();\n }\n this.container = null;\n }\n\n /**\n * Get the empty state element\n */\n get element(): HTMLElement {\n return this.model.element;\n }\n\n /**\n * Get the empty state styles\n */\n get styles(): string {\n return this.model.styles;\n }\n}\n\n// =============================================================================\n// Backwards Compatible Export (Legacy API)\n// =============================================================================\n\n/**\n * Create empty state element (legacy function API)\n *\n * @deprecated Use EmptyState class or createEmptyElement function instead\n */\nexport default (config: EmptyStateConfig = {}): ElementModel => {\n return createEmptyElement(config);\n};\n"],"names":[],"mappings":";;;;;AAwBO,SAAS,mBAAmB,SAA2B,IAAkB;AAC9E,QAAM;AAAA,IACJ,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,kBAAkB;AAAA,EAAA,IAChB;AAEJ,QAAM,WAAW,IAAI,eAAe,SAAS,cAAc,GAAG,CAAC,EAC5D,OAAO,OAAO,WAAW,KAAK,QAAQ,YAAY,CAAC,EACnD,WAAW;AAAA,IACV,SAAS;AAAA,MACP,eAAe;AAAA,MACf,OAAO,MAAM,WAAW,WAAW;AAAA,IAAA;AAAA,EACrC,CACD,EACA,MAAA;AAGH,WAAS,QAAQ,cAAc;AAE/B,QAAM,YAAY,IAAI,iBACnB,OAAO,OAAO,OAAO,KAAK,OAAO,EACjC,UAAU,QAAQ,EAClB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,CAAC,KAAK,GAAG;AAAA,QACP,WAAW,kBAAkB,WAAW;AAAA,MAAA;AAAA,MAE1C,CAAC,uBAAuB,GAAG;AAAA,QACzB,WAAW,GAAG,OAAO,MAAM,QAAQ,EAAE;AAAA,MAAA;AAAA,IACvC;AAAA,EACF,CACD;AAGH,MAAI,WAAW,UAAU;AACvB,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,cAAc;AACnB,SAAK,aAAa,QAAQ,OAAO;AACjC,SAAK,aAAa,UAAU,QAAQ;AACpC,SAAK,aAAa,OAAO,qBAAqB;AAE9C,UAAM,YAAY,OAAO,QAAQ,QAAQ;AAAA,MACvC,SAAS;AAAA,MACT,eAAe;AAAA,MACf;AAAA,IAAA,CACD;AAED,cAAU,UAAU,SAAS;AAAA,EAC/B;AAEA,SAAO,UAAU,MAAA;AACnB;AAiBO,MAAM,WAAW;AAAA,EAKtB,YAAY,SAA2B,IAAI;AAH3C,SAAQ,YAAgC;AAItC,SAAK,SAAS;AACd,SAAK,QAAQ,mBAAmB,MAAM;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAA8B;AACnC,SAAK,YAAY;AACjB,cAAU,YAAY,KAAK,MAAM,OAAO;AAExC,cAAU;AAAA,MACR,IAAI,YAAY,eAAe,aAAa;AAAA,QAC1C,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,SAAS,KAAK,OAAO;AAAA,UACrB,WAAW,KAAK,IAAA;AAAA,QAAI;AAAA,MACtB,CACD;AAAA,IAAA;AAAA,EAEL;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAuB;AACnC,UAAM,WAAW,KAAK,MAAM,QAAQ,cAAc,GAAG;AACrD,QAAI,UAAU;AACZ,eAAS,cAAc;AACvB,WAAK,OAAO,UAAU;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,MAAM,QAAQ,YAAY;AACjC,WAAK,MAAM,QAAQ,OAAA;AAAA,IACrB;AACA,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,10 @@
|
|
|
1
|
+
export { LoadingState, createLoadingElement, } from './loading';
|
|
2
|
+
export { EmptyState, createEmptyElement, } from './empty';
|
|
3
|
+
export { PaginationState, createPaginationElement, } from './pagination';
|
|
4
|
+
export { Announcer, createAnnouncerElement, } from './announcer';
|
|
5
|
+
export type { LoadingStateConfig, EmptyStateConfig, PaginationStateConfig, AnnouncerConfig, FeedStateEvent, FeedState, } from './_types';
|
|
6
|
+
export { default as loader } from './loading';
|
|
7
|
+
export { default as noResults } from './empty';
|
|
8
|
+
export { default as buttonLazyLoad } from './pagination';
|
|
9
|
+
export { default as ariaLive } from './announcer';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/states/index.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,YAAY,EACZ,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,UAAU,EACV,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,eAAe,EACf,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,SAAS,EACT,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,SAAS,GACV,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ElementModel } from '../_types';
|
|
2
|
+
import { LoadingStateConfig, LoaderLegacyAPI } from './_types';
|
|
3
|
+
export declare function createLoadingElement(config?: LoadingStateConfig): ElementModel;
|
|
4
|
+
export declare class LoadingState {
|
|
5
|
+
private model;
|
|
6
|
+
private container;
|
|
7
|
+
private isVisible;
|
|
8
|
+
constructor(config?: LoadingStateConfig);
|
|
9
|
+
show(container: HTMLElement): void;
|
|
10
|
+
hide(): void;
|
|
11
|
+
destroy(): void;
|
|
12
|
+
get element(): HTMLElement;
|
|
13
|
+
get styles(): string;
|
|
14
|
+
}
|
|
15
|
+
declare const _default: LoaderLegacyAPI;
|
|
16
|
+
export default _default;
|
|
17
|
+
//# sourceMappingURL=loading.d.ts.map
|
|
@@ -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,EACL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EAErB,MAAM,UAAU,CAAC;AA6ClB,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;wBA2CI,eAAe;AAJpB,wBAIqB"}
|