@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.
Files changed (207) hide show
  1. package/dist/academic.js +4 -4
  2. package/dist/academic.js.map +1 -1
  3. package/dist/events.js +10 -10
  4. package/dist/events.js.map +1 -1
  5. package/dist/experts.js +8 -8
  6. package/dist/experts.js.map +1 -1
  7. package/dist/factory/core/createBaseFeed.d.ts.map +1 -1
  8. package/dist/factory/core/createBaseFeed.js +19 -17
  9. package/dist/factory/core/createBaseFeed.js.map +1 -1
  10. package/dist/factory/core/types.d.ts +1 -0
  11. package/dist/factory/core/types.d.ts.map +1 -1
  12. package/dist/factory/helpers/displayHandler.js +29 -47
  13. package/dist/factory/helpers/displayHandler.js.map +1 -1
  14. package/dist/factory/helpers/feedHelpers.js +3 -3
  15. package/dist/factory/helpers/feedHelpers.js.map +1 -1
  16. package/dist/factory/helpers/fetchHandler.js +16 -33
  17. package/dist/factory/helpers/fetchHandler.js.map +1 -1
  18. package/dist/feeds/academic/index.d.ts +1 -1
  19. package/dist/feeds/academic/index.d.ts.map +1 -1
  20. package/dist/feeds/academic/slider.d.ts +1 -2
  21. package/dist/feeds/academic/slider.d.ts.map +1 -1
  22. package/dist/feeds/academic/slider.js +7 -6
  23. package/dist/feeds/academic/slider.js.map +1 -1
  24. package/dist/feeds/events/grid.d.ts +1 -2
  25. package/dist/feeds/events/grid.d.ts.map +1 -1
  26. package/dist/feeds/events/grid.js +22 -21
  27. package/dist/feeds/events/grid.js.map +1 -1
  28. package/dist/feeds/events/grouped.d.ts +1 -2
  29. package/dist/feeds/events/grouped.d.ts.map +1 -1
  30. package/dist/feeds/events/grouped.js +62 -78
  31. package/dist/feeds/events/grouped.js.map +1 -1
  32. package/dist/feeds/events/index.d.ts +4 -4
  33. package/dist/feeds/events/index.d.ts.map +1 -1
  34. package/dist/feeds/events/list.d.ts +1 -2
  35. package/dist/feeds/events/list.d.ts.map +1 -1
  36. package/dist/feeds/events/list.js +22 -21
  37. package/dist/feeds/events/list.js.map +1 -1
  38. package/dist/feeds/events/slider.d.ts +1 -2
  39. package/dist/feeds/events/slider.d.ts.map +1 -1
  40. package/dist/feeds/events/slider.js +7 -6
  41. package/dist/feeds/events/slider.js.map +1 -1
  42. package/dist/feeds/experts/_types.d.ts +2 -1
  43. package/dist/feeds/experts/_types.d.ts.map +1 -1
  44. package/dist/feeds/experts/bio.d.ts +1 -2
  45. package/dist/feeds/experts/bio.d.ts.map +1 -1
  46. package/dist/feeds/experts/bio.js +32 -31
  47. package/dist/feeds/experts/bio.js.map +1 -1
  48. package/dist/feeds/experts/grid.d.ts +1 -2
  49. package/dist/feeds/experts/grid.d.ts.map +1 -1
  50. package/dist/feeds/experts/grid.js +24 -23
  51. package/dist/feeds/experts/grid.js.map +1 -1
  52. package/dist/feeds/experts/index.d.ts +3 -3
  53. package/dist/feeds/experts/index.d.ts.map +1 -1
  54. package/dist/feeds/experts/list.d.ts +1 -2
  55. package/dist/feeds/experts/list.d.ts.map +1 -1
  56. package/dist/feeds/experts/list.js +23 -22
  57. package/dist/feeds/experts/list.js.map +1 -1
  58. package/dist/feeds/news/featured.d.ts +1 -2
  59. package/dist/feeds/news/featured.d.ts.map +1 -1
  60. package/dist/feeds/news/featured.js +56 -55
  61. package/dist/feeds/news/featured.js.map +1 -1
  62. package/dist/feeds/news/grid.d.ts +1 -2
  63. package/dist/feeds/news/grid.d.ts.map +1 -1
  64. package/dist/feeds/news/grid.js +24 -23
  65. package/dist/feeds/news/grid.js.map +1 -1
  66. package/dist/feeds/news/index.d.ts +3 -3
  67. package/dist/feeds/news/index.d.ts.map +1 -1
  68. package/dist/feeds/news/list.d.ts +1 -2
  69. package/dist/feeds/news/list.d.ts.map +1 -1
  70. package/dist/feeds/news/list.js +23 -22
  71. package/dist/feeds/news/list.js.map +1 -1
  72. package/dist/helpers/events/index.js +4 -4
  73. package/dist/helpers/events/index.js.map +1 -1
  74. package/dist/helpers/grouping/events.js +10 -10
  75. package/dist/helpers/grouping/events.js.map +1 -1
  76. package/dist/helpers/styles/shadow.js +5 -22
  77. package/dist/helpers/styles/shadow.js.map +1 -1
  78. package/dist/index.js +10 -10
  79. package/dist/index.js.map +1 -1
  80. package/dist/news.js +8 -8
  81. package/dist/news.js.map +1 -1
  82. package/dist/states/_types.d.ts +0 -24
  83. package/dist/states/_types.d.ts.map +1 -1
  84. package/dist/states/_types.js +3 -3
  85. package/dist/states/_types.js.map +1 -1
  86. package/dist/states/announcer.d.ts +1 -3
  87. package/dist/states/announcer.d.ts.map +1 -1
  88. package/dist/states/announcer.js +5 -5
  89. package/dist/states/announcer.js.map +1 -1
  90. package/dist/states/empty.d.ts +0 -2
  91. package/dist/states/empty.d.ts.map +1 -1
  92. package/dist/states/empty.js +15 -32
  93. package/dist/states/empty.js.map +1 -1
  94. package/dist/states/index.d.ts +4 -8
  95. package/dist/states/index.d.ts.map +1 -1
  96. package/dist/states/loading.d.ts +1 -3
  97. package/dist/states/loading.d.ts.map +1 -1
  98. package/dist/states/loading.js +16 -16
  99. package/dist/states/loading.js.map +1 -1
  100. package/dist/states/pagination.d.ts +1 -3
  101. package/dist/states/pagination.d.ts.map +1 -1
  102. package/dist/states/pagination.js +11 -28
  103. package/dist/states/pagination.js.map +1 -1
  104. package/dist/strategies/display/events.js +13 -13
  105. package/dist/strategies/display/events.js.map +1 -1
  106. package/dist/strategies/display/experts.js +23 -23
  107. package/dist/strategies/display/experts.js.map +1 -1
  108. package/dist/strategies/display/news.js +13 -13
  109. package/dist/strategies/display/news.js.map +1 -1
  110. package/dist/strategies/fetch/academic.js +3 -3
  111. package/dist/strategies/fetch/academic.js.map +1 -1
  112. package/dist/strategies/fetch/events.js +13 -13
  113. package/dist/strategies/fetch/events.js.map +1 -1
  114. package/dist/strategies/fetch/experts.d.ts +1 -1
  115. package/dist/strategies/fetch/experts.d.ts.map +1 -1
  116. package/dist/strategies/fetch/experts.js +13 -8
  117. package/dist/strategies/fetch/experts.js.map +1 -1
  118. package/dist/strategies/fetch/graphql.d.ts.map +1 -1
  119. package/dist/strategies/fetch/graphql.js +11 -7
  120. package/dist/strategies/fetch/graphql.js.map +1 -1
  121. package/dist/strategies/fetch/news.js +6 -6
  122. package/dist/strategies/fetch/news.js.map +1 -1
  123. package/dist/strategies/layout/grid.js +11 -11
  124. package/dist/strategies/layout/grid.js.map +1 -1
  125. package/dist/widgets/index.d.ts +1 -1
  126. package/dist/widgets/index.d.ts.map +1 -1
  127. package/dist/widgets/slider.d.ts +1 -2
  128. package/dist/widgets/slider.d.ts.map +1 -1
  129. package/dist/widgets/slider.js +19 -35
  130. package/dist/widgets/slider.js.map +1 -1
  131. package/package.json +15 -14
  132. package/dist/academic.mjs +0 -5
  133. package/dist/academic.mjs.map +0 -1
  134. package/dist/events.mjs +0 -11
  135. package/dist/events.mjs.map +0 -1
  136. package/dist/experts.mjs +0 -9
  137. package/dist/experts.mjs.map +0 -1
  138. package/dist/factory/core/createBaseFeed.mjs +0 -114
  139. package/dist/factory/core/createBaseFeed.mjs.map +0 -1
  140. package/dist/factory/helpers/displayHandler.mjs +0 -169
  141. package/dist/factory/helpers/displayHandler.mjs.map +0 -1
  142. package/dist/factory/helpers/feedHelpers.mjs +0 -32
  143. package/dist/factory/helpers/feedHelpers.mjs.map +0 -1
  144. package/dist/factory/helpers/fetchHandler.mjs +0 -123
  145. package/dist/factory/helpers/fetchHandler.mjs.map +0 -1
  146. package/dist/feeds/academic/slider.mjs +0 -11
  147. package/dist/feeds/academic/slider.mjs.map +0 -1
  148. package/dist/feeds/events/grid.mjs +0 -32
  149. package/dist/feeds/events/grid.mjs.map +0 -1
  150. package/dist/feeds/events/grouped.mjs +0 -337
  151. package/dist/feeds/events/grouped.mjs.map +0 -1
  152. package/dist/feeds/events/list.mjs +0 -33
  153. package/dist/feeds/events/list.mjs.map +0 -1
  154. package/dist/feeds/events/slider.mjs +0 -11
  155. package/dist/feeds/events/slider.mjs.map +0 -1
  156. package/dist/feeds/experts/bio.mjs +0 -147
  157. package/dist/feeds/experts/bio.mjs.map +0 -1
  158. package/dist/feeds/experts/grid.mjs +0 -37
  159. package/dist/feeds/experts/grid.mjs.map +0 -1
  160. package/dist/feeds/experts/list.mjs +0 -26
  161. package/dist/feeds/experts/list.mjs.map +0 -1
  162. package/dist/feeds/news/featured.mjs +0 -379
  163. package/dist/feeds/news/featured.mjs.map +0 -1
  164. package/dist/feeds/news/grid.mjs +0 -37
  165. package/dist/feeds/news/grid.mjs.map +0 -1
  166. package/dist/feeds/news/list.mjs +0 -34
  167. package/dist/feeds/news/list.mjs.map +0 -1
  168. package/dist/helpers/events/index.mjs +0 -21
  169. package/dist/helpers/events/index.mjs.map +0 -1
  170. package/dist/helpers/grouping/events.mjs +0 -147
  171. package/dist/helpers/grouping/events.mjs.map +0 -1
  172. package/dist/helpers/styles/shadow.mjs +0 -16
  173. package/dist/helpers/styles/shadow.mjs.map +0 -1
  174. package/dist/index.mjs +0 -11
  175. package/dist/index.mjs.map +0 -1
  176. package/dist/news.mjs +0 -9
  177. package/dist/news.mjs.map +0 -1
  178. package/dist/states/_types.mjs +0 -12
  179. package/dist/states/_types.mjs.map +0 -1
  180. package/dist/states/announcer.mjs +0 -62
  181. package/dist/states/announcer.mjs.map +0 -1
  182. package/dist/states/empty.mjs +0 -104
  183. package/dist/states/empty.mjs.map +0 -1
  184. package/dist/states/loading.mjs +0 -155
  185. package/dist/states/loading.mjs.map +0 -1
  186. package/dist/states/pagination.mjs +0 -102
  187. package/dist/states/pagination.mjs.map +0 -1
  188. package/dist/strategies/display/events.mjs +0 -60
  189. package/dist/strategies/display/events.mjs.map +0 -1
  190. package/dist/strategies/display/experts.mjs +0 -266
  191. package/dist/strategies/display/experts.mjs.map +0 -1
  192. package/dist/strategies/display/news.mjs +0 -58
  193. package/dist/strategies/display/news.mjs.map +0 -1
  194. package/dist/strategies/fetch/academic.mjs +0 -30
  195. package/dist/strategies/fetch/academic.mjs.map +0 -1
  196. package/dist/strategies/fetch/events.mjs +0 -223
  197. package/dist/strategies/fetch/events.mjs.map +0 -1
  198. package/dist/strategies/fetch/experts.mjs +0 -189
  199. package/dist/strategies/fetch/experts.mjs.map +0 -1
  200. package/dist/strategies/fetch/graphql.mjs +0 -100
  201. package/dist/strategies/fetch/graphql.mjs.map +0 -1
  202. package/dist/strategies/fetch/news.mjs +0 -95
  203. package/dist/strategies/fetch/news.mjs.map +0 -1
  204. package/dist/strategies/layout/grid.mjs +0 -36
  205. package/dist/strategies/layout/grid.mjs.map +0 -1
  206. package/dist/widgets/slider.mjs +0 -87
  207. 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
