����JFIF��x�x����'403WebShell
403Webshell
Server IP : 78.140.185.180  /  Your IP : 3.141.107.132
Web Server : LiteSpeed
System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64
User : builderbox ( 1072)
PHP Version : 7.3.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/builderbox/public_html/public/client/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/builderbox/public_html/public/client/10-es5.26af29b63e30c2349254.js.map
{"version":3,"sources":["webpack:///node_modules/@angular/material/__ivy_ngcc__/fesm2015/slider.js","webpack:///src/common/admin/appearance/appearance-editor/appearance-editor.service.ts","webpack:///src/common/admin/appearance/appearance-editor-config.token.ts","webpack:///src/common/shared/appearance/commands/appearance-commands.ts","webpack:///src/common/core/utils/remove-duplicate-slashes.ts","webpack:///src/common/admin/appearance/appearance-panel-meta/appearance-panel-meta.component.html","webpack:///src/common/admin/appearance/appearance-panel-meta/appearance-panel-meta.component.ts","webpack:///src/common/admin/appearance/highlight-in-preview.directive.ts","webpack:///src/common/admin/appearance/appearance-image-input/appearance-image-input.component.html","webpack:///src/common/admin/appearance/appearance-image-input/appearance-image-input.component.ts","webpack:///src/common/core/ui/color-picker/color-picker-input/color-picker-input.component.ts","webpack:///src/common/core/ui/color-picker/color-picker-input/color-picker-input.component.html","webpack:///src/app/admin/appearance/homepage-appearance-panel/homepage-appearance-panel.component.html","webpack:///src/app/admin/appearance/homepage-appearance-panel/homepage-appearance-panel.component.ts","webpack:///src/common/core/ui/color-picker/color-picker-input/color-picker-input.module.ts","webpack:///src/common/admin/appearance/panels/general-appearance-panel/general-appearance-panel.component.ts","webpack:///src/common/admin/appearance/panels/themes-appearance-panel/css-theme.service.ts","webpack:///src/app/admin/appearance/app-appearance-config.ts","webpack:///src/common/admin/appearance/panels/general-appearance-panel/general-appearance-panel.component.html","webpack:///src/common/admin/appearance/panels/themes-appearance-panel/crupdate-css-theme-modal/crupdate-css-theme-modal.component.html","webpack:///src/common/admin/appearance/panels/themes-appearance-panel/crupdate-css-theme-modal/crupdate-css-theme-modal.component.ts","webpack:///src/common/admin/appearance/panels/themes-appearance-panel/css-theme-colors-panel/css-theme-colors-panel.component.html","webpack:///src/common/admin/appearance/panels/themes-appearance-panel/css-theme-colors-panel/css-theme-colors-panel.component.ts","webpack:///src/common/admin/appearance/panels/themes-appearance-panel/themes-appearance-panel.component.html","webpack:///src/common/admin/appearance/panels/themes-appearance-panel/themes-appearance-panel.component.ts","webpack:///src/common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service.ts","webpack:///src/common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-categories.service.ts","webpack:///src/common/core/ui/custom-menu/menu-item.ts","webpack:///src/common/admin/appearance/panels/menus-appearance-panel/menus/add-menu-item-panel/add-menu-item-panel.component.html","webpack:///src/common/admin/appearance/panels/menus-appearance-panel/menus/add-menu-item-panel/add-menu-item-panel.component.ts","webpack:///src/common/shared/icon-selector/icon-selector.component.html","webpack:///src/common/shared/icon-selector/icon-selector.component.ts","webpack:///src/common/admin/appearance/panels/menus-appearance-panel/menus/menu-items/menu-items.component.html","webpack:///src/common/admin/appearance/panels/menus-appearance-panel/menus/menu-items/menu-items.component.ts","webpack:///src/common/admin/appearance/panels/menus-appearance-panel/menus-appearance-panel.component.html","webpack:///src/common/admin/appearance/panels/menus-appearance-panel/menus-appearance-panel.component.ts","webpack:///src/common/admin/appearance/panels/seo-appearance-panel/seo-appearance-panel.component.html","webpack:///src/common/admin/appearance/panels/seo-appearance-panel/seo-appearance-panel.component.ts","webpack:///src/common/admin/appearance/panels/custom-code-appearance-panel/code-editor-modal/code-editor-modal.component.html","webpack:///src/common/admin/appearance/panels/custom-code-appearance-panel/code-editor-modal/code-editor-modal.component.ts","webpack:///src/common/admin/appearance/panels/custom-code-appearance-panel/custom-code-appearance-panel.component.ts","webpack:///src/common/admin/appearance/panels/custom-code-appearance-panel/custom-code-appearance-panel.component.html","webpack:///src/common/admin/appearance/appearance.component.html","webpack:///src/common/admin/appearance/appearance.component.ts","webpack:///src/common/admin/appearance/can-deactivate-appearance.guard.ts","webpack:///src/common/admin/appearance/appearance-editor/appearance-editor-resolver.service.ts","webpack:///src/common/admin/appearance/appearance-routing.module.ts","webpack:///src/common/shared/icon-selector/icon-selector.module.ts","webpack:///src/app/admin/appearance/app-appearance.module.ts","webpack:///src/common/admin/appearance/base-appearance.module.ts","webpack:///src/common/core/ui/overlay-panel/positions/right-position.ts"],"names":["_c0","activeEventOptions","passive","MAT_SLIDER_VALUE_ACCESSOR","provide","useExisting","MatSlider","multi","MatSliderChange","_MatSliderMixinBase","_elementRef","this","elementRef","_focusMonitor","_changeDetectorRef","_dir","tabIndex","_ngZone","_document","_animationMode","super","_invert","_max","_min","_step","_thumbLabel","_tickInterval","_value","_vertical","change","input","valueChange","onTouched","_percent","_isSliding","_isActive","_tickIntervalPercent","_sliderDimensions","_controlValueAccessorChangeFn","_dirChangeSubscription","EMPTY","_pointerDown","event","disabled","isTouchEvent","button","run","oldValue","value","pointerPosition","getPointerPositionOnPage","_lastPointerEvent","preventDefault","_focusHostElement","_onMouseenter","_bindGlobalEvents","_updateValueFromPosition","_valueOnSlideStart","_pointerPositionOnStart","_emitInputEvent","_emitChangeEvent","_pointerMove","_pointerUp","pointerPositionOnStart","currentPointerPosition","_removeGlobalEvents","x","y","_windowBlur","parseInt","runOutsideAngular","element","nativeElement","addEventListener","options","_blurHostElement","vertical","invert","percent","_isMinValue","thumbLabel","scale","transform","_shouldInvertMouseCoords","_getThumbGap","display","_getDirection","tickSize","styles","shouldInvertAxis","_shouldInvertAxis","monitor","subscribe","origin","detectChanges","markForCheck","removeEventListener","stopMonitoring","unsubscribe","_getSliderDimensions","_updateTickIntervalPercent","keyCode","_increment","max","min","defaultView","window","triggerEvent","document","isTouch","endEventName","_getWindow","numSteps","_clamp","step","pos","top","left","height","width","exactValue","_calculateValue","closestValue","Math","round","emit","_createChangeEvent","tickInterval","trackSize","stepsPerTick","ceil","source","percentage","_sliderWrapper","getBoundingClientRect","focus","blur","fn","isDisabled","c","v","_calculatePercentage","_roundToDecimal","toString","split","pop","length","parseFloat","toFixed","displayWith","ɵfac","t","ɵcmp","type","selectors","viewQuery","rf","ctx","_t","first","hostAttrs","hostVars","hostBindings","_onFocus","_onBlur","$event","_onKeydown","_onKeyup","inputs","color","outputs","exportAs","features","decls","vars","consts","template","_getTrackBackgroundStyles","_getTrackFillStyles","_getTicksContainerStyles","_getTicksStyles","_getThumbContainerStyles","displayValue","directives","encapsulation","changeDetection","point","touches","changedTouches","clientX","clientY","MatSliderModule","ɵmod","ɵinj","factory","imports","AppearanceEditor","APPEARANCE_EDITOR_CONFIG","DEFAULT_APPEARANCE_EDITOR_CONFIG","navigationRoutes","menus","availableRoutes","positions","sections","name","position","route","queryParams","Navigate","key","SetConfig","selector","index","Select","Deselect","SetColors","content","SetCustomCss","SetCustomHtml","settings","router","http","toast","activePanel$","BehaviorSubject","defaultSettings","initiated$","ReplaySubject","loading$","changes$","next","panel","config","find","navigate","iframe","fromEvent","pipe","filter","e","data","URL","location","hostname","complete","forEach","setting","initConfig","initIframe","changes","addChanges","observable","saveRequest","post","finalize","share","open","request","panelConfig","postMessage","defaultRoute","command","previewWindow","startsWith","get","merged","all","sort","a","b","url","getBaseUrl","src","replace","contentWindow","HighlightInPreviewDirective","AppearancePanelMetaComponent","path","back","el","editor","selectNode","deselectNode","AppearanceImageInputComponent","ColorPickerInputComponent","uploadQueue","validator","image$","showToast","params","uri","backendUri","Image","httpParams","diskPrefix","types","image","then","files","start","response","updateValue","fileEntry","defaultValue","propagateChange","openModal","stopPropagation","overlayPanel","color$","pickerSub","BeColorPickerModule","components","target","valueChanged","openColorPicker","HomepageAppearancePanelComponent","ColorPickerInputModule","GeneralAppearancePanelComponent","CssThemeService","CONFIG_KEY","APP_APPEARANCE_CONFIG","component","fb","selectedSubpanel$","path$","map","push","form","group","headerTitle","headerSubtitle","headerImage","headerImageOpacity","headerOverlayColor1","headerOverlayColor2","footerTitle","footerSubtitle","footerImage","actions","inputText","inputButton","cta1","cta2","primaryFeatures","array","secondaryFeatures","channelIds","control","getJson","defaultValues","JSON","parse","addFeature","patchValue","valueChanges","setConfig","openSubpanel","closeActivePanel","title","subtitle","description","removeAt","openPreviousPanel","defaults","Object","keys","controls","currentValue","id","put","ids","CrupdateCssThemeModalComponent","dialogRef","cssTheme","errors$","is_dark","default_dark","default_light","theme","setValue","update","create","close","errResponse","errors","CssThemeColorsPanelComponent","themes","colorCache","setSaveRequest","saveColors","bind","entries","colors","addControl","setColors","payload","ThemesAppearancePanelComponent","MenuEditor","MenuItemCategoriesService","appearance","modal","loadedThemes$","selectedTheme$","reloadThemes","querySub","afterClosed","newTheme","queryParamsHandling","setSelectedTheme","show","body","ok","confirmed","deleteTheme","pagination","bindToQueryParams","MenuItem","order","condition","activeExact","floor","random","allMenus$","activeMenu$","allMenus","commitChanges","previousIndex","currentIndex","activeMenu","items","i","indexOf","splice","item","transformLocalLinksToRoutes","baseUrl","action","stringify","json","menuData","menu","getWithCache","AddMenuItemPanelComponent","overlayPanelRef","itemCategories","linkForm","label","menuItemCategories","categories","addItem","reset","addLinkMenuItem","IconSelectorComponent","icons$","iconSelected","icons","icon","observers","emitValue","MenuItemsComponent","cd","subscriptions","subscription","reorderActiveMenuItems","selectedMenuItem","removeItem","menuItem","MenusAppearancePanelComponent","setFromJson","slice","offsetX","panelClass","deleteActive","SeoAppearancePanelComponent","seoFields","field","CodeEditorModalComponent","CustomCodeAppearancePanelComponent","lazyLoader","syntaxInvalid$","initEditor","contents","language","overrideDialogCloseEvents","getValue","loadAsset","ace","edit","editorEl","getSession","setMode","setTheme","$blockScrolling","Infinity","on","annotations","getAnnotations","test","text","setAnnotations","syntaxInvalid","disableClose","backdropClick","keydownEvents","confirm","initialValue","newValue","saveChanges","addCodeToPreview","CanDeactivateAppearance","AppearanceComponent","AppearanceEditorResolver","AppearanceRoutingModule","IconSelectorModule","AppAppearanceModule","BaseAppearanceModule","breakpoints","leftColumnIsHidden","panelPortal$","isMobile$","init","snapshot","routerSub","openPanel","str","closeEditor","toggleLeftSidebar","bodyBold","cancel","routes","permissions","resolve","state","catchError","mergeMap","of","canActivate","canDeactivate","children","forChild","useValue","RIGHT_POSITION","originX","originY","overlayX","overlayY"],"mappings":"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","file":"x","sourcesContent":["import { DOCUMENT, CommonModule } from '@angular/common';\nimport { forwardRef, EventEmitter, Component, ViewEncapsulation, ChangeDetectionStrategy, ElementRef, ChangeDetectorRef, Optional, Attribute, NgZone, Inject, Input, Output, ViewChild, NgModule } from '@angular/core';\nimport { mixinTabIndex, mixinColor, mixinDisabled, MatCommonModule } from '@angular/material/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { hasModifierKey, DOWN_ARROW, RIGHT_ARROW, UP_ARROW, LEFT_ARROW, HOME, END, PAGE_DOWN, PAGE_UP } from '@angular/cdk/keycodes';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { normalizePassiveListenerOptions } from '@angular/cdk/platform';\nimport { Subscription } from 'rxjs';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/a11y';\nimport * as ɵngcc2 from '@angular/cdk/bidi';\nimport * as ɵngcc3 from '@angular/common';\n\nconst _c0 = [\"sliderWrapper\"];\nconst activeEventOptions = normalizePassiveListenerOptions({ passive: false });\n/**\n * Visually, a 30px separation between tick marks looks best. This is very subjective but it is\n * the default separation we chose.\n */\nconst MIN_AUTO_TICK_SEPARATION = 30;\n/** The thumb gap size for a disabled slider. */\nconst DISABLED_THUMB_GAP = 7;\n/** The thumb gap size for a non-active slider at its minimum value. */\nconst MIN_VALUE_NONACTIVE_THUMB_GAP = 7;\n/** The thumb gap size for an active slider at its minimum value. */\nconst MIN_VALUE_ACTIVE_THUMB_GAP = 10;\n/**\n * Provider Expression that allows mat-slider to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)] and [formControl].\n * @docs-private\n */\nconst MAT_SLIDER_VALUE_ACCESSOR = {\n    provide: NG_VALUE_ACCESSOR,\n    useExisting: forwardRef(() => MatSlider),\n    multi: true\n};\n/** A simple change event emitted by the MatSlider component. */\nclass MatSliderChange {\n}\n// Boilerplate for applying mixins to MatSlider.\n/** @docs-private */\nclass MatSliderBase {\n    constructor(_elementRef) {\n        this._elementRef = _elementRef;\n    }\n}\nconst _MatSliderMixinBase = mixinTabIndex(mixinColor(mixinDisabled(MatSliderBase), 'accent'));\n/**\n * Allows users to select from a range of values by moving the slider thumb. It is similar in\n * behavior to the native `<input type=\"range\">` element.\n */\nclass MatSlider extends _MatSliderMixinBase {\n    constructor(elementRef, _focusMonitor, _changeDetectorRef, _dir, tabIndex, _ngZone, _document, _animationMode) {\n        super(elementRef);\n        this._focusMonitor = _focusMonitor;\n        this._changeDetectorRef = _changeDetectorRef;\n        this._dir = _dir;\n        this._ngZone = _ngZone;\n        this._animationMode = _animationMode;\n        this._invert = false;\n        this._max = 100;\n        this._min = 0;\n        this._step = 1;\n        this._thumbLabel = false;\n        this._tickInterval = 0;\n        this._value = null;\n        this._vertical = false;\n        /** Event emitted when the slider value has changed. */\n        this.change = new EventEmitter();\n        /** Event emitted when the slider thumb moves. */\n        this.input = new EventEmitter();\n        /**\n         * Emits when the raw value of the slider changes. This is here primarily\n         * to facilitate the two-way binding for the `value` input.\n         * @docs-private\n         */\n        this.valueChange = new EventEmitter();\n        /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n        this.onTouched = () => { };\n        this._percent = 0;\n        /**\n         * Whether or not the thumb is sliding.\n         * Used to determine if there should be a transition for the thumb and fill track.\n         */\n        this._isSliding = false;\n        /**\n         * Whether or not the slider is active (clicked or sliding).\n         * Used to shrink and grow the thumb as according to the Material Design spec.\n         */\n        this._isActive = false;\n        /** The size of a tick interval as a percentage of the size of the track. */\n        this._tickIntervalPercent = 0;\n        /** The dimensions of the slider. */\n        this._sliderDimensions = null;\n        this._controlValueAccessorChangeFn = () => { };\n        /** Subscription to the Directionality change EventEmitter. */\n        this._dirChangeSubscription = Subscription.EMPTY;\n        /** Called when the user has put their pointer down on the slider. */\n        this._pointerDown = (event) => {\n            // Don't do anything if the slider is disabled or the\n            // user is using anything other than the main mouse button.\n            if (this.disabled || this._isSliding || (!isTouchEvent(event) && event.button !== 0)) {\n                return;\n            }\n            this._ngZone.run(() => {\n                const oldValue = this.value;\n                const pointerPosition = getPointerPositionOnPage(event);\n                this._isSliding = true;\n                this._lastPointerEvent = event;\n                event.preventDefault();\n                this._focusHostElement();\n                this._onMouseenter(); // Simulate mouseenter in case this is a mobile device.\n                this._bindGlobalEvents(event);\n                this._focusHostElement();\n                this._updateValueFromPosition(pointerPosition);\n                this._valueOnSlideStart = this.value;\n                this._pointerPositionOnStart = pointerPosition;\n                // Emit a change and input event if the value changed.\n                if (oldValue != this.value) {\n                    this._emitInputEvent();\n                    this._emitChangeEvent();\n                }\n            });\n        };\n        /**\n         * Called when the user has moved their pointer after\n         * starting to drag. Bound on the document level.\n         */\n        this._pointerMove = (event) => {\n            if (this._isSliding) {\n                // Prevent the slide from selecting anything else.\n                event.preventDefault();\n                const oldValue = this.value;\n                this._lastPointerEvent = event;\n                this._updateValueFromPosition(getPointerPositionOnPage(event));\n                // Native range elements always emit `input` events when the value changed while sliding.\n                if (oldValue != this.value) {\n                    this._emitInputEvent();\n                }\n            }\n        };\n        /** Called when the user has lifted their pointer. Bound on the document level. */\n        this._pointerUp = (event) => {\n            if (this._isSliding) {\n                const pointerPositionOnStart = this._pointerPositionOnStart;\n                const currentPointerPosition = getPointerPositionOnPage(event);\n                event.preventDefault();\n                this._removeGlobalEvents();\n                this._valueOnSlideStart = this._pointerPositionOnStart = this._lastPointerEvent = null;\n                this._isSliding = false;\n                if (this._valueOnSlideStart != this.value && !this.disabled &&\n                    pointerPositionOnStart && (pointerPositionOnStart.x !== currentPointerPosition.x ||\n                    pointerPositionOnStart.y !== currentPointerPosition.y)) {\n                    this._emitChangeEvent();\n                }\n            }\n        };\n        /** Called when the window has lost focus. */\n        this._windowBlur = () => {\n            // If the window is blurred while dragging we need to stop dragging because the\n            // browser won't dispatch the `mouseup` and `touchend` events anymore.\n            if (this._lastPointerEvent) {\n                this._pointerUp(this._lastPointerEvent);\n            }\n        };\n        this._document = _document;\n        this.tabIndex = parseInt(tabIndex) || 0;\n        _ngZone.runOutsideAngular(() => {\n            const element = elementRef.nativeElement;\n            element.addEventListener('mousedown', this._pointerDown, activeEventOptions);\n            element.addEventListener('touchstart', this._pointerDown, activeEventOptions);\n        });\n    }\n    /** Whether the slider is inverted. */\n    get invert() { return this._invert; }\n    set invert(value) {\n        this._invert = coerceBooleanProperty(value);\n    }\n    /** The maximum value that the slider can have. */\n    get max() { return this._max; }\n    set max(v) {\n        this._max = coerceNumberProperty(v, this._max);\n        this._percent = this._calculatePercentage(this._value);\n        // Since this also modifies the percentage, we need to let the change detection know.\n        this._changeDetectorRef.markForCheck();\n    }\n    /** The minimum value that the slider can have. */\n    get min() { return this._min; }\n    set min(v) {\n        this._min = coerceNumberProperty(v, this._min);\n        // If the value wasn't explicitly set by the user, set it to the min.\n        if (this._value === null) {\n            this.value = this._min;\n        }\n        this._percent = this._calculatePercentage(this._value);\n        // Since this also modifies the percentage, we need to let the change detection know.\n        this._changeDetectorRef.markForCheck();\n    }\n    /** The values at which the thumb will snap. */\n    get step() { return this._step; }\n    set step(v) {\n        this._step = coerceNumberProperty(v, this._step);\n        if (this._step % 1 !== 0) {\n            this._roundToDecimal = this._step.toString().split('.').pop().length;\n        }\n        // Since this could modify the label, we need to notify the change detection.\n        this._changeDetectorRef.markForCheck();\n    }\n    /** Whether or not to show the thumb label. */\n    get thumbLabel() { return this._thumbLabel; }\n    set thumbLabel(value) { this._thumbLabel = coerceBooleanProperty(value); }\n    /**\n     * How often to show ticks. Relative to the step so that a tick always appears on a step.\n     * Ex: Tick interval of 4 with a step of 3 will draw a tick every 4 steps (every 12 values).\n     */\n    get tickInterval() { return this._tickInterval; }\n    set tickInterval(value) {\n        if (value === 'auto') {\n            this._tickInterval = 'auto';\n        }\n        else if (typeof value === 'number' || typeof value === 'string') {\n            this._tickInterval = coerceNumberProperty(value, this._tickInterval);\n        }\n        else {\n            this._tickInterval = 0;\n        }\n    }\n    /** Value of the slider. */\n    get value() {\n        // If the value needs to be read and it is still uninitialized, initialize it to the min.\n        if (this._value === null) {\n            this.value = this._min;\n        }\n        return this._value;\n    }\n    set value(v) {\n        if (v !== this._value) {\n            let value = coerceNumberProperty(v);\n            // While incrementing by a decimal we can end up with values like 33.300000000000004.\n            // Truncate it to ensure that it matches the label and to make it easier to work with.\n            if (this._roundToDecimal) {\n                value = parseFloat(value.toFixed(this._roundToDecimal));\n            }\n            this._value = value;\n            this._percent = this._calculatePercentage(this._value);\n            // Since this also modifies the percentage, we need to let the change detection know.\n            this._changeDetectorRef.markForCheck();\n        }\n    }\n    /** Whether the slider is vertical. */\n    get vertical() { return this._vertical; }\n    set vertical(value) {\n        this._vertical = coerceBooleanProperty(value);\n    }\n    /** The value to be used for display purposes. */\n    get displayValue() {\n        if (this.displayWith) {\n            // Value is never null but since setters and getters cannot have\n            // different types, the value getter is also typed to return null.\n            return this.displayWith(this.value);\n        }\n        // Note that this could be improved further by rounding something like 0.999 to 1 or\n        // 0.899 to 0.9, however it is very performance sensitive, because it gets called on\n        // every change detection cycle.\n        if (this._roundToDecimal && this.value && this.value % 1 !== 0) {\n            return this.value.toFixed(this._roundToDecimal);\n        }\n        return this.value || 0;\n    }\n    /** set focus to the host element */\n    focus(options) {\n        this._focusHostElement(options);\n    }\n    /** blur the host element */\n    blur() {\n        this._blurHostElement();\n    }\n    /** The percentage of the slider that coincides with the value. */\n    get percent() { return this._clamp(this._percent); }\n    /**\n     * Whether the axis of the slider is inverted.\n     * (i.e. whether moving the thumb in the positive x or y direction decreases the slider's value).\n     */\n    _shouldInvertAxis() {\n        // Standard non-inverted mode for a vertical slider should be dragging the thumb from bottom to\n        // top. However from a y-axis standpoint this is inverted.\n        return this.vertical ? !this.invert : this.invert;\n    }\n    /** Whether the slider is at its minimum value. */\n    _isMinValue() {\n        return this.percent === 0;\n    }\n    /**\n     * The amount of space to leave between the slider thumb and the track fill & track background\n     * elements.\n     */\n    _getThumbGap() {\n        if (this.disabled) {\n            return DISABLED_THUMB_GAP;\n        }\n        if (this._isMinValue() && !this.thumbLabel) {\n            return this._isActive ? MIN_VALUE_ACTIVE_THUMB_GAP : MIN_VALUE_NONACTIVE_THUMB_GAP;\n        }\n        return 0;\n    }\n    /** CSS styles for the track background element. */\n    _getTrackBackgroundStyles() {\n        const axis = this.vertical ? 'Y' : 'X';\n        const scale = this.vertical ? `1, ${1 - this.percent}, 1` : `${1 - this.percent}, 1, 1`;\n        const sign = this._shouldInvertMouseCoords() ? '-' : '';\n        return {\n            // scale3d avoids some rendering issues in Chrome. See #12071.\n            transform: `translate${axis}(${sign}${this._getThumbGap()}px) scale3d(${scale})`\n        };\n    }\n    /** CSS styles for the track fill element. */\n    _getTrackFillStyles() {\n        const percent = this.percent;\n        const axis = this.vertical ? 'Y' : 'X';\n        const scale = this.vertical ? `1, ${percent}, 1` : `${percent}, 1, 1`;\n        const sign = this._shouldInvertMouseCoords() ? '' : '-';\n        return {\n            // scale3d avoids some rendering issues in Chrome. See #12071.\n            transform: `translate${axis}(${sign}${this._getThumbGap()}px) scale3d(${scale})`,\n            // iOS Safari has a bug where it won't re-render elements which start of as `scale(0)` until\n            // something forces a style recalculation on it. Since we'll end up with `scale(0)` when\n            // the value of the slider is 0, we can easily get into this situation. We force a\n            // recalculation by changing the element's `display` when it goes from 0 to any other value.\n            display: percent === 0 ? 'none' : ''\n        };\n    }\n    /** CSS styles for the ticks container element. */\n    _getTicksContainerStyles() {\n        let axis = this.vertical ? 'Y' : 'X';\n        // For a horizontal slider in RTL languages we push the ticks container off the left edge\n        // instead of the right edge to avoid causing a horizontal scrollbar to appear.\n        let sign = !this.vertical && this._getDirection() == 'rtl' ? '' : '-';\n        let offset = this._tickIntervalPercent / 2 * 100;\n        return {\n            'transform': `translate${axis}(${sign}${offset}%)`\n        };\n    }\n    /** CSS styles for the ticks element. */\n    _getTicksStyles() {\n        let tickSize = this._tickIntervalPercent * 100;\n        let backgroundSize = this.vertical ? `2px ${tickSize}%` : `${tickSize}% 2px`;\n        let axis = this.vertical ? 'Y' : 'X';\n        // Depending on the direction we pushed the ticks container, push the ticks the opposite\n        // direction to re-center them but clip off the end edge. In RTL languages we need to flip the\n        // ticks 180 degrees so we're really cutting off the end edge abd not the start.\n        let sign = !this.vertical && this._getDirection() == 'rtl' ? '-' : '';\n        let rotate = !this.vertical && this._getDirection() == 'rtl' ? ' rotate(180deg)' : '';\n        let styles = {\n            'backgroundSize': backgroundSize,\n            // Without translateZ ticks sometimes jitter as the slider moves on Chrome & Firefox.\n            'transform': `translateZ(0) translate${axis}(${sign}${tickSize / 2}%)${rotate}`\n        };\n        if (this._isMinValue() && this._getThumbGap()) {\n            const shouldInvertAxis = this._shouldInvertAxis();\n            let side;\n            if (this.vertical) {\n                side = shouldInvertAxis ? 'Bottom' : 'Top';\n            }\n            else {\n                side = shouldInvertAxis ? 'Right' : 'Left';\n            }\n            styles[`padding${side}`] = `${this._getThumbGap()}px`;\n        }\n        return styles;\n    }\n    _getThumbContainerStyles() {\n        const shouldInvertAxis = this._shouldInvertAxis();\n        let axis = this.vertical ? 'Y' : 'X';\n        // For a horizontal slider in RTL languages we push the thumb container off the left edge\n        // instead of the right edge to avoid causing a horizontal scrollbar to appear.\n        let invertOffset = (this._getDirection() == 'rtl' && !this.vertical) ? !shouldInvertAxis : shouldInvertAxis;\n        let offset = (invertOffset ? this.percent : 1 - this.percent) * 100;\n        return {\n            'transform': `translate${axis}(-${offset}%)`\n        };\n    }\n    /**\n     * Whether mouse events should be converted to a slider position by calculating their distance\n     * from the right or bottom edge of the slider as opposed to the top or left.\n     */\n    _shouldInvertMouseCoords() {\n        const shouldInvertAxis = this._shouldInvertAxis();\n        return (this._getDirection() == 'rtl' && !this.vertical) ? !shouldInvertAxis : shouldInvertAxis;\n    }\n    /** The language direction for this slider element. */\n    _getDirection() {\n        return (this._dir && this._dir.value == 'rtl') ? 'rtl' : 'ltr';\n    }\n    ngAfterViewInit() {\n        this._focusMonitor\n            .monitor(this._elementRef, true)\n            .subscribe((origin) => {\n            this._isActive = !!origin && origin !== 'keyboard';\n            this._changeDetectorRef.detectChanges();\n        });\n        if (this._dir) {\n            this._dirChangeSubscription = this._dir.change.subscribe(() => {\n                this._changeDetectorRef.markForCheck();\n            });\n        }\n    }\n    ngOnDestroy() {\n        const element = this._elementRef.nativeElement;\n        element.removeEventListener('mousedown', this._pointerDown, activeEventOptions);\n        element.removeEventListener('touchstart', this._pointerDown, activeEventOptions);\n        this._lastPointerEvent = null;\n        this._removeGlobalEvents();\n        this._focusMonitor.stopMonitoring(this._elementRef);\n        this._dirChangeSubscription.unsubscribe();\n    }\n    _onMouseenter() {\n        if (this.disabled) {\n            return;\n        }\n        // We save the dimensions of the slider here so we can use them to update the spacing of the\n        // ticks and determine where on the slider click and slide events happen.\n        this._sliderDimensions = this._getSliderDimensions();\n        this._updateTickIntervalPercent();\n    }\n    _onFocus() {\n        // We save the dimensions of the slider here so we can use them to update the spacing of the\n        // ticks and determine where on the slider click and slide events happen.\n        this._sliderDimensions = this._getSliderDimensions();\n        this._updateTickIntervalPercent();\n    }\n    _onBlur() {\n        this.onTouched();\n    }\n    _onKeydown(event) {\n        if (this.disabled || hasModifierKey(event)) {\n            return;\n        }\n        const oldValue = this.value;\n        switch (event.keyCode) {\n            case PAGE_UP:\n                this._increment(10);\n                break;\n            case PAGE_DOWN:\n                this._increment(-10);\n                break;\n            case END:\n                this.value = this.max;\n                break;\n            case HOME:\n                this.value = this.min;\n                break;\n            case LEFT_ARROW:\n                // NOTE: For a sighted user it would make more sense that when they press an arrow key on an\n                // inverted slider the thumb moves in that direction. However for a blind user, nothing\n                // about the slider indicates that it is inverted. They will expect left to be decrement,\n                // regardless of how it appears on the screen. For speakers ofRTL languages, they probably\n                // expect left to mean increment. Therefore we flip the meaning of the side arrow keys for\n                // RTL. For inverted sliders we prefer a good a11y experience to having it \"look right\" for\n                // sighted users, therefore we do not swap the meaning.\n                this._increment(this._getDirection() == 'rtl' ? 1 : -1);\n                break;\n            case UP_ARROW:\n                this._increment(1);\n                break;\n            case RIGHT_ARROW:\n                // See comment on LEFT_ARROW about the conditions under which we flip the meaning.\n                this._increment(this._getDirection() == 'rtl' ? -1 : 1);\n                break;\n            case DOWN_ARROW:\n                this._increment(-1);\n                break;\n            default:\n                // Return if the key is not one that we explicitly handle to avoid calling preventDefault on\n                // it.\n                return;\n        }\n        if (oldValue != this.value) {\n            this._emitInputEvent();\n            this._emitChangeEvent();\n        }\n        this._isSliding = true;\n        event.preventDefault();\n    }\n    _onKeyup() {\n        this._isSliding = false;\n    }\n    /** Use defaultView of injected document if available or fallback to global window reference */\n    _getWindow() {\n        return this._document.defaultView || window;\n    }\n    /**\n     * Binds our global move and end events. They're bound at the document level and only while\n     * dragging so that the user doesn't have to keep their pointer exactly over the slider\n     * as they're swiping across the screen.\n     */\n    _bindGlobalEvents(triggerEvent) {\n        // Note that we bind the events to the `document`, because it allows us to capture\n        // drag cancel events where the user's pointer is outside the browser window.\n        const document = this._document;\n        const isTouch = isTouchEvent(triggerEvent);\n        const moveEventName = isTouch ? 'touchmove' : 'mousemove';\n        const endEventName = isTouch ? 'touchend' : 'mouseup';\n        document.addEventListener(moveEventName, this._pointerMove, activeEventOptions);\n        document.addEventListener(endEventName, this._pointerUp, activeEventOptions);\n        if (isTouch) {\n            document.addEventListener('touchcancel', this._pointerUp, activeEventOptions);\n        }\n        const window = this._getWindow();\n        if (typeof window !== 'undefined' && window) {\n            window.addEventListener('blur', this._windowBlur);\n        }\n    }\n    /** Removes any global event listeners that we may have added. */\n    _removeGlobalEvents() {\n        const document = this._document;\n        document.removeEventListener('mousemove', this._pointerMove, activeEventOptions);\n        document.removeEventListener('mouseup', this._pointerUp, activeEventOptions);\n        document.removeEventListener('touchmove', this._pointerMove, activeEventOptions);\n        document.removeEventListener('touchend', this._pointerUp, activeEventOptions);\n        document.removeEventListener('touchcancel', this._pointerUp, activeEventOptions);\n        const window = this._getWindow();\n        if (typeof window !== 'undefined' && window) {\n            window.removeEventListener('blur', this._windowBlur);\n        }\n    }\n    /** Increments the slider by the given number of steps (negative number decrements). */\n    _increment(numSteps) {\n        this.value = this._clamp((this.value || 0) + this.step * numSteps, this.min, this.max);\n    }\n    /** Calculate the new value from the new physical location. The value will always be snapped. */\n    _updateValueFromPosition(pos) {\n        if (!this._sliderDimensions) {\n            return;\n        }\n        let offset = this.vertical ? this._sliderDimensions.top : this._sliderDimensions.left;\n        let size = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n        let posComponent = this.vertical ? pos.y : pos.x;\n        // The exact value is calculated from the event and used to find the closest snap value.\n        let percent = this._clamp((posComponent - offset) / size);\n        if (this._shouldInvertMouseCoords()) {\n            percent = 1 - percent;\n        }\n        // Since the steps may not divide cleanly into the max value, if the user\n        // slid to 0 or 100 percent, we jump to the min/max value. This approach\n        // is slightly more intuitive than using `Math.ceil` below, because it\n        // follows the user's pointer closer.\n        if (percent === 0) {\n            this.value = this.min;\n        }\n        else if (percent === 1) {\n            this.value = this.max;\n        }\n        else {\n            const exactValue = this._calculateValue(percent);\n            // This calculation finds the closest step by finding the closest\n            // whole number divisible by the step relative to the min.\n            const closestValue = Math.round((exactValue - this.min) / this.step) * this.step + this.min;\n            // The value needs to snap to the min and max.\n            this.value = this._clamp(closestValue, this.min, this.max);\n        }\n    }\n    /** Emits a change event if the current value is different from the last emitted value. */\n    _emitChangeEvent() {\n        this._controlValueAccessorChangeFn(this.value);\n        this.valueChange.emit(this.value);\n        this.change.emit(this._createChangeEvent());\n    }\n    /** Emits an input event when the current value is different from the last emitted value. */\n    _emitInputEvent() {\n        this.input.emit(this._createChangeEvent());\n    }\n    /** Updates the amount of space between ticks as a percentage of the width of the slider. */\n    _updateTickIntervalPercent() {\n        if (!this.tickInterval || !this._sliderDimensions) {\n            return;\n        }\n        if (this.tickInterval == 'auto') {\n            let trackSize = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n            let pixelsPerStep = trackSize * this.step / (this.max - this.min);\n            let stepsPerTick = Math.ceil(MIN_AUTO_TICK_SEPARATION / pixelsPerStep);\n            let pixelsPerTick = stepsPerTick * this.step;\n            this._tickIntervalPercent = pixelsPerTick / trackSize;\n        }\n        else {\n            this._tickIntervalPercent = this.tickInterval * this.step / (this.max - this.min);\n        }\n    }\n    /** Creates a slider change object from the specified value. */\n    _createChangeEvent(value = this.value) {\n        let event = new MatSliderChange();\n        event.source = this;\n        event.value = value;\n        return event;\n    }\n    /** Calculates the percentage of the slider that a value is. */\n    _calculatePercentage(value) {\n        return ((value || 0) - this.min) / (this.max - this.min);\n    }\n    /** Calculates the value a percentage of the slider corresponds to. */\n    _calculateValue(percentage) {\n        return this.min + percentage * (this.max - this.min);\n    }\n    /** Return a number between two numbers. */\n    _clamp(value, min = 0, max = 1) {\n        return Math.max(min, Math.min(value, max));\n    }\n    /**\n     * Get the bounding client rect of the slider track element.\n     * The track is used rather than the native element to ignore the extra space that the thumb can\n     * take up.\n     */\n    _getSliderDimensions() {\n        return this._sliderWrapper ? this._sliderWrapper.nativeElement.getBoundingClientRect() : null;\n    }\n    /**\n     * Focuses the native element.\n     * Currently only used to allow a blur event to fire but will be used with keyboard input later.\n     */\n    _focusHostElement(options) {\n        this._elementRef.nativeElement.focus(options);\n    }\n    /** Blurs the native element. */\n    _blurHostElement() {\n        this._elementRef.nativeElement.blur();\n    }\n    /**\n     * Sets the model value. Implemented as part of ControlValueAccessor.\n     * @param value\n     */\n    writeValue(value) {\n        this.value = value;\n    }\n    /**\n     * Registers a callback to be triggered when the value has changed.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    registerOnChange(fn) {\n        this._controlValueAccessorChangeFn = fn;\n    }\n    /**\n     * Registers a callback to be triggered when the component is touched.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    registerOnTouched(fn) {\n        this.onTouched = fn;\n    }\n    /**\n     * Sets whether the component should be disabled.\n     * Implemented as part of ControlValueAccessor.\n     * @param isDisabled\n     */\n    setDisabledState(isDisabled) {\n        this.disabled = isDisabled;\n    }\n}\nMatSlider.ɵfac = function MatSlider_Factory(t) { return new (t || MatSlider)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.Directionality, 8), ɵngcc0.ɵɵinjectAttribute('tabindex'), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(DOCUMENT), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8)); };\nMatSlider.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: MatSlider, selectors: [[\"mat-slider\"]], viewQuery: function MatSlider_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(_c0, true);\n    } if (rf & 2) {\n        var _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._sliderWrapper = _t.first);\n    } }, hostAttrs: [\"role\", \"slider\", 1, \"mat-slider\", \"mat-focus-indicator\"], hostVars: 28, hostBindings: function MatSlider_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵlistener(\"focus\", function MatSlider_focus_HostBindingHandler() { return ctx._onFocus(); })(\"blur\", function MatSlider_blur_HostBindingHandler() { return ctx._onBlur(); })(\"keydown\", function MatSlider_keydown_HostBindingHandler($event) { return ctx._onKeydown($event); })(\"keyup\", function MatSlider_keyup_HostBindingHandler() { return ctx._onKeyup(); })(\"mouseenter\", function MatSlider_mouseenter_HostBindingHandler() { return ctx._onMouseenter(); })(\"selectstart\", function MatSlider_selectstart_HostBindingHandler($event) { return $event.preventDefault(); });\n    } if (rf & 2) {\n        ɵngcc0.ɵɵhostProperty(\"tabIndex\", ctx.tabIndex);\n        ɵngcc0.ɵɵattribute(\"aria-disabled\", ctx.disabled)(\"aria-valuemax\", ctx.max)(\"aria-valuemin\", ctx.min)(\"aria-valuenow\", ctx.value)(\"aria-orientation\", ctx.vertical ? \"vertical\" : \"horizontal\");\n        ɵngcc0.ɵɵclassProp(\"mat-slider-disabled\", ctx.disabled)(\"mat-slider-has-ticks\", ctx.tickInterval)(\"mat-slider-horizontal\", !ctx.vertical)(\"mat-slider-axis-inverted\", ctx._shouldInvertAxis())(\"mat-slider-invert-mouse-coords\", ctx._shouldInvertMouseCoords())(\"mat-slider-sliding\", ctx._isSliding)(\"mat-slider-thumb-label-showing\", ctx.thumbLabel)(\"mat-slider-vertical\", ctx.vertical)(\"mat-slider-min-value\", ctx._isMinValue())(\"mat-slider-hide-last-tick\", ctx.disabled || ctx._isMinValue() && ctx._getThumbGap() && ctx._shouldInvertAxis())(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\");\n    } }, inputs: { disabled: \"disabled\", color: \"color\", tabIndex: \"tabIndex\", invert: \"invert\", max: \"max\", min: \"min\", value: \"value\", step: \"step\", thumbLabel: \"thumbLabel\", tickInterval: \"tickInterval\", vertical: \"vertical\", displayWith: \"displayWith\" }, outputs: { change: \"change\", input: \"input\", valueChange: \"valueChange\" }, exportAs: [\"matSlider\"], features: [ɵngcc0.ɵɵProvidersFeature([MAT_SLIDER_VALUE_ACCESSOR]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 13, vars: 6, consts: [[1, \"mat-slider-wrapper\"], [\"sliderWrapper\", \"\"], [1, \"mat-slider-track-wrapper\"], [1, \"mat-slider-track-background\", 3, \"ngStyle\"], [1, \"mat-slider-track-fill\", 3, \"ngStyle\"], [1, \"mat-slider-ticks-container\", 3, \"ngStyle\"], [1, \"mat-slider-ticks\", 3, \"ngStyle\"], [1, \"mat-slider-thumb-container\", 3, \"ngStyle\"], [1, \"mat-slider-focus-ring\"], [1, \"mat-slider-thumb\"], [1, \"mat-slider-thumb-label\"], [1, \"mat-slider-thumb-label-text\"]], template: function MatSlider_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵelementStart(0, \"div\", 0, 1);\n        ɵngcc0.ɵɵelementStart(2, \"div\", 2);\n        ɵngcc0.ɵɵelement(3, \"div\", 3);\n        ɵngcc0.ɵɵelement(4, \"div\", 4);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementStart(5, \"div\", 5);\n        ɵngcc0.ɵɵelement(6, \"div\", 6);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementStart(7, \"div\", 7);\n        ɵngcc0.ɵɵelement(8, \"div\", 8);\n        ɵngcc0.ɵɵelement(9, \"div\", 9);\n        ɵngcc0.ɵɵelementStart(10, \"div\", 10);\n        ɵngcc0.ɵɵelementStart(11, \"span\", 11);\n        ɵngcc0.ɵɵtext(12);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n    } if (rf & 2) {\n        ɵngcc0.ɵɵadvance(3);\n        ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getTrackBackgroundStyles());\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getTrackFillStyles());\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getTicksContainerStyles());\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getTicksStyles());\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getThumbContainerStyles());\n        ɵngcc0.ɵɵadvance(5);\n        ɵngcc0.ɵɵtextInterpolate(ctx.displayValue);\n    } }, directives: [ɵngcc3.NgStyle], styles: [\".mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:none;vertical-align:middle}.mat-slider:not(.mat-slider-disabled):active,.mat-slider.mat-slider-sliding:not(.mat-slider-disabled){cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-wrapper{position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider.cdk-keyboard-focused .mat-slider-focus-ring,.mat-slider.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb{cursor:-webkit-grab;cursor:grab}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(0.7);transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-radius 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.cdk-high-contrast-active .mat-slider-thumb-label{outline:solid 1px}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-sliding .mat-slider-track-fill,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-thumb-container{transition-duration:0ms}.mat-slider-has-ticks .mat-slider-wrapper::after{content:\\\"\\\";position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{display:none}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(0.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.cdk-high-contrast-active .mat-slider-horizontal .mat-slider-ticks-container{height:0;outline:solid 2px;top:1px}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(0.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label,.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label-text{transform:none}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.cdk-high-contrast-active .mat-slider-vertical .mat-slider-ticks-container{width:0;outline:solid 2px;left:1px}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(0.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}.mat-slider._mat-animation-noopable .mat-slider-track-fill,.mat-slider._mat-animation-noopable .mat-slider-track-background,.mat-slider._mat-animation-noopable .mat-slider-ticks,.mat-slider._mat-animation-noopable .mat-slider-thumb-container,.mat-slider._mat-animation-noopable .mat-slider-focus-ring,.mat-slider._mat-animation-noopable .mat-slider-thumb,.mat-slider._mat-animation-noopable .mat-slider-thumb-label,.mat-slider._mat-animation-noopable .mat-slider-thumb-label-text,.mat-slider._mat-animation-noopable .mat-slider-has-ticks .mat-slider-wrapper::after{transition:none}\\n\"], encapsulation: 2, changeDetection: 0 });\nMatSlider.ctorParameters = () => [\n    { type: ElementRef },\n    { type: FocusMonitor },\n    { type: ChangeDetectorRef },\n    { type: Directionality, decorators: [{ type: Optional }] },\n    { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] },\n    { type: NgZone },\n    { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },\n    { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }\n];\nMatSlider.propDecorators = {\n    invert: [{ type: Input }],\n    max: [{ type: Input }],\n    min: [{ type: Input }],\n    step: [{ type: Input }],\n    thumbLabel: [{ type: Input }],\n    tickInterval: [{ type: Input }],\n    value: [{ type: Input }],\n    displayWith: [{ type: Input }],\n    vertical: [{ type: Input }],\n    change: [{ type: Output }],\n    input: [{ type: Output }],\n    valueChange: [{ type: Output }],\n    _sliderWrapper: [{ type: ViewChild, args: ['sliderWrapper',] }]\n};\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MatSlider, [{\n        type: Component,\n        args: [{\n                selector: 'mat-slider',\n                exportAs: 'matSlider',\n                providers: [MAT_SLIDER_VALUE_ACCESSOR],\n                host: {\n                    '(focus)': '_onFocus()',\n                    '(blur)': '_onBlur()',\n                    '(keydown)': '_onKeydown($event)',\n                    '(keyup)': '_onKeyup()',\n                    '(mouseenter)': '_onMouseenter()',\n                    // On Safari starting to slide temporarily triggers text selection mode which\n                    // show the wrong cursor. We prevent it by stopping the `selectstart` event.\n                    '(selectstart)': '$event.preventDefault()',\n                    'class': 'mat-slider mat-focus-indicator',\n                    'role': 'slider',\n                    '[tabIndex]': 'tabIndex',\n                    '[attr.aria-disabled]': 'disabled',\n                    '[attr.aria-valuemax]': 'max',\n                    '[attr.aria-valuemin]': 'min',\n                    '[attr.aria-valuenow]': 'value',\n                    '[attr.aria-orientation]': 'vertical ? \"vertical\" : \"horizontal\"',\n                    '[class.mat-slider-disabled]': 'disabled',\n                    '[class.mat-slider-has-ticks]': 'tickInterval',\n                    '[class.mat-slider-horizontal]': '!vertical',\n                    '[class.mat-slider-axis-inverted]': '_shouldInvertAxis()',\n                    // Class binding which is only used by the test harness as there is no other\n                    // way for the harness to detect if mouse coordinates need to be inverted.\n                    '[class.mat-slider-invert-mouse-coords]': '_shouldInvertMouseCoords()',\n                    '[class.mat-slider-sliding]': '_isSliding',\n                    '[class.mat-slider-thumb-label-showing]': 'thumbLabel',\n                    '[class.mat-slider-vertical]': 'vertical',\n                    '[class.mat-slider-min-value]': '_isMinValue()',\n                    '[class.mat-slider-hide-last-tick]': 'disabled || _isMinValue() && _getThumbGap() && _shouldInvertAxis()',\n                    '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"'\n                },\n                template: \"<div class=\\\"mat-slider-wrapper\\\" #sliderWrapper>\\n  <div class=\\\"mat-slider-track-wrapper\\\">\\n    <div class=\\\"mat-slider-track-background\\\" [ngStyle]=\\\"_getTrackBackgroundStyles()\\\"></div>\\n    <div class=\\\"mat-slider-track-fill\\\" [ngStyle]=\\\"_getTrackFillStyles()\\\"></div>\\n  </div>\\n  <div class=\\\"mat-slider-ticks-container\\\" [ngStyle]=\\\"_getTicksContainerStyles()\\\">\\n    <div class=\\\"mat-slider-ticks\\\" [ngStyle]=\\\"_getTicksStyles()\\\"></div>\\n  </div>\\n  <div class=\\\"mat-slider-thumb-container\\\" [ngStyle]=\\\"_getThumbContainerStyles()\\\">\\n    <div class=\\\"mat-slider-focus-ring\\\"></div>\\n    <div class=\\\"mat-slider-thumb\\\"></div>\\n    <div class=\\\"mat-slider-thumb-label\\\">\\n      <span class=\\\"mat-slider-thumb-label-text\\\">{{displayValue}}</span>\\n    </div>\\n  </div>\\n</div>\\n\",\n                inputs: ['disabled', 'color', 'tabIndex'],\n                encapsulation: ViewEncapsulation.None,\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                styles: [\".mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:none;vertical-align:middle}.mat-slider:not(.mat-slider-disabled):active,.mat-slider.mat-slider-sliding:not(.mat-slider-disabled){cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-wrapper{position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider.cdk-keyboard-focused .mat-slider-focus-ring,.mat-slider.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb{cursor:-webkit-grab;cursor:grab}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(0.7);transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-radius 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.cdk-high-contrast-active .mat-slider-thumb-label{outline:solid 1px}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-sliding .mat-slider-track-fill,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-thumb-container{transition-duration:0ms}.mat-slider-has-ticks .mat-slider-wrapper::after{content:\\\"\\\";position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{display:none}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(0.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.cdk-high-contrast-active .mat-slider-horizontal .mat-slider-ticks-container{height:0;outline:solid 2px;top:1px}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(0.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label,.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label-text{transform:none}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.cdk-high-contrast-active .mat-slider-vertical .mat-slider-ticks-container{width:0;outline:solid 2px;left:1px}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(0.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}.mat-slider._mat-animation-noopable .mat-slider-track-fill,.mat-slider._mat-animation-noopable .mat-slider-track-background,.mat-slider._mat-animation-noopable .mat-slider-ticks,.mat-slider._mat-animation-noopable .mat-slider-thumb-container,.mat-slider._mat-animation-noopable .mat-slider-focus-ring,.mat-slider._mat-animation-noopable .mat-slider-thumb,.mat-slider._mat-animation-noopable .mat-slider-thumb-label,.mat-slider._mat-animation-noopable .mat-slider-thumb-label-text,.mat-slider._mat-animation-noopable .mat-slider-has-ticks .mat-slider-wrapper::after{transition:none}\\n\"]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.FocusMonitor }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc2.Directionality, decorators: [{\n                type: Optional\n            }] }, { type: String, decorators: [{\n                type: Attribute,\n                args: ['tabindex']\n            }] }, { type: ɵngcc0.NgZone }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [DOCUMENT]\n            }] }, { type: String, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [ANIMATION_MODULE_TYPE]\n            }] }]; }, { change: [{\n            type: Output\n        }], input: [{\n            type: Output\n        }], valueChange: [{\n            type: Output\n        }], invert: [{\n            type: Input\n        }], max: [{\n            type: Input\n        }], min: [{\n            type: Input\n        }], value: [{\n            type: Input\n        }], step: [{\n            type: Input\n        }], thumbLabel: [{\n            type: Input\n        }], tickInterval: [{\n            type: Input\n        }], vertical: [{\n            type: Input\n        }], displayWith: [{\n            type: Input\n        }], _sliderWrapper: [{\n            type: ViewChild,\n            args: ['sliderWrapper']\n        }] }); })();\n/** Returns whether an event is a touch event. */\nfunction isTouchEvent(event) {\n    // This function is called for every pixel that the user has dragged so we need it to be\n    // as fast as possible. Since we only bind mouse events and touch events, we can assume\n    // that if the event's name starts with `t`, it's a touch event.\n    return event.type[0] === 't';\n}\n/** Gets the coordinates of a touch or mouse event relative to the viewport. */\nfunction getPointerPositionOnPage(event) {\n    // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.\n    const point = isTouchEvent(event) ? (event.touches[0] || event.changedTouches[0]) : event;\n    return { x: point.clientX, y: point.clientY };\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatSliderModule {\n}\nMatSliderModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: MatSliderModule });\nMatSliderModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function MatSliderModule_Factory(t) { return new (t || MatSliderModule)(); }, imports: [[CommonModule, MatCommonModule], MatCommonModule] });\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatSliderModule, { declarations: function () { return [MatSlider]; }, imports: function () { return [CommonModule, MatCommonModule]; }, exports: function () { return [MatSlider, MatCommonModule]; } }); })();\n/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(MatSliderModule, [{\n        type: NgModule,\n        args: [{\n                imports: [CommonModule, MatCommonModule],\n                exports: [MatSlider, MatCommonModule],\n                declarations: [MatSlider]\n            }]\n    }], null, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_SLIDER_VALUE_ACCESSOR, MatSlider, MatSliderChange, MatSliderModule };\n\n//# sourceMappingURL=slider.js.map","import {Injectable} from '@angular/core';\r\nimport {Router} from '@angular/router';\r\nimport {Settings} from '@common/core/config/settings.service';\r\nimport {Deselect, Navigate, Select, SetConfig} from '@common/shared/appearance/commands/appearance-commands';\r\nimport {AppearanceCommand} from '@common/shared/appearance/commands/appearance-command';\r\nimport {APPEARANCE_TOKEN} from '@common/shared/appearance/appearance-listener.service';\r\nimport {BehaviorSubject, fromEvent, Observable, ReplaySubject} from 'rxjs';\r\nimport {filter, finalize, share} from 'rxjs/operators';\r\nimport {slugifyString} from '@common/core/utils/slugify-string';\r\nimport {CssThemeColors} from '@common/core/types/models/CssTheme';\r\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\r\nimport {Toast} from '@common/core/ui/toast.service';\r\nimport {GenericBackendResponse} from '@common/core/types/backend-response';\r\nimport {removeDuplicateSlashes} from '@common/core/utils/remove-duplicate-slashes';\r\nimport {AppearanceEditorConfig, AppearanceEditorField} from '@common/admin/appearance/appearance-editor-config.token';\r\nimport deepmerge from 'deepmerge';\r\n\r\nexport interface EditorChanges {\r\n    [key: string]: string|number|object;\r\n    colors?: CssThemeColors;\r\n}\r\n\r\n@Injectable({\r\n    providedIn: 'root'\r\n})\r\nexport class AppearanceEditor {\r\n    public activePanel$ = new BehaviorSubject<AppearanceEditorField>(null);\r\n    public defaultSettings: {[key: string]: any} = {};\r\n    public initiated$ = new ReplaySubject(1);\r\n    private previewWindow: Window;\r\n\r\n    public loading$ = new BehaviorSubject<boolean>(false);\r\n    private saveRequest: (changes: EditorChanges) => Observable<void>;\r\n    public changes$ = new BehaviorSubject<EditorChanges>(null);\r\n    public config: AppearanceEditorConfig;\r\n\r\n    constructor(\r\n        private settings: Settings,\r\n        private router: Router,\r\n        private http: AppHttpClient,\r\n        private toast: Toast,\r\n    ) {}\r\n\r\n    public addChanges(value: EditorChanges) {\r\n        this.changes$.next({...this.changes$.value, ...value});\r\n    }\r\n    \r\n    public openPanel(name: string) {\r\n        const panel = this.config.sections.find(value => {\r\n            return slugifyString(value.name) === name;\r\n        });\r\n        this.activePanel$.next(panel);\r\n        this.navigate(panel);\r\n    }\r\n\r\n    public init(iframe: HTMLIFrameElement, defaultSettings: {name: string, value: any}[], config: AppearanceEditorConfig[]) {\r\n        // listen for 'initiated' event from iframe window\r\n        fromEvent(window, 'message')\r\n            .pipe(filter((e: MessageEvent) => {\r\n                return e.data === APPEARANCE_TOKEN && (new URL(e.origin).hostname) === window.location.hostname;\r\n            })).subscribe(() => {\r\n                this.initiated$.next(true);\r\n                this.initiated$.complete();\r\n                if (this.activePanel$.value) {\r\n                    this.navigate(this.activePanel$.value);\r\n                }\r\n            });\r\n\r\n        defaultSettings.forEach(setting => {\r\n            if (setting.name === 'env') {\r\n                this.defaultSettings = {...this.defaultSettings, ...setting.value};\r\n            } else {\r\n                this.defaultSettings[setting.name] = setting.value;\r\n            }\r\n        });\r\n\r\n        this.initConfig(config);\r\n        this.initIframe(iframe);\r\n        return this.initiated$;\r\n    }\r\n\r\n    public saveChanges(changes?: EditorChanges): Observable<unknown> {\r\n        if (changes) {\r\n            this.addChanges(changes);\r\n        }\r\n        this.loading$.next(true);\r\n        const request = this.saveRequest ?\r\n            this.saveRequest :\r\n            c => this.http.post<GenericBackendResponse<any>>('admin/appearance', c);\r\n        const observable = request(this.changes$.value)\r\n            .pipe(\r\n                finalize(() => this.loading$.next(false)),\r\n                share()\r\n            );\r\n            observable.subscribe(() => {\r\n                this.changes$.next(null);\r\n                this.toast.open('Appearance saved');\r\n            });\r\n        return observable;\r\n    }\r\n\r\n    public setSaveRequest(request: (changes: EditorChanges) => Observable<void>) {\r\n        this.saveRequest = request;\r\n    }\r\n\r\n    public closeActivePanel() {\r\n        this.router.navigate(['/admin/appearance']);\r\n    }\r\n\r\n    public navigate(panelConfig: AppearanceEditorField) {\r\n        const route = panelConfig?.route || this.config.defaultRoute;\r\n        this.postMessage(new Navigate(route, panelConfig?.queryParams));\r\n    }\r\n\r\n    public setConfig(key: string, value: string|number) {\r\n        this.postMessage(new SetConfig(key, value));\r\n    }\r\n\r\n    public selectNode(selector: string, index = 0) {\r\n        if ( ! selector) return;\r\n        this.postMessage(new Select(selector, index));\r\n    }\r\n\r\n    public deselectNode() {\r\n        this.postMessage(new Deselect());\r\n    }\r\n\r\n    public postMessage(command: AppearanceCommand) {\r\n        this.previewWindow.postMessage(command, '*');\r\n    }\r\n\r\n    public currentValue(key: string) {\r\n        if (key.startsWith('env.') || key.startsWith('custom-code.')) {\r\n            return this.defaultSettings[key];\r\n        } else {\r\n            return this.settings.get(key);\r\n        }\r\n    }\r\n\r\n    private initConfig(config: AppearanceEditorConfig[]) {\r\n        const merged = deepmerge.all(config) as AppearanceEditorConfig;\r\n        merged.sections = merged.sections.sort((a, b) => (a.position > b.position) ? 1 : -1);\r\n        if ( ! merged.defaultRoute) merged.defaultRoute = '/';\r\n        this.config = merged;\r\n    }\r\n\r\n    private initIframe(iframe: HTMLIFrameElement) {\r\n        const url = this.settings.getBaseUrl() + this.config.defaultRoute + `?be-preview-mode=${APPEARANCE_TOKEN}`;\r\n        iframe.src = removeDuplicateSlashes(url);\r\n        this.previewWindow = iframe.contentWindow;\r\n    }\r\n}\r\n","import {InjectionToken} from '@angular/core';\r\nimport {ComponentType} from '@angular/cdk/portal';\r\nimport {Params} from '@angular/router';\r\n\r\nexport interface AppearanceEditorConfig {\r\n    navigationRoutes: string[];\r\n    defaultRoute?: string;\r\n    sections?: AppearanceEditorField[];\r\n    menus: {\r\n        availableRoutes: string[],\r\n        positions?: string[],\r\n    };\r\n}\r\n\r\nexport interface AppearanceEditorField {\r\n    name: string;\r\n    component?: ComponentType<any>;\r\n    position?: number;\r\n    route?: string;\r\n    queryParams?: Params;\r\n}\r\n\r\nexport const APPEARANCE_EDITOR_CONFIG = new InjectionToken<AppearanceEditorConfig[]>('APPEARANCE_EDITOR_CONFIG');\r\n\r\nexport const DEFAULT_APPEARANCE_EDITOR_CONFIG: AppearanceEditorConfig = {\r\n    navigationRoutes: [],\r\n    menus: {\r\n        availableRoutes: [\r\n            'login',\r\n            'register',\r\n            'contact',\r\n            'billing/pricing',\r\n            'account-settings',\r\n            'admin/appearance',\r\n            'admin/users',\r\n            'admin/settings/authentication',\r\n            'admin/settings/branding',\r\n            'admin/settings/cache',\r\n            'admin/settings/providers',\r\n            'admin/roles',\r\n        ],\r\n        positions: [\r\n            'admin-navbar',\r\n            'custom-page-navbar',\r\n            'auth-page-footer',\r\n        ]\r\n    },\r\n    sections: [\r\n        {name: 'general', position: 1},\r\n        {name: 'themes', position: 2},\r\n        {name: 'menus', position: 3},\r\n        {name: 'custom-code', position: 4},\r\n        {name: 'seo-settings', position: 5}\r\n    ]\r\n};\r\n","import { AppearanceCommand } from './appearance-command';\r\nimport { CommandTypes } from './command-types';\r\nimport {Params} from '@angular/router';\r\n\r\nexport class Navigate implements AppearanceCommand {\r\n    type = CommandTypes.Navigate;\r\n    constructor(public route: string, public queryParams: Params) {}\r\n}\r\n\r\nexport class SetConfig implements AppearanceCommand {\r\n    type = CommandTypes.SetConfig;\r\n    constructor(public key: string, public value: string|number) {}\r\n}\r\n\r\nexport class Select implements AppearanceCommand {\r\n    type = CommandTypes.Select;\r\n    constructor(public selector: string, public index = 0) {}\r\n}\r\n\r\nexport class Deselect implements AppearanceCommand {\r\n    type = CommandTypes.Deselect;\r\n}\r\n\r\nexport class SetColors implements AppearanceCommand {\r\n    type = CommandTypes.SetColors;\r\n    constructor(public key: string, public value: string) {}\r\n}\r\n\r\nexport class SetCustomCss implements AppearanceCommand {\r\n    type = CommandTypes.SetCustomCss;\r\n    constructor(public content: string) {}\r\n}\r\n\r\nexport class SetCustomHtml implements AppearanceCommand {\r\n    type = CommandTypes.SetCustomHtml;\r\n    constructor(public content: string) {}\r\n}\r\n\r\nexport type AllCommands = Navigate | SetConfig | Select;\r\n","export function removeDuplicateSlashes(url: string): string {\r\n    return url.replace(/([^:]\\/)\\/+/g, '$1');\r\n}\r\n","<div class=\"back-button\" (click)=\"back.emit()\">\r\n    <mat-icon svgIcon=\"keyboard-arrow-left\"></mat-icon>\r\n</div>\r\n<div class=\"title\">\r\n    <div class=\"static\" trans>Customizing</div>\r\n    <div class=\"path\">\r\n        <ng-container *ngFor=\"let item of path; last as isLast; first as isFirst;\">\r\n            <span *ngIf=\"item\">\r\n                <mat-icon svgIcon=\"keyboard-arrow-right\" class=\"separator\" *ngIf=\"!isFirst\"></mat-icon>\r\n                <span class=\"name\" [class.last]=\"isLast\" trans>{{viewName(item)}}</span>\r\n            </span>\r\n        </ng-container>\r\n    </div>\r\n</div>","import {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core';\r\nimport {snakeCase} from '@common/core/utils/snake-case';\r\n\r\n@Component({\r\n    selector: 'appearance-panel-meta',\r\n    templateUrl: './appearance-panel-meta.component.html',\r\n    styleUrls: ['./appearance-panel-meta.component.scss'],\r\n    changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppearancePanelMetaComponent {\r\n    @Input() path: string[] = [];\r\n    @Output() back = new EventEmitter();\r\n\r\n    public viewName(name: string) {\r\n        return snakeCase(name).replace(/_/g , ' ');\r\n    }\r\n}\r\n","import {Directive, ElementRef, Input, OnInit} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\n\n@Directive({\n    selector: '[highlightInPreview]'\n})\nexport class HighlightInPreviewDirective implements OnInit {\n    @Input('highlightInPreview') selector: string;\n\n    constructor(\n        private el: ElementRef<HTMLElement>,\n        private editor: AppearanceEditor,\n    ) {}\n\n    public ngOnInit(): void {\n        this.el.nativeElement.addEventListener('focus', () => {\n            this.editor.selectNode(this.selector);\n        });\n\n        this.el.nativeElement.addEventListener('blur', () => {\n            this.editor.deselectNode();\n        });\n    }\n}\n","<div class=\"field-container\" (click)=\"openModal()\">\r\n    <div class=\"label fake-label\" trans><ng-content></ng-content></div>\r\n    <div class=\"img-container\">\r\n        <image-or-icon [src]=\"image\" *ngIf=\"image$ | async as image; else noImage\"></image-or-icon>\r\n\r\n        <ng-template #noImage>\r\n            <div class=\"no-image\">\r\n                <mat-icon svgIcon=\"photo-size-select-actual\"></mat-icon>\r\n                <span class=\"text\" trans>Upload</span>\r\n            </div>\r\n        </ng-template>\r\n\r\n        <div class=\"actions-dropdown\">\r\n            <button class=\"no-style\" [matMenuTriggerFor]=\"actionsMenu\" (click)=\"$event.stopPropagation()\"><mat-icon svgIcon=\"settings\" class=\"trigger-icon\"></mat-icon></button>\r\n\r\n            <mat-menu #actionsMenu>\r\n                <div mat-menu-item (click)=\"remove()\" *ngIf=\"image$ | async\" trans>Remove</div>\r\n                <div mat-menu-item (click)=\"useDefault()\" *ngIf=\"defaultValue\" trans>Use Default</div>\r\n            </mat-menu>\r\n        </div>\r\n    </div>\r\n</div>\r\n<mat-progress-bar mode=\"indeterminate\" color=\"accent\" *ngIf=\"loading$ | async\"></mat-progress-bar>\r\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\r\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\r\nimport {UploadQueueService} from '@common/uploads/upload-queue/upload-queue.service';\r\nimport {AppearanceImageUploadValidator} from '@common/admin/appearance/appearance-image-input/appearance-image-upload-validator';\r\nimport {Settings} from '@common/core/config/settings.service';\r\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\r\nimport {UploadInputTypes} from '@common/uploads/upload-input-config';\r\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\r\nimport {BehaviorSubject} from 'rxjs';\r\nimport {randomString} from '@common/core/utils/random-string';\r\nimport {finalize} from 'rxjs/operators';\r\nimport { UploadUri } from '@common/uploads/types/upload-uri.enum';\r\nimport {UploadApiConfig} from '@common/uploads/types/upload-api-config';\r\n\r\n@Component({\r\n    selector: 'appearance-image-input',\r\n    templateUrl: './appearance-image-input.component.html',\r\n    styleUrls: ['./appearance-image-input.component.scss'],\r\n    host: {'tabindex': '0'},\r\n    changeDetection: ChangeDetectionStrategy.OnPush,\r\n    providers: [UploadQueueService, {\r\n        provide: NG_VALUE_ACCESSOR,\r\n        useExisting: AppearanceImageInputComponent,\r\n        multi: true,\r\n    }]\r\n})\r\nexport class AppearanceImageInputComponent implements ControlValueAccessor {\r\n    @Input() defaultValue: string;\r\n    @Input() backendUri: string;\r\n    @Input() diskPrefix: string;\r\n    private propagateChange: Function;\r\n    public image$ = new BehaviorSubject(null);\r\n    public loading$ = new BehaviorSubject<boolean>(false);\r\n\r\n    constructor(\r\n        private editor: AppearanceEditor,\r\n        private uploadQueue: UploadQueueService,\r\n        private validator: AppearanceImageUploadValidator,\r\n        public settings: Settings,\r\n    ) {\r\n        this.validator.showToast = true;\r\n    }\r\n\r\n    public openModal() {\r\n        const params: UploadApiConfig = {\r\n            uri: this.backendUri || UploadUri.Image,\r\n            httpParams: {diskPrefix: this.diskPrefix},\r\n            validator: this.validator,\r\n        };\r\n        openUploadWindow({types: [UploadInputTypes.image]}).then(files => {\r\n            this.loading$.next(true);\r\n            this.uploadQueue.start(files, params)\r\n                .pipe(finalize(() => this.loading$.next(false)))\r\n                .subscribe(response => {\r\n                    this.updateValue(response.fileEntry.url);\r\n                });\r\n        });\r\n    }\r\n\r\n    public remove() {\r\n        this.updateValue(null);\r\n    }\r\n\r\n    public useDefault() {\r\n        this.updateValue(this.defaultValue);\r\n    }\r\n\r\n    private updateValue(value?: string) {\r\n        this.propagateChange(value);\r\n        // make sure new image is loaded by browser as path will be the same\r\n        this.image$.next(value + `?v=${randomString(8)}`);\r\n    }\r\n\r\n    public writeValue(value: string) {\r\n        this.image$.next(value);\r\n    }\r\n\r\n    public registerOnChange(fn: Function) {\r\n        this.propagateChange = fn;\r\n    }\r\n\r\n    public registerOnTouched() {}\r\n}\r\n","import {ChangeDetectionStrategy, Component, ElementRef, OnDestroy} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BOTTOM_POSITION} from '@common/core/ui/overlay-panel/positions/bottom-position';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {BehaviorSubject, Subscription} from 'rxjs';\n\n@Component({\n    selector: 'color-picker-input',\n    templateUrl: './color-picker-input.component.html',\n    styleUrls: ['./color-picker-input.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [{\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: ColorPickerInputComponent,\n        multi: true,\n    }]\n})\nexport class ColorPickerInputComponent implements OnDestroy, ControlValueAccessor {\n    private pickerSub: Subscription;\n    public propagateChange: Function;\n    public color$ = new BehaviorSubject(null);\n\n    constructor(\n        private overlayPanel: OverlayPanel,\n    ) {}\n\n    public ngOnDestroy(): void {\n        this.pickerSub && this.pickerSub.unsubscribe();\n    }\n\n    public writeValue(value: string) {\n        this.color$.next(value);\n    }\n\n    public registerOnChange(fn: Function) {\n        this.propagateChange = fn;\n    }\n\n    public registerOnTouched() {}\n\n    public async openColorPicker(e: MouseEvent) {\n        const { BeColorPickerModule } = await import('@common/core/ui/color-picker/be-color-picker.module');\n        this.pickerSub = this.overlayPanel.open(\n            BeColorPickerModule.components.panel,\n            {\n                origin: new ElementRef(e.target),\n                position: BOTTOM_POSITION,\n                data: {color: this.color$.value}\n            }\n        ).valueChanged().subscribe(color => {\n            this.color$.next(color);\n            this.propagateChange(this.color$.value);\n        });\n    }\n}\n","<button type=\"button\" class=\"no-style color-picker-btn\" (click)=\"openColorPicker($event)\">\n    <mat-icon svgIcon=\"drop-custom\" class=\"color-icon\" [style.color]=\"color$ | async\"></mat-icon>\n    <span class=\"name\" trans><ng-content></ng-content></span>\n    <span class=\"change\" trans>Change</span>\n</button>","<appearance-panel-meta [path]=\"path$ | async\" (back)=\"openPreviousPanel()\"></appearance-panel-meta>\r\n\r\n<div class=\"appearance-panel-content\">\r\n    <ng-container *ngIf=\"selectedSubpanel$ | async as selectedSubpanel; else mainPanel\">\r\n        <div [ngSwitch]=\"selectedSubpanel\">\r\n            <ng-container *ngSwitchCase=\"'primaryFeatures'\">\r\n                <div *ngFor=\"let group of primaryArray().controls; index as index\" [formGroup]=\"group\"\r\n                     class=\"many-inputs feature-group\">\r\n                    <div class=\"feature-group-header\">\r\n                        <div class=\"text\">{{'Feature' | trans}} #{{index + 1}}</div>\r\n                        <button mat-icon-button color=\"warn\" (click)=\"removeFeature('primary', index)\">\r\n                            <mat-icon svgIcon=\"close\"></mat-icon>\r\n                        </button>\r\n                    </div>\r\n                    <div class=\"input-container\">\r\n                        <label [for]=\"'primary.' + index + '.title'\" trans>Title</label>\r\n                        <input type=\"text\" [id]=\"'primary.' + index + '.title'\" formControlName=\"title\"\r\n                               [placeholder]=\"defaultValue('primaryFeatures.' + index + '.title')\"\r\n                               highlightInPreview=\".inline-feature:nth-child({{index + 1}}) h3\" required>\r\n                    </div>\r\n                    <div class=\"input-container\">\r\n                        <label [for]=\"'primary.' + index + '.subtitle'\" trans>Subtitle</label>\r\n                        <textarea [id]=\"'primary.' + index + '.subtitle'\" formControlName=\"subtitle\"\r\n                               [placeholder]=\"defaultValue('primaryFeatures.' + index + '.subtitle')\"\r\n                                  highlightInPreview=\".inline-feature:nth-child({{index + 1}}) p\" rows=\"3\" required></textarea>\r\n                    </div>\r\n                    <appearance-image-input [defaultValue]=\"defaultValue('primaryFeatures.' + index + '.image')\"\r\n                                            formControlName=\"image\"\r\n                                            diskPrefix=\"homepage\"\r\n                                            highlightInPreview=\".inline-feature:nth-child({{index + 1}}) img\" trans>\r\n                        Image\r\n                    </appearance-image-input>\r\n                </div>\r\n                <button mat-flat-button color=\"accent\" *ngIf=\"primaryArray().length < 3\" (click)=\"addFeature('primary')\" trans>Add</button>\r\n            </ng-container>\r\n            <ng-container *ngSwitchCase=\"'secondaryFeatures'\">\r\n                <div *ngFor=\"let group of secondaryArray().controls; index as index\" [formGroup]=\"group\"\r\n                     class=\"many-inputs feature-group\">\r\n                    <div class=\"feature-group-header\">\r\n                        <div class=\"text\">{{'Feature' | trans}} #{{index + 1}}</div>\r\n                        <button mat-icon-button color=\"warn\" (click)=\"removeFeature('secondary', index)\">\r\n                            <mat-icon svgIcon=\"close\"></mat-icon>\r\n                        </button>\r\n                    </div>\r\n                    <div class=\"input-container\">\r\n                        <label [for]=\"'secondary.' + index + '.title'\" trans>Title</label>\r\n                        <input type=\"text\" [id]=\"'secondary.' + index + '.title'\" formControlName=\"title\"\r\n                               [placeholder]=\"defaultValue('secondaryFeatures.' + index + '.title')\"\r\n                               highlightInPreview=\".big-feature:nth-child({{index + 1}}) h2\" required>\r\n                    </div>\r\n                    <div class=\"input-container\">\r\n                        <label [for]=\"'secondary.' + index + '.subtitle'\" trans>Subtitle</label>\r\n                        <input type=\"text\" [id]=\"'secondary.' + index + '.subtitle'\" formControlName=\"subtitle\"\r\n                               [placeholder]=\"defaultValue('secondaryFeatures.' + index + '.subtitle')\"\r\n                               highlightInPreview=\".big-feature:nth-child({{index + 1}}) small\" required>\r\n                    </div>\r\n                    <div class=\"input-container\">\r\n                        <label [for]=\"'secondary.' + index + '.description'\" trans>Description</label>\r\n                        <textarea type=\"text\" [id]=\"'secondary.' + index + '.description'\" formControlName=\"description\"\r\n                                  rows=\"4\" [placeholder]=\"defaultValue('secondaryFeatures.' + index + '.description')\"\r\n                                  highlightInPreview=\".big-feature:nth-child({{index + 1}}) p\"\r\n                                  required></textarea>\r\n                    </div>\r\n                    <appearance-image-input [defaultValue]=\"defaultValue('secondaryFeatures.' + index + '.image')\"\r\n                                            highlightInPreview=\".big-feature:nth-child({{index + 1}}) img\"\r\n                                            diskPrefix=\"homepage\"\r\n                                            formControlName=\"image\" trans>Image\r\n                    </appearance-image-input>\r\n                </div>\r\n                <button mat-flat-button color=\"accent\" (click)=\"addFeature('secondary')\" trans>Add</button>\r\n            </ng-container>\r\n            <div *ngSwitchCase=\"'actions'\" class=\"many-inputs\" [formGroup]=\"form.get('actions')\">\r\n                <div class=\"input-container\">\r\n                    <label for=\"home.actions.cta1\" trans>Call to Action #1</label>\r\n                    <input type=\"text\" id=\"home.actions.cta1\" formControlName=\"cta1\"\r\n                           highlightInPreview=\".get-started-button\"\r\n                           [placeholder]=\"defaultValue('actions.cta1')\" required>\r\n                </div>\r\n                <div class=\"input-container\">\r\n                    <label for=\"home.actions.cta2\" trans>Call to Action #2</label>\r\n                    <input type=\"text\" id=\"home.actions.cta2\" formControlName=\"cta2\"\r\n                           highlightInPreview=\".learn-more-button\"\r\n                           [placeholder]=\"defaultValue('actions.cta2')\" required>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </ng-container>\r\n\r\n    <ng-template #mainPanel>\r\n        <div [formGroup]=\"form\" class=\"many-inputs\">\r\n            <div class=\"input-container\">\r\n                <label for=\"home.header.title\" trans>Header Title</label>\r\n                <input type=\"text\" id=\"home.header.title\" formControlName=\"headerTitle\"\r\n                       [placeholder]=\"defaultValue('headerTitle')\" highlightInPreview=\".header-title\" required>\r\n            </div>\r\n            <div class=\"input-container\">\r\n                <label for=\"home.header.subtitle\" trans>Header Subtitle</label>\r\n                <textarea type=\"text\" id=\"home.header.subtitle\" formControlName=\"headerSubtitle\" rows=\"4\"\r\n                          [placeholder]=\"defaultValue('headerSubtitle')\" highlightInPreview=\".header-description\"\r\n                          required></textarea>\r\n            </div>\r\n\r\n            <appearance-image-input [defaultValue]=\"defaultValue('headerImage')\"\r\n                                    highlightInPreview=\".hero\"\r\n                                    diskPrefix=\"homepage\"\r\n                                    formControlName=\"headerImage\" trans>Header Image\r\n            </appearance-image-input>\r\n\r\n            <mat-slider min=\"0\" max=\"1\" step=\"0.1\" formControlName=\"headerImageOpacity\" class=\"opacity-slider\"></mat-slider>\r\n\r\n            <color-picker-input formControlName=\"headerOverlayColor1\" trans>Header Overlay Color 1</color-picker-input>\r\n            <color-picker-input formControlName=\"headerOverlayColor2\" trans>Header Overlay Color 2</color-picker-input>\r\n\r\n            <div class=\"separator\"></div>\r\n\r\n            <ul>\r\n                <li (click)=\"openSubpanel('actions')\" class=\"nav-item\">\r\n                    <span class=\"text\" trans>Action Buttons</span>\r\n                    <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\r\n                </li>\r\n                <li (click)=\"openSubpanel('primaryFeatures')\" class=\"nav-item\">\r\n                    <span class=\"text\" trans>Primary Features</span>\r\n                    <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\r\n                </li>\r\n                <li (click)=\"openSubpanel('secondaryFeatures')\" class=\"nav-item\">\r\n                    <span class=\"text\" trans>Secondary Features</span>\r\n                    <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\r\n                </li>\r\n                <li (click)=\"openSubpanel('channels')\" class=\"nav-item\">\r\n                    <span class=\"text\" trans>Channels</span>\r\n                    <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\r\n                </li>\r\n            </ul>\r\n\r\n            <div class=\"separator\"></div>\r\n\r\n            <div class=\"input-container\">\r\n                <label for=\"home.footer.title\" trans>Footer Title</label>\r\n                <input type=\"text\" id=\"home.footer.title\" formControlName=\"footerTitle\"\r\n                       [placeholder]=\"defaultValue('footerTitle')\" highlightInPreview=\".footer-title\" required>\r\n            </div>\r\n            <div class=\"input-container\">\r\n                <label for=\"home.footer.subtitle\" trans>Footer Subtitle</label>\r\n                <textarea type=\"text\" id=\"home.footer.subtitle\" formControlName=\"footerSubtitle\" rows=\"4\"\r\n                          [placeholder]=\"defaultValue('footerSubtitle')\" highlightInPreview=\".footer-description\"\r\n                          required></textarea>\r\n            </div>\r\n            <appearance-image-input [defaultValue]=\"defaultValue('footerImage')\"\r\n                                    highlightInPreview=\".bottom-cta\"\r\n                                    diskPrefix=\"homepage\"\r\n                                    formControlName=\"footerImage\" trans>Footer Image\r\n            </appearance-image-input>\r\n        </div>\r\n    </ng-template>\r\n</div>\r\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {FormArray, FormBuilder} from '@angular/forms';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport {map} from 'rxjs/operators';\nimport * as Dot from 'dot-object';\nimport {HomepageContent} from '../../../dashboard/landing/homepage-content';\n\nconst CONFIG_KEY = 'homepage.appearance';\n\n@Component({\n    selector: 'homepage-appearance-panel',\n    templateUrl: './homepage-appearance-panel.component.html',\n    styleUrls: ['./homepage-appearance-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class HomepageAppearancePanelComponent implements OnInit {\n    public selectedSubpanel$ = new BehaviorSubject<string>(null);\n    public defaultValues: HomepageContent;\n\n    public path$ = this.selectedSubpanel$.pipe(map(panel => {\n        const path = ['Homepage'];\n        if (panel) path.push(panel);\n        return path;\n    }));\n\n    public form = this.fb.group({\n        headerTitle: [''],\n        headerSubtitle: [''],\n        headerImage: [''],\n        headerImageOpacity: [1],\n        headerOverlayColor1: [''],\n        headerOverlayColor2: [''],\n        footerTitle: [''],\n        footerSubtitle: [''],\n        footerImage: [''],\n        actions: this.fb.group({\n            inputText: [''],\n            inputButton: [''],\n            cta1: [''],\n            cta2: [''],\n        }),\n        primaryFeatures: this.fb.array([]),\n        secondaryFeatures: this.fb.array([]),\n        channelIds: this.fb.control([]),\n    });\n\n    constructor(\n        private fb: FormBuilder,\n        private editor: AppearanceEditor,\n        private settings: Settings,\n    ) {}\n\n    ngOnInit() {\n        const data = this.settings.getJson(CONFIG_KEY, {}) as HomepageContent;\n        this.defaultValues = this.editor.defaultSettings[CONFIG_KEY] ? JSON.parse(this.editor.defaultSettings[CONFIG_KEY]) : {};\n\n        (data.primaryFeatures || []).forEach(() => {\n            this.addFeature('primary');\n        });\n        (data.secondaryFeatures || []).forEach(() => {\n            this.addFeature('secondary');\n        });\n\n        this.form.patchValue(data);\n\n        this.form.valueChanges.subscribe(value => {\n            this.editor.setConfig(CONFIG_KEY, value);\n            this.editor.addChanges({[CONFIG_KEY]: value});\n        });\n    }\n\n    public openPreviousPanel() {\n        if (this.selectedSubpanel$.value) {\n            this.openSubpanel(null);\n        } else {\n            this.editor.closeActivePanel();\n        }\n    }\n\n    public openSubpanel(name: string) {\n        this.selectedSubpanel$.next(name);\n    }\n\n    public addFeature(type: 'primary'|'secondary') {\n        const features = this.form.get(`${type}Features`) as FormArray;\n        const data: {[key: string]: string[]} = {title: [''], subtitle: [''], image: ['']};\n        if (type === 'secondary') {\n            data.description = [''];\n        }\n        features.push(this.fb.group(data));\n    }\n\n    public removeFeature(type: 'primary'|'secondary', index: number) {\n        const features = this.form.get(`${type}Features`) as FormArray;\n        features.removeAt(index);\n    }\n\n    public defaultValue(key: string): string {\n        return Dot.pick(key, this.defaultValues) || '';\n    }\n\n    public primaryArray() {\n        return this.form.get('primaryFeatures') as FormArray;\n    }\n\n    public secondaryArray() {\n        return this.form.get('secondaryFeatures') as FormArray;\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ColorPickerInputComponent} from '@common/core/ui/color-picker/color-picker-input/color-picker-input.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {MatIconModule} from '@angular/material/icon';\n\n\n@NgModule({\n    declarations: [\n        ColorPickerInputComponent,\n    ],\n    imports: [\n        CommonModule,\n        TranslationsModule,\n        MatIconModule,\n    ],\n    exports: [\n        ColorPickerInputComponent,\n    ]\n})\nexport class ColorPickerInputModule {\n}\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {FormBuilder} from '@angular/forms';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\n\n@Component({\n    selector: 'general-appearance-panel',\n    templateUrl: './general-appearance-panel.component.html',\n    styleUrls: ['./general-appearance-panel.component.scss'],\n    host: {'class': 'appearance-panel'},\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class GeneralAppearancePanelComponent implements OnInit {\n    public form = this.fb.group({\n        'branding.logo_light': [''],\n        'branding.logo_dark': [''],\n        'branding.favicon': [''],\n        'env.app_name': [''],\n        'branding.site_description': [''],\n    });\n\n    constructor(\n        private fb: FormBuilder,\n        public editor: AppearanceEditor,\n    ) {}\n\n    ngOnInit() {\n        const defaults = {};\n        Object.keys(this.form.controls).forEach(key => {\n          defaults[key] = this.editor.currentValue(key);\n        });\n        this.form.patchValue(defaults);\n\n        this.form.valueChanges.subscribe(value => {\n            this.editor.addChanges(value);\n        });\n    }\n\n    public defaultValue(key: string) {\n        return this.editor.defaultSettings[key];\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {CssTheme} from '@common/core/types/models/CssTheme';\nimport {PaginatedBackendResponse} from '@common/core/types/pagination/paginated-backend-response';\n\nconst BASE_URI = 'css-theme';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class CssThemeService {\n    constructor(private http: AppHttpClient) {}\n\n    public all(): PaginatedBackendResponse<CssTheme> {\n        return this.http.get(BASE_URI);\n    }\n\n    public create(params: Partial<CssTheme>): BackendResponse<{ theme: CssTheme }> {\n        return this.http.post(BASE_URI, params);\n    }\n\n    public update(id, params: Partial<CssTheme>): BackendResponse<{ theme: CssTheme }> {\n        return this.http.put(`${BASE_URI}/${id}`, params);\n    }\n\n    public delete(ids: number[]): BackendResponse<void> {\n        return this.http.delete(`${BASE_URI}/${ids}`);\n    }\n}\n","import {HomepageAppearancePanelComponent} from './homepage-appearance-panel/homepage-appearance-panel.component';\r\nimport {AppearanceEditorConfig} from '../../../common/admin/appearance/appearance-editor-config.token';\r\n\r\nexport const APP_APPEARANCE_CONFIG: AppearanceEditorConfig = {\r\n    defaultRoute: 'dashboard',\r\n    navigationRoutes: [\r\n        'dashboard',\r\n        'dashboard/projects/new',\r\n        'builder',\r\n        'account/settings',\r\n        'admin',\r\n    ],\r\n    menus: {\r\n        availableRoutes: [\r\n            'dashboard',\r\n            'dashboard/projects/new',\r\n        ],\r\n        positions: [\r\n            'dashboard',\r\n            'footer',\r\n        ]\r\n    },\r\n    sections: [\r\n        {\r\n            name: 'landing page',\r\n            component: HomepageAppearancePanelComponent,\r\n            position: 1,\r\n            route: '/',\r\n        }\r\n    ]\r\n};\r\n","<appearance-panel-meta [path]=\"['General']\" (back)=\"editor.closeActivePanel()\"></appearance-panel-meta>\n\n<div [formGroup]=\"form\" class=\"appearance-panel-content many-inputs\">\n    <appearance-image-input [defaultValue]=\"defaultValue('branding.logo_light')\" formControlName=\"branding.logo_light\" diskPrefix=\"branding_media\" highlightInPreview=\".logo\">\n        Logo #1 (For top navbar)\n    </appearance-image-input>\n\n    <appearance-image-input [defaultValue]=\"defaultValue('branding.logo_dark')\" formControlName=\"branding.logo_dark\" diskPrefix=\"branding_media\" highlightInPreview=\".logo\">\n        Logo #2 (Everywhere else)\n    </appearance-image-input>\n\n    <appearance-image-input [defaultValue]=\"defaultValue('branding.favicon')\" backendUri=\"uploads/favicon\" diskPrefix=\"branding_media\" formControlName=\"branding.favicon\">\n        Favicon\n    </appearance-image-input>\n\n    <div class=\"input-container\">\n        <label for=\"env.app_name\" trans>Site Name</label>\n        <input type=\"text\" id=\"env.app_name\" [placeholder]=\"defaultValue('env.app_name')\" formControlName=\"env.app_name\">\n    </div>\n\n    <div class=\"input-container\">\n        <label for=\"branding.site_description\" trans>Site Description</label>\n        <textarea id=\"branding.site_description\" [placeholder]=\"defaultValue('branding.site_description')\" rows=\"4\" formControlName=\"branding.site_description\"></textarea>\n    </div>\n</div>\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title>\n        <span *ngIf=\"data.theme\" trans>Update Theme</span>\n        <span *ngIf=\"!data.theme\" trans>Create Theme</span>\n    </h2>\n    <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<form (ngSubmit)=\"confirm()\" ngNativeValidate [formGroup]=\"form\" *ngIf=\"errors$ | async as errors\">\n    <mat-dialog-content class=\"many-inputs\">\n        <div class=\"input-container\">\n            <label for=\"name\" trans>Name</label>\n            <input type=\"text\" id=\"name\" formControlName=\"name\" required minlength=\"3\">\n            <div class=\"error\" *ngIf=\"errors.name\">{{errors.name}}</div>\n        </div>\n\n        <div class=\"setting-toggle-container\">\n            <mat-slide-toggle id=\"is_dark\" formControlName=\"is_dark\" trans>Dark Theme</mat-slide-toggle>\n            <p trans>Whether this theme has light text on dark background.</p>\n        </div>\n\n        <div class=\"setting-toggle-container\">\n            <mat-slide-toggle id=\"default_dark\" formControlName=\"default_dark\" trans>Default Dark Theme</mat-slide-toggle>\n            <p trans>Whether this theme should be used as default dark theme.</p>\n        </div>\n\n        <div class=\"setting-toggle-container\">\n            <mat-slide-toggle id=\"default_light\" formControlName=\"default_light\" trans>Default Light Theme</mat-slide-toggle>\n            <p trans>Whether this theme should be used as default light theme.</p>\n        </div>\n    </mat-dialog-content>\n\n    <mat-dialog-actions>\n        <button (click)=\"close()\" type=\"button\" mat-button trans>Cancel</button>\n        <button type=\"submit\" mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\" trans>\n            <span *ngIf=\"data.theme; else creating\">Update</span>\n            <ng-template #creating>\n                <span>Create</span>\n            </ng-template>\n        </button>\n    </mat-dialog-actions>\n</form>\n\n\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {FormBuilder} from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {CssTheme} from '@common/core/types/models/CssTheme';\nimport {CssThemeService} from '@common/admin/appearance/panels/themes-appearance-panel/css-theme.service';\nimport {filter} from 'rxjs/operators';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\n\ninterface CrupdateCssThemeModalData {\n    theme: CssTheme;\n}\n\n@Component({\n    selector: 'crupdate-css-theme-modal',\n    templateUrl: './crupdate-css-theme-modal.component.html',\n    styleUrls: ['./crupdate-css-theme-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CrupdateCssThemeModalComponent {\n    public loading$ = new BehaviorSubject(false);\n    public errors$ = new BehaviorSubject<{[K in keyof Partial<CssTheme>]: string}>({});\n    public form = this.fb.group({\n        name: [''],\n        is_dark: [false],\n        default_dark: [false],\n        default_light: [false],\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<CrupdateCssThemeModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateCssThemeModalData,\n        private cssTheme: CssThemeService,\n        private toast: Toast,\n        private fb: FormBuilder,\n    ) {\n        if (data.theme) {\n            this.form.patchValue(data.theme);\n        }\n\n        // make sure \"default_light\" and \"default_dark\"\n        // can't be toggled on at the same time\n        this.form.get('default_dark')\n            .valueChanges\n            .pipe(filter(value => !!value))\n            .subscribe(() => {\n                this.form.get('default_light').setValue(false);\n            });\n        this.form.get('default_light')\n            .valueChanges\n            .pipe(filter(value => !!value))\n            .subscribe(() => {\n                this.form.get('default_dark').setValue(false);\n            });\n    }\n\n    public confirm() {\n        const request = this.data.theme ?\n            this.cssTheme.update(this.data.theme.id, this.form.value) :\n            this.cssTheme.create(this.form.value);\n        request.subscribe(response => {\n            this.toast.open(this.data.theme ? 'Theme updated' : 'Theme created');\n            this.close(response.theme);\n        }, (errResponse: BackendErrorResponse) => this.errors$.next(errResponse.errors));\n    }\n\n    public close(theme?: CssTheme) {\n        this.dialogRef.close(theme);\n    }\n}\n","<ul class=\"unstyled-list\" [formGroup]=\"form\">\n    <li *ngFor=\"let color of theme.colors | keyvalue\">\n        <color-picker-input [formControlName]=\"color.key\" trans>{{viewName(color.key)}}</color-picker-input>\n    </li>\n</ul>\n","import {ChangeDetectionStrategy, Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {CssTheme, CssThemeColors} from '@common/core/types/models/CssTheme';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {SetColors} from '@common/shared/appearance/commands/appearance-commands';\nimport {AppearanceEditor, EditorChanges} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {CssThemeService} from '@common/admin/appearance/panels/themes-appearance-panel/css-theme.service';\n\n@Component({\n    selector: 'css-theme-colors-panel',\n    templateUrl: './css-theme-colors-panel.component.html',\n    styleUrls: ['./css-theme-colors-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CssThemeColorsPanelComponent implements OnInit, OnDestroy {\n    @Input() theme: CssTheme;\n    public form = new FormGroup({});\n    private colorCache: CssThemeColors = {};\n\n    constructor(\n        private editor: AppearanceEditor,\n        private themes: CssThemeService,\n    ) {}\n\n    ngOnInit() {\n        this.editor.setSaveRequest(this.saveColors.bind(this));\n\n        // build form\n        Object.entries(this.theme.colors).forEach(([name, color]) => {\n            this.form.addControl(name, new FormControl(color));\n        });\n\n        this.editor.initiated$.subscribe(() => {\n            this.setColors(this.theme.colors);\n            this.form.valueChanges.subscribe((value: CssThemeColors) => {\n                this.setColors(value);\n                this.editor.addChanges({'colors': value});\n            });\n        });\n    }\n\n    ngOnDestroy() {\n        this.editor.setSaveRequest(null);\n    }\n\n    private saveColors(payload: EditorChanges) {\n        return this.themes.update(this.theme.id, payload);\n    }\n\n    private setColors(colors: CssThemeColors) {\n        Object.entries(colors).forEach(([name, color]) => {\n            // make sure we only set colors that actually changed\n            // to keep performance as good as possible\n            if (this.colorCache[name] !== color) {\n                this.editor.postMessage(new SetColors(name, color));\n                this.colorCache[name] = color;\n            }\n        });\n    }\n\n    public viewName(name: string) {\n        return name.replace('be-', '').replace(/-/g, ' ');\n    }\n}\n","<appearance-panel-meta [path]=\"path$ | async\" (back)=\"openPreviousPanel()\"></appearance-panel-meta>\r\n\r\n<div class=\"appearance-panel-content\">\r\n    <css-theme-colors-panel\r\n            [theme]=\"selectedTheme\"\r\n            *ngIf=\"selectedTheme$ | async as selectedTheme else themesList\"\r\n    ></css-theme-colors-panel>\r\n\r\n    <ng-template #themesList>\r\n        <button mat-raised-button color=\"accent\" type=\"button\" class=\"new-theme-button\" (click)=\"openCrupdateThemeModal()\" trans>New Theme</button>\r\n        <ul class=\"unstyled-list\">\r\n            <li class=\"nav-item\" *ngFor=\"let theme of loadedThemes$ | async\" (click)=\"setSelectedTheme(theme)\">\r\n                <div class=\"name\">{{theme.name}}</div>\r\n                <div class=\"actions\" (click)=\"$event.stopPropagation()\">\r\n                    <button mat-icon-button type=\"button\" (click)=\"setSelectedTheme(theme)\">\r\n                        <mat-icon svgIcon=\"drop-custom\"></mat-icon>\r\n                    </button>\r\n                    <button mat-icon-button type=\"button\" (click)=\"openCrupdateThemeModal(theme);\">\r\n                        <mat-icon svgIcon=\"edit\"></mat-icon>\r\n                    </button>\r\n                    <button mat-icon-button type=\"button\" (click)=\"maybeDeleteThemeModal(theme)\">\r\n                        <mat-icon svgIcon=\"delete\"></mat-icon>\r\n                    </button>\r\n                </div>\r\n            </li>\r\n        </ul>\r\n    </ng-template>\r\n</div>\r\n\r\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay overlay-partial\"></loading-indicator>\r\n","import {ChangeDetectionStrategy, Component, OnDestroy, OnInit} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {CrupdateCssThemeModalComponent} from '@common/admin/appearance/panels/themes-appearance-panel/crupdate-css-theme-modal/crupdate-css-theme-modal.component';\nimport {CssTheme} from '@common/core/types/models/CssTheme';\nimport {CssThemeService} from '@common/admin/appearance/panels/themes-appearance-panel/css-theme.service';\nimport {BehaviorSubject, Subscription} from 'rxjs';\nimport {finalize, map} from 'rxjs/operators';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ActivatedRoute, Router} from '@angular/router';\n\n@Component({\n    selector: 'themes-appearance-panel',\n    templateUrl: './themes-appearance-panel.component.html',\n    styleUrls: ['./themes-appearance-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ThemesAppearancePanelComponent implements OnInit, OnDestroy {\n    public loading$ = new BehaviorSubject<boolean>(false);\n    public loadedThemes$ = new BehaviorSubject<CssTheme[]>([]);\n    public selectedTheme$ = new BehaviorSubject<CssTheme>(null);\n    private querySub: Subscription;\n\n    public path$ = this.selectedTheme$.pipe(map(theme => {\n        const path = ['Themes'];\n        if (theme) path.push(theme.name);\n        return path;\n    }));\n\n    constructor(\n        public appearance: AppearanceEditor,\n        private modal: Modal,\n        private themes: CssThemeService,\n        private toast: Toast,\n        private router: Router,\n        private route: ActivatedRoute,\n    ) {}\n\n    ngOnInit() {\n        this.reloadThemes();\n    }\n\n    ngOnDestroy() {\n        this.querySub && this.querySub.unsubscribe();\n    }\n\n    public openCrupdateThemeModal(theme?: CssTheme) {\n        this.modal.open(CrupdateCssThemeModalComponent, {theme})\n            .afterClosed()\n            .subscribe(newTheme => {\n                if (newTheme) {\n                    this.reloadThemes();\n                }\n            });\n    }\n\n    public setSelectedTheme(theme?: CssTheme) {\n        this.router.navigate([], {queryParams: {theme: theme && theme.id}, queryParamsHandling: 'merge'});\n    }\n\n    public openPreviousPanel() {\n        if (this.selectedTheme$.value) {\n            this.setSelectedTheme();\n        } else {\n            this.appearance.closeActivePanel();\n        }\n    }\n\n    public maybeDeleteThemeModal(theme: CssTheme) {\n        this.modal.show(ConfirmModalComponent, {\n            title: 'Delete Theme',\n            body:  'Are you sure you want to delete this theme?',\n            ok:    'Delete'\n        }).afterClosed().subscribe(confirmed => {\n            if ( ! confirmed) return;\n            this.deleteTheme(theme);\n        });\n    }\n\n    private reloadThemes() {\n        this.loading$.next(true);\n        this.themes.all()\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(response => {\n                this.loadedThemes$.next(response.pagination.data);\n                this.bindToQueryParams();\n            });\n    }\n\n    private deleteTheme(theme: CssTheme) {\n        this.themes.delete([theme.id]).subscribe(() => {\n            this.toast.open('Theme deleted');\n            this.reloadThemes();\n        });\n    }\n\n    private bindToQueryParams() {\n        if (this.querySub) return;\n        this.querySub = this.route.queryParams.subscribe((params: {theme?: string}) => {\n            const theme = this.loadedThemes$.value.find(t => t.id === +params.theme);\n            this.selectedTheme$.next(theme);\n        });\n    }\n}\n","import {Injectable} from '@angular/core';\r\nimport {moveItemInArray} from '@angular/cdk/drag-drop';\r\nimport {Menu} from '@common/core/ui/custom-menu/menu';\r\nimport {Settings} from '@common/core/config/settings.service';\r\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\r\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\r\nimport {BehaviorSubject} from 'rxjs';\r\n\r\n@Injectable({\r\n    providedIn: 'root'\r\n})\r\nexport class MenuEditor {\r\n    public allMenus$ = new BehaviorSubject< Menu[]>([]);\r\n    public activeMenu$ = new BehaviorSubject<Menu>(null);\r\n\r\n    constructor(\r\n        private settings: Settings,\r\n        private appearance: AppearanceEditor,\r\n    ) {}\r\n\r\n    public create() {\r\n        const allMenus = [...this.allMenus$.value];\r\n        this.activeMenu$.next(new Menu({name: 'New Menu'}));\r\n        allMenus.push(this.activeMenu$.value);\r\n        this.allMenus$.next(allMenus);\r\n        this.commitChanges();\r\n    }\r\n\r\n    public reorderActiveMenuItems(previousIndex: number, currentIndex: number) {\r\n        const activeMenu = {...this.activeMenu$.value};\r\n        moveItemInArray(activeMenu.items, previousIndex, currentIndex);\r\n        this.activeMenu$.next(activeMenu);\r\n        this.commitChanges();\r\n    }\r\n\r\n    public deleteActive() {\r\n        const allMenus = [...this.allMenus$.value];\r\n        const i = allMenus.indexOf(this.activeMenu$.value);\r\n        allMenus.splice(i, 1);\r\n        this.activeMenu$.next(null);\r\n        this.allMenus$.next(allMenus);\r\n        this.commitChanges();\r\n    }\r\n\r\n    public addItem(item: MenuItem) {\r\n        const activeMenu = {...this.activeMenu$.value};\r\n        item = this.transformLocalLinksToRoutes(item);\r\n        activeMenu.items.push(item);\r\n        this.activeMenu$.next(activeMenu);\r\n        this.commitChanges();\r\n    }\r\n\r\n    public removeItem(item: MenuItem) {\r\n        const activeMenu = {...this.activeMenu$.value};\r\n        const i = this.activeMenu$.value.items.indexOf(item);\r\n        activeMenu.items.splice(i, 1);\r\n        this.activeMenu$.next(activeMenu);\r\n        this.commitChanges();\r\n    }\r\n\r\n    private transformLocalLinksToRoutes(item: MenuItem): MenuItem {\r\n        const baseUrl = this.settings.getBaseUrl();\r\n\r\n        if (item.type !== 'link' || item.action.indexOf(baseUrl) === -1) return item;\r\n\r\n        item.type = 'route';\r\n        item.action = item.action.replace(this.settings.getBaseUrl(), '');\r\n        return item;\r\n    }\r\n\r\n    public commitChanges() {\r\n        const menus = JSON.stringify(this.allMenus$.value);\r\n        this.appearance.setConfig('menus', menus);\r\n        this.appearance.addChanges({'menus': menus});\r\n    }\r\n\r\n    public setFromJson(json: string) {\r\n        if ( ! json) return;\r\n        const menus = JSON.parse(json);\r\n\r\n        if ( ! menus) return;\r\n\r\n        const allMenus = menus.map(menuData => {\r\n            const menu = new Menu(menuData);\r\n            menu.items = menu.items.map(item => new MenuItem(item));\r\n            return menu;\r\n        });\r\n        this.allMenus$.next(allMenus);\r\n    }\r\n}\r\n","import {Injectable} from '@angular/core';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {MenuItemCategory} from '@common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-category';\nimport {HttpCacheClient} from '@common/core/http/http-cache-client';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class MenuItemCategoriesService {\n    constructor(private http: HttpCacheClient) {}\n\n    public get(): BackendResponse<{categories: MenuItemCategory[]}> {\n        return this.http.getWithCache('admin/appearance/menu-categories');\n    }\n}\n","export class MenuItem {\r\n    id: number|string;\r\n    label: string;\r\n    action: string;\r\n\r\n    // ID for model if action matches to specific model. If action\r\n    // points to a specific custom page, model_id will be that page's ID.\r\n    model_id: number;\r\n    type: 'page' | 'link' | 'route' = 'link';\r\n    order = 1;\r\n    icon: string;\r\n    condition: MenuItemCondition = null;\r\n    target: string = null;\r\n    position = 0;\r\n    activeExact = false;\r\n\r\n    constructor(params: Partial<MenuItem> = {}) {\r\n        for (const name in params) {\r\n            this[name] = params[name];\r\n        }\r\n        this.id = Math.floor(Math.random() * (1000 - 1));\r\n    }\r\n}\r\n\r\nexport type MenuItemCondition = string|string[]|Function;\r\n","<div class=\"header\">\r\n    <span class=\"title\" trans>New Menu Item</span>\r\n    <mat-icon svgIcon=\"close\" (click)=\"close()\"></mat-icon>\r\n</div>\r\n<div class=\"new-item-tabs\">\r\n    <mat-accordion>\r\n        <form (ngSubmit)=\"addLinkMenuItem()\" [formGroup]=\"linkForm\" ngNativeValidate>\r\n            <mat-expansion-panel class=\"mat-elevation-z\">\r\n                <mat-expansion-panel-header><mat-panel-title trans>Link</mat-panel-title></mat-expansion-panel-header>\r\n                <div class=\"many-inputs expansion-panel-content\">\r\n                    <div class=\"input-container\">\r\n                        <label for=\"external-link-url\" trans>URL</label>\r\n                        <input type=\"url\" id=\"external-link-url\" formControlName=\"action\" required>\r\n                    </div>\r\n                    <div class=\"input-container\">\r\n                        <label for=\"external-link-text\" trans>Link Text</label>\r\n                        <input type=\"text\" id=\"external-link-text\" formControlName=\"label\" required>\r\n                    </div>\r\n                </div>\r\n                <mat-action-row>\r\n                    <button mat-button color=\"accent\" type=\"submit\" trans>Add</button>\r\n                </mat-action-row>\r\n            </mat-expansion-panel>\r\n        </form>\r\n        <mat-expansion-panel class=\"mat-elevation-z\">\r\n            <mat-expansion-panel-header><mat-panel-title trans>Route</mat-panel-title></mat-expansion-panel-header>\r\n            <div class=\"items-list expansion-panel-content\">\r\n                <div class=\"item\" *ngFor=\"let route of appearance.config.menus.availableRoutes\"\r\n                     (click)=\"addRouteMenuItem(route)\">{{route}}\r\n                </div>\r\n            </div>\r\n        </mat-expansion-panel>\r\n        <mat-expansion-panel class=\"mat-elevation-z\" *ngFor=\"let category of menuItemCategories\">\r\n            <mat-expansion-panel-header><mat-panel-title trans>{{category.name}}</mat-panel-title></mat-expansion-panel-header>\r\n            <div class=\"items-list expansion-panel-content\">\r\n                <div class=\"item\" *ngFor=\"let item of category.items\" (click)=\"addCustomMenuItem(item)\">{{item.label}}</div>\r\n            </div>\r\n        </mat-expansion-panel>\r\n    </mat-accordion>\r\n</div>","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\r\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\r\nimport {MenuEditor} from '@common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service';\r\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\r\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\r\nimport {FormBuilder} from '@angular/forms';\r\nimport {MenuItemCategory} from '@common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-category';\r\nimport {MenuItemCategoriesService} from '@common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-categories.service';\r\n\r\n@Component({\r\n    selector: 'add-menu-item-panel',\r\n    templateUrl: './add-menu-item-panel.component.html',\r\n    styleUrls: ['./add-menu-item-panel.component.scss'],\r\n    changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddMenuItemPanelComponent implements OnInit {\r\n    public linkForm = this.fb.group({\r\n        action: [''],\r\n        label: [''],\r\n    });\r\n    public menuItemCategories: MenuItemCategory[];\r\n\r\n    constructor(\r\n        public editor: MenuEditor,\r\n        public appearance: AppearanceEditor,\r\n        private overlayPanelRef: OverlayPanelRef,\r\n        private fb: FormBuilder,\r\n        private itemCategories: MenuItemCategoriesService,\r\n    ) {}\r\n\r\n    ngOnInit() {\r\n        this.itemCategories.get().subscribe(response => {\r\n            this.menuItemCategories = response.categories;\r\n        });\r\n    }\r\n\r\n    public addLinkMenuItem() {\r\n        this.editor.addItem(new MenuItem({\r\n            type: 'link',\r\n            label: this.linkForm.value.label,\r\n            action: this.linkForm.value.action,\r\n        }));\r\n\r\n        this.linkForm.reset();\r\n        this.close();\r\n    }\r\n\r\n    public addRouteMenuItem(route: string) {\r\n        this.editor.addItem(new MenuItem({\r\n            type: 'route',\r\n            label: route,\r\n            action: route,\r\n        }));\r\n        this.close();\r\n    }\r\n\r\n    public addCustomMenuItem(item: Partial<MenuItem>) {\r\n        this.editor.addItem(new MenuItem(item));\r\n        this.close();\r\n    }\r\n\r\n    public close() {\r\n        this.overlayPanelRef.close();\r\n    }\r\n}\r\n","<button mat-icon-button (click)=\"selectIcon(icon)\" *ngFor=\"let icon of icons$ | async\">\n  <mat-icon [svgIcon]=\"icon\"></mat-icon>\n</button>\n\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay overlay-partial\"></loading-indicator>","import {ChangeDetectionStrategy, Component, EventEmitter, OnInit, Output} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {finalize} from 'rxjs/operators';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {GenericBackendResponse} from '@common/core/types/backend-response';\nimport {HttpCacheClient} from '@common/core/http/http-cache-client';\n\n@Component({\n    selector: 'icon-selector',\n    templateUrl: './icon-selector.component.html',\n    styleUrls: ['./icon-selector.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconSelectorComponent implements OnInit {\n    public icons$: BehaviorSubject<string[]> = new BehaviorSubject([]);\n    public loading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n\n    @Output() iconSelected = new EventEmitter<string>();\n\n    constructor(\n        private http: HttpCacheClient,\n        private overlayPanelRef: OverlayPanelRef,\n    ) {}\n\n    ngOnInit() {\n        this.loading$.next(true);\n        this.http.get<GenericBackendResponse<{icons: string[]}>>('admin/icons')\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(response => {\n                this.icons$.next(response.icons);\n            });\n    }\n\n    public selectIcon(icon: string) {\n        // component is used inline\n        if (this.iconSelected.observers.length) {\n            this.iconSelected.next(icon);\n        // component is used as overlay panel\n        } else {\n            this.overlayPanelRef.emitValue(icon);\n            this.overlayPanelRef.close();\n        }\n\n    }\n}\n","<div class=\"title\" trans>Menu Items</div>\r\n\r\n<mat-accordion cdkDropList (cdkDropListDropped)=\"reorderMenuItems($event)\" *ngIf=\"menus.activeMenu$ | async as activeMenu; else noActiveMenu\">\r\n    <mat-expansion-panel\r\n            class=\"mat-elevation-z menu-item-container\"\r\n            cdkDrag\r\n            *ngFor=\"let menuItem of activeMenu.items\"\r\n            (opened)=\"toggleMenuItem(menuItem)\"\r\n            (closed)=\"toggleMenuItem(menuItem)\"\r\n            [attr.data-id]=\"menuItem.id\"\r\n    >\r\n        <mat-expansion-panel-header>\r\n            <mat-panel-title>\r\n                <mat-icon class=\"drag-handle\" cdkDragHandle svgIcon=\"drag-handle\"></mat-icon>\r\n                <span class=\"name\">{{menuItem.label}}</span>\r\n            </mat-panel-title>\r\n        </mat-expansion-panel-header>\r\n\r\n        <div class=\"many-inputs menu-item-list\">\r\n            <div class=\"input-container\">\r\n                <label for=\"{{menuItem.id + '-label'}}\" trans>Label</label>\r\n                <input type=\"text\" [(ngModel)]=\"menuItem.label\" id=\"{{menuItem.id + '-label'}}\" (ngModelChange)=\"menus.commitChanges()\">\r\n            </div>\r\n\r\n            <div class=\"input-container\">\r\n                <label for=\"{{menuItem.id + '-type'}}\" trans>Type</label>\r\n                <select [(ngModel)]=\"menuItem.type\" id=\"{{menuItem.id + '-type'}}\" (ngModelChange)=\"menus.commitChanges()\">\r\n                    <option value=\"link\" trans>Link</option>\r\n                    <option value=\"route\" trans>Route</option>\r\n                    <option value=\"page\" trans>Page</option>\r\n                </select>\r\n            </div>\r\n\r\n            <div class=\"input-container\">\r\n                <label for=\"{{menuItem.id + '-action'}}\" trans>Action</label>\r\n                <input type=\"text\" [(ngModel)]=\"menuItem.action\" id=\"{{menuItem.id + '-action'}}\" (ngModelChange)=\"menus.commitChanges()\">\r\n            </div>\r\n\r\n            <div class=\"input-container\">\r\n                <label for=\"{{menuItem.id + '-condition'}}\" trans>Condition</label>\r\n                <select [(ngModel)]=\"menuItem.condition\" id=\"{{menuItem.id + '-condition'}}\" (ngModelChange)=\"menus.commitChanges()\">\r\n                    <option [ngValue]=\"null\" trans>None</option>\r\n                    <option value=\"auth\" trans>Show to Logged in Users Only</option>\r\n                    <option value=\"guest\" trans>Show to Guest Users Only</option>\r\n                    <option value=\"admin\" trans>Show to Admin Only</option>\r\n                </select>\r\n            </div>\r\n\r\n            <div class=\"input-container\">\r\n                <label for=\"{{menuItem.id + '-target'}}\" trans>Open link in</label>\r\n                <select [(ngModel)]=\"menuItem.target\" id=\"{{menuItem.id + '-target'}}\" (ngModelChange)=\"menus.commitChanges()\">\r\n                    <option value=\"_self\" trans>Same Window</option>\r\n                    <option value=\"_blank\" trans>New Window</option>\r\n                </select>\r\n            </div>\r\n\r\n            <div class=\"input-container icon-input-container\" #iconInput (click)=\"openIconSelector(iconInput, menuItem)\">\r\n                <label for=\"{{menuItem.id + '-icon'}}\" trans>Icon</label>\r\n                <input type=\"text\" readonly [(ngModel)]=\"menuItem.icon\" id=\"{{menuItem.id + '-icon'}}\" placeholder=\"(Optional)\" trans-placeholder>\r\n                <mat-icon [svgIcon]=\"menuItem.icon\"></mat-icon>\r\n            </div>\r\n        </div>\r\n\r\n        <mat-action-row>\r\n            <button mat-button color=\"warn\" class=\"delete-button\" (click)=\"confirmMenuItemDeletion()\" trans>Remove</button>\r\n        </mat-action-row>\r\n    </mat-expansion-panel>\r\n</mat-accordion>\r\n\r\n<ng-template #noActiveMenu>\r\n    <div class=\"no-menu-items\" trans>This menu has no items yet.</div>\r\n</ng-template>\r\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnDestroy} from '@angular/core';\r\nimport {Subscription} from 'rxjs';\r\nimport {CdkDragDrop} from '@angular/cdk/drag-drop';\r\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\r\nimport {MenuEditor} from '@common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service';\r\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\r\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\r\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\r\nimport {IconSelectorComponent} from '@common/shared/icon-selector/icon-selector.component';\r\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\r\n\r\n@Component({\r\n    selector: 'menu-items',\r\n    templateUrl: './menu-items.component.html',\r\n    styleUrls: ['./menu-items.component.scss'],\r\n    changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MenuItemsComponent implements OnDestroy {\r\n    public selectedMenuItem: MenuItem;\r\n    public subscriptions: Subscription[] = [];\r\n\r\n    constructor(\r\n        public menus: MenuEditor,\r\n        private modal: Modal,\r\n        private overlayPanel: OverlayPanel,\r\n        private cd: ChangeDetectorRef,\r\n    ) {}\r\n\r\n    ngOnDestroy() {\r\n        this.subscriptions.forEach(subscription => {\r\n            subscription && subscription.unsubscribe();\r\n        });\r\n    }\r\n\r\n    public reorderMenuItems(e: CdkDragDrop<void>) {\r\n        this.menus.reorderActiveMenuItems(e.previousIndex, e.currentIndex);\r\n    }\r\n\r\n    /**\r\n     * Toggle specified menu item settings panel visibility.\r\n     */\r\n    public toggleMenuItem(item: MenuItem) {\r\n        if (this.selectedMenuItem === item) {\r\n            this.selectedMenuItem = null;\r\n        } else {\r\n            this.selectedMenuItem = item;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Ask user to confirm menu item deletion.\r\n     */\r\n    public confirmMenuItemDeletion() {\r\n        this.modal.show(ConfirmModalComponent, {\r\n            title: 'Delete Menu Item',\r\n            body: 'Are you sure you want to delete this menu item?',\r\n            ok: 'Delete'\r\n        }).afterClosed().subscribe(confirmed => {\r\n            if ( ! confirmed) return;\r\n            this.menus.removeItem(this.selectedMenuItem);\r\n            this.selectedMenuItem = null;\r\n        });\r\n    }\r\n\r\n    public openIconSelector(origin: HTMLElement, menuItem: MenuItem) {\r\n        this.overlayPanel.open(IconSelectorComponent, {\r\n            position: RIGHT_POSITION,\r\n            origin: new ElementRef(origin),\r\n        }).valueChanged().subscribe(icon => {\r\n            menuItem.icon = icon;\r\n            this.menus.commitChanges();\r\n            this.cd.detectChanges();\r\n        });\r\n    }\r\n}\r\n","<appearance-panel-meta [path]=\"['Menus', menus.activeMenu$.value && menus.activeMenu$.value.name]\" (back)=\"openPreviousPanel()\"></appearance-panel-meta>\r\n\r\n<div class=\"appearance-panel-content\">\r\n    <div class=\"menu-panel\" *ngIf=\"menus.activeMenu$ | async as activeMenu; else allMenuList\">\r\n        <div class=\"many-inputs menu-settings\">\r\n            <div class=\"input-container\">\r\n                <label for=\"menu-name\" trans>Menu Name</label>\r\n                <input type=\"text\" id=\"menu-name\" [(ngModel)]=\"activeMenu.name\" (ngModelChange)=\"menus.commitChanges()\">\r\n            </div>\r\n\r\n            <div class=\"input-container\">\r\n                <label for=\"menu-position\" trans>Menu Position</label>\r\n                <select id=\"menu-position\" [(ngModel)]=\"activeMenu.position\" (ngModelChange)=\"menus.commitChanges()\">\r\n                    <option [ngValue]=\"position\" *ngFor=\"let position of appearance.config.menus.positions\">{{getDisplayName(position)}}</option>\r\n                </select>\r\n            </div>\r\n        </div>\r\n\r\n        <menu-items></menu-items>\r\n\r\n        <div class=\"action-buttons\">\r\n            <button mat-button color=\"warn\" (click)=\"confirmMenuDeletion()\" trans>Delete Menu</button>\r\n            <button class=\"button flat add-item-button\" mat-button color=\"accent\" (click)=\"openAddItemPanel()\" trans>Add Item</button>\r\n        </div>\r\n    </div>\r\n\r\n    <ng-template #allMenuList>\r\n        <div class=\"menus\">\r\n            <div class=\"menu nav-item\" *ngFor=\"let menu of menus.allMenus$ | async\" (click)=\"setActiveMenu(menu)\">\r\n                <span class=\"name\">{{menu.name}}</span>\r\n                <mat-icon svgIcon=\"keyboard-arrow-right\" class=\"actions\"></mat-icon>\r\n            </div>\r\n\r\n            <div class=\"action-buttons\">\r\n                <button mat-button color=\"accent\" class=\"button primary\" (click)=\"menus.create()\" trans>Add a Menu</button>\r\n            </div>\r\n        </div>\r\n    </ng-template>\r\n</div>","import {ChangeDetectionStrategy, Component, ElementRef} from '@angular/core';\r\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\r\nimport {MenuEditor} from '@common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service';\r\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\r\nimport {Settings} from '@common/core/config/settings.service';\r\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\r\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\r\nimport {AddMenuItemPanelComponent} from '@common/admin/appearance/panels/menus-appearance-panel/menus/add-menu-item-panel/add-menu-item-panel.component';\r\nimport {Menu} from '@common/core/ui/custom-menu/menu';\r\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\r\n\r\n@Component({\r\n    selector: 'menus-appearance-panel',\r\n    templateUrl: './menus-appearance-panel.component.html',\r\n    styleUrls: ['./menus-appearance-panel.component.scss'],\r\n    changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MenusAppearancePanelComponent {\r\n    constructor(\r\n        public appearance: AppearanceEditor,\r\n        public menus: MenuEditor,\r\n        private modal: Modal,\r\n        private settings: Settings,\r\n        private panel: OverlayPanel,\r\n        private el: ElementRef<HTMLElement>,\r\n    ) {\r\n        this.menus.setFromJson(this.settings.get('menus'));\r\n    }\r\n\r\n    public openAddItemPanel() {\r\n        const position = RIGHT_POSITION.slice();\r\n        position[0].offsetX = 10;\r\n        position[1].offsetX = 10;\r\n        this.panel.open(AddMenuItemPanelComponent, {\r\n            position: position,\r\n            origin: this.el,\r\n            panelClass: 'add-menu-item-panel-container'\r\n        });\r\n    }\r\n\r\n    public openPreviousPanel() {\r\n        if (this.menus.activeMenu$.value) {\r\n            this.menus.activeMenu$.next(null);\r\n        } else {\r\n            this.appearance.closeActivePanel();\r\n        }\r\n    }\r\n\r\n    public setActiveMenu(menu: Menu) {\r\n        this.menus.activeMenu$.next(menu);\r\n    }\r\n\r\n    public confirmMenuDeletion() {\r\n        this.modal.show(ConfirmModalComponent, {\r\n            title: 'Delete Menu',\r\n            body: 'Are you sure you want to delete this menu?',\r\n            ok: 'Delete'\r\n        }).afterClosed().subscribe(confirmed => {\r\n            if ( ! confirmed) return;\r\n            this.menus.deleteActive();\r\n        });\r\n    }\r\n\r\n    public getDisplayName(name: string) {\r\n        return name.replace(/-/g, ' ');\r\n    }\r\n}\r\n","<appearance-panel-meta [path]=\"['Seo Settings']\" (back)=\"editor.closeActivePanel()\"></appearance-panel-meta>\n\n<div [formGroup]=\"form\" class=\"appearance-panel-content many-inputs\">\n    <ng-container *ngFor=\"let field of seoFields\">\n        <div class=\"input-container\">\n            <label [for]=\"field.key\" trans>{{field.name}}</label>\n            <textarea type=\"text\" [id]=\"field.key\" [formControlName]=\"field.key\" [placeholder]=\"field.defaultValue\" rows=\"2\"></textarea>\n        </div>\n    </ng-container>\n</div>","import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {FormBuilder} from '@angular/forms';\n\ninterface SeoField {\n    name: string;\n    key: string;\n    defaultValue: string;\n    value: string;\n}\n\n@Component({\n    selector: 'seo-appearance-panel',\n    templateUrl: './seo-appearance-panel.component.html',\n    styleUrls: ['./seo-appearance-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SeoAppearancePanelComponent implements OnInit {\n    public seoFields: SeoField[];\n    public form = this.fb.group({});\n\n    constructor(\n        public editor: AppearanceEditor,\n        private fb: FormBuilder,\n    ) {}\n\n    ngOnInit() {\n        this.seoFields = this.editor.defaultSettings['seo_fields'];\n\n        this.seoFields.forEach(field => {\n            this.form.addControl(field.key, this.fb.control(field.value));\n        });\n\n        this.form.valueChanges.subscribe(value => {\n            this.editor.addChanges(value);\n        });\n    }\n}\n","<div class=\"modal-header\">\r\n    <h2 class=\"modal-title\" mat-dialog-title trans>Code Editor</h2>\r\n    <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\r\n        <mat-icon svgIcon=\"close\"></mat-icon>\r\n    </button>\r\n</div>\r\n\r\n<mat-dialog-content>\r\n    <div class=\"editor-container\">\r\n        <p class=\"info\" *ngIf=\"data.language === 'html'\" trans>If entering javascript, wrap it with &lt;script>&lt;/script> tag.</p>\r\n        <div class=\"editor\" #editor></div>\r\n    </div>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n    <button (click)=\"close()\" type=\"button\" mat-button trans>Cancel</button>\r\n    <button type=\"submit\" mat-raised-button color=\"accent\" (click)=\"confirm()\" [disabled]=\"syntaxInvalid$ | async\" trans>Update</button>\r\n</mat-dialog-actions>\r\n\r\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>","import {ChangeDetectionStrategy, Component, ElementRef, Inject, OnInit, ViewChild} from '@angular/core';\r\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\r\nimport {filter} from 'rxjs/operators';\r\nimport {ESCAPE} from '@angular/cdk/keycodes';\r\nimport {LazyLoaderService} from '@common/core/utils/lazy-loader.service';\r\nimport {BehaviorSubject} from 'rxjs';\r\n\r\ndeclare let ace;\r\n\r\nexport interface CodeEditorModalData {\r\n    contents?: string;\r\n    language: string;\r\n}\r\n\r\n@Component({\r\n    selector: 'code-editor-modal',\r\n    templateUrl: './code-editor-modal.component.html',\r\n    styleUrls: ['./code-editor-modal.component.scss'],\r\n    changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CodeEditorModalComponent implements OnInit {\r\n    @ViewChild('editor', { static: true }) editorEl: ElementRef;\r\n\r\n    public loading$ = new BehaviorSubject<boolean>(false);\r\n    public syntaxInvalid$ = new BehaviorSubject<boolean>(false);\r\n    private editor;\r\n\r\n    constructor(\r\n        private dialogRef: MatDialogRef<CodeEditorModalComponent>,\r\n        @Inject(MAT_DIALOG_DATA) public data: CodeEditorModalData,\r\n        private lazyLoader: LazyLoaderService,\r\n    ) {}\r\n\r\n    ngOnInit() {\r\n        this.initEditor(this.data.contents, this.data.language);\r\n        this.overrideDialogCloseEvents();\r\n    }\r\n\r\n    public confirm() {\r\n        this.close(this.editor.getValue());\r\n    }\r\n\r\n    public close(value?: string) {\r\n        this.dialogRef.close(value);\r\n    }\r\n\r\n    private initEditor(contents: string, language = 'html') {\r\n        this.loading$.next(true);\r\n        this.lazyLoader.loadAsset('js/ace/ace.js', {type: 'js'}).then(() => {\r\n            this.editor = ace.edit(this.editorEl.nativeElement);\r\n            this.editor.getSession().setMode('ace/mode/' + language);\r\n            this.editor.setTheme('ace/theme/chrome');\r\n            this.editor.$blockScrolling = Infinity;\r\n            if (contents) this.editor.setValue(contents, 1);\r\n\r\n            this.editor.getSession().on('changeAnnotation', () => {\r\n                const annotations = this.editor.getSession().getAnnotations() as any[];\r\n\r\n                // hide !doctype syntax error\r\n                if (annotations[0] && /doctype first/.test(annotations[0].text)) {\r\n                    annotations.splice(0, 1);\r\n                    this.editor.getSession().setAnnotations(annotations);\r\n                    return;\r\n                }\r\n\r\n                // prevent editor submit if there are syntax errors\r\n                const syntaxInvalid = this.editor\r\n                    .getSession()\r\n                    .getAnnotations()\r\n                    .filter(a => a.type === 'error')\r\n                    .length > 0;\r\n                this.syntaxInvalid$.next(syntaxInvalid);\r\n            });\r\n            this.loading$.next(false);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Need to always send dialog data, regardless of how it was closed.\r\n     * Angular material does not provide easy way to do this, so\r\n     * we need to override backdrop click and escape key close events.\r\n     */\r\n    private overrideDialogCloseEvents() {\r\n        this.dialogRef.disableClose = true;\r\n\r\n        // close on backdrop click\r\n        this.dialogRef.backdropClick().subscribe(() => {\r\n            this.close();\r\n        });\r\n\r\n        // close on escape key\r\n        this.dialogRef.keydownEvents()\r\n            .pipe(filter(event => event.keyCode === ESCAPE))\r\n            .subscribe(() => this.close());\r\n    }\r\n}\r\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {FormBuilder} from '@angular/forms';\nimport {CodeEditorModalComponent} from '@common/admin/appearance/panels/custom-code-appearance-panel/code-editor-modal/code-editor-modal.component';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {SetCustomCss, SetCustomHtml} from '@common/shared/appearance/commands/appearance-commands';\n\n@Component({\n    selector: 'custom-code-appearance-panel',\n    templateUrl: './custom-code-appearance-panel.component.html',\n    styleUrls: ['./custom-code-appearance-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CustomCodeAppearancePanelComponent implements OnInit {\n    public form = this.fb.group({\n        'custom-code.css': [''],\n        'custom-code.html': [''],\n    });\n\n    constructor(\n        public editor: AppearanceEditor,\n        private fb: FormBuilder,\n        private modal: Modal,\n        private toast: Toast,\n    ) {}\n\n    ngOnInit() {\n        const defaults = {};\n        Object.keys(this.form.controls).forEach(key => {\n            defaults[key] = this.editor.currentValue(key);\n        });\n        this.form.patchValue(defaults);\n    }\n\n    public openModal(type: 'css'|'html') {\n        const key = 'custom-code.' + type;\n        const initialValue = this.form.value[key] || '',\n            params = {contents: this.form.value[key], language: type};\n        this.modal.open(CodeEditorModalComponent, params)\n            .afterClosed()\n            .subscribe(value => {\n                // undefined means user closed modal without clicking \"update\" button\n                if (value === undefined || initialValue === value) return;\n                const newValue = {[key]: value};\n                this.form.patchValue(newValue);\n                this.editor.saveChanges(newValue).subscribe(() => {\n                    this.addCodeToPreview(type, value);\n                    this.toast.open('Custom code saved');\n                });\n            });\n    }\n\n    private addCodeToPreview(type: 'css'|'html', content: string) {\n        if (type === 'css') {\n            this.editor.postMessage(new SetCustomCss(content));\n        } else {\n            this.editor.postMessage(new SetCustomHtml(content));\n        }\n    }\n}\n","<appearance-panel-meta [path]=\"['Custom Code']\" (back)=\"editor.closeActivePanel()\"></appearance-panel-meta>\n\n<div class=\"appearance-panel-content\">\n   <button type=\"button\" class=\"nav-item\" (click)=\"openModal('css')\">\n      <span class=\"text\" trans>Custom CSS</span>\n      <span class=\"actions\" trans>Modify</span>\n   </button>\n   <button class=\"nav-item\" (click)=\"openModal('html')\">\n      <span class=\"text\" trans>Custom HTML & Javascript</span>\n      <span class=\"actions\" trans>Modify</span>\n   </button>\n</div>","<mat-sidenav-container>\r\n    <mat-sidenav [opened]=\"!leftColumnIsHidden\" [mode]=\"(breakpoints.isMobile$ | async) ? 'over' : 'side'\" class=\"sidebar\">\r\n        <div class=\"header\">\r\n            <div class=\"back-button\" (click)=\"closeEditor()\">\r\n                <mat-icon svgIcon=\"close\"></mat-icon>\r\n            </div>\r\n            <div class=\"title\" trans>Appearance Editor</div>\r\n            <button\r\n                    mat-raised-button\r\n                    color=\"accent\"\r\n                    class=\"button primary save-button\"\r\n                    (click)=\"editor.saveChanges()\"\r\n                    [disabled]=\"!(editor.changes$ | async) || (editor.loading$ | async)\"\r\n            >\r\n                <span *ngIf=\"editor.changes$ | async; else saved\" trans>Save</span>\r\n                <ng-template #saved>\r\n                    <span trans>Saved</span>\r\n                </ng-template>\r\n            </button>\r\n        </div>\r\n\r\n        <ng-container *ngIf=\"editor.activePanel$ | async as activePanel; else navigation\">\r\n            <ng-container [ngSwitch]=\"activePanel.name\">\r\n                <general-appearance-panel *ngSwitchCase=\"'general'\"></general-appearance-panel>\r\n                <themes-appearance-panel *ngSwitchCase=\"'themes'\"></themes-appearance-panel>\r\n                <menus-appearance-panel *ngSwitchCase=\"'menus'\"></menus-appearance-panel>\r\n                <seo-appearance-panel *ngSwitchCase=\"'seo-settings'\"></seo-appearance-panel>\r\n                <custom-code-appearance-panel *ngSwitchCase=\"'custom-code'\"></custom-code-appearance-panel>\r\n                <ng-container *ngSwitchDefault>\r\n                    <ng-template *ngIf=\"panelPortal$ | async as portal\" [cdkPortalOutlet]=\"portal\"></ng-template>\r\n                </ng-container>\r\n            </ng-container>\r\n        </ng-container>\r\n\r\n        <ng-template #navigation>\r\n            <div class=\"root-navigation\">\r\n                <a class=\"nav-item\" [routerLink]=\"[]\" [queryParams]=\"{panel: slugify(section.name)}\" *ngFor=\"let section of editor.config.sections\">\r\n                    <span class=\"text\" trans>{{viewName(section.name)}}</span>\r\n                    <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\r\n                </a>\r\n            </div>\r\n        </ng-template>\r\n\r\n    </mat-sidenav>\r\n\r\n    <mat-sidenav-content>\r\n        <div class=\"live-preview\">\r\n            <iframe src=\"about:blank\" #iframe></iframe>\r\n        </div>\r\n    </mat-sidenav-content>\r\n</mat-sidenav-container>\r\n\r\n<button mat-fab (click)=\"toggleLeftSidebar()\" class=\"sidebar-toggle-button\">\r\n    <mat-icon svgIcon=\"edit\"></mat-icon>\r\n</button>","import {\r\n    ChangeDetectionStrategy,\r\n    Component,\r\n    ElementRef,\r\n    Inject,\r\n    OnDestroy,\r\n    OnInit,\r\n    Optional,\r\n    ViewChild\r\n} from '@angular/core';\r\nimport {ActivatedRoute, Router} from '@angular/router';\r\nimport {AppearanceEditor} from './appearance-editor/appearance-editor.service';\r\nimport {slugifyString} from '@common/core/utils/slugify-string';\r\nimport {Subscription} from 'rxjs';\r\nimport {ComponentPortal} from '@angular/cdk/portal';\r\nimport {map} from 'rxjs/operators';\r\nimport {BreakpointsService} from '@common/core/ui/breakpoints.service';\r\nimport {APPEARANCE_EDITOR_CONFIG, AppearanceEditorConfig} from './appearance-editor-config.token';\r\n\r\n@Component({\r\n    selector: 'appearance',\r\n    templateUrl: './appearance.component.html',\r\n    styleUrls: ['./appearance.component.scss'],\r\n    changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppearanceComponent implements OnInit, OnDestroy {\r\n    @ViewChild('iframe', { static: true }) iframe: ElementRef;\r\n    private routerSub: Subscription;\r\n    public leftColumnIsHidden = false;\r\n\r\n    public panelPortal$ = this.editor.activePanel$.pipe(map(panel => {\r\n        return (panel && panel.component) ? new ComponentPortal(panel.component) : null;\r\n    }));\r\n\r\n    constructor(\r\n        public editor: AppearanceEditor,\r\n        private router: Router,\r\n        private route: ActivatedRoute,\r\n        public breakpoints: BreakpointsService,\r\n        @Inject(APPEARANCE_EDITOR_CONFIG) @Optional() public config: AppearanceEditorConfig[],\r\n    ) {}\r\n\r\n    ngOnInit() {\r\n        this.leftColumnIsHidden = this.breakpoints.isMobile$.value;\r\n        this.editor.init(\r\n            this.iframe.nativeElement,\r\n            this.route.snapshot.data.defaultSettings,\r\n            this.config,\r\n        );\r\n        this.routerSub = this.route.queryParams\r\n            .subscribe((params: {panel?: string}) => {\r\n                this.editor.openPanel(params.panel);\r\n            });\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        this.routerSub && this.routerSub.unsubscribe();\r\n    }\r\n\r\n    public closeEditor() {\r\n        this.router.navigate(['admin']);\r\n    }\r\n\r\n    public slugify(str: string) {\r\n        return slugifyString(str);\r\n    }\r\n\r\n    public viewName(name: string) {\r\n        return name.replace('-', ' ');\r\n    }\r\n\r\n    public toggleLeftSidebar() {\r\n        this.leftColumnIsHidden = !this.leftColumnIsHidden;\r\n    }\r\n}\r\n","import {Injectable} from '@angular/core';\r\nimport {CanDeactivate} from '@angular/router';\r\nimport {AppearanceComponent} from './appearance.component';\r\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\r\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\r\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\r\nimport {Observable} from 'rxjs';\r\n\r\n@Injectable({\r\n    providedIn: 'root'\r\n})\r\nexport class CanDeactivateAppearance implements CanDeactivate<AppearanceComponent> {\r\n    constructor(\r\n        private editor: AppearanceEditor,\r\n        private modal: Modal,\r\n    ) {}\r\n\r\n    canDeactivate(): Observable<boolean>|boolean {\r\n        if ( ! this.editor.changes$.value) return true;\r\n\r\n        return this.modal.show(ConfirmModalComponent, {\r\n            title: 'Close Appearance Editor',\r\n            body: 'Are you sure you want to close appearance editor?',\r\n            bodyBold: 'All unsaved changes will be lost.',\r\n            ok: 'Close',\r\n            cancel: 'Stay',\r\n        }).afterClosed();\r\n    }\r\n}\r\n","import {Injectable} from '@angular/core';\r\nimport {ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot} from '@angular/router';\r\nimport {catchError, mergeMap} from 'rxjs/operators';\r\nimport {EMPTY, Observable, of} from 'rxjs';\r\nimport {GenericBackendResponse} from '@common/core/types/backend-response';\r\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\r\n\r\n@Injectable({\r\n    providedIn: 'root'\r\n})\r\nexport class AppearanceEditorResolver implements Resolve<GenericBackendResponse<{[key: string]: any}>> {\r\n    constructor(\r\n        private router: Router,\r\n        private http: AppHttpClient\r\n    ) {}\r\n\r\n    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<GenericBackendResponse<{[key: string]: any}>> {\r\n        return this.http.get<GenericBackendResponse<{[key: string]: any}>>('admin/appearance/values').pipe(\r\n            catchError(() => {\r\n                this.router.navigate(['/admin']);\r\n                return EMPTY;\r\n            }),\r\n            mergeMap(response => {\r\n                if (response) {\r\n                    return of(response);\r\n                } else {\r\n                    this.router.navigate(['/admin']);\r\n                    return EMPTY;\r\n                }\r\n            })\r\n        );\r\n    }\r\n}\r\n\r\n","import {RouterModule, Routes} from '@angular/router';\r\nimport {NgModule} from '@angular/core';\r\nimport {AppearanceComponent} from './appearance.component';\r\nimport {CanDeactivateAppearance} from './can-deactivate-appearance.guard';\r\nimport {AuthGuard} from '../../guards/auth-guard.service';\r\nimport {AppearanceEditorResolver} from './appearance-editor/appearance-editor-resolver.service';\r\n\r\nconst routes: Routes = [\r\n    {\r\n        path: '',\r\n        component: AppearanceComponent,\r\n        data: {permissions: ['appearance.update']},\r\n        resolve: {defaultSettings: AppearanceEditorResolver},\r\n        canActivate: [AuthGuard],\r\n        canDeactivate: [CanDeactivateAppearance],\r\n        children: [\r\n            {path: ''},\r\n            {path: ':panel'},\r\n            {path: ':panel/:activeItem'},\r\n        ]\r\n    },\r\n];\r\n\r\n@NgModule({\r\n    imports: [RouterModule.forChild(routes)],\r\n    exports: [RouterModule]\r\n})\r\nexport class AppearanceRoutingModule {}\r\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {IconSelectorComponent} from '@common/shared/icon-selector/icon-selector.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\n\n\n@NgModule({\n    declarations: [\n        IconSelectorComponent,\n    ],\n    imports: [\n        CommonModule,\n        LoadingIndicatorModule,\n\n        MatButtonModule,\n        MatIconModule,\n    ],\n    exports: [\n        IconSelectorComponent,\n    ]\n})\nexport class IconSelectorModule {\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatSliderModule} from '@angular/material/slider';\nimport {HomepageAppearancePanelComponent} from './homepage-appearance-panel/homepage-appearance-panel.component';\nimport {APPEARANCE_EDITOR_CONFIG} from '../../../common/admin/appearance/appearance-editor-config.token';\nimport {APP_APPEARANCE_CONFIG} from './app-appearance-config';\nimport {ColorPickerInputModule} from '../../../common/core/ui/color-picker/color-picker-input/color-picker-input.module';\nimport {TranslationsModule} from '../../../common/core/translations/translations.module';\nimport {BaseAppearanceModule} from '../../../common/admin/appearance/base-appearance.module';\n\n\n@NgModule({\n    declarations: [\n        HomepageAppearancePanelComponent,\n    ],\n    imports: [\n        CommonModule,\n        BaseAppearanceModule,\n        ReactiveFormsModule,\n        ColorPickerInputModule,\n        TranslationsModule,\n\n        // material\n        MatIconModule,\n        MatButtonModule,\n        TranslationsModule,\n        MatSliderModule,\n    ],\n    providers: [\n        {\n            provide: APPEARANCE_EDITOR_CONFIG,\n            useValue: APP_APPEARANCE_CONFIG,\n            multi: true,\n        }\n    ]\n})\nexport class AppAppearanceModule {\n}\n","import {NgModule} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\r\nimport {AppearanceComponent} from './appearance.component';\r\nimport {MenusAppearancePanelComponent} from './panels/menus-appearance-panel/menus-appearance-panel.component';\r\nimport {AddMenuItemPanelComponent} from './panels/menus-appearance-panel/menus/add-menu-item-panel/add-menu-item-panel.component';\r\nimport {AppearancePanelMetaComponent} from './appearance-panel-meta/appearance-panel-meta.component';\r\nimport {MenuItemsComponent} from './panels/menus-appearance-panel/menus/menu-items/menu-items.component';\r\nimport {AppearanceRoutingModule} from './appearance-routing.module';\r\nimport {CodeEditorModalComponent} from './panels/custom-code-appearance-panel/code-editor-modal/code-editor-modal.component';\r\nimport {ThemesAppearancePanelComponent} from './panels/themes-appearance-panel/themes-appearance-panel.component';\r\nimport {CrupdateCssThemeModalComponent} from './panels/themes-appearance-panel/crupdate-css-theme-modal/crupdate-css-theme-modal.component';\r\nimport {CssThemeColorsPanelComponent} from '@common/admin/appearance/panels/themes-appearance-panel/css-theme-colors-panel/css-theme-colors-panel.component';\r\nimport {GeneralAppearancePanelComponent} from '@common/admin/appearance/panels/general-appearance-panel/general-appearance-panel.component';\r\nimport {HighlightInPreviewDirective} from './highlight-in-preview.directive';\r\nimport {SeoAppearancePanelComponent} from '@common/admin/appearance/panels/seo-appearance-panel/seo-appearance-panel.component';\r\nimport {CustomCodeAppearancePanelComponent} from '@common/admin/appearance/panels/custom-code-appearance-panel/custom-code-appearance-panel.component';\r\nimport {AppearanceImageInputComponent} from '@common/admin/appearance/appearance-image-input/appearance-image-input.component';\r\nimport {IconSelectorModule} from '@common/shared/icon-selector/icon-selector.module';\r\nimport {TranslationsModule} from '@common/core/translations/translations.module';\r\nimport {ImageOrIconModule} from '@common/core/ui/image-or-icon/image-or-icon.module';\r\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\r\nimport {MatMenuModule} from '@angular/material/menu';\r\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\r\nimport {MatIconModule} from '@angular/material/icon';\r\nimport {MatDialogModule} from '@angular/material/dialog';\r\nimport {MatExpansionModule} from '@angular/material/expansion';\r\nimport {DragDropModule} from '@angular/cdk/drag-drop';\r\nimport {MatButtonModule} from '@angular/material/button';\r\nimport {MatSidenavModule} from '@angular/material/sidenav';\r\nimport {ColorPickerInputModule} from '@common/core/ui/color-picker/color-picker-input/color-picker-input.module';\r\nimport {PortalModule} from '@angular/cdk/portal';\r\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\r\nimport {APPEARANCE_EDITOR_CONFIG, DEFAULT_APPEARANCE_EDITOR_CONFIG} from './appearance-editor-config.token';\r\n\r\n@NgModule({\r\n    imports: [\r\n        AppearanceRoutingModule,\r\n        CommonModule,\r\n        FormsModule,\r\n        ReactiveFormsModule,\r\n        IconSelectorModule,\r\n        TranslationsModule,\r\n        ImageOrIconModule,\r\n        LoadingIndicatorModule,\r\n        ColorPickerInputModule,\r\n\r\n        // material\r\n        MatMenuModule,\r\n        MatProgressBarModule,\r\n        MatIconModule,\r\n        MatButtonModule,\r\n        MatDialogModule,\r\n        MatExpansionModule,\r\n        DragDropModule,\r\n        MatSidenavModule,\r\n        PortalModule,\r\n        MatSlideToggleModule,\r\n    ],\r\n    exports: [\r\n        AppearancePanelMetaComponent,\r\n        HighlightInPreviewDirective,\r\n        AppearanceImageInputComponent,\r\n    ],\r\n    declarations: [\r\n        AppearanceComponent,\r\n        AddMenuItemPanelComponent,\r\n        AppearancePanelMetaComponent,\r\n        MenuItemsComponent,\r\n        CodeEditorModalComponent,\r\n        CrupdateCssThemeModalComponent,\r\n        CssThemeColorsPanelComponent,\r\n        AppearanceImageInputComponent,\r\n        MenusAppearancePanelComponent,\r\n        ThemesAppearancePanelComponent,\r\n        GeneralAppearancePanelComponent,\r\n        SeoAppearancePanelComponent,\r\n        CustomCodeAppearancePanelComponent,\r\n        HighlightInPreviewDirective,\r\n    ],\r\n    providers: [\r\n        {\r\n            provide: APPEARANCE_EDITOR_CONFIG,\r\n            useValue: DEFAULT_APPEARANCE_EDITOR_CONFIG,\r\n            multi: true,\r\n        }\r\n    ]\r\n})\r\nexport class BaseAppearanceModule {\r\n}\r\n","import { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\nexport const RIGHT_POSITION: ConnectedPosition[] = [\r\n    {originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 5},\r\n    {originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: 5},\r\n];\r\n"]}

Youez - 2016 - github.com/yon3zu
LinuXploit