Unsere GitLab-Installation wurde aktualisiert (Informationen zu den Neuerungen).

Fix some serverside rendering calls to browser-only variables. Fix unit tests....

Fix some serverside rendering calls to browser-only variables. Fix unit tests. Add some static styles for the loading circle.
parent e9696d6b
Pipeline #15424 failed with stages
in 1 minute and 19 seconds
......@@ -15,7 +15,6 @@ install:
- npm install
test:
allow_failure: true
stage: test
only:
- master
......@@ -31,20 +30,11 @@ build:
tags:
- nodejs
script:
- npm run build:PROD
- npm run build:SSR
artifacts:
paths:
- dist
compress:
stage: compress
only:
- master
tags:
- nodejs
script:
- npm run compress
deploy:
stage: deploy
only:
......
......@@ -30,9 +30,11 @@
"src/assets/fonts",
"src/assets/i18n",
"src/assets/icons",
"src/assets/styles",
"src/assets/serverEndpoint.json"
],
"styles": [
"src/test.scss",
"src/styles.scss",
{
"input": "./node_modules/bootstrap/dist/css/bootstrap.css"
......
This diff is collapsed.
......@@ -12,7 +12,7 @@
"start:SSR": "node dist/server",
"start:DEV": "ng serve --host 0.0.0.0 --port 4200 --disable-host-check --aot",
"build:DEV": "ng serve --host 0.0.0.0 --port 4200 --disable-host-check --aot --prod",
"build:SSR": "npm run build:PROD && npm run build:SERVER && npm run webpack:SERVER",
"build:SSR": "npm run build:PROD && npm run purify && npm run build:SERVER && npm run webpack:SERVER",
"build:SERVER": "ng run frontend:server",
"build:PROD": "ng build --prod",
"build:PROD-STATS": "ng build --prod --stats-json",
......@@ -22,10 +22,11 @@
"lint": "ng lint",
"pree2e": "webdriver-manager update --standalone false --gecko false",
"e2e": "ng e2e --no-webdriver-update",
"precompress": "node purifycss.js",
"purify": "node purifycss.js",
"compress": "gzip dist/browser/** -r",
"http-startup": "http-server dist/browser/ -p 4711 --gzip",
"prod-test": "npm run build:PROD && npm run compress && npm run http-startup"
"prod-test": "npm run build:PROD && npm run purify && npm run compress && npm run http-startup",
"prod-test:SSR": "npm run build:SSR && npm run start:SSR"
},
"private": true,
"dependencies": {
......@@ -72,13 +73,11 @@
"arsnova-click-v2-types": "git+https://git.thm.de/arsnova/arsnova-click-v2-types.git",
"codelyzer": "^4.3.0",
"http-server": "^0.11.1",
"istanbul-instrumenter-loader": "^3.0.1",
"jasmine": "^3.1.0",
"jasmine-core": "~3.1.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~2.0.2",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~1.4.2",
"karma-coverage-istanbul-reporter": "~2.0.0",
"karma-jasmine": "~1.1.2",
"karma-jasmine-html-reporter": "^1.1.0",
"karma-mocha-reporter": "^2.2.5",
......
......@@ -5,6 +5,7 @@ import 'reflect-metadata';
import { enableProdMode } from '@angular/core';
import * as express from 'express';
import * as compress from 'compression';
import { join } from 'path';
// Express Engine
......@@ -17,10 +18,11 @@ enableProdMode();
// Express server
const app = express();
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist');
app.use(compress());
// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const { RootServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main');
......
......@@ -92,7 +92,9 @@ export class HeaderComponent implements OnInit {
ngOnInit() {
this.router.events.subscribe((url: any) => {
this.inHomeRoute = (location.pathname === '/home' || location.pathname === '/');
if (isPlatformBrowser(this.platformId)) {
this.inHomeRoute = (location.pathname === '/home' || location.pathname === '/');
}
});
}
......
......@@ -23,6 +23,7 @@ import {WebsocketMockService} from '../../service/websocket.mock.service';
import {ConnectionMockService} from '../../service/connection.mock.service';
import {ActiveQuestionGroupMockService} from '../../service/active-question-group.mock.service';
import {TrackingMockService} from '../../service/tracking.mock.service';
import {HeaderLabelService} from '../../service/header-label.service';
describe('LivePreviewComponent', () => {
let component: LivePreviewComponent;
......@@ -55,6 +56,7 @@ describe('LivePreviewComponent', () => {
FooterBarService,
SharedService,
SettingsService,
HeaderLabelService,
{provide: TrackingService, useClass: TrackingMockService},
],
declarations: [LivePreviewComponent]
......
......@@ -16,12 +16,11 @@ import {WebsocketService} from '../../../service/websocket.service';
import {HeaderLabelService} from '../../../service/header-label.service';
import {ActiveQuestionGroupService} from '../../../service/active-question-group.service';
import {TrackingService} from '../../../service/tracking.service';
import {Angulartics2Module} from 'angulartics2';
import {ArsnovaClickAngulartics2Piwik} from '../../../shared/tracking/ArsnovaClickAngulartics2Piwik';
import {WebsocketMockService} from '../../../service/websocket.mock.service';
import {ConnectionMockService} from '../../../service/connection.mock.service';
import {ActiveQuestionGroupMockService} from '../../../service/active-question-group.mock.service';
import {TrackingMockService} from '../../../service/tracking.mock.service';
import {FooterModule} from '../../../footer/footer.module';
describe('QuizManagerComponent', () => {
let component: QuizManagerComponent;
......@@ -32,6 +31,7 @@ describe('QuizManagerComponent', () => {
imports: [
RouterTestingModule,
HttpClientModule,
FooterModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
......
......@@ -4,7 +4,7 @@ describe('RootModule', () => {
let RootModuleModule: RootModule;
beforeEach(() => {
RootModuleModule = new RootModule(null, null);
RootModuleModule = new RootModule();
});
it('should create an instance', () => {
......
......@@ -5,16 +5,16 @@
<div class="container-fluid" style="height: 90vh;">
<div class="row flex-sm-nowrap h-100">
<div class="footer-bar-wrapper p-0 relative" style="height: 50px;">
<div class="footer-bar-wrapper p-0 relative">
<app-footer-bar [footerElements]="getFooterBarElements()"></app-footer-bar>
<div class="d-none d-md-block">
<router-outlet name="additionalData-md" class="d-none d-md-block"></router-outlet>
</div>
</div>
<div id="content-container" class="container">
<main id="content-container" class="container">
<router-outlet></router-outlet>
</div>
</main>
</div>
</div>
</div>
......@@ -31,9 +31,9 @@
flex-shrink: 0;
flex-grow: 0;
/* TODO: media-breakpoint-only(xs) currently buggy in Bootstrap-v4-Beta-1 (29.09.2017) */
@include media-breakpoint-down(xs) {
@include media-breakpoint-only(xs) {
width: 100%;
height: 50px;
}
}
......
import {async, ComponentFixture, inject, TestBed} from '@angular/core/testing';
import {RootComponent} from './root.component';
import {HttpClient, HttpClientModule} from '@angular/common/http';
import {Angulartics2Module} from 'angulartics2';
import {ConnectionService} from '../../service/connection.service';
import {createTranslateLoader} from '../../../lib/translation.factory';
import {CurrentQuizMockService} from '../../service/current-quiz.mock.service';
......@@ -12,7 +11,6 @@ import {RouterTestingModule} from '@angular/router/testing';
import {TranslateMessageFormatCompiler} from 'ngx-translate-messageformat-compiler';
import {HeaderLabelService} from '../../service/header-label.service';
import {ThemesService} from '../../service/themes.service';
import {ArsnovaClickAngulartics2Piwik} from '../../shared/tracking/ArsnovaClickAngulartics2Piwik';
import {FooterBarService} from '../../service/footer-bar.service';
import {CurrentQuizService} from '../../service/current-quiz.service';
import {SharedService} from '../../service/shared.service';
......@@ -84,6 +82,7 @@ describe('RootComponent', () => {
it('should be created', async(inject([HttpClient, HttpTestingController],
(http: HttpClient, backend: HttpTestingController) => {
const environmentData = require(`../../../assets/serverEndpoint.json`);
backend.match(`${DefaultSettings.httpLibEndpoint}/linkImages/theme-Material`).forEach(match => match.flush([]));
backend.expectOne(`assets/serverEndpoint.json`).flush(environmentData);
backend.expectOne(`./assets/i18n/en.json`).flush({});
backend.expectOne(`${DefaultSettings.httpApiEndpoint}/themes`).flush({});
......@@ -91,4 +90,8 @@ describe('RootComponent', () => {
expect(component).toBeTruthy();
}))
);
it('should contain a TYPE reference', async(() => {
expect(RootComponent.TYPE).toEqual('RootComponent');
}));
});
......@@ -17,8 +17,6 @@ import {ThemesService} from '../../service/themes.service';
import {CurrentQuizService} from '../../service/current-quiz.service';
import {CurrentQuizMockService} from '../../service/current-quiz.mock.service';
import {TrackingService} from '../../service/tracking.service';
import {Angulartics2Module} from 'angulartics2';
import {ArsnovaClickAngulartics2Piwik} from '../../shared/tracking/ArsnovaClickAngulartics2Piwik';
import {WebsocketMockService} from '../../service/websocket.mock.service';
import {ConnectionMockService} from '../../service/connection.mock.service';
import {DefaultSettings} from '../../../lib/default.settings';
......@@ -73,9 +71,14 @@ describe('ThemeSwitcherComponent', () => {
it('should be created', async(inject([HttpClient, HttpTestingController],
(http: HttpClient, backend: HttpTestingController) => {
backend.match(`${DefaultSettings.httpLibEndpoint}/linkImages/theme-Material`).forEach(match => match.flush([]));
backend.expectOne(`${DefaultSettings.httpApiEndpoint}/themes`).flush({});
backend.verify();
expect(component).toBeTruthy();
}))
);
it('should contain a TYPE definition', async(() => {
expect(ThemeSwitcherComponent.TYPE).toEqual('ThemeSwitcherComponent');
}));
});
......@@ -62,19 +62,21 @@ export class ThemesService {
usedTheme = this.currentQuizService.quiz.sessionConfig.theme;
}
const themeDataset = document.getElementsByTagName('html').item(0).dataset['theme'];
if (themeDataset === usedTheme) {
if (!document.getElementById('link-manifest') && themeDataset === usedTheme) {
this.reloadLinkNodes(usedTheme);
return;
}
this._currentTheme = usedTheme;
document.getElementsByTagName('html').item(0).dataset['theme'] = usedTheme;
this.reloadLinkNodes();
if (themeDataset !== usedTheme) {
this._currentTheme = usedTheme;
document.getElementsByTagName('html').item(0).dataset['theme'] = usedTheme;
this.reloadLinkNodes();
}
}
}
public reloadLinkNodes(target?): void {
if (isPlatformServer(this.platformId)) {
if (isPlatformServer(this.platformId) || (!document.getElementById('link-manifest') && !target)) {
return;
}
......
html[data-theme=theme-arsnova-dot-click-contrast] #loader-wrapper #loader,html[data-theme=theme-blackbeauty] #loader-wrapper #loader,html[data-theme=theme-elegant] #loader-wrapper #loader{border:3px solid transparent;border-top-color:#3498db}html[data-theme=theme-arsnova-dot-click-contrast] #loader-wrapper #loader:before,html[data-theme=theme-blackbeauty] #loader-wrapper #loader:before,html[data-theme=theme-elegant] #loader-wrapper #loader:before{content:' ';border:3px solid transparent;border-top-color:#f9c922}html[data-theme=theme-arsnova-dot-click-contrast] #loader-wrapper #loader:after,html[data-theme=theme-blackbeauty] #loader-wrapper #loader:after,html[data-theme=theme-elegant] #loader-wrapper #loader:after{content:' ';border:3px solid transparent;border-top-color:#e74c3c}html[data-theme=theme-GreyBlue-Lime] #loader-wrapper #loader,html[data-theme=theme-Material-blue] #loader-wrapper #loader,html[data-theme=theme-Material-hope] #loader-wrapper #loader,html[data-theme=theme-Material] #loader-wrapper #loader,html[data-theme=theme-decent-blue] #loader-wrapper #loader,html[data-theme=theme-spiritual-purple] #loader-wrapper #loader{border:3px solid transparent;border-top-color:#fff}html[data-theme=theme-GreyBlue-Lime] #loader-wrapper #loader:before,html[data-theme=theme-Material-blue] #loader-wrapper #loader:before,html[data-theme=theme-Material] #loader-wrapper #loader:before,html[data-theme=theme-spiritual-purple] #loader-wrapper #loader:before{content:' ';border:3px solid transparent;border-top-color:#4db6ac}html[data-theme=theme-Material] #loader-wrapper #loader:after{content:' ';border:3px solid transparent;border-top-color:#ff9800}html[data-theme=theme-Material-hope] #loader-wrapper #loader:before{content:' ';border:3px solid transparent;border-top-color:#ffa000}html[data-theme=theme-Material-hope] #loader-wrapper #loader:after{content:' ';border:3px solid transparent;border-top-color:#ffc400}html[data-theme=theme-Material-blue] #loader-wrapper #loader:after{content:' ';border:3px solid transparent;border-top-color:#4caf50}html[data-theme=theme-decent-blue] #loader-wrapper #loader:before{content:' ';border:3px solid transparent;border-top-color:#455a64}html[data-theme=theme-decent-blue] #loader-wrapper #loader:after{content:' ';border:3px solid transparent;border-top-color:#00c853}html[data-theme=theme-spiritual-purple] #loader-wrapper #loader:after{content:' ';border:3px solid transparent;border-top-color:#00bcd4}html[data-theme=theme-GreyBlue-Lime] #loader-wrapper #loader:after{content:' ';border:3px solid transparent;border-top-color:#c0ca33}
\ No newline at end of file
/*
* This file is part of ARSnova Click.
* Copyright (C) 2016 The ARSnova Team
*
* ARSnova Click is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ARSnova Click is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ARSnova Click. If not, see <http://www.gnu.org/licenses/>.*/
@import "standard-style-definitions";
@import "theme-arsnova-dot-click-contrast";
@import "theme-blackbeauty";
@import "theme-elegant";
@import "theme-Material";
@import "theme-Material-hope";
@import "theme-decent-blue";
@import "theme-Material-blue";
@import "theme-spiritual-purple";
@import "theme-GreyBlue-Lime";
$themes: (
theme-arsnova-dot-click-contrast: map-merge(standard-style-definitions(), theme-arsnova-dot-click-contrast()),
theme-blackbeauty: map-merge(standard-style-definitions(), theme-blackbeauty()),
theme-elegant: map-merge(standard-style-definitions(), theme-elegant()),
theme-Material: map-merge(standard-style-definitions(), theme-Material()),
theme-Material-hope: map-merge(standard-style-definitions(), theme-Material-hope()),
theme-Material-blue: map_merge(standard-style-definitions(), theme-Material-blue()),
theme-decent-blue: map-merge(standard-style-definitions(), theme-decent-blue()),
theme-spiritual-purple: map-merge(standard-style-definitions(), theme-spiritual-purple()),
theme-GreyBlue-Lime: map-merge(standard-style-definitions(), theme-GreyBlue-Lime())
);
@import "../../variables";
@each $theme, $map in $themes {
html[data-theme=#{$theme}] {
......
<!doctype html>
<html lang="en" data-theme="">
<html lang="en" data-theme="theme-Material">
<head>
<title>arsnova.click</title>
......@@ -20,14 +20,14 @@
<base href="/">
<link rel="preload" as="style" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.css">
<link rel="preload" as="script" type="text/javascript" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.js">
<link rel="preload" as="style" type="text/css" href="assets/styles/loader.css" />
<link rel="prefetch" as="style" href="https://fonts.googleapis.com/css?family=Roboto:400,500,700,900"/>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.css">
<script async defer src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.css" />
<noscript>
<div role="main">
<link rel="stylesheet" type="text/css" href="assets/styles/noscript.css" />
<main>
<div>
<h1>JavaScript nicht aktiviert</h1>
<p>Um arsnova.click nutzen zu können, muss JavaScript aktiviert sein!</p>
......@@ -48,29 +48,32 @@
<p>JavaScript es necesario para ejecutar arsnova.click!</p>
<hr/>
</div>
</div>
</main>
</noscript>
</head>
<body>
<!-- Include FontAwesome via JS -->
<script async defer src="https://use.fontawesome.com/releases/v5.0.2/js/all.js"></script>
<div id="theme-wrapper">
<div id="content">
<app-root></app-root>
<script>
const giftofspeed = document.createElement('link');
giftofspeed.rel = 'prefetch';
giftofspeed.href = 'https://fonts.googleapis.com/css?family=Roboto:400,500,700,900';
giftofspeed.type = 'text/css';
const godefer = document.getElementsByTagName('link')[0];
godefer.parentNode.insertBefore(giftofspeed, godefer);
</script>
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
</div>
</div>
</div>
<script async defer src="https://use.fontawesome.com/releases/v5.0.2/js/all.js"></script>
<script async defer src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.js"></script>
<!-- Piwik -->
<script type="text/javascript">
window.addEventListener('load', function () {
document.getElementById('loader-wrapper').remove();
});
var _paq = _paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
//_paq.push(["setDocumentTitle", document.domain + "/" + document.title]);
// _paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
const u="https://arsnova.thm.de/stats/";
......@@ -80,22 +83,5 @@
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Piwik Code -->
<div id="theme-wrapper">
<div id="content">
<app-root>
<div class="row">
<div class="col-md-12">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
</div>
</div>
</div>
</app-root>
</div>
</div>
</body>
</html>
......@@ -27,6 +27,7 @@ module.exports = function (config) {
flags: [
'--headless',
'--disable-gpu',
'--no-sandbox',
'--remote-debugging-port=9222',
],
}
......@@ -36,7 +37,7 @@ module.exports = function (config) {
},
reporters: config.angularCli && config.angularCli.codeCoverage
? ['progress', 'coverage-istanbul']
: ['progress', 'mocha'],
: ['mocha'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
......
......@@ -96,104 +96,6 @@ img[alt*="emoji_"] {
display: none;
}
/*
Credits: https://ihatetomatoes.net/create-custom-preloading-screen/
*/
#loader-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1000;
.loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
z-index: 1000;
-webkit-transform: translateX(0); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: translateX(0); /* IE 9 */
transform: translateX(0); /* Firefox 16+, IE 10+, Opera */
&.section-left {
left: 0;
}
&.section-right {
right: 0;
}
}
#loader {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border-radius: 50%;
-webkit-animation: spin 2s linear infinite; /* Chrome, Opera 15+, Safari 5+ */
animation: spin 2s linear infinite; /* Chrome, Firefox 16+, IE 10+, Opera */
z-index: 1001;
&:before {
content: "";
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
-webkit-animation: spin 3s linear infinite; /* Chrome, Opera 15+, Safari 5+ */
animation: spin 3s linear infinite; /* Chrome, Firefox 16+, IE 10+, Opera */
}
&:after {
content: "";
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
-webkit-animation: spin 1.5s linear infinite; /* Chrome, Opera 15+, Safari 5+ */
animation: spin 1.5s linear infinite; /* Chrome, Firefox 16+, IE 10+, Opera */
}
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(0deg); /* IE 9 */
transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */
}
100% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(0deg); /* IE 9 */
transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */
}
100% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */
}
}
}
@mixin placeholder-align-center {
text-align: center;
padding: 1.5rem 0;
......
@import "variables";
@each $theme, $map in $themes {
html[data-theme=#{$theme}] {
#loader-wrapper {
#loader {
border: 3px solid transparent;
border-top-color: map-get($map, "border-loader_wrapper-outer_spin");
&:before {
content: ' ';
border: 3px solid transparent;
border-top-color: map-get($map, "border-loader_wrapper-inner_spin");
}
&:after {
content: ' ';
border: 3px solid transparent;
border-top-color: map-get($map, "border-loader_wrapper-middle_spin");
}
}
}
}
}
\ No newline at end of file
......@@ -7,39 +7,20 @@ import {
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
declare const __karma__: any;
declare const require: any;
// Prevent Karma from running prematurely.
__karma__.loaded = function () {
};
// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
// Then we find all the tests.
//const context = require.context('./app', true, /\.spec\.ts$/);
//const context = require('./app/root.component.spec.ts');
// And load the modules.
//context.keys().map(context);
/*
function importAll (r) {
r.keys().forEach((el, i) => {
r(el);
console.log(i);
if (i === r.keys().length - 1) {
__karma__.start();
}
});
}
importAll(require.context('./app', true, /\.spec\.ts$/));
*/
/**
* Then we find all the tests.
* In case this stuff failes again without error, use this code to walk through all components step by step until the tests begin to fail:
* @see https://github.com/angular/angular-cli/issues/10485
* Example: /(footer.*|header.*)\.spec\.ts$/
*/
const context = require.context('./', true, /\.spec\.ts$/);
context.keys().map(context);
@import "./assets/themes/standard-style-definitions";
@import "./assets/themes/theme-arsnova-dot-click-contrast";
@import "./assets/themes/theme-blackbeauty";
@import "./assets/themes/theme-elegant";
@import "./assets/themes/theme-Material";
@import "./assets/themes/theme-Material-hope";
@import "./assets/themes/theme-decent-blue";
@import "./assets/themes/theme-Material-blue";
@import "./assets/themes/theme-spiritual-purple";
@import "./assets/themes/theme-GreyBlue-Lime";
$themes: (
theme-arsnova-dot-click-contrast: map-merge(standard-style-definitions(), theme-arsnova-dot-click-contrast()),
theme-blackbeauty: map-merge(standard-style-definitions(), theme-blackbeauty()),
theme-elegant: map-merge(standard-style-definitions(), theme-elegant()),
theme-Material: map-merge(standard-style-definitions(), theme-Material()),
theme-Material-hope: map-merge(standard-style-definitions(), theme-Material-hope()),
theme-Material-blue: map_merge(standard-style-definitions(), theme-Material-blue()),
theme-decent-blue: map-merge(standard-style-definitions(), theme-decent-blue()),
theme-spiritual-purple: map-merge(standard-style-definitions(), theme-spiritual-purple()),
theme-GreyBlue-Lime: map-merge(standard-style-definitions(), theme-GreyBlue-Lime())
);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment