PageSourceSearch

https://www.kcl.ac.uk/_GhbZtw_8fe3d6e8-6c75-4fc9-88ef-46b7f2723b06…/modern/js/1092.1af8d86d81df7cf88d55.mjs

js kcl.ac.uk collected 2026-09-24 07:33:23 UTC 84,693 bytes, 2,847 lines download raw bytes

1"use strict";
2(self["__LOADABLE_LOADED_CHUNKS__"] = self["__LOADABLE_LOADED_CHUNKS__"] || []).push([[1092],{
3
4/***/ 32624
5(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6
7
8// EXPORTS
9__webpack_require__.d(__webpack_exports__, {
10  Z: () => (/* binding */ ContactUs)
11});
12
13// EXTERNAL MODULE: ./node_modules/react/index.js
14var react = __webpack_require__(29633);
15// EXTERNAL MODULE: ./node_modules/prop-types/index.js
16var prop_types = __webpack_require__(86627);
17var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
18// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
19var styled_components_browser_esm = __webpack_require__(67780);
20// EXTERNAL MODULE: ./src/app/blocks/theme/breakpoints.js
21var breakpoints = __webpack_require__(3726);
22;// ./src/app/blocks/pages/ContentGeneric/ContactUs/ContactUs.styled.js
23
24
25const ContactUsStyled = styled_components_browser_esm["default"].div`
26  background-color: ${(p) => p.$bgColour === "Primary" ? "#ffffff" : "#eaeff0"};
27  border-radius: 8px;
28  padding: 24px;
29  @media (max-width: ${breakpoints/* breakpoints */.f.desktop - 1}px) {
30    width: auto;
31    margin: 8px 16px;
32  }
33
34  .contact-us--content {
35    display: flex;
36    flex-direction: column;
37    gap: 12px;
38  }
39
40  ${(p) => p.$fullWidth && `
41    .contact-us--content {
42      max-width: 80%;
43      gap: 24px;
44    }
45
46    @media (min-width: ${breakpoints/* breakpoints */.f.desktop}px) {
47      padding: 64px 24px;
48    }
49
50    @media (max-width: ${breakpoints/* breakpoints */.f.desktop - 1}px) {
51      padding: 12px;
52      border-radius: 0;
53      width: 100%;
54
55      .contact-us--content {
56        max-width: 100%;
57        gap: 8px;
58      }
59
60      .section-divider {
61        margin: 16px 0;
62      }
63    }
64  `}
65
66  .contact-us--title {
67    font-family: Wix Madefor Display, sans-serif;
68    font-size: 1.5rem;
69    font-weight: 700;
70    line-height: 1.3;
71    color: #000000;
72    text-transform: none;
73  }
74
75  .contact-us--summary {
76    color: #000000;
77    font-family: Wix MadeFor Text, sans-serif;
78    font-size: 1rem;
79    font-weight: 400;
80    line-height: 1.5;
81  }
82
83  .contact-us--subheading {
84    color: #000000;
85    font-family: Wix MadeFor Text, sans-serif;
86    font-size: 1rem;
87    font-weight: 700;
88    line-height: 1.5;
89    margin-bottom: -4px;
90  }
91
92  .linkCta {
93    &:visited {
94      .linkCta--text {
95        color: #8056c1;
96      }
97
98      .svg-inline--fa {
99        color: #8056c1;
100      }
101    }
102
103    &:hover {
104      .linkCta--text {
105        color: #002395;
106        text-decoration: none;
107      }
108    }
109
110    &:focus-visible {
111      background: #ffdd00;
112      box-shadow: inset 0 -4px 0 #000;
113      outline: none;
114      padding: 2px;
115
116      .linkCta--text {
117        color: #000;
118      }
119    }
120  }
121
122  .linkCta--text {
123    color: #005ad2;
124    font-family: Wix MadeFor Text, sans-serif;
125    font-size: 1rem;
126    font-weight: 700;
127    line-height: 1.5;
128    text-decoration: underline;
129  }
130
131  .link--title {
132    text-decoration: none;
133  }
134
135  .contact-us--email {
136    margin-bottom: 0;
137  }
138
139  .contact-us-email--icon {
140    padding-right: 8px;
141    padding-top: 4.8px;
142  }
143
144  .contact-us--telephone {
145    margin-bottom: 0;
146  }
147
148  .contact-us--telephone-icon {
149    padding-right: 8px;
150    padding-top: 4.8px;
151  }
152
153  .contact-us--location-icon {
154    padding-top: 4.8px;
155    padding-right: 8px;
156  }
157
158  .section-divider {
159    width: 100%;
160    height: 1px;
161    background: #a5afb5;
162  }
163`;
164
165// EXTERNAL MODULE: ./src/app/features/common/utils/getEntryLink.js
166var getEntryLink = __webpack_require__(40153);
167// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules
168var components = __webpack_require__(61009);
169// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js
170var index_es = __webpack_require__(18149);
171// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules
172var utils = __webpack_require__(92562);
173// EXTERNAL MODULE: ./src/app/core/util/isClient.js
174var isClient = __webpack_require__(74831);
175// EXTERNAL MODULE: ./src/app/features/common/Map/Map.js + 1 modules
176var Map = __webpack_require__(2962);
177;// ./src/app/blocks/pages/ContentGeneric/ContactUs/ContactUsMap.js
178
179
180
181
182
183function ContactUsMap({ location, showMap }) {
184  return /* @__PURE__ */ react.createElement(react.Fragment, null, (0,isClient/* default */.A)() && showMap && /* @__P
184URE__ */ react.createElement(
185    Map/* default */.A,
186    {
187      attributionControl: true,
188      center: [location.location.lat, location.location.lon],
189      markers: [
190        {
191          key: location.name,
192          position: [location.location.lat, location.location.lon],
193          popup: /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("a", { href: (0,getEntryLink/* default */.A)(location) }, location.name))
194        }
195      ]
196    }
197  ));
198}
199ContactUsMap.propTypes = {
200  location: (prop_types_default()).object,
201  showMap: (prop_types_default()).bool
202};
203
204;// ./src/app/blocks/pages/ContentGeneric/ContactUs/utils/helpers.js
205function hasAnyLocationData(location) {
206  return Boolean(
207    location?.phoneNumber || location?.location?.entryTitle || location?.location?.address
208  );
209}
210
211;// ./src/app/blocks/pages/ContentGeneric/ContactUs/ContactUsOtherLocations.js
212
213
214
215
216
217
218
219function ContactUsOtherLocations({ otherLocations }) {
220  if ((0,utils/* isInvalidArray */.J_)(otherLocations)) {
221    return null;
222  }
223  const validLocations = otherLocations.filter(hasAnyLocationData);
224  if ((0,utils/* isInvalidArray */.J_)(validLocations)) {
225    return null;
226  }
227  return /* @__PURE__ */ react.createElement(react.Fragment, null, validLocations.map((location, index) => /* @__PURE__ */ react.createElement(react.Fragment, { key: index }, location?.heading && /* @__PURE__ */ react.createElement("p", { className: "contact-us--subheading" }, location.heading), location?.phoneNumber && /* @__PURE__ */ react.createElement(
228    components/* LinkCta */.$l,
229    {
230      url: `tel:${location.phoneNumber}`,
231      className: "contact-us--telephone",
232      leftIcon: /* @__PURE__ */ react.createElement(
233        index_es/* FontAwesomeIcon */.g,
234        {
235          icon: "fa-regular fa-phone",
236          className: "contact-us--telephone-icon"
237        }
238      )
239    },
240    location.phoneNumber
241  ), location?.location?.entryTitle && location?.location?.address && /* @__P
241URE__ */ react.createElement(
242    components/* LinkCta */.$l,
243    {
244      url: (0,getEntryLink/* default */.A)(location.location),
245      title: location.entryTitle,
246      leftIcon: /* @__PURE__ */ react.createElement(
247        index_es/* FontAwesomeIcon */.g,
248        {
249          className: "contact-us--location-icon",
250          icon: "fa-regular fa-location-pin"
251        }
252      )
253    },
254    `${location.location.entryTitle}, ${location.location.address}`
255  ), /* @__PURE__ */ react.createElement("div", { className: "section-divider" }))));
256}
257ContactUsOtherLocations.propTypes = {
258  otherLocations: (prop_types_default()).array,
259  phoneNumber: (prop_types_default()).string
260};
261
262;// ./src/app/blocks/pages/ContentGeneric/ContactUs/ContactUs.js
263
264
265
266
267
268
269
270
271
272function ContactUs({ value, fullWidth, backgroundColour }) {
273  const {
274    title,
275    summary,
276    emailAddress,
277    phoneNumber,
278    location,
279    subscribeHeading,
280    subscribeSummary,
281    subscribeLink,
282    showMap,
283    otherLocations
284  } = value;
285  if (!(0,utils/* isFeatureEnabled */.G7)("FEATURE_CONTACT_US") || (0,utils/* isInvalidObject */.b2)(value)) {
286    return null;
287  }
288  const content = /* @__PURE__ */ react.createElement(components/* KIExpansionPanel */.M1, { panelTitle: title, defaultExpanded: true }, /* @__PURE__ */ react.createElement("div", { className: "contact-us--content" }, summary && /* @__PURE__ */ react.createElement("p", { className: "contact-us--summary" }
288, summary), emailAddress && /* @__PURE__ */ react.createElement(
289    components/* LinkCta */.$l,
290    {
291      url: `mailto:${emailAddress}`,
292      className: "contact-us--email",
293      leftIcon: /* @__PURE__ */ react.createElement(
294        index_es/* FontAwesomeIcon */.g,
295        {
296          icon: "fa-regular fa-envelope",
297          className: "contact-us-email--icon"
298        }
299      )
300    },
301    emailAddress
302  ), phoneNumber && /* @__PURE__ */ react.createElement(
303    components/* LinkCta */.$l,
304    {
305      url: `tel:${phoneNumber}`,
306      className: "contact-us--telephone",
307      leftIcon: /* @__PURE__ */ react.createElement(
308        index_es/* FontAwesomeIcon */.g,
309        {
310          icon: "fa-regular fa-phone",
311          className: "contact-us--telephone-icon"
312        }
313      )
314    },
315    phoneNumber
316  ), location?.entryTitle && location?.address && /* @__PURE__ */ react.createElement(
317    components/* LinkCta */.$l,
318    {
319      url: (0,getEntryLink/* default */.A)(location),
320      title: location.entryTitle,
321      leftIcon: /* @__PURE__ */ react.createElement(
322        index_es/* FontAwesomeIcon */.g,
323        {
324          className: "contact-us--location-icon",
325          icon: "fa-regular fa-location-pin"
326        }
327      )
328    },
329    `${location.entryTitle}, ${location.address}`
330  ), location && /* @__PURE__ */ react.createElement(ContactUsMap, { location, showMap }), otherLocations && /* @__PURE__ */ react.createElement(ContactUsOtherLocations, { otherLocations }), subscribeHeading && /* @__PURE__ */ react.createElement("p", { className: "contact-us--subheading" }, subscribeHeading), subscribeSummary && /* @__PURE__ */ react.createElement("p", { className: "contact-us--summary" }, subscribeSummary), subscribeLink?.entryTitle && /* @__PURE__ */ react.createElement(
331    components/* LinkCta */.$l,
332    {
333      childClassName: "link--title",
334      maxCharacterLength: 150,
335      url: (0,getEntryLink/* default */.A)(subscribeLink),
336      title: subscribeLink.entryTitle,
337      rightIcon: /* @__PURE__ */ react.createElement("div", { className: "icon-container" }, /* @__PURE__ */ react.createElement(
338        index_es/* FontAwesomeIcon */.g,
339        {
340          icon: "fa-solid fa-arrow-right",
341          className: "icon--right"
342        }
343      ))
344    },
345    subscribeLink.entryTitle
346  )));
347  return /* @__PURE__ */ react.createElement(ContactUsStyled, { $bgColour: backgroundColour, $fullWidth: fullWidth }, fullWidth ? /* @__PURE__ */ react.createElement(components/* ResponsiveContainer */.uf, null, content) : content);
348}
349ContactUs.propTypes = {
350  value: (prop_types_default()).object,
351  fullWidth: (prop_types_default()).bool,
352  backgroundColour: (prop_types_default()).string
353};
354
355
356/***/ },
357
358/***/ 65795
359(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
360
361
362// EXPORTS
363__webpack_require__.d(__webpack_exports__, {
364  y: () => (/* binding */ CourseListing)
365});
366
367// EXTERNAL MODULE: ./node_modules/react/index.js
368var react = __webpack_require__(29633);
369// EXTERNAL MODULE: ./node_modules/prop-types/index.js
370var prop_types = __webpack_require__(86627);
371var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
372// EXTERNAL MODULE: ./node_modules/react-redux/es/index.js + 20 modules
373var es = __webpack_require__(10136);
374// EXTERNAL MODULE: ./src/app/core/redux/selectors/courseListing.js
375var courseListing = __webpack_require__(74906);
376;// ./src/app/core/redux/hooks/useCourseListing.js
377
378
379const useCourseListing = () => (0,es/* useSelector */.d4)((state) => (0,courseListing/* selectCourseListingEntries */.s)(state));
380
381;// ./src/app/core/redux/hooks/index.js
382
383
384// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules
385var components = __webpack_require__(61009);
386// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
387var styled_components_browser_esm = __webpack_require__(67780);
388// EXTERNAL MODULE: ./src/app/blocks/theme/breakpoints.js
389var breakpoints = __webpack_require__(3726);
390;// ./src/app/blocks/pages/ContentGeneric/CourseListing/CourseListing.styled.js
391
392
393const CourseListingStyled = styled_components_browser_esm["default"].div`
394  .responsive-outer-container {
395    margin: 64px 0;
396
397    ${(p) => p.$isEmbedded && (0,styled_components_browser_esm.css)`
398        margin: 0;
399      `}
400  }
401`;
402const CourseListingHeadingStyled = styled_components_browser_esm["default"].div`
403  .course-listing-heading {
404    text-align: ${(p) => p.$centered ? "center" : "left"};
405    font-size: 2rem;
406    font-style: normal;
407    font-weight: 400;
408    line-height: 1.2;
409    font-family: Kings Caslon Display, sans-serif;
410    text-transform: none;
411
412    @media (min-width: ${breakpoints/* mediaBreakpoints */.l.desktop}) {
413      font-size: 2.375rem;
414    }
415  }
416`;
417const CourseListingSummaryStyled = styled_components_browser_esm["default"].p`
418  text-align: ${(p) => p.$centered ? "center" : "left"};
419
420  ${(p) => {
421  if (p.$centered) {
422    return (0,styled_components_browser_esm.css)`
423        text-align: center;
424        max-width: 822px;
425        margin: 0 auto;
426      `;
427  }
428  return (0,styled_components_browser_esm.css)`
429      text-align: left;
430    `;
431}}
432
433  margin-top: 24px;
434  font-size: 1.125rem;
435  font-style: normal;
436  font-weight: 400;
437  line-height: 1.5;
438  font-family: Wix MadeFor Text, sans-serif;
439`;
440const CardsListStyled = styled_components_browser_esm["default"].div`
441  display: flex;
442  flex-direction: column;
443  gap: 32px 0;
444  margin-top: 32px;
445  margin-bottom: 16px;
446  width: 100%;
447  padding: 0 4px 16px;
448  box-sizing: border-box;
449
450  @media (min-width: ${breakpoints/* mediaBreakpoints */.l.desktop}) {
451    margin-top: 40px;
452  }
453`;
454
455// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js
456var index_es = __webpack_require__(18149);
457;// ./src/app/blocks/pages/ContentGeneric/CourseListing/CourseCard/CourseCard.styled.js
458
459const accessibilityLinkStyles = {
460  focusVisible: (0,styled_components_browser_esm.css)`
461    &:focus-visible {
462      background: #ffdd00;
463      box-shadow: inset 0 -4px 0 #000;
464      outline: none;
465      padding: 2px;
466      span {
467        color: #000;
468      }
469    }
470  `,
471  hover: (0,styled_components_browser_esm.css)`
472    &:hover,
473    &:focus {
474      color: #002395;
475      text-decoration: none;
476
477      .svg-inline--fa {
478        color: #002395;
479      }
480    }
481  `,
482  visited: (0,styled_components_browser_esm.css)`
483    &:visited {
484      color: #8056c1;
485
486      .svg-inline--fa {
487        color: #8056c1;
488      }
489    }
490  `
491};
492const CourseCardStyled = styled_components_browser_esm["default"].article`
493  background-color: #fff;
494  border-radius: 8px;
495  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
496  padding: 16px;
497  width: 100%;
498  overflow: visible;
499  box-sizing: border-box;
500
501  @media (min-width: ${(p) => p.theme?.breakpoints?.smallTablet ?? 768}px) {
502    padding: 24px;
503  }
504
505  .course-card-title {
506    display: flex;
507    margin-bottom: 16px;
508
509    & > .course-card-link {
510      width: 100%;
511      font-weight: 700;
512      line-height: 1.3;
513      color: #005ad2;
514      text-decoration: none;
515
516      ${accessibilityLinkStyles.focusVisible}
517      ${accessibilityLinkStyles.hover}
518      ${accessibilityLinkStyles.visited}
519
520      .linkCta--text {
521        font-family: Wix MadeFor Display, sans-serif;
522        font-size: 1.125rem;
523      }
524
525      .svg-inline--fa {
526        height: 27px;
527      }
528
529      @media (min-width: ${(p) => p.theme?.breakpoints?.smallTablet ?? 768}px) {
530        .linkCta--text {
531          font-size: 1.5rem;
532        }
533
534        .svg-inline--fa {
535          height: 31px;
536        }
537      }
538    }
539  }
540
541  .course-card-meta {
542    display: flex;
543    flex-direction: column;
544    align-items: flex-start;
545    gap: 6px;
546    margin-bottom: 16px;
547
548    @media (min-width: ${(p) => p.theme?.breakpoints?.smallTablet ?? 768}px) {
549      flex-direction: row;
550      flex-wrap: wrap;
551      align-items: center;
552      gap: 6px 24px;
553    }
554  }
555
556  .course-card-description {
557    font-size: 1rem;
558    line-height: 1.5;
559    font-weight: 400;
560    font-family: Wix MadeFor Text, sans-serif;
561    color: #000;
562    margin: 0;
563    display: -webkit-box;
564    -webkit-box-orient: vertical;
565    -webkit-line-clamp: 6;
566    overflow: hidden;
567    text-overflow: ellipsis;
568  }
569
570  @media (min-width: ${(p) => p.theme?.breakpoints?.smallTablet ?? 768}px) {
571    .course-card-description {
572      -webkit-line-clamp: 2;
573    }
574  }
575`;
576const ArrowIconStyled = styled_components_browser_esm["default"].span`
577  flex-shrink: 0;
578  color: #005ad2;
579  font-size: 1rem;
580`;
581const MetaItemStyled = styled_components_browser_esm["default"].div`
582  display: flex;
583  align-items: start;
584  gap: 6px;
585  font-size: 0.875rem;
586  font-weight: 700;
587  font-family: Wix MadeFor Text, sans-serif;
588  color: #000;
589
590  svg {
591    flex-shrink: 0;
592    color: #000;
593    width: 16px;
594    height: 16px;
595    font-size: 16px;
596  }
597
598  .fa-chalkboard-user,
599  .fa-laptop {
600    transform: scale(1.15);
601    transform-origin: center;
602  }
603
604  .meta-item-icons {
605    display: flex;
606    column-gap: 4px;
607  }
608
609  @media (min-width: ${(p) => p.theme?.breakpoints?.desktop ?? 1024}px) {
610    gap: 12px;
611  }
612`;
613
614// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules
615var utils = __webpack_require__(92562);
616;// ./src/app/blocks/pages/ContentGeneric/CourseListing/utils.js
617
618const DELIVERY_MODE_ICONS = {
619  "In person": ["fa-regular fa-user"],
620  "On campus": ["fa-regular fa-location-dot"],
621  Hyflex: ["fa-regular fa-location-crosshairs"],
622  Online: ["fa-regular fa-laptop"],
623  Blended: ["fa-regular fa-user", "fa-regular fa-laptop"],
624  "Work based": ["fa-regular fa-briefcase"],
625  "Classroom & Online": [
626    "fa-regular fa-laptop",
627    "fa-regular fa-chalkboard-user"
628  ]
629};
630function getDeliveryModeIcons(entryTitle) {
631  return DELIVERY_MODE_ICONS[entryTitle] || ["fa-regular fa-circle-info"];
632}
633function normalizeStudyMode(studyMode) {
634  if ((0,utils/* isValidArray */.OP)(studyMode)) {
635    return studyMode.map(({ entryTitle }) => entryTitle).join(" ");
636  }
637  if ((0,utils/* IsValidObject */.GF)(studyMode)) {
638    return studyMode.entryTitle;
639  }
640  return "";
641}
642function normalizeDeliveryMode(deliveryMode) {
643  if ((0,utils/* isValidArray */.OP)(deliveryMode)) {
644    return deliveryMode.map(({ entryTitle }) => ({
645      label: entryTitle,
646      icons: getDeliveryModeIcons(entryTitle)
647    }));
648  }
649  if ((0,utils/* IsValidObject */.GF)(deliveryMode)) {
650    const entryTitle = deliveryMode.entryTitle;
651    return [
652      {
653        label: entryTitle,
654        icons: getDeliveryModeIcons(entryTitle)
655      }
656    ];
657  }
658  return [];
659}
660
661;// ./src/app/blocks/pages/ContentGeneric/CourseListing/CourseCard/index.js
662
663
664
665
666
667
668
669function CourseCard({ item }) {
670  const {
671    ucasCode,
672    qualification,
673    entryTitle,
674    duration,
675    studyMode,
676    deliveryMode,
677    entryDescription,
678    pageOverride,
679    sys
680  } = item;
681  const qualificationTitle = qualification?.entryTitle;
682  const displayTitle = entryTitle && qualificationTitle ? `${entryTitle} ${qualificationTitle}`.trim() : entryTitle;
683  const studyModeLabel = normalizeStudyMode(studyMode);
684  const deliveryModes = normalizeDeliveryMode(deliveryMode);
685  const displayUrl = pageOverride || sys.uri || "#";
686  const isExternalUrl = sys.contentTypeId === "postgraduateCourse" && pageOverride;
687  const linkIcon = isExternalUrl ? "fa-regular fa-arrow-up-right-from-square" : "fa-regular fa-arrow-right";
688  const ariaLabel = isExternalUrl ? `${displayTitle} (opens in a new tab)` : displayTitle;
689  const showMeta = Boolean(
690    ucasCode || duration || studyModeLabel || (0,utils/* isValidArray */.OP)(deliveryModes)
691  );
692  return /* @__PURE__ */ react.createElement(CourseCardStyled, null, /* @__PURE__ */ react.createElement("div", { className: "course-card-title" }, /* @__PURE__ */ react.createElement(
693    components/* LinkCta */.$l,
694    {
695      ariaLabel,
696      url: displayUrl,
697      rightIcon: /* @__PURE__ */ react.createElement(ArrowIconStyled, { "aria-hidden": true }, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: linkIcon })),
698      maxCharacterLength: 160,
699      className: "course-card-link"
700    },
701    displayTitle
702  )), showMeta && /* @__PURE__ */ react.createElement("div", { className: "course-card-meta" }, ucasCode && /* @__PURE__ */ react.createElement(MetaItemStyled, null, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-display-code" }), /* @__PURE__ */ react.createElement("span", null, "UCAS CODE: ", ucasCode)), duration && /* @__PURE__ */ react.createElement(MetaItemStyled, null, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-calendar" }), /* @__PURE__ */ react.createElement("span", null, duration)), studyModeLabel && /* @__PURE__ */ react.createElement(MetaItemStyled, null, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-clock" }), /* @__PURE__ */ react.createElement("span", null, studyModeLabel)), deliveryModes.map(({ label, icons }, idx) => /* @__PURE__ */ react.createElement(MetaItemStyled, { key: `${label}-${idx}` }, /* @__PURE__ */ react.createElement("div", { className: "meta-item-icons" }, icons.map((icon, iconIdx) => /* @__PURE__ */ react.createElement(
703    index_es/* FontAwesomeIcon */.g,
704    {
705      key: `${label}-${idx}-${iconIdx}`,
706      icon,
707      "aria-hidden": true
708    }
709  ))), /* @__PURE__ */ react.createElement("span", null, label)))), entryDescription && /* @__P
709URE__ */ react.createElement("p", { className: "course-card-description", title: entryDescription }, entryDescription));
710}
711CourseCard.propTypes = {
712  item: (prop_types_default()).object
713};
714
715;// ./src/app/blocks/pages/ContentGeneric/CourseListing/index.js
716
717
718
719
720
721
722
723function CourseListing({ value, isEmbedded }) {
724  const {
725    heading,
726    summary,
727    headingLevel = "Level 2",
728    alignment = "center"
729  } = value;
730  const items = useCourseListing();
731  const hasCourses = (0,utils/* isValidArray */.OP)(items);
732  if (!heading && !summary && !hasCourses) {
733    return null;
734  }
735  return /* @__PURE__ */ react.createElement(CourseListingStyled, { $isEmbedded: isEmbedded }, /* @__PURE__ */ react.createElement(components/* ResponsiveContainer */.uf, { isEmbedded }, heading && /* @__PURE__ */ react.createElement(CourseListingHeadingStyled, { $centered: alignment === "center" }, /* @__PURE__ */ react.createElement(
736    components/* Heading */.DZ,
737    {
738      headingText: heading,
739      headingLevel,
740      className: "course-listing-heading"
741    }
742  )), summary && /* @__PURE__ */ react.createElement(CourseListingSummaryStyled, { $centered: true }, summary), hasCourses && /* @__PURE__ */ react.createElement(CardsListStyled, null, items.map((item) => /* @__PURE__ */ react.createElement(CourseCard, { key: item.sys.id, item })))));
743}
744CourseListing.propTypes = {
745  isEmbedded: (prop_types_default()).bool,
746  value: (prop_types_default()).object
747};
748
749
750/***/ },
751
752/***/ 80969
753(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
754
755/* harmony export */ __webpack_require__.d(__webpack_exports__, {
756/* harmony export */   N: () => (/* binding */ RichTextWrapper)
757/* harmony export */ });
758/* harmony import */ var styled_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(67780);
759/* harmony import */ var _theme_breakpoints__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3726);
760
761
762const RichTextWrapper = styled_components__WEBPACK_IMPORTED_MODULE_0__["default"].div`
763  padding: 16px 0;
764
765  @media (min-width: ${_theme_breakpoints__WEBPACK_IMPORTED_MODULE_1__/* .mediaBreakpoints */ .l.desktop}) {
766    padding: 46px 0;
767  }
768`;
769
770
771/***/ },
772
773/***/ 43415
774(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
775
776
777// EXPORTS
778__webpack_require__.d(__webpack_exports__, {
779  U: () => (/* binding */ HubPromoSection)
780});
781
782// EXTERNAL MODULE: ./node_modules/react/index.js
783var react = __webpack_require__(29633);
784// EXTERNAL MODULE: ./node_modules/prop-types/index.js
785var prop_types = __webpack_require__(86627);
786var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
787// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules
788var components = __webpack_require__(61009);
789// EXTERNAL MODULE: ./src/app/blocks/pages/PostgraduateCourses/CoursePathway/utils/promo-sorter.js
790var promo_sorter = __webpack_require__(65274);
791// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules
792var utils = __webpack_require__(92562);
793// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
794var styled_components_browser_esm = __webpack_require__(67780);
795// EXTERNAL MODULE: ./src/app/blocks/shared/components/Promos/PromoSection.styled.js
796var PromoSection_styled = __webpack_require__(12925);
797;// ./src/app/blocks/pages/Hub/HubPromoSection/HubPromoSection.styled.js
798
799
800const HubPromoSectionStyled = styled_components_browser_esm["default"].div`
801  .promos--title {
802    font-size: 2.375rem;
803  }
804  .promoCard--description {
805    font-size: 1rem;
806  }
807
808  ${PromoSection_styled/* PromoSectionStyled */.qc} {
809    .promos--header {
810      display: flex;
811      flex-direction: column;
812      row-gap: 24px;
813      text-align: center;
814      padding-left: 120px;
815      padding-right: 120px;
816      padding-bottom: 40px;
817    }
818
819    .promos--title {
820      font-size: 3.125rem;
821    }
822
823    .promos--description {
824      display: flex;
825      text-align: center;
826      max-width: 696px;
827      margin: 0 auto;
828      flex-direction: column;
829      font-family: Wix Madefor Display, sans-serif;
830      font-weight: 400;
831      font-size: 1.125rem;
832      line-height: 1.5;
833      color: #2a2b2c;
834    }
835  }
836
837  @media (max-width: ${(p) => p.theme.breakpoints.tablet}px) {
838    .ug-careers-promos .promos--header {
839      padding-bottom: 32px;
840    }
841    .promos--items {
842      row-gap: 32px;
843    }
844  }
845`;
846
847;// ./src/app/blocks/pages/Hub/HubPromoSection/HubPromoSection.js
848
849
850
851
852
853
854const HubPromoSection = ({ promoSection }) => {
855  const promosToRender = (0,promo_sorter/* promosToUse */.P)(promoSection.promos);
856  return /* @__PURE__ */ react.createElement(HubPromoSectionStyled, null, /* @__P
856URE__ */ react.createElement(
857    components/* PromoSection */.VX,
858    {
859      title: promoSection.title,
860      shortCourseSubjectAreas: (0,utils/* isValidArray */.OP)(promosToRender.promoGroup) ? promosToRender.promoGroup : promosToRender.promos,
861      description: promoSection.summary,
862      className: "ug-careers-promos",
863      bgColour: promoSection.backgroundColour
864    }
865  ));
866};
867HubPromoSection.propTypes = {
868  promoSection: (prop_types_default()).object
869};
870
871
872/***/ },
873
874/***/ 8586
875(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
876
877
878// EXPORTS
879__webpack_require__.d(__webpack_exports__, {
880  v: () => (/* binding */ NewsEventCardPromo)
881});
882
883// EXTERNAL MODULE: ./node_modules/react/index.js
884var react = __webpack_require__(29633);
885// EXTERNAL MODULE: ./node_modules/prop-types/index.js
886var prop_types = __webpack_require__(86627);
887var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
888// EXTERNAL MODULE: ./node_modules/classnames/index.js
889var classnames = __webpack_require__(10054);
890var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
891// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js
892var index_es = __webpack_require__(18149);
893// EXTERNAL MODULE: ./node_modules/contensis-delivery-api/lib/index.js
894var lib = __webpack_require__(43196);
895// EXTERNAL MODULE: ./src/app/blocks/shared/hooks/index.js + 17 modules
896var hooks = __webpack_require__(88429);
897// EXTERNAL MODULE: ./src/app/blocks/shared/utils/helpers.js
898var helpers = __webpack_require__(91655);
899// EXTERNAL MODULE: ./src/app/blocks/shared/utils/date-utils.js
900var date_utils = __webpack_require__(26292);
901// EXTERNAL MODULE: ./src/app/features/common/utils/getEntryLink.js
902var getEntryLink = __webpack_require__(40153);
903;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/hooks/useNewsEventsQuery.js
904
905
906
907
908
909
910const parseNewsResult = (result, limit) => {
911  if ((0,helpers/* isInvalidArray */.J_)(result?.items)) return [];
912  return result.items.filter((item) => item.hideFromListings !== true).slice(0, limit).map((item) => ({
913    id: item.sys.id,
914    entryTitle: item.entryTitle,
915    uri: item.sys.uri,
916    summary: item.summary,
917    image: item.image,
918    publishedDate: item.sys.version.published,
919    type: "news"
920  }));
921};
922const parseEventsResult = (result, limit) => {
923  if ((0,helpers/* isInvalidArray */.J_)(result?.items)) return [];
924  const filtered = result.items.filter((item) => {
925    const eventDateTo = item.date?.to;
926    if (!eventDateTo) return false;
927    if ((0,date_utils/* checkIfDateIsAfter */.aP)(eventDateTo) || item.showInShortListings === false)
928      return false;
929    return true;
930  });
931  const sorted = (0,date_utils/* sortEventsByDate */.Z0)(filtered);
932  return sorted.slice(0, limit).map((item) => ({
933    id: item.sys.id,
934    entryTitle: item.entryTitle,
935    uri: (0,getEntryLink/* default */.A)(item),
936    description: item.description,
937    location: item.location,
938    image: item.thumbnail,
939    eventDate: item.date,
940    timeZone: item.timeZone,
941    type: "event"
942  }));
943};
944const useNewsEventsQuery = ({
945  orgUnit,
946  format = "4NewsStories",
947  inSidebar = false
948}) => {
949  const rightMax = inSidebar ? 2 : 4;
950  const rightHalf = inSidebar ? 1 : 2;
951  const getQueryCounts = () => {
952    switch (format) {
953      case "4NewsStories":
954        return { newsCount: rightMax, eventsCount: 0 };
955      case "4Events":
956        return { newsCount: 0, eventsCount: rightMax };
957      case "2News2Events":
958        return { newsCount: rightHalf, eventsCount: rightHalf };
959      default:
960        return { newsCount: rightMax, eventsCount: 0 };
961    }
962  };
963  const { newsCount, eventsCount } = getQueryCounts();
964  const {
965    isLoading: newsLoading,
966    result: newsResult,
967    setQuery: setNewsQuery
968  } = (0,hooks/* useSearch */.SQ)();
969  const {
970    isLoading: eventsLoading,
971    result: eventsResult,
972    setQuery: setEventsQuery
973  } = (0,hooks/* useSearch */.SQ)();
974  (0,react.useEffect)(() => {
975    if (!orgUnit || newsCount === 0 || !orgUnit.sys?.id) {
976      return;
977    }
978    const newsQuery = new lib.Query(
979      lib.Op.and(
980        lib.Op.equalTo("sys.contentTypeId", "news"),
981        lib.Op.equalTo("sys.versionStatus", "latest"),
982        lib.Op.equalTo("orgUnit.sys.id", orgUnit.sys.id)
983      )
984    );
985    newsQuery.orderBy = lib.OrderBy.desc("sys.version.published");
986    newsQuery.pageSize = 100;
987    newsQuery.fields = [
988      "entryTitle",
989      "sys.uri",
990      "sys.id",
991      "sys.version.published",
992      "summary",
993      "image",
994      "hideFromListings"
995    ];
996    setNewsQuery(newsQuery);
997  }, [orgUnit, newsCount, setNewsQuery]);
998  (0,react.useEffect)(() => {
999    if (!orgUnit || eventsCount === 0 || !orgUnit.sys?.id) {
1000      return;
1001    }
1002    const today = (/* @__PURE__ */ new Date()).toISOString();
1003    const eventsQuery = new lib.Query(
1004      lib.Op.and(
1005        lib.Op.equalTo("sys.contentTypeId", "events"),
1006        lib.Op.equalTo("sys.versionStatus", "latest"),
1007        lib.Op.equalTo("facultiesAndDepartments.sys.id", orgUnit.sys.id),
1008        lib.Op.greaterThanOrEqualTo("date.to", today)
1009      )
1010    );
1011    eventsQuery.orderBy = lib.OrderBy.asc("date.to");
1012    eventsQuery.pageSize = eventsCount;
1013    eventsQuery.fields = [
1014      "entryTitle",
1015      "sys.uri",
1016      "sys.slug",
1017      "sys.id",
1018      "description",
1019      "location",
1020      "thumbnail",
1021      "date",
1022      "timeZone",
1023      "showInShortListings"
1024    ];
1025    setEventsQuery(eventsQuery);
1026  }, [orgUnit, eventsCount, setEventsQuery]);
1027  const newsItems = newsResult && newsCount > 0 ? parseNewsResult(newsResult, newsCount) : [];
1028  const eventItems = eventsResult && eventsCount > 0 ? parseEventsResult(eventsResult, eventsCount) : [];
1029  const getLoadingState = () => {
1030    if (!orgUnit) return false;
1031    const shouldLoadNews = newsCount > 0;
1032    const shouldLoadEvents = eventsCount > 0;
1033    if (shouldLoadNews && shouldLoadEvents) {
1034      return newsLoading || eventsLoading || newsResult?.items === void 0 || eventsResult?.items === void 0;
1035    } else if (shouldLoadNews) {
1036      return newsLoading || newsResult?.items === void 0;
1037    } else if (shouldLoadEvents) {
1038      return eventsLoading || eventsResult?.items === void 0;
1039    }
1040    return false;
1041  };
1042  return {
1043    isLoading: getLoadingState(),
1044    newsItems,
1045    eventItems,
1046    totalItems: newsItems.length + eventItems.length
1047  };
1048};
1049
1050// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
1051var styled_components_browser_esm = __webpack_require__(67780);
1052// EXTERNAL MODULE: ./src/app/blocks/theme/breakpoints.js
1053var breakpoints = __webpack_require__(3726);
1054;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/NewsEventCardPromo.styled.js
1055
1056
1057const NewsEventCardPromoStyled = styled_components_browser_esm["default"].section`
1058  background-color: ${(p) => p.bgColour === "secondary" ? "#EAEFF0" : "#FFFFFF"};
1059  padding: 40px 0;
1060
1061  .container {
1062    max-width: 1200px;
1063    margin: 0 auto;
1064  }
1065
1066  .promo-heading {
1067    font-family: Kings Caslon Display, serif;
1068    font-weight: 400;
1069    font-size: 2.375rem;
1070    line-height: 1.2;
1071    color: #000000;
1072    text-transform: none;
1073    padding-bottom: 40px;
1074    text-align: center;
1075  }
1076
1077  .loading-message,
1078  .error-message {
1079    font-family: Wix Madefor Display, sans-serif;
1080    padding: 32px;
1081    text-align: center;
1082    font-size: 1.125rem;
1083    line-height: 1.5;
1084    color: #000000;
1085    text-transform: none;
1086  }
1087
1088  .events-list-link {
1089    color: #005ad2;
1090    font-weight: 700;
1091    text-transform: none;
1092    font-style: normal;
1093
1094    &:visited {
1095      color: #774db9;
1096    }
1097
1098    &:hover {
1099      color: #002395;
1100    }
1101
1102    &:active {
1103      color: #002395;
1104    }
1105
1106    &:focus-visible {
1107      background-color: #ffdd00;
1108      border-bottom: 4px solid #000000;
1109      color: #000000;
1110    }
1111  }
1112
1113  .card-row {
1114    display: grid;
1115    gap: 24px;
1116    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1117  }
1118
1119  .card-count-1 {
1120    grid-template-columns: 1fr;
1121    max-width: 100%;
1122  }
1123
1124  .card-count-2 {
1125    grid-template-columns: repeat(2, 1fr);
1126  }
1127
1128  .card-count-3 {
1129    grid-template-columns: repeat(3, 1fr);
1130  }
1131
1132  .card-count-4 {
1133    grid-template-columns: repeat(4, 1fr);
1134  }
1135
1136  @media (max-width: ${(p) => p.theme.breakpoints.desktop}px) {
1137    .card-count-4 {
1138      grid-template-columns: repeat(2, 1fr);
1139    }
1140  }
1141
1142  @media (max-width: ${(p) => p.theme.breakpoints.tablet}px) {
1143    .card-count-3,
1144    .card-count-4 {
1145      grid-template-columns: 1fr;
1146    }
1147
1148    .card-count-2 {
1149      grid-template-columns: 1fr;
1150    }
1151  }
1152
1153  .card-wrapper {
1154    display: flex;
1155  }
1156
1157  ${(p) => p.$inSidebar && (0,styled_components_browser_esm.css)`
1158      width: 384px;
1159      padding: 24px;
1160      border-radius: 8px;
1161      background-color: #eaeff0;
1162
1163      .container {
1164        max-width: 100%;
1165        width: 100%;
1166        margin: 0;
1167        display: flex;
1168        flex-direction: column;
1169        gap: 32px;
1170      }
1171
1172      .sidebar-header {
1173        display: flex;
1174        justify-content: space-between;
1175        align-items: center;
1176        width: 100%;
1177        gap: 24px;
1178      }
1179
1180      .error-message {
1181        font-family: Wix Madefor Text, sans-serif;
1182        text-align: center;
1183        font-size: 1rem;
1184        line-height: 1.5;
1185        color: #000000;
1186        padding: 0;
1187      }
1188
1189      .sidebar-heading {
1190        margin: 0;
1191        font-family: Wix Madefor Display, sans-serif;
1192        font-weight: 700;
1193        font-size: 1.5rem;
1194        line-height: 1.3;
1195        color: #000000;
1196        text-align: left;
1197        text-transform: none;
1198      }
1199
1200      .sidebar-toggle {
1201        border: 0;
1202        padding: 0;
1203        background: transparent;
1204        display: flex;
1205        flex-direction: row;
1206        justify-content: space-between;
1207        align-items: center;
1208        width: 100%;
1209        cursor: pointer;
1210      }
1211
1212      .sidebar-toggle-icon {
1213        width: 16px;
1214        height: 24px;
1215        color: #005ad2;
1216        transform: rotate(0deg);
1217        display: block;
1218      }
1219
1220      .sidebar-toggle-icon--expanded {
1221        transform: rotate(180deg);
1222      }
1223
1224      @media (min-width: ${breakpoints/* breakpoints */.f.tablet + 1}px) {
1225        .sidebar-toggle-icon {
1226          display: none;
1227        }
1228      }
1229
1230      .card-row {
1231        grid-template-columns: 1fr;
1232        gap: 32px;
1233      }
1234
1235      @media (max-width: ${breakpoints/* breakpoints */.f.tablet}px) {
1236        width: auto;
1237        margin: 8px 16px;
1238
1239        .sidebar-toggle {
1240          display: flex;
1241        }
1242
1243        .card-row--collapsed {
1244          display: none;
1245        }
1246      }
1247    `}
1248`;
1249
1250// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules
1251var components = __webpack_require__(61009);
1252;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/NewsCard/NewsCard.styled.js
1253
1254const NewsCardStyled = styled_components_browser_esm["default"].article`
1255  display: grid;
1256  grid-template-columns: 1fr;
1257  grid-template-rows: 208px 1fr;
1258  grid-template-areas: 'cardImgArea' 'cardContentArea';
1259  border-radius: 8px;
1260  max-width: 100%;
1261  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
1262  background-color: #ffffff;
1263  height: 100%;
1264  width: 100%;
1265
1266  .card-image {
1267    grid-area: cardImgArea;
1268    height: 208px;
1269    width: 100%;
1270    overflow: hidden;
1271
1272    img {
1273      width: 100%;
1274      height: 100%;
1275      border-top-right-radius: 8px;
1276      border-top-left-radius: 8px;
1277      object-fit: cover;
1278      display: block;
1279    }
1280  }
1281
1282  .card-content {
1283    grid-area: cardContentArea;
1284    display: flex;
1285    flex-direction: column;
1286    justify-content: start;
1287    align-content: center;
1288    row-gap: 16px;
1289    padding: 24px;
1290    font-family: Wix Madefor Display, sans-serif;
1291  }
1292
1293  .card-date {
1294    display: flex;
1295    column-gap: 10px;
1296    font-size: 1rem;
1297    color: #000000;
1298    font-weight: 700;
1299    line-height: 1.5;
1300    padding-top: 3.8px;
1301  }
1302
1303  .card-title {
1304    margin: 0;
1305    line-height: 1.5;
1306  }
1307
1308  .card-summary {
1309    margin: 0;
1310    font-size: 1rem;
1311    font-style: normal;
1312    font-weight: 400;
1313    line-height: 1.5;
1314    color: #000000;
1315  }
1316  .card-icon {
1317    color: #000000;
1318    padding-top: 3.8px;
1319  }
1320
1321  .card-link-icon {
1322    align-items: flex-start;
1323    padding: 4.8px 0 0 8px;
1324  }
1325
1326  ${(p) => !p.$inSidebar && (0,styled_components_browser_esm.css)`
1327      @media (min-width: ${p.theme.breakpoints.desktop}px) {
1328        grid-template-rows: 208px auto;
1329        min-height: 518.496px;
1330
1331        .card-image {
1332          height: 208px;
1333        }
1334
1335        .card-image img {
1336          height: 100%;
1337        }
1338
1339        .card-count-3 & {
1340          grid-template-rows: 216.338px auto;
1341
1342          .card-image {
1343            height: 216.338px;
1344          }
1345        }
1346
1347        .card-count-2 & {
1348          grid-template-rows: 331.268px auto;
1349
1350          .card-image {
1351            height: 331.268px;
1352          }
1353        }
1354
1355        .card-count-1 & {
1356          grid-template-columns: 588px 1fr;
1357          grid-template-rows: auto;
1358          grid-template-areas: 'cardImgArea cardContentArea';
1359          max-width: 100%;
1360          min-height: 450.317px;
1361
1362          .card-image {
1363            height: 100%;
1364            width: 588px;
1365            min-height: 450.317px;
1366          }
1367
1368          .card-image img {
1369            height: 100%;
1370            border-radius: 0;
1371            border-top-left-radius: 8px;
1372            border-bottom-left-radius: 8px;
1373            border-top-right-radius: 0;
1374          }
1375
1376          .card-content {
1377            padding: 24px 40px;
1378            justify-content: center;
1379          }
1380
1381          .card-link {
1382            font-size: 1.5rem;
1383          }
1384        }
1385      }
1386    `}
1387`;
1388
1389// EXTERNAL MODULE: ./node_modules/lodash/truncate.js
1390var truncate = __webpack_require__(59973);
1391var truncate_default = /*#__PURE__*/__webpack_require__.n(truncate);
1392;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/NewsCard/NewsCard.js
1393
1394
1395
1396
1397
1398
1399
1400
1401function NewsCard({ item, inSidebar = false }) {
1402  if ((0,helpers/* isInvalidObject */.b2)(item)) {
1403    return null;
1404  }
1405  return /* @__PURE__ */ react.createElement(NewsCardStyled, { $inSidebar: inSidebar }, item.image && /* @__PURE__ */ react.createElement("div", { className: "card-image" }, /* @__PURE__ */ react.createElement(components/* Image */._V, { image: item.image })), /* @__PURE__ */ react.createElement("div", { className: "card-content" }, /* @__PURE__ */ react.createElement(
1406    components/* LinkCta */.$l,
1407    {
1408      childClassName: "card-link",
1409      className: "card-link",
1410      url: item.uri,
1411      rightIcon: /* @__PURE__ */ react.createElement(
1412        index_es/* FontAwesomeIcon */.g,
1413        {
1414          className: "card-link-icon",
1415          icon: "fa-solid fa-arrow-right"
1416        }
1417      ),
1418      maxCharacterLength: 150
1419    },
1420    item.entryTitle
1421  ), item.publishedDate && /* @__PURE__ */ react.createElement("div", { className: "card-date" }
1421, /* @__PURE__ */ react.createElement(
1422    index_es/* FontAwesomeIcon */.g,
1423    {
1424      className: "card-icon",
1425      icon: "fa-regular fa-calendar"
1426    }
1427  ), /* @__PURE__ */ react.createElement("p", null, (0,date_utils/* formatToLocaleDate */.$p)(item.publishedDate))), item.summary && /* @__PURE__ */ react.createElement("p", { className: "card-summary" }, truncate_default()(item.summary, { length: 200 }))));
1428}
1429NewsCard.propTypes = {
1430  item: (prop_types_default()).object,
1431  inSidebar: (prop_types_default()).bool
1432};
1433
1434;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/EventsCard/EventsCard.styled.js
1435
1436const EventsCardStyled = styled_components_browser_esm["default"].article`
1437  display: grid;
1438  grid-template-columns: 1fr;
1439  grid-template-rows: 208px 1fr;
1440  grid-template-areas: 'cardImgArea' 'cardContentArea';
1441  border-radius: 8px;
1442  max-width: 100%;
1443  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
1444  background-color: #ffffff;
1445  height: 100%;
1446  width: 100%;
1447  position: relative;
1448
1449  .card-icon-tab {
1450    position: absolute;
1451    top: 0;
1452    left: 0;
1453    background-color: #000000;
1454    color: #ffffff;
1455    padding: 10px 8px;
1456    border-bottom-right-radius: 8px;
1457    border-top-left-radius: 8px;
1458    z-index: 10;
1459    display: flex;
1460    align-items: center;
1461    justify-content: center;
1462
1463    svg {
1464      width: 21px;
1465      height: 24px;
1466    }
1467
1468    .card-icon {
1469      color: #ffffff;
1470      font-size: 1.25rem;
1471    }
1472  }
1473
1474  .card-image {
1475    grid-area: cardImgArea;
1476    height: 208px;
1477    width: 100%;
1478    overflow: hidden;
1479    display: block;
1480
1481    img {
1482      width: 100%;
1483      height: 100%;
1484      border-top-right-radius: 8px;
1485      border-top-left-radius: 8px;
1486      object-fit: cover;
1487    }
1488  }
1489
1490  .card-content {
1491    grid-area: cardContentArea;
1492    display: flex;
1493    flex-direction: column;
1494    justify-content: start;
1495    align-content: center;
1496    gap: 16px;
1497    padding: 24px;
1498    font-family: Wix Madefor Display, sans-serif;
1499  }
1500
1501  .card-details {
1502    display: flex;
1503    flex-direction: column;
1504    gap: 16px;
1505  }
1506
1507  .card-link-icon {
1508    align-items: flex-start;
1509    padding: 4.8px 0 0 8px;
1510  }
1511
1512  .card-info {
1513    display: flex;
1514    flex-direction: row;
1515    align-items: flex-start;
1516    gap: 8px;
1517    font-size: 1rem;
1518    font-weight: 700;
1519    line-height: 1.5;
1520    color: #000000;
1521
1522    p {
1523      margin: 0;
1524    }
1525  }
1526
1527  .card-icon {
1528    color: #000000;
1529    padding-top: 3.8px;
1530  }
1531
1532  .card-summary {
1533    margin: 0;
1534    font-size: 1rem;
1535    font-style: normal;
1536    font-weight: 400;
1537    line-height: 1.5;
1538    color: #000000;
1539  }
1540
1541  ${(p) => !p.$inSidebar && (0,styled_components_browser_esm.css)`
1542      @media (min-width: ${p.theme.breakpoints.desktop}px) {
1543        grid-template-rows: 208px auto;
1544        min-height: 518.496px;
1545
1546        .card-image {
1547          height: 208px;
1548        }
1549
1550        .card-image img {
1551          height: 100%;
1552        }
1553
1554        .card-count-3 & {
1555          grid-template-rows: 216.338px auto;
1556
1557          .card-image {
1558            height: 216.338px;
1559          }
1560        }
1561
1562        .card-count-2 & {
1563          grid-template-rows: 331.268px auto;
1564
1565          .card-image {
1566            height: 331.268px;
1567          }
1568        }
1569
1570        .card-count-1 & {
1571          grid-template-columns: 588px 1fr;
1572          grid-template-rows: auto;
1573          grid-template-areas: 'cardImgArea cardContentArea';
1574          max-width: 100%;
1575          min-height: 450.317px;
1576
1577          .card-image {
1578            height: 100%;
1579            width: 588px;
1580            min-height: 450.317px;
1581          }
1582
1583          .card-image img {
1584            height: 100%;
1585            border-radius: 0;
1586            border-top-left-radius: 8px;
1587            border-bottom-left-radius: 8px;
1588            border-top-right-radius: 0;
1589          }
1590
1591          .card-content {
1592            padding: 24px 40px;
1593            justify-content: center;
1594          }
1595
1596          .card-link {
1597            font-size: 1.5rem;
1598          }
1599        }
1600      }
1601    `}
1602`;
1603
1604;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/EventsCard/EventCard.js
1605
1606
1607
1608
1609
1610
1611
1612
1613function EventCard({ item, inSidebar = false }) {
1614  if ((0,helpers/* isInvalidObject */.b2)(item)) {
1615    return null;
1616  }
1617  const eventStartDate = item.eventDate?.from;
1618  const eventEndDate = item.eventDate?.to;
1619  const { dates, times } = (0,date_utils/* formatDates */.HA)(eventStartDate, eventEndDate);
1620  const timeZoneText = item.timeZone?.entryDescription || "UK time";
1621  return /* @__PURE__ */ react.createElement(EventsCardStyled, { $inSidebar: inSidebar }
1621, /* @__PURE__ */ react.createElement("div", { className: "card-icon-tab" }, /* @__PURE__ */ react.createElement(
1622    index_es/* FontAwesomeIcon */.g,
1623    {
1624      className: "card-icon-tab-icon",
1625      icon: "fa-regular fa-calendar fa-xl"
1626    }
1627  )), item.image && /* @__PURE__ */ react.createElement("div", { className: "card-image" }, /* @__PURE__ */ react.createElement(components/* Image */._V, { image: item.image })), /* @__PURE__ */ react.createElement("div", { className: "card-content" }, /* @__PURE__ */ react.createElement(
1628    components/* LinkCta */.$l,
1629    {
1630      className: "card-link",
1631      childClassName: "card-link",
1632      url: item.uri,
1633      rightIcon: /* @__PURE__ */ react.createElement(
1634        index_es/* FontAwesomeIcon */.g,
1635        {
1636          className: "card-link-icon",
1637          icon: "fa-solid fa-arrow-right"
1638        }
1639      ),
1640      maxCharacterLength: 150
1641    },
1642    item.entryTitle
1643  ), /* @__PURE__ */ react.createElement("div", { className: "card-details" }, /* @__PURE__ */ react.createElement("div", { className: "card-info" }, /* @__PURE__ */ react.createElement(
1644    index_es/* FontAwesomeIcon */.g,
1645    {
1646      className: "card-icon",
1647      icon: "fa-regular fa-calendar"
1648    }
1649  ), /* @__PURE__ */ react.createElement("p", null, dates)), /* @__PURE__ */ react.createElement("div", { className: "card-info" }, /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { className: "card-icon", icon: "fa-regular fa-clock" }), /* @__PURE__ */ react.createElement("p", null, `${times} (${timeZoneText})`)), item.location?.entryTitle && /* @__PURE__ */ react.createElement("div", { className: "card-info" }, /* @__PURE__ */ react.createElement(
1650    index_es/* FontAwesomeIcon */.g,
1651    {
1652      className: "card-icon",
1653      icon: "fa-regular fa-location-pin"
1654    }
1655  ), /* @__PURE__ */ react.createElement("p", null, item.location.entryTitle))), item.description && /* @__P
1655URE__ */ react.createElement("p", { className: "card-summary" }, truncate_default()(item.description, { length: 200 }))));
1656}
1657EventCard.propTypes = {
1658  item: (prop_types_default()).object,
1659  inSidebar: (prop_types_default()).bool
1660};
1661
1662// EXTERNAL MODULE: ./src/app/blocks/pages/Hub/utils/index.js
1663var utils = __webpack_require__(96517);
1664;// ./src/app/blocks/pages/Hub/NewsEventCardPromo/NewsEventCardPromo.js
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676function NewsEventCardPromo({
1677  title,
1678  orgUnit,
1679  format = "4NewsStories",
1680  backgroundColour,
1681  headingLevel,
1682  inSidebar = false
1683}) {
1684  const { isLoading, newsItems, eventItems } = useNewsEventsQuery({
1685    orgUnit,
1686    format,
1687    inSidebar
1688  });
1689  const [isExpanded, setIsExpanded] = (0,react.useState)(true);
1690  const renderHeading = () => {
1691    if (!inSidebar) {
1692      return /* @__PURE__ */ react.createElement(
1693        components/* Heading */.DZ,
1694        {
1695          headingLevel,
1696          className: "promo-heading",
1697          headingText: title
1698        }
1699      );
1700    }
1701    return /* @__PURE__ */ react.createElement("div", { className: "sidebar-header" }, /* @__PURE__ */ react.createElement(
1702      "button",
1703      {
1704        type: "button",
1705        className: "sidebar-toggle",
1706        onClick: () => setIsExpanded((prev) => !prev),
1707        "aria-expanded": isExpanded,
1708        "aria-label": isExpanded ? "Collapse section" : "Expand section"
1709      },
1710      /* @__PURE__ */ react.createElement(
1711        components/* Heading */.DZ,
1712        {
1713          headingLevel,
1714          className: "sidebar-heading",
1715          headingText: title
1716        }
1717      ),
1718      /* @__PURE__ */ react.createElement(
1719        index_es/* FontAwesomeIcon */.g,
1720        {
1721          className: classnames_default()("sidebar-toggle-icon", {
1722            "sidebar-toggle-icon--expanded": isExpanded
1723          }),
1724          icon: "fa-solid fa-chevron-down"
1725        }
1726      )
1727    ));
1728  };
1729  const withWrapper = (inner) => inSidebar ? inner : /* @__PURE__ */ react.createElement(components/* Section */.wn, { variant: backgroundColour }, inner);
1730  if (isLoading) {
1731    return withWrapper(
1732      /* @__PURE__ */ react.createElement(
1733        NewsEventCardPromoStyled,
1734        {
1735          bgColour: backgroundColour,
1736          $inSidebar: inSidebar
1737        },
1738        /* @__PURE__ */ react.createElement("div", { className: "container" }, /* @__PURE__ */ react.createElement("div", { className: "loading-message" }, "Loading..."))
1739      )
1740    );
1741  }
1742  const items = (0,utils/* getCombinedItems */.WG)(format, newsItems, eventItems);
1743  if ((0,helpers/* isInvalidArray */.J_)(items)) {
1744    return withWrapper(
1745      /* @__PURE__ */ react.createElement(
1746        NewsEventCardPromoStyled,
1747        {
1748          bgColour: backgroundColour,
1749          $inSidebar: inSidebar
1750        },
1751        /* @__PURE__ */ react.createElement("div", { className: "container" }, renderHeading(), format === "4Events" ? /* @__PURE__ */ react.createElement("div", { className: "error-message" }, "No upcoming events in ", orgUnit?.entryTitle, ".", /* @__PURE__ */ react.createElement("br", null), "View the", " ", /* @__PURE__ */ react.createElement("a", { href: "/events", className: "events-list-link" }, "Main events list"), " ", "instead.") : /* @__PURE__ */ react.createElement("div", { className: "error-message" }, "No results found"))
1752      )
1753    );
1754  }
1755  return withWrapper(
1756    /* @__PURE__ */ react.createElement(
1757      NewsEventCardPromoStyled,
1758      {
1759        bgColour: backgroundColour,
1760        $inSidebar: inSidebar
1761      },
1762      /* @__PURE__ */ react.createElement("div", { className: "container" }, renderHeading(), /* @__PURE__ */ react.createElement(
1763        "div",
1764        {
1765          className: classnames_default()("card-row", {
1766            [`card-count-${items.length}`]: !inSidebar,
1767            "card-row--collapsed": inSidebar && !isExpanded
1768          })
1769        },
1770        items.map((item) => /* @__PURE__ */ react.createElement("div", { key: item.id, className: "card-wrapper" }
1770, item.type === "news" ? /* @__PURE__ */ react.createElement(NewsCard, { item, inSidebar }) : /* @__PURE__ */ react.createElement(EventCard, { item, inSidebar })))
1771      ))
1772    )
1773  );
1774}
1775NewsEventCardPromo.propTypes = {
1776  title: (prop_types_default()).string.isRequired,
1777  orgUnit: prop_types_default().shape({
1778    sys: prop_types_default().shape({
1779      id: (prop_types_default()).string.isRequired
1780    }).isRequired,
1781    entryTitle: (prop_types_default()).string
1782  }),
1783  format: prop_types_default().oneOf(["4NewsStories", "4Events", "2News2Events"]),
1784  backgroundColour: (prop_types_default()).string,
1785  headingLevel: (prop_types_default()).string,
1786  inSidebar: (prop_types_default()).bool
1787};
1788
1789
1790/***/ },
1791
1792/***/ 21309
1793(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1794
1795
1796// EXPORTS
1797__webpack_require__.d(__webpack_exports__, {
1798  s: () => (/* binding */ PeopleGroupDisplayer)
1799});
1800
1801// EXTERNAL MODULE: ./node_modules/react/index.js
1802var react = __webpack_require__(29633);
1803// EXTERNAL MODULE: ./node_modules/prop-types/index.js
1804var prop_types = __webpack_require__(86627);
1805var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
1806// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules
1807var components = __webpack_require__(61009);
1808// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
1809var styled_components_browser_esm = __webpack_require__(67780);
1810;// ./src/app/blocks/pages/Hub/PeopleGroupDisplayer/PeopleGroupDisplayer.styled.js
1811
1812const PeopleGroupDisplayerStyled = styled_components_browser_esm["default"].section`
1813  background-color: ${(p) => p.$bgColour};
1814  padding: 40px 0;
1815
1816  .container {
1817    max-width: 1200px;
1818    margin: 0 auto;
1819  }
1820
1821  .section-heading {
1822    font-family: Kings Caslon Display, serif;
1823    font-weight: 400;
1824    font-size: 2.375rem;
1825    line-height: 1.2;
1826    color: #000000;
1827    text-transform: none;
1828    padding-bottom: 16px;
1829    text-align: center;
1830  }
1831  .section-summary {
1832    font-family: Wix Madefor Display, sans-serif;
1833    font-size: 1.125rem;
1834    line-height: 1.5;
1835    color: #000000;
1836    text-align: center;
1837    max-width: 800px;
1838    margin: 0 auto 40px;
1839  }
1840
1841  .people-grid {
1842    display: grid;
1843    gap: 24px;
1844    grid-template-columns: repeat(3, 384px);
1845    justify-content: center;
1846  }
1847
1848  @media (max-width: ${(p) => p.theme.breakpoints.desktop}px) {
1849    .people-grid {
1850      grid-template-columns: repeat(2, 384px);
1851    }
1852  }
1853
1854  @media (max-width: ${(p) => p.theme.breakpoints.tablet}px) {
1855    padding: 16px 0;
1856    .people-grid {
1857      grid-template-columns: 1fr;
1858    }
1859
1860    .card-wrapper > div {
1861      width: 100%;
1862    }
1863  }
1864
1865  .card-wrapper {
1866    display: flex;
1867    justify-content: center;
1868  }
1869`;
1870
1871// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js
1872var index_es = __webpack_require__(18149);
1873// EXTERNAL MODULE: ./node_modules/lodash/truncate.js
1874var truncate = __webpack_require__(59973);
1875var truncate_default = /*#__PURE__*/__webpack_require__.n(truncate);
1876// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules
1877var utils = __webpack_require__(92562);
1878// EXTERNAL MODULE: ./src/app/blocks/shared/components/Image/utils.js
1879var Image_utils = __webpack_require__(58762);
1880;// ./src/app/blocks/pages/Hub/PeopleGroupDisplayer/PersonCard/PersonCard.styled.js
1881
1882const PersonCardStyled = styled_components_browser_esm["default"].div`
1883  display: flex;
1884  flex-direction: row;
1885  gap: 16px;
1886  border-radius: 8px;
1887  padding: 24px 16px;
1888  background-color: #ffffff;
1889  width: 384px;
1890  box-shadow: 0 2px 16px 0 rgba(0, 0, 0, 0.1);
1891
1892  .personCard--imageContainer {
1893    flex-shrink: 0;
1894
1895    .person--image {
1896      width: 64px;
1897      height: 64px;
1898      border-radius: 50%;
1899      object-fit: cover;
1900    }
1901  }
1902
1903  .personCard--contentContainer {
1904    display: flex;
1905    flex-direction: column;
1906    gap: 6px;
1907    width: 100%;
1908    overflow: hidden;
1909  }
1910
1911  .person--name {
1912    &:visited {
1913      color: #774db9;
1914    }
1915
1916    &:focus-visible {
1917      background-color: #ffdd00;
1918      border-bottom: 4px solid #000000;
1919      color: #000000;
1920    }
1921
1922    .linkCta--text {
1923      font-family: Wix Madefor Display, sans-serif;
1924      font-size: 1rem;
1925      font-weight: 600;
1926    }
1927  }
1928
1929  .person--jobTitle {
1930    font-family: Wix Madefor Text, sans-serif;
1931    font-size: 0.875rem;
1932    font-weight: 400;
1933    line-height: 1.5;
1934    color: #2a2b2c;
1935    margin: 0;
1936  }
1937
1938  .person--contact {
1939    display: flex;
1940    align-items: flex-start;
1941    gap: 12px;
1942    font-family: Wix Madefor Text, sans-serif;
1943    font-size: 0.875rem;
1944    font-weight: 700;
1945    line-height: 1.5;
1946    color: #005ad2;
1947    text-decoration: underline;
1948
1949    &:hover {
1950      color: #002395;
1951    }
1952
1953    &:visited {
1954      color: #774db9;
1955    }
1956
1957    &:focus-visible {
1958      background-color: #ffdd00;
1959      border-bottom: 4px solid #000000;
1960      color: #000000;
1961    }
1962
1963    span {
1964      word-break: break-all;
1965    }
1966
1967    svg {
1968      padding-top: 3px;
1969      flex-shrink: 0;
1970      width: 16px;
1971      height: 16px;
1972    }
1973  }
1974
1975  .icon--arrow {
1976    padding-top: 5px;
1977    padding-left: 8px;
1978  }
1979`;
1980
1981;// ./src/app/blocks/pages/Hub/PeopleGroupDisplayer/PersonCard/PersonCard.js
1982
1983
1984
1985
1986
1987
1988
1989
1990function PersonCard({ person, showJobTitle = true }) {
1991  const {
1992    firstName,
1993    lastName,
1994    suffix,
1995    entryDescription,
1996    title,
1997    sys,
1998    override,
1999    entryThumbnail,
2000    socialLinks = []
2001  } = person;
2002  const titles = (0,utils/* isValidArray */.OP)(title) ? title.join(", ") : title;
2003  const fullName = [titles, firstName, lastName, suffix].filter(
2003Boolean).join(" ");
2004  const emailItem = socialLinks.find((item) => item.type === "email");
2005  const email = emailItem?.value?.emailAddress || emailItem?.value;
2006  const phoneItem = socialLinks.find((item) => item.type === "telephone");
2007  const telephone = phoneItem?.value?.telephoneNumber || phoneItem?.value;
2008  return /* @__PURE__ */ react.createElement(PersonCardStyled, null, /* @__PURE__ */ react.createElement("div", { className: "personCard--imageContainer" }, /* @__PURE__ */ react.createElement(
2009    components/* Image */._V,
2010    {
2011      image: (0,Image_utils/* getDefaultImage */.Ny)(
2012        entryThumbnail,
2013        "https://kcl.ac.uk/siteelements/2017/images/default-pic.jpg"
2014      ),
2015      className: "person--image",
2016      width: 64,
2017      height: 64,
2018      crop: true
2019    }
2020  )), /* @__PURE__ */ react.createElement("div", { className: "personCard--contentContainer" }, /* @__PURE__ */ react.createElement(
2021    components/* LinkCta */.$l,
2022    {
2023      fullwidth: true,
2024      url: override || `/people/${sys?.slug}`,
2025      className: "person--name",
2026      maxCharacterLength: fullName.length,
2027      rightIcon: /* @__PURE__ */ react.createElement(
2028        index_es/* FontAwesomeIcon */.g,
2029        {
2030          icon: override ? "fa-regular fa-arrow-up-right-from-square" : "fa-solid fa-arrow-right",
2031          className: "icon--arrow",
2032          "aria-hidden": "true"
2033        }
2034      )
2035    },
2036    fullName
2037  ), showJobTitle && entryDescription && /* @__PURE__ */ react.createElement("p", { className: "person--jobTitle" }, truncate_default()(entryDescription, { length: 65 })), email && /* @__PURE__ */ react.createElement(
2038    "a",
2039    {
2040      href: `mailto:${email}`,
2041      className: "person--contact",
2042      "aria-label": `Email ${fullName}: ${email}`
2043    },
2044    /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-envelope", "aria-hidden": "true" }),
2045    /* @__PURE__ */ react.createElement("span", null, email)
2046  ), telephone && /* @__PURE__ */ react.createElement(
2047    "a",
2048    {
2049      href: `tel:${telephone}`,
2050      className: "person--contact",
2051      "aria-label": `Telephone ${fullName}: ${telephone}`
2052    },
2053    /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-regular fa-phone", "aria-hidden": "true" }),
2054    /* @__PURE__ */ react.createElement("span", null, telephone)
2055  )));
2056}
2057PersonCard.propTypes = {
2058  person: (prop_types_default()).object,
2059  showJobTitle: (prop_types_default()).bool
2060};
2061
2062// EXTERNAL MODULE: ./src/app/blocks/shared/utils/helpers.js
2063var helpers = __webpack_require__(91655);
2064// EXTERNAL MODULE: ./src/app/blocks/pages/Hub/utils/index.js
2065var Hub_utils = __webpack_require__(96517);
2066;// ./src/app/blocks/pages/Hub/PeopleGroupDisplayer/PeopleGroupDisplayer.js
2067
2068
2069
2070
2071
2072
2073
2074const MAX_PEOPLE = 15;
2075const BG_COLOURS = {
2076  secondary: "#EAEFF0",
2077  primary: "#ffffff"
2078};
2079const PeopleGroupDisplayer = ({ peopleGroupPicker }) => {
2080  const {
2081    sectionTitle,
2082    summary,
2083    peopleGroup,
2084    showJobTitles,
2085    sortNames,
2086    headingLevel,
2087    backgroundColour
2088  } = peopleGroupPicker;
2089  const peopleList = peopleGroup?.people;
2090  let people = (0,helpers/* isInvalidArray */.J_)(peopleList) ? [] : peopleList.filter((person) => person.hide !== true);
2091  if (sortNames === "alphabetically") {
2092    people.sort((a, b) => {
2093      const lastNameCompare = (a.lastName || "").localeCompare(
2094        b.lastName || ""
2095      );
2096      if (lastNameCompare !== 0) return lastNameCompare;
2097      return (a.firstName || "").localeCompare(b.firstName || "");
2098    });
2099  }
2100  const isOverLimit = people.length > MAX_PEOPLE;
2101  people = people.slice(0, MAX_PEOPLE);
2102  if ((0,helpers/* isInvalidArray */.J_)(people)) return null;
2103  const bgColour = BG_COLOURS[backgroundColour] ?? BG_COLOURS.primary;
2104  return /* @__PURE__ */ react.createElement(components/* Section */.wn, { bgColour }, /* @__PURE__ */ react.createElement(PeopleGroupDisplayerStyled, { $bgColour: bgColour }, /* @__PURE__ */ react.createElement(
2105    components/* Warning */.N5,
2106    {
2107      show: isOverLimit,
2108      message: `There is a limit of ${MAX_PEOPLE} people per group and there are more people in this group. It is suggested that you split larger groups over multiple groups by type of person or use a full people listing.`
2109    }
2110  ), /* @__PURE__ */ react.createElement("div", { className: "container" }, /* @__PURE__ */ react.createElement(
2111    components/* Heading */.DZ,
2112    {
2113      headingLevel: (0,Hub_utils/* getHeadingLevel */.lD)(headingLevel),
2114      className: "section-heading",
2115      headingText: sectionTitle
2116    }
2117  ), summary && /* @__PURE__ */ react.createElement("p", { className: "section-summary" }, summary), /* @__PURE__ */ react.createElement("div", { className: "people-grid" }, people.map((person) => /* @__PURE__ */ react.createElement("div", { key: person.sys?.id, className: "card-wrapper" }, /* @__PURE__ */ react.createElement(PersonCard, { person, showJobTitle: showJobTitles })))))));
2118};
2119PeopleGroupDisplayer.propTypes = {
2120  peopleGroupPicker: (prop_types_default()).object
2121};
2122
2123
2124/***/ },
2125
2126/***/ 84104
2127(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2128
2129
2130// EXPORTS
2131__webpack_require__.d(__webpack_exports__, {
2132  h: () => (/* binding */ ResearchProjectListing)
2133});
2134
2135// EXTERNAL MODULE: ./node_modules/react/index.js
2136var react = __webpack_require__(29633);
2137// EXTERNAL MODULE: ./node_modules/prop-types/index.js
2138var prop_types = __webpack_require__(86627);
2139var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
2140// EXTERNAL MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js
2141var index_es = __webpack_require__(18149);
2142// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
2143var styled_components_browser_esm = __webpack_require__(67780);
2144// EXTERNAL MODULE: ./src/app/blocks/theme/breakpoints.js
2145var breakpoints = __webpack_require__(3726);
2146;// ./src/app/blocks/pages/Hub/ResearchProjectListing/ResearchProjectListing.styled.js
2147
2148
2149const ResearchProjectListingStyled = styled_components_browser_esm["default"].div`
2150  padding-top: ${(p) => p.$noHeadingOrSummary ? "16px" : "40px"};
2151  padding-bottom: 48px;
2152
2153  .responsive-inner-container {
2154    overflow-x: visible;
2155  }
2156
2157  .listing-heading {
2158    margin-bottom: 40px;
2159    font-family: Kings Caslon Display, serif;
2160    font-weight: 400;
2161    font-size: 2.375rem;
2162    line-height: 1.2;
2163    text-transform: none;
2164  }
2165
2166  h1.listing-heading {
2167    font-size: 2.875rem;
2168  }
2169
2170  .listing-summary {
2171    margin-bottom: 40px;
2172    font-family: Wix Madefor Text, sans-serif;
2173    font-size: 1.125rem;
2174    font-weight: 400;
2175    line-height: 1.5;
2176    color: #000000;
2177  }
2178
2179  .listing-filter-bar {
2180    background: #ffffff;
2181    border-radius: 8px;
2182    box-shadow: 0 2px 16px 0 rgba(0, 0, 0, 0.1);
2183    padding: 24px 64px;
2184    margin-bottom: 24px;
2185
2186    @media (max-width: ${breakpoints/* mediaBreakpoints */.l.tablet}) {
2187      padding: 24px;
2188    }
2189  }
2190
2191  .filter-bar-header {
2192    display: flex;
2193    flex-direction: row;
2194    justify-content: space-between;
2195    align-items: center;
2196    margin-bottom: 16px;
2197
2198    @media (max-width: ${breakpoints/* mediaBreakpoints */.l.tablet}) {
2199      flex-direction: column;
2200      align-items: flex-start;
2201      gap: 16px;
2202    }
2203  }
2204
2205  .filter-bar-title {
2206    font-family: Wix Madefor Display, sans-serif;
2207    font-weight: 700;
2208    font-size: 1.313rem;
2209    line-height: 1.3;
2210    color: #000000;
2211    margin: 0;
2212  }
2213
2214  .filter-bar-counter {
2215    font-family: Wix Madefor Text, sans-serif;
2216    font-weight: 400;
2217    font-size: 1rem;
2218    line-height: 1.5;
2219    color: #000000;
2220    margin: 0;
2221  }
2222
2223  .filter-bar-dropdown {
2224    width: 100%;
2225  }
2226
2227  .card-grid {
2228    display: grid;
2229    grid-template-columns: 1fr;
2230    row-gap: 32px;
2231    column-gap: 24px;
2232    padding-top: 8px;
2233
2234    @media (min-width: ${breakpoints/* mediaBreakpoints */.l.tablet}) {
2235      grid-template-columns: repeat(2, 1fr);
2236    }
2237
2238    @media (min-width: ${breakpoints/* mediaBreakpoints */.l.desktop}) {
2239      grid-template-columns: ${(p) => p.$hasSidebar ? "repeat(2, 1fr)" : "repeat(3, 1fr)"};
2240      row-gap: 40px;
2241      padding-top: 16px;
2242    }
2243  }
2244
2245  .card-wrapper {
2246    display: flex;
2247  }
2248
2249  .listing-pagination {
2250    margin-top: 64px;
2251  }
2252
2253  .back-to-top {
2254    display: flex;
2255    justify-content: center;
2256    align-items: center;
2257    gap: 8px;
2258    margin-top: 40px;
2259    font-family: Wix Madefor Text, sans-serif;
2260    font-weight: 700;
2261    font-size: 1.125rem;
2262    color: #005ad2;
2263    text-decoration: underline;
2264    cursor: pointer;
2265
2266    &:hover {
2267      text-decoration: none;
2268    }
2269
2270    @media (min-width: ${breakpoints/* mediaBreakpoints */.l.desktop}) {
2271      display: none;
2272    }
2273  }
2274
2275  .no-results {
2276    h2 {
2277      color: #000000;
2278      font-family: Wix Madefor Display, sans-serif;
2279      font-size: 1.5rem;
2280      font-weight: 700;
2281      line-height: 1.3;
2282      text-transform: none;
2283    }
2284
2285    p {
2286      color: #000000;
2287      font-family: Wix Madefor Text, sans-serif;
2288      font-size: 1.125rem;
2289      font-weight: 400;
2290      line-height: 1.5;
2291    }
2292  }
2293`;
2294
2295// EXTERNAL MODULE: ./src/app/blocks/shared/components/index.js + 138 modules
2296var components = __webpack_require__(61009);
2297// EXTERNAL MODULE: ./src/app/blocks/shared/components/SearchSection/SearchDropdown/SearchDropdown.js + 1 modules
2298var SearchDropdown = __webpack_require__(22968);
2299// EXTERNAL MODULE: ./src/app/blocks/shared/components/SearchSection/SearchSection.js + 10 modules
2300var SearchSection = __webpack_require__(31176);
2301;// ./src/app/blocks/pages/Hub/ResearchProjectListing/ResearchProjectCard/ResearchProjectCard.styled.js
2302
2303const ResearchProjectCardStyled = styled_components_browser_esm["default"].article`
2304  display: flex;
2305  flex-direction: column;
2306  border-radius: 8px;
2307  max-width: 100%;
2308  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
2309  background-color: #ffffff;
2310  height: 100%;
2311  width: 100%;
2312
2313  .card-image {
2314    flex-shrink: 0;
2315    height: 208px;
2316    width: 100%;
2317    overflow: hidden;
2318
2319    img {
2320      width: 100%;
2321      height: 100%;
2322      border-top-right-radius: 8px;
2323      border-top-left-radius: 8px;
2324      object-fit: cover;
2325      display: block;
2326    }
2327
2328    @media (max-width: ${(p) => p.theme.breakpoints.tablet - 1}px) {
2329      display: none;
2330    }
2331  }
2332
2333  .card-content {
2334    display: flex;
2335    flex-direction: column;
2336    row-gap: 16px;
2337    padding: 24px;
2338    font-family: Wix Madefor Text, sans-serif;
2339    min-height: 0;
2340  }
2341
2342  .card-description {
2343    margin: 0;
2344    font-size: 1rem;
2345    font-weight: 400;
2346    line-height: 1.5;
2347    color: #000000;
2348    display: -webkit-box;
2349    -webkit-line-clamp: 5;
2350    -webkit-box-orient: vertical;
2351    overflow: hidden;
2352  }
2353
2354  .card-tags {
2355    display: flex;
2356    flex-wrap: wrap;
2357    gap: 8px;
2358    margin-top: auto;
2359    padding-top: 8px;
2360  }
2361
2362  .card-link-icon {
2363    padding: 4.8px 0 0 8px;
2364  }
2365`;
2366
2367// EXTERNAL MODULE: ./src/app/blocks/shared/components/Image/utils.js
2368var utils = __webpack_require__(58762);
2369;// ./src/app/blocks/pages/Hub/ResearchProjectListing/ResearchProjectCard/ResearchProjectCard.js
2370
2371
2372
2373
2374
2375
2376function ResearchProjectCard({ project, showThumbnails = true }) {
2377  const {
2378    title,
2379    uri,
2380    description,
2381    status,
2382    thumbnail,
2383    researchAreas = [],
2384    subjectAreas = []
2385  } = project;
2386  const firstResearchArea = researchAreas[0];
2387  const displaySubjectAreas = subjectAreas.slice(0, 3);
2388  const cardImage = showThumbnails ? (0,utils/* getDefaultImage */.Ny)(thumbnail, utils/* DEFAULT_THUMBNAIL */.fX) : null;
2389  return /* @__PURE__ */ react.createElement(ResearchProjectCardStyled, null, cardImage && /* @__PURE__ */ react.createElement("div", { className: "card-image" }, /* @__PURE__ */ react.createElement(components/* Image */._V, { image: cardImage, defaultImgOnError: true })), /* @__PURE__ */ react.createElement("div", { className: "card-content" }, /* @__PURE__ */ react.createElement(
2390    components/* LinkCta */.$l,
2391    {
2392      className: "card-link",
2393      childClassName: "card-link",
2394      url: uri,
2395      rightIcon: /* @__PURE__ */ react.createElement(
2396        index_es/* FontAwesomeIcon */.g,
2397        {
2398          className: "card-link-icon",
2399          icon: "fa-solid fa-arrow-right"
2400        }
2401      ),
2402      maxCharacterLength: 150
2403    },
2404    title
2405  ), description && /* @__PURE__ */ react.createElement("p", { className: "card-description" }, description), /* @__PURE__ */ react.createElement("div", { className: "card-tags" }, status?.name && /* @__PURE__ */ react.createElement(components/* Pill */.ab, { bgColour: "#F4A6A2", className: "tag tag--status" }, status.name), firstResearchArea && /* @__PURE__ */ react.createElement(components/* Pill */.ab, { bgColour: "#EAEFF0", className: "tag tag--category" }, firstResearchArea.entryTitle), displaySubjectAreas.map((area) => /* @__PURE__ */ react.createElement(
2406    components/* Pill */.ab,
2407    {
2408      key: area.sys.id,
2409      bgColour: "#EAEFF0",
2410      className: "tag tag--category"
2411    },
2412    area.entryTitle
2413  )))));
2414}
2415ResearchProjectCard.propTypes = {
2416  showThumbnails: (prop_types_default()).bool,
2417  project: prop_types_default().shape({
2418    id: (prop_types_default()).string.isRequired,
2419    uri: (prop_types_default()).string,
2420    title: (prop_types_default()).string,
2421    description: (prop_types_default()).string,
2422    status: prop_types_default().shape({ name: (prop_types_default()).string }),
2423    thumbnail: (prop_types_default()).object,
2424    researchAreas: prop_types_default().arrayOf(
2425      prop_types_default().shape({
2426        sys: prop_types_default().shape({ id: (prop_types_default()).string }),
2427        entryTitle: (prop_types_default()).string
2428      })
2429    ),
2430    subjectAreas: prop_types_default().arrayOf(
2431      prop_types_default().shape({
2432        sys: prop_types_default().shape({ id: (prop_types_default()).string }),
2433        entryTitle: (prop_types_default()).string
2434      })
2435    )
2436  }).isRequired
2437};
2438
2439// EXTERNAL MODULE: ./node_modules/contensis-delivery-api/lib/index.js
2440var lib = __webpack_require__(43196);
2441// EXTERNAL MODULE: ./src/app/blocks/shared/hooks/index.js + 17 modules
2442var hooks = __webpack_require__(88429);
2443// EXTERNAL MODULE: ./src/app/blocks/shared/utils/index.js + 7 modules
2444var shared_utils = __webpack_require__(92562);
2445// EXTERNAL MODULE: ./src/app/features/listings/util/util.js
2446var util = __webpack_require__(9514);
2447;// ./src/app/blocks/pages/Hub/ResearchProjectListing/hooks/useResearchProjectsQuery.js
2448
2449
2450
2451
2452
2453const parseProjectsResult = (result) => {
2454  if ((0,shared_utils/* isInvalidArray */.J_)(result?.items)) return [];
2455  return result.items.map((item) => ({
2456    id: item.sys.id,
2457    uri: item.sys.uri,
2458    title: item.entryTitle,
2459    description: item.description,
2460    status: item.status,
2461    thumbnail: item.thumbnail,
2462    researchAreas: item.researchAreas || [],
2463    subjectAreas: item.subjectAreas || []
2464  }));
2465};
2466const useResearchProjectsQuery = ({
2467  sourceId,
2468  status,
2469  pageIndex = 0,
2470  pageSize = 12,
2471  enabled = true
2472}) => {
2473  const { isLoading, result, setQuery } = (0,hooks/* useSearch */.SQ)();
2474  (0,react.useEffect)(() => {
2475    if (!enabled || !sourceId) return;
2476    const conditions = [
2477      lib.Op.equalTo("sys.contentTypeId", "researchProject"),
2478      lib.Op.equalTo("sys.versionStatus", "published"),
2479      lib.Op.equalTo("orgUnits[].sys.id", sourceId),
2480      lib.Op.equalTo("searchOptions.includeInKCLSiteListings", true)
2481    ];
2482    if (status && status !== "All" && util/* projectStatusTaxonomy */.NZ[status]) {
2483      conditions.push(lib.Op.equalTo("status", util/* projectStatusTaxonomy */.NZ[status]));
2484    }
2485    const query = new lib.Query(lib.Op.and(...conditions));
2486    query.orderBy = lib.OrderBy.asc("entryTitle");
2487    query.pageSize = pageSize;
2488    query.pageIndex = pageIndex;
2489    query.fields = [
2490      "entryTitle",
2491      "sys.uri",
2492      "sys.id",
2493      "description",
2494      "status",
2495      "thumbnail",
2496      "researchAreas",
2497      "subjectAreas"
2498    ];
2499    setQuery(query);
2500  }, [enabled, sourceId, status, pageIndex, pageSize, setQuery]);
2501  const totalCount = result?.totalCount ?? 0;
2502  return {
2503    isLoading: isLoading || !!sourceId && result?.items === void 0,
2504    projects: parseProjectsResult(result),
2505    totalCount
2506  };
2507};
2508
2509;// ./src/app/blocks/pages/Hub/ResearchProjectListing/hooks/useResearchProfilesQuery.js
2510
2511
2512
2513
2514const parseProfilesResult = (result) => {
2515  if ((0,shared_utils/* isInvalidArray */.J_)(result?.items)) return [];
2516  return result.items.map((item) => ({
2517    id: item.sys.id,
2518    uri: item.sys.uri,
2519    title: item.entryTitle,
2520    description: item.description,
2521    thumbnail: item.promoImage,
2522    researchAreas: item.categories || [],
2523    subjectAreas: item.topics || []
2524  }));
2525};
2526const useResearchProfilesQuery = ({
2527  sourceId,
2528  searchText = "",
2529  letter = "",
2530  pageIndex = 0,
2531  pageSize = 12,
2532  enabled = true
2533}) => {
2534  const { isLoading, result, setQuery } = (0,hooks/* useSearch */.SQ)();
2535  (0,react.useEffect)(() => {
2536    if (!enabled || !sourceId) return;
2537    const filters = [
2538      lib.Op.equalTo("sys.contentTypeId", "researchProfile"),
2539      lib.Op.equalTo("sys.versionStatus", "published"),
2540      lib.Op.equalTo("orgUnits[].sys.id", sourceId),
2541      lib.Op.equalTo("searchOptions.includeInKCLSiteListings", true)
2542    ];
2543    if (searchText) {
2544      filters.push(
2545        lib.Op.or(
2546          lib.Op.contains("entryTitle", searchText),
2547          lib.Op.contains("description", searchText),
2548          lib.Op.contains("categories[].entryTitle", searchText),
2549          lib.Op.contains("topics[].entryTitle", searchText)
2550        )
2551      );
2552    }
2553    if (letter) {
2554      filters.push(lib.Op.startsWith("entryTitle", letter));
2555    }
2556    const query = new lib.Query(lib.Op.and(...filters));
2557    query.orderBy = lib.OrderBy.asc("entryTitle");
2558    query.pageSize = pageSize;
2559    query.pageIndex = pageIndex;
2560    query.fields = [
2561      "entryTitle",
2562      "sys.uri",
2563      "sys.id",
2564      "description",
2565      "promoImage",
2566      "categories",
2567      "topics"
2568    ];
2569    setQuery(query);
2570  }, [enabled, sourceId, searchText, letter, pageIndex, pageSize, setQuery]);
2571  const totalCount = result?.totalCount ?? 0;
2572  return {
2573    isLoading: isLoading || !!sourceId && result?.items === void 0,
2574    profiles: parseProfilesResult(result),
2575    totalCount
2576  };
2577};
2578
2579// EXTERNAL MODULE: ./src/app/blocks/shared/utils/dom-helpers.js
2580var dom_helpers = __webpack_require__(97306);
2581// EXTERNAL MODULE: ./src/app/blocks/shared/utils/filter-utils.js
2582var filter_utils = __webpack_require__(67218);
2583// EXTERNAL MODULE: ./src/app/blocks/pages/ListingPage/utils/constants.js
2584var constants = __webpack_require__(68568);
2585;// ./src/app/blocks/pages/Hub/ResearchProjectListing/utils/index.js
2586
2587
2588const STATUS_FILTERS = ["Ongoing", "Completed", "Starting"];
2589const STATUS_DROPDOWN_OPTIONS = STATUS_FILTERS.map((s) => ({
2590  value: s,
2591  label: s
2592}));
2593const PAGE_SIZE_WITH_THUMBNAILS = 6;
2594const PAGE_SIZE_WITHOUT_THUMBNAILS = 12;
2595const PROFILE_FILTER_LIST = [
2596  (0,filter_utils/* createFilterInput */.JU)(
2597    "profile-search",
2598    "Search",
2599    "Type here to find a profile",
2600    ""
2601  ),
2602  (0,filter_utils/* createAToZFilterDropdown */.og)(
2603    "profile-atoz",
2604    "Filter by letter (A - Z)",
2605    "Please select",
2606    constants/* atoZ */.LZ,
2607    ""
2608  )
2609];
2610
2611;// ./src/app/blocks/pages/Hub/ResearchProjectListing/ResearchProjectListing.js
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626function ResearchProjectListing({ value = {}, hasSidebar = false }) {
2627  const {
2628    heading,
2629    summary,
2630    headingLevel,
2631    facultyDepartment,
2632    showThumbnails = true,
2633    showProjectsOrProfiles = "projects"
2634  } = value;
2635  const headingLevelMap = { "level-1": "Level 1", "level-2": "Level 2" };
2636  const mappedHeadingLevel = headingLevelMap[headingLevel] ?? headingLevel;
2637  const isProfiles = showProjectsOrProfiles === "profiles";
2638  const noHeadingOrSummary = !heading && !summary;
2639  const [status, setStatus] = (0,react.useState)("Ongoing");
2640  const [pageIndex, setPageIndex] = (0,react.useState)(0);
2641  const [profileFilters, setProfileFilters] = (0,react.useState)({
2642    pageIndex: 0,
2643    searchText: "",
2644    letter: ""
2645  });
2646  const sourceId = facultyDepartment?.sys?.id;
2647  const { isMobile } = (0,hooks/* useScreenType */.mk)();
2648  const { isMobile: isBelowDesktop } = (0,hooks/* useScreenType */.mk)(1024);
2649  const pageSize = showThumbnails && !isBelowDesktop ? PAGE_SIZE_WITH_THUMBNAILS : PAGE_SIZE_WITHOUT_THUMBNAILS;
2650  const {
2651    isLoading: projectsLoading,
2652    projects,
2653    totalCount: projectsTotalCount
2654  } = useResearchProjectsQuery({
2655    sourceId,
2656    status,
2657    pageIndex,
2658    pageSize,
2659    enabled: !isProfiles
2660  });
2661  const {
2662    isLoading: profilesLoading,
2663    profiles,
2664    totalCount: profilesTotalCount
2665  } = useResearchProfilesQuery({
2666    sourceId,
2667    searchText: profileFilters.searchText,
2668    letter: profileFilters.letter,
2669    pageIndex: profileFilters.pageIndex,
2670    pageSize,
2671    enabled: isProfiles
2672  });
2673  const isLoading = isProfiles ? profilesLoading : projectsLoading;
2674  const items = isProfiles ? profiles : projects;
2675  const totalCount = isProfiles ? profilesTotalCount : projectsTotalCount;
2676  const currentPageIndex = isProfiles ? profileFilters.pageIndex : pageIndex;
2677  const projectFilterRef = (0,react.useRef)(null);
2678  const profileFilterRef = (0,react.useRef)(null);
2679  const handleStatusChange = ({ value: value2 }) => {
2680    setStatus(value2);
2681    setPageIndex(0);
2682  };
2683  const handleProfileSearch = (filters) => {
2684    const letter = filters["profile-atoz"];
2685    setProfileFilters({
2686      searchText: filters["profile-search"] ?? "",
2687      letter: letter === "All" ? "" : letter ?? "",
2688      pageIndex: 0
2689    });
2690  };
2691  const endCount = Math.min((currentPageIndex + 1) * pageSize, totalCount);
2692  const startCount = totalCount > 0 ? currentPageIndex * pageSize + 1 : 0;
2693  return /* @__PURE__ */ react.createElement(
2694    ResearchProjectListingStyled,
2695    {
2696      $hasSidebar: hasSidebar,
2697      $noHeadingOrSummary: noHeadingOrSummary
2698    },
2699    /* @__PURE__ */ react.createElement(components/* ResponsiveContainer */.uf, { isEmbedded: hasSidebar }, /* @__PURE__ */ react.createElement("span", { id: "projects-top" }), heading && /* @__PURE__ */ react.createElement(
2700      components/* Heading */.DZ,
2701      {
2702        headingLevel: mappedHeadingLevel,
2703        className: "listing-heading",
2704        headingText: heading
2705      }
2706    ), summary && /* @__PURE__ */ react.createElement("p", { className: "listing-summary" }, summary), isProfiles ? /* @__PURE__ */ react.createElement("div", { ref: profileFilterRef }, /* @__PURE__ */ react.createElement(
2707      SearchSection/* SearchSection */.u,
2708      {
2709        searchSectionId: "research-profiles",
2710        title: "Refine your results",
2711        filterList: PROFILE_FILTER_LIST,
2712        onSearch: handleProfileSearch,
2713        onInputEnterKey: ({ filterValue }) => handleProfileSearch(filterValue),
2714        paginatorStartElementIndexLabel: startCount,
2715        paginatorEndElementIndexLabel: endCount,
2716        totalNumberOfElements: totalCount,
2717        hideAdvancedFilters: true,
2718        stackFilters: hasSidebar
2719      }
2720    )) : /* @__PURE__ */ react.createElement("div", { ref: projectFilterRef, className: "listing-filter-bar" }, /* @__PURE__ */ react.createElement("div", { className: "filter-bar-header" }, /* @__PURE__ */ react.createElement("p", { className: "filter-bar-title" }, "Refine your results"), totalCount > 0 && /* @__PURE__ */ react.createElement(
2721      "p",
2722      {
2723        className: "filter-bar-counter",
2724        "aria-live": "polite",
2725        "aria-atomic": "true"
2726      },
2727      endCount,
2728      " of ",
2729      totalCount,
2730      " results shown"
2731    )), /* @__PURE__ */ react.createElement("div", { className: "filter-bar-dropdown" }, /* @__PURE__ */ react.createElement(
2732      SearchDropdown/* SearchDropdown */.G,
2733      {
2734        id: "project-status-filter",
2735        label: "Filter by project status",
2736        value: status,
2737        placeholder: "All",
2738        isPlaceholderSelectable: true,
2739        dropdownOptions: STATUS_DROPDOWN_OPTIONS,
2740        onChange: handleStatusChange
2741      }
2742    ))), isLoading && /* @__PURE__ */ react.createElement(components/* ListingLoader */.kV, null), !isLoading && (0,shared_utils/* isInvalidArray */.J_)(items) && /* @__PURE__ */ react.createElement("div", { className: "no-results", "aria-live": "polite", "aria-atomic": "true" }, /* @__PURE__ */ react.createElement("h2", null, "No results found"), /* @__PURE__ */ react.createElement("p", null, "Please adjust your terms and filters and try searching again.")), !isLoading && (0,shared_utils/* isValidArray */.OP)(items) && /* @__PURE__ */ react.createElement("div", { className: "card-grid" }, items.map((item) => /* @__PURE__ */ react.createElement("div", { key: item.id, className: "card-wrapper" }, /* @__PURE__ */ react.createElement(
2743      ResearchProjectCard,
2744      {
2745        project: item,
2746        showThumbnails
2747      }
2748    )))), totalCount > pageSize && /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("a", { href: "#projects-top", className: "back-to-top" }, "Back to top", /* @__PURE__ */ react.createElement(index_es/* FontAwesomeIcon */.g, { icon: "fa-solid fa-arrow-up" })), /* @__PURE__ */ react.createElement("div", { className: "listing-pagination" }, /* @__PURE__ */ react.createElement(
2749      components/* Paginator */.mg,
2750      {
2751        currentPage: currentPageIndex,
2752        totalNumberOfElements: totalCount,
2753        elementsPerPage: pageSize,
2754        numberOfPagesUntilSuspension: isMobile ? 2 : 5,
2755        onPageChange: (page) => {
2756          if (isProfiles) {
2757            setProfileFilters((prev) => ({ ...prev, pageIndex: page }));
2758            (0,dom_helpers/* getFirstFocusableElement */.$)(profileFilterRef.current)?.focus();
2759          } else {
2760            setPageIndex(page);
2761            (0,dom_helpers/* getFirstFocusableElement */.$)(projectFilterRef.current)?.focus();
2762          }
2763        }
2764      }
2765    ))))
2766  );
2767}
2768ResearchProjectListing.propTypes = {
2769  hasSidebar: (prop_types_default()).bool,
2770  value: prop_types_default().shape({
2771    heading: (prop_types_default()).string,
2772    summary: (prop_types_default()).string,
2773    headingLevel: (prop_types_default()).string,
2774    facultyDepartment: prop_types_default().shape({
2775      sys: prop_types_default().shape({ id: (prop_types_default()).string })
2776    }),
2777    showThumbnails: (prop_types_default()).bool,
2778    showProjectsOrProfiles: prop_types_default().oneOf(["projects", "profiles"])
2779  })
2780};
2781
2782
2783/***/ },
2784
2785/***/ 96517
2786(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2787
2788/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2789/* harmony export */   Tw: () => (/* binding */ getVariantByIndex),
2790/* harmony export */   WG: () => (/* binding */ getCombinedItems),
2791/* harmony export */   lD: () => (/* binding */ getHeadingLevel)
2792/* harmony export */ });
2793function getVariantByIndex(index) {
2794  return index % 2 === 0 ? "secondary" : "primary";
2795}
2796const getHeadingLevel = (headingLevel) => {
2797  switch (headingLevel) {
2798    case "heading-level-3":
2799      return "Level 3";
2800    case "heading-level-4":
2801      return "Level 4";
2802    default:
2803      return "Level 3";
2804  }
2805};
2806const getCombinedItems = (format, newsItems, eventItems) => {
2807  switch (format) {
2808    case "4NewsStories":
2809      return newsItems;
2810    case "4Events":
2811      return eventItems;
2812    case "2News2Events": {
2813      const combined = [...newsItems, ...eventItems];
2814      return combined;
2815    }
2816    default:
2817      return [];
2818  }
2819};
2820
2821
2822/***/ },
2823
2824/***/ 65274
2825(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2826
2827/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2828/* harmony export */   P: () => (/* binding */ promosToUse)
2829/* harmony export */ });
2830const promosToUse = (promos) => {
2831  return Array.isArray(promos) ? promos.reduce(
2832    (acc, item) => {
2833      if (item.sys?.contentTypeId === "promoGroup" && Array.isArray(item.promo)) {
2834        acc.promoGroup = item.promo;
2835      } else {
2836        acc.promos.push(item);
2837      }
2838      return acc;
2839    },
2840    { promos: [], promoGroup: [] }
2841  ) : { promos: [], promoGroup: [] };
2842};
2843
2844
2845/***/ }
2846
2847}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.