{"version":3,"file":"logotypes.js","mappings":"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","sources":["webpack://empori-base/./src/controls/logotypes/logotypeImg.tsx","webpack://empori-base/./src/controls/logotypes/logotypesGrid.tsx","webpack://empori-base/./src/controls/logotypes/logotypesSlideshow.tsx","webpack://empori-base/./src/controls/logotypes/logotypes.tsx","webpack://empori-base/./src/controls/logotypes/logotypesNavigation.tsx","webpack://empori-base/./src/empracoTypes.ts","webpack://empori-base/./src/util/util.ts"],"sourcesContent":["import { FilterColor, ImageWithInfo } from '../../empracoTypes';\r\nimport { FileExtensions } from '../../util/util';\r\nimport { CSSProperties } from 'react';\r\n\r\ninterface LogotypeImageProps extends ImageWithInfo {\r\n externalLink: boolean;\r\n maxHeight?: number;\r\n filterColor: FilterColor;\r\n parentStyling?: CSSProperties;\r\n}\r\n\r\nexport function Logotype(props: LogotypeImageProps) {\r\n if (!props.imgUrl) {\r\n return null;\r\n }\r\n\r\n const url = props.imgUrl.includes(FileExtensions.SVG)\r\n ? props.imgUrl\r\n : `${props.imgUrl}?width=300&format=webp`;\r\n\r\n const setTarget = () => {\r\n if (props.externalLink && (props.pageLink.startsWith('http') || props.pageLink.startsWith('www'))) {\r\n return '_blank';\r\n }\r\n\r\n return '_self';\r\n };\r\n\r\n const setInlineStyling = () => {\r\n const css = {filter: 'none', maxHeight: 'unset'};\r\n\r\n if (props.maxHeight) {\r\n css.maxHeight = `${props.maxHeight}px`;\r\n }\r\n\r\n if (!url || !url.includes(FileExtensions.SVG)) {\r\n return css;\r\n }\r\n\r\n if (props.filterColor === FilterColor.black) {\r\n css.filter = 'brightness(0)';\r\n }\r\n\r\n if (props.filterColor === FilterColor.gray) {\r\n css.filter = 'grayscale(1)';\r\n }\r\n\r\n if (props.filterColor === FilterColor.white) {\r\n css.filter = 'brightness(0) invert(1)';\r\n }\r\n\r\n return css;\r\n };\r\n\r\n if (props.pageLink) {\r\n return(\r\n
\r\n \r\n {props.imgAlt}\r\n \r\n
\r\n );\r\n }\r\n\r\n return(\r\n
\r\n {props.imgAlt}\r\n
\r\n );\r\n}","import * as React from 'react';\r\nimport { LogotypesProps, slidesPerView } from './logotypes';\r\nimport { Logotype } from './logotypeImg';\r\nimport { LogotypesDisplay } from '../../empracoTypes';\r\nimport { FaIcon } from '../../generic/icon';\r\n\r\nexport function LogotypesGrid(props: LogotypesProps) {\r\n const {\r\n mediaObjects,\r\n display,\r\n filterColor,\r\n externalLink,\r\n logotypesPerView,\r\n maxHeight,\r\n spaceBetween,\r\n buttonLabel\r\n } = props.data;\r\n\r\n const [cap, setCap] = React.useState(null);\r\n\r\n const spv = slidesPerView(logotypesPerView);\r\n const gap = spaceBetween ?? 20;\r\n const flex = 100 / spv;\r\n\r\n React.useEffect(() => {\r\n if (display === LogotypesDisplay.partiallyHiddenGrid) {\r\n setCap(spv);\r\n return;\r\n }\r\n }, [spv]);\r\n\r\n // Applies a \"margin\" between the items on each row to make them fit the entire container.\r\n const offset = (gap * spv - gap) / spv;\r\n\r\n return(\r\n
\r\n {mediaObjects.slice(0, cap ? cap : mediaObjects.length).map((item, index) =>\r\n )}\r\n {display === LogotypesDisplay.partiallyHiddenGrid && !!cap &&\r\n setCap(null)}>\r\n \r\n {buttonLabel ?? 'See all'}\r\n \r\n \r\n
}\r\n \r\n );\r\n}","import { className } from '@empori/util';\r\nimport { Swiper, SwiperSlide } from 'swiper/react';\r\nimport { Direction } from '../../util/util';\r\nimport { Autoplay, SwiperOptions } from 'swiper';\r\nimport { LogotypesProps, slidesPerView } from './logotypes';\r\nimport { NavigationButton } from './logotypesNavigation';\r\nimport { Logotype } from './logotypeImg';\r\n\r\nexport function LogotypesSlideshow(props: LogotypesProps) {\r\n\r\n const {\r\n mediaObjects,\r\n autoplay,\r\n filterColor,\r\n externalLink,\r\n hideNavigation,\r\n logotypesPerView,\r\n maxHeight,\r\n spaceBetween\r\n } = props.data;\r\n\r\n const spv = slidesPerView(logotypesPerView);\r\n\r\n const settings: SwiperOptions = {\r\n modules: autoplay ? [ Autoplay ] : [],\r\n autoplay: autoplay ? { delay: 3000 } : false,\r\n loop: true,\r\n autoHeight: true,\r\n lazy: true,\r\n loopedSlidesLimit: false,\r\n breakpoints: {\r\n 800: { // 800px or more\r\n slidesPerView: spv,\r\n spaceBetween: spaceBetween\r\n },\r\n 600: {\r\n slidesPerView: spv > 4 ? 4 : spv,\r\n spaceBetween: 20\r\n },\r\n 440: {\r\n slidesPerView: spv > 3 ? 3 : spv\r\n },\r\n 300: {\r\n slidesPerView: spv > 2 ? 2 : spv\r\n },\r\n 0: {\r\n slidesPerView: 1\r\n }\r\n }\r\n };\r\n\r\n return(\r\n \r\n {mediaObjects.map((item, index) =>\r\n \r\n \r\n )}\r\n {!hideNavigation &&\r\n
\r\n \r\n \r\n
}\r\n
\r\n );\r\n}","import { LogotypesJson, LogotypesDisplay } from '../../empracoTypes';\r\nimport { LogotypesGrid } from './logotypesGrid';\r\nimport { LogotypesSlideshow } from './logotypesSlideshow';\r\n\r\nexport interface LogotypesProps {\r\n data: LogotypesJson;\r\n}\r\n\r\nexport function slidesPerView(setting: number | undefined) {\r\n if (!setting && setting === 0) {\r\n return 1;\r\n }\r\n\r\n if (!setting) {\r\n return 5;\r\n }\r\n\r\n if (setting > 12) {\r\n return 12;\r\n }\r\n\r\n if (setting < 1) {\r\n return 1;\r\n }\r\n\r\n return setting;\r\n};\r\n\r\nexport default function Logotypes(props: LogotypesProps) {\r\n const { mediaObjects, display } = props.data;\r\n\r\n if (!mediaObjects) {\r\n return null;\r\n }\r\n\r\n if (display === LogotypesDisplay.grid || display === LogotypesDisplay.partiallyHiddenGrid) {\r\n return ;\r\n }\r\n\r\n return ;\r\n}","import { useSwiper } from 'swiper/react';\r\nimport { Direction } from '../../util/util';\r\nimport { className } from '@empori/util';\r\nimport { FaIcon } from '../../generic/icon';\r\n\r\nexport interface NavigationButtonProps {\r\n direction: Direction;\r\n absolute?: boolean;\r\n}\r\n\r\nexport function NavigationButton({ direction, absolute }: NavigationButtonProps) {\r\n const swiper = useSwiper();\r\n const leftOrRight = direction === Direction.next ? 'right' : 'left';\r\n\r\n const handleChange = () => {\r\n if (direction === Direction.next) {\r\n swiper.slideNext();\r\n return;\r\n }\r\n\r\n swiper.slidePrev();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}","/*\r\n * Generated from Empori.Typings.TypescriptTyping\r\n */\r\n\r\n/**\r\n * Map properties suited for usage within JavaScript.\r\n */\r\nexport interface GoogleMapsJson {\r\n\r\n /**\r\n * The map height in pixels.\r\n */\r\n height: number;\r\n\r\n /**\r\n * The API key for Google Maps, specified in the Umbraco back-office.\r\n */\r\n apiKey: string;\r\n\r\n /**\r\n * Iframe HTML to replace the JavaScript integration.\r\n */\r\n iframeHtml: string;\r\n\r\n /**\r\n * Initial map zoom.\r\n */\r\n initialZoom: number;\r\n\r\n /**\r\n * Initial map latitude.\r\n */\r\n initialLat: number;\r\n\r\n /**\r\n * Initial map longitude.\r\n */\r\n initialLng: number;\r\n\r\n /**\r\n * A list of map markers.\r\n */\r\n markerCollection: GoogleMapsMarkers;\r\n}\r\n\r\n/**\r\n * Used for easier JSON conversion.\r\n */\r\nexport interface GoogleMapsMarkers {\r\n\r\n /**\r\n * A list of map markers.\r\n */\r\n markers: Marker[];\r\n}\r\n\r\n/**\r\n * A single map marker item.\r\n */\r\nexport interface Marker {\r\n\r\n /**\r\n * The marker's address.\r\n */\r\n address: string;\r\n\r\n /**\r\n * The marker's latitude on the map.\r\n */\r\n lat: number;\r\n\r\n /**\r\n * The marker's longitude on the map.\r\n */\r\n lng: number;\r\n\r\n /**\r\n * The marker's description. Shows upon hoovering on the marker.\r\n */\r\n description: string;\r\n}\r\n\r\n/**\r\n * Used for ECMS cookie window content.\r\n */\r\nexport interface CookiesViewModel {\r\n\r\n /**\r\n * The main header of the cookie window content.\r\n */\r\n headerText: string;\r\n\r\n /**\r\n * The information text.\r\n */\r\n text: string;\r\n\r\n /**\r\n * The displayed label of the accept button.\r\n */\r\n acceptButtonText: string;\r\n\r\n /**\r\n * The displayed label of the read more button.\r\n */\r\n readMoreButtonText: string;\r\n\r\n /**\r\n * The link for the read more button destination.\r\n */\r\n readMoreButtonLink: string;\r\n}\r\n\r\n/**\r\n * Hidden text properties suited for usage within JavaScript.\r\n */\r\nexport interface HiddenTextJson {\r\n\r\n /**\r\n * The cap height of the text in pixels.\r\n */\r\n height: number;\r\n\r\n /**\r\n * Button label when the text is capped.\r\n */\r\n showText: string;\r\n\r\n /**\r\n * Button label when the text is visible.\r\n */\r\n hideText: string;\r\n}\r\n\r\n/**\r\n * The model for the entire buttons object. Used now for easier JSON conversion.\r\n */\r\nexport interface ButtonsModel {\r\n\r\n /**\r\n * The actual buttons.\r\n */\r\n buttons: ButtonModel[];\r\n}\r\n\r\n/**\r\n * Standard button properties.\r\n */\r\nexport interface ButtonModel {\r\n\r\n /**\r\n * The button label.\r\n */\r\n text: string;\r\n\r\n /**\r\n * The link url / href value.\r\n */\r\n url: string;\r\n\r\n /**\r\n * Reference to the FontAwesome icon library.\r\n */\r\n iconHtml: string;\r\n\r\n /**\r\n * If the button's @see Empori.Razor.Controls.ButtonModel.Url should open in a new browser window.\r\n */\r\n newWindow: boolean;\r\n\r\n /**\r\n * Removes the CSS background colors and padding and makes the button look more like plain text.\r\n */\r\n displayAsText: boolean;\r\n\r\n /**\r\n * Uses the alternative color as background color. @see Empori.Core.Configuration.Options.DesignOptions.SecondaryColor\r\n */\r\n inverted: boolean;\r\n\r\n /**\r\n * Links that contains a hash (#) or query (?).\r\n */\r\n anchor: string;\r\n}\r\n\r\n/**\r\n * A single weekday item.\r\n */\r\nexport interface OpenHoursDayItem {\r\n\r\n /**\r\n * What label to show for the day. Usually its the actual day (e.g. Monday).\r\n */\r\n dayLabel: string;\r\n\r\n /**\r\n * When the facility opens this day. Can have any string value.\r\n * TODO: Try to convert this to a date and use JavaScript for some more useful stuff.\r\n */\r\n openHour: string;\r\n\r\n /**\r\n * When the facility closes this day. Can have any string value.\r\n * TODO: Try to convert this to a date and use JavaScript for some more useful stuff.\r\n */\r\n closeHour: string;\r\n}\r\n\r\n/**\r\n * The model for the list of links.\r\n */\r\nexport interface SocialLinksModel {\r\n\r\n /**\r\n * The list.\r\n */\r\n links: SocialLink[];\r\n}\r\n\r\n/**\r\n * The social link item.\r\n */\r\nexport interface SocialLink {\r\n\r\n /**\r\n * A pre-defined icon reference.\r\n */\r\n linkIcon: LinkIcon;\r\n\r\n /**\r\n * FontAwesome icon HTML.\r\n */\r\n icon: string;\r\n\r\n /**\r\n * The link label.\r\n */\r\n linkLabel: string;\r\n\r\n /**\r\n * The link source specified by the user.\r\n */\r\n linkUrl: string;\r\n\r\n /**\r\n * The external link to the social media page or platform, forced into https protocol.\r\n */\r\n url: string;\r\n}\r\n\r\n/**\r\n * A selection of common social media platforms.\r\n */\r\nexport enum LinkIcon {\r\n\r\n /**\r\n * Facebook.\r\n */\r\n facebook = 0,\r\n\r\n /**\r\n * Twitter.\r\n */\r\n twitter = 1,\r\n\r\n /**\r\n * Instagram.\r\n */\r\n instagram = 2,\r\n\r\n /**\r\n * LinkedIn.\r\n */\r\n linkedIn = 3,\r\n\r\n /**\r\n * YouTube.\r\n */\r\n youtube = 4,\r\n\r\n /**\r\n * Pinterest.\r\n */\r\n pinterest = 5,\r\n\r\n /**\r\n * Default.\r\n */\r\n default = 99\r\n}\r\n\r\n/**\r\n * The model for the entire FAQ-items object. Used now for easier JSON conversion.\r\n */\r\nexport interface FaqModel {\r\n\r\n /**\r\n * The FAQ items list.\r\n */\r\n faqItems: FaqItem[];\r\n}\r\n\r\n/**\r\n * A single FAQ item.\r\n */\r\nexport interface FaqItem {\r\n\r\n /**\r\n * The question that shows in the block header.\r\n */\r\n question: string;\r\n\r\n /**\r\n * The answer that can be toggled when the @see Empori.Razor.Controls.FaqItem.Question is clicked.\r\n */\r\n answer: string;\r\n\r\n /**\r\n * The icon to show next to the @see Empori.Razor.Controls.FaqItem.Question.\r\n */\r\n iconHtml: string;\r\n\r\n /**\r\n * If the icon should rotate when the answer is toggled.\r\n */\r\n enableIconRotate: boolean;\r\n}\r\n\r\n/**\r\n * A general input item primarily used for @see Empori.Core.Data.Entities.Form.\r\n */\r\nexport interface InputItem {\r\n\r\n /**\r\n * This identification is used for frontend drag and drop only.\r\n */\r\n id: number;\r\n\r\n /**\r\n * The unique name that is associated with the value.\r\n */\r\n uniqueName: string;\r\n\r\n /**\r\n * Name is used for frontend reference only.\r\n */\r\n name: string;\r\n\r\n /**\r\n * Single value pre-defined by admin or assigned by the end-user.\r\n */\r\n value: string;\r\n\r\n /**\r\n * Multiple values pre-defined by admin or assigned by the end-user.\r\n */\r\n values: string[];\r\n\r\n /**\r\n * A shorter descriptive text about the input.\r\n */\r\n label: string;\r\n\r\n /**\r\n * Type of HTML input.\r\n */\r\n type: EmporiInputType;\r\n\r\n /**\r\n * A descriptive text within the input.\r\n */\r\n placeholder: string;\r\n\r\n /**\r\n * A descriptive text associated to the input.\r\n */\r\n description: string;\r\n\r\n /**\r\n * If the input should be required for form submission.\r\n */\r\n required: boolean;\r\n\r\n /**\r\n * Validation member translates to \"pattern\" HTML attribute and only works with the following input types: text, date, search, url, tel, email, and password.\r\n */\r\n validation: string;\r\n\r\n /**\r\n * The global title attribute helps describe the pattern to the end user.\r\n */\r\n title: string;\r\n\r\n /**\r\n * Alternatives member is only relevant for select, radio and checkbox input types.\r\n */\r\n alternatives: InputAlternative[];\r\n\r\n /**\r\n * Only relevant for input-type file to specify what filetypes are allowed\r\n */\r\n allowedFiles: AllowedFileType[];\r\n\r\n /**\r\n * If this member is true, form recipient specified in global and individual settings are ignored.\r\n * The mailto recipient gets taken from the selected \"Alternatives\" > \"MailTo\" value.\r\n * Only one input in each form can have this member set as true.\r\n */\r\n controlsRecipients: boolean;\r\n\r\n /**\r\n * FontAwesome string reference to an icon in their library. Primarily used for back-office frontend.\r\n */\r\n icon: string;\r\n\r\n /**\r\n * How much space this input should take in the horizontal context of the parent element.\r\n */\r\n width: WidthLayout;\r\n\r\n /**\r\n * If this member is true, the associated @see Empori.Core.Controllers.Models.EmporiInputType.Email input will send a confirmation e-mail to the user.\r\n */\r\n sendConfirmationEmail: boolean;\r\n\r\n /**\r\n * If this is true the first option will set as default empty option\r\n */\r\n isDefaultEmptyOptionSelected: boolean;\r\n}\r\n\r\n/**\r\n * Various HTML input types.\r\n */\r\nexport enum EmporiInputType {\r\n\r\n /**\r\n * \r\n */\r\n text = 0,\r\n\r\n /**\r\n * \r\n */\r\n textArea = 1,\r\n\r\n /**\r\n * \r\n */\r\n email = 2,\r\n\r\n /**\r\n * \r\n */\r\n date = 3,\r\n\r\n /**\r\n * \r\n */\r\n select = 4,\r\n\r\n /**\r\n * \r\n */\r\n number = 5,\r\n\r\n /**\r\n * \r\n */\r\n checkbox = 6,\r\n\r\n /**\r\n * \r\n */\r\n radiobutton = 7,\r\n\r\n /**\r\n * \r\n */\r\n submit = 8,\r\n\r\n /**\r\n * \r\n */\r\n file = 9,\r\n\r\n /**\r\n * Custom HTML within the
element.\r\n */\r\n rte = 10,\r\n\r\n /**\r\n * \r\n */\r\n time = 11\r\n}\r\n\r\n/**\r\n * Multiple input alternatives that holds a @see Empori.Core.Controllers.Models.InputAlternative.Name and a @see Empori.Core.Controllers.Models.InputAlternative.MailTo address if @see Empori.Core.Controllers.Models.InputItem.ControlsRecipients is active for this input.\r\n */\r\nexport interface InputAlternative {\r\n\r\n /**\r\n * The display name of the alternative that can be selected or viewed.\r\n */\r\n name: string;\r\n\r\n /**\r\n * If the input @see Empori.Core.Controllers.Models.InputItem.ControlsRecipients is used for an input, this value can hold an e-mail address associated to the alternative @see Empori.Core.Controllers.Models.InputAlternative.Name.\r\n */\r\n mailTo: string;\r\n}\r\n\r\nexport interface AllowedFileType {\r\n type: string;\r\n}\r\n\r\n/**\r\n * A design reference that can be used for width rules.\r\n */\r\nexport enum WidthLayout {\r\n\r\n /**\r\n * Most commonly used for setting a 50 percentage width to something.\r\n */\r\n half = 0,\r\n\r\n /**\r\n * Most commonly used for setting a 100 percentage width to something.\r\n */\r\n full = 1\r\n}\r\n\r\n/**\r\n * An image gallery model suited for usage within JavaScript.\r\n */\r\nexport interface ImageGalleryModel {\r\n\r\n /**\r\n * Properties used for the frontend editor.\r\n */\r\n imageGalleryEditorModel: ImageGalleryEditorModel;\r\n\r\n /**\r\n * The image gallery's delay before showing the next slide if @see Empori.Razor.Controls.ImageGalleryModel.Autoplay is active.\r\n */\r\n delay: number;\r\n\r\n /**\r\n * The slides height. If no value is chosen the height automatically fits the content.\r\n */\r\n staticHeight: number;\r\n\r\n /**\r\n * Whether to autoplay the gallery or not.\r\n */\r\n autoplay: boolean;\r\n\r\n /**\r\n * JavaScript id reference.\r\n */\r\n macroId: string;\r\n\r\n /**\r\n * The slides margin. If no value is chosen the margin is automatically set to 0.\r\n */\r\n spaceBetween?: number;\r\n\r\n /**\r\n * The amount of slides displayed. If no value is chosen only one slide is shown at a time.\r\n */\r\n slidesPerView?: number;\r\n\r\n /**\r\n * A setting for enabling fullscreen mode for the entire gallery.\r\n */\r\n fullscreenEnabled: boolean;\r\n}\r\n\r\n/**\r\n * The image gallery model for the frontend editor.\r\n */\r\nexport interface ImageGalleryEditorModel {\r\n\r\n /**\r\n * A list of slides.\r\n */\r\n slides: Slide[];\r\n\r\n /**\r\n * An extra (optional field) to show beneath the slides.\r\n */\r\n extraInfo: GalleryExtraInfoModel;\r\n}\r\n\r\n/**\r\n * A slide item.\r\n */\r\nexport interface Slide {\r\n\r\n /**\r\n * The image source path.\r\n */\r\n image: string;\r\n\r\n /**\r\n * A fallback image source path to empty videos.\r\n */\r\n poster: string;\r\n\r\n /**\r\n * The main title above the @see Empori.Razor.Controls.Slide.Image.\r\n */\r\n titleText: string;\r\n\r\n /**\r\n * The subtitle beneath the @see Empori.Razor.Controls.Slide.TitleText.\r\n */\r\n subtitleText: string;\r\n\r\n /**\r\n * If set to true, it adds an overlay element between the @see Empori.Razor.Controls.Slide.Image and the text elements (@see Empori.Razor.Controls.Slide.TitleText and @see Empori.Razor.Controls.Slide.SubtitleText).\r\n */\r\n isImageOverlay: boolean;\r\n\r\n /**\r\n * The individual slide's buttons.\r\n */\r\n buttonsModel: ButtonsModel;\r\n\r\n /**\r\n * The alignment of the content.\r\n */\r\n contentAlignment: ContentAlignment;\r\n verticalAlignment: VerticalAlignment;\r\n}\r\n\r\n/**\r\n * Various alignment alternatives.\r\n */\r\nexport enum ContentAlignment {\r\n\r\n /**\r\n * Align to the left.\r\n */\r\n left = 0,\r\n\r\n /**\r\n * Align to the horizontal center.\r\n */\r\n center = 1,\r\n\r\n /**\r\n * Align to the right.\r\n */\r\n right = 2\r\n}\r\n\r\nexport enum VerticalAlignment {\r\n top = 0,\r\n center = 1,\r\n bottom = 2\r\n}\r\n\r\n/**\r\n * The model for the slide's extra content suited for usage within JavaScript.\r\n */\r\nexport interface GalleryExtraInfoModel {\r\n\r\n /**\r\n * Whether to show or hide the extra info.\r\n */\r\n isHideExtraInfo: boolean;\r\n\r\n /**\r\n * The extra info window's columns.\r\n */\r\n columns: GalleryExtraInfoColumn[];\r\n}\r\n\r\n/**\r\n * A column item that is used within the @see Empori.Razor.Controls.GalleryExtraInfoModel.\r\n */\r\nexport interface GalleryExtraInfoColumn {\r\n\r\n /**\r\n * Image source path.\r\n */\r\n image: string;\r\n\r\n /**\r\n * HTML content.\r\n */\r\n content: string;\r\n\r\n /**\r\n * HTML title.\r\n */\r\n title: string;\r\n}\r\n\r\n/**\r\n * The counter model for JavaScript usage.\r\n */\r\nexport interface CounterJson {\r\n\r\n /**\r\n * DOM reference.\r\n */\r\n id: string;\r\n\r\n /**\r\n * Count from this value.\r\n */\r\n countFrom: number;\r\n\r\n /**\r\n * Count to this value.\r\n */\r\n countTo: number;\r\n\r\n /**\r\n * How long the counting should take in milliseconds.\r\n */\r\n time: number;\r\n\r\n /**\r\n * A frontend check whether the counting has started or not.\r\n */\r\n started: boolean;\r\n}\r\n\r\n/**\r\n * Properties to be used in JavaScript.\r\n */\r\nexport interface FormDetails {\r\n\r\n /**\r\n * The id of the form.\r\n */\r\n formId: string;\r\n\r\n /**\r\n * The form submit button id.\r\n */\r\n formSubmitButtonId: string;\r\n\r\n /**\r\n * The actual form with its child properties.\r\n */\r\n form: Form;\r\n\r\n /**\r\n * File size cap in MiB (MB).\r\n */\r\n globalMaxUploadFileSize?: number;\r\n\r\n /**\r\n * If the visitor should remain on the same page or not upon form submission.\r\n */\r\n stayOnPage: boolean;\r\n\r\n /**\r\n * DOM reference to the element containing the message HTML.\r\n */\r\n messageKey: string;\r\n\r\n /**\r\n * DOM reference to the element containing the post status messages for \"posting form\" and \"form posted\".\r\n */\r\n statusKey: string;\r\n\r\n /**\r\n * The URL to post data to.\r\n */\r\n fetchUrl: string;\r\n\r\n /**\r\n * The URL to fetch empori captcha\r\n */\r\n fetchUrlEmporiCaptcha: string;\r\n\r\n /**\r\n * The URL to post data to.\r\n */\r\n spamProtectionDetails: SpamProtectionDetails;\r\n}\r\n\r\n/**\r\n * Turnstile response\r\n */\r\nexport interface SpamProtectionDetails {\r\n\r\n /**\r\n * Check whether tunstile spam protection is on from the settings\r\n */\r\n isTurnstileEnabled: boolean;\r\n\r\n /**\r\n * Check whether empori spam protection is enabled from the settings\r\n */\r\n isEmporiCaptchaEnabled: boolean;\r\n\r\n /**\r\n * Empori captcha generating url\r\n */\r\n fetchUrlEmporiCaptcha: string;\r\n\r\n /**\r\n * Empori captcha image guid id\r\n */\r\n captchaImgId: string;\r\n}\r\n\r\n/**\r\n * A standard image model additional information.\r\n */\r\nexport interface ImageWithInfo {\r\n\r\n /**\r\n * Image media path.\r\n */\r\n imgUrl: string;\r\n\r\n /**\r\n * A non-cropped or otherwise manipulated image url from Umbraco.\r\n */\r\n imgUrlOriginal: string;\r\n\r\n /**\r\n * Image alt HTML attribute.\r\n */\r\n imgAlt: string;\r\n\r\n /**\r\n * A title to render alongside the image. Not the same as @see Empori.Razor.Models.ImageWithInfo.ImgAlt.\r\n */\r\n title: string;\r\n\r\n /**\r\n * URL to the content node/page.\r\n */\r\n pageLink: string;\r\n}\r\n\r\nexport interface SearchAliasItemModel {\r\n searchAliasItems: SearchAliasItem[];\r\n}\r\n\r\nexport interface SearchAliasItem {\r\n alias: string;\r\n fieldDescription: string;\r\n isRemovedFromSearch: boolean;\r\n boostValue: string;\r\n culture: string;\r\n}\r\n\r\nexport interface UmbracoSearchModel {\r\n culture: string;\r\n selectedNodesIdList: number[];\r\n displayTitleAlias: string;\r\n displayDescriptionAlias: string;\r\n pageSize?: number;\r\n searchAliasItems: SearchAliasItem[];\r\n placeHolderText: string;\r\n noResultFoundText: string;\r\n}\r\n\r\nexport interface BrandModelData {\r\n title: string;\r\n year: string;\r\n link: string;\r\n lang: string;\r\n}\r\n\r\nexport interface BrandModelItem {\r\n name: string;\r\n year: string;\r\n description: string;\r\n pricePrefix: string;\r\n priceFrom?: number;\r\n mainImage: string;\r\n created: string;\r\n link: string;\r\n brand: string;\r\n family: string;\r\n category: string;\r\n imageCrop: string;\r\n}\r\n\r\nexport interface BrandPagesConfig {\r\n lang: string;\r\n translations: BrandPagesTranslations;\r\n}\r\n\r\nexport interface BrandPagesTranslations {\r\n viewingModelsCount: string;\r\n filter: string;\r\n sort: string;\r\n showingAllBrands: string;\r\n showingAllFamilies: string;\r\n showingAllCategories: string;\r\n closeAndShowModels: string;\r\n alphabetAsc: string;\r\n alphabetDesc: string;\r\n priceAsc: string;\r\n priceDesc: string;\r\n createdAsc: string;\r\n createdDesc: string;\r\n noModelsFound: string;\r\n}\r\n\r\nexport enum RowAnimationStyle {\r\n none = 0,\r\n fadeUp = 1\r\n}\r\n\r\nexport interface LogotypesJson {\r\n mediaObjects: ImageWithInfo[];\r\n logotypesPerView?: number;\r\n spaceBetween?: number;\r\n display: LogotypesDisplay;\r\n hideNavigation: boolean;\r\n autoplay: boolean;\r\n externalLink?: boolean;\r\n maxHeight?: number;\r\n filterColor: FilterColor;\r\n buttonLabel: string;\r\n}\r\n\r\nexport enum LogotypesDisplay {\r\n slideshow = 0,\r\n grid = 1,\r\n partiallyHiddenGrid = 2\r\n}\r\n\r\nexport enum FilterColor {\r\n none = 0,\r\n black = 1,\r\n gray = 2,\r\n white = 3\r\n}\r\n\r\nexport interface InteractiveImageObj {\r\n image: string;\r\n buttons: ButtonObj[];\r\n}\r\n\r\nexport interface ButtonObj {\r\n id: string;\r\n index: number;\r\n positionX: number;\r\n positionY: number;\r\n featureInput: FeatureInput;\r\n}\r\n\r\nexport interface FeatureInput {\r\n sortingTitle: string;\r\n inputText: string;\r\n active: boolean;\r\n}\r\n\r\nexport interface PopupViewModel {\r\n active?: boolean;\r\n showInterval: number;\r\n expirationDate?: string;\r\n appearOnScroll?: number;\r\n name: string;\r\n}\r\n\r\nexport interface FormPostResponse {\r\n posts: FormPost[];\r\n}\r\n\r\nexport interface FormExportQueryString {\r\n formId: number;\r\n culture: string;\r\n format?: SpreadsheetFormat;\r\n}\r\n\r\n/**\r\n * Supported spreadsheet formats.\r\n */\r\nexport enum SpreadsheetFormat {\r\n\r\n /**\r\n * Default XML-based file format for Excel 2010 and Excel 2007.\r\n */\r\n xlsx = 0,\r\n\r\n /**\r\n * Excel 97 - Excel 2003 Binary file format (BIFF8).\r\n */\r\n xls = 1,\r\n\r\n /**\r\n * Comma separated values.\r\n */\r\n csv = 2,\r\n\r\n /**\r\n * JavaScript object notation.\r\n */\r\n json = 3\r\n}\r\n\r\nexport interface ResendFormPostsMailResponse {\r\n failedResentMails: FailedResentMail[];\r\n succededResentMails: number[];\r\n}\r\n\r\nexport interface FailedResentMail {\r\n id: number;\r\n errorMessage: string;\r\n}\r\n\r\nexport interface OptionsResponse {\r\n key: string;\r\n title: string;\r\n definitions: ObjectDefinition[];\r\n properties: OptionsProperty[];\r\n model: { [key: string]: any };\r\n}\r\n\r\nexport interface ObjectDefinition {\r\n type: string;\r\n propertyEditor: string;\r\n formatString: string;\r\n properties: OptionsProperty[];\r\n}\r\n\r\nexport interface OptionsProperty {\r\n title: string;\r\n description: string;\r\n key: string;\r\n type: string;\r\n propertyType: OptionsPropertyType;\r\n tab: string;\r\n group: string;\r\n relation: OptionsRelation;\r\n isAdminOnly?: boolean;\r\n isVaryByCulture?: boolean;\r\n evaluateOnChange?: boolean;\r\n mappingTitle: string;\r\n}\r\n\r\n/**\r\n * Options property type of an object definition.\r\n */\r\nexport enum OptionsPropertyType {\r\n\r\n /**\r\n * Primitive value such as a number or a string.\r\n */\r\n primitive = 0,\r\n\r\n /**\r\n * Nested object structure.\r\n */\r\n object = 1,\r\n\r\n /**\r\n * Array of nested object structures.\r\n */\r\n array = 2\r\n}\r\n\r\nexport interface OptionsRelation {\r\n multiSelect?: boolean;\r\n optional?: boolean;\r\n style: number;\r\n values: IOptionsValue[];\r\n}\r\n\r\n/**\r\n * Selectable options relation value.\r\n */\r\nexport interface IOptionsValue {\r\n\r\n /**\r\n * Title of value.\r\n */\r\n title: string;\r\n\r\n /**\r\n * Options value\r\n */\r\n value: string;\r\n\r\n /**\r\n * Description to show to the editor.\r\n */\r\n description: string;\r\n isVaryByCulture?: boolean;\r\n\r\n /**\r\n * Indicate that this value is selected.\r\n */\r\n selected?: boolean;\r\n}\r\n\r\n/**\r\n * Type of list style to use for relation values.\r\n */\r\nexport enum RelationListStyle {\r\n\r\n /**\r\n * A single or a multi select dropdown list.\r\n */\r\n dropdown = 0,\r\n\r\n /**\r\n * A list of radio buttons or a list of checkboxes for multi select.\r\n */\r\n buttons = 1\r\n}\r\n\r\nexport interface MenuOptionsItem {\r\n title: string;\r\n key: string;\r\n icon: string;\r\n subMenu: MenuOptionsItem[];\r\n}\r\n\r\nexport interface JobDescriptionResponse {\r\n jobDescriptions: RecurringJobDescription[];\r\n latestRuns: ScheduledJobRun[];\r\n}\r\n\r\nexport interface JobTypesResponse {\r\n types: JobTypeModel[];\r\n}\r\n\r\nexport interface JobTypeModel {\r\n typeName: string;\r\n name: string;\r\n}\r\n\r\n/**\r\n * Job reporter event data from the reporter channel.\r\n */\r\nexport interface JobReporterEvent {\r\n\r\n /**\r\n * Gets or sets scheduled job entity id.\r\n */\r\n entityId: number;\r\n\r\n /**\r\n * Gets or sets progress value.\r\n */\r\n progress: number;\r\n\r\n /**\r\n * Gets or sets status text.\r\n */\r\n text: string;\r\n\r\n /**\r\n * Gets or sets job reporter status.\r\n */\r\n status: JobReportStatus;\r\n\r\n /**\r\n * Gets or sets internal job status that may be used to report metadata status to listeners.\r\n */\r\n metadataJobStatus?: MetadataJobStatus;\r\n}\r\n\r\n/**\r\n * Job reporter status for a job task during its execution.\r\n */\r\nexport enum JobReportStatus {\r\n\r\n /**\r\n * The job task is idling and waiting to be ran.\r\n */\r\n idle = 0,\r\n\r\n /**\r\n * The job task is currently running.\r\n */\r\n running = 1\r\n}\r\n\r\n/**\r\n * Metadata job status.\r\n */\r\nexport enum MetadataJobStatus {\r\n\r\n /**\r\n * Job task is removed and should be propagated to listeners.\r\n */\r\n remove = 0,\r\n\r\n /**\r\n * Job task is updated and should be propagated to listeners.\r\n */\r\n update = 1,\r\n\r\n /**\r\n * Job task is created and should be propagated to listeners.\r\n */\r\n create = 2\r\n}\r\n\r\n/**\r\n * Job reporter status summary of individual job tasks.\r\n */\r\nexport interface JobReporterStatusSummary {\r\n\r\n /**\r\n * Job task events by entity id.\r\n */\r\n jobEvents: { [key: number]: JobReporterEvent };\r\n}\r\n\r\nexport interface JobDescriptionUpdateRequest {\r\n model: JobTaskModel;\r\n}\r\n\r\nexport interface JobTaskModel {\r\n\r\n /**\r\n * Scheduled job entity id.\r\n */\r\n entityId: number;\r\n\r\n /**\r\n * Given name of this job task.\r\n */\r\n name: string;\r\n\r\n /**\r\n * Cron timing expression.\r\n */\r\n cron: string;\r\n\r\n /**\r\n * Cron time zone in IANA id. UTC if `null`.\r\n */\r\n cronTimeZoneIana: string;\r\n\r\n /**\r\n * Decide whether this job task is active or not.\r\n */\r\n active: boolean;\r\n\r\n /**\r\n * Type name of this job task.\r\n */\r\n type: string;\r\n}\r\n\r\nexport interface JobRunLogsResponse {\r\n run: ScheduledJobRun;\r\n logs: ScheduledJobRunLog[];\r\n}\r\n\r\nexport interface JobRunsResponse {\r\n runs: ScheduledJobRun[];\r\n}\r\n\r\nexport interface EventLog {\r\n message: string;\r\n exceptionMessage: string;\r\n exceptionStackTrace: string;\r\n exceptionSource: string;\r\n}\r\n\r\nexport interface RichTextConfiguration {\r\n editor: any;\r\n overlaySize: string;\r\n hideLabel: boolean;\r\n mediaParentId: GuidUdi;\r\n ignoreUserStartNodes: boolean;\r\n}\r\n\r\nexport interface GuidUdi extends Udi {\r\n guid: string;\r\n isRoot: boolean;\r\n}\r\n\r\nexport interface Udi {\r\n uriValue: Uri;\r\n entityType: string;\r\n isRoot: boolean;\r\n}\r\n\r\nexport interface Uri {\r\n absolutePath: string;\r\n absoluteUri: string;\r\n localPath: string;\r\n authority: string;\r\n hostNameType: UriHostNameType;\r\n isDefaultPort: boolean;\r\n isFile: boolean;\r\n isLoopback: boolean;\r\n pathAndQuery: string;\r\n segments: string[];\r\n isUnc: boolean;\r\n host: string;\r\n port: number;\r\n query: string;\r\n fragment: string;\r\n scheme: string;\r\n originalString: string;\r\n dnsSafeHost: string;\r\n idnHost: string;\r\n isAbsoluteUri: boolean;\r\n userEscaped: boolean;\r\n userInfo: string;\r\n}\r\n\r\nexport enum UriHostNameType {\r\n unknown = 0,\r\n basic = 1,\r\n dns = 2,\r\n iPv4 = 3,\r\n iPv6 = 4\r\n}\r\n\r\nexport interface SearchResultResponse {\r\n totalCount: number;\r\n searchTerm: string;\r\n results: SearchResultItem[];\r\n}\r\n\r\nexport interface SearchResultItem {\r\n title: string;\r\n description: string;\r\n url: string;\r\n id: string;\r\n contentType: string;\r\n}\r\n\r\n/**\r\n * @inheritdoc Empori.Core.Data.Entities.IForm\r\n */\r\nexport interface Form extends EntityBase {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n name: string;\r\n inputs: InputItem[];\r\n settings: FormSettings;\r\n}\r\n\r\nexport interface FormSettings extends BaseOptions {\r\n submitLabel: string;\r\n\r\n /**\r\n * Page node to redirect to after form has been posted. See also @see Empori.Core.Middlewares.FormPostMiddleware.\r\n */\r\n redirectPageNode: BaseNodePickerOption;\r\n\r\n /**\r\n * File size in megabytes (MiB).\r\n */\r\n maxUploadFileSize?: number;\r\n adminMailOptions: AdminEmailOptions;\r\n spamProtectionOptions: FormSpamProtectionOptions;\r\n}\r\n\r\n/**\r\n * Class contains the bare-minumum fields required for NodePicker property-editor to work.\r\n * Can be extended with all the fields listed in @see Empori.Core.Configuration.PropertyEditors.BaseNodePickerOption\r\n */\r\nexport interface BaseNodePickerOption {\r\n nodeId: number;\r\n name: string;\r\n icon: string;\r\n}\r\n\r\nexport interface AdminEmailOptions extends MailToOptions {\r\n sendAdminEmail: GlobalNoYes;\r\n attachUploadedFiles: GlobalNoYes;\r\n}\r\n\r\n/**\r\n * No/yes override for a global @see System.Boolean option.\r\n */\r\nexport enum GlobalNoYes {\r\n\r\n /**\r\n * Use global option.\r\n */\r\n global = 0,\r\n\r\n /**\r\n * No.\r\n */\r\n no = 1,\r\n\r\n /**\r\n * Yes.\r\n */\r\n yes = 2\r\n}\r\n\r\n/**\r\n * Options for an email message with receiver address, sender address, template and subject.\r\n */\r\nexport interface MailToOptions extends MailOptions {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n toEmail: string;\r\n}\r\n\r\n/**\r\n * Options for an email message with sender address, template and subject.\r\n */\r\nexport interface MailOptions {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n fromEmail: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n template: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n title: string;\r\n}\r\n\r\n/**\r\n * emporicaptcha/turnstile override for a global @see System.Boolean option.\r\n */\r\nexport enum FormSpamProtectionOptions {\r\n\r\n /**\r\n * Use global option.\r\n */\r\n global = 0,\r\n none = 1,\r\n\r\n /**\r\n * Empori Captcha.\r\n */\r\n emporiCaptcha = 2,\r\n\r\n /**\r\n * 3rd Party Turnstile.\r\n */\r\n turnstile = 3\r\n}\r\n\r\n/**\r\n * Base abstract class of a configurable @see Microsoft.Extensions.Options.IOptions`1 in the backoffice.\r\n */\r\nexport interface BaseOptions {\r\n}\r\n\r\nexport interface EntityBase extends BeingDirtyBase {\r\n id: number;\r\n key: string;\r\n createDate: string;\r\n updateDate: string;\r\n deleteDate?: string;\r\n hasIdentity: boolean;\r\n}\r\n\r\nexport interface BeingDirtyBase {\r\n}\r\n\r\n/**\r\n * @inheritdoc Empori.Core.Data.Entities.IFormPost\r\n */\r\nexport interface FormPost extends EntityBase {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n formId: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n pageId?: number;\r\n pageCulture: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n ip: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n created: string;\r\n status: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n postData: FormPostData[];\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n postFiles: FormPostFile[];\r\n}\r\n\r\n/**\r\n * @inheritdoc Empori.Core.Data.Entities.IFormPostData\r\n */\r\nexport interface FormPostData extends EntityBase {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n formPostId: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n name: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n value: string;\r\n}\r\n\r\n/**\r\n * @inheritdoc Empori.Core.Data.Entities.IFormPostFile\r\n */\r\nexport interface FormPostFile extends EntityBase {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n formPostId: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n fieldName: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n fileName: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n length: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n contentType: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n storageName: string;\r\n}\r\n\r\nexport interface ScheduledJob extends EntityBase {\r\n active: boolean;\r\n lastRun: string;\r\n name: string;\r\n type: string;\r\n cron: string;\r\n cronTimeZoneIana: string;\r\n}\r\n\r\nexport interface ScheduledJobRun extends EntityBase {\r\n jobId: number;\r\n result: JobRunResult;\r\n startDate: string;\r\n endDate?: string;\r\n}\r\n\r\n/**\r\n * Job run result.\r\n */\r\nexport enum JobRunResult {\r\n\r\n /**\r\n * Default idle result.\r\n */\r\n idle = 0,\r\n\r\n /**\r\n * Run is currently running.\r\n */\r\n running = 1,\r\n\r\n /**\r\n * Run is completed.\r\n */\r\n complete = 2,\r\n\r\n /**\r\n * Run is stopped.\r\n */\r\n stopped = 3,\r\n\r\n /**\r\n * Run has an error.\r\n */\r\n error = 4\r\n}\r\n\r\nexport interface ScheduledJobRunLog extends EntityBase {\r\n runId: number;\r\n level: LogLevel;\r\n message: string;\r\n}\r\n\r\nexport enum LogLevel {\r\n trace = 0,\r\n debug = 1,\r\n information = 2,\r\n warning = 3,\r\n error = 4,\r\n critical = 5,\r\n none = 6\r\n}\r\n\r\n/**\r\n * A recurring job description that spawns @see Empori.Core.Scheduler.IJobTasks in an interval.\r\n */\r\nexport interface RecurringJobDescription {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n lastRun?: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n nextOccurrence?: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n active: boolean;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n name: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n entity: ScheduledJob;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n currentRunEntity: ScheduledJobRun;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n status: JobReportStatus;\r\n}\r\n\r\n","export type MappedArrayObject = {\r\n [key: string]: T;\r\n};\r\n\r\nexport type GroupedArrayObject = {\r\n [key: string]: T[];\r\n};\r\n\r\nexport function arrayToObject(array: T[], key: (item: T) => string): MappedArrayObject {\r\n const obj: MappedArrayObject = {};\r\n\r\n for (let item of array) {\r\n obj[key(item)] = item;\r\n }\r\n\r\n return obj;\r\n}\r\n\r\nexport function groupArray(array: T[], key: (item: T) => string): GroupedArrayObject {\r\n const obj: GroupedArrayObject = {};\r\n\r\n for (let item of array) {\r\n const itemKey = key(item);\r\n (obj[itemKey] || (obj[itemKey] = [])).push(item);\r\n }\r\n\r\n return obj;\r\n}\r\n\r\nexport function camelCase(value?: string) {\r\n if (!value || value.length <= 1) {\r\n return value ?? '';\r\n }\r\n\r\n return value.charAt(0).toLocaleLowerCase() + value.substring(1);\r\n}\r\n\r\nconst formatMustasch = /{([^{}]*)}/g;\r\n\r\n/**\r\n * Format a string template in a provided mustasch format using an object as a lookup source.\r\n *\r\n * @example\r\n * formatObject('test {key1} format', { key1: 'string' }) // \"test string format\"\r\n *\r\n * @param format Format string template.\r\n * @param object Object to use as lookup.\r\n * @param replacementFunc Optional callback function for each parsed tag.\r\n * Returned `string` will be used instead of given mapped item.\r\n * @returns Formatted string template.\r\n */\r\nexport function formatObject(format: string, object?: any, replacementFunc?: (key: string, item: any) => string) {\r\n if (object == null) {\r\n return '';\r\n }\r\n\r\n return format.replace(formatMustasch, (a: string, b: string) => {\r\n let val = object[b] ?? object[camelCase(b)];\r\n let formatVal = replacementFunc?.(b, val);\r\n return formatVal ?? val;\r\n });\r\n}\r\n\r\nconst byte = 1024;\r\nexport const FileSizeUnits = {\r\n KiB: byte,\r\n MiB: byte * byte,\r\n GiB: byte * byte * byte,\r\n TiB: byte * byte * byte * byte,\r\n PiB: byte * byte * byte * byte * byte,\r\n EiB: byte * byte * byte * byte * byte * byte\r\n};\r\n\r\n/**\r\n * Returns a new array with one item replaced at given index.\r\n * Does not mutate the original array.\r\n * @param items The original array\r\n * @param index What item to replace\r\n * @param newItem The new replacementitem\r\n */\r\nexport function replaceItem(items: T[], index: number, newItem: T) {\r\n return items.map((item, idx) => idx === index ? newItem : item);\r\n}\r\n\r\nexport const FileExtensions = {\r\n PDF: '.pdf',\r\n MP4: '.mp4',\r\n OGG: '.ogg',\r\n SVG: '.svg'\r\n};\r\n\r\nexport function thousandSeparator(num: number) {\r\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\r\n};\r\n\r\n// eslint-disable-next-line no-shadow\r\nexport enum Direction {\r\n prev,\r\n next\r\n}\r\n\r\n// eslint-disable-next-line no-shadow\r\nexport enum ThemeIds {\r\n raw = 'Raw',\r\n exclusive = 'Exclusive'\r\n}\r\n"],"names":["Logotype","props","imgUrl","url","includes","SVG","setInlineStyling","css","filter","maxHeight","filterColor","black","gray","white","pageLink","className","style","parentStyling","href","title","imgAlt","target","externalLink","startsWith","src","alt","loading","LogotypesGrid","mediaObjects","display","logotypesPerView","spaceBetween","buttonLabel","data","cap","setCap","spv","slidesPerView","gap","flex","partiallyHiddenGrid","offset","slice","length","map","item","index","onClick","LogotypesSlideshow","autoplay","hideNavigation","settings","modules","delay","loop","autoHeight","lazy","loopedSlidesLimit","breakpoints","direction","prev","next","setting","Logotypes","grid","NavigationButton","absolute","swiper","leftOrRight","slidePrev","slideNext","clsName","LinkIcon","EmporiInputType","WidthLayout","ContentAlignment","VerticalAlignment","RowAnimationStyle","LogotypesDisplay","FilterColor","SpreadsheetFormat","OptionsPropertyType","RelationListStyle","JobReportStatus","MetadataJobStatus","UriHostNameType","GlobalNoYes","FormSpamProtectionOptions","JobRunResult","LogLevel","FileSizeUnits","KiB","MiB","byte","GiB","TiB","PiB","EiB","FileExtensions","PDF","MP4","OGG","thousandSeparator","num","toString","replace","Direction","ThemeIds"],"sourceRoot":""}