%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/graphicd/public_html/vebto/public/client/
Upload File :
Create Path :
Current File : /home/graphicd/public_html/vebto/public/client/171-es5.313990efb48376948193.js.map

{"version":3,"sources":["webpack:///src/common/admin/appearance/appearance-editor-config.token.ts","webpack:///src/common/shared/appearance/commands/appearance-commands.ts","webpack:///src/common/admin/appearance/appearance-editor/appearance-editor.service.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/appearance-image-input/appearance-image-input.component.html","webpack:///src/common/admin/appearance/appearance-image-input/appearance-image-input.component.ts","webpack:///src/common/admin/appearance/highlight-in-preview.directive.ts","webpack:///src/common/admin/appearance/panels/general-appearance-panel/general-appearance-panel.component.ts","webpack:///src/common/admin/appearance/panels/general-appearance-panel/general-appearance-panel.component.html","webpack:///src/common/admin/appearance/panels/themes-appearance-panel/css-theme.service.ts","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/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/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/core/ui/custom-menu/menu-item.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/admin/appearance/panels/menus-appearance-panel/menus/add-menu-item-panel/select-menu-item-action.component.html","webpack:///src/common/admin/appearance/panels/menus-appearance-panel/menus/add-menu-item-panel/select-menu-item-action.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/appearance-editor/appearance-editor-resolver.service.ts","webpack:///src/common/admin/appearance/can-deactivate-appearance.guard.ts","webpack:///src/common/admin/appearance/appearance-routing.module.ts","webpack:///src/common/shared/icon-selector/icon-selector.module.ts","webpack:///src/common/core/ui/color-picker/color-picker-input/color-picker-input.module.ts","webpack:///src/common/admin/appearance/base-appearance.module.ts","webpack:///node_modules/@angular/material/__ivy_ngcc__/fesm2015/slider.js","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/app/admin/appearance/app-appearance.module.ts","webpack:///src/app/admin/appearance/app-appearance-config.ts","webpack:///src/common/core/ui/overlay-panel/positions/right-position.ts"],"names":["APPEARANCE_EDITOR_CONFIG","DEFAULT_APPEARANCE_EDITOR_CONFIG","navigationRoutes","menus","availableRoutes","positions","sections","name","position","Navigate","route","queryParams","type","SetConfig","key","value","Select","selector","index","Deselect","SetColors","SetCustomCss","content","SetCustomHtml","AppearanceEditor","settings","router","http","toast","activePanel$","BehaviorSubject","defaultSettings","initiated$","ReplaySubject","loading$","changes$","this","next","panel","config","find","navigate","iframe","fromEvent","window","pipe","filter","e","data","URL","origin","hostname","location","subscribe","complete","forEach","setting","initConfig","initIframe","changes","addChanges","observable","saveRequest","c","post","finalize","share","open","request","panelConfig","postMessage","defaultRoute","command","previewWindow","startsWith","get","merged","sort","a","b","push","url","getBaseUrl","src","replace","contentWindow","AppearancePanelMetaComponent","path","back","AppearanceImageInputComponent","editor","uploadQueue","validator","image$","showToast","params","uri","backendUri","httpParams","diskPrefix","types","then","files","start","response","updateValue","fileEntry","defaultValue","val","propagateChange","fn","provide","useExisting","multi","openModal","$event","stopPropagation","HighlightInPreviewDirective","el","nativeElement","addEventListener","selectNode","deselectNode","GeneralAppearancePanelComponent","fb","form","group","defaults","Object","keys","controls","currentValue","patchValue","valueChanges","CssThemeService","id","put","ids","CrupdateCssThemeModalComponent","dialogRef","cssTheme","errors$","is_dark","default_dark","default_light","theme","setValue","update","create","close","errResponse","errors","ColorPickerInputComponent","overlayPanel","color$","pickerSub","unsubscribe","BeColorPickerModule","components","target","color","valueChanged","openColorPicker","CssThemeColorsPanelComponent","themes","colorCache","setSaveRequest","saveColors","bind","entries","colors","addControl","setColors","payload","ThemesAppearancePanelComponent","appearance","modal","loadedThemes$","selectedTheme$","path$","map","reloadThemes","querySub","afterClosed","newTheme","queryParamsHandling","setSelectedTheme","closeActivePanel","show","title","body","ok","confirmed","deleteTheme","all","pagination","bindToQueryParams","t","openPreviousPanel","MenuItem","condition","activeExact","Math","floor","random","MenuEditor","allMenus$","activeMenu$","allMenus","commitChanges","previousIndex","currentIndex","activeMenu","items","i","indexOf","splice","item","transformLocalLinksToRoutes","baseUrl","action","JSON","stringify","setConfig","json","parse","menuData","menu","MenuItemCategoriesService","getWithCache","SelectMenuItemActionComponent","overlayPanelRef","itemCategories","linkForm","label","menuItemCategories","categories","destination","addLinkMenuItem","IconSelectorComponent","icons$","iconSelected","icons","icon","observers","length","emitValue","MenuItemsComponent","cd","subscriptions","subscription","reorderActiveMenuItems","selectedMenuItem","removeItem","menuItem","detectChanges","MenusAppearancePanelComponent","setFromJson","offsetX","panelClass","addItem","deleteActive","SeoAppearancePanelComponent","seoFields","field","control","CodeEditorModalComponent","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","event","keyCode","confirm","CustomCodeAppearancePanelComponent","initialValue","newValue","saveChanges","addCodeToPreview","AppearanceEditorResolver","AppearanceComponent","breakpoints","panelPortal$","component","init","snapshot","routerSub","openPanel","str","closeEditor","sidenav","CanDeactivateAppearance","bodyBold","cancel","routes","permissions","resolve","state","catchError","E","mergeMap","of","canActivate","canDeactivate","children","AppearanceRoutingModule","IconSelectorModule","ColorPickerInputModule","BaseAppearanceModule","useValue","_c0","activeEventOptions","normalizePassiveListenerOptions","passive","MAT_SLIDER_VALUE_ACCESSOR","NG_VALUE_ACCESSOR","forwardRef","MatSlider","MatSliderChange","_MatSliderMixinBase","mixinTabIndex","mixinColor","mixinDisabled","constructor","_elementRef","elementRef","_focusMonitor","_changeDetectorRef","_dir","tabIndex","_ngZone","_document","_animationMode","super","_invert","_max","_min","_step","_thumbLabel","_tickInterval","_value","_vertical","change","EventEmitter","input","valueChange","onTouched","_percent","_isSliding","_isActive","_tickIntervalPercent","_sliderDimensions","_controlValueAccessorChangeFn","_dirChangeSubscription","Subscription","_pointerDown","disabled","isTouchEvent","button","run","oldValue","pointerPosition","getPointerPositionOnPage","_lastPointerEvent","preventDefault","_focusHostElement","_onMouseenter","_bindGlobalEvents","_updateValueFromPosition","_valueOnSlideStart","_emitInputEvent","_pointerMove","_pointerUp","_removeGlobalEvents","_emitChangeEvent","_windowBlur","parseInt","runOutsideAngular","element","coerceBooleanProperty","v","coerceNumberProperty","_calculatePercentage","markForCheck","_roundToDecimal","toString","split","pop","min","max","parseFloat","toFixed","displayWith","focus","options","blur","_blurHostElement","_clamp","_shouldInvertAxis","vertical","invert","_isMinValue","percent","_getThumbGap","thumbLabel","_getTrackBackgroundStyles","scale","transform","_shouldInvertMouseCoords","_getTrackFillStyles","display","_getTicksContainerStyles","_getDirection","_getTicksStyles","tickSize","styles","side","shouldInvertAxis","_getThumbContainerStyles","ngAfterViewInit","monitor","ngOnDestroy","removeEventListener","stopMonitoring","_getSliderDimensions","_updateTickIntervalPercent","_onFocus","_onBlur","_onKeydown","hasModifierKey","PAGE_UP","_increment","PAGE_DOWN","END","HOME","LEFT_ARROW","UP_ARROW","RIGHT_ARROW","DOWN_ARROW","_onKeyup","_getWindow","defaultView","triggerEvent","document","isTouch","endEventName","numSteps","step","pos","y","x","top","left","height","width","exactValue","_calculateValue","closestValue","round","emit","_createChangeEvent","tickInterval","trackSize","stepsPerTick","ceil","source","percentage","_sliderWrapper","getBoundingClientRect","writeValue","registerOnChange","registerOnTouched","setDisabledState","isDisabled","ɵfac","ɵngcc0","ɵngcc1","ɵngcc2","DOCUMENT","ANIMATION_MODULE_TYPE","ɵcmp","selectors","viewQuery","rf","ctx","_t","first","hostAttrs","hostVars","hostBindings","valueText","displayValue","inputs","outputs","exportAs","features","decls","vars","consts","template","directives","ɵngcc3","encapsulation","changeDetection","point","touches","changedTouches","clientX","clientY","MatSliderModule","ɵmod","ɵinj","imports","CommonModule","MatCommonModule","HomepageAppearancePanelComponent","AppAppearanceModule","CONFIG_KEY","APP_APPEARANCE_CONFIG","selectedSubpanel$","headerTitle","headerSubtitle","headerImage","headerImageOpacity","headerOverlayColor1","headerOverlayColor2","footerTitle","footerSubtitle","footerImage","actions","cta1","cta2","cta3","primaryFeatures","array","secondaryFeatures","getJson","defaultValues","addFeature","openSubpanel","subtitle","image","description","removeAt","RIGHT_POSITION","originX","originY","overlayX","overlayY"],"mappings":"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","file":"x","sourcesContent":["import {InjectionToken} from '@angular/core';\nimport {ComponentType} from '@angular/cdk/portal';\nimport {Params} from '@angular/router';\n\nexport interface AppearanceEditorConfig {\n    navigationRoutes: string[];\n    defaultRoute?: string;\n    sections?: AppearanceEditorField[];\n    menus: {\n        availableRoutes: string[],\n        positions?: string[],\n    };\n}\n\nexport interface AppearanceEditorField {\n    name: string;\n    component?: ComponentType<any>;\n    position?: number;\n    route?: string;\n    queryParams?: Params;\n}\n\nexport const APPEARANCE_EDITOR_CONFIG = new InjectionToken<AppearanceEditorConfig[]>('APPEARANCE_EDITOR_CONFIG');\n\nexport const DEFAULT_APPEARANCE_EDITOR_CONFIG: AppearanceEditorConfig = {\n    navigationRoutes: [],\n    menus: {\n        availableRoutes: [\n            'login',\n            'register',\n            'contact',\n            'billing/pricing',\n            'account-settings',\n            'admin/appearance',\n            'admin/users',\n            'admin/settings/authentication',\n            'admin/settings/branding',\n            'admin/settings/cache',\n            'admin/settings/providers',\n            'admin/roles',\n        ],\n        positions: [\n            'admin-navbar',\n            'custom-page-navbar',\n            'auth-page-footer',\n        ]\n    },\n    sections: [\n        {name: 'general', position: 1},\n        {name: 'themes', position: 2},\n        {name: 'menus', position: 3},\n        {name: 'custom-code', position: 4},\n        {name: 'seo-settings', position: 5}\n    ]\n};\n","import { AppearanceCommand } from './appearance-command';\nimport { CommandTypes } from './command-types';\nimport {Params} from '@angular/router';\n\nexport class Navigate implements AppearanceCommand {\n    type = CommandTypes.Navigate;\n    constructor(public route: string, public queryParams: Params) {}\n}\n\nexport class SetConfig implements AppearanceCommand {\n    type = CommandTypes.SetConfig;\n    constructor(public key: string, public value: string|number) {}\n}\n\nexport class Select implements AppearanceCommand {\n    type = CommandTypes.Select;\n    constructor(public selector: string, public index = 0) {}\n}\n\nexport class Deselect implements AppearanceCommand {\n    type = CommandTypes.Deselect;\n}\n\nexport class SetColors implements AppearanceCommand {\n    type = CommandTypes.SetColors;\n    constructor(public key: string, public value: string) {}\n}\n\nexport class SetCustomCss implements AppearanceCommand {\n    type = CommandTypes.SetCustomCss;\n    constructor(public content: string) {}\n}\n\nexport class SetCustomHtml implements AppearanceCommand {\n    type = CommandTypes.SetCustomHtml;\n    constructor(public content: string) {}\n}\n\nexport type AllCommands = Navigate | SetConfig | Select;\n","import {Injectable} from '@angular/core';\nimport {Router} from '@angular/router';\nimport {Settings} from '@common/core/config/settings.service';\nimport {Deselect, Navigate, Select, SetConfig} from '@common/shared/appearance/commands/appearance-commands';\nimport {AppearanceCommand} from '@common/shared/appearance/commands/appearance-command';\nimport {APPEARANCE_TOKEN} from '@common/shared/appearance/appearance-listener.service';\nimport {BehaviorSubject, fromEvent, Observable, ReplaySubject} from 'rxjs';\nimport {filter, finalize, share} from 'rxjs/operators';\nimport {slugifyString} from '@common/core/utils/slugify-string';\nimport {CssThemeColors} from '@common/core/types/models/CssTheme';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {GenericBackendResponse} from '@common/core/types/backend-response';\nimport {removeDuplicateSlashes} from '@common/core/utils/remove-duplicate-slashes';\nimport {AppearanceEditorConfig, AppearanceEditorField} from '@common/admin/appearance/appearance-editor-config.token';\nimport deepmerge from 'deepmerge';\n\nexport interface EditorChanges {\n    [key: string]: string|number|object;\n    colors?: CssThemeColors;\n}\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class AppearanceEditor {\n    public activePanel$ = new BehaviorSubject<AppearanceEditorField>(null);\n    public defaultSettings: {[key: string]: any} = {};\n    public initiated$ = new ReplaySubject(1);\n    private previewWindow: Window;\n\n    public loading$ = new BehaviorSubject<boolean>(false);\n    private saveRequest: (changes: EditorChanges) => Observable<void>;\n    public changes$ = new BehaviorSubject<EditorChanges>(null);\n    public config: AppearanceEditorConfig;\n\n    constructor(\n        private settings: Settings,\n        private router: Router,\n        private http: AppHttpClient,\n        private toast: Toast,\n    ) {}\n\n    public addChanges(value: EditorChanges) {\n        this.changes$.next({...this.changes$.value, ...value});\n    }\n    \n    public openPanel(name: string) {\n        const panel = this.config.sections.find(value => {\n            return slugifyString(value.name) === name;\n        });\n        this.activePanel$.next(panel);\n        this.navigate(panel);\n    }\n\n    public init(iframe: HTMLIFrameElement, defaultSettings: {name: string, value: any}[], config: AppearanceEditorConfig[]) {\n        // listen for 'initiated' event from iframe window\n        fromEvent(window, 'message')\n            .pipe(filter((e: MessageEvent) => {\n                return e.data === APPEARANCE_TOKEN && (new URL(e.origin).hostname) === window.location.hostname;\n            })).subscribe(() => {\n                this.initiated$.next(true);\n                this.initiated$.complete();\n                if (this.activePanel$.value) {\n                    this.navigate(this.activePanel$.value);\n                }\n            });\n\n        defaultSettings.forEach(setting => {\n            if (setting.name === 'env') {\n                this.defaultSettings = {...this.defaultSettings, ...setting.value};\n            } else {\n                this.defaultSettings[setting.name] = setting.value;\n            }\n        });\n\n        this.initConfig(config);\n        this.initIframe(iframe);\n        return this.initiated$;\n    }\n\n    public saveChanges(changes?: EditorChanges): Observable<unknown> {\n        if (changes) {\n            this.addChanges(changes);\n        }\n        this.loading$.next(true);\n        const request = this.saveRequest ?\n            this.saveRequest :\n            c => this.http.post<GenericBackendResponse<any>>('admin/appearance', c);\n        const observable = request(this.changes$.value)\n            .pipe(\n                finalize(() => this.loading$.next(false)),\n                share()\n            );\n            observable.subscribe(() => {\n                this.changes$.next(null);\n                this.toast.open('Appearance saved');\n            });\n        return observable;\n    }\n\n    public setSaveRequest(request: (changes: EditorChanges) => Observable<void>) {\n        this.saveRequest = request;\n    }\n\n    public closeActivePanel() {\n        this.router.navigate(['/admin/appearance']);\n    }\n\n    public navigate(panelConfig: AppearanceEditorField) {\n        const route = panelConfig?.route || this.config.defaultRoute;\n        this.postMessage(new Navigate(route, panelConfig?.queryParams));\n    }\n\n    public setConfig(key: string, value: string|number) {\n        this.postMessage(new SetConfig(key, value));\n    }\n\n    public selectNode(selector: string, index = 0) {\n        if ( ! selector) return;\n        this.postMessage(new Select(selector, index));\n    }\n\n    public deselectNode() {\n        this.postMessage(new Deselect());\n    }\n\n    public postMessage(command: AppearanceCommand) {\n        this.previewWindow.postMessage(command, '*');\n    }\n\n    public currentValue(key: string) {\n        if (key.startsWith('env.') || key.startsWith('custom-code.')) {\n            return this.defaultSettings[key];\n        } else {\n            return this.settings.get(key);\n        }\n    }\n\n    private initConfig(config: AppearanceEditorConfig[]) {\n        const merged = deepmerge.all(config) as AppearanceEditorConfig;\n        merged.sections = merged.sections.sort((a, b) => (a.position > b.position) ? 1 : -1);\n        if ( ! merged.defaultRoute) merged.defaultRoute = '/';\n        if (this.settings.get('site.has_mobile_app')) {\n            merged.menus.positions.push('mobile-app-about');\n        }\n        this.config = merged;\n    }\n\n    private initIframe(iframe: HTMLIFrameElement) {\n        const url = this.settings.getBaseUrl() + '/' + this.config.defaultRoute + `?be-preview-mode=${APPEARANCE_TOKEN}`;\n        iframe.src = removeDuplicateSlashes(url);\n        this.previewWindow = iframe.contentWindow;\n    }\n}\n","export function removeDuplicateSlashes(url: string): string {\n    return url.replace(/([^:]\\/)\\/+/g, '$1');\n}\n","<div class=\"back-button\" (click)=\"back.emit()\">\n    <mat-icon svgIcon=\"keyboard-arrow-left\"></mat-icon>\n</div>\n<div class=\"title\">\n    <div class=\"static\" trans>Customizing</div>\n    <div class=\"path\">\n        <ng-container *ngFor=\"let item of path; last as isLast; first as isFirst;\">\n            <span *ngIf=\"item\">\n                <mat-icon svgIcon=\"keyboard-arrow-right\" class=\"separator\" *ngIf=\"!isFirst\"></mat-icon>\n                <span class=\"name\" [class.last]=\"isLast\" trans>{{viewName(item)}}</span>\n            </span>\n        </ng-container>\n    </div>\n</div>","import {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core';\nimport {snakeCase} from '@common/core/utils/snake-case';\n\n@Component({\n    selector: 'appearance-panel-meta',\n    templateUrl: './appearance-panel-meta.component.html',\n    styleUrls: ['./appearance-panel-meta.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppearancePanelMetaComponent {\n    @Input() path: string[] = [];\n    @Output() back = new EventEmitter();\n\n    public viewName(name: string) {\n        return snakeCase(name).replace(/_/g , ' ');\n    }\n}\n","<div class=\"field-container\" (click)=\"openModal()\">\n  <div class=\"label fake-label\" trans><ng-content></ng-content></div>\n  <div class=\"img-container\">\n    <image-or-icon\n      class=\"inherit-size\"\n      [src]=\"image\"\n      *ngIf=\"image$ | async as image; else noImage\"\n    ></image-or-icon>\n\n    <ng-template #noImage>\n      <div class=\"no-image\">\n        <mat-icon svgIcon=\"photo-size-select-actual\"></mat-icon>\n        <span class=\"text\" trans>Upload</span>\n      </div>\n    </ng-template>\n\n    <div class=\"actions-dropdown\">\n      <button class=\"no-style\" [matMenuTriggerFor]=\"actionsMenu\" (click)=\"$event.stopPropagation()\">\n        <mat-icon svgIcon=\"settings\" class=\"trigger-icon\"></mat-icon>\n      </button>\n\n      <mat-menu #actionsMenu>\n        <div mat-menu-item (click)=\"remove()\" *ngIf=\"image$ | async\" trans>Remove</div>\n        <div mat-menu-item (click)=\"useDefault()\" *ngIf=\"defaultValue\" trans>Use Default</div>\n      </mat-menu>\n    </div>\n  </div>\n</div>\n<mat-progress-bar mode=\"indeterminate\" color=\"accent\" *ngIf=\"loading$ | async\"></mat-progress-bar>\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {UploadQueueService} from '@common/uploads/upload-queue/upload-queue.service';\nimport {AppearanceImageUploadValidator} from '@common/admin/appearance/appearance-image-input/appearance-image-upload-validator';\nimport {Settings} from '@common/core/config/settings.service';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {UploadInputTypes} from '@common/uploads/upload-input-config';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {randomString} from '@common/core/utils/random-string';\nimport {finalize} from 'rxjs/operators';\nimport {UploadUri} from '@common/uploads/types/upload-uri.enum';\nimport {UploadApiConfig} from '@common/uploads/types/upload-api-config';\n\n@Component({\n    selector: 'appearance-image-input',\n    templateUrl: './appearance-image-input.component.html',\n    styleUrls: ['./appearance-image-input.component.scss'],\n    host: {tabindex: '0'},\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        UploadQueueService,\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: AppearanceImageInputComponent,\n            multi: true,\n        },\n    ],\n})\nexport class AppearanceImageInputComponent implements ControlValueAccessor {\n    @Input() defaultValue: string;\n    @Input() backendUri: string;\n    @Input() diskPrefix: string;\n    private propagateChange: Function;\n    public image$ = new BehaviorSubject(null);\n    public loading$ = new BehaviorSubject<boolean>(false);\n\n    constructor(\n        private editor: AppearanceEditor,\n        private uploadQueue: UploadQueueService,\n        private validator: AppearanceImageUploadValidator,\n        public settings: Settings\n    ) {\n        this.validator.showToast = true;\n    }\n\n    public openModal() {\n        const params: UploadApiConfig = {\n            uri: this.backendUri || UploadUri.Image,\n            httpParams: {diskPrefix: this.diskPrefix},\n            validator: this.validator,\n        };\n        openUploadWindow({types: [UploadInputTypes.image]}).then(files => {\n            this.loading$.next(true);\n            this.uploadQueue\n                .start(files, params)\n                .pipe(finalize(() => this.loading$.next(false)))\n                .subscribe(response => {\n                    this.updateValue(response.fileEntry.url);\n                });\n        });\n    }\n\n    public remove() {\n        this.updateValue(null);\n    }\n\n    public useDefault() {\n        this.updateValue(this.defaultValue);\n    }\n\n    private updateValue(val?: string) {\n        this.propagateChange(val);\n        // make sure new image is loaded by browser as path will be the same\n        this.image$.next(val ? val + `?v=${randomString(8)}` : null);\n    }\n\n    public writeValue(value: string) {\n        this.image$.next(value);\n    }\n\n    public registerOnChange(fn: Function) {\n        this.propagateChange = fn;\n    }\n\n    public registerOnTouched() {}\n}\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","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","<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","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","<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","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\" matRipple 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>\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>\n\n<div class=\"appearance-panel-content\">\n    <css-theme-colors-panel\n            [theme]=\"selectedTheme\"\n            *ngIf=\"selectedTheme$ | async as selectedTheme else themesList\"\n    ></css-theme-colors-panel>\n\n    <ng-template #themesList>\n        <button mat-raised-button color=\"accent\" type=\"button\" class=\"new-theme-button\" (click)=\"openCrupdateThemeModal()\" trans>New Theme</button>\n        <ul class=\"unstyled-list\">\n            <li class=\"nav-item\" *ngFor=\"let theme of loadedThemes$ | async\" (click)=\"setSelectedTheme(theme)\">\n                <div class=\"name\">{{theme.name}}</div>\n                <div class=\"actions\" (click)=\"$event.stopPropagation()\">\n                    <button mat-icon-button type=\"button\" (click)=\"setSelectedTheme(theme)\">\n                        <mat-icon svgIcon=\"drop-custom\"></mat-icon>\n                    </button>\n                    <button mat-icon-button type=\"button\" (click)=\"openCrupdateThemeModal(theme);\">\n                        <mat-icon svgIcon=\"edit\"></mat-icon>\n                    </button>\n                    <button mat-icon-button type=\"button\" (click)=\"maybeDeleteThemeModal(theme)\">\n                        <mat-icon svgIcon=\"delete\"></mat-icon>\n                    </button>\n                </div>\n            </li>\n        </ul>\n    </ng-template>\n</div>\n\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay overlay-partial\"></loading-indicator>\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","export class MenuItem {\n    id: number|string;\n    label: string;\n    action: string;\n\n    // ID for model if action matches to specific model. If action\n    // points to a specific custom page, model_id will be that page's ID.\n    model_id: number;\n    type: MenuItemType = 'link';\n    icon: string;\n    condition: MenuItemCondition = null;\n    target: string = null;\n    activeExact = false;\n\n    constructor(params: Partial<MenuItem> = {}) {\n        for (const name in params) {\n            this[name] = params[name];\n        }\n        this.id = Math.floor(Math.random() * (1000 - 1));\n    }\n}\n\nexport type MenuItemCondition = string|string[]|Function;\nexport type MenuItemType = 'link' | 'route' | 'scrollTo';\n","import {Injectable} from '@angular/core';\nimport {moveItemInArray} from '@angular/cdk/drag-drop';\nimport {Menu} from '@common/core/ui/custom-menu/menu';\nimport {Settings} from '@common/core/config/settings.service';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\nimport {BehaviorSubject} from 'rxjs';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class MenuEditor {\n    public allMenus$ = new BehaviorSubject< Menu[]>([]);\n    public activeMenu$ = new BehaviorSubject<Menu>(null);\n\n    constructor(\n        private settings: Settings,\n        private appearance: AppearanceEditor,\n    ) {}\n\n    public create() {\n        const allMenus = [...this.allMenus$.value];\n        this.activeMenu$.next(new Menu({name: 'New Menu'}));\n        allMenus.push(this.activeMenu$.value);\n        this.allMenus$.next(allMenus);\n        this.commitChanges();\n    }\n\n    public reorderActiveMenuItems(previousIndex: number, currentIndex: number) {\n        const activeMenu = {...this.activeMenu$.value};\n        moveItemInArray(activeMenu.items, previousIndex, currentIndex);\n        this.activeMenu$.next(activeMenu);\n        this.commitChanges();\n    }\n\n    public deleteActive() {\n        const allMenus = [...this.allMenus$.value];\n        const i = allMenus.indexOf(this.activeMenu$.value);\n        allMenus.splice(i, 1);\n        this.activeMenu$.next(null);\n        this.allMenus$.next(allMenus);\n        this.commitChanges();\n    }\n\n    public addItem(item: MenuItem) {\n        const activeMenu = {...this.activeMenu$.value};\n        item = this.transformLocalLinksToRoutes(item);\n        activeMenu.items.push(item);\n        this.activeMenu$.next(activeMenu);\n        this.commitChanges();\n    }\n\n    public removeItem(item: MenuItem) {\n        const activeMenu = {...this.activeMenu$.value};\n        const i = this.activeMenu$.value.items.indexOf(item);\n        activeMenu.items.splice(i, 1);\n        this.activeMenu$.next(activeMenu);\n        this.commitChanges();\n    }\n\n    private transformLocalLinksToRoutes(item: MenuItem): MenuItem {\n        const baseUrl = this.settings.getBaseUrl();\n\n        if (item.type !== 'link' || item.action.indexOf(baseUrl) === -1) return item;\n\n        item.type = 'route';\n        item.action = item.action.replace(this.settings.getBaseUrl(), '');\n        return item;\n    }\n\n    public commitChanges() {\n        const menus = JSON.stringify(this.allMenus$.value);\n        this.appearance.setConfig('menus', menus);\n        this.appearance.addChanges({menus});\n    }\n\n    public setFromJson(json: string) {\n        if ( ! json) return;\n        const menus = JSON.parse(json);\n\n        if ( ! menus) return;\n\n        const allMenus = menus.map(menuData => {\n            const menu = new Menu(menuData);\n            menu.items = menu.items.map(item => new MenuItem(item));\n            return menu;\n        });\n        this.allMenus$.next(allMenus);\n    }\n}\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","<div class=\"header\">\n    <span class=\"title\" trans>Select Destination</span>\n    <mat-icon svgIcon=\"close\" (click)=\"close()\"></mat-icon>\n</div>\n<div class=\"new-item-tabs\">\n    <mat-accordion>\n        <form (ngSubmit)=\"addLinkMenuItem()\" [formGroup]=\"linkForm\" ngNativeValidate>\n            <mat-expansion-panel class=\"mat-elevation-z\">\n                <mat-expansion-panel-header><mat-panel-title trans>Link</mat-panel-title></mat-expansion-panel-header>\n                <div class=\"many-inputs expansion-panel-content\">\n                    <div class=\"input-container\">\n                        <label for=\"external-link-url\" trans>URL</label>\n                        <input type=\"url\" id=\"external-link-url\" formControlName=\"action\" required>\n                    </div>\n                    <div class=\"input-container\">\n                        <label for=\"external-link-text\" trans>Link Text</label>\n                        <input type=\"text\" id=\"external-link-text\" formControlName=\"label\" required>\n                    </div>\n                </div>\n                <mat-action-row>\n                    <button mat-button color=\"accent\" type=\"submit\" trans>Select</button>\n                </mat-action-row>\n            </mat-expansion-panel>\n        </form>\n        <mat-expansion-panel class=\"mat-elevation-z\">\n            <mat-expansion-panel-header><mat-panel-title trans>Route</mat-panel-title></mat-expansion-panel-header>\n            <div class=\"items-list expansion-panel-content\">\n                <div class=\"item\" *ngFor=\"let route of appearance.config.menus.availableRoutes\"\n                     (click)=\"addRouteMenuItem(route)\">{{route}}\n                </div>\n            </div>\n        </mat-expansion-panel>\n        <mat-expansion-panel class=\"mat-elevation-z\" *ngFor=\"let category of menuItemCategories\">\n            <mat-expansion-panel-header><mat-panel-title trans>{{category.name}}</mat-panel-title></mat-expansion-panel-header>\n            <div class=\"items-list expansion-panel-content\">\n                <div class=\"item\" *ngFor=\"let item of category.items\" (click)=\"addCustomMenuItem(item)\">{{item.label}}</div>\n            </div>\n        </mat-expansion-panel>\n    </mat-accordion>\n</div>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {MenuEditor} from '@common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {FormBuilder} from '@angular/forms';\nimport {MenuItemCategory} from '@common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-category';\nimport {MenuItemCategoriesService} from '@common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-categories.service';\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\n\n@Component({\n    selector: 'select-menu-item-action',\n    templateUrl: './select-menu-item-action.component.html',\n    styleUrls: ['./select-menu-item-action.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SelectMenuItemActionComponent implements OnInit {\n    public linkForm = this.fb.group({\n        action: [''],\n        label: [''],\n    });\n    public menuItemCategories: MenuItemCategory[];\n\n    constructor(\n        public editor: MenuEditor,\n        public appearance: AppearanceEditor,\n        private overlayPanelRef: OverlayPanelRef,\n        private fb: FormBuilder,\n        private itemCategories: MenuItemCategoriesService\n    ) {}\n\n    ngOnInit() {\n        this.itemCategories.get().subscribe(response => {\n            this.menuItemCategories = response.categories;\n        });\n    }\n\n    addLinkMenuItem() {\n        this.close({\n            type: 'link',\n            label: this.linkForm.value.label,\n            action: this.linkForm.value.action,\n        });\n    }\n\n    addRouteMenuItem(route: string) {\n        this.close({\n            type: 'route',\n            label: route,\n            action: route,\n        });\n    }\n\n    addCustomMenuItem(item: Partial<MenuItem>) {\n        this.close(item);\n    }\n\n    close(destination?: Partial<MenuItem>) {\n        this.overlayPanelRef.close(destination);\n    }\n}\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>\n\n<mat-accordion cdkDropList (cdkDropListDropped)=\"reorderMenuItems($event)\" *ngIf=\"menus.activeMenu$ | async as activeMenu; else noActiveMenu\">\n    <mat-expansion-panel\n            class=\"mat-elevation-z menu-item-container\"\n            cdkDrag\n            *ngFor=\"let menuItem of activeMenu.items\"\n            (opened)=\"toggleMenuItem(menuItem)\"\n            (closed)=\"toggleMenuItem(menuItem)\"\n            [attr.data-id]=\"menuItem.id\"\n    >\n        <mat-expansion-panel-header>\n            <mat-panel-title>\n                <mat-icon class=\"drag-handle\" cdkDragHandle svgIcon=\"drag-handle\"></mat-icon>\n                <span class=\"name\">{{menuItem.label}}</span>\n            </mat-panel-title>\n        </mat-expansion-panel-header>\n\n        <div class=\"many-inputs menu-item-list\">\n            <div class=\"input-container\">\n                <label for=\"{{menuItem.id + '-label'}}\" trans>Label</label>\n                <input type=\"text\" [(ngModel)]=\"menuItem.label\" id=\"{{menuItem.id + '-label'}}\" (ngModelChange)=\"menus.commitChanges()\">\n            </div>\n\n            <div class=\"input-container\">\n                <label for=\"{{menuItem.id + '-type'}}\" trans>Type</label>\n                <select [(ngModel)]=\"menuItem.type\" id=\"{{menuItem.id + '-type'}}\" (ngModelChange)=\"menus.commitChanges()\">\n                    <option value=\"link\" trans>Link</option>\n                    <option value=\"route\" trans>Route</option>\n                    <option value=\"page\" trans>Page</option>\n                </select>\n            </div>\n\n            <div class=\"input-container\">\n                <label for=\"{{menuItem.id + '-action'}}\" trans>Action</label>\n                <input type=\"text\" [(ngModel)]=\"menuItem.action\" id=\"{{menuItem.id + '-action'}}\" (ngModelChange)=\"menus.commitChanges()\">\n            </div>\n\n            <div class=\"input-container\">\n                <label for=\"{{menuItem.id + '-condition'}}\" trans>Condition</label>\n                <select [(ngModel)]=\"menuItem.condition\" id=\"{{menuItem.id + '-condition'}}\" (ngModelChange)=\"menus.commitChanges()\">\n                    <option [ngValue]=\"null\" trans>None</option>\n                    <option value=\"auth\" trans>Show to Logged in Users Only</option>\n                    <option value=\"guest\" trans>Show to Guest Users Only</option>\n                    <option value=\"admin\" trans>Show to Admin Only</option>\n                </select>\n            </div>\n\n            <div class=\"input-container\">\n                <label for=\"{{menuItem.id + '-target'}}\" trans>Open link in</label>\n                <select [(ngModel)]=\"menuItem.target\" id=\"{{menuItem.id + '-target'}}\" (ngModelChange)=\"menus.commitChanges()\">\n                    <option value=\"_self\" trans>Same Window</option>\n                    <option value=\"_blank\" trans>New Window</option>\n                </select>\n            </div>\n\n            <div class=\"input-container icon-input-container\" #iconInput (click)=\"openIconSelector(iconInput, menuItem)\">\n                <label for=\"{{menuItem.id + '-icon'}}\" trans>Icon</label>\n                <input type=\"text\" readonly [(ngModel)]=\"menuItem.icon\" id=\"{{menuItem.id + '-icon'}}\" placeholder=\"(Optional)\" trans-placeholder>\n                <mat-icon [svgIcon]=\"menuItem.icon\"></mat-icon>\n            </div>\n        </div>\n\n        <mat-action-row>\n            <button mat-button color=\"warn\" class=\"delete-button\" (click)=\"confirmMenuItemDeletion()\" trans>Remove</button>\n        </mat-action-row>\n    </mat-expansion-panel>\n</mat-accordion>\n\n<ng-template #noActiveMenu>\n    <div class=\"no-menu-items\" trans>This menu has no items yet.</div>\n</ng-template>\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnDestroy} from '@angular/core';\nimport {Subscription} from 'rxjs';\nimport {CdkDragDrop} from '@angular/cdk/drag-drop';\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\nimport {MenuEditor} from '@common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {IconSelectorComponent} from '@common/shared/icon-selector/icon-selector.component';\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\n\n@Component({\n    selector: 'menu-items',\n    templateUrl: './menu-items.component.html',\n    styleUrls: ['./menu-items.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenuItemsComponent implements OnDestroy {\n    public selectedMenuItem: MenuItem;\n    public subscriptions: Subscription[] = [];\n\n    constructor(\n        public menus: MenuEditor,\n        private modal: Modal,\n        private overlayPanel: OverlayPanel,\n        private cd: ChangeDetectorRef,\n    ) {}\n\n    ngOnDestroy() {\n        this.subscriptions.forEach(subscription => {\n            subscription && subscription.unsubscribe();\n        });\n    }\n\n    public reorderMenuItems(e: CdkDragDrop<void>) {\n        this.menus.reorderActiveMenuItems(e.previousIndex, e.currentIndex);\n    }\n\n    /**\n     * Toggle specified menu item settings panel visibility.\n     */\n    public toggleMenuItem(item: MenuItem) {\n        if (this.selectedMenuItem === item) {\n            this.selectedMenuItem = null;\n        } else {\n            this.selectedMenuItem = item;\n        }\n    }\n\n    /**\n     * Ask user to confirm menu item deletion.\n     */\n    public confirmMenuItemDeletion() {\n        this.modal.show(ConfirmModalComponent, {\n            title: 'Delete Menu Item',\n            body: 'Are you sure you want to delete this menu item?',\n            ok: 'Delete'\n        }).afterClosed().subscribe(confirmed => {\n            if ( ! confirmed) return;\n            this.menus.removeItem(this.selectedMenuItem);\n            this.selectedMenuItem = null;\n        });\n    }\n\n    public openIconSelector(origin: HTMLElement, menuItem: MenuItem) {\n        this.overlayPanel.open(IconSelectorComponent, {\n            position: RIGHT_POSITION,\n            origin: new ElementRef(origin),\n        }).valueChanged().subscribe(icon => {\n            menuItem.icon = icon;\n            this.menus.commitChanges();\n            this.cd.detectChanges();\n        });\n    }\n}\n","<appearance-panel-meta [path]=\"['Menus', menus.activeMenu$.value && menus.activeMenu$.value.name]\" (back)=\"openPreviousPanel()\"></appearance-panel-meta>\n\n<div class=\"appearance-panel-content\">\n    <div class=\"menu-panel\" *ngIf=\"menus.activeMenu$ | async as activeMenu; else allMenuList\">\n        <div class=\"many-inputs menu-settings\">\n            <div class=\"input-container\">\n                <label for=\"menu-name\" trans>Menu Name</label>\n                <input type=\"text\" id=\"menu-name\" [(ngModel)]=\"activeMenu.name\" (ngModelChange)=\"menus.commitChanges()\">\n            </div>\n\n            <div class=\"input-container\">\n                <label for=\"menu-position\" trans>Menu Position</label>\n                <select id=\"menu-position\" [(ngModel)]=\"activeMenu.position\" (ngModelChange)=\"menus.commitChanges()\">\n                    <option [ngValue]=\"position\" *ngFor=\"let position of appearance.config.menus.positions\">{{getDisplayName(position)}}</option>\n                </select>\n            </div>\n        </div>\n\n        <menu-items></menu-items>\n\n        <div class=\"action-buttons\">\n            <button mat-button color=\"warn\" (click)=\"confirmMenuDeletion()\" trans>Delete Menu</button>\n            <button class=\"button flat add-item-button\" mat-button color=\"accent\" (click)=\"openAddItemPanel()\" trans>Add Item</button>\n        </div>\n    </div>\n\n    <ng-template #allMenuList>\n        <div class=\"menus\">\n            <div class=\"menu nav-item\" *ngFor=\"let menu of menus.allMenus$ | async\" (click)=\"setActiveMenu(menu)\">\n                <span class=\"name\">{{menu.name}}</span>\n                <mat-icon svgIcon=\"keyboard-arrow-right\" class=\"actions\"></mat-icon>\n            </div>\n\n            <div class=\"action-buttons\">\n                <button mat-button color=\"accent\" class=\"button primary\" (click)=\"menus.create()\" trans>Add a Menu</button>\n            </div>\n        </div>\n    </ng-template>\n</div>","import {ChangeDetectionStrategy, Component, ElementRef} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {MenuEditor} from '@common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\nimport {SelectMenuItemActionComponent} from '@common/admin/appearance/panels/menus-appearance-panel/menus/add-menu-item-panel/select-menu-item-action.component';\nimport {Menu} from '@common/core/ui/custom-menu/menu';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\n\n@Component({\n    selector: 'menus-appearance-panel',\n    templateUrl: './menus-appearance-panel.component.html',\n    styleUrls: ['./menus-appearance-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenusAppearancePanelComponent {\n    constructor(\n        public appearance: AppearanceEditor,\n        public menus: MenuEditor,\n        private modal: Modal,\n        private settings: Settings,\n        private panel: OverlayPanel,\n        private el: ElementRef<HTMLElement>\n    ) {\n        this.menus.setFromJson(this.settings.get('menus'));\n    }\n\n    public openAddItemPanel() {\n        const position = RIGHT_POSITION.slice();\n        position[0].offsetX = 10;\n        position[1].offsetX = 10;\n        this.panel\n            .open(SelectMenuItemActionComponent, {\n                position,\n                origin: this.el,\n                panelClass: 'add-menu-item-panel-container',\n            })\n            .afterClosed()\n            .subscribe((val: Partial<MenuItem>) => {\n                if (val) {\n                    this.menus.addItem(new MenuItem(val));\n                }\n            });\n    }\n\n    public openPreviousPanel() {\n        if (this.menus.activeMenu$.value) {\n            this.menus.activeMenu$.next(null);\n        } else {\n            this.appearance.closeActivePanel();\n        }\n    }\n\n    public setActiveMenu(menu: Menu) {\n        this.menus.activeMenu$.next(menu);\n    }\n\n    public confirmMenuDeletion() {\n        this.modal\n            .show(ConfirmModalComponent, {\n                title: 'Delete Menu',\n                body: 'Are you sure you want to delete this menu?',\n                ok: 'Delete',\n            })\n            .afterClosed()\n            .subscribe(confirmed => {\n                if (!confirmed) return;\n                this.menus.deleteActive();\n            });\n    }\n\n    public getDisplayName(name: string) {\n        return name.replace(/-/g, ' ');\n    }\n}\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\">\n    <h2 class=\"modal-title\" mat-dialog-title trans>Code Editor</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<mat-dialog-content>\n    <div class=\"editor-container\">\n        <p class=\"info\" *ngIf=\"data.language === 'html'\" trans>If entering javascript, wrap it with &lt;script>&lt;/script> tag.</p>\n        <div class=\"editor\" #editor></div>\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\" (click)=\"confirm()\" [disabled]=\"syntaxInvalid$ | async\" trans>Update</button>\n</mat-dialog-actions>\n\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>","import {ChangeDetectionStrategy, Component, ElementRef, Inject, OnInit, ViewChild} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {filter} from 'rxjs/operators';\nimport {ESCAPE} from '@angular/cdk/keycodes';\nimport {LazyLoaderService} from '@common/core/utils/lazy-loader.service';\nimport {BehaviorSubject} from 'rxjs';\n\ndeclare let ace;\n\nexport interface CodeEditorModalData {\n    contents?: string;\n    language: string;\n}\n\n@Component({\n    selector: 'code-editor-modal',\n    templateUrl: './code-editor-modal.component.html',\n    styleUrls: ['./code-editor-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CodeEditorModalComponent implements OnInit {\n    @ViewChild('editor', { static: true }) editorEl: ElementRef;\n\n    public loading$ = new BehaviorSubject<boolean>(false);\n    public syntaxInvalid$ = new BehaviorSubject<boolean>(false);\n    private editor;\n\n    constructor(\n        private dialogRef: MatDialogRef<CodeEditorModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CodeEditorModalData,\n        private lazyLoader: LazyLoaderService,\n    ) {}\n\n    ngOnInit() {\n        this.initEditor(this.data.contents, this.data.language);\n        this.overrideDialogCloseEvents();\n    }\n\n    public confirm() {\n        this.close(this.editor.getValue());\n    }\n\n    public close(value?: string) {\n        this.dialogRef.close(value);\n    }\n\n    private initEditor(contents: string, language = 'html') {\n        this.loading$.next(true);\n        this.lazyLoader.loadAsset('js/ace/ace.js', {type: 'js'}).then(() => {\n            this.editor = ace.edit(this.editorEl.nativeElement);\n            this.editor.getSession().setMode('ace/mode/' + language);\n            this.editor.setTheme('ace/theme/chrome');\n            this.editor.$blockScrolling = Infinity;\n            if (contents) this.editor.setValue(contents, 1);\n\n            this.editor.getSession().on('changeAnnotation', () => {\n                const annotations = this.editor.getSession().getAnnotations() as any[];\n\n                // hide !doctype syntax error\n                if (annotations[0] && /doctype first/.test(annotations[0].text)) {\n                    annotations.splice(0, 1);\n                    this.editor.getSession().setAnnotations(annotations);\n                    return;\n                }\n\n                // prevent editor submit if there are syntax errors\n                const syntaxInvalid = this.editor\n                    .getSession()\n                    .getAnnotations()\n                    .filter(a => a.type === 'error')\n                    .length > 0;\n                this.syntaxInvalid$.next(syntaxInvalid);\n            });\n            this.loading$.next(false);\n        });\n    }\n\n    /**\n     * Need to always send dialog data, regardless of how it was closed.\n     * Angular material does not provide easy way to do this, so\n     * we need to override backdrop click and escape key close events.\n     */\n    private overrideDialogCloseEvents() {\n        this.dialogRef.disableClose = true;\n\n        // close on backdrop click\n        this.dialogRef.backdropClick().subscribe(() => {\n            this.close();\n        });\n\n        // close on escape key\n        this.dialogRef.keydownEvents()\n            .pipe(filter(event => event.keyCode === ESCAPE))\n            .subscribe(() => this.close());\n    }\n}\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>","<sidenav class=\"no-navbar\">\n  <nav class=\"sidebar\">\n    <div class=\"header\">\n      <div class=\"back-button\" (click)=\"closeEditor()\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n      </div>\n      <div class=\"title\" trans>Appearance Editor</div>\n      <button\n        mat-raised-button\n        color=\"accent\"\n        class=\"button primary save-button\"\n        (click)=\"editor.saveChanges()\"\n        [disabled]=\"!(editor.changes$ | async) || (editor.loading$ | async)\"\n      >\n        <span *ngIf=\"editor.changes$ | async; else saved\" trans>Save</span>\n        <ng-template #saved>\n          <span trans>Saved</span>\n        </ng-template>\n      </button>\n    </div>\n\n    <ng-container *ngIf=\"editor.activePanel$ | async as activePanel; else navigation\">\n      <ng-container [ngSwitch]=\"activePanel.name\">\n        <general-appearance-panel *ngSwitchCase=\"'general'\"></general-appearance-panel>\n        <themes-appearance-panel *ngSwitchCase=\"'themes'\"></themes-appearance-panel>\n        <menus-appearance-panel *ngSwitchCase=\"'menus'\"></menus-appearance-panel>\n        <seo-appearance-panel *ngSwitchCase=\"'seo-settings'\"></seo-appearance-panel>\n        <custom-code-appearance-panel *ngSwitchCase=\"'custom-code'\"></custom-code-appearance-panel>\n        <ng-container *ngSwitchDefault>\n          <ng-template\n            *ngIf=\"panelPortal$ | async as portal\"\n            [cdkPortalOutlet]=\"portal\"\n          ></ng-template>\n        </ng-container>\n      </ng-container>\n    </ng-container>\n\n    <ng-template #navigation>\n      <div class=\"root-navigation\">\n        <a\n          class=\"nav-item\"\n          [routerLink]=\"[]\"\n          [queryParams]=\"{panel: slugify(section.name)}\"\n          *ngFor=\"let section of editor.config.sections\"\n        >\n          <span class=\"text\" trans>{{ viewName(section.name) }}</span>\n          <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\n        </a>\n      </div>\n    </ng-template>\n  </nav>\n  <main>\n    <div class=\"live-preview\">\n      <iframe src=\"about:blank\" #iframe></iframe>\n    </div>\n  </main>\n</sidenav>\n\n<button mat-fab (click)=\"sidenav.toggleSidebarMode()\" class=\"sidebar-toggle-button\">\n  <mat-icon svgIcon=\"edit\"></mat-icon>\n</button>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    Inject,\n    OnDestroy,\n    OnInit,\n    Optional,\n    ViewChild,\n} from '@angular/core';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {AppearanceEditor} from './appearance-editor/appearance-editor.service';\nimport {slugifyString} from '@common/core/utils/slugify-string';\nimport {Subscription} from 'rxjs';\nimport {ComponentPortal} from '@angular/cdk/portal';\nimport {map} from 'rxjs/operators';\nimport {BreakpointsService} from '@common/core/ui/breakpoints.service';\nimport {\n    APPEARANCE_EDITOR_CONFIG,\n    AppearanceEditorConfig,\n} from './appearance-editor-config.token';\nimport {SidenavComponent} from '@common/shared/sidenav/sidenav.component';\n\n@Component({\n    selector: 'appearance',\n    templateUrl: './appearance.component.html',\n    styleUrls: ['./appearance.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppearanceComponent implements OnInit, OnDestroy {\n    @ViewChild('iframe', {static: true}) iframe: ElementRef;\n    @ViewChild(SidenavComponent, {static: true}) sidenav: SidenavComponent;\n    private routerSub: Subscription;\n\n    public panelPortal$ = this.editor.activePanel$.pipe(\n        map(panel => {\n            return panel && panel.component\n                ? new ComponentPortal(panel.component)\n                : null;\n        })\n    );\n\n    constructor(\n        public editor: AppearanceEditor,\n        private router: Router,\n        private route: ActivatedRoute,\n        public breakpoints: BreakpointsService,\n        @Inject(APPEARANCE_EDITOR_CONFIG)\n        @Optional()\n        public config: AppearanceEditorConfig[]\n    ) {}\n\n    ngOnInit() {\n        this.editor.init(\n            this.iframe.nativeElement,\n            this.route.snapshot.data.defaultSettings,\n            this.config\n        );\n        this.routerSub = this.route.queryParams.subscribe(\n            (params: {panel?: string}) => {\n                this.editor.openPanel(params.panel);\n            }\n        );\n    }\n\n    ngOnDestroy() {\n        this.routerSub && this.routerSub.unsubscribe();\n    }\n\n    public closeEditor() {\n        this.router.navigate(['admin']);\n    }\n\n    public slugify(str: string) {\n        return slugifyString(str);\n    }\n\n    public viewName(name: string) {\n        return name.replace('-', ' ');\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot} from '@angular/router';\nimport {catchError, mergeMap} from 'rxjs/operators';\nimport {EMPTY, Observable, of} from 'rxjs';\nimport {GenericBackendResponse} from '@common/core/types/backend-response';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class AppearanceEditorResolver implements Resolve<GenericBackendResponse<{[key: string]: any}>> {\n    constructor(\n        private router: Router,\n        private http: AppHttpClient\n    ) {}\n\n    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<GenericBackendResponse<{[key: string]: any}>> {\n        return this.http.get<GenericBackendResponse<{[key: string]: any}>>('admin/appearance/values').pipe(\n            catchError(() => {\n                this.router.navigate(['/admin']);\n                return EMPTY;\n            }),\n            mergeMap(response => {\n                if (response) {\n                    return of(response);\n                } else {\n                    this.router.navigate(['/admin']);\n                    return EMPTY;\n                }\n            })\n        );\n    }\n}\n\n","import {Injectable} from '@angular/core';\nimport {CanDeactivate} from '@angular/router';\nimport {AppearanceComponent} from './appearance.component';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {Observable} from 'rxjs';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class CanDeactivateAppearance implements CanDeactivate<AppearanceComponent> {\n    constructor(\n        private editor: AppearanceEditor,\n        private modal: Modal,\n    ) {}\n\n    canDeactivate(): Observable<boolean>|boolean {\n        if ( ! this.editor.changes$.value) return true;\n\n        return this.modal.show(ConfirmModalComponent, {\n            title: 'Close Appearance Editor',\n            body: 'Are you sure you want to close appearance editor?',\n            bodyBold: 'All unsaved changes will be lost.',\n            ok: 'Close',\n            cancel: 'Stay',\n        }).afterClosed();\n    }\n}\n","import {RouterModule, Routes} from '@angular/router';\nimport {NgModule} from '@angular/core';\nimport {AppearanceComponent} from './appearance.component';\nimport {CanDeactivateAppearance} from './can-deactivate-appearance.guard';\nimport {AuthGuard} from '../../guards/auth-guard.service';\nimport {AppearanceEditorResolver} from './appearance-editor/appearance-editor-resolver.service';\n\nconst routes: Routes = [\n    {\n        path: '',\n        component: AppearanceComponent,\n        data: {permissions: ['appearance.update']},\n        resolve: {defaultSettings: AppearanceEditorResolver},\n        canActivate: [AuthGuard],\n        canDeactivate: [CanDeactivateAppearance],\n        children: [\n            {path: ''},\n            {path: ':panel'},\n            {path: ':panel/:activeItem'},\n        ]\n    },\n];\n\n@NgModule({\n    imports: [RouterModule.forChild(routes)],\n    exports: [RouterModule]\n})\nexport class AppearanceRoutingModule {}\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 {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';\nimport { MatRippleModule } from '@angular/material/core';\n\n\n@NgModule({\n    declarations: [ColorPickerInputComponent],\n    imports: [CommonModule, TranslationsModule, MatIconModule, MatRippleModule],\n    exports: [ColorPickerInputComponent],\n})\nexport class ColorPickerInputModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {AppearanceComponent} from './appearance.component';\nimport {MenusAppearancePanelComponent} from './panels/menus-appearance-panel/menus-appearance-panel.component';\nimport {SelectMenuItemActionComponent} from './panels/menus-appearance-panel/menus/add-menu-item-panel/select-menu-item-action.component';\nimport {AppearancePanelMetaComponent} from './appearance-panel-meta/appearance-panel-meta.component';\nimport {MenuItemsComponent} from './panels/menus-appearance-panel/menus/menu-items/menu-items.component';\nimport {AppearanceRoutingModule} from './appearance-routing.module';\nimport {CodeEditorModalComponent} from './panels/custom-code-appearance-panel/code-editor-modal/code-editor-modal.component';\nimport {ThemesAppearancePanelComponent} from './panels/themes-appearance-panel/themes-appearance-panel.component';\nimport {CrupdateCssThemeModalComponent} from './panels/themes-appearance-panel/crupdate-css-theme-modal/crupdate-css-theme-modal.component';\nimport {CssThemeColorsPanelComponent} from '@common/admin/appearance/panels/themes-appearance-panel/css-theme-colors-panel/css-theme-colors-panel.component';\nimport {GeneralAppearancePanelComponent} from '@common/admin/appearance/panels/general-appearance-panel/general-appearance-panel.component';\nimport {HighlightInPreviewDirective} from './highlight-in-preview.directive';\nimport {SeoAppearancePanelComponent} from '@common/admin/appearance/panels/seo-appearance-panel/seo-appearance-panel.component';\nimport {CustomCodeAppearancePanelComponent} from '@common/admin/appearance/panels/custom-code-appearance-panel/custom-code-appearance-panel.component';\nimport {AppearanceImageInputComponent} from '@common/admin/appearance/appearance-image-input/appearance-image-input.component';\nimport {IconSelectorModule} from '@common/shared/icon-selector/icon-selector.module';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {ImageOrIconModule} from '@common/core/ui/image-or-icon/image-or-icon.module';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport {MatMenuModule} from '@angular/material/menu';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {MatExpansionModule} from '@angular/material/expansion';\nimport {DragDropModule} from '@angular/cdk/drag-drop';\nimport {MatButtonModule} from '@angular/material/button';\nimport {ColorPickerInputModule} from '@common/core/ui/color-picker/color-picker-input/color-picker-input.module';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport {\n    APPEARANCE_EDITOR_CONFIG,\n    DEFAULT_APPEARANCE_EDITOR_CONFIG,\n} from './appearance-editor-config.token';\nimport {SidenavModule} from '@common/shared/sidenav/sidenav.module';\n\n@NgModule({\n    imports: [\n        AppearanceRoutingModule,\n        CommonModule,\n        FormsModule,\n        ReactiveFormsModule,\n        IconSelectorModule,\n        TranslationsModule,\n        ImageOrIconModule,\n        LoadingIndicatorModule,\n        ColorPickerInputModule,\n        SidenavModule,\n\n        // material\n        MatMenuModule,\n        MatProgressBarModule,\n        MatIconModule,\n        MatButtonModule,\n        MatDialogModule,\n        MatExpansionModule,\n        DragDropModule,\n        PortalModule,\n        MatSlideToggleModule,\n    ],\n    exports: [\n        AppearancePanelMetaComponent,\n        HighlightInPreviewDirective,\n        AppearanceImageInputComponent,\n    ],\n    declarations: [\n        AppearanceComponent,\n        SelectMenuItemActionComponent,\n        AppearancePanelMetaComponent,\n        MenuItemsComponent,\n        CodeEditorModalComponent,\n        CrupdateCssThemeModalComponent,\n        CssThemeColorsPanelComponent,\n        AppearanceImageInputComponent,\n        MenusAppearancePanelComponent,\n        ThemesAppearancePanelComponent,\n        GeneralAppearancePanelComponent,\n        SeoAppearancePanelComponent,\n        CustomCodeAppearancePanelComponent,\n        HighlightInPreviewDirective,\n    ],\n    providers: [\n        {\n            provide: APPEARANCE_EDITOR_CONFIG,\n            useValue: DEFAULT_APPEARANCE_EDITOR_CONFIG,\n            multi: true,\n        },\n    ],\n})\nexport class BaseAppearanceModule {}\n","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 = oldValue;\n                // Emit a change and input event if the value changed.\n                if (oldValue != this.value) {\n                    this._emitInputEvent();\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                event.preventDefault();\n                this._removeGlobalEvents();\n                this._isSliding = false;\n                if (this._valueOnSlideStart != this.value && !this.disabled) {\n                    this._emitChangeEvent();\n                }\n                this._valueOnSlideStart = this._lastPointerEvent = null;\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 && value !== this.min && value !== this.max) {\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 = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSlider, selectors: [[\"mat-slider\"]], viewQuery: function MatSlider_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(_c0, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._sliderWrapper = _t.first);\n    } }, hostAttrs: [\"role\", \"slider\", 1, \"mat-slider\", \"mat-focus-indicator\"], hostVars: 29, 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-valuetext\", ctx.valueText == null ? ctx.displayValue : ctx.valueText)(\"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\", valueText: \"valueText\" }, 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;-webkit-print-color-adjust:exact;color-adjust:exact}.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    valueText: [{ 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(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵ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                    // NVDA and Jaws appear to announce the `aria-valuenow` by calculating its percentage based\n                    // on its value between `aria-valuemin` and `aria-valuemax`. Due to how decimals are handled,\n                    // it can cause the slider to read out a very long value like 0.20000068 if the current value\n                    // is 0.2 with a min of 0 and max of 1. We work around the issue by setting `aria-valuetext`\n                    // to the same value that we set on the slider's thumb which will be truncated.\n                    '[attr.aria-valuetext]': 'valueText == null ? displayValue : valueText',\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;-webkit-print-color-adjust:exact;color-adjust:exact}.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        }], valueText: [{\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.ɵfac = function MatSliderModule_Factory(t) { return new (t || MatSliderModule)(); };\nMatSliderModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatSliderModule });\nMatSliderModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[CommonModule, MatCommonModule], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSliderModule, [{\n        type: NgModule,\n        args: [{\n                imports: [CommonModule, MatCommonModule],\n                exports: [MatSlider, MatCommonModule],\n                declarations: [MatSlider]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatSliderModule, { declarations: function () { return [MatSlider]; }, imports: function () { return [CommonModule, MatCommonModule]; }, exports: function () { return [MatSlider, MatCommonModule]; } }); })();\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","<appearance-panel-meta [path]=\"path$ | async\" (back)=\"openPreviousPanel()\"></appearance-panel-meta>\n\n<div class=\"appearance-panel-content\">\n    <ng-container *ngIf=\"selectedSubpanel$ | async as selectedSubpanel; else mainPanel\">\n        <div [ngSwitch]=\"selectedSubpanel\">\n            <ng-container *ngSwitchCase=\"'primaryFeatures'\">\n                <div *ngFor=\"let group of primaryArray().controls; index as index\" [formGroup]=\"group\"\n                     class=\"many-inputs feature-group\">\n                    <div class=\"feature-group-header\">\n                        <div class=\"text\">{{'Feature' | trans}} #{{index + 1}}</div>\n                        <button mat-icon-button color=\"warn\" (click)=\"removeFeature('primary', index)\">\n                            <mat-icon svgIcon=\"close\"></mat-icon>\n                        </button>\n                    </div>\n                    <div class=\"input-container\">\n                        <label [for]=\"'primary.' + index + '.title'\" trans>Title</label>\n                        <input type=\"text\" [id]=\"'primary.' + index + '.title'\" formControlName=\"title\"\n                               [placeholder]=\"defaultValue('primaryFeatures.' + index + '.title')\"\n                               highlightInPreview=\".inline-feature:nth-child({{index + 1}}) h3\" required>\n                    </div>\n                    <div class=\"input-container\">\n                        <label [for]=\"'primary.' + index + '.subtitle'\" trans>Subtitle</label>\n                        <textarea [id]=\"'primary.' + index + '.subtitle'\" formControlName=\"subtitle\"\n                               [placeholder]=\"defaultValue('primaryFeatures.' + index + '.subtitle')\"\n                                  highlightInPreview=\".inline-feature:nth-child({{index + 1}}) p\" rows=\"3\" required></textarea>\n                    </div>\n                    <appearance-image-input [defaultValue]=\"defaultValue('primaryFeatures.' + index + '.image')\"\n                                            formControlName=\"image\"\n                                            diskPrefix=\"homepage\"\n                                            highlightInPreview=\".inline-feature:nth-child({{index + 1}}) img\" trans>\n                        Image\n                    </appearance-image-input>\n                </div>\n                <button mat-flat-button color=\"accent\" *ngIf=\"primaryArray().length < 3\" (click)=\"addFeature('primary')\" trans>Add</button>\n            </ng-container>\n            <ng-container *ngSwitchCase=\"'secondaryFeatures'\">\n                <div *ngFor=\"let group of secondaryArray().controls; index as index\" [formGroup]=\"group\"\n                     class=\"many-inputs feature-group\">\n                    <div class=\"feature-group-header\">\n                        <div class=\"text\">{{'Feature' | trans}} #{{index + 1}}</div>\n                        <button mat-icon-button color=\"warn\" (click)=\"removeFeature('secondary', index)\">\n                            <mat-icon svgIcon=\"close\"></mat-icon>\n                        </button>\n                    </div>\n                    <div class=\"input-container\">\n                        <label [for]=\"'secondary.' + index + '.title'\" trans>Title</label>\n                        <input type=\"text\" [id]=\"'secondary.' + index + '.title'\" formControlName=\"title\"\n                               [placeholder]=\"defaultValue('secondaryFeatures.' + index + '.title')\"\n                               highlightInPreview=\".big-feature:nth-child({{index + 1}}) h2\" required>\n                    </div>\n                    <div class=\"input-container\">\n                        <label [for]=\"'secondary.' + index + '.subtitle'\" trans>Subtitle</label>\n                        <input type=\"text\" [id]=\"'secondary.' + index + '.subtitle'\" formControlName=\"subtitle\"\n                               [placeholder]=\"defaultValue('secondaryFeatures.' + index + '.subtitle')\"\n                               highlightInPreview=\".big-feature:nth-child({{index + 1}}) small\" required>\n                    </div>\n                    <div class=\"input-container\">\n                        <label [for]=\"'secondary.' + index + '.description'\" trans>Description</label>\n                        <textarea type=\"text\" [id]=\"'secondary.' + index + '.description'\" formControlName=\"description\"\n                                  rows=\"4\" [placeholder]=\"defaultValue('secondaryFeatures.' + index + '.description')\"\n                                  highlightInPreview=\".big-feature:nth-child({{index + 1}}) p\"\n                                  required></textarea>\n                    </div>\n                    <appearance-image-input [defaultValue]=\"defaultValue('secondaryFeatures.' + index + '.image')\"\n                                            highlightInPreview=\".big-feature:nth-child({{index + 1}}) img\"\n                                            diskPrefix=\"homepage\"\n                                            formControlName=\"image\" trans>Image\n                    </appearance-image-input>\n                </div>\n                <button mat-flat-button color=\"accent\" (click)=\"addFeature('secondary')\" trans>Add</button>\n            </ng-container>\n            <div *ngSwitchCase=\"'actions'\" class=\"many-inputs\" [formGroup]=\"form.get('actions')\">\n                <div class=\"input-container\">\n                    <label for=\"home.actions.cta1\" trans>Call to Action #1</label>\n                    <input type=\"text\" id=\"home.actions.cta1\" formControlName=\"cta1\"\n                           highlightInPreview=\".get-started-button\"\n                           [placeholder]=\"defaultValue('actions.cta1')\" required>\n                </div>\n                <div class=\"input-container\">\n                    <label for=\"home.actions.cta2\" trans>Call to Action #2</label>\n                    <input type=\"text\" id=\"home.actions.cta2\" formControlName=\"cta2\"\n                           highlightInPreview=\".learn-more-button\"\n                           [placeholder]=\"defaultValue('actions.cta2')\" required>\n                </div>\n                <div class=\"input-container\">\n                    <label for=\"home.actions.cta3\" trans>Call to Action #3</label>\n                    <input type=\"text\" id=\"home.actions.cta3\" formControlName=\"cta3\"\n                           highlightInPreview=\".learn-more-button\"\n                           [placeholder]=\"defaultValue('actions.cta3')\" required>\n                </div>\n            </div>\n        </div>\n    </ng-container>\n\n    <ng-template #mainPanel>\n        <div [formGroup]=\"form\" class=\"many-inputs\">\n            <div class=\"input-container\">\n                <label for=\"home.header.title\" trans>Header Title</label>\n                <input type=\"text\" id=\"home.header.title\" formControlName=\"headerTitle\"\n                       [placeholder]=\"defaultValue('headerTitle')\" highlightInPreview=\".header-title\" required>\n            </div>\n            <div class=\"input-container\">\n                <label for=\"home.header.subtitle\" trans>Header Subtitle</label>\n                <textarea type=\"text\" id=\"home.header.subtitle\" formControlName=\"headerSubtitle\" rows=\"4\"\n                          [placeholder]=\"defaultValue('headerSubtitle')\" highlightInPreview=\".header-description\"\n                          required></textarea>\n            </div>\n\n            <appearance-image-input [defaultValue]=\"defaultValue('headerImage')\"\n                                    highlightInPreview=\".hero\"\n                                    diskPrefix=\"homepage\"\n                                    formControlName=\"headerImage\" trans>Header Image\n            </appearance-image-input>\n\n            <mat-slider min=\"0\" max=\"1\" step=\"0.1\" formControlName=\"headerImageOpacity\" class=\"opacity-slider\"></mat-slider>\n\n            <color-picker-input formControlName=\"headerOverlayColor1\" trans>Header Overlay Color 1</color-picker-input>\n            <color-picker-input formControlName=\"headerOverlayColor2\" trans>Header Overlay Color 2</color-picker-input>\n\n            <div class=\"separator\"></div>\n\n            <ul class=\"unstyled-list\">\n                <li (click)=\"openSubpanel('actions')\" class=\"nav-item\">\n                    <span class=\"text\" trans>Action Buttons</span>\n                    <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\n                </li>\n                <li (click)=\"openSubpanel('primaryFeatures')\" class=\"nav-item\">\n                    <span class=\"text\" trans>Primary Features</span>\n                    <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\n                </li>\n                <li (click)=\"openSubpanel('secondaryFeatures')\" class=\"nav-item\">\n                    <span class=\"text\" trans>Secondary Features</span>\n                    <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\n                </li>\n            </ul>\n\n            <div class=\"separator\"></div>\n\n            <div class=\"input-container\">\n                <label for=\"home.footer.title\" trans>Footer Title</label>\n                <input type=\"text\" id=\"home.footer.title\" formControlName=\"footerTitle\"\n                       [placeholder]=\"defaultValue('footerTitle')\" highlightInPreview=\".footer-title\" required>\n            </div>\n            <div class=\"input-container\">\n                <label for=\"home.footer.subtitle\" trans>Footer Subtitle</label>\n                <textarea type=\"text\" id=\"home.footer.subtitle\" formControlName=\"footerSubtitle\" rows=\"4\"\n                          [placeholder]=\"defaultValue('footerSubtitle')\" highlightInPreview=\".footer-description\"\n                          required></textarea>\n            </div>\n            <appearance-image-input [defaultValue]=\"defaultValue('footerImage')\"\n                                    highlightInPreview=\".bottom-cta\"\n                                    diskPrefix=\"homepage\"\n                                    formControlName=\"footerImage\" trans>Footer Image\n            </appearance-image-input>\n        </div>\n    </ng-template>\n</div>\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 '../../../homepage/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            cta1: [''],\n            cta2: [''],\n            cta3: [''],\n        }),\n        primaryFeatures: this.fb.array([]),\n        secondaryFeatures: this.fb.array([]),\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 {BaseAppearanceModule} from '@common/admin/appearance/base-appearance.module';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatSliderModule} from '@angular/material/slider';\nimport {ColorPickerInputModule} from '@common/core/ui/color-picker/color-picker-input/color-picker-input.module';\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';\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 {HomepageAppearancePanelComponent} from './homepage-appearance-panel/homepage-appearance-panel.component';\nimport {AppearanceEditorConfig} from '../../../common/admin/appearance/appearance-editor-config.token';\n\nexport const APP_APPEARANCE_CONFIG: AppearanceEditorConfig = {\n    defaultRoute: 'drive',\n    navigationRoutes: [\n        's',\n        'drive',\n    ],\n    menus: {\n        positions: [\n            'drive-navbar',\n            'drive-sidebar',\n            'homepage-navbar',\n            'admin-navbar',\n            'custom-page-navbar',\n            'footer',\n            'footer-secondary',\n        ],\n        availableRoutes: [\n            'drive/shares',\n            'drive/recent',\n            'drive/starred',\n            'drive/trash',\n            'drive/workspaces',\n        ]\n    },\n    sections: [\n        {\n            name: 'landing page',\n            component: HomepageAppearancePanelComponent,\n            position: 1,\n            route: '/',\n        }\n    ]\n};\n","import { ConnectedPosition } from '@angular/cdk/overlay';\n\nexport const RIGHT_POSITION: ConnectedPosition[] = [\n    {originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 5},\n    {originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: 5},\n];\n"]}

Zerion Mini Shell 1.0