- exports.eventStartsOnDate = eventStartsOnDate;
140
- exports.getDateBanner = getDateBanner;
141
- exports.getEventPriority = getEventPriority;
142
- exports.getEventStartDate = getEventStartDate;
143
- exports.groupEventsByDate = groupEventsByDate;
144
- exports.isMultiDayEvent = isMultiDayEvent;
145
- exports.parseLocalDate = parseLocalDate;
146
- exports.sortEventsByPriority = sortEventsByPriority;
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":"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"}
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
- "use strict";
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 Styles__namespace.utilities.transform.css.removeDuplicates(
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
- exports.setShadowStyles = setShadowStyles;
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":["Styles"],"mappings":";;;;;;;;;;;;;;;;;;;;AA4BO,MAAM,kBAAkB,OAAO;AAAA,EACpC;AAAA,EACA;AACF,MAGqB;AACnB,QAAM,eAAe,SAAS,cAAc,OAAO;AACnD,QAAM,eAAe,MAAMA,kBAAO,UAAU,UAAU,IAAI;AAAA,IACxD;AAAA,EAAA;AAEF,eAAa,cAAc;AAC3B,aAAW,YAAY,YAAY;AACrC;;"}
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
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const academic = require("./academic.js");
4
- const experts = require("./experts.js");
5
- const events = require("./events.js");
6
- const news = require("./news.js");
7
- exports.academic = academic;
8
- exports.experts = experts;
9
- exports.events = events;
10
- exports.news = news;
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
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const featured = require("./feeds/news/featured.js");
4
- const grid = require("./feeds/news/grid.js");
5
- const list = require("./feeds/news/list.js");
6
- exports.featured = featured;
7
- exports.grid = grid;
8
- exports.list = list;
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":";;;"}
@@ -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":"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"}
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"}
@@ -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
- exports.FeedStateEvent = FeedStateEvent;
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":["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;;"}
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, AnnouncerLegacyAPI } from './_types';
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,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"}
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"}
@@ -1,6 +1,4 @@
1
- "use strict";
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(_types.FeedStateEvent.ANNOUNCEMENT, {
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
- exports.Announcer = Announcer;
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, 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;;"}
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;"}
@@ -12,6 +12,4 @@ export declare class EmptyState {
12
12
  get element(): HTMLElement;
13
13
  get styles(): string;
14
14
  }
15
- declare const _default: (config?: EmptyStateConfig) => ElementModel;
16
- export default _default;
17
15
  //# sourceMappingURL=empty.d.ts.map
@@ -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;yBAWe,SAAQ,gBAAqB,KAAG,YAAY;AAA5D,wBAEE"}
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,27 +1,8 @@
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);
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 webBuilderLibrary.ElementBuilder(document.createElement("p")).styled(Styles__namespace.typography.sans.compose("extralarge")).withStyles({
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.theme.foreground(isThemeDark)
17
+ color: theme.foreground(isThemeDark)
37
18
  }
38
19
  }).build();
39
20
  headline.element.textContent = message;
40
- const composite = new webBuilderLibrary.ElementBuilder().styled(Styles__namespace.layout.grid.stacked).withChild(headline).withStyles({
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: `${Styles__namespace.token.spacing.md}`
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 = webElementsLibrary.Atomic.actions.options({
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(_types.FeedStateEvent.EMPTY_SHOWN, {
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
- exports.EmptyState = EmptyState;
120
- exports.createEmptyElement = createEmptyElement;
100
+ export {
101
+ EmptyState,
102
+ createEmptyElement
103
+ };
121
104
  //# sourceMappingURL=empty.js.map
@@ -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// =============================================================================\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;;;"}
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;"}
@@ -1,10 +1,6 @@
1
- export { LoadingState, createLoadingElement, } from './loading';
2
- export { EmptyState, createEmptyElement, } from './empty';
3
- export { PaginationState, createPaginationElement, } from './pagination';
4
- export { Announcer, createAnnouncerElement, } from './announcer';
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":"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"}
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"}
@@ -1,5 +1,5 @@
1
1
  import { ElementModel } from '../_types';
2
- import { LoadingStateConfig, LoaderLegacyAPI } from './_types';
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,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"}
1
+ {"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../source/states/loading.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,UAAU,CAAC;AA6CnE,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,kBAAuB,GAAG,YAAY,CA0FlF;AAeD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,GAAE,kBAAuB;IAO3C,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAkBlC,IAAI,IAAI,IAAI;IAmBZ,OAAO,IAAI,IAAI;IAQf,IAAI,OAAO,IAAI,WAAW,CAEzB;IAKD,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"}
@@ -1,8 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const webBuilderLibrary = require("@universityofmaryland/web-builder-library");
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 ? Styles.token.color.gray.light : Styles.token.color.gray.dark,
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 webBuilderLibrary.ElementBuilder().withClassName(`${ID_UMD_LOADER}-one`).withStyles({
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 webBuilderLibrary.ElementBuilder().withClassName(`${ID_UMD_LOADER}-two`).withStyles({
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 webBuilderLibrary.ElementBuilder().withClassName(`${ID_UMD_LOADER}-three`).withStyles({
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 webBuilderLibrary.ElementBuilder().withClassName(`${ID_UMD_LOADER}-four`).withStyles({
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 webBuilderLibrary.ElementBuilder().withClassName(`${ID_UMD_LOADER}-wrapper`).withChild(innerElmOne).withChild(innerElmTwo).withChild(innerElmThree).withChild(innerElmFour).withStyles({
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 webBuilderLibrary.ElementBuilder().withClassName(ID_UMD_LOADER).withChild(wrapper).withStyles({
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(_types.FeedStateEvent.LOADING_START, {
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(_types.FeedStateEvent.LOADING_END, {
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
- exports.LoadingState = LoadingState;
154
- exports.createLoadingElement = createLoadingElement;
151
+ export {
152
+ LoadingState,
153
+ createLoadingElement
154
+ };
155
155
  //# sourceMappingURL=loading.js.map