{"version":3,"sources":["webpack:///./src/Frontend/app/components/teaser-grid/teaser-tile/teaser-tile.tsx","webpack:///./src/Frontend/app/components/teaser-grid/teaser-grid.tsx","webpack:///./src/Frontend/app/views/teaser-grid/teaser-grid-view.tsx","webpack:///./src/Frontend/app/components/icons/icon.tsx","webpack:///./src/Frontend/app/components/anchor/anchor.tsx","webpack:///./src/Frontend/app/components/content-section/content-section.tsx","webpack:///./src/Frontend/app/components/arrow-link/arrow-link.tsx","webpack:///./src/Frontend/app/utils/image-utils.ts","webpack:///./src/Frontend/app/components/responsive-image/responsive-image.tsx","webpack:///./src/Frontend/app/components/tag/tag.tsx","webpack:///./src/Frontend/app/components/spinner/spinner.tsx","webpack:///./src/Frontend/app/components/button/button.tsx","webpack:///./src/Frontend/app/components/title-link-top/title-link-top.tsx"],"names":["TileType","TemplateType","tileTypes","COL__1","srcSetSizes","sizes","COL__2","COL__4","LIST","imageSrc","imageAltText","tag","title","subtitle","richText","pageUrl","pageTarget","truncateTitle","hideRichText","date","props","tileType","baseClass","rootClasses","className","href","target","srcUrl","defaultSize","alt","lines","dangerouslySetInnerHTML","__html","templateTypes","T1","repeats","pattern","T2","T3","T4","T5","T6","viewMoreLink","templateType","loadMoreWebApiUrl","loadMoreBtnLabel","loadMorePageSize","filterTags","componentClasses","state","dispatch","teaserListFromStore","displayedTeasersOutOfTotalLabelFromStore","pageFromStore","teasersTotalCountFromStore","isLoadMorePending","teaserList","displayedTeasersOutOfTotalLabel","page","teasersTotalCount","showLoadMoreBtn","length","searchParams","TeaserItem","item","TeaserItemGroup","items","map","index","key","getTileType","template","tileIndex","reduce","pushTarget","pushItem","Array","isArray","push","isLarge","onClick","params","teaserParams","apiUrl","POST","then","response","payload","catch","disabled","render","this","contextModel","spriteUrl","viewBox","iconId","preserveAspectRatio","xmlnsXlink","xlinkHref","id","type","anchorId","hasNoMarginTop","hasNoMarginBottom","children","link","getQueryParamDelimiter","url","indexOf","hasExistingQueryParam","generateSrcSet","srcSetSize","parameterDelimiter","srcSetSizeHighDensity","Math","round","join","generateColumnImageProps","maxColumns","isFullWidth","gridMaxWidthFactor","ResponsiveImage","ref","src","srcSet","loading","tagTypeClassMap","NEWS","SPOT","BESTSELLER","BOOK_OF_THE_MONTH","UPCOMING","classModifier","shape","size","isInverted","isSecondary","e","headerTitle","headerLink"],"mappings":"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","file":"18.8fc1fefb1d8686b13240.js","sourcesContent":["import * as React from \"react\";\r\nimport ResponsiveImage from \"~/components/responsive-image/responsive-image\";\r\nimport Tag from \"~/components/tag/tag\";\r\nimport TruncateMarkup from \"react-truncate-markup\";\r\nimport classNames from \"classnames\";\r\n\r\nexport enum TileType {\r\n COL__1 = \"col-1\",\r\n COL__2 = \"col-2\",\r\n COL__4 = \"col-4\",\r\n LIST = \"list\"\r\n}\r\n\r\nconst tileTypes = {\r\n [TileType.COL__1]: {\r\n // Size 423px is needed for desktop, since col-1 can be both 25% and 33% wide\r\n srcSetSizes: [607, 402, 518, 423],\r\n sizes: `(max-width: 639px) 607px, (max-width: 867px) 402px, (max-width: 1099px) 518px, 423px`\r\n },\r\n [TileType.COL__2]: {\r\n // Size 867px is needed since template 3 and 4 show col-2 in 100% on this breakpoint\r\n srcSetSizes: [607, 835, 518, 651],\r\n sizes: `(max-width: 639px) 607px, (max-width: 867px) 835px, (max-width: 1099px) 518px, 651px`\r\n },\r\n [TileType.COL__4]: {\r\n srcSetSizes: [607, 835, 671, 838],\r\n sizes: \"(max-width: 639px) 607px, (max-width: 867px) 835px, (max-width: 1099px) 671px, 838px\"\r\n },\r\n [TileType.LIST]: {\r\n srcSetSizes: [607, 314, 195, 245],\r\n sizes: `(max-width: 639px) 607px, (max-width: 867px) 314px, (max-width: 1099px) 195px, 245px`\r\n }\r\n};\r\n\r\nexport interface ITeaserTile {\r\n imageSrc?: string;\r\n imageAltText?: string;\r\n tag?: string;\r\n title?: string; // Recommended max: 28 characters\r\n subtitle?: string; // Recommended max: 30 characters\r\n richText?: string; // Recommended max: 262 characters\r\n pageUrl?: string;\r\n pageTarget?: string;\r\n truncateTitle?: boolean;\r\n hideRichText?: boolean;\r\n tileType?: TileType;\r\n date?: string;\r\n}\r\n\r\nconst TeaserTile = ({\r\n imageSrc,\r\n imageAltText,\r\n tag,\r\n title,\r\n subtitle,\r\n richText,\r\n pageUrl,\r\n pageTarget,\r\n truncateTitle,\r\n hideRichText,\r\n date,\r\n ...props\r\n}: ITeaserTile) => {\r\n const tileType = props.tileType || TileType.COL__1;\r\n const baseClass = \"teaser-tile\";\r\n const rootClasses = classNames(baseClass, [`${baseClass}--tile-type-${tileType}`]);\r\n\r\n return (\r\n
\r\n {imageSrc && (\r\n \r\n
\r\n \r\n
\r\n
\r\n )}\r\n
\r\n
\r\n {tag && {tag}}\r\n\r\n {props.tileType !== TileType.LIST ? (\r\n

{date ?? <> }

\r\n ) : (\r\n date &&

{date}

\r\n )}\r\n\r\n {title && (\r\n \r\n {truncateTitle ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n\r\n {subtitle &&

{subtitle}

}\r\n\r\n {!hideRichText && richText && (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default TeaserTile;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport TitleLinkTop, { ITitleLinkTopProps } from \"../title-link-top/title-link-top\";\r\nimport TeaserTile, { ITeaserTile, TileType } from \"./teaser-tile/teaser-tile\";\r\nimport Button from \"../button/button\";\r\nimport { TeaserResponse } from \"~/store/reducers/teasers/teaser-actions\";\r\nimport * as teaserActions from \"~/store/reducers/teasers/teaser-actions\";\r\nimport teaserReducer, {\r\n TeaserParams,\r\n TeaserState,\r\n initialState as teaserState\r\n} from \"~/store/reducers/teasers/teaser-reducer\";\r\nimport { callServer, padRootUrl } from \"~/api/call-server\";\r\nimport { RequestType } from \"~/api/response-types/types\";\r\nimport ContentSection from \"../content-section/content-section\";\r\n\r\nexport enum TemplateType {\r\n T1 = \"template-1\",\r\n T2 = \"template-2\",\r\n T3 = \"template-3\",\r\n T4 = \"template-4\",\r\n T5 = \"template-5\",\r\n T6 = \"template-6\"\r\n}\r\n\r\nconst templateTypes = {\r\n [TemplateType.T1]: { repeats: true, pattern: [TileType.COL__1] },\r\n [TemplateType.T2]: { repeats: true, pattern: [TileType.COL__2] },\r\n [TemplateType.T3]: {\r\n repeats: true,\r\n pattern: [\r\n TileType.COL__2,\r\n TileType.COL__1,\r\n TileType.COL__1,\r\n TileType.COL__1,\r\n TileType.COL__1,\r\n TileType.COL__2\r\n ]\r\n },\r\n [TemplateType.T4]: {\r\n repeats: true,\r\n pattern: [\r\n TileType.COL__1,\r\n TileType.COL__1,\r\n TileType.COL__2,\r\n TileType.COL__2,\r\n TileType.COL__1,\r\n TileType.COL__1\r\n ]\r\n },\r\n [TemplateType.T5]: {\r\n repeats: false,\r\n pattern: [TileType.COL__2, TileType.LIST, TileType.LIST, TileType.LIST]\r\n },\r\n [TemplateType.T6]: { repeats: false, pattern: [TileType.COL__4] }\r\n};\r\n\r\ninterface TeaserGridPropsFromStore {\r\n teaserListFromStore?: ITeaserTile[];\r\n displayedTeasersOutOfTotalLabelFromStore?: string;\r\n pageFromStore?: number;\r\n teasersTotalCountFromStore?: number;\r\n showLoadMoreBtn?: boolean;\r\n filterTags?: string[];\r\n}\r\n\r\nexport interface ITeaserGridProps\r\n extends ITitleLinkTopProps,\r\n Omit,\r\n TeaserParams,\r\n TeaserGridPropsFromStore {\r\n className?: string;\r\n hasNoMarginTop?: boolean;\r\n hasNoMarginBottom?: boolean;\r\n title?: string;\r\n viewMoreLink?: string;\r\n templateType: TemplateType;\r\n teaserList?: ITeaserTile[];\r\n loadMoreWebApiUrl?: string;\r\n loadMoreBtnLabel?: string;\r\n anchorId?: string;\r\n}\r\n\r\nconst TeaserGrid = ({\r\n className,\r\n title,\r\n viewMoreLink,\r\n templateType,\r\n loadMoreWebApiUrl,\r\n loadMoreBtnLabel,\r\n loadMorePageSize,\r\n filterTags,\r\n ...props\r\n}: ITeaserGridProps) => {\r\n const baseClass = \"teaser-grid\";\r\n const componentClasses = classNames(baseClass, className, `${baseClass}--${templateType}`);\r\n\r\n const [state, dispatch] = React.useReducer(teaserReducer, teaserState);\r\n\r\n const {\r\n teaserList: teaserListFromStore,\r\n displayedTeasersOutOfTotalLabel: displayedTeasersOutOfTotalLabelFromStore,\r\n teaserParams: { page: pageFromStore },\r\n teasersTotalCount: teasersTotalCountFromStore,\r\n isLoadMorePending\r\n } = state;\r\n\r\n const teaserList = teaserListFromStore || props.teaserList;\r\n const displayedTeasersOutOfTotalLabel =\r\n displayedTeasersOutOfTotalLabelFromStore || props.displayedTeasersOutOfTotalLabel;\r\n const page = pageFromStore || props.page;\r\n const teasersTotalCount = teasersTotalCountFromStore || props.teasersTotalCount;\r\n const canLoadMore = teaserList && teasersTotalCount && teasersTotalCount > teaserList.length;\r\n const showLoadMoreBtn = !!(canLoadMore && loadMoreBtnLabel && props.showLoadMoreBtn);\r\n\r\n // Populate the store and set load-more params on mount\r\n React.useEffect(() => {\r\n const searchParams: TeaserParams = {\r\n page,\r\n loadMorePageSize,\r\n filterTags\r\n };\r\n\r\n dispatch(teaserActions.updateTeaserParams(searchParams));\r\n dispatch(teaserActions.populateTeasers({ teaserList: props.teaserList }));\r\n }, []);\r\n\r\n const onLoadMore = () => {\r\n if (!loadMoreWebApiUrl) {\r\n return;\r\n }\r\n\r\n const params = {\r\n ...state.teaserParams,\r\n apiUrl: loadMoreWebApiUrl,\r\n loadMorePageSize,\r\n // TODO: Couldn't this just be (page || 0) + 1? What happens if page is undefined?\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n page: page! + 1\r\n };\r\n\r\n dispatch(teaserActions.teaserRequest(params));\r\n\r\n callServer(padRootUrl(loadMoreWebApiUrl), RequestType.POST, params)\r\n .then((response: any) => {\r\n dispatch(teaserActions.teaserSuccess({ ...response.payload, page: params.page }));\r\n dispatch(teaserActions.updateTeaserParams(params));\r\n })\r\n .catch(() => {\r\n dispatch(teaserActions.teaserError());\r\n });\r\n };\r\n const TeaserItem = ({\r\n item,\r\n truncateTitle,\r\n tileType,\r\n hideRichText\r\n }: {\r\n item: ITeaserTile;\r\n truncateTitle?: boolean;\r\n tileType: TileType;\r\n hideRichText?: boolean;\r\n }) => (\r\n
\r\n \r\n
\r\n );\r\n\r\n const TeaserItemGroup = ({ items, tileType }: { items: ITeaserTile[]; tileType: TileType }) => (\r\n
\r\n {items.map((item, index) => (\r\n \r\n ))}\r\n
\r\n );\r\n\r\n const getTileType = (template: ITeaserGridProps[\"templateType\"], tileIndex: number) => {\r\n if (teaserList?.length === 1) {\r\n return TileType.COL__4;\r\n }\r\n const { pattern, repeats } = templateTypes[template];\r\n\r\n const tileType = repeats\r\n ? pattern[tileIndex % pattern.length]\r\n : pattern[tileIndex] || TileType.COL__1;\r\n return tileType;\r\n };\r\n\r\n return (\r\n \r\n \r\n {teaserList && (\r\n <>\r\n
\r\n {templateType !== \"template-5\"\r\n ? teaserList.map((item, index) => {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n })\r\n : teaserList\r\n .reduce((items: Array, item, index) => {\r\n // Only items 2, 3, and 4 should be wrapped\r\n const toBuffer = index === 1 || index === 2 || index === 3;\r\n\r\n let pushTarget = items; // Where to allocate the item\r\n let pushItem: ITeaserTile | ITeaserTile[] = item; // Item to be allocated\r\n\r\n if (toBuffer) {\r\n if (Array.isArray(items[items.length - 1])) {\r\n // We already have a buffer group to allocate to\r\n pushTarget = items[items.length - 1] as ITeaserTile[];\r\n } else {\r\n // We create a new buffer group\r\n pushItem = [item];\r\n }\r\n }\r\n\r\n pushTarget.push(pushItem);\r\n\r\n return items;\r\n }, [])\r\n .map((item, index) => {\r\n if (Array.isArray(item)) {\r\n return (\r\n \r\n );\r\n } else if (teaserList?.length === 1) {\r\n return (\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n );\r\n }\r\n })}\r\n
\r\n {displayedTeasersOutOfTotalLabel && (\r\n
{displayedTeasersOutOfTotalLabel}
\r\n )}\r\n {showLoadMoreBtn && (\r\n
\r\n \r\n {loadMoreBtnLabel}\r\n \r\n
\r\n )}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default TeaserGrid;\r\n","import * as React from \"react\";\r\nimport TeaserGrid, { ITeaserGridProps } from \"~/components/teaser-grid/teaser-grid\";\r\n\r\nexport interface ITeaserGridViewProps {\r\n contextModel: ITeaserGridProps;\r\n}\r\n\r\nclass TeaserGridView extends React.PureComponent {\r\n public render() {\r\n return ;\r\n }\r\n}\r\n\r\nexport default TeaserGridView;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport type TIconNames =\r\n | \"24_expand\"\r\n | \"24_play\"\r\n | \"24_star\"\r\n | \"24_trash\"\r\n | \"32_add-user\"\r\n | \"32_basket\"\r\n | \"32_checkmark-circle\"\r\n | \"32_checkmark\"\r\n | \"32_error\"\r\n | \"32_information\"\r\n | \"32_katalog\"\r\n | \"32_search\"\r\n | \"32_truck-in-motion\"\r\n | \"32_user\"\r\n | \"32_warning\"\r\n | \"icon_16_arrow-down\"\r\n | \"icon_16_arrow-left\"\r\n | \"icon_16_arrow-right-bold\"\r\n | \"icon_16_arrow-right\"\r\n | \"icon_16_arrow-up\"\r\n | \"icon_28_close\"\r\n | \"icon_32_thumbs-up\"\r\n | \"icon_80x41_quotation-mark-gyldendal-dk\"\r\n | \"icon_80x48_quotation-mark\"\r\n | \"icon_checkbox-black\"\r\n | \"icon_checkmark-black\"\r\n | \"icon_herringbone-narrow\"\r\n | \"icon_herringbone-wide\"\r\n | \"icon_placeholder-email\"\r\n | \"icon_placeholder-lock\"\r\n | \"icon_placeholder-phone-small\"\r\n | \"icon_placeholder-vip-white\"\r\n | \"icon_placeholder_basket\"\r\n | \"icon_placeholder_checkmark\"\r\n | \"icon_placeholder_eye-closed\"\r\n | \"icon_placeholder_eye\"\r\n | \"icon_placeholder_facebook\"\r\n | \"icon_placeholder_filtering\"\r\n | \"icon_placeholder_hamburger\"\r\n | \"icon_placeholder_instagram\"\r\n | \"icon_placeholder_phone\"\r\n | \"icon_placeholder_user\"\r\n | \"icon_read\"\r\n | \"icon_listen\";\r\n\r\nexport interface IIconProps {\r\n iconId: TIconNames;\r\n spriteUrl?: string;\r\n viewBox?: string;\r\n className?: string;\r\n onClick?: () => void;\r\n}\r\n\r\nconst Icon: React.FC = props => {\r\n const spriteUrl = props.spriteUrl || \"\";\r\n const viewBox = props.viewBox || \"0 0 32 32\";\r\n\r\n return (\r\n props.onClick && props.onClick()}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Icon;\r\n","import * as React from \"react\";\r\n\r\nexport interface AnchorProps {\r\n id?: string;\r\n}\r\n\r\nconst Anchor = ({ id }: AnchorProps) => {\r\n return
;\r\n};\r\n\r\nexport default Anchor;\r\n","import classNames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport Anchor from \"../anchor/anchor\";\r\n\r\nexport interface ContentSectionProps {\r\n className?: string;\r\n type?: \"default\" | \"full\";\r\n anchorId?: string;\r\n hasNoMarginTop?: boolean;\r\n hasNoMarginBottom?: boolean;\r\n}\r\n\r\nconst ContentSection: React.FC = ({\r\n className,\r\n type = \"default\",\r\n anchorId,\r\n hasNoMarginTop,\r\n hasNoMarginBottom,\r\n ...props\r\n}) => {\r\n const baseClass = \"content-section\";\r\n const componentClasses = classNames(baseClass, className, {\r\n [`${baseClass}--full`]: type === \"full\",\r\n \"anchor-wrapper\": !!anchorId,\r\n \"content-no-margin-top\": hasNoMarginTop,\r\n \"content-no-margin-bottom\": hasNoMarginBottom\r\n });\r\n return (\r\n
\r\n {anchorId && }\r\n {props.children}\r\n
\r\n );\r\n};\r\n\r\nexport default ContentSection;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport Icon from \"../icons/icon\";\r\n\r\nexport interface IArrowLinkProps {\r\n className?: string;\r\n link: string;\r\n}\r\n\r\nconst ArrowLink = ({ className, link }: IArrowLinkProps) => {\r\n const baseClass = \"arrow-link\";\r\n const componentClasses = classNames(baseClass, className);\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ArrowLink;\r\n","const hasExistingQueryParam = (url: string) => url.indexOf(\"?\") !== -1;\r\n\r\nexport const getQueryParamDelimiter = (url: string) => (hasExistingQueryParam(url) ? \"&\" : \"?\");\r\n\r\nexport const generateSrcSet = (srcSetSizes: number[], srcUrl: string) => {\r\n const generateSrcSetString = (srcSetSize: number) => {\r\n const parameterDelimiter = getQueryParamDelimiter(srcUrl);\r\n const srcSetSizeHighDensity = Math.round(srcSetSize * 1.5);\r\n\r\n return `\r\n ${srcUrl}${parameterDelimiter}w=${srcSetSize} ${srcSetSize}w,\r\n ${srcUrl}${parameterDelimiter}w=${srcSetSizeHighDensity} ${srcSetSizeHighDensity}w\r\n `;\r\n };\r\n\r\n return srcSetSizes.map(generateSrcSetString).join(\", \");\r\n};\r\n\r\nexport const generateColumnImageProps = (maxColumns: number, isFullWidth?: boolean) => {\r\n // The sizes are column-widths and are not considering padding\r\n const gridMaxWidthFactor = isFullWidth ? 1 : 0.75;\r\n const gridMaxWidth = 1366 * gridMaxWidthFactor;\r\n const defaultSize = gridMaxWidth / maxColumns;\r\n let sizes;\r\n\r\n switch (maxColumns) {\r\n case 5:\r\n sizes = `(max-width: 479px) 100vw, \r\n (max-width: 639px) 75vw,\r\n (max-width: 767px) 50vw,\r\n (max-width: 1023px) ${100 / 3}vw,\r\n (max-width: 1099px) ${(100 / 3) * gridMaxWidthFactor}vw,\r\n (max-width: 1279px) ${(100 / 4) * gridMaxWidthFactor}vw,\r\n ${defaultSize}px`;\r\n case 4:\r\n sizes = `(max-width: 479px) 100vw, \r\n (max-width: 639px) 75vw,\r\n (max-width: 767px) 50vw,\r\n (max-width: 1023px) ${100 / 3}vw,\r\n (max-width: 1099px) ${(100 / 3) * gridMaxWidthFactor}vw,\r\n (max-width: 1279px) ${(100 / 4) * gridMaxWidthFactor}vw,\r\n ${defaultSize}px`;\r\n case 3:\r\n sizes = `(max-width: 479px) 100vw,\r\n (max-width: 639px) 75vw,\r\n (max-width: 767px) 50vw,\r\n (max-width: 1023px) ${100 / 3}vw,\r\n (max-width: 1279px) ${(100 / 3) * gridMaxWidthFactor}vw,\r\n ${defaultSize}px`;\r\n case 2:\r\n sizes = `(max-width: 479px) 100vw,\r\n (max-width: 639px) 75vw,\r\n (max-width: 1023px) ${100 / 2}vw,\r\n (max-width: 1279px) ${(100 / 2) * gridMaxWidthFactor}vw, \r\n ${defaultSize}px`;\r\n case 1:\r\n sizes = `(max-width: 479px) 100vw,\r\n (max-width: 1023px) ${100 * 0.75}vw,\r\n (max-width: 1279px) ${100 * 0.75 * gridMaxWidthFactor}vw,\r\n ${defaultSize * 0.75}px`;\r\n }\r\n\r\n return {\r\n // The sizes are column-widths and are not considering padding\r\n defaultSize: defaultSize,\r\n srcSetSizes: [205, 257, 274, 342, 456, 513, 683, 769, 1025],\r\n sizes: sizes\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { generateSrcSet, getQueryParamDelimiter } from \"~/utils/image-utils\";\r\n\r\nexport interface IResponsiveImageProps extends Omit, \"src\"> {\r\n className?: string;\r\n srcUrl: string;\r\n defaultSize: number;\r\n srcSetSizes?: number[];\r\n sizes?: string;\r\n ref?: React.Ref;\r\n}\r\n\r\nconst ResponsiveImage: React.FC = React.forwardRef(\r\n ({ srcUrl, defaultSize, srcSetSizes, ...props }, ref: React.Ref) => {\r\n const src = `${srcUrl}${getQueryParamDelimiter(srcUrl)}w=${defaultSize}`;\r\n const srcSet = srcSetSizes ? generateSrcSet(srcSetSizes, srcUrl) : \"\";\r\n\r\n return ;\r\n }\r\n);\r\n\r\nexport default ResponsiveImage;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { ProductStatus } from \"~/types/product\";\r\n\r\nexport interface ITagProps {\r\n type?: ProductStatus;\r\n children: React.ReactNode;\r\n className?: string;\r\n shape?: \"pill\" | \"square\";\r\n}\r\n\r\nexport const tagTypeClassMap: { [key in ProductStatus]: string } = {\r\n NEWS: \"news\",\r\n SPOT: \"spot\",\r\n BESTSELLER: \"bestseller\",\r\n BOOK_OF_THE_MONTH: \"botm\",\r\n UPCOMING: \"upcoming\"\r\n};\r\n\r\nconst Tag: React.FC = props => {\r\n const classModifier = props.type && tagTypeClassMap[props.type];\r\n const rootClasses = classNames(\"tag\", props.className, `tag--shape-${props.shape || \"pill\"}`, {\r\n [`tag--${classModifier}`]: props.type\r\n });\r\n\r\n return (\r\n
\r\n {props.children}\r\n
\r\n );\r\n};\r\n\r\nexport default Tag;\r\n","import classNames from \"classnames\";\r\nimport * as React from \"react\";\r\n\r\ninterface ISpinnerProps {\r\n size?: \"small\" | \"default\";\r\n className?: string;\r\n}\r\nconst Spinner = ({ size = \"default\", className }: ISpinnerProps) => {\r\n const baseClass = \"spinner\";\r\n const componentClasses = classNames(baseClass, className, {\r\n [`${baseClass}--${size}`]: size !== \"default\"\r\n });\r\n\r\n return ;\r\n};\r\n\r\nexport default Spinner;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport Icon, { TIconNames } from \"../icons/icon\";\r\nimport Spinner from \"~/components/spinner/spinner\";\r\n\r\ntype IOnClickFunction = (e: React.MouseEvent) => void;\r\n\r\nexport interface IButtonProps extends React.ButtonHTMLAttributes {\r\n onClick?: IOnClickFunction;\r\n disabled?: boolean;\r\n className?: string;\r\n loading?: boolean;\r\n iconId?: TIconNames;\r\n isLarge?: boolean;\r\n isInverted?: boolean;\r\n isSecondary?: boolean;\r\n}\r\n\r\nconst Button: React.SFC = props => {\r\n const baseClass = \"button\";\r\n const componentClasses = classNames(baseClass, props.className, {\r\n [`${baseClass}--large`]: props.isLarge,\r\n [`${baseClass}--inverted`]: props.isInverted,\r\n [`${baseClass}--secondary`]: props.isSecondary,\r\n [`${baseClass}--loading`]: props.loading\r\n });\r\n\r\n return (\r\n {\r\n if (props.onClick) {\r\n props.onClick(e);\r\n }\r\n }}\r\n >\r\n {props.iconId && }\r\n {props.loading && }\r\n {props.children}\r\n \r\n );\r\n};\r\nexport default Button;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nimport ArrowLink from \"../arrow-link/arrow-link\";\r\n\r\nexport interface ITitleLinkTopProps {\r\n className?: string;\r\n title?: string;\r\n viewMoreLink?: string;\r\n}\r\n\r\nconst TitleLinkTop = ({ className, title, viewMoreLink }: ITitleLinkTopProps) => {\r\n const baseClass = \"title-link-top\";\r\n const componentClasses = classNames(baseClass, className);\r\n\r\n const headerTitle = title && (\r\n

\r\n );\r\n const headerLink = viewMoreLink && ;\r\n\r\n return (\r\n
\r\n {(headerTitle || headerLink) && (\r\n
\r\n {headerTitle}\r\n {headerLink}\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default TitleLinkTop;\r\n"],"sourceRoot":""}