@universityofmaryland/web-feeds-library 1.3.0-beta.0 → 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/dist/academic.js +4 -4
- package/dist/academic.js.map +1 -1
- package/dist/events.js +10 -10
- package/dist/events.js.map +1 -1
- package/dist/experts.js +8 -8
- package/dist/experts.js.map +1 -1
- package/dist/factory/core/createBaseFeed.d.ts.map +1 -1
- package/dist/factory/core/createBaseFeed.js +19 -17
- package/dist/factory/core/createBaseFeed.js.map +1 -1
- package/dist/factory/core/types.d.ts +1 -0
- package/dist/factory/core/types.d.ts.map +1 -1
- package/dist/factory/helpers/displayHandler.js +29 -47
- package/dist/factory/helpers/displayHandler.js.map +1 -1
- package/dist/factory/helpers/feedHelpers.js +3 -3
- package/dist/factory/helpers/feedHelpers.js.map +1 -1
- package/dist/factory/helpers/fetchHandler.js +16 -33
- package/dist/factory/helpers/fetchHandler.js.map +1 -1
- package/dist/feeds/academic/index.d.ts +1 -1
- package/dist/feeds/academic/index.d.ts.map +1 -1
- package/dist/feeds/academic/slider.d.ts +1 -2
- package/dist/feeds/academic/slider.d.ts.map +1 -1
- package/dist/feeds/academic/slider.js +7 -6
- package/dist/feeds/academic/slider.js.map +1 -1
- package/dist/feeds/events/grid.d.ts +1 -2
- package/dist/feeds/events/grid.d.ts.map +1 -1
- package/dist/feeds/events/grid.js +22 -21
- package/dist/feeds/events/grid.js.map +1 -1
- package/dist/feeds/events/grouped.d.ts +1 -2
- package/dist/feeds/events/grouped.d.ts.map +1 -1
- package/dist/feeds/events/grouped.js +62 -78
- package/dist/feeds/events/grouped.js.map +1 -1
- package/dist/feeds/events/index.d.ts +4 -4
- package/dist/feeds/events/index.d.ts.map +1 -1
- package/dist/feeds/events/list.d.ts +1 -2
- package/dist/feeds/events/list.d.ts.map +1 -1
- package/dist/feeds/events/list.js +22 -21
- package/dist/feeds/events/list.js.map +1 -1
- package/dist/feeds/events/slider.d.ts +1 -2
- package/dist/feeds/events/slider.d.ts.map +1 -1
- package/dist/feeds/events/slider.js +7 -6
- package/dist/feeds/events/slider.js.map +1 -1
- package/dist/feeds/experts/_types.d.ts +2 -1
- package/dist/feeds/experts/_types.d.ts.map +1 -1
- package/dist/feeds/experts/bio.d.ts +1 -2
- package/dist/feeds/experts/bio.d.ts.map +1 -1
- package/dist/feeds/experts/bio.js +32 -31
- package/dist/feeds/experts/bio.js.map +1 -1
- package/dist/feeds/experts/grid.d.ts +1 -2
- package/dist/feeds/experts/grid.d.ts.map +1 -1
- package/dist/feeds/experts/grid.js +24 -23
- package/dist/feeds/experts/grid.js.map +1 -1
- package/dist/feeds/experts/index.d.ts +3 -3
- package/dist/feeds/experts/index.d.ts.map +1 -1
- package/dist/feeds/experts/list.d.ts +1 -2
- package/dist/feeds/experts/list.d.ts.map +1 -1
- package/dist/feeds/experts/list.js +23 -22
- package/dist/feeds/experts/list.js.map +1 -1
- package/dist/feeds/news/featured.d.ts +1 -2
- package/dist/feeds/news/featured.d.ts.map +1 -1
- package/dist/feeds/news/featured.js +56 -55
- package/dist/feeds/news/featured.js.map +1 -1
- package/dist/feeds/news/grid.d.ts +1 -2
- package/dist/feeds/news/grid.d.ts.map +1 -1
- package/dist/feeds/news/grid.js +24 -23
- package/dist/feeds/news/grid.js.map +1 -1
- package/dist/feeds/news/index.d.ts +3 -3
- package/dist/feeds/news/index.d.ts.map +1 -1
- package/dist/feeds/news/list.d.ts +1 -2
- package/dist/feeds/news/list.d.ts.map +1 -1
- package/dist/feeds/news/list.js +23 -22
- package/dist/feeds/news/list.js.map +1 -1
- package/dist/helpers/events/index.js +4 -4
- package/dist/helpers/events/index.js.map +1 -1
- package/dist/helpers/grouping/events.js +10 -10
- package/dist/helpers/grouping/events.js.map +1 -1
- package/dist/helpers/styles/shadow.js +5 -22
- package/dist/helpers/styles/shadow.js.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/news.js +8 -8
- package/dist/news.js.map +1 -1
- package/dist/states/_types.d.ts +0 -24
- package/dist/states/_types.d.ts.map +1 -1
- package/dist/states/_types.js +3 -3
- package/dist/states/_types.js.map +1 -1
- package/dist/states/announcer.d.ts +1 -3
- package/dist/states/announcer.d.ts.map +1 -1
- package/dist/states/announcer.js +5 -5
- package/dist/states/announcer.js.map +1 -1
- package/dist/states/empty.d.ts +0 -2
- package/dist/states/empty.d.ts.map +1 -1
- package/dist/states/empty.js +15 -32
- package/dist/states/empty.js.map +1 -1
- package/dist/states/index.d.ts +4 -8
- package/dist/states/index.d.ts.map +1 -1
- package/dist/states/loading.d.ts +1 -3
- package/dist/states/loading.d.ts.map +1 -1
- package/dist/states/loading.js +16 -16
- package/dist/states/loading.js.map +1 -1
- package/dist/states/pagination.d.ts +1 -3
- package/dist/states/pagination.d.ts.map +1 -1
- package/dist/states/pagination.js +11 -28
- package/dist/states/pagination.js.map +1 -1
- package/dist/strategies/display/events.js +13 -13
- package/dist/strategies/display/events.js.map +1 -1
- package/dist/strategies/display/experts.js +23 -23
- package/dist/strategies/display/experts.js.map +1 -1
- package/dist/strategies/display/news.js +13 -13
- package/dist/strategies/display/news.js.map +1 -1
- package/dist/strategies/fetch/academic.js +3 -3
- package/dist/strategies/fetch/academic.js.map +1 -1
- package/dist/strategies/fetch/events.js +13 -13
- package/dist/strategies/fetch/events.js.map +1 -1
- package/dist/strategies/fetch/experts.d.ts +1 -1
- package/dist/strategies/fetch/experts.d.ts.map +1 -1
- package/dist/strategies/fetch/experts.js +13 -8
- package/dist/strategies/fetch/experts.js.map +1 -1
- package/dist/strategies/fetch/graphql.d.ts.map +1 -1
- package/dist/strategies/fetch/graphql.js +11 -7
- package/dist/strategies/fetch/graphql.js.map +1 -1
- package/dist/strategies/fetch/news.js +6 -6
- package/dist/strategies/fetch/news.js.map +1 -1
- package/dist/strategies/layout/grid.js +11 -11
- package/dist/strategies/layout/grid.js.map +1 -1
- package/dist/widgets/index.d.ts +1 -1
- package/dist/widgets/index.d.ts.map +1 -1
- package/dist/widgets/slider.d.ts +1 -2
- package/dist/widgets/slider.d.ts.map +1 -1
- package/dist/widgets/slider.js +19 -35
- package/dist/widgets/slider.js.map +1 -1
- package/package.json +15 -14
- package/dist/academic.mjs +0 -5
- package/dist/academic.mjs.map +0 -1
- package/dist/events.mjs +0 -11
- package/dist/events.mjs.map +0 -1
- package/dist/experts.mjs +0 -9
- package/dist/experts.mjs.map +0 -1
- package/dist/factory/core/createBaseFeed.mjs +0 -114
- package/dist/factory/core/createBaseFeed.mjs.map +0 -1
- package/dist/factory/helpers/displayHandler.mjs +0 -169
- package/dist/factory/helpers/displayHandler.mjs.map +0 -1
- package/dist/factory/helpers/feedHelpers.mjs +0 -32
- package/dist/factory/helpers/feedHelpers.mjs.map +0 -1
- package/dist/factory/helpers/fetchHandler.mjs +0 -123
- package/dist/factory/helpers/fetchHandler.mjs.map +0 -1
- package/dist/feeds/academic/slider.mjs +0 -11
- package/dist/feeds/academic/slider.mjs.map +0 -1
- package/dist/feeds/events/grid.mjs +0 -32
- package/dist/feeds/events/grid.mjs.map +0 -1
- package/dist/feeds/events/grouped.mjs +0 -337
- package/dist/feeds/events/grouped.mjs.map +0 -1
- package/dist/feeds/events/list.mjs +0 -33
- package/dist/feeds/events/list.mjs.map +0 -1
- package/dist/feeds/events/slider.mjs +0 -11
- package/dist/feeds/events/slider.mjs.map +0 -1
- package/dist/feeds/experts/bio.mjs +0 -147
- package/dist/feeds/experts/bio.mjs.map +0 -1
- package/dist/feeds/experts/grid.mjs +0 -37
- package/dist/feeds/experts/grid.mjs.map +0 -1
- package/dist/feeds/experts/list.mjs +0 -26
- package/dist/feeds/experts/list.mjs.map +0 -1
- package/dist/feeds/news/featured.mjs +0 -379
- package/dist/feeds/news/featured.mjs.map +0 -1
- package/dist/feeds/news/grid.mjs +0 -37
- package/dist/feeds/news/grid.mjs.map +0 -1
- package/dist/feeds/news/list.mjs +0 -34
- package/dist/feeds/news/list.mjs.map +0 -1
- package/dist/helpers/events/index.mjs +0 -21
- package/dist/helpers/events/index.mjs.map +0 -1
- package/dist/helpers/grouping/events.mjs +0 -147
- package/dist/helpers/grouping/events.mjs.map +0 -1
- package/dist/helpers/styles/shadow.mjs +0 -16
- package/dist/helpers/styles/shadow.mjs.map +0 -1
- package/dist/index.mjs +0 -11
- package/dist/index.mjs.map +0 -1
- package/dist/news.mjs +0 -9
- package/dist/news.mjs.map +0 -1
- package/dist/states/_types.mjs +0 -12
- package/dist/states/_types.mjs.map +0 -1
- package/dist/states/announcer.mjs +0 -62
- package/dist/states/announcer.mjs.map +0 -1
- package/dist/states/empty.mjs +0 -104
- package/dist/states/empty.mjs.map +0 -1
- package/dist/states/loading.mjs +0 -155
- package/dist/states/loading.mjs.map +0 -1
- package/dist/states/pagination.mjs +0 -102
- package/dist/states/pagination.mjs.map +0 -1
- package/dist/strategies/display/events.mjs +0 -60
- package/dist/strategies/display/events.mjs.map +0 -1
- package/dist/strategies/display/experts.mjs +0 -266
- package/dist/strategies/display/experts.mjs.map +0 -1
- package/dist/strategies/display/news.mjs +0 -58
- package/dist/strategies/display/news.mjs.map +0 -1
- package/dist/strategies/fetch/academic.mjs +0 -30
- package/dist/strategies/fetch/academic.mjs.map +0 -1
- package/dist/strategies/fetch/events.mjs +0 -223
- package/dist/strategies/fetch/events.mjs.map +0 -1
- package/dist/strategies/fetch/experts.mjs +0 -189
- package/dist/strategies/fetch/experts.mjs.map +0 -1
- package/dist/strategies/fetch/graphql.mjs +0 -100
- package/dist/strategies/fetch/graphql.mjs.map +0 -1
- package/dist/strategies/fetch/news.mjs +0 -95
- package/dist/strategies/fetch/news.mjs.map +0 -1
- package/dist/strategies/layout/grid.mjs +0 -36
- package/dist/strategies/layout/grid.mjs.map +0 -1
- package/dist/widgets/slider.mjs +0 -87
- package/dist/widgets/slider.mjs.map +0 -1
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
1
|
const MONTH_MAP = {
|
|
4
2
|
Jan: "01",
|
|
5
3
|
Feb: "02",
|
|
@@ -136,12 +134,14 @@ const groupEventsByDate = (events) => {
|
|
|
136
134
|
return dateA.getTime() - dateB.getTime();
|
|
137
135
|
});
|
|
138
136
|
};
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
137
|
+
export {
|
|
138
|
+
eventStartsOnDate,
|
|
139
|
+
getDateBanner,
|
|
140
|
+
getEventPriority,
|
|
141
|
+
getEventStartDate,
|
|
142
|
+
groupEventsByDate,
|
|
143
|
+
isMultiDayEvent,
|
|
144
|
+
parseLocalDate,
|
|
145
|
+
sortEventsByPriority
|
|
146
|
+
};
|
|
147
147
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sources":["../../../source/helpers/grouping/events.ts"],"sourcesContent":["/**\n * Event Grouping Utilities\n *\n * Utilities for grouping and sorting events by date.\n * Used by the grouped events feed.\n *\n * @module utilities/grouping/events\n */\n\nimport { EventEntry } from 'types/data';\n\nexport interface GroupedEvent {\n date: string;\n events: EventEntry[];\n}\n\nconst MONTH_MAP: Record<string, string> = {\n Jan: '01',\n Feb: '02',\n Mar: '03',\n Apr: '04',\n May: '05',\n Jun: '06',\n Jul: '07',\n Aug: '08',\n Sep: '09',\n Oct: '10',\n Nov: '11',\n Dec: '12',\n};\n\n/**\n * Get a human-readable date banner\n *\n * Returns \"Today\", day name (within 7 days), or formatted date\n */\nexport const getDateBanner = (dateStamp: string): string => {\n // Parse the date string more reliably\n const dateParts = dateStamp.split('T')[0].split('-');\n const year = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1; // Month is 0-indexed\n const day = parseInt(dateParts[2], 10);\n\n // Create dates using local timezone\n const eventDate = new Date(year, month, day);\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const weekFromNow = new Date();\n weekFromNow.setDate(currentDate.getDate() + 7);\n weekFromNow.setHours(0, 0, 0, 0);\n\n // Check if it's today\n if (\n eventDate.getFullYear() === currentDate.getFullYear() &&\n eventDate.getMonth() === currentDate.getMonth() &&\n eventDate.getDate() === currentDate.getDate()\n ) {\n return 'Today';\n }\n\n // Check if it's within the next 7 days\n if (\n eventDate.getTime() > currentDate.getTime() &&\n eventDate.getTime() <= weekFromNow.getTime()\n ) {\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n return days[eventDate.getDay()];\n }\n\n // Otherwise return day of week, month and day\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n const months = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ];\n return `${days[eventDate.getDay()]}, ${\n months[eventDate.getMonth()]\n } ${eventDate.getDate()}`;\n};\n\n/**\n * Parse a date string to local Date object\n */\nexport const parseLocalDate = (dateString: string): Date => {\n const parts = dateString.split('-');\n const date = new Date(\n parseInt(parts[0], 10),\n parseInt(parts[1], 10) - 1,\n parseInt(parts[2], 10),\n );\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\n/**\n * Get the start date of an event\n */\nexport const getEventStartDate = (event: EventEntry): Date => {\n return parseLocalDate(event.startStamp.split('T')[0]);\n};\n\n/**\n * Check if an event spans multiple days\n */\nexport const isMultiDayEvent = (event: EventEntry): boolean => {\n const startParts = event.startStamp.split('T')[0].split('-');\n const startMonth = startParts[1];\n const startDay = startParts[2];\n const endMonth = MONTH_MAP[event.endMonth || ''];\n const endDay = (event.endDay || '').padStart(2, '0');\n\n return !(startMonth === endMonth && startDay === endDay);\n};\n\n/**\n * Check if an event starts on a specific date\n */\nexport const eventStartsOnDate = (event: EventEntry, targetDate: Date): boolean => {\n const eventStartDate = getEventStartDate(event);\n return eventStartDate.getTime() === targetDate.getTime();\n};\n\n/**\n * Get event priority for sorting within a date group\n *\n * Priority:\n * 1. Multi-day events that start on this date\n * 2. Single-day events\n * 3. Multi-day events that don't start on this date\n */\nexport const getEventPriority = (event: EventEntry, groupDate: Date): number => {\n const isMulti = isMultiDayEvent(event);\n const startsOnDate = eventStartsOnDate(event, groupDate);\n\n if (isMulti && startsOnDate) return 1;\n if (!isMulti) return 2;\n return 3;\n};\n\n/**\n * Sort events by priority within a date group\n */\nexport const sortEventsByPriority = (\n events: EventEntry[],\n groupDate: Date,\n): EventEntry[] => {\n return [...events].sort((a, b) => {\n const aPriority = getEventPriority(a, groupDate);\n const bPriority = getEventPriority(b, groupDate);\n return aPriority - bPriority;\n });\n};\n\n/**\n * Group events by date\n *\n * Groups events by their start date, with past events grouped under today.\n * Each group is sorted by priority (multi-day events starting today first).\n */\nexport const groupEventsByDate = (events: EventEntry[]): GroupedEvent[] => {\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const grouped = events.reduce((acc, event) => {\n const eventDate = getEventStartDate(event);\n const dateKey =\n eventDate < currentDate\n ? currentDate.toISOString().split('T')[0]\n : event.startStamp;\n\n if (!acc[dateKey]) {\n acc[dateKey] = {\n date: getDateBanner(dateKey),\n events: [],\n };\n }\n acc[dateKey].events.push(event);\n return acc;\n }, {} as Record<string, GroupedEvent>);\n\n // Sort events within each group by priority\n Object.keys(grouped).forEach((dateKey) => {\n const groupDate = parseLocalDate(dateKey);\n grouped[dateKey].events = sortEventsByPriority(\n grouped[dateKey].events,\n groupDate,\n );\n });\n\n // Return groups sorted by date\n return Object.values(grouped).sort((a, b) => {\n const dateA = new Date(\n Object.keys(grouped).find((key) => grouped[key] === a) || '',\n );\n const dateB = new Date(\n Object.keys(grouped).find((key) => grouped[key] === b) || '',\n );\n return dateA.getTime() - dateB.getTime();\n });\n};\n"],"names":["days"],"mappings":"
|
|
1
|
+
{"version":3,"file":"events.js","sources":["../../../source/helpers/grouping/events.ts"],"sourcesContent":["/**\n * Event Grouping Utilities\n *\n * Utilities for grouping and sorting events by date.\n * Used by the grouped events feed.\n *\n * @module utilities/grouping/events\n */\n\nimport { EventEntry } from 'types/data';\n\nexport interface GroupedEvent {\n date: string;\n events: EventEntry[];\n}\n\nconst MONTH_MAP: Record<string, string> = {\n Jan: '01',\n Feb: '02',\n Mar: '03',\n Apr: '04',\n May: '05',\n Jun: '06',\n Jul: '07',\n Aug: '08',\n Sep: '09',\n Oct: '10',\n Nov: '11',\n Dec: '12',\n};\n\n/**\n * Get a human-readable date banner\n *\n * Returns \"Today\", day name (within 7 days), or formatted date\n */\nexport const getDateBanner = (dateStamp: string): string => {\n // Parse the date string more reliably\n const dateParts = dateStamp.split('T')[0].split('-');\n const year = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1; // Month is 0-indexed\n const day = parseInt(dateParts[2], 10);\n\n // Create dates using local timezone\n const eventDate = new Date(year, month, day);\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const weekFromNow = new Date();\n weekFromNow.setDate(currentDate.getDate() + 7);\n weekFromNow.setHours(0, 0, 0, 0);\n\n // Check if it's today\n if (\n eventDate.getFullYear() === currentDate.getFullYear() &&\n eventDate.getMonth() === currentDate.getMonth() &&\n eventDate.getDate() === currentDate.getDate()\n ) {\n return 'Today';\n }\n\n // Check if it's within the next 7 days\n if (\n eventDate.getTime() > currentDate.getTime() &&\n eventDate.getTime() <= weekFromNow.getTime()\n ) {\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n return days[eventDate.getDay()];\n }\n\n // Otherwise return day of week, month and day\n const days = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ];\n const months = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ];\n return `${days[eventDate.getDay()]}, ${\n months[eventDate.getMonth()]\n } ${eventDate.getDate()}`;\n};\n\n/**\n * Parse a date string to local Date object\n */\nexport const parseLocalDate = (dateString: string): Date => {\n const parts = dateString.split('-');\n const date = new Date(\n parseInt(parts[0], 10),\n parseInt(parts[1], 10) - 1,\n parseInt(parts[2], 10),\n );\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\n/**\n * Get the start date of an event\n */\nexport const getEventStartDate = (event: EventEntry): Date => {\n return parseLocalDate(event.startStamp.split('T')[0]);\n};\n\n/**\n * Check if an event spans multiple days\n */\nexport const isMultiDayEvent = (event: EventEntry): boolean => {\n const startParts = event.startStamp.split('T')[0].split('-');\n const startMonth = startParts[1];\n const startDay = startParts[2];\n const endMonth = MONTH_MAP[event.endMonth || ''];\n const endDay = (event.endDay || '').padStart(2, '0');\n\n return !(startMonth === endMonth && startDay === endDay);\n};\n\n/**\n * Check if an event starts on a specific date\n */\nexport const eventStartsOnDate = (event: EventEntry, targetDate: Date): boolean => {\n const eventStartDate = getEventStartDate(event);\n return eventStartDate.getTime() === targetDate.getTime();\n};\n\n/**\n * Get event priority for sorting within a date group\n *\n * Priority:\n * 1. Multi-day events that start on this date\n * 2. Single-day events\n * 3. Multi-day events that don't start on this date\n */\nexport const getEventPriority = (event: EventEntry, groupDate: Date): number => {\n const isMulti = isMultiDayEvent(event);\n const startsOnDate = eventStartsOnDate(event, groupDate);\n\n if (isMulti && startsOnDate) return 1;\n if (!isMulti) return 2;\n return 3;\n};\n\n/**\n * Sort events by priority within a date group\n */\nexport const sortEventsByPriority = (\n events: EventEntry[],\n groupDate: Date,\n): EventEntry[] => {\n return [...events].sort((a, b) => {\n const aPriority = getEventPriority(a, groupDate);\n const bPriority = getEventPriority(b, groupDate);\n return aPriority - bPriority;\n });\n};\n\n/**\n * Group events by date\n *\n * Groups events by their start date, with past events grouped under today.\n * Each group is sorted by priority (multi-day events starting today first).\n */\nexport const groupEventsByDate = (events: EventEntry[]): GroupedEvent[] => {\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n const grouped = events.reduce((acc, event) => {\n const eventDate = getEventStartDate(event);\n const dateKey =\n eventDate < currentDate\n ? currentDate.toISOString().split('T')[0]\n : event.startStamp;\n\n if (!acc[dateKey]) {\n acc[dateKey] = {\n date: getDateBanner(dateKey),\n events: [],\n };\n }\n acc[dateKey].events.push(event);\n return acc;\n }, {} as Record<string, GroupedEvent>);\n\n // Sort events within each group by priority\n Object.keys(grouped).forEach((dateKey) => {\n const groupDate = parseLocalDate(dateKey);\n grouped[dateKey].events = sortEventsByPriority(\n grouped[dateKey].events,\n groupDate,\n );\n });\n\n // Return groups sorted by date\n return Object.values(grouped).sort((a, b) => {\n const dateA = new Date(\n Object.keys(grouped).find((key) => grouped[key] === a) || '',\n );\n const dateB = new Date(\n Object.keys(grouped).find((key) => grouped[key] === b) || '',\n );\n return dateA.getTime() - dateB.getTime();\n });\n};\n"],"names":["days"],"mappings":"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"}
|
|
@@ -1,33 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const Styles = require("@universityofmaryland/web-styles-library");
|
|
4
|
-
function _interopNamespaceDefault(e) {
|
|
5
|
-
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
6
|
-
if (e) {
|
|
7
|
-
for (const k in e) {
|
|
8
|
-
if (k !== "default") {
|
|
9
|
-
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
10
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
11
|
-
enumerable: true,
|
|
12
|
-
get: () => e[k]
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
n.default = e;
|
|
18
|
-
return Object.freeze(n);
|
|
19
|
-
}
|
|
20
|
-
const Styles__namespace = /* @__PURE__ */ _interopNamespaceDefault(Styles);
|
|
1
|
+
import * as Styles from "@universityofmaryland/web-styles-library";
|
|
21
2
|
const setShadowStyles = async ({
|
|
22
3
|
shadowRoot,
|
|
23
4
|
styles
|
|
24
5
|
}) => {
|
|
25
6
|
const styleElement = document.createElement("style");
|
|
26
|
-
const optimizedCss = await
|
|
7
|
+
const optimizedCss = await Styles.utilities.transform.css.removeDuplicates(
|
|
27
8
|
styles
|
|
28
9
|
);
|
|
29
10
|
styleElement.textContent = optimizedCss;
|
|
30
11
|
shadowRoot.appendChild(styleElement);
|
|
31
12
|
};
|
|
32
|
-
|
|
13
|
+
export {
|
|
14
|
+
setShadowStyles
|
|
15
|
+
};
|
|
33
16
|
//# sourceMappingURL=shadow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow.js","sources":["../../../source/helpers/styles/shadow.ts"],"sourcesContent":["/**\n * Shadow DOM Styles Utility\n *\n * Utilities for managing styles within Shadow DOM contexts.\n *\n * @module utilities/styles/shadow\n */\n\nimport * as Styles from '@universityofmaryland/web-styles-library';\n\n/**\n * Sets optimized styles on a shadow root\n *\n * This function takes a CSS string, removes duplicate rules for optimization,\n * and injects it into a shadow root via a style element.\n *\n * @param shadowRoot - The shadow root to inject styles into\n * @param styles - CSS string to optimize and inject\n *\n * @example\n * ```typescript\n * const shadowRoot = element.attachShadow({ mode: 'open' });\n * await setShadowStyles({\n * shadowRoot,\n * styles: '.my-class { color: red; }'\n * });\n * ```\n */\nexport const setShadowStyles = async ({\n shadowRoot,\n styles,\n}: {\n shadowRoot: ShadowRoot;\n styles: string;\n}): Promise<void> => {\n const styleElement = document.createElement('style');\n const optimizedCss = await Styles.utilities.transform.css.removeDuplicates(\n styles,\n );\n styleElement.textContent = optimizedCss;\n shadowRoot.appendChild(styleElement);\n};\n\n/**\n * Updates shadow root styles by replacing or appending\n *\n * This function can either replace all existing styles or append new styles\n * to an existing shadow root.\n *\n * @param shadowRoot - The shadow root to update\n * @param styles - CSS string to optimize and inject\n * @param replace - If true, removes all existing style elements first\n *\n * @example\n * ```typescript\n * // Append additional styles\n * await updateShadowStyles({\n * shadowRoot,\n * styles: '.new-class { color: blue; }',\n * replace: false\n * });\n *\n * // Replace all styles\n * await updateShadowStyles({\n * shadowRoot,\n * styles: '.only-class { color: green; }',\n * replace: true\n * });\n * ```\n */\nexport const updateShadowStyles = async ({\n shadowRoot,\n styles,\n replace = false,\n}: {\n shadowRoot: ShadowRoot;\n styles: string;\n replace?: boolean;\n}): Promise<void> => {\n if (replace) {\n // Remove all existing style elements\n const existingStyles = shadowRoot.querySelectorAll('style');\n existingStyles.forEach((style) => style.remove());\n }\n\n await setShadowStyles({ shadowRoot, styles });\n};\n"],"names":[
|
|
1
|
+
{"version":3,"file":"shadow.js","sources":["../../../source/helpers/styles/shadow.ts"],"sourcesContent":["/**\n * Shadow DOM Styles Utility\n *\n * Utilities for managing styles within Shadow DOM contexts.\n *\n * @module utilities/styles/shadow\n */\n\nimport * as Styles from '@universityofmaryland/web-styles-library';\n\n/**\n * Sets optimized styles on a shadow root\n *\n * This function takes a CSS string, removes duplicate rules for optimization,\n * and injects it into a shadow root via a style element.\n *\n * @param shadowRoot - The shadow root to inject styles into\n * @param styles - CSS string to optimize and inject\n *\n * @example\n * ```typescript\n * const shadowRoot = element.attachShadow({ mode: 'open' });\n * await setShadowStyles({\n * shadowRoot,\n * styles: '.my-class { color: red; }'\n * });\n * ```\n */\nexport const setShadowStyles = async ({\n shadowRoot,\n styles,\n}: {\n shadowRoot: ShadowRoot;\n styles: string;\n}): Promise<void> => {\n const styleElement = document.createElement('style');\n const optimizedCss = await Styles.utilities.transform.css.removeDuplicates(\n styles,\n );\n styleElement.textContent = optimizedCss;\n shadowRoot.appendChild(styleElement);\n};\n\n/**\n * Updates shadow root styles by replacing or appending\n *\n * This function can either replace all existing styles or append new styles\n * to an existing shadow root.\n *\n * @param shadowRoot - The shadow root to update\n * @param styles - CSS string to optimize and inject\n * @param replace - If true, removes all existing style elements first\n *\n * @example\n * ```typescript\n * // Append additional styles\n * await updateShadowStyles({\n * shadowRoot,\n * styles: '.new-class { color: blue; }',\n * replace: false\n * });\n *\n * // Replace all styles\n * await updateShadowStyles({\n * shadowRoot,\n * styles: '.only-class { color: green; }',\n * replace: true\n * });\n * ```\n */\nexport const updateShadowStyles = async ({\n shadowRoot,\n styles,\n replace = false,\n}: {\n shadowRoot: ShadowRoot;\n styles: string;\n replace?: boolean;\n}): Promise<void> => {\n if (replace) {\n // Remove all existing style elements\n const existingStyles = shadowRoot.querySelectorAll('style');\n existingStyles.forEach((style) => style.remove());\n }\n\n await setShadowStyles({ shadowRoot, styles });\n};\n"],"names":[],"mappings":";AA4BO,MAAM,kBAAkB,OAAO;AAAA,EACpC;AAAA,EACA;AACF,MAGqB;AACnB,QAAM,eAAe,SAAS,cAAc,OAAO;AACnD,QAAM,eAAe,MAAM,OAAO,UAAU,UAAU,IAAI;AAAA,IACxD;AAAA,EAAA;AAEF,eAAa,cAAc;AAC3B,aAAW,YAAY,YAAY;AACrC;"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import * as academic from "./academic.js";
|
|
2
|
+
import * as experts from "./experts.js";
|
|
3
|
+
import * as events from "./events.js";
|
|
4
|
+
import * as news from "./news.js";
|
|
5
|
+
export {
|
|
6
|
+
academic,
|
|
7
|
+
events,
|
|
8
|
+
experts,
|
|
9
|
+
news
|
|
10
|
+
};
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/dist/news.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { newsFeatured } from "./feeds/news/featured.js";
|
|
2
|
+
import { newsGrid } from "./feeds/news/grid.js";
|
|
3
|
+
import { newsList } from "./feeds/news/list.js";
|
|
4
|
+
export {
|
|
5
|
+
newsFeatured as featured,
|
|
6
|
+
newsGrid as grid,
|
|
7
|
+
newsList as list
|
|
8
|
+
};
|
|
9
9
|
//# sourceMappingURL=news.js.map
|
package/dist/news.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"news.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"news.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
package/dist/states/_types.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ElementModel } from '../_types';
|
|
2
1
|
export interface LoadingStateConfig {
|
|
3
2
|
isThemeDark?: boolean;
|
|
4
3
|
}
|
|
@@ -34,27 +33,4 @@ export interface FeedState {
|
|
|
34
33
|
hide?: () => void;
|
|
35
34
|
destroy?: () => void;
|
|
36
35
|
}
|
|
37
|
-
export interface LoaderLegacyAPI {
|
|
38
|
-
create: (config: LoadingStateConfig) => ElementModel;
|
|
39
|
-
display: (props: {
|
|
40
|
-
container: HTMLElement;
|
|
41
|
-
isThemeDark?: boolean;
|
|
42
|
-
}) => void;
|
|
43
|
-
remove: (props: {
|
|
44
|
-
container: HTMLElement;
|
|
45
|
-
}) => void;
|
|
46
|
-
}
|
|
47
|
-
export interface AnnouncerLegacyAPI {
|
|
48
|
-
create: (config: AnnouncerConfig) => HTMLElement;
|
|
49
|
-
update: (props: {
|
|
50
|
-
container: HTMLElement;
|
|
51
|
-
message: string;
|
|
52
|
-
}) => void;
|
|
53
|
-
}
|
|
54
|
-
export interface PaginationLegacyAPI {
|
|
55
|
-
create: (config: PaginationStateConfig) => ElementModel | undefined;
|
|
56
|
-
remove: (props: {
|
|
57
|
-
container: HTMLElement;
|
|
58
|
-
}) => void;
|
|
59
|
-
}
|
|
60
36
|
//# sourceMappingURL=_types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_types.d.ts","sourceRoot":"","sources":["../../source/states/_types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"_types.d.ts","sourceRoot":"","sources":["../../source/states/_types.ts"],"names":[],"mappings":"AAGA,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"}
|
package/dist/states/_types.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
1
|
var FeedStateEvent = /* @__PURE__ */ ((FeedStateEvent2) => {
|
|
4
2
|
FeedStateEvent2["LOADING_START"] = "feed:loading:start";
|
|
5
3
|
FeedStateEvent2["LOADING_END"] = "feed:loading:end";
|
|
@@ -8,5 +6,7 @@ var FeedStateEvent = /* @__PURE__ */ ((FeedStateEvent2) => {
|
|
|
8
6
|
FeedStateEvent2["ANNOUNCEMENT"] = "feed:announcement";
|
|
9
7
|
return FeedStateEvent2;
|
|
10
8
|
})(FeedStateEvent || {});
|
|
11
|
-
|
|
9
|
+
export {
|
|
10
|
+
FeedStateEvent
|
|
11
|
+
};
|
|
12
12
|
//# sourceMappingURL=_types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_types.js","sources":["../../source/states/_types.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"_types.js","sources":["../../source/states/_types.ts"],"sourcesContent":["/**\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"],"names":["FeedStateEvent"],"mappings":"AAwCO,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;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnnouncerConfig
|
|
1
|
+
import { AnnouncerConfig } from './_types';
|
|
2
2
|
export declare function createAnnouncerElement(config: AnnouncerConfig): HTMLElement;
|
|
3
3
|
export declare class Announcer {
|
|
4
4
|
private element;
|
|
@@ -11,6 +11,4 @@ export declare class Announcer {
|
|
|
11
11
|
destroy(): void;
|
|
12
12
|
getElement(): HTMLElement;
|
|
13
13
|
}
|
|
14
|
-
declare const _default: AnnouncerLegacyAPI;
|
|
15
|
-
export default _default;
|
|
16
14
|
//# sourceMappingURL=announcer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcer.d.ts","sourceRoot":"","sources":["../../source/states/announcer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"announcer.d.ts","sourceRoot":"","sources":["../../source/states/announcer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAkB,MAAM,UAAU,CAAC;AAiBhE,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"}
|
package/dist/states/announcer.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const _types = require("./_types.js");
|
|
1
|
+
import { FeedStateEvent } from "./_types.js";
|
|
4
2
|
class Announcer {
|
|
5
3
|
constructor(config = {}) {
|
|
6
4
|
this.politeness = config.politeness || "polite";
|
|
@@ -20,7 +18,7 @@ class Announcer {
|
|
|
20
18
|
announce(message) {
|
|
21
19
|
this.textElement.textContent = message;
|
|
22
20
|
this.element.dispatchEvent(
|
|
23
|
-
new CustomEvent(
|
|
21
|
+
new CustomEvent(FeedStateEvent.ANNOUNCEMENT, {
|
|
24
22
|
bubbles: true,
|
|
25
23
|
detail: {
|
|
26
24
|
message,
|
|
@@ -58,5 +56,7 @@ class Announcer {
|
|
|
58
56
|
return this.element;
|
|
59
57
|
}
|
|
60
58
|
}
|
|
61
|
-
|
|
59
|
+
export {
|
|
60
|
+
Announcer
|
|
61
|
+
};
|
|
62
62
|
//# sourceMappingURL=announcer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcer.js","sources":["../../source/states/announcer.ts"],"sourcesContent":["import { type AnnouncerConfig,
|
|
1
|
+
{"version":3,"file":"announcer.js","sources":["../../source/states/announcer.ts"],"sourcesContent":["import { type AnnouncerConfig, 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"],"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;"}
|
package/dist/states/empty.d.ts
CHANGED
|
@@ -1 +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
|
|
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"}
|
package/dist/states/empty.js
CHANGED
|
@@ -1,27 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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);
|
|
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.js";
|
|
25
6
|
function createEmptyElement(config = {}) {
|
|
26
7
|
const {
|
|
27
8
|
message = "No results found",
|
|
@@ -30,20 +11,20 @@ function createEmptyElement(config = {}) {
|
|
|
30
11
|
isThemeDark = false,
|
|
31
12
|
isAlignedCenter = true
|
|
32
13
|
} = config;
|
|
33
|
-
const headline = new
|
|
14
|
+
const headline = new ElementBuilder(document.createElement("p")).styled(Styles.typography.sans.compose("extralarge")).withStyles({
|
|
34
15
|
element: {
|
|
35
16
|
textTransform: "uppercase",
|
|
36
|
-
color: theme.
|
|
17
|
+
color: theme.foreground(isThemeDark)
|
|
37
18
|
}
|
|
38
19
|
}).build();
|
|
39
20
|
headline.element.textContent = message;
|
|
40
|
-
const composite = new
|
|
21
|
+
const composite = new ElementBuilder().styled(Styles.layout.grid.stacked).withChild(headline).withStyles({
|
|
41
22
|
element: {
|
|
42
23
|
[`& *`]: {
|
|
43
24
|
textAlign: isAlignedCenter ? "center" : "left"
|
|
44
25
|
},
|
|
45
26
|
[`& *:not(:first-child)`]: {
|
|
46
|
-
marginTop: `${
|
|
27
|
+
marginTop: `${Styles.token.spacing.md}`
|
|
47
28
|
}
|
|
48
29
|
}
|
|
49
30
|
});
|
|
@@ -53,7 +34,7 @@ function createEmptyElement(config = {}) {
|
|
|
53
34
|
link.setAttribute("href", linkUrl);
|
|
54
35
|
link.setAttribute("target", "_blank");
|
|
55
36
|
link.setAttribute("rel", "noopener noreferrer");
|
|
56
|
-
const ctaButton =
|
|
37
|
+
const ctaButton = Atomic.actions.options({
|
|
57
38
|
element: link,
|
|
58
39
|
isTypeOutline: true,
|
|
59
40
|
isThemeDark
|
|
@@ -75,7 +56,7 @@ class EmptyState {
|
|
|
75
56
|
this.container = container;
|
|
76
57
|
container.appendChild(this.model.element);
|
|
77
58
|
container.dispatchEvent(
|
|
78
|
-
new CustomEvent(
|
|
59
|
+
new CustomEvent(FeedStateEvent.EMPTY_SHOWN, {
|
|
79
60
|
bubbles: true,
|
|
80
61
|
detail: {
|
|
81
62
|
message: this.config.message,
|
|
@@ -116,6 +97,8 @@ class EmptyState {
|
|
|
116
97
|
return this.model.styles;
|
|
117
98
|
}
|
|
118
99
|
}
|
|
119
|
-
|
|
120
|
-
|
|
100
|
+
export {
|
|
101
|
+
EmptyState,
|
|
102
|
+
createEmptyElement
|
|
103
|
+
};
|
|
121
104
|
//# sourceMappingURL=empty.js.map
|
package/dist/states/empty.js.map
CHANGED
|
@@ -1 +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
|
|
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"],"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;"}
|
package/dist/states/index.d.ts
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
export { LoadingState, createLoadingElement
|
|
2
|
-
export { EmptyState, createEmptyElement
|
|
3
|
-
export { PaginationState, createPaginationElement
|
|
4
|
-
export { Announcer, createAnnouncerElement
|
|
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
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
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/states/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/states/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEhE,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,SAAS,GACV,MAAM,UAAU,CAAC"}
|
package/dist/states/loading.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ElementModel } from '../_types';
|
|
2
|
-
import { LoadingStateConfig
|
|
2
|
+
import { LoadingStateConfig } from './_types';
|
|
3
3
|
export declare function createLoadingElement(config?: LoadingStateConfig): ElementModel;
|
|
4
4
|
export declare class LoadingState {
|
|
5
5
|
private model;
|
|
@@ -12,6 +12,4 @@ export declare class LoadingState {
|
|
|
12
12
|
get element(): HTMLElement;
|
|
13
13
|
get styles(): string;
|
|
14
14
|
}
|
|
15
|
-
declare const _default: LoaderLegacyAPI;
|
|
16
|
-
export default _default;
|
|
17
15
|
//# sourceMappingURL=loading.d.ts.map
|
|
@@ -1 +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,
|
|
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"}
|
package/dist/states/loading.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const Styles = require("@universityofmaryland/web-styles-library");
|
|
5
|
-
const _types = require("./_types.js");
|
|
1
|
+
import { ElementBuilder } from "@universityofmaryland/web-builder-library";
|
|
2
|
+
import { token } from "@universityofmaryland/web-styles-library";
|
|
3
|
+
import { FeedStateEvent } from "./_types.js";
|
|
6
4
|
const ID_UMD_LOADER = "umd-loader-container";
|
|
7
5
|
const keyframes = `
|
|
8
6
|
@keyframes loader-first-animation {
|
|
@@ -41,43 +39,43 @@ function createLoadingElement(config = {}) {
|
|
|
41
39
|
width: "8px",
|
|
42
40
|
height: "8px",
|
|
43
41
|
borderRadius: "50%",
|
|
44
|
-
background: isThemeDark ?
|
|
42
|
+
background: isThemeDark ? token.color.gray.light : token.color.gray.dark,
|
|
45
43
|
animationTimingFunction: "cubic-bezier(0, 1, 1, 0)"
|
|
46
44
|
};
|
|
47
|
-
const innerElmOne = new
|
|
45
|
+
const innerElmOne = new ElementBuilder().withClassName(`${ID_UMD_LOADER}-one`).withStyles({
|
|
48
46
|
element: {
|
|
49
47
|
...defaultDotStyles,
|
|
50
48
|
left: "5px",
|
|
51
49
|
animation: "loader-first-animation 0.6s infinite"
|
|
52
50
|
}
|
|
53
51
|
}).build();
|
|
54
|
-
const innerElmTwo = new
|
|
52
|
+
const innerElmTwo = new ElementBuilder().withClassName(`${ID_UMD_LOADER}-two`).withStyles({
|
|
55
53
|
element: {
|
|
56
54
|
...defaultDotStyles,
|
|
57
55
|
left: "5px",
|
|
58
56
|
animation: "loader-middle-animation 0.6s infinite"
|
|
59
57
|
}
|
|
60
58
|
}).build();
|
|
61
|
-
const innerElmThree = new
|
|
59
|
+
const innerElmThree = new ElementBuilder().withClassName(`${ID_UMD_LOADER}-three`).withStyles({
|
|
62
60
|
element: {
|
|
63
61
|
...defaultDotStyles,
|
|
64
62
|
left: "24px",
|
|
65
63
|
animation: "loader-middle-animation 0.6s infinite"
|
|
66
64
|
}
|
|
67
65
|
}).build();
|
|
68
|
-
const innerElmFour = new
|
|
66
|
+
const innerElmFour = new ElementBuilder().withClassName(`${ID_UMD_LOADER}-four`).withStyles({
|
|
69
67
|
element: {
|
|
70
68
|
...defaultDotStyles,
|
|
71
69
|
left: "45px",
|
|
72
70
|
animation: "loader-last-animation 0.6s infinite"
|
|
73
71
|
}
|
|
74
72
|
}).build();
|
|
75
|
-
const wrapper = new
|
|
73
|
+
const wrapper = new ElementBuilder().withClassName(`${ID_UMD_LOADER}-wrapper`).withChild(innerElmOne).withChild(innerElmTwo).withChild(innerElmThree).withChild(innerElmFour).withStyles({
|
|
76
74
|
element: {
|
|
77
75
|
position: "relative"
|
|
78
76
|
}
|
|
79
77
|
}).build();
|
|
80
|
-
const composite = new
|
|
78
|
+
const composite = new ElementBuilder().withClassName(ID_UMD_LOADER).withChild(wrapper).withStyles({
|
|
81
79
|
element: {
|
|
82
80
|
display: "flex",
|
|
83
81
|
justifyContent: "center",
|
|
@@ -106,7 +104,7 @@ class LoadingState {
|
|
|
106
104
|
container.appendChild(this.model.element);
|
|
107
105
|
this.isVisible = true;
|
|
108
106
|
container.dispatchEvent(
|
|
109
|
-
new CustomEvent(
|
|
107
|
+
new CustomEvent(FeedStateEvent.LOADING_START, {
|
|
110
108
|
bubbles: true,
|
|
111
109
|
detail: { timestamp: Date.now() }
|
|
112
110
|
})
|
|
@@ -122,7 +120,7 @@ class LoadingState {
|
|
|
122
120
|
this.isVisible = false;
|
|
123
121
|
if (this.container) {
|
|
124
122
|
this.container.dispatchEvent(
|
|
125
|
-
new CustomEvent(
|
|
123
|
+
new CustomEvent(FeedStateEvent.LOADING_END, {
|
|
126
124
|
bubbles: true,
|
|
127
125
|
detail: { timestamp: Date.now() }
|
|
128
126
|
})
|
|
@@ -150,6 +148,8 @@ class LoadingState {
|
|
|
150
148
|
return this.model.styles;
|
|
151
149
|
}
|
|
152
150
|
}
|
|
153
|
-
|
|
154
|
-
|
|
151
|
+
export {
|
|
152
|
+
LoadingState,
|
|
153
|
+
createLoadingElement
|
|
154
|
+
};
|
|
155
155
|
//# sourceMappingURL=loading.js.map
|