PageSourceSearch

https://www.kcl.ac.uk/_GhbZtw_f42a4caa-9096-436e-89fe-d983b47abbde…/legacy/js/7715.841bd611f99e6375c665.js

js kcl.ac.uk collected 2026-10-01 07:43:09 UTC 38,020 bytes, 990 lines download raw bytes

1"use strict";
2(self["__LOADABLE_LOADED_CHUNKS__"] = self["__LOADABLE_LOADED_CHUNKS__"] || []).push([[7715],{
3
4/***/ 81220
5(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6
7
8// EXPORTS
9__webpack_require__.d(__webpack_exports__, {
10  A: () => (/* binding */ AcademicManual_AcademicManual)
11});
12
13// EXTERNAL MODULE: ./node_modules/react/index.js
14var react = __webpack_require__(29633);
15// EXTERNAL MODULE: ./node_modules/react-router/esm/react-router.js
16var react_router = __webpack_require__(45666);
17// EXTERNAL MODULE: ./node_modules/prop-types/index.js
18var prop_types = __webpack_require__(86627);
19var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
20// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
21var styled_components_browser_esm = __webpack_require__(67780);
22// EXTERNAL MODULE: ./src/app/features/common/button/components.styled/Button.styled.js
23var Button_styled = __webpack_require__(86595);
24// EXTERNAL MODULE: ./src/app/theme/spacing.js
25var spacing = __webpack_require__(59778);
26;// ./src/app/features/AcademicManual/AcademicManual.styled.js
27
28
29
30const AcademicManualStyled = styled_components_browser_esm["default"].div`
31  display: flex;
32  flex-direction: column;
33  width: 100%;
34
35  .keyline {
36    display: block;
37    width: 100%;
38    height: 3px;
39    margin: ${spacing/* default */.A.spacing24} 0 ${spacing/* default */.A.spacing20} 0;
40    background-color: ${(p) => p.theme.colours.grey03};
41  }
42
43  .keyline--thin {
44    height: 3px;
45    margin: ${spacing/* default */.A.spacing16} 0 ${spacing/* default */.A.spacing20} 0;
46  }
47  .list-item-container {
48    width: 100%;
49  }
50  .btn-container {
51    width: 100%;
52    ${Button_styled/* default */.A} {
53      margin-right: ${spacing/* default */.A.spacing8};
54    }
55    margin-bottom: ${spacing/* default */.A.spacing32};
56  }
57  @media screen and (max-width: ${(p) => p.theme.layout.breakpoints.small}px) {
58    ${Button_styled/* default */.A} {
59      width: 100%;
60      margin-bottom: ${spacing/* default */.A.spacing16};
61    }
62  }
63`;
64
65// EXTERNAL MODULE: ./src/app/features/common/index.js + 24 modules
66var common = __webpack_require__(70910);
67// EXTERNAL MODULE: ./src/app/core/util/hooks/useQuery.js
68var useQuery = __webpack_require__(47988);
69// EXTERNAL MODULE: ./src/app/features/listings/components/PanelList.js + 1 modules
70var PanelList = __webpack_require__(7943);
71// EXTERNAL MODULE: ./src/app/features/listings/components/StripeList.js + 2 modules
72var StripeList = __webpack_require__(98288);
73;// ./src/app/features/listings/components.styled/ArchiveListItem.styled.js
74
75
76const ArchiveListItemStyled = styled_components_browser_esm["default"].div`
77  display: flex;
78  flex-direction: row;
79  gap: ${spacing/* default */.A.spacing12};
80  padding: ${spacing/* default */.A.spacing12} ${spacing/* default */.A.spacing16};
81  .list-item--year {
82    display: block;
83    min-width: 112px;
84    color: ${(p) => p.theme.colours.bluePrimary};
85    cursor: pointer;
86    &:hover {
87      color: ${(p) => p.theme.colours.blueSecondary};
88      text-decoration: none;
89    }
90    &::before {
91      content: '\\e931';
92      color: ${(p) => p.theme.colours.bluePrimary};
93      font-family: ${(p) => p.theme.font.family.icon};
94      text-decoration: underline;
95      margin-right: ${spacing/* default */.A.spacing16};
96      &:hover {
97        color: ${(p) => p.theme.colours.blueSecondary};
98        font-weight: 300;
99        text-decoration: none;
100      }
101    }
102    &:hover::before {
103      color: ${(p) => p.theme.colours.blueSecondary};
104      font-weight: 300;
105    }
106  }
107
108  &:nth-child(odd) {
109    background: ${(p) => p.theme.colours.zebraStripeDark};
110  }
111
112  &:nth-child(even) {
113    background: ${(p) => p.theme.colours.zebraStripeLight};
114  }
115`;
116
117// EXTERNAL MODULE: ./src/app/core/util/getDocumentTitle.js
118var getDocumentTitle = __webpack_require__(98181);
119;// ./src/app/features/listings/components/ArchiveListItem.js
120
121
122
123
124function ArchiveListItem({ item }) {
125  const { year, document, simpleDescription } = item;
126  if (!document) return null;
127  return /* @__PURE__ */ react.createElement(ArchiveListItemStyled, null, /* @__P
127URE__ */ react.createElement(
128    "a",
129    {
130      href: document?.sys?.uri,
131      className: "list-item--year",
132      title: `Download academic manual archive year ${(0,getDocumentTitle/* default */.A)({
133        ...document,
134        entryTitle: year.entryTitle
135      })}`
136    },
137    year.entryTitle
138  ), /* @__PURE__ */ react.createElement("div", { className: "list-item--description" }, simpleDescription));
139}
140ArchiveListItem.propTypes = {
141  item: (prop_types_default()).object
142};
143/* harmony default export */ const components_ArchiveListItem = (ArchiveListItem);
144
145;// ./src/app/features/listings/components.styled/ArchiveList.styled.js
146
147
148const ArchiveListStyled = styled_components_browser_esm["default"].div`
149  display: flex;
150  flex-direction: column;
151  .archive-headers {
152    display: flex;
153    flex-direction: row;
154    padding-left: ${spacing/* default */.A.spacing32};
155    margin-bottom: ${spacing/* default */.A.spacing16};
156    font-family: ${(p) => p.theme.font.family.bold};
157    &--year {
158      min-width: 112px;
159    }
160  }
161`;
162
163;// ./src/app/features/listings/components/ArchiveList.js
164
165
166
167
168function ArchiveList({ items }) {
169  return /* @__PURE__ */ react.createElement(ArchiveListStyled, null, /* @__PURE__ */ react.createElement("div", { className: "archive-headers" }, /* @__PURE__ */ react.createElement("div", { className: "archive-headers--year" }, "Year"), /* @__PURE__ */ react.createElement("div", { className: "archive-headers--description" }, "Description")), items.map((i, idx) => {
170    return /* @__PURE__ */ react.createElement(components_ArchiveListItem, { item: i, key: idx });
171  }));
172}
173ArchiveList.propTypes = {
174  items: (prop_types_default()).array
175};
176/* harmony default export */ const components_ArchiveList = (ArchiveList);
177
178// EXTERNAL MODULE: ./src/app/core/util/hooks/useDefaults.js + 1 modules
179var useDefaults = __webpack_require__(19225);
180;// ./src/app/features/AcademicManual/AcademicManual.js
181
182
183
184
185
186
187
188
189
190
191function AcademicManual({ manual }) {
192  const { chapters, furtherReading, relevantLinks, archive } = manual;
193  const { defaults } = (0,useDefaults/* default */.A)("siteConfiguration");
194  const accYear = defaults?.currentAcademicYear?.entryTitle;
195  const query = (0,useQuery/* useQuery */.I)();
196  const history = (0,react_router/* useHistory */.W6)();
197  const view = query.get("view");
198  const btnClickHandler = (view2) => {
199    return history.push(`?view=${view2}`);
200  };
201  const active = view === "archive";
202  return /* @__PURE__ */ react.createElement(AcademicManualStyled, null, /* @__PURE__ */ react.createElement("div", { className: "btn-container" }, /* @__PURE__ */ react.createElement(
203    common/* Button */.$n,
204    {
205      onClick: () => btnClickHandler("current"),
206      colour: !active ? "red" : "grey",
207      title: accYear,
208      as: "button"
209    },
210    accYear
211  ), /* @__PURE__ */ react.createElement(
212    common/* Button */.$n,
213    {
214      onClick: () => btnClickHandler("archive"),
215      colour: active ? "red" : "grey",
216      title: "Archive",
217      as: "button"
218    },
219    "Archive"
220  )), !active ? /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("div", { className: "list-item-container" }, chapters?.length > 0 && /* @__PURE__ */ react.createElement(PanelList/* default */.A, { items: chapters })), /* @__PURE__ */ react.createElement("span", { className: "keyline keyline--thin" }), /* @__PURE__ */ react.createElement("div", { className: "list-item-container" }, furtherReading?.length > 0 && /* @__PURE__ */ react.createElement(PanelList/* default */.A, { items: furtherReading }))) : /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement("div", { className: "list-item-container" }, /* @__PURE__ */ react.createElement(components_ArchiveList, { items: archive })), /* @__PURE__ */ react.createElement("span", { className: "keyline keyline--thin" }), /* @__PURE__ */ react.createElement("div", { className: "list-item-container" }, /* @__PURE__ */ react.createElement(StripeList/* default */.A, { items: relevantLinks }))));
221}
222AcademicManual.propTypes = {
223  manual: (prop_types_default()).object
224};
225/* harmony default export */ const AcademicManual_AcademicManual = (AcademicManual);
226
227
228/***/ },
229
230/***/ 13837
231(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
232
233
234// EXPORTS
235__webpack_require__.d(__webpack_exports__, {
236  A: () => (/* binding */ components_JumpLinkDynamics)
237});
238
239// EXTERNAL MODULE: ./node_modules/react/index.js
240var react = __webpack_require__(29633);
241// EXTERNAL MODULE: ./node_modules/prop-types/index.js
242var prop_types = __webpack_require__(86627);
243var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
244// EXTERNAL MODULE: ./node_modules/react-scroll/modules/index.js
245var modules = __webpack_require__(95687);
246// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
247var styled_components_browser_esm = __webpack_require__(67780);
248;// ./src/app/features/common/Link/components/JumpLinkDynamics.styled.js
249
250const JumpLinkDynamicsStyled = styled_components_browser_esm["default"].div`
251  font-size: 1.125rem;
252  line-height: 1;
253
254  ${(props) => {
255  if (props.bold) {
256    return (0,styled_components_browser_esm.css)`
257        a {
258          color: ${(p) => p.theme.colours.bluePrimary};
259          font-family: ${(p) => p.theme.font.family.bold};
260          text-decoration: none;
261
262          &:hover {
263            color: ${(p) => p.theme.colours.blueSecondary};
264            text-decoration: underline;
265            cursor: pointer;
266          }
267        }
268      `;
269  } else {
270    return (0,styled_components_browser_esm.css)`
271        a {
272          color: ${(p) => p.theme.colours.bluePrimary};
273          font-family: ${(p) => p.theme.font.family.regular};
274          text-decoration: none;
275
276          &:hover {
277            color: ${(p) => p.theme.colours.blueSecondary};
278            text-decoration: underline;
279            cursor: pointer;
280          }
281        }
282      `;
283  }
284}}
285`;
286/* harmony default export */ const JumpLinkDynamics_styled = (JumpLinkDynamicsStyled);
287
288;// ./src/app/features/common/Link/components/JumpLinkDynamics.js
289
290
291
292
293const JumpLinkDynamics = ({ linkText }) => {
294  return /* @__PURE__ */ react.createElement(JumpLinkDynamics_styled, { bold: true }, /* @__PURE__ */ react.createElement(modules/* Link */.N_, { to: "dynamicscrm", smooth: true, as: "link" }, linkText));
295};
296JumpLinkDynamics.propTypes = {
297  linkText: (prop_types_default()).string
298};
299/* harmony default export */ const components_JumpLinkDynamics = (JumpLinkDynamics);
300
301
302/***/ },
303
304/***/ 16014
305(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
306
307
308// EXPORTS
309__webpack_require__.d(__webpack_exports__, {
310  A: () => (/* binding */ callToActionSection)
311});
312
313// EXTERNAL MODULE: ./node_modules/react/index.js
314var react = __webpack_require__(29633);
315// EXTERNAL MODULE: ./node_modules/prop-types/index.js
316var prop_types = __webpack_require__(86627);
317var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
318// EXTERNAL MODULE: ./node_modules/react-scroll/modules/index.js
319var modules = __webpack_require__(95687);
320// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
321var styled_components_browser_esm = __webpack_require__(67780);
322// EXTERNAL MODULE: ./src/app/features/common/button/components.styled/Button.styled.js
323var Button_styled = __webpack_require__(86595);
324// EXTERNAL MODULE: ./src/app/features/common/Heading/components.styled/Heading.styled.js
325var Heading_styled = __webpack_require__(21721);
326// EXTERNAL MODULE: ./src/app/features/common/paragraph/components.styled/Paragraph.styled.js
327var Paragraph_styled = __webpack_require__(66469);
328;// ./src/app/features/common/callToActionSection/components.styled/CallToActionSection.styled.js
329
330
331
332
333const CallToActionSectionStyled = styled_components_browser_esm["default"].div`
334  ${Heading_styled/* DynamicHeading */.G} {
335    line-height: 1.37;
336  }
337
338  ${Button_styled/* default */.A} {
339    width: 100%;
340  }
341
342  @media screen and (min-width: ${(p) => p.theme.layout.breakpoints.medium}px) {
343    ${Button_styled/* default */.A} {
344      width: auto;
345    }
346  }
347
348  @media screen and (min-width: ${(p) => p.theme.layout.breakpoints.large}px) {
349    ${Heading_styled/* DynamicHeading */.G} {
350      max-width: 80%;
351    }
352
353    ${Paragraph_styled/* ParagraphStyled */.y} {
354      max-width: 80%;
355    }
356  }
357`;
358/* harmony default export */ const CallToActionSection_styled = (CallToActionSectionStyled);
359
360// EXTERNAL MODULE: ./src/app/features/common/Heading/components/Heading.js
361var Heading = __webpack_require__(40789);
362// EXTERNAL MODULE: ./src/app/features/common/paragraph/components/Paragraph.js
363var Paragraph = __webpack_require__(52373);
364// EXTERNAL MODULE: ./src/app/features/common/button/components/Button.js
365var Button = __webpack_require__(51333);
366;// ./src/app/features/listings/listingFilters/components.styled/KeywordFilter.styled.js
367
368const KeywordFilterStyled = styled_components_browser_esm["default"].div`
369  margin-bottom: 2rem;
370`;
371/* harmony default export */ const KeywordFilter_styled = (KeywordFilterStyled);
372
373// EXTERNAL MODULE: ./src/app/features/common/SearchInputWithSubmit/components/SearchInputWithSubmit.js + 1 modules
374var SearchInputWithSubmit = __webpack_require__(51461);
375;// ./src/app/features/listings/listingFilters/components/KeywordFilter.js
376
377
378
379
380const KeywordFilter = ({
381  placeholder,
382  term,
383  updateTerm,
384  targetUrl,
385  buttonLabel
386}) => {
387  const [value, setValue] = (0,react.useState)(term);
388  const handleSubmit = (e) => {
389    updateTerm(value);
390    e.preventDefault();
391  };
392  const handleOnChange = (e) => {
393    setValue(e.target.value);
394  };
395  const newLocation = targetUrl ? `${targetUrl}${value}` : void 0;
396  const handleEnterSubmit = (e) => {
397    if (e.keyCode === 13) {
398      e.preventDefault();
399      location.href = newLocation;
400    }
401  };
402  return /* @__PURE__ */ react.createElement(KeywordFilter_styled, null, /* @__P
402URE__ */ react.createElement(
403    SearchInputWithSubmit/* default */.A,
404    {
405      placeholder,
406      value,
407      onChange: handleOnChange,
408      onSubmit: handleSubmit,
409      newLocation,
410      buttonLabel,
411      onKeyDown: handleEnterSubmit
412    }
413  ));
414};
415KeywordFilter.propTypes = {
416  placeholder: (prop_types_default()).string,
417  term: (prop_types_default()).string,
418  updateTerm: (prop_types_default()).func.isRequired,
419  buttonLabel: (prop_types_default()).string,
420  targetUrl: (prop_types_default()).string
421};
422KeywordFilter.defaultProps = {
423  placeholder: "",
424  buttonLabel: "",
425  targetUrl: "",
426  term: "",
427  updateTerm: () => {
428  }
429};
430/* harmony default export */ const components_KeywordFilter = (KeywordFilter);
431
432// EXTERNAL MODULE: ./src/app/features/common/warning/components/Warning.js + 1 modules
433var Warning = __webpack_require__(2383);
434// EXTERNAL MODULE: ./src/app/core/util/hooks/useQuery.js
435var useQuery = __webpack_require__(47988);
436// EXTERNAL MODULE: ./src/app/features/common/dynamicsCRM/util.js
437var util = __webpack_require__(87800);
438;// ./src/app/features/common/callToActionSection/components/CallToActionSection.js
439
440
441
442
443
444
445
446
447
448
449
450const CallToActionSection = ({ className, callToActionSection }) => {
451  let targetUrl = "#geckoform";
452  let targetText = "Sign up now";
453  const query = (0,useQuery/* useQuery */.I)();
454  const alpPrefix = (0,util/* utmToAlpPrefix */.R6)(query);
455  const scrollFunc = () => {
456    modules/* scroller */.XG.scrollTo(`${callToActionSection?.callToAction?.anchorTo}`, {
457      duration: 1500,
458      delay: 100,
459      smooth: true
460      //containerId: 'ContainerElementID',
461      //offset: 50, // Scrolls to element + 50 pixels down the page
462    });
463  };
464  const getCallToAction = () => {
465    if (callToActionSection?.callToAction != null) {
466      if (callToActionSection?.callToAction?.sys?.contentTypeId === "searchBar") {
467        return /* @__PURE__ */ react.createElement(
468          components_KeywordFilter,
469          {
470            targetUrl: callToActionSection.callToAction.targetUrl.indexOf("?") > 0 ? `${callToActionSection.callToAction.targetUrl}&${alpPrefix}` : `${callToActionSection.callToAction.targetUrl}?${alpPrefix}`,
471            placeholder: callToActionSection?.placeholder,
472            buttonLabel: callToActionSection?.buttonLabel
473          }
474        );
475      }
476      if (callToActionSection?.callToAction?.sys?.contentTypeId === "link") {
477        targetUrl = callToActionSection?.callToAction?.url.indexOf("?") > 0 ? `${callToActionSection?.callToAction?.url}&${alpPrefix}` : `${callToActionSection?.callToAction?.url}?${alpPrefix}`;
478        targetText = callToActionSection?.callToAction?.entryTitle;
479        return /* @__PURE__ */ react.createElement(Button/* default */.A, { colour: "red", uri: targetUrl, title: targetText });
480      }
481      if (callToActionSection?.callToAction?.sys?.contentTypeId === "anchorLink") {
482        targetText = callToActionSection?.callToAction?.entryTitle;
483        return /* @__PURE__ */ react.createElement(Button/* default */.A, { onClick: scrollFunc, colour: "red", title: targetText });
484      }
485      return null;
486    }
487    if (callToActionSection.callToActionLink != null) {
488      targetUrl = callToActionSection.callToActionLink.url.indexOf("?") > 0 ? `${callToActionSection.callToActionLink.url}&${alpPrefix}` : `${callToActionSection.callToActionLink.url}?${alpPrefix}`;
489      targetText = callToActionSection.callToActionLink.entryTitle;
490      return /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement(Button/* default */.A, { colour: "red", uri: targetUrl, title: targetText }), /* @__PURE__ */ react.createElement(Warning/* default */.A, null, "Please update this to use the new Call to action field"));
491    }
492  };
493  return /* @__PURE__ */ react.createElement(CallToActionSection_styled, { className }, /* @__PURE__ */ react.createElement("section", null, callToActionSection.heading && /* @__PURE__ */ react.createElement(Heading/* default */.A, { level: "1" }, callToActionSection.heading), callToActionSection.text && /* @__PURE__ */ react.createElement(Paragraph/* default */.A, null, callToActionSection.text), getCallToAction()));
494};
495CallToActionSection.propTypes = {
496  className: (prop_types_default()).string,
497  callToActionSection: (prop_types_default()).object
498};
499CallToActionSection.defaultProps = {
500  className: "call-to-action-section",
501  callToActionSection: {
502    heading: "",
503    text: ""
504  }
505};
506/* harmony default export */ const components_CallToActionSection = (CallToActionSection);
507
508;// ./src/app/features/common/callToActionSection/index.js
509
510/* harmony default export */ const callToActionSection = (components_CallToActionSection);
511
512
513/***/ },
514
515/***/ 72034
516(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
517
518/* harmony export */ __webpack_require__.d(__webpack_exports__, {
519/* harmony export */   A: () => (__WEBPACK_DEFAULT_EXPORT__)
520/* harmony export */ });
521/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(29633);
522/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(86627);
523/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
524/* harmony import */ var _core_util_isClient__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(74831);
525/* harmony import */ var _util_legacy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(40274);
526/* harmony import */ var _core_util_hooks_useQuery__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(47988);
527
528
529
530
531
532const DynamicsCRMForm = ({ websiteID, formblockID, formType, formSubType }) => {
533  const query = (0,_core_util_hooks_useQuery__WEBPACK_IMPORTED_MODULE_4__/* .useQuery */ .I)();
534  const [hostname, setHostname] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(
535    "4369923a71f2455aae0eb1379e742e28.svc.dynamics.com"
536  );
537  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
538    if ((0,_core_util_isClient__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A)()) {
539      if (!window.location.href.toString().includes("kcl.ac.uk")) {
540        setHostname("d07ce24ceaa641548f81227082daa1a3.svc.dynamics.com");
541      }
542      window?.MsCrmMkt && window.MsCrmMkt.MsCrmFormLoader.on(
543        "afterFormLoad",
544        () => (0,_util_legacy__WEBPACK_IMPORTED_MODULE_3__/* .afterFormLoadFunc */ .vH)(query)
545      );
546      window?.MsCrmMkt && window.MsCrmMkt.MsCrmFormLoader.on(
547        "afterFormSubmit",
548        () => (0,_util_legacy__WEBPACK_IMPORTED_MODULE_3__/* .afterFormSubmitFunc */ .Fk)(formType, formSubType)
549      );
550    }
551  }, [query]);
552  return /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { id: "geckoform", "data-form-block-id": formblockID }
552), /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(
553    "script",
554    {
555      src: `https://mktdplp102cdn.azureedge.net/public/latest/js/form-loader.js?v=1.76.2008.0`
556    }
557  ), /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { id: `d${websiteID}` }), /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(
558    "script",
559    {
560      src: `https://mktdplp102cdn.azureedge.net/public/latest/js/ws-tracking.js?v=1.76.2008.0`
561    }
562  ), /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(
563    "div",
564    {
565      className: "d365-mkt-config",
566      style: { display: "none" },
567      "data-website-id": websiteID,
568      "data-hostname": hostname
569    }
570  ));
571};
572DynamicsCRMForm.propTypes = {
573  websiteID: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),
574  formblockID: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),
575  formType: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),
576  formSubType: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string)
577};
578/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DynamicsCRMForm);
579
580
581/***/ },
582
583/***/ 7943
584(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
585
586
587// EXPORTS
588__webpack_require__.d(__webpack_exports__, {
589  A: () => (/* binding */ components_PanelList)
590});
591
592// EXTERNAL MODULE: ./node_modules/react/index.js
593var react = __webpack_require__(29633);
594// EXTERNAL MODULE: ./node_modules/prop-types/index.js
595var prop_types = __webpack_require__(86627);
596var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
597// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
598var styled_components_browser_esm = __webpack_require__(67780);
599// EXTERNAL MODULE: ./src/app/features/common/Panel/components.styled/Panel.styled.js
600var Panel_styled = __webpack_require__(6137);
601// EXTERNAL MODULE: ./src/app/theme/spacing.js
602var spacing = __webpack_require__(59778);
603;// ./src/app/features/listings/components.styled/PanelList.styled.js
604
605
606
607const PanelListStyled = styled_components_browser_esm["default"].div`
608  display: flex;
609  flex-flow: row wrap;
610  flex-grow: 1;
611  row-gap: ${spacing/* default */.A.spacing24};
612  justify-content: space-between;
613  width: 100%;
614  margin-bottom: ${spacing/* default */.A.spacing32};
615  .panel-list--item {
616    max-width: 32%;
617    flex-grow: 1;
618    background-color: ${(p) => p.theme.colours.grey01};
619    li {
620      margin-bottom: ${spacing/* default */.A.spacing12};
621      a {
622        color: ${(p) => p.theme.colours.bluePrimary};
623        font-family: ${(p) => p.theme.font.family.regular};
624        font-weight: 400;
625        text-decoration: underline;
626
627        &:hover {
628          color: ${(p) => p.theme.colours.blueSecondary};
629          text-decoration: underline;
630        }
631
632        &:visited {
633          color: ${(p) => p.theme.colours.bluePrimary};
634        }
635      }
636    }
637  }
638
639  a.heading--link {
640    color: ${(p) => p.theme.colours.bluePrimary};
641    font-family: ${(p) => p.theme.font.family.bold};
642    font-weight: 400;
643    text-decoration: none;
644
645    &:hover {
646      color: ${(p) => p.theme.colours.blueSecondary};
647      text-decoration: underline;
648    }
649
650    &:visited {
651      color: ${(p) => p.theme.colours.bluePrimary};
652    }
653  }
654
655  ${Panel_styled/* default */.A} {
656    margin-bottom: 0;
657    height: 100%;
658  }
659
660  .text-center {
661    text-align: center;
662  }
663
664  .keyline {
665    display: block;
666    width: 100%;
667    height: 3px;
668    margin: ${spacing/* default */.A.spacing24} 0 ${spacing/* default */.A.spacing20} 0;
669    background-color: ${(p) => p.theme.colours.grey03};
670  }
671
672  .keyline--thin {
673    height: 3px;
674    margin: ${spacing/* default */.A.spacing16} 0 ${spacing/* default */.A.spacing20} 0;
675  }
676  @media screen and (min-width: ${(p) => p.theme.layout.breakpoints.medium}px) {
677    .panel-list--item {
678      width: 48%;
679    }
680  }
681  @media screen and (min-width: ${(p) => p.theme.layout.breakpoints.large}px) {
682    .panel-list--item {
683      width: 30%;
684    }
685  }
686`;
687/* harmony default export */ const PanelList_styled = (PanelListStyled);
688
689// EXTERNAL MODULE: ./src/app/features/listings/components/PanelListItem.js
690var PanelListItem = __webpack_require__(73997);
691;// ./src/app/features/listings/components/PanelList.js
692
693
694
695
696const PanelList = ({ items }) => {
697  return /* @__PURE__ */ react.createElement(PanelList_styled, null, items.map((i, idx) => /* @__PURE__ */ react.createElement(PanelListItem/* default */.A, { key: idx, item: i, className: "panel-list--item" })));
698};
699PanelList.propTypes = {
700  items: (prop_types_default()).array
701};
702/* harmony default export */ const components_PanelList = (PanelList);
703
704
705/***/ },
706
707/***/ 73997
708(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
709
710/* harmony export */ __webpack_require__.d(__webpack_exports__, {
711/* harmony export */   A: () => (__WEBPACK_DEFAULT_EXPORT__)
712/* harmony export */ });
713/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(29633);
714/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(86627);
715/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
716/* harmony import */ var _features_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70910);
717/* harmony import */ var _features_common_utils_getEntryLink__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(40153);
718
719
720
721
722const PanelListItem = ({ item, className }) => {
723  const { entryTitle, childEntries, entryDescription } = item;
724  return /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className }
724, /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_features_common__WEBPACK_IMPORTED_MODULE_2__/* .Panel */ .Zk, null, /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "text-center" }, /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_features_common__WEBPACK_IMPORTED_MODULE_2__/* .Heading */ .DZ, { level: 3, visualLevel: "heading5" }, " ", /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_features_common__WEBPACK_IMPORTED_MODULE_2__/* .Link */ .N_, { uri: (0,_features_common_utils_getEntryLink__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A)(item), className: "heading--link" }, entryTitle))), /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement("span", { className: "keyline keyline--thin" }), childEntries ? /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement("ul", null, childEntries?.map((entry) => {
725    const { entryTitle: entryTitle2, sys } = entry;
726    return sys.uri && /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement("li", { key: sys.id }, /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_features_common__WEBPACK_IMPORTED_MODULE_2__/* .Link */ .N_, { uri: sys.uri }, entryTitle2));
727  })) : /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_features_common__WEBPACK_IMPORTED_MODULE_2__/* .Paragraph */ .fz, { small: true }, entryDescription)));
728};
729PanelListItem.propTypes = {
730  className: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),
731  item: prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({
732    entryTitle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),
733    entryDescription: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),
734    sys: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object),
735    childEntries: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().array)
736  })
737};
738/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PanelListItem);
739
740
741/***/ },
742
743/***/ 98288
744(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
745
746
747// EXPORTS
748__webpack_require__.d(__webpack_exports__, {
749  A: () => (/* binding */ components_StripeList)
750});
751
752// EXTERNAL MODULE: ./node_modules/react/index.js
753var react = __webpack_require__(29633);
754// EXTERNAL MODULE: ./node_modules/prop-types/index.js
755var prop_types = __webpack_require__(86627);
756var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
757// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
758var styled_components_browser_esm = __webpack_require__(67780);
759// EXTERNAL MODULE: ./src/app/theme/spacing.js
760var spacing = __webpack_require__(59778);
761;// ./src/app/features/listings/components.styled/StripeListItem.styled.js
762
763
764const StripeListItemStyled = styled_components_browser_esm["default"].div`
765  display: flex;
766  padding: ${spacing/* default */.A.spacing12} ${spacing/* default */.A.spacing16};
767  flex-direction: column;
768
769  &:nth-child(odd) {
770    background: ${(p) => p.theme.colours.zebraStripeDark};
771  }
772
773  &:nth-child(even) {
774    background: ${(p) => p.theme.colours.zebraStripeLight};
775  }
776
777  &:last-of-type {
778    margin-bottom: ${spacing/* default */.A.spacing32};
779  }
780
781  a {
782    color: ${(p) => p.theme.colours.bluePrimary};
783    text-decoration: underline;
784
785    &:hover {
786      color: ${(p) => p.theme.colours.blueSecondary};
787      text-decoration: none;
788    }
789  }
790
791  .title {
792    color: ${(p) => p.theme.colours.grey08};
793    font-size: ${(p) => p.theme.font.size.px16};
794    font-family: ${(p) => p.theme.font.family.regular};
795  }
796
797  .text {
798    margin-top: ${spacing/* default */.A.spacing4};
799  }
800
801  @media screen and (min-width: ${(p) => p.theme.layout.breakpoints.medium}px) {
802    .title {
803      font-size: ${(p) => p.theme.font.size.px16};
804      line-height: 1.2;
805    }
806  }
807`;
808/* harmony default export */ const StripeListItem_styled = (StripeListItemStyled);
809
810// EXTERNAL MODULE: ./src/app/features/common/index.js + 24 modules
811var common = __webpack_require__(70910);
812// EXTERNAL MODULE: ./src/app/features/common/utils/getEntryLink.js
813var getEntryLink = __webpack_require__(40153);
814;// ./src/app/features/listings/components/StripeListItem.js
815
816
817
818
819
820function StripeListItem({ item }) {
821  const prepItem = (i) => {
822    if ("type" in i && "value" in i) {
823      if (Array.isArray)
824        return {
825          ...i.value
826        };
827    } else return i;
828  };
829  const preppedItem = prepItem(item);
830  const { text, entryTitle } = preppedItem;
831  return /* @__PURE__ */ react.createElement(StripeListItem_styled, null, /* @__P
831URE__ */ react.createElement("div", { className: "title" }, /* @__PURE__ */ react.createElement(common/* Link */.N_, { uri: (0,getEntryLink/* default */.A)(preppedItem) }, entryTitle), " "), text && /* @__PURE__ */ react.createElement("div", { className: "text" }, text));
832}
833StripeListItem.propTypes = {
834  item: (prop_types_default()).object
835};
836/* harmony default export */ const components_StripeListItem = (StripeListItem);
837
838;// ./src/app/features/listings/components/StripeList.js
839
840
841
842function StripeList({ items }) {
843  return /* @__PURE__ */ react.createElement(react.Fragment, null, items?.length > 0 && items.map((i, idx) => {
844    return /* @__PURE__ */ react.createElement(components_StripeListItem, { item: i, key: idx });
845  }));
846}
847StripeList.propTypes = {
848  items: (prop_types_default()).array
849};
850/* harmony default export */ const components_StripeList = (StripeList);
851
852
853/***/ },
854
855/***/ 8243
856(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
857
858
859// EXPORTS
860__webpack_require__.d(__webpack_exports__, {
861  A: () => (/* binding */ components_PromoSection)
862});
863
864// EXTERNAL MODULE: ./node_modules/react/index.js
865var react = __webpack_require__(29633);
866// EXTERNAL MODULE: ./node_modules/prop-types/index.js
867var prop_types = __webpack_require__(86627);
868var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
869// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js + 7 modules
870var styled_components_browser_esm = __webpack_require__(67780);
871// EXTERNAL MODULE: ./src/app/theme/index.js
872var theme = __webpack_require__(49539);
873;// ./src/app/features/promoSection/components.styled/PromoSection.styled.js
874
875
876const PromoSectionStyled = styled_components_browser_esm["default"].div`
877  display: flex;
878  flex-flow: wrap;
879  flex-direction: row;
880  justify-items: center;
881  justify-content: center;
882
883  .section-heading {
884    color: ${(props) => props.promoTheme === "blue" ? theme/* default */.A.colours.white : theme/* default */.A.colours.black};
885    text-align: center;
886  }
887`;
888/* harmony default export */ const PromoSection_styled = (PromoSectionStyled);
889
890// EXTERNAL MODULE: ./src/app/features/card/components/Card.js + 1 modules
891var Card = __webpack_require__(59313);
892// EXTERNAL MODULE: ./src/app/features/common/index.js + 24 modules
893var common = __webpack_require__(70910);
894// EXTERNAL MODULE: ./src/app/core/util/truncateString.js
895var truncateString = __webpack_require__(73243);
896// EXTERNAL MODULE: ./src/app/features/common/utils/getEntryLink.js
897var getEntryLink = __webpack_require__(40153);
898// EXTERNAL MODULE: ./src/app/core/util/hooks/useQuery.js
899var useQuery = __webpack_require__(47988);
900;// ./src/app/features/promoSection/components/PromoSection.js
901
902
903
904
905
906
907
908
909const PromoSection = ({ promoSection, className }) => {
910  const query = (0,useQuery/* useQuery */.I)();
911  let promosToUse, hasPromoGroup = false, copyAndFilterArr, promoTheme;
912  promoSection.whiteTheme && promoSection.greyTheme && promoSection.blueTheme ? promoTheme = "white" : promoSection.whiteTheme && promoSection.greyTheme ? promoTheme = "white" : promoSection.greyTheme && promoSection.blueTheme ? promoTheme = "white" : promoSection.whiteTheme ? promoTheme = "white" : promoSection.greyTheme ? promoTheme = "grey" : promoSection.blueTheme ? promoTheme = "blue" : promoTheme = "white";
913  promoSection.promos.forEach((promo) => {
914    if (promo.sys.contentTypeId == "promoGroup") {
915      hasPromoGroup = true;
916    }
917  });
918  hasPromoGroup ? copyAndFilterArr = [...promoSection.promos].filter((promo) => {
919    return promo.sys.contentTypeId == "promoGroup";
920  }) : promosToUse = promoSection.promos;
921  if (copyAndFilterArr !== void 0)
922    if (copyAndFilterArr.length >> 0) {
923      const copyAndFilterArrLength = copyAndFilterArr.length;
924      promosToUse = copyAndFilterArr[copyAndFilterArrLength - 1].promo;
925    } else {
926      promosToUse = promoSection.promos;
927    }
928  let mediumColWidth;
929  let largeColWidth;
930  const nrOfPromos = promosToUse?.length;
931  if (nrOfPromos == 1) {
932    mediumColWidth = 12;
933  } else if (nrOfPromos == 2) {
934    mediumColWidth = 6;
935  } else if (nrOfPromos == 3 || nrOfPromos == 5 || nrOfPromos == 6 || nrOfPromos == 9) {
936    mediumColWidth = 6;
937    largeColWidth = 4;
938  } else if (nrOfPromos == 4 || nrOfPromos == 7 || nrOfPromos == 8 || nrOfPromos == 10 || nrOfPromos == 11 || nrOfPromos == 12) {
939    mediumColWidth = 6;
940    largeColWidth = 3;
941  }
942  const cardsMap = promosToUse?.map((promo, idx) => {
943    let title, description, link, image, isEvent, isNews, publishDate, eventDate;
944    isEvent = promo.sys.contentTypeId === "events";
945    isNews = promo.sys.contentTypeId === "news";
946    title = promo.promoTitle ? promo.promoTitle : promo.title ? promo.title : promo.entryTitle ? promo.entryTitle : null;
947    description = promo.promoDescription ? promo.promoDescription : promo.summary ? promo.summary : promo.description ? promo.description : promo.entryDescription ? promo.entryDescription : `Read more about ${title} from King's College London...`;
948    image = promo.featuredImage ? promo.featuredImage : promo.thumbnailImage ? promo.thumbnailImage : promo.entryThumbnail ? promo.entryThumbnail : promo.image ? promo.image : promo.thumbnail ? promo.thumbnail : promo.promoImage ? promo.promoImage : promo.courseImage ? promo.courseImage : null;
949    link = (0,getEntryLink/* default */.A)(promo, false, query);
950    if (isNews) {
951      publishDate = promo.publishDate ? promo.publishDate : promo.sys.version.published;
952    }
953    if (isEvent) {
954      eventDate = promo?.date?.from;
955    }
956    return /* @__PURE__ */ react.createElement(
957      common/* Column */.VP,
958      {
959        key: idx,
960        medium: mediumColWidth,
961        large: largeColWidth,
962        flexColumn: true
963      },
964      /* @__PURE__ */ react.createElement(
965        Card/* default */.A,
966        {
967          title,
968          description: (0,truncateString/* default */.A)(`${description}`, 75, "...", true),
969          link,
970          image,
971          isPromoSection: true,
972          promoTheme,
973          publishDate,
974          eventDate
975        }
976      )
977    );
978  });
979  return /* @__PURE__ */ react.createElement(PromoSection_styled, { className, promoTheme }, promoSection.title !== null && /* @__PURE__ */ react.createElement(common/* Column */.VP, null, /* @__PURE__ */ react.createElement(common/* Heading */.DZ, { level: "2", className: "section-heading" }, promoSection.title)), cardsMap);
980};
981PromoSection.propTypes = {
982  promoSection: (prop_types_default()).object,
983  className: (prop_types_default()).string
984};
985/* harmony default export */ const components_PromoSection = (PromoSection);
986
987
988/***/ }
989
990}]);

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.