{"version":3,"file":"listing-cards-BiDPgdRA.js","sources":["../../../../src/scripts/utils.ts","../../../../src/scripts/components/react/Cards/AdventureCard.tsx","../../../../src/scripts/components/react/Cards/OfferCard.tsx","../../../../src/scripts/components/react/Cards/StayCard.tsx","../../../../src/scripts/modules/react/listings/listing-cards.tsx"],"sourcesContent":["const UrlFriendly = (str?: string) => {\n  if (!str) {\n    return '';\n  }\n\n  return str\n    .toLowerCase()\n    .replace(/ /g, '-')\n    .replace(/[^\\w-]+/g, '');\n};\n\nconst UpdateHashAndOpenLink = (\n  e: React.MouseEvent<HTMLAnchorElement>,\n  hash: string,\n  url: string\n) => {\n  e.preventDefault();\n\n  if (history.pushState) {\n    history.pushState(null, '', `#${hash}`);\n  } else {\n    window.location.hash = hash;\n  }\n\n  window.open(url, '_self');\n};\n\nexport { UrlFriendly, UpdateHashAndOpenLink };\n","import React from 'react';\nimport { CardProps } from './types';\nimport { UpdateHashAndOpenLink, UrlFriendly } from '../../../utils';\n\nconst AdventureCard = ({\n  card,\n  viewDetailsLabel,\n  bookingLabel,\n  showDescription,\n  callToBookLabel\n}: CardProps) => {\n  const { img, heading, subheading, description, buttons } = card;\n  const headingUrl = UrlFriendly(heading);\n\n  return (\n    <article className=\"card\" id={headingUrl}>\n      <picture className=\"card__img-wrapper\">\n        <img\n          className=\"card__img\"\n          src={img.src}\n          alt=\"Placeholder image\"\n          width={img.width}\n          height={img.height}\n        />\n      </picture>\n      <div className=\"card__content\">\n        <div className=\"card__text\">\n          <div className=\"card__heading-wrapper\">\n            <span className=\"card__subheading\">{subheading}</span>\n            <h3 className=\"card__heading\">{heading}</h3>\n          </div>\n          {showDescription && (\n            <div\n              className=\"card__description rtf\"\n              dangerouslySetInnerHTML={{ __html: `<p>${description}</p>` }}\n            ></div>\n          )}\n        </div>\n        <div className=\"card__btn-wrapper\">\n          {buttons &&\n            buttons.map((button, index) => {\n              const isTelephone = 'telephoneNumber' in button && button.telephoneNumber;\n              let buttonLabel: string | undefined = viewDetailsLabel;\n\n              if (button.btn === 'primary') {\n                buttonLabel = isTelephone\n                  ? `${callToBookLabel} ${button.telephoneNumber}`\n                  : bookingLabel;\n              }\n\n              const href = isTelephone\n                ? `tel:${button.telephoneNumber}`\n                : 'href' in button && button.href\n                  ? button.href\n                  : '#';\n\n              return (\n                <a\n                  key={index}\n                  href={href}\n                  className={`btn btn--${button.btn}`}\n                  onClick={event => UpdateHashAndOpenLink(event, headingUrl, href)}\n                >\n                  {buttonLabel}\n                </a>\n              );\n            })}\n        </div>\n      </div>\n    </article>\n  );\n};\n\nexport default AdventureCard;\n","import React from 'react';\nimport { CardProps } from './types';\nimport { UpdateHashAndOpenLink, UrlFriendly } from '../../../utils';\n\nconst OfferCard = ({\n  card,\n  viewDetailsLabel,\n  bookingLabel,\n  showDescription,\n  callToBookLabel\n}: CardProps) => {\n  const { img, heading, subheading, description, buttons } = card;\n  const headingUrl = UrlFriendly(heading);\n\n  return (\n    <article className=\"card\" id={headingUrl}>\n      <picture className=\"card__img-wrapper\">\n        <img\n          className=\"card__img\"\n          src={img.src}\n          alt=\"Placeholder image\"\n          width={img.width}\n          height={img.height}\n        />\n      </picture>\n      <div className=\"card__content\">\n        <div className=\"card__text\">\n          <div className=\"card__heading-wrapper\">\n            <span className=\"card__subheading\">{subheading}</span>\n            <h3 className=\"card__heading\">{heading}</h3>\n          </div>\n          {showDescription && (\n            <div\n              className=\"card__description rtf\"\n              dangerouslySetInnerHTML={{ __html: `<p>${description}</p>` }}\n            ></div>\n          )}\n        </div>\n        <div className=\"card__btn-wrapper\">\n          {buttons &&\n            buttons.map((button, index) => {\n              const isTelephone = 'telephoneNumber' in button && button.telephoneNumber;\n              let buttonLabel: string | undefined = viewDetailsLabel;\n\n              if (button.btn === 'primary') {\n                buttonLabel = isTelephone\n                  ? `${callToBookLabel} ${button.telephoneNumber}`\n                  : bookingLabel;\n              }\n\n              const href = isTelephone\n                ? `tel:${button.telephoneNumber}`\n                : 'href' in button && button.href\n                  ? button.href\n                  : '#';\n\n              return (\n                <a\n                  key={index}\n                  href={href}\n                  className={`btn btn--${button.btn}`}\n                  onClick={event => UpdateHashAndOpenLink(event, headingUrl, href)}\n                >\n                  {buttonLabel}\n                </a>\n              );\n            })}\n        </div>\n      </div>\n    </article>\n  );\n};\n\nexport default OfferCard;\n","import React from 'react';\nimport { CardProps } from './types';\nimport { UpdateHashAndOpenLink, UrlFriendly } from '../../../utils';\n\nconst StayCard = ({\n  card,\n  viewDetailsLabel,\n  bookingLabel,\n  showDescription,\n  callToBookLabel\n}: CardProps) => {\n  const { img, heading, subheading, description, buttons, additionalParams } = card;\n  const headingUrl = UrlFriendly(heading);\n\n  return (\n    <article className=\"card stay card--stay\" id={headingUrl}>\n      <picture className=\"card__img-wrapper\">\n        <img\n          className=\"card__img\"\n          src={img.src}\n          alt=\"Placeholder image\"\n          width={img.width}\n          height={img.height}\n        />\n      </picture>\n      <div className=\"card__content\">\n        <div className=\"card__text\">\n          <div className=\"card__heading-wrapper\">\n            <span className=\"card__subheading\">{subheading}</span>\n            <h3 className=\"card__heading\">{heading}</h3>\n            <div className=\"card__room-details\">\n              {additionalParams &&\n                additionalParams.map((param, index) => (\n                  <span key={index} className=\"card__room-details-item\">\n                    {param.icon && (\n                      <svg\n                        className=\"card__room-details-item--icon\"\n                        role=\"presentation\"\n                        viewBox=\"0 0 24 20\"\n                      >\n                        <use xlinkHref={`#${param.icon}`} />\n                      </svg>\n                    )}\n                    {param.value}\n                  </span>\n                ))}\n            </div>\n          </div>\n          {showDescription && (\n            <div\n              className=\"card__description rtf\"\n              dangerouslySetInnerHTML={{ __html: `<p>${description}</p>` }}\n            ></div>\n          )}\n        </div>\n        <div className=\"card__btn-wrapper\">\n          {buttons &&\n            buttons.map((button, index) => {\n              const isTelephone = 'telephoneNumber' in button && button.telephoneNumber;\n              let buttonLabel: string | undefined = viewDetailsLabel;\n\n              if (button.btn === 'primary') {\n                buttonLabel = isTelephone\n                  ? `${callToBookLabel} ${button.telephoneNumber}`\n                  : bookingLabel;\n              }\n\n              const href = isTelephone\n                ? `tel:${button.telephoneNumber}`\n                : 'href' in button && button.href\n                  ? button.href\n                  : '#';\n\n              return (\n                <a\n                  key={index}\n                  href={href}\n                  className={`btn btn--${button.btn}`}\n                  onClick={event => UpdateHashAndOpenLink(event, headingUrl, href)}\n                >\n                  {buttonLabel}\n                </a>\n              );\n            })}\n        </div>\n      </div>\n    </article>\n  );\n};\n\nexport default StayCard;\n","import React, { LegacyRef } from 'react';\nimport { CardItem } from '../../../components/react/Cards/types';\nimport { AdventureCard, OfferCard, StayCard } from '../../../components/react/Cards';\n\nconst CardsListing = ({\n  items,\n  cardVariantLower,\n  lastElementRef,\n  viewDetailsLabel,\n  bookingLabel,\n  showDescription,\n  callToBookLabel\n}: {\n  items: CardItem[];\n  cardVariantLower: string;\n  lastElementRef: LegacyRef<HTMLLIElement>;\n  viewDetailsLabel: string;\n  bookingLabel: string;\n  showDescription?: boolean;\n  callToBookLabel?: string;\n}) => {\n  // TODO: add animation to cards when they are loaded (react transition group? or css animation?)\n\n  return (\n    <ul\n      className={`cards-grid ${cardVariantLower === 'event' ? 'cards-grid--two' : cardVariantLower === 'stay' ? 'cards-grid--stay' : 'cards-grid--three'}`}\n    >\n      {items &&\n        items.map((card, index: number) => {\n          if (cardVariantLower === 'adventure' || cardVariantLower === 'event') {\n            return (\n              <li key={index} ref={index === items.length - 1 ? lastElementRef : null}>\n                <AdventureCard\n                  card={card}\n                  viewDetailsLabel={viewDetailsLabel}\n                  bookingLabel={bookingLabel}\n                  showDescription={showDescription}\n                  callToBookLabel={callToBookLabel}\n                />\n              </li>\n            );\n          }\n\n          if (cardVariantLower === 'stay') {\n            return (\n              <li\n                key={index}\n                className={`${index > 2 ? 'cards-grid__stay-item--large' : 'cards-grid__stay-item'}`}\n                ref={index === items.length - 1 ? lastElementRef : null}\n              >\n                <StayCard\n                  card={card}\n                  viewDetailsLabel={viewDetailsLabel}\n                  bookingLabel={bookingLabel}\n                  showDescription={showDescription}\n                  callToBookLabel={callToBookLabel}\n                />\n              </li>\n            );\n          }\n\n          if (cardVariantLower === 'offer') {\n            return (\n              <li key={index} ref={index === items.length - 1 ? lastElementRef : null}>\n                <OfferCard\n                  card={card}\n                  viewDetailsLabel={viewDetailsLabel}\n                  bookingLabel={bookingLabel}\n                  showDescription={showDescription}\n                  callToBookLabel={callToBookLabel}\n                />\n              </li>\n            );\n          }\n\n          return null;\n        })}\n    </ul>\n  );\n};\n\nexport default CardsListing;\n"],"names":["UrlFriendly","str","UpdateHashAndOpenLink","e","hash","url","AdventureCard","card","viewDetailsLabel","bookingLabel","showDescription","callToBookLabel","img","heading","subheading","description","buttons","headingUrl","React","button","index","isTelephone","buttonLabel","href","event","OfferCard","StayCard","additionalParams","param","CardsListing","items","cardVariantLower","lastElementRef"],"mappings":"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"}