From 09dc13b4f87d21fde6fe64b11c17b79b231c22aa Mon Sep 17 00:00:00 2001
From: silas
Date: Thu, 22 Apr 2021 15:36:46 +0200
Subject: [PATCH] new design(?)
---
config.xml | 2 +-
package.json | 56 +-
src/client/globals.d.ts | 8 -
src/client/html/sites/impressum.html | 6 +-
src/client/html/sites/settingsSite.html | 20 +-
src/client/index.html | 2 +-
...gment.js => WordRotatorSettingFragment.ts} | 16 +-
.../Sites/{ContactSite.js => ContactSite.ts} | 5 +-
src/client/js/Sites/CreditsSite.js | 19 -
src/client/js/Sites/CreditsSite.ts | 13 +
...{DeleteWordsSite.js => DeleteWordsSite.ts} | 15 +-
src/client/js/Sites/EndSite.js | 14 -
src/client/js/Sites/EndSite.ts | 8 +
.../{ImpressumSite.js => ImpressumSite.ts} | 9 +-
.../js/Sites/{LevelSite.js => LevelSite.ts} | 67 +-
.../{MainMenuSite.js => MainMenuSite.ts} | 259 ++++----
...vacyPolicySite.js => PrivacyPolicySite.ts} | 9 +-
...{SelectWordsSite.js => SelectWordsSite.ts} | 14 +-
.../{SettingsSite.js => SettingsSite.ts} | 5 +-
src/client/js/Sites/WordRotatorBaseSite.js | 12 -
src/client/js/model/LevelPlayed.ts | 7 +-
.../Level/{LevelHelper.js => LevelHelper.ts} | 36 +-
src/client/sass/_mainMenu.scss | 0
src/client/sass/_navbarOverride.scss | 44 ++
src/client/sass/_themeBlue.scss | 88 +++
src/client/sass/_wordRotator_old.scss | 394 -----------
src/client/sass/_wordrotatorTheme.scss | 35 +-
src/client/sass/foundation.scss | 67 --
src/client/sass/index.scss | 9 +-
src/client/sass/lib/_actionBar.scss | 250 -------
src/client/sass/lib/_core.scss | 4 +-
src/client/sass/lib/_form.scss | 86 ---
src/client/sass/lib/_foundationSettings.scss | 621 ------------------
src/client/sass/lib/_listjs.scss | 54 --
src/client/sass/lib/_modal.scss | 91 ---
src/client/sass/lib/_pwaAssets.scss | 7 -
src/client/sass/lib/_settingsSite.scss | 45 +-
src/client/sass/wordRotator.scss | 37 +-
src/client/translations/de.json | 5 +-
src/server/public/config.xml | 2 +-
src/server/public/service-worker.js.map | 2 +-
src/server/public/wordRotator.apk | Bin 6485429 -> 6485429 bytes
tests/setup.js | 2 +-
tests/specs/shared/playLevels.js | 6 +-
tests/wdio.config.browser.js | 3 +-
tsconfig.json | 7 +-
46 files changed, 508 insertions(+), 1953 deletions(-)
delete mode 100644 src/client/globals.d.ts
rename src/client/js/Fragment/{WordRotatorSettingFragment.js => WordRotatorSettingFragment.ts} (92%)
rename src/client/js/Sites/{ContactSite.js => ContactSite.ts} (93%)
delete mode 100644 src/client/js/Sites/CreditsSite.js
create mode 100644 src/client/js/Sites/CreditsSite.ts
rename src/client/js/Sites/{DeleteWordsSite.js => DeleteWordsSite.ts} (88%)
delete mode 100644 src/client/js/Sites/EndSite.js
create mode 100644 src/client/js/Sites/EndSite.ts
rename src/client/js/Sites/{ImpressumSite.js => ImpressumSite.ts} (55%)
rename src/client/js/Sites/{LevelSite.js => LevelSite.ts} (91%)
rename src/client/js/Sites/{MainMenuSite.js => MainMenuSite.ts} (70%)
rename src/client/js/Sites/{PrivacyPolicySite.js => PrivacyPolicySite.ts} (82%)
rename src/client/js/Sites/{SelectWordsSite.js => SelectWordsSite.ts} (90%)
rename src/client/js/Sites/{SettingsSite.js => SettingsSite.ts} (88%)
delete mode 100644 src/client/js/Sites/WordRotatorBaseSite.js
rename src/client/js/wordrotator/Level/{LevelHelper.js => LevelHelper.ts} (72%)
delete mode 100644 src/client/sass/_mainMenu.scss
create mode 100644 src/client/sass/_navbarOverride.scss
create mode 100644 src/client/sass/_themeBlue.scss
delete mode 100644 src/client/sass/_wordRotator_old.scss
delete mode 100644 src/client/sass/foundation.scss
delete mode 100644 src/client/sass/lib/_actionBar.scss
delete mode 100644 src/client/sass/lib/_form.scss
delete mode 100644 src/client/sass/lib/_foundationSettings.scss
delete mode 100644 src/client/sass/lib/_listjs.scss
delete mode 100644 src/client/sass/lib/_modal.scss
delete mode 100644 src/client/sass/lib/_pwaAssets.scss
diff --git a/config.xml b/config.xml
index 852344f..7cd6608 100644
--- a/config.xml
+++ b/config.xml
@@ -1,5 +1,5 @@
-
+
WordRotator
A word-game
diff --git a/package.json b/package.json
index 8e9a019..6d20ba0 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "wordrotator",
"displayName": "WordRotator",
- "version": "1.2.0",
+ "version": "1.3.0",
"main": "index.js",
"scripts": {
"server": "ts-node src/server/index.ts",
@@ -17,13 +17,12 @@
"typeorm": "ts-node ./node_modules/typeorm/cli -f ./ormconfig.ts"
},
"dependencies": {
- "@types/node": "^14.11.8",
+ "@types/node": "^14.14.27",
"body-parser": "^1.19.0",
"cordova-android": "^9.0.0",
"cordova-browser": "^6.0.0",
"cordova-ios": "^6.1.1",
- "cordova-plugin-share": "^0.1.3",
- "cordova-sites": "git+https://github.com/Ainias/cordova-sites.git#0.6.5",
+ "cordova-sites": "git+https://github.com/Ainias/cordova-sites.git#0.7.10",
"cordova-sites-database": "git+https://github.com/Ainias/cordova-sites-database.git#0.4.4",
"cordova-sites-easy-sync": "git+https://github.com/Ainias/cordova-sites-easy-sync.git#0.6.7",
"cordova-sites-user-management": "git+https://github.com/Ainias/cordova-sites-user-management.git#0.5.4",
@@ -31,32 +30,28 @@
"cs-event-manager": "git+https://git@github.com/Ainias/event-manager.git#0.2",
"dotenv": "^8.2.0",
"express": "^4.17.1",
- "foundation-sites": "^6.6.3",
- "js-helper": "git+https://github.com/Ainias/js-helper.git#0.4.1",
+ "js-helper": "git+https://github.com/Ainias/js-helper.git#0.6.6",
"jsonwebtoken": "^8.5.1",
- "localforage": "^1.9.0",
"mysql": "^2.18.1",
"nodemailer": "^6.4.14",
- "sql.js": "1.3.2",
- "ts-node": "9.0.0",
- "typeorm": "^0.2.28",
- "ts-loader": "^8.0.5",
- "typescript": "^4.0.3"
+ "ts-node": "9.1.1",
+ "typeorm": "^0.2.31",
+ "typescript": "^4.1.5"
},
"devDependencies": {
- "@babel/core": "^7.12.1",
- "@babel/plugin-transform-runtime": "^7.12.1",
+ "@babel/core": "^7.13.15",
+ "@babel/plugin-transform-runtime": "^7.13.15",
"@babel/polyfill": "^7.12.1",
- "@babel/preset-env": "^7.12.1",
- "@wdio/appium-service": "^6.6.3",
- "@wdio/cli": "^6.6.6",
- "@wdio/jasmine-framework": "^6.6.6",
- "@wdio/local-runner": "^6.6.6",
- "@wdio/selenium-standalone-service": "^6.6.5",
- "@wdio/spec-reporter": "^6.6.6",
- "appium": "1.15.1",
- "appium-doctor": "^1.15.3",
- "autoprefixer": "^10.0.1",
+ "@babel/preset-env": "^7.13.15",
+ "@wdio/appium-service": "^7.4.2",
+ "@wdio/cli": "^7.4.6",
+ "@wdio/jasmine-framework": "^7.4.6",
+ "@wdio/local-runner": "^7.4.6",
+ "@wdio/selenium-standalone-service": "^7.4.2",
+ "@wdio/spec-reporter": "^7.4.3",
+ "appium": "1.20.2",
+ "appium-doctor": "^1.16.0",
+ "autoprefixer": "^10.2.5",
"babel-loader": "^8.1.0",
"babel-preset-env": "^1.7.0",
"clean-webpack-plugin": "^3.0.0",
@@ -64,6 +59,7 @@
"cordova-plugin-device": "^2.0.3",
"cordova-plugin-file": "^6.0.2",
"cordova-plugin-nativestorage": "^2.3.2",
+ "cordova-plugin-share": "^0.1.3",
"cordova-plugin-tts": "^0.2.3",
"cordova-plugin-webpack": "^1.0.5",
"cordova-plugin-whitelist": "^1.3.4",
@@ -71,14 +67,18 @@
"css-loader": "^5.0.0",
"extract-loader": "^5.1.0",
"file-loader": "^6.1.1",
+ "foundation-sites": "^6.6.3",
"html-loader": "^1.3.2",
"html-webpack-plugin": "^4.5.0",
- "jasmine": "^3.6.2",
- "node-sass": "^4.14.1",
- "postcss-loader": "^4.0.4",
+ "jasmine": "^3.7.0",
+ "localforage": "^1.9.0",
+ "node-sass": "^5.0.0",
+ "postcss-loader": "^5.2.0",
"sass-loader": "^10.0.3",
+ "sql.js": "1.3.2",
"terser-webpack-plugin": "^5.0.0",
- "webpack": "^5.1.2",
+ "ts-loader": "^8.0.17",
+ "webpack": "^4.46.0",
"webpack-cli": "^3.3.12",
"webpack-dev-server": "^3.11.0",
"workbox-precaching": "^5.1.4",
diff --git a/src/client/globals.d.ts b/src/client/globals.d.ts
deleted file mode 100644
index 71a1a90..0000000
--- a/src/client/globals.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-declare var require: {
- (path: string): T;
- (paths: string[], callback: (...modules: any[]) => void): void;
- ensure: (
- paths: string[],
- callback: (require: (path: string) => T) => void
- ) => void;
-};
\ No newline at end of file
diff --git a/src/client/html/sites/impressum.html b/src/client/html/sites/impressum.html
index 2bcaa05..8741fb0 100644
--- a/src/client/html/sites/impressum.html
+++ b/src/client/html/sites/impressum.html
@@ -5,7 +5,7 @@
52064 Aachen
Deutschland
- E-Mail: wordRotator@silas.link
- Kontaktformular
+
E-Mail: wordRotator@silas.link
+ Kontaktformular
-
\ No newline at end of file
+
diff --git a/src/client/html/sites/settingsSite.html b/src/client/html/sites/settingsSite.html
index 773c83b..3e7f084 100644
--- a/src/client/html/sites/settingsSite.html
+++ b/src/client/html/sites/settingsSite.html
@@ -1,17 +1,3 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/src/client/index.html b/src/client/index.html
index a58de46..3134a46 100644
--- a/src/client/index.html
+++ b/src/client/index.html
@@ -22,7 +22,7 @@
-
+
diff --git a/src/client/js/Fragment/WordRotatorSettingFragment.js b/src/client/js/Fragment/WordRotatorSettingFragment.ts
similarity index 92%
rename from src/client/js/Fragment/WordRotatorSettingFragment.js
rename to src/client/js/Fragment/WordRotatorSettingFragment.ts
index 683cd60..e205b50 100644
--- a/src/client/js/Fragment/WordRotatorSettingFragment.js
+++ b/src/client/js/Fragment/WordRotatorSettingFragment.ts
@@ -1,14 +1,13 @@
+const view = require("../../html/fragment/settings.html");
+
import {CreditsSite} from "../Sites/CreditsSite";
import {PrivacyPolicySite} from "../Sites/PrivacyPolicySite";
import {ImpressumSite} from "../Sites/ImpressumSite";
import {NativeStoragePromise} from "cordova-sites/dist/client/js/NativeStoragePromise";
import {AbstractFragment} from "cordova-sites/dist/client/js/Context/AbstractFragment";
-
-import view from "../../html/fragment/settings.html";
import {LevelData} from "../../../shared/model/LevelData";
import {LastSyncDates} from "cordova-sites-easy-sync/dist/client/LastSyncDates";
import {SoundManager} from "cordova-sites/dist/client/js/Sound/SoundManager";
-import {Toast} from "cordova-sites/dist/client/js/Toast/Toast";
import {Matomo} from "cordova-sites/dist/client/js/Legacy/Matomo";
import {LevelPlayed} from "../model/LevelPlayed";
import {ContactSite} from "../Sites/ContactSite";
@@ -32,7 +31,7 @@ export class WordRotatorSettingFragment extends AbstractFragment {
});
if (location.hostname.includes("beta") || location.hostname.includes("127.0.0.1") || location.hostname.includes("localhost")) {
- this.findBy("#reset-levels").classList.remove("hidden");
+ // this.findBy("#reset-levels").classList.remove("hidden");
}
let playMusicButton = this.findBy("#play-music");
@@ -79,13 +78,14 @@ export class WordRotatorSettingFragment extends AbstractFragment {
this.findBy("#impressum-button").addEventListener("click", () => {
this.getSite().startSite(ImpressumSite);
});
- this.findBy("#version-info").innerText = window["version"];
+ // @ts-ignore
+ this.findBy("#version-info").innerText = __VERSION__;
return res;
}
- onStart() {
+ onStart(args) {
Matomo.update("Settings Sites");
- super.onStart();
+ return super.onStart(args);
}
-}
\ No newline at end of file
+}
diff --git a/src/client/js/Sites/ContactSite.js b/src/client/js/Sites/ContactSite.ts
similarity index 93%
rename from src/client/js/Sites/ContactSite.js
rename to src/client/js/Sites/ContactSite.ts
index e9e3fee..5cd97c3 100644
--- a/src/client/js/Sites/ContactSite.js
+++ b/src/client/js/Sites/ContactSite.ts
@@ -1,5 +1,5 @@
+const view = require("../../html/sites/contactSite.html");
-import view from "../../html/sites/contactSite.html"
import {App} from "cordova-sites/dist/client/js/App";
import {Form} from "cordova-sites/dist/client/js/Form";
import {DataManager} from "cordova-sites/dist/client/js/DataManager";
@@ -15,6 +15,7 @@ export class ContactSite extends MenuSite {
onViewLoaded() {
let res = super.onViewLoaded();
+ // @ts-ignore
this.findBy("#contactText").appendChild(Translator.makePersistentTranslation("contact text", [__CONTACT_EMAIL__]))
new Form(this.findBy("#contact-form"), async values => {
@@ -38,4 +39,4 @@ export class ContactSite extends MenuSite {
App.addInitialization((app) => {
app.addDeepLink("contact", ContactSite);
-});
\ No newline at end of file
+});
diff --git a/src/client/js/Sites/CreditsSite.js b/src/client/js/Sites/CreditsSite.js
deleted file mode 100644
index 1656613..0000000
--- a/src/client/js/Sites/CreditsSite.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
-
-import view from "../../html/sites/credits.html"
-import {App} from "cordova-sites/dist/client/js/App";
-
-export class CreditsSite extends WordRotatorBaseSite{
- constructor(siteManager) {
- super(siteManager, view);
- }
-
- onStart(args) {
- // Matomo.update("Credits Sites");
- return super.onStart(args);
- }
-}
-
-App.addInitialization(app => {
- app.addDeepLink("credits", CreditsSite);
-});
\ No newline at end of file
diff --git a/src/client/js/Sites/CreditsSite.ts b/src/client/js/Sites/CreditsSite.ts
new file mode 100644
index 0000000..0aa10bc
--- /dev/null
+++ b/src/client/js/Sites/CreditsSite.ts
@@ -0,0 +1,13 @@
+const view = require("../../html/sites/credits.html");
+import {App} from "cordova-sites/dist/client/js/App";
+import {MenuSite} from "cordova-sites/dist/client";
+
+export class CreditsSite extends MenuSite{
+ constructor(siteManager) {
+ super(siteManager, view);
+ }
+}
+
+App.addInitialization(app => {
+ app.addDeepLink("credits", CreditsSite);
+});
diff --git a/src/client/js/Sites/DeleteWordsSite.js b/src/client/js/Sites/DeleteWordsSite.ts
similarity index 88%
rename from src/client/js/Sites/DeleteWordsSite.js
rename to src/client/js/Sites/DeleteWordsSite.ts
index a5f4545..7082fce 100644
--- a/src/client/js/Sites/DeleteWordsSite.js
+++ b/src/client/js/Sites/DeleteWordsSite.ts
@@ -1,13 +1,15 @@
import {UserMenuAction, UserSite} from "cordova-sites-user-management/dist/client";
-import view from "../../html/sites/deleteLevels.html"
-import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
+const view = require("../../html/sites/deleteLevels.html");
import {App} from "cordova-sites/dist/client/js/App";
import {NavbarFragment} from "cordova-sites/dist/client/js/Context/Menu/NavbarFragment";
import {DataManager} from "cordova-sites/dist/client/js/DataManager";
+import {MenuSite} from "cordova-sites/dist/client";
-export class DeleteWordsSite extends WordRotatorBaseSite {
+export class DeleteWordsSite extends MenuSite {
+ private words: any;
+
constructor(siteManager) {
super(siteManager, view);
this.addDelegate(new UserSite(this, "admin"))
@@ -16,11 +18,12 @@ export class DeleteWordsSite extends WordRotatorBaseSite {
async onConstruct(args) {
let res = super.onConstruct(args);
this.words = (await DataManager.load("getDoubleUsedWordsAction"))["result"];
+ console.log("word", this.words);
return res;
}
onViewLoaded() {
- super.onViewLoaded();
+ const res = super.onViewLoaded();
let levelTemplate = this.findBy("#level-template");
let wordTemplate = this.findBy("#word-template");
@@ -54,6 +57,8 @@ export class DeleteWordsSite extends WordRotatorBaseSite {
}
wordContainer.appendChild(wordElem);
}
+
+ return res;
}
}
@@ -61,4 +66,4 @@ App.addInitialization(app => {
NavbarFragment.defaultActions.push(new UserMenuAction("delete-levels", "admin", () => {
app.startSite(DeleteWordsSite);
}));
-});
\ No newline at end of file
+});
diff --git a/src/client/js/Sites/EndSite.js b/src/client/js/Sites/EndSite.js
deleted file mode 100644
index 2bcc2ad..0000000
--- a/src/client/js/Sites/EndSite.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
-
-import view from "../../html/sites/end.html"
-
-export class EndSite extends WordRotatorBaseSite{
- constructor(siteManager) {
- super(siteManager, view);
- }
-
- onStart(args) {
- // Matomo.update("End Sites");
- return super.onStart(args);
- }
-}
\ No newline at end of file
diff --git a/src/client/js/Sites/EndSite.ts b/src/client/js/Sites/EndSite.ts
new file mode 100644
index 0000000..13c84e5
--- /dev/null
+++ b/src/client/js/Sites/EndSite.ts
@@ -0,0 +1,8 @@
+const view = require("../../html/sites/end.html");
+import {MenuSite} from "cordova-sites/dist/client";
+
+export class EndSite extends MenuSite{
+ constructor(siteManager) {
+ super(siteManager, view);
+ }
+}
diff --git a/src/client/js/Sites/ImpressumSite.js b/src/client/js/Sites/ImpressumSite.ts
similarity index 55%
rename from src/client/js/Sites/ImpressumSite.js
rename to src/client/js/Sites/ImpressumSite.ts
index 22df41e..a9b54d6 100644
--- a/src/client/js/Sites/ImpressumSite.js
+++ b/src/client/js/Sites/ImpressumSite.ts
@@ -1,9 +1,8 @@
-import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
-
-import view from "../../html/sites/impressum.html"
+const view = require("../../html/sites/impressum.html");
import {App} from "cordova-sites/dist/client/js/App";
+import {MenuSite} from "cordova-sites/dist/client";
-export class ImpressumSite extends WordRotatorBaseSite{
+export class ImpressumSite extends MenuSite{
constructor(siteManager) {
super(siteManager, view);
}
@@ -11,4 +10,4 @@ export class ImpressumSite extends WordRotatorBaseSite{
App.addInitialization(app => {
app.addDeepLink("impressum", ImpressumSite);
-});
\ No newline at end of file
+});
diff --git a/src/client/js/Sites/LevelSite.js b/src/client/js/Sites/LevelSite.ts
similarity index 91%
rename from src/client/js/Sites/LevelSite.js
rename to src/client/js/Sites/LevelSite.ts
index 7f0e0ca..0ddc59c 100644
--- a/src/client/js/Sites/LevelSite.js
+++ b/src/client/js/Sites/LevelSite.ts
@@ -1,9 +1,12 @@
+import {Level} from "../wordrotator/Level/Level";
+
+const helpIcon = require("../../img/help.png").default;
+const view = require("../../html/sites/level.html");
+const coinSound = require("../../sound/single_coin_fall_on_concrete_.mp3").default;
+
import {TemplateContainer} from "../wordrotator/Segment/TemplateContainer";
import {LevelHelper} from "../wordrotator/Level/LevelHelper";
import {EndSite} from "./EndSite";
-import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
-
-import helpIcon from "../../img/help.png";
import {
MenuAction,
@@ -13,19 +16,40 @@ import {
NativeStoragePromise,
} from "cordova-sites/dist/client";
-import view from "../../html/sites/level.html"
import {Helper} from "js-helper/dist/shared/Helper";
import {LevelData} from "../../../shared/model/LevelData";
import {LevelPlayed} from "../model/LevelPlayed";
import {ViewHelper} from "js-helper/dist/client/ViewHelper";
-import coinSound from "../../sound/single_coin_fall_on_concrete_.mp3";
import {SoundManager} from "cordova-sites/dist/client/js/Sound/SoundManager";
+import {MenuSite} from "cordova-sites/dist/client/js/Context/MenuSite";
+
+export class LevelSite extends MenuSite {
+
+ public static readonly RENDERER_TYPES = [20, 40, 60, 80, 81, 82, 83, 100, 110, 111, 112, 120, 140, 160];
+ public static readonly TUTORIAL = {
+ FIRST_LEVEL: 67,
+ SECOND_LEVEL: 15,
+ BIG_SEGMENT_LEVEL: 1921
+ };
+
+ private coinAction: MenuAction;
+ private levelCounterAction: MenuAction;
+ private levelCounter: number;
+ private levelScaler: () => void;
+ private wonParams: { aborted: boolean; coinCounterTimer: any };
+ private coinPromise: Promise
;
+ private continueButtonScaler: () => Promise;
+ private wonTextScaler: () => Promise;
+ private wonText: HTMLElement;
+ private templateContainer: TemplateContainer;
+ private coinTemplate: HTMLElement;
+ private coinContainer: HTMLElement;
+ private level: Level;
-export class LevelSite extends WordRotatorBaseSite {
constructor(siteManager) {
super(siteManager, view);
- this._navbarFragment.setBackgroundImage(null);
+ // this.getNavbarFragment().setBackgroundImage(null);
}
async onCreateMenu(navbar) {
@@ -34,7 +58,7 @@ export class LevelSite extends WordRotatorBaseSite {
let coinAction = new MenuAction(Helper.nonNull(await NativeStoragePromise.getItem("coins"), "0"), () => {
}, MenuAction.SHOW_ALWAYS, 900);
coinAction._shouldTranslate = false;
- coinAction._liClass = "coin-counter";
+ coinAction.setLiClass("coin-counter img");
navbar.addAction(coinAction);
this.coinAction = coinAction;
@@ -70,7 +94,7 @@ export class LevelSite extends WordRotatorBaseSite {
let soundManager = SoundManager.getInstance();
soundManager.set({
audio: coinSound,
- muted: (NativeStoragePromise.getItem("play-sound", "1") !== "1"),
+ muted: ((await NativeStoragePromise.getItem("play-sound", "1")) !== "1"),
volume: 0.7
}, SoundManager.CHANNELS.SOUND);
@@ -159,7 +183,6 @@ export class LevelSite extends WordRotatorBaseSite {
this.levelScaler = await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 1, level.words[0].length * 1.5, null, 0);
this.level = level;
- // let res = this.tutorial();
Matomo.push(["trackEvent", "LevelSite", "LoadLastLevel"]);
this.level.checkHasWon();
return;
@@ -250,6 +273,8 @@ export class LevelSite extends WordRotatorBaseSite {
}
async onStart(args) {
+ this.setTitle("WR");
+
Matomo.update("Level Sites");
let res = super.onStart(args);
@@ -300,7 +325,7 @@ export class LevelSite extends WordRotatorBaseSite {
coinsBefore = parseInt(Helper.nonNull(await NativeStoragePromise.getItem("coins"), "0"));
await NativeStoragePromise.setItem("coins", coinsBefore + parseInt(coinsPerLevel));
}).then(async () => {
- return Promise.all([new Promise((r) => {
+ return Promise.all([new Promise((r) => {
setTimeout(() => {
//TODO animationen einbauen
continueButton.style.opacity = 1;
@@ -316,26 +341,26 @@ export class LevelSite extends WordRotatorBaseSite {
this.wonParams.aborted = false;
for (let i = 0; i < coinsPerLevel; i++) {
- let coinElem = this.coinTemplate.cloneNode(true);
+ let coinElem = this.coinTemplate.cloneNode(true);
this.coinContainer.appendChild(coinElem);
this.coinPromise = this.coinPromise.then(() => {
- return new Promise(r => {
+ return new Promise(r => {
let timeout = 350;
if (!this.wonParams.aborted) {
//TODO animationen einbauen
- coinElem.style.opacity = 1;
- // coinElem.fadeIn(timeout / 1000);
+
+ coinElem.style.opacity = "1";
soundManager.play(SoundManager.CHANNELS.SOUND);
this.wonParams.coinCounterTimer = setTimeout(() => {
if (!this.wonParams.aborted) {
this.coinAction.setName(++coinsBefore);
- // this.coinAction.redraw();
}
}, timeout / 2);
} else {
r();
}
+
//Always do the next promise for garbage collection
setTimeout(r, timeout);
})
@@ -414,7 +439,7 @@ export class LevelSite extends WordRotatorBaseSite {
let textElem = this.findBy(".tutorial-text .step-1");
await this.levelScaler();
- scaleHelper.scaleToFull(textElem, textElem.parentElement, null, true, 1, 2);
+ scaleHelper.scaleTo(0.4, textElem, textElem.parentElement, null, true, 2, 2);
break;
}
@@ -514,11 +539,3 @@ export class LevelSite extends WordRotatorBaseSite {
}
}
}
-
-LevelSite.RENDERER_TYPES = [20, 40, 60, 80, 81, 82, 83, 100, 110, 111, 112, 120, 140, 160];
-// LevelSite.RENDERER_TYPES = [120, 140, 160];
-LevelSite.TUTORIAL = {
- FIRST_LEVEL: 67,
- SECOND_LEVEL: 15,
- BIG_SEGMENT_LEVEL: 1921
-};
\ No newline at end of file
diff --git a/src/client/js/Sites/MainMenuSite.js b/src/client/js/Sites/MainMenuSite.ts
similarity index 70%
rename from src/client/js/Sites/MainMenuSite.js
rename to src/client/js/Sites/MainMenuSite.ts
index beb6d87..db249b5 100644
--- a/src/client/js/Sites/MainMenuSite.js
+++ b/src/client/js/Sites/MainMenuSite.ts
@@ -1,10 +1,11 @@
-import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
-import {App, Toast, DataManager, ScaleHelper} from "cordova-sites/dist/client";
+const settingsIcon = require("../../img/settings.png").default;
+const view = require("../../html/sites/menu.html");
+
+import {App, Toast, DataManager, ScaleHelper, MenuSite} from "cordova-sites/dist/client";
import {Helper} from "js-helper/dist/shared";
import {LevelSite} from "./LevelSite";
import {TemplateContainer} from "../wordrotator/Segment/TemplateContainer";
import {MainMenuLevel} from "../wordrotator/Level/MainMenuLevel";
-import view from "../../html/sites/menu.html"
import {NativeStoragePromise} from "cordova-sites/dist/client";
import {ViewHelper} from "js-helper/dist/client/ViewHelper";
import {LevelPlayed} from "../model/LevelPlayed";
@@ -17,14 +18,19 @@ import {Matomo} from "cordova-sites/dist/client/js/Legacy/Matomo";
import {MenuAction} from "cordova-sites/dist/client/js/Context/Menu/MenuAction/MenuAction";
import {SettingsSite} from "./SettingsSite";
-import settingsIcon from "../../img/settings.png";
+export class MainMenuSite extends MenuSite {
+ static app: App;
+
+ private loadLevelPromise: Promise;
+ private listener: () => void;
+ private templateContainer: TemplateContainer;
+ private randomRotateTimeout;
-export class MainMenuSite extends WordRotatorBaseSite {
constructor(siteManager) {
super(siteManager, view);
this.loadLevelPromise = new SyncJob().sync([LevelData]).catch(e => console.error(e));
this.listener = null;
- this._navbarFragment.setCanGoBack(false);
+ this.getNavbarFragment().setCanGoBack(false);
}
onCreateMenu(navbar) {
@@ -36,6 +42,73 @@ export class MainMenuSite extends WordRotatorBaseSite {
return navbar;
}
+ async onViewLoaded() {
+ const res = super.onViewLoaded();
+
+ let playButton = this.findBy("#play-button");
+ playButton.addEventListener("click", () => {
+ // Matomo.push(["trackEvent", "MainMenu", "startButton"]);
+ this.startLevelSite();
+ });
+
+ let leafSegmentTemplate = this.findBy("#segment-leaf-template");
+ let parentSegmentTemplate = this.findBy("#segment-parent-template");
+ let rowSegmentTemplate = this.findBy("#segment-row-template");
+ let triangleTemplate = this.findBy("#segment-triangle-template");
+
+ leafSegmentTemplate.id = null;
+ parentSegmentTemplate.id = null;
+ rowSegmentTemplate.id = null;
+ triangleTemplate.id = null;
+
+ leafSegmentTemplate.remove();
+ parentSegmentTemplate.remove();
+ rowSegmentTemplate.remove();
+ triangleTemplate.remove();
+
+ this.templateContainer = new TemplateContainer(leafSegmentTemplate, parentSegmentTemplate, rowSegmentTemplate, triangleTemplate);
+
+ //TODO?
+ // if (Helper.nonNull(MainMenuSite.app._cookieClosePromise)) {
+ // MainMenuSite.app._cookieClosePromise.then(() => {
+ // if (this.listener) {
+ // this.listener();
+ // }
+ // });
+ // }
+
+ let soundManager = SoundManager.getInstance();
+
+ let playMusicButton = this.findBy("#play-music");
+ playMusicButton.checked = (await NativeStoragePromise.getItem("play-music", "1") === "1");
+ playMusicButton.addEventListener("change", async () => {
+ await NativeStoragePromise.setItem("play-music", (playMusicButton.checked) ? "1" : "0");
+ soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC);
+ if (playMusicButton.checked) {
+ await soundManager.play(SoundManager.CHANNELS.MUSIC);
+ }
+
+ //TODO [MIG] Matomo
+ Matomo.push(["trackEvent", "MainMenu", "PlayMusic", "Play Music", (playMusicButton.checked) ? 1 : 0]);
+ });
+
+ let playSoundButton = this.findBy("#play-sound");
+ playSoundButton.checked = (await NativeStoragePromise.getItem("play-sound", "1") === "1");
+ playSoundButton.addEventListener("change", async () => {
+ await NativeStoragePromise.setItem("play-sound", (playSoundButton.checked) ? "1" : "0");
+ soundManager.set({muted: !playSoundButton.checked}, SoundManager.CHANNELS.SOUND);
+
+ //TODO [MIG] Matomo
+ Matomo.push(["trackEvent", "MainMenu", "PlaySound", "Play Sound", (playSoundButton.checked) ? 1 : 0]);
+ });
+
+ this.findBy("#share-button").addEventListener("click", () => {
+ new ShareManager().share(Translator.getInstance().translate("share-text", [window.location]));
+ });
+ return res;
+ // this.findBy("#share-buttons").appendChild(ShareManager.generateDefaultShareElement("https://wordrotator.silas.link"));
+ }
+
async onStart(args) {
// Matomo.update("Menu Sites");
let res = super.onStart(args);
@@ -120,7 +193,7 @@ export class MainMenuSite extends WordRotatorBaseSite {
async startLevelSite() {
SoundManager.getInstance().resumeContext();
- this.startSite(LevelSite, Promise.race([this.loadLevelPromise, new Promise(async resolve => {
+ this.startSite(LevelSite, Promise.race([this.loadLevelPromise, new Promise(async resolve => {
let levelData = await LevelPlayed.getNextLevelData(LevelSite.RENDERER_TYPES);
if (levelData !== null) {
resolve();
@@ -128,130 +201,64 @@ export class MainMenuSite extends WordRotatorBaseSite {
})]));
}
- async onFirstStart() {
- super.onFirstStart();
-
- let playButton = this.findBy("#play-button");
- playButton.addEventListener("click", () => {
- // Matomo.push(["trackEvent", "MainMenu", "startButton"]);
- this.startLevelSite();
- });
-
- let leafSegmentTemplate = this.findBy("#segment-leaf-template");
- let parentSegmentTemplate = this.findBy("#segment-parent-template");
- let rowSegmentTemplate = this.findBy("#segment-row-template");
- let triangleTemplate = this.findBy("#segment-triangle-template");
-
- leafSegmentTemplate.id = null;
- parentSegmentTemplate.id = null;
- rowSegmentTemplate.id = null;
- triangleTemplate.id = null;
-
- leafSegmentTemplate.remove();
- parentSegmentTemplate.remove();
- rowSegmentTemplate.remove();
- triangleTemplate.remove();
-
- this.templateContainer = new TemplateContainer(leafSegmentTemplate, parentSegmentTemplate, rowSegmentTemplate, triangleTemplate);
-
- if (Helper.nonNull(MainMenuSite.app._cookieClosePromise)) {
- MainMenuSite.app._cookieClosePromise.then(() => {
- if (this.listener) {
- this.listener();
- }
- });
- }
-
- let soundManager = SoundManager.getInstance();
-
- let playMusicButton = this.findBy("#play-music");
- playMusicButton.checked = (await NativeStoragePromise.getItem("play-music", "1") === "1");
- playMusicButton.addEventListener("change", async () => {
- await NativeStoragePromise.setItem("play-music", (playMusicButton.checked) ? "1" : "0");
- soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC);
- if (playMusicButton.checked) {
- soundManager.play(SoundManager.CHANNELS.MUSIC);
- }
-
- //TODO [MIG] Matomo
- Matomo.push(["trackEvent", "MainMenu", "PlayMusic", "Play Music", (playMusicButton.checked) ? 1 : 0]);
- });
-
- let playSoundButton = this.findBy("#play-sound");
- playSoundButton.checked = (await NativeStoragePromise.getItem("play-sound", "1") === "1");
- playSoundButton.addEventListener("change", async () => {
- await NativeStoragePromise.setItem("play-sound", (playSoundButton.checked) ? "1" : "0");
- soundManager.set({muted: !playSoundButton.checked}, SoundManager.CHANNELS.SOUND);
-
- //TODO [MIG] Matomo
- Matomo.push(["trackEvent", "MainMenu", "PlaySound", "Play Sound", (playSoundButton.checked) ? 1 : 0]);
- });
-
- this.findBy("#share-button").addEventListener("click", () => {
- new ShareManager().share(Translator.getInstance().translate("share-text", [window.location]));
- });
- // this.findBy("#share-buttons").appendChild(ShareManager.generateDefaultShareElement("https://wordrotator.silas.link"));
- }
-
- onPause(args) {
+ onPause() {
clearTimeout(this.randomRotateTimeout);
window.removeEventListener("resize", this.listener);
- return super.onPause(args);
+ return super.onPause();
}
- async loadLevels() {
- try {
- const db = await WordRotatorDb.getInstance();
- const dateLastSync = Helper.nonNull(await db.loadDateLastSync(), 0);
- // const dateLastSync = Helper.nonNull(localStorage.getItem("date-last-sync"), 0);
-
- // let numberLevels = db.countLevels();
- let newLastSync = null;
- let maxRuns = 1;
- let levelPromises = [];
- for (let run = 0; run < maxRuns; run++) {
- let res = await DataManager.load("wordRotator/levels" + DataManager.buildQuery({
- "currentRun": run,
- "dateLastSync": dateLastSync
- }));
- if (!res["success"]) {
- if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) {
- new Toast("sync-error", 6000).show();
- }
- newLastSync = null;
- break;
- }
- res = res["result"];
- newLastSync = Helper.nonNull(newLastSync, res["currentSyncDate"]);
- maxRuns = res["maxRuns"];
-
- let levels = res["levels"];
- for (let i = 0; i < levels.length; i++) {
- let currentLevel = levels[i];
- levelPromises.push(db.loadLevel(levels[i]["id"]).then(level => {
- currentLevel["played"] = (Helper.nonNull(Helper.nonNull(level, {}).played, false));
- return currentLevel;
- }));
- }
- }
- let levels = await Promise.all(levelPromises);
- await db.saveManyLevels(levels);
-
- if (newLastSync != null && newLastSync !== "null") {
- await NativeStoragePromise.setItem("date-last-sync", newLastSync);
- db.saveDateLastSync(newLastSync);
- }
- }
- catch(e){
- // if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) {
- new Toast("sync-error", 6000);
- // }
- console.error(e);
- }
- }
+ // async loadLevels() {
+ // try {
+ // const db = await WordRotatorDb.getInstance();
+ // const dateLastSync = Helper.nonNull(await db.loadDateLastSync(), 0);
+ // // const dateLastSync = Helper.nonNull(localStorage.getItem("date-last-sync"), 0);
+ //
+ // // let numberLevels = db.countLevels();
+ // let newLastSync = null;
+ // let maxRuns = 1;
+ // let levelPromises = [];
+ // for (let run = 0; run < maxRuns; run++) {
+ // let res = await DataManager.load("wordRotator/levels" + DataManager.buildQuery({
+ // "currentRun": run,
+ // "dateLastSync": dateLastSync
+ // }));
+ // if (!res["success"]) {
+ // if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) {
+ // new Toast("sync-error", 6000).show();
+ // }
+ // newLastSync = null;
+ // break;
+ // }
+ // res = res["result"];
+ // newLastSync = Helper.nonNull(newLastSync, res["currentSyncDate"]);
+ // maxRuns = res["maxRuns"];
+ //
+ // let levels = res["levels"];
+ // for (let i = 0; i < levels.length; i++) {
+ // let currentLevel = levels[i];
+ // levelPromises.push(db.loadLevel(levels[i]["id"]).then(level => {
+ // currentLevel["played"] = (Helper.nonNull(Helper.nonNull(level, {}).played, false));
+ // return currentLevel;
+ // }));
+ // }
+ // }
+ // let levels = await Promise.all(levelPromises);
+ // await db.saveManyLevels(levels);
+ //
+ // if (newLastSync != null && newLastSync !== "null") {
+ // await NativeStoragePromise.setItem("date-last-sync", newLastSync);
+ // db.saveDateLastSync(newLastSync);
+ // }
+ // }
+ // catch(e){
+ // // if (await db.loadNextLevel(LevelSite.RENDERER_TYPES) === null) {
+ // new Toast("sync-error", 6000);
+ // // }
+ // console.error(e);
+ // }
+ // }
}
-MainMenuSite.app = null;
App.addInitialization(app => {
MainMenuSite.app = app;
-});
\ No newline at end of file
+});
diff --git a/src/client/js/Sites/PrivacyPolicySite.js b/src/client/js/Sites/PrivacyPolicySite.ts
similarity index 82%
rename from src/client/js/Sites/PrivacyPolicySite.js
rename to src/client/js/Sites/PrivacyPolicySite.ts
index 9abb4d6..748fdd3 100644
--- a/src/client/js/Sites/PrivacyPolicySite.js
+++ b/src/client/js/Sites/PrivacyPolicySite.ts
@@ -1,10 +1,9 @@
-import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
-
-import view from "../../html/sites/privacyPolicy.html"
+const view = require("../../html/sites/privacyPolicy.html");
import {App} from "cordova-sites/dist/client/js/App";
import {Matomo} from "cordova-sites/dist/client/js/Legacy/Matomo";
+import {MenuSite} from "cordova-sites/dist/client";
-export class PrivacyPolicySite extends WordRotatorBaseSite {
+export class PrivacyPolicySite extends MenuSite {
constructor(siteManager) {
super(siteManager,view);
}
@@ -31,4 +30,4 @@ export class PrivacyPolicySite extends WordRotatorBaseSite {
App.addInitialization(app => {
app.addDeepLink("privacyPolicy", PrivacyPolicySite);
-});
\ No newline at end of file
+});
diff --git a/src/client/js/Sites/SelectWordsSite.js b/src/client/js/Sites/SelectWordsSite.ts
similarity index 90%
rename from src/client/js/Sites/SelectWordsSite.js
rename to src/client/js/Sites/SelectWordsSite.ts
index 45abf5e..f6b90d1 100644
--- a/src/client/js/Sites/SelectWordsSite.js
+++ b/src/client/js/Sites/SelectWordsSite.ts
@@ -1,17 +1,19 @@
-import view from "../../html/sites/selectWords.html"
-import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
+const view = require("../../html/sites/selectWords.html");
import {UserMenuAction, UserSite} from "cordova-sites-user-management/dist/client";
import {NavbarFragment} from "cordova-sites/dist/client/js/Context/Menu/NavbarFragment";
import {App} from "cordova-sites/dist/client/js/App";
-import {DataManager} from "cordova-sites/dist/dist/client/js/DataManager";
+import {DataManager} from "cordova-sites/dist/client/js/DataManager";
import {ViewHelper} from "js-helper/dist/client/ViewHelper";
+import {MenuSite} from "cordova-sites/dist/client";
-export class SelectWordsSite extends WordRotatorBaseSite{
+export class SelectWordsSite extends MenuSite{
+ private stats: any;
+ private words: any;
constructor(siteManager) {
super(siteManager, view);
- this.addDelegate(new UserSite("select-words"))
+ this.addDelegate(new UserSite(this, "select-words"))
}
async onConstruct(args) {
@@ -80,4 +82,4 @@ App.addInitialization(app => {
NavbarFragment.defaultActions.push(new UserMenuAction("select-words", "select-words", () => {
app.startSite(SelectWordsSite);
}));
-});
\ No newline at end of file
+});
diff --git a/src/client/js/Sites/SettingsSite.js b/src/client/js/Sites/SettingsSite.ts
similarity index 88%
rename from src/client/js/Sites/SettingsSite.js
rename to src/client/js/Sites/SettingsSite.ts
index 289923c..b2f723b 100644
--- a/src/client/js/Sites/SettingsSite.js
+++ b/src/client/js/Sites/SettingsSite.ts
@@ -1,5 +1,4 @@
-
-import view from "../../html/sites/settingsSite.html"
+const view = require("../../html/sites/settingsSite.html");
import {MenuSite} from "cordova-sites/dist/client/js/Context/MenuSite";
import {WordRotatorSettingFragment} from "../Fragment/WordRotatorSettingFragment";
import {App} from "cordova-sites/dist/client/js/App";
@@ -14,4 +13,4 @@ export class SettingsSite extends MenuSite {
App.addInitialization((app) => {
app.addDeepLink("settings", SettingsSite);
-});
\ No newline at end of file
+});
diff --git a/src/client/js/Sites/WordRotatorBaseSite.js b/src/client/js/Sites/WordRotatorBaseSite.js
deleted file mode 100644
index a959d2a..0000000
--- a/src/client/js/Sites/WordRotatorBaseSite.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import {MenuSite} from "cordova-sites/dist/client";
-
-export class WordRotatorBaseSite extends MenuSite {
-
- async onViewLoaded() {
- let res = super.onViewLoaded();
- await this.onFirstStart();
- return res;
- }
-
- async onFirstStart(){}
-}
\ No newline at end of file
diff --git a/src/client/js/model/LevelPlayed.ts b/src/client/js/model/LevelPlayed.ts
index 959b23d..73721da 100644
--- a/src/client/js/model/LevelPlayed.ts
+++ b/src/client/js/model/LevelPlayed.ts
@@ -2,6 +2,7 @@ import {BaseModel} from "cordova-sites-database/dist/BaseModel";
import {BaseDatabase} from "cordova-sites-database/dist/cordova-sites-database";
import {LevelData} from "../../../shared/model/LevelData";
import {Helper} from "js-helper/dist/shared/Helper";
+import {QueryBuilder, SelectQueryBuilder} from "typeorm";
export class LevelPlayed extends BaseModel {
@@ -35,7 +36,7 @@ export class LevelPlayed extends BaseModel {
}
static async getNextLevelData(renderer){
- let qb = await this._database.createQueryBuilder(LevelData);
+ let qb = >await this._database.createQueryBuilder(LevelData);
qb = qb.select("COUNT(*) as count, difficulty")
.leftJoin(LevelPlayed, "levelPlayed", "levelPlayed.levelData = LevelData.id")
@@ -61,7 +62,7 @@ export class LevelPlayed extends BaseModel {
return null;
}
- qb = await this._database.createQueryBuilder(LevelData);
+ qb = >await this._database.createQueryBuilder(LevelData);
qb = qb
.leftJoin(LevelPlayed, "levelPlayed", "levelPlayed.levelData = LevelData.id")
.where("(deleted = 0 OR deleted = 'false')")
@@ -75,4 +76,4 @@ export class LevelPlayed extends BaseModel {
return await qb.getOne();
}
}
-BaseDatabase.addModel(LevelPlayed);
\ No newline at end of file
+BaseDatabase.addModel(LevelPlayed);
diff --git a/src/client/js/wordrotator/Level/LevelHelper.js b/src/client/js/wordrotator/Level/LevelHelper.ts
similarity index 72%
rename from src/client/js/wordrotator/Level/LevelHelper.js
rename to src/client/js/wordrotator/Level/LevelHelper.ts
index 7a3fdba..8eb0b09 100644
--- a/src/client/js/wordrotator/Level/LevelHelper.js
+++ b/src/client/js/wordrotator/Level/LevelHelper.ts
@@ -12,8 +12,25 @@ import {SimpleFourWordsLevel10_3} from "./SimpleFourWordsLevel10_3";
import {TwoSegmentFourWordsLevel10_0_3} from "./TwoSegmentFourWordsLevel10_0_3";
import {TwoSegmentFourWordsLevel10_1_3} from "./TwoSegmentFourWordsLevel10_1_3";
import {TwoSegmentFourWordsLevel10_0_2} from "./TwoSegmentFourWordsLevel10_0_2";
+import {Level} from "./Level";
export class LevelHelper {
+ public static readonly types = {
+ 20: SimpleLevel,
+ 40: RowLevel8,
+ 60: RowLevel10,
+ 80: SimpleFourWordsLevel10_0,
+ 81: SimpleFourWordsLevel10_1,
+ 82: SimpleFourWordsLevel10_2,
+ 83: SimpleFourWordsLevel10_3,
+ 100: SixWordsRowLevel8,
+ 110: TwoSegmentFourWordsLevel10_0_3,
+ 111: TwoSegmentFourWordsLevel10_1_3,
+ 112: TwoSegmentFourWordsLevel10_0_2,
+ 120: FourWordsLevel8,
+ 140: SixWordsRowLevel12,
+ 160: FourWordsLevel12,
+ };
static setLevelType(typeId, level) {
LevelHelper.types[typeId] = level;
}
@@ -22,7 +39,7 @@ export class LevelHelper {
return LevelHelper.types[type];
}
- static inflateLevel(levelData, templateContainer) {
+ static inflateLevel(levelData, templateContainer): Level {
let level = new (LevelHelper.types[levelData["renderer"]])(templateContainer);
level.setWords(JSON.parse(levelData["words"].replace(/"/g, '"')));
level.setId(levelData["id"]);
@@ -39,20 +56,3 @@ export class LevelHelper {
return level;
}
}
-
-LevelHelper.types = {
- 20: SimpleLevel,
- 40: RowLevel8,
- 60: RowLevel10,
- 80: SimpleFourWordsLevel10_0,
- 81: SimpleFourWordsLevel10_1,
- 82: SimpleFourWordsLevel10_2,
- 83: SimpleFourWordsLevel10_3,
- 100: SixWordsRowLevel8,
- 110: TwoSegmentFourWordsLevel10_0_3,
- 111: TwoSegmentFourWordsLevel10_1_3,
- 112: TwoSegmentFourWordsLevel10_0_2,
- 120: FourWordsLevel8,
- 140: SixWordsRowLevel12,
- 160: FourWordsLevel12,
-};
\ No newline at end of file
diff --git a/src/client/sass/_mainMenu.scss b/src/client/sass/_mainMenu.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/src/client/sass/_navbarOverride.scss b/src/client/sass/_navbarOverride.scss
new file mode 100644
index 0000000..9d6e83a
--- /dev/null
+++ b/src/client/sass/_navbarOverride.scss
@@ -0,0 +1,44 @@
+nav.top-bar {
+ padding: 0;
+
+ @each $breakpoint, $value in $margins {
+ @include breakpoint($breakpoint) {
+ margin-left: -$value;
+ margin-right: -$value;
+ //width: calc(100% + #{4*$value});
+ //max-width: calc(100% + #{4*$value});
+ }
+ }
+
+ &.with-image .background-img {
+ display: none;
+ }
+
+ .background-img {
+ display: none;
+ }
+
+ > .grid-container {
+ background: inherit;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+
+ > .grid-padding-x {
+ display: block;
+ padding: 0.5rem;
+ margin: 0;
+ }
+ }
+
+ ul > li {
+ display: flex;
+ align-items: center;
+
+ &.level-counter {
+ margin-top: 0.2rem;
+ }
+ }
+
+}
diff --git a/src/client/sass/_themeBlue.scss b/src/client/sass/_themeBlue.scss
new file mode 100644
index 0000000..348bcc4
--- /dev/null
+++ b/src/client/sass/_themeBlue.scss
@@ -0,0 +1,88 @@
+
+// Blue
+//$primaryColor: #427081;
+//$secondaryColor: #4d575a;
+//$accentColor: #e3ab6e;
+//$textColor: white;
+//$svgColor: black;
+
+// Blue different Accent
+//$primaryColor: #427081;
+//$secondaryColor: #4d575a;
+//$accentColor: #d3e7eb;
+//$textColor: white;
+//$svgColor: black;
+
+// Blau Invers
+//$primaryColor: #4d575a;
+//$secondaryColor: #427081;
+//$accentColor: #e3ab6e;
+//$textColor: white;
+//$svgColor: black;
+
+// Grün
+$primaryColor: #6b8778;
+$secondaryColor: #012f25;
+$accentColor: #b8acaa;
+$textColor: white;
+$svgColor: black;
+
+// Grün 2
+//$primaryColor: #234c42;
+//$secondaryColor: #012f25;
+//$accentColor: #b8acaa;
+//$textColor: white;
+//$svgColor: black;
+
+// Grün invers
+//$primaryColor: #012f25;
+//$secondaryColor: #234c42;
+//$accentColor: #b8acaa;
+//$textColor: white;
+//$svgColor: white;
+
+// Grün invers andere Accent
+//$primaryColor: #012f25;
+//$secondaryColor: #234c42;
+//$accentColor: #6b8778;
+//$textColor: white;
+//$svgColor: white;
+
+body.theme-blue{
+ background: $primaryColor;
+ color: $textColor;
+
+ .toast .message{
+ background: $secondaryColor;
+ }
+
+ nav.top-bar, nav.top-bar.with-image, nav.top-bar.with-image.solid{
+ background: $secondaryColor;
+ }
+
+ .button{
+ background: $secondaryColor;
+ }
+
+ .switch input:checked + .slider{
+ background: $accentColor;
+ }
+ #level-number-container{
+ background: $primaryColor;
+ }
+ svg {
+ color: $svgColor;
+ }
+
+ ul.menu li a {
+ color: $textColor;
+ }
+
+ a{
+ color: $accentColor;
+ &.hidden-link{
+ color: $textColor;
+ }
+ }
+
+}
diff --git a/src/client/sass/_wordRotator_old.scss b/src/client/sass/_wordRotator_old.scss
deleted file mode 100644
index 347de71..0000000
--- a/src/client/sass/_wordRotator_old.scss
+++ /dev/null
@@ -1,394 +0,0 @@
-@import "settings";
-@import "lib/_actionBar.scss";
-@import "lib/_form.scss";
-@import "lib/_listjs.scss";
-@import "lib/_modal.scss";
-@import "lib/_rotate.scss";
-@import "lib/_share.scss";
-@import "lib/_tabs.scss";
-@import "lib/_core.scss";
-@import "lib/_flashMessenger.scss";
-@import "lib/_framework.scss";
-@import "lib/_pwaAssets.scss";
-@import "lib/_settingsSite.scss";
-@import "lib/_style.scss";
-@import "lib/_theme.scss";
-
-@import "tutorial";
-@import "wordrotatorTheme";
-
-//ActionBar
-nav.top-bar.title-bar {
- padding: 0.3rem 0.6rem 0;
-}
-
-#logo {
- max-width: 2rem;
- transition: none;
-}
-
-#action-bar .top-bar-right .menu .action.img a {
- padding-bottom: 0;
- img {
- max-height: 1.8rem;
- }
-}
-
-.menu, .dropdown.menu {
- a {
- padding: 0.2rem 0.5rem;
- }
-}
-
-#level-number-container {
- z-index: 1;
- transition: none;
- position: absolute;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
- border: 3px solid white;
- border-radius: 50%;
- visibility: hidden;
- display: table-cell;
-
- height: 35px;
- width: 35px;
- text-align: center;
- vertical-align: middle;
-
- &.visible {
- visibility: visible;
- }
- &.in-main-menu {
- background: white;
- border-color: black;
-
- height: 1em;
- width: 1em;
- min-height: 1em;
- min-width: 1em;
- max-height: 1em;
- max-width: 1em;
- }
-
- #level-number {
- transition: none;
- position: absolute;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
- font-weight: bold;
- }
-}
-
-$coinTowerDimension: 28px;
-//coin element
-.coin-counter {
- display: inline-block;
- position: relative;
- font-size: 1.6rem;
- @include breakpoint(small down) {
- font-size: 1rem;
- }
-
- :after {
- background-image: url('../img/coinTower.png');
- background-size: $coinTowerDimension $coinTowerDimension;
- width: $coinTowerDimension;
- height: $coinTowerDimension;
- display: inline-block;
- content: "";
- }
-}
-
-#coin-container {
- line-height: 1;
- .coin {
- margin-left: 3px;
- margin-right: 3px;
- max-width: 20px;
- display: inline-block;
- @include breakpoint(smedium) {
- max-width: 25px;
- }
- @include breakpoint(medium) {
- max-width: 30px;
- }
- }
-}
-
-//Segments
-
-@for $i from 1 through length($rotationDegrees) {
- $startDegree: ((nth($rotationDegrees, $i)+270)%360);
-
- @keyframes rotate-#{nth($rotationDegrees, $i)} {
- 0% {
- //transform: rotate(#{$startDegree}deg);
- transform: #{map-get($degreeMatrix, $startDegree)};
- }
- 100% {
- //transform: rotate(#{nth($rotationDegrees, $i)}deg);
- transform: #{map-get($degreeMatrix, nth($rotationDegrees, $i))};
- }
- }
- @keyframes rotate-reverse-#{nth($rotationDegrees, $i)} {
- 0% {
- //transform: rotate(#{(nth($rotationDegrees, $i))+90}deg);
- transform: #{map-get($degreeMatrix, nth($rotationDegrees, $i)+90)}
- }
- 100% {
- //transform: rotate(#{$startDegree+90}deg);
- transform: #{map-get($degreeMatrix, $startDegree+90)};
- }
- }
-}
-
-.segment:not(.segment-row):not(.segment-triangle) {
- &.rotating {
- z-index: 10 !important;
- overflow: hidden;
-
- @for $i from 1 through length($rotationDegrees) {
- &.rotate-#{nth($rotationDegrees, $i)} {
- animation-name: rotate-#{nth($rotationDegrees, $i)};
- animation-duration: $animationDuration;
- animation-fill-mode: forwards;
- animation-timing-function: linear;
-
- > .child-container {
- > .segment {
- animation-name: rotate-#{450- nth($rotationDegrees, $i)};
- animation-duration: $animationDuration;
- animation-fill-mode: forwards;
- animation-direction: reverse;
- animation-timing-function: linear;
-
- @for $j from 1 through length($rotationDegrees) {
- $animationName: ((nth($rotationDegrees, $j)- nth($rotationDegrees, $i)+360)%360)+90;
- &.rotate-#{nth($rotationDegrees, $j)} {
- animation-name: rotate-#{$animationName};
- }
- }
- }
- }
-
- &.reverse {
- //animation-name: rotate-reverse-#{(nth($rotationDegrees, $i))%360+90};
- animation-name: rotate-reverse-#{nth($rotationDegrees, $i)};
- > .child-container {
- > .segment {
- //animation-name: rotate-reverse-#{360- (nth($rotationDegrees, $i)%360)};
- animation-name: rotate-reverse-#{(540- nth($rotationDegrees, $i))%360+90};
- @for $j from 1 through length($rotationDegrees) {
- $animationName: ((nth($rotationDegrees, $j)- nth($rotationDegrees, $i)+360)%360)+90;
- &.rotate-#{nth($rotationDegrees, $j)} {
- animation-name: rotate-reverse-#{($animationName+90)%360+90};
- }
- }
- }
- }
- }
- }
- }
- }
-
- &:not(.rotating) {
- @for $i from 1 through length($rotationDegrees) {
- &.rotate-#{nth($rotationDegrees, $i)} {
- transform: rotate(#{nth($rotationDegrees, $i)}deg);
- background-color: inherit;
- z-index: 1;
- > .child-container {
- > .segment {
- transform: rotate(#{360- nth($rotationDegrees, $i)}deg);
- background-color: inherit;
- z-index: 1;
-
- @for $j from 1 through length($rotationDegrees) {
- $animationName: ((nth($rotationDegrees, $j)- nth($rotationDegrees, $i)+360)%360);
- @if $animationName==0 {
- $animationName: 360;
- }
-
- &.rotate-#{nth($rotationDegrees, $j)} {
- transform: rotate(#{$animationName}deg);
- background-color: inherit;
- z-index: 1;
-
- &.rotating {
- animation-name: rotate-#{$animationName};
- animation-duration: $animationDuration;
- animation-fill-mode: forwards;
- animation-timing-function: linear;
-
- &.reverse {
- animation-name: rotate-reverse-#{$animationName};
- }
- }
- }
- }
- }
- }
- }
- }
- }
-}
-
-#level {
- user-select: none;
- white-space: nowrap;
- transition: none;
- max-width: 100%;
- -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
- //width: 100%;
-
- * {
- transition: none;
- }
- overflow-y: visible;
-}
-
-.segment {
- vertical-align: top;
- white-space: initial;
- cursor: pointer;
- display: inline-block;
- text-align: center;
- position: relative;
- transition: none;
- user-select: none;
- z-index: 1;
- background-color: inherit;
- line-height: 0;
-
- &.segment-row {
- display: block;
- width: 100%;
- animation: none !important;
- white-space: nowrap;
- }
-
- &.segment-leaf {
- background-color: transparent !important;
- min-width: 1em;
- padding: 0.8em;
- &:before {
- content: " ";
- display: block;
- padding-top: 100%;
- }
- .leaf-element {
- position: absolute;
- width: 100%;
- height: 100%;
- line-height: 1.5em;
- top: 0;
- left: 0;
- }
- }
-
- &.segment-parent {
- border: solid 1px #a9a9a9;
- border-radius: 3px;
- padding: 1px;
-
- &.layer-2 {
- border: solid 3px #000000;
- }
- }
-
- &.segment-triangle {
- > .child-container {
- > .segment-parent {
- //border: solid 3px #000000;
- //position: relative;
- }
- }
- }
-}
-
-//Won-screen
-#site-content > :not(.won) {
- .show-when-won {
- display: none;
- }
-}
-
-.level-container {
- //flex: 1;
- transition: none;
-}
-
-.won {
- .level-container {
- //height: 60%;
- }
- .show-when-won {
- //visibility: initial;
- }
- .show-while-playing {
- display: none;
- }
-}
-
-.text-right {
- text-align: right;
-}
-
-#continue-button {
- margin-bottom: 2px;
- @include breakpoint(small down) {
- margin-bottom: 0;
- padding: 0.3em .6em;
- }
-}
-
-#play-button {
- @include breakpoint(small down) {
- margin-bottom: 2px;
- }
-}
-
-#help-button {
- margin: 0;
- padding: 0.4em 0.4em;
- max-width: 3em;
- @include breakpoint(smedium down) {
- padding: 0.2em 0.2em;
- max-width: 2em;
- }
-}
-
-.line-height-1 {
- line-height: 1;
-}
-
-body {
- overscroll-behavior: contain;
- user-select: none;
-}
-
-#site-content {
- overflow: visible;
-}
-div.mainContainer{
- overflow-x: hidden;
-
-}
-
-//#img-sound:before {
-// content: "";
-// max-width: 1.4em;
-// background: url('../img/speaker.svg')
-//}
-
-.clickable{
- cursor: pointer;
-}
-
-#share-button svg{
- cursor: pointer;
- max-width: 1.5rem;
-}
diff --git a/src/client/sass/_wordrotatorTheme.scss b/src/client/sass/_wordrotatorTheme.scss
index 656451c..eff7096 100644
--- a/src/client/sass/_wordrotatorTheme.scss
+++ b/src/client/sass/_wordrotatorTheme.scss
@@ -73,9 +73,16 @@ body {
}
&.default {
- background: url('../img/background.png');
- background-size: cover;
- background-position: center;
+ //background: #07076d;
+ background: #0f0f49;
+ //background: #1c1c44;
+ color: white;
+ * {
+ color: white;
+ }
+ //background: url('../img/background.png');
+ //background-size: cover;
+ //background-position: center;
#level-number-container {
&.in-main-menu {
@@ -144,17 +151,13 @@ body {
}
}
- label {
- font-size: 1em !important;
- }
-
- .setting-row:not(.hidden) {
- line-height: 1;
- padding-top: 0.5em;
- padding-bottom: 0.5em;
- width: 100%;
- cursor: pointer;
- background: rgba(195, 195, 195, 0.13);
- //display: inline-block;
- }
+ //.setting-row:not(.hidden) {
+ // line-height: 1;
+ // padding-top: 0.5em;
+ // padding-bottom: 0.5em;
+ // width: 100%;
+ // cursor: pointer;
+ // background: rgba(195, 195, 195, 0.13);
+ // //display: inline-block;
+ //}
}
diff --git a/src/client/sass/foundation.scss b/src/client/sass/foundation.scss
deleted file mode 100644
index b9570fa..0000000
--- a/src/client/sass/foundation.scss
+++ /dev/null
@@ -1,67 +0,0 @@
-@import "../../node_modules/foundation-sites/scss/foundation";
-@import "settings";
-
-@include foundation-global-styles;
-@include foundation-visibility-classes;
-@include foundation-grid;
-@include foundation-forms;
-//@include foundation-flex-grid;
-//@include foundation-flex-classes;
-@include foundation-button;
-@include foundation-top-bar;
-
-@include foundation-menu;
-@include foundation-menu-icon;
-
-@include foundation-prototype-overflow;
-
-@include foundation-dropdown;
-@include foundation-dropdown-menu;
-@include foundation-accordion;
-@include foundation-accordion-menu;
-
-@include foundation-prototype-spacing;
-
-//@include foundation-everything;
-
-.top-bar-title {
- padding: 0;
-}
-
-.row:not(.expanded) .row {
- max-width: 100%;
- margin-right: 0;
- margin-left: 0;
- .column, .columns {
- &.no-padding-left {
- padding-left: 0 !important;
- }
-
- &.no-padding-right {
- padding-right: 0 !important;
- }
-
- @each $size in $breakpoints {
- &.#{nth($size, 1)}-first {
- @include breakpoint(nth($size, 1)) {
- padding-left: 0 !important;
- }
- }
- &.#{nth($size, 1)}-last {
- @include breakpoint(nth($size, 1)) {
- padding-right: 0 !important;
- }
- }
- }
- }
-}
-
-.row.low-padding {
- .column, .columns {
- //&:not(:first-child)
- //{
- //}
- padding-left: 0.15rem;
- padding-right: 0.15rem;
- }
-}
\ No newline at end of file
diff --git a/src/client/sass/index.scss b/src/client/sass/index.scss
index e4fce1d..3e048f9 100644
--- a/src/client/sass/index.scss
+++ b/src/client/sass/index.scss
@@ -1,8 +1,7 @@
@import "../../../node_modules/foundation-sites/scss/foundation";
//Settings nach foundation für mixins in settings
-@import "wordRotator";
-@import "animations";
+@import "settings";
//Include foundation before other styles, so that other one can override foundation
@include foundation-everything;
@@ -12,6 +11,10 @@
@import "../../../node_modules/cordova-sites-user-management/cordova-sites-user-management";
//Anderes nach Settings, damit Settings bereits angewendet werden
+@import "wordRotator";
+@import "animations";
+@import "navbarOverride";
+@import "themeBlue";
.translation{}
@@ -189,4 +192,4 @@ a.hidden-link {
body{
//background-image: url("../img/background.png");
-}
\ No newline at end of file
+}
diff --git a/src/client/sass/lib/_actionBar.scss b/src/client/sass/lib/_actionBar.scss
deleted file mode 100644
index 917fa2d..0000000
--- a/src/client/sass/lib/_actionBar.scss
+++ /dev/null
@@ -1,250 +0,0 @@
-@import "../../../node_modules/foundation-sites/scss/foundation";
-
-nav.top-bar.title-bar {
- padding: 0.3rem 0.6rem 0;
-}
-
-#logo {
- max-width: 2rem;
- transition: none;
-}
-
-.menu, .dropdown.menu {
- a {
- padding: 0.2rem 0.5rem;
- }
- > li > a {
- background-color: transparent;
- padding: 0.2rem 0.7rem;
- }
-}
-
-.top-bar-title
-{
- white-space: nowrap;
-}
-
-#action-bar {
- .close-listener {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: transparent;
- z-index: 9000;
- }
- #responsive-menu {
- .top-bar-right {
- position: relative;
- text-align: right;
- width: 100%;
- }
-
- }
- .top-bar-right {
- width: auto;
-
-
-
- .menu {
- &.action-bar {
- a {
- img + span {
- display: none;
- }
- }
- .action {
- position: relative;
- z-index: 9000;
- &.is-dropdown-submenu-parent{
- z-index: 9001;
- }
-
- &.hidden {
- display: none;
- }
- @include breakpoint(small down) {
- &.smedium {
- display: none;
- }
- }
- @include breakpoint(smedium down) {
- li {
- display: table-cell;
- }
- &.medium {
- display: none;
- }
- }
- @include breakpoint(medium down) {
- &.large {
- display: none;
- }
- }
- &.never {
- display: none;
- }
- }
-
- &.hidden {
- display: inline-block;
- //float: right;
- position: absolute;
- z-index: 9000;
- border: 1px solid rgb(202, 202, 202);
- padding: 0.2rem;
- transform: translateX(-100%);
- text-align: left;
-
- .action {
- &.hidden {
- display: none;
- }
- &.is-dropdown-submenu-parent {
- z-index: 9001;
- ul.is-dropdown-submenu {
- top: auto;
- > li.action, > .close-listener {
- z-index: 9001;
- }
- }
- > a:after {
- display: block;
- width: 0;
- height: 0;
- border: 6px inset;
- content: "";
- border-bottom-width: 0;
- border-top-style: solid;
- border-color: #ffffff transparent transparent;
- right: 5px;
- left: auto;
- margin-top: -3px;
- }
- }
- a {
- white-space: nowrap;
- img {
- display: none;
- + span {
- display: inherit;
- }
- }
- }
- @include breakpoint(medium) {
- &.medium {
- display: none;
- }
- }
- @include breakpoint(smedium) {
- &.smedium {
- display: none;
- }
- }
- @include breakpoint(large) {
- &.large {
- display: none;
- }
- }
-
- @include breakpoint(small down) {
- &.smedium {
- display: block;
- &.hidden {
- display: none;
- }
- }
- }
- @include breakpoint(smedium down) {
- &.medium {
- display: block;
- &.hidden {
- display: none;
- }
- }
- }
- @include breakpoint(medium down) {
- &.large {
- display: block;
- &.hidden {
- display: none;
- }
- }
- }
- &.never {
- display: block;
- &.hidden {
- display: none;
- }
- }
- &.always {
- display: none;
- }
- }
- }
- }
-
- .action {
- z-index: 100;
- @include breakpoint(smedium down) {
- a {
- width: 100%;
- //text-align: left;
- }
- }
-
- @include breakpoint(smedium down) {
- a {
- padding-left: 0.68rem;
- }
- }
- @include breakpoint(small down) {
- a {
- padding-left: 0.236rem;
- }
- }
-
- &:not(.is-dropdown-submenu-parent) {
- @include breakpoint(smedium down) {
- a {
- padding-right: 0.68rem;
- }
- }
- @include breakpoint(small down) {
- a {
- padding-right: 0.236rem;
- }
- }
- }
-
- &.img a {
- padding-top: 0;
- padding-bottom: 0;
- img {
- vertical-align: inherit;
- max-height: 1.8rem;
- }
- }
-
- }
- > li > ul.is-dropdown-submenu {
- min-width: 0;
- .action {
- display: inherit;
- }
- }
- > li.opens-right > ul.is-dropdown-submenu {
- right: auto;
- left: auto;
- a {
- text-align: left;
- }
- }
- }
- }
-}
-
-.dropdown.menu > li.is-dropdown-submenu-parent > a:after {
- border-color: #ffffff transparent transparent;
-}
\ No newline at end of file
diff --git a/src/client/sass/lib/_core.scss b/src/client/sass/lib/_core.scss
index 03ea1ac..6f588c2 100644
--- a/src/client/sass/lib/_core.scss
+++ b/src/client/sass/lib/_core.scss
@@ -8,7 +8,7 @@ html {
min-height: 100%;
width: 100%;
height: 100%;
- font-size: 18px;
+ //font-size: 18px;
letter-spacing: 1px;
}
@@ -364,4 +364,4 @@ img.back-button {
.no-margin-bottom {
margin-bottom: 0;
-}
\ No newline at end of file
+}
diff --git a/src/client/sass/lib/_form.scss b/src/client/sass/lib/_form.scss
deleted file mode 100644
index 8518925..0000000
--- a/src/client/sass/lib/_form.scss
+++ /dev/null
@@ -1,86 +0,0 @@
-
-form {
- position: relative;
-}
-
-.sending {
- .sending-loader {
- position: absolute;
- background-color: rgba(125, 125, 125, 0.3);
- display: block;
- pointer-events: all;
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- bottom: 0;
- right: 0;
- z-index: 10;
- .loader {
- position: absolute
- }
- border-radius: 2px;
- }
-}
-
-.sending-loader {
- display: none;
-}
-
-//input.notEmpty:invalid {
-// background-color: lightcoral;
-//}
-
-label {
- position: relative;
- [type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], textarea, input[type=text], input:not([type]) {
- display: block;
- width: 100%;
- height: 2.4375rem;
- padding: 0.5rem;
- box-shadow: none !important;
- font-size: 1rem;
- font-weight: normal;
- line-height: 1.5;
- border: none;
- //border-bottom: solid black;
- outline: 0;
- margin: 0 0 15px;
-
- &:focus {
- border: none;
- box-shadow: none !important;
- //border-bottom: solid black;
- }
-
- &:focus, &.notEmpty:not(:focus) {
- ~ span {
- top: -11px;
- left: 0;
- bottom: 0;
- font-size: 11px;
- opacity: 1;
- //color: black;
- }
- }
- ~ span {
- position: absolute;
- pointer-events: none;
- left: 10px;
- bottom: 10px;
- top: 7px;
- transition: 0.2s ease all;
- //color: #626262;
- }
- }
- textarea {
- height: 10rem;
- //border: 1px solid rgba(136, 136, 136, 0.31);
- //box-shadow: 0 0 3px 2px hsla(0, 0%, 53%, .31) !important;
- border-top-right-radius: 3px;
- border-top-left-radius: 3px;
- }
- [type="checkbox"].before-text {
- margin-bottom: 0;
- }
-}
diff --git a/src/client/sass/lib/_foundationSettings.scss b/src/client/sass/lib/_foundationSettings.scss
deleted file mode 100644
index e122f0f..0000000
--- a/src/client/sass/lib/_foundationSettings.scss
+++ /dev/null
@@ -1,621 +0,0 @@
-// Foundation for Sites Settings
-// -----------------------------
-//
-// Table of Contents:
-//
-// 1. Global
-// 2. Breakpoints
-// 3. The Grid
-// 4. Base Typography
-// 5. Typography Helpers
-// 6. Abide
-// 7. Accordion
-// 8. Accordion Menu
-// 9. Badge
-// 10. Breadcrumbs
-// 11. Button
-// 12. Button Group
-// 13. Callout
-// 14. Card
-// 15. Close Button
-// 16. Drilldown
-// 17. Dropdown
-// 18. Dropdown Menu
-// 19. Forms
-// 20. Label
-// 21. Media Object
-// 22. Menu
-// 23. Meter
-// 24. Off-canvas
-// 25. Orbit
-// 26. Pagination
-// 27. Progress Bar
-// 28. Responsive Embed
-// 29. Reveal
-// 30. Slider
-// 31. Switch
-// 32. Table
-// 33. Tabs
-// 34. Thumbnail
-// 35. Title Bar
-// 36. Tooltip
-// 37. Top Bar
-
-@import '../../../node_modules/foundation-sites/scss/util/util';
-
-// 1. Global
-// ---------
-
-$global-font-size: 100%;
-$global-width: rem-calc(1200);
-$global-lineheight: 1.5;
-$foundation-palette: (
- primary: #1779ba,
- secondary: #767676,
- success: #3adb76,
- warning: #ffae00,
- alert: #cc4b37,
-);
-$light-gray: #e6e6e6;
-$medium-gray: #cacaca;
-$dark-gray: #8a8a8a;
-$black: #0a0a0a;
-$white: #fefefe;
-$body-background: $white;
-$body-font-color: $black;
-$body-font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;
-$body-antialiased: true;
-$global-margin: 1rem;
-$global-padding: 1rem;
-$global-weight-normal: normal;
-$global-weight-bold: bold;
-$global-radius: 0;
-$global-text-direction: ltr;
-$global-flexbox: false;
-$print-transparent-backgrounds: true;
-
-@include add-foundation-colors;
-
-// 2. Breakpoints
-// --------------
-
-$breakpoints: (
- small:0,
- smedium: 400px,
- medium: 640px,
- large: 1024px,
- xlarge: 1200px,
- xxlarge: 1440px,
-);
-$print-breakpoint: large;
-$breakpoint-classes: (small smedium medium large);
-
-// 3. The Grid
-// -----------
-
-$grid-row-width: $global-width;
-$grid-column-count: 12;
-$grid-column-gutter: (
- small: 20px,
- medium: 30px,
-);
-$grid-column-align-edge: true;
-$block-grid-max: 8;
-
-// 4. Base Typography
-// ------------------
-
-$header-font-family: $body-font-family;
-$header-font-weight: $global-weight-normal;
-$header-font-style: normal;
-$font-family-monospace: Consolas, 'Liberation Mono', Courier, monospace;
-$header-color: inherit;
-$header-lineheight: 1.4;
-$header-margin-bottom: 0.5rem;
-$header-styles: (
- small: (
- 'h1': ('font-size': 24),
- 'h2': ('font-size': 20),
- 'h3': ('font-size': 19),
- 'h4': ('font-size': 18),
- 'h5': ('font-size': 17),
- 'h6': ('font-size': 16),
- ),
- medium: (
- 'h1': ('font-size': 48),
- 'h2': ('font-size': 40),
- 'h3': ('font-size': 31),
- 'h4': ('font-size': 25),
- 'h5': ('font-size': 20),
- 'h6': ('font-size': 16),
- ),
-);
-$header-text-rendering: optimizeLegibility;
-$small-font-size: 80%;
-$header-small-font-color: $medium-gray;
-$paragraph-lineheight: 1.6;
-$paragraph-margin-bottom: 1rem;
-$paragraph-text-rendering: optimizeLegibility;
-$code-color: $black;
-$code-font-family: $font-family-monospace;
-$code-font-weight: $global-weight-normal;
-$code-background: $light-gray;
-$code-border: 1px solid $medium-gray;
-$code-padding: rem-calc(2 5 1);
-$anchor-color: $primary-color;
-$anchor-color-hover: scale-color($anchor-color, $lightness: -14%);
-$anchor-text-decoration: none;
-$anchor-text-decoration-hover: none;
-$hr-width: $global-width;
-$hr-border: 1px solid $medium-gray;
-$hr-margin: rem-calc(20) auto;
-$list-lineheight: $paragraph-lineheight;
-$list-margin-bottom: $paragraph-margin-bottom;
-$list-style-type: disc;
-$list-style-position: outside;
-$list-side-margin: 1.25rem;
-$list-nested-side-margin: 1.25rem;
-$defnlist-margin-bottom: 1rem;
-$defnlist-term-weight: $global-weight-bold;
-$defnlist-term-margin-bottom: 0.3rem;
-$blockquote-color: $dark-gray;
-$blockquote-padding: rem-calc(9 20 0 19);
-$blockquote-border: 1px solid $medium-gray;
-$cite-font-size: rem-calc(13);
-$cite-color: $dark-gray;
-$cite-pseudo-content: '\2014 \0020';
-$keystroke-font: $font-family-monospace;
-$keystroke-color: $black;
-$keystroke-background: $light-gray;
-$keystroke-padding: rem-calc(2 4 0);
-$keystroke-radius: $global-radius;
-$abbr-underline: 1px dotted $black;
-
-// 5. Typography Helpers
-// ---------------------
-
-$lead-font-size: $global-font-size * 1.25;
-$lead-lineheight: 1.6;
-$subheader-lineheight: 1.4;
-$subheader-color: $dark-gray;
-$subheader-font-weight: $global-weight-normal;
-$subheader-margin-top: 0.2rem;
-$subheader-margin-bottom: 0.5rem;
-$stat-font-size: 2.5rem;
-
-// 6. Abide
-// --------
-
-$abide-inputs: true;
-$abide-labels: true;
-$input-background-invalid: get-color(alert);
-$form-label-color-invalid: get-color(alert);
-$input-error-color: get-color(alert);
-$input-error-font-size: rem-calc(12);
-$input-error-font-weight: $global-weight-bold;
-
-// 7. Accordion
-// ------------
-
-$accordion-background: $white;
-$accordion-plusminus: true;
-$accordion-title-font-size: rem-calc(12);
-$accordion-item-color: $primary-color;
-$accordion-item-background-hover: $light-gray;
-$accordion-item-padding: 1.25rem 1rem;
-$accordion-content-background: $white;
-$accordion-content-border: 1px solid $light-gray;
-$accordion-content-color: $body-font-color;
-$accordion-content-padding: 1rem;
-
-// 8. Accordion Menu
-// -----------------
-
-$accordionmenu-arrows: true;
-$accordionmenu-arrow-color: $primary-color;
-$accordionmenu-arrow-size: 6px;
-
-// 9. Badge
-// --------
-
-$badge-background: $primary-color;
-$badge-color: $white;
-$badge-color-alt: $black;
-$badge-palette: $foundation-palette;
-$badge-padding: 0.3em;
-$badge-minwidth: 2.1em;
-$badge-font-size: 0.6rem;
-
-// 10. Breadcrumbs
-// ---------------
-
-$breadcrumbs-margin: 0 0 $global-margin 0;
-$breadcrumbs-item-font-size: rem-calc(11);
-$breadcrumbs-item-color: $primary-color;
-$breadcrumbs-item-color-current: $black;
-$breadcrumbs-item-color-disabled: $medium-gray;
-$breadcrumbs-item-margin: 0.75rem;
-$breadcrumbs-item-uppercase: true;
-$breadcrumbs-item-slash: true;
-
-// 11. Button
-// ----------
-
-$button-padding: 0.85em 1em;
-$button-margin: 0 0 $global-margin 0;
-$button-fill: solid;
-$button-background: $primary-color;
-$button-background-hover: scale-color($button-background, $lightness: -15%);
-$button-color: $white;
-$button-color-alt: $black;
-$button-radius: $global-radius;
-$button-sizes: (
- tiny: 0.6rem,
- small: 0.75rem,
- default: 0.9rem,
- large: 1.25rem,
-);
-$button-palette: $foundation-palette;
-$button-opacity-disabled: 0.25;
-$button-background-hover-lightness: -20%;
-$button-hollow-hover-lightness: -50%;
-$button-transition: background-color 0.25s ease-out, color 0.25s ease-out;
-
-// 12. Button Group
-// ----------------
-
-$buttongroup-margin: 1rem;
-$buttongroup-spacing: 1px;
-$buttongroup-child-selector: '.button';
-$buttongroup-expand-max: 6;
-$buttongroup-radius-on-each: true;
-
-// 13. Callout
-// -----------
-
-$callout-background: $white;
-$callout-background-fade: 85%;
-$callout-border: 1px solid rgba($black, 0.25);
-$callout-margin: 0 0 1rem 0;
-$callout-padding: 1rem;
-$callout-font-color: $body-font-color;
-$callout-font-color-alt: $body-background;
-$callout-radius: $global-radius;
-$callout-link-tint: 30%;
-
-// 14. Card
-// --------
-
-$card-background: $white;
-$card-font-color: $body-font-color;
-$card-divider-background: $light-gray;
-$card-border: 1px solid $light-gray;
-$card-shadow: none;
-$card-border-radius: $global-radius;
-$card-padding: $global-padding;
-$card-margin: $global-margin;
-
-// 15. Close Button
-// ----------------
-
-$closebutton-position: right top;
-$closebutton-offset-horizontal: (
- small: 0.66rem,
- medium: 1rem,
-);
-$closebutton-offset-vertical: (
- small: 0.33em,
- medium: 0.5rem,
-);
-$closebutton-size: (
- small: 1.5em,
- medium: 2em,
-);
-$closebutton-lineheight: 1;
-$closebutton-color: $dark-gray;
-$closebutton-color-hover: $black;
-
-// 16. Drilldown
-// -------------
-
-$drilldown-transition: transform 0.15s linear;
-$drilldown-arrows: true;
-$drilldown-arrow-color: $primary-color;
-$drilldown-arrow-size: 6px;
-$drilldown-background: $white;
-
-// 17. Dropdown
-// ------------
-
-$dropdown-padding: 1rem;
-$dropdown-background: $body-background;
-$dropdown-border: 1px solid $medium-gray;
-$dropdown-font-size: 1rem;
-$dropdown-width: 300px;
-$dropdown-radius: $global-radius;
-$dropdown-sizes: (
- tiny: 100px,
- small: 200px,
- large: 400px,
-);
-
-// 18. Dropdown Menu
-// -----------------
-
-$dropdownmenu-arrows: true;
-$dropdownmenu-arrow-color: $anchor-color;
-$dropdownmenu-arrow-size: 6px;
-$dropdownmenu-min-width: 200px;
-$dropdownmenu-background: $white;
-$dropdownmenu-border: 1px solid $medium-gray;
-
-// 19. Forms
-// ---------
-
-$fieldset-border: 1px solid $medium-gray;
-$fieldset-padding: rem-calc(20);
-$fieldset-margin: rem-calc(18 0);
-$legend-padding: rem-calc(0 3);
-$form-spacing: rem-calc(16);
-$helptext-color: $black;
-$helptext-font-size: rem-calc(13);
-$helptext-font-style: italic;
-$input-prefix-color: $black;
-$input-prefix-background: $light-gray;
-$input-prefix-border: 1px solid $medium-gray;
-$input-prefix-padding: 1rem;
-$form-label-color: $black;
-$form-label-font-size: rem-calc(14);
-$form-label-font-weight: $global-weight-normal;
-$form-label-line-height: 1.8;
-$select-background: $white;
-$select-triangle-color: $dark-gray;
-$select-radius: $global-radius;
-$input-color: $black;
-$input-placeholder-color: $medium-gray;
-$input-font-family: inherit;
-$input-font-size: rem-calc(16);
-$input-font-weight: $global-weight-normal;
-$input-background: $white;
-$input-background-focus: $white;
-$input-background-disabled: $light-gray;
-$input-border: 1px solid $medium-gray;
-$input-border-focus: 1px solid $dark-gray;
-$input-shadow: inset 0 1px 2px rgba($black, 0.1);
-$input-shadow-focus: 0 0 5px $medium-gray;
-$input-cursor-disabled: not-allowed;
-$input-transition: box-shadow 0.5s, border-color 0.25s ease-in-out;
-$input-number-spinners: true;
-$input-radius: $global-radius;
-$form-button-radius: $global-radius;
-
-// 20. Label
-// ---------
-
-$label-background: $primary-color;
-$label-color: $white;
-$label-color-alt: $black;
-$label-palette: $foundation-palette;
-$label-font-size: 0.8rem;
-$label-padding: 0.33333rem 0.5rem;
-$label-radius: $global-radius;
-
-// 21. Media Object
-// ----------------
-
-$mediaobject-margin-bottom: $global-margin;
-$mediaobject-section-padding: $global-padding;
-$mediaobject-image-width-stacked: 100%;
-
-// 22. Menu
-// --------
-
-$menu-margin: 0;
-$menu-margin-nested: 1rem;
-$menu-item-padding: 0.7rem 1rem;
-$menu-item-color-active: $white;
-$menu-item-background-active: get-color(primary);
-$menu-icon-spacing: 0.25rem;
-$menu-item-background-hover: $light-gray;
-$menu-border: $light-gray;
-
-// 23. Meter
-// ---------
-
-$meter-height: 1rem;
-$meter-radius: $global-radius;
-$meter-background: $medium-gray;
-$meter-fill-good: $success-color;
-$meter-fill-medium: $warning-color;
-$meter-fill-bad: $alert-color;
-
-// 24. Off-canvas
-// --------------
-
-$offcanvas-size: 250px;
-$offcanvas-vertical-size: 250px;
-$offcanvas-background: $light-gray;
-$offcanvas-shadow: 0 0 10px rgba($black, 0.7);
-$offcanvas-push-zindex: 1;
-$offcanvas-overlap-zindex: 10;
-$offcanvas-reveal-zindex: 1;
-$offcanvas-transition-length: 0.5s;
-$offcanvas-transition-timing: ease;
-$offcanvas-fixed-reveal: true;
-$offcanvas-exit-background: rgba($white, 0.25);
-$maincontent-class: 'off-canvas-content';
-
-// 25. Orbit
-// ---------
-
-$orbit-bullet-background: $medium-gray;
-$orbit-bullet-background-active: $dark-gray;
-$orbit-bullet-diameter: 1.2rem;
-$orbit-bullet-margin: 0.1rem;
-$orbit-bullet-margin-top: 0.8rem;
-$orbit-bullet-margin-bottom: 0.8rem;
-$orbit-caption-background: rgba($black, 0.5);
-$orbit-caption-padding: 1rem;
-$orbit-control-background-hover: rgba($black, 0.5);
-$orbit-control-padding: 1rem;
-$orbit-control-zindex: 10;
-
-// 26. Pagination
-// --------------
-
-$pagination-font-size: rem-calc(14);
-$pagination-margin-bottom: $global-margin;
-$pagination-item-color: $black;
-$pagination-item-padding: rem-calc(3 10);
-$pagination-item-spacing: rem-calc(1);
-$pagination-radius: $global-radius;
-$pagination-item-background-hover: $light-gray;
-$pagination-item-background-current: $primary-color;
-$pagination-item-color-current: $white;
-$pagination-item-color-disabled: $medium-gray;
-$pagination-ellipsis-color: $black;
-$pagination-mobile-items: false;
-$pagination-mobile-current-item: false;
-$pagination-arrows: true;
-
-// 27. Progress Bar
-// ----------------
-
-$progress-height: 1rem;
-$progress-background: $medium-gray;
-$progress-margin-bottom: $global-margin;
-$progress-meter-background: $primary-color;
-$progress-radius: $global-radius;
-
-// 28. Responsive Embed
-// --------------------
-
-$responsive-embed-margin-bottom: rem-calc(16);
-$responsive-embed-ratios: (
- default: 4 by 3,
- widescreen: 16 by 9,
-);
-
-// 29. Reveal
-// ----------
-
-$reveal-background: $white;
-$reveal-width: 600px;
-$reveal-max-width: $global-width;
-$reveal-padding: $global-padding;
-$reveal-border: 1px solid $medium-gray;
-$reveal-radius: $global-radius;
-$reveal-zindex: 1005;
-$reveal-overlay-background: rgba($black, 0.45);
-
-// 30. Slider
-// ----------
-
-$slider-width-vertical: 0.5rem;
-$slider-transition: all 0.2s ease-in-out;
-$slider-height: 0.5rem;
-$slider-background: $light-gray;
-$slider-fill-background: $medium-gray;
-$slider-handle-height: 1.4rem;
-$slider-handle-width: 1.4rem;
-$slider-handle-background: $primary-color;
-$slider-opacity-disabled: 0.25;
-$slider-radius: $global-radius;
-
-// 31. Switch
-// ----------
-
-$switch-background: $medium-gray;
-$switch-background-active: $primary-color;
-$switch-height: 2rem;
-$switch-height-tiny: 1.5rem;
-$switch-height-small: 1.75rem;
-$switch-height-large: 2.5rem;
-$switch-radius: $global-radius;
-$switch-margin: $global-margin;
-$switch-paddle-background: $white;
-$switch-paddle-offset: 0.25rem;
-$switch-paddle-radius: $global-radius;
-$switch-paddle-transition: all 0.25s ease-out;
-
-// 32. Table
-// ---------
-
-$table-background: $white;
-$table-color-scale: 5%;
-$table-border: 1px solid smart-scale($table-background, $table-color-scale);
-$table-padding: rem-calc(8 10 10);
-$table-hover-scale: 2%;
-$table-row-hover: darken($table-background, $table-hover-scale);
-$table-row-stripe-hover: darken($table-background, $table-color-scale + $table-hover-scale);
-$table-is-striped: true;
-$table-striped-background: smart-scale($table-background, $table-color-scale);
-$table-stripe: even;
-$table-head-background: smart-scale($table-background, $table-color-scale / 2);
-$table-head-row-hover: darken($table-head-background, $table-hover-scale);
-$table-foot-background: smart-scale($table-background, $table-color-scale);
-$table-foot-row-hover: darken($table-foot-background, $table-hover-scale);
-$table-head-font-color: $body-font-color;
-$table-foot-font-color: $body-font-color;
-$show-header-for-stacked: false;
-
-// 33. Tabs
-// --------
-
-$tab-margin: 0;
-$tab-background: $white;
-$tab-color: $primary-color;
-$tab-background-active: $light-gray;
-$tab-active-color: $primary-color;
-$tab-item-font-size: rem-calc(12);
-$tab-item-background-hover: $white;
-$tab-item-padding: 1.25rem 1.5rem;
-$tab-expand-max: 6;
-$tab-content-background: $white;
-$tab-content-border: $light-gray;
-$tab-content-color: $body-font-color;
-$tab-content-padding: 1rem;
-
-// 34. Thumbnail
-// -------------
-
-$thumbnail-border: solid 4px $white;
-$thumbnail-margin-bottom: $global-margin;
-$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2);
-$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5);
-$thumbnail-transition: box-shadow 200ms ease-out;
-$thumbnail-radius: $global-radius;
-
-// 35. Title Bar
-// -------------
-
-$titlebar-background: $black;
-$titlebar-color: $white;
-$titlebar-padding: 0.5rem;
-$titlebar-text-font-weight: bold;
-$titlebar-icon-color: $white;
-$titlebar-icon-color-hover: $medium-gray;
-$titlebar-icon-spacing: 0.25rem;
-
-// 36. Tooltip
-// -----------
-
-$has-tip-font-weight: $global-weight-bold;
-$has-tip-border-bottom: dotted 1px $dark-gray;
-$tooltip-background-color: $black;
-$tooltip-color: $white;
-$tooltip-padding: 0.75rem;
-$tooltip-font-size: $small-font-size;
-$tooltip-pip-width: 0.75rem;
-$tooltip-pip-height: $tooltip-pip-width * 0.866;
-$tooltip-radius: $global-radius;
-
-// 37. Top Bar
-// -----------
-
-$topbar-padding: 0.5rem;
-$topbar-background: $light-gray;
-$topbar-submenu-background: $topbar-background;
-$topbar-title-spacing: 0.5rem 1rem 0.5rem 0;
-$topbar-input-width: 200px;
-$topbar-unstack-breakpoint: medium;
diff --git a/src/client/sass/lib/_listjs.scss b/src/client/sass/lib/_listjs.scss
deleted file mode 100644
index 4ce14ee..0000000
--- a/src/client/sass/lib/_listjs.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-.listjs {
- position: relative;
-
- label {
- display: inline-block;
- input {
- margin-bottom: 0;
- }
- }
-
- table {
- border-collapse: collapse;
- thead, tfoot {
- tr th {
- text-align: left;
- &.sort{
- cursor: pointer;
- }
- }
- }
- tbody.list {
- tr:first-child td {
- border-top: solid 1px #696969;
- }
- tr:last-child td {
- border-bottom: solid 1px #696969;
- }
-
- tr td {
- border-top: solid 1px #c8c8c8;
- padding: 0.3rem;
- }
- }
- }
- ul.pagination {
- float: right;
- display: inline-block;
- margin: 0;
- li {
- display: inline-block;
- padding-left: 5px;
- padding-right: 5px;
- text-decoration: underline;
-
- &.active, &.disabled {
- text-decoration: none;
- }
-
- a.page {
-
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/client/sass/lib/_modal.scss b/src/client/sass/lib/_modal.scss
deleted file mode 100644
index 1a84c9d..0000000
--- a/src/client/sass/lib/_modal.scss
+++ /dev/null
@@ -1,91 +0,0 @@
-
-.background {
- position: fixed;
- z-index: 1000000;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- overflow: auto;
- //background-color: rgb(0, 0, 0); /* Fallback color */
- background-color: rgba(55, 55, 55, 0.6);
-
- .modal {
- position: relative;
- top: 50%;
- //left: 10%;
- //right: 10%;
- margin: auto;
- width: 80%;
-
- //background-color: #fefefe;
-
- transform: translateY(-50%);
- padding: 0.5rem;
- display: flex;
- flex-direction: column;
- max-height: 80%;
- max-width: nth(nth($breakpoints, 4),2);
-
- &.small-margin {
- @include breakpoint(medium down) {
- width: 90%;
- }
- @include breakpoint(small down) {
- width: 95%;
- }
- }
-
- @each $size in $breakpoints
- {
- &.max-#{nth($size, 1)}
- {
- max-width: nth($size, 2);
- }
- }
-
- .title {
- font-weight: bold;
- padding-bottom: 0.5rem;
- }
-
- .content-container {
- overflow-y: auto;
- max-height: 100%;
-
- .loader{
- position:static;
- transform: none;
- }
- }
-
- .close {
- text-align: right;
- //color: #aaa;
- float: right;
- font-size: 28px;
- font-weight: bold;
- line-height: 1;
-
- &:hover,
- &:focus {
- //color: black;
- text-decoration: none;
- cursor: pointer;
- }
- }
-
- .modal-button-container {
- padding-top: 0.5rem;
- .button {
- margin-left: 0.2rem;
- margin-bottom: 0 !important;
- padding: 0.6em 0.8em;
- @include breakpoint(small down) {
- margin-left: 0.1rem;
- padding: 0.3em 0.5em;
- }
- }
- }
- }
-}
diff --git a/src/client/sass/lib/_pwaAssets.scss b/src/client/sass/lib/_pwaAssets.scss
deleted file mode 100644
index 4dd9dfc..0000000
--- a/src/client/sass/lib/_pwaAssets.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-
-.no-transition{
- transition: none !important;
- * {
- transition: none !important;
- }
-}
\ No newline at end of file
diff --git a/src/client/sass/lib/_settingsSite.scss b/src/client/sass/lib/_settingsSite.scss
index 154e04c..ece4580 100644
--- a/src/client/sass/lib/_settingsSite.scss
+++ b/src/client/sass/lib/_settingsSite.scss
@@ -13,6 +13,7 @@
#settings-fragments {
> * {
display: none;
+
&.active {
display: block;
}
@@ -24,26 +25,31 @@
.switch {
position: relative;
display: inline-block;
+ height: initial;
- @include breakpoint(small down){
+ @include breakpoint(small down) {
font-size: 0.6em;
}
- @include breakpoint(smedium down){
+ @include breakpoint(smedium down) {
font-size: 0.7em;
}
+
input {
display: none;
- &:checked + .slider{
+
+ &:checked + .slider {
//background-color: #2196F3;
- &:before{
+ &:before {
transform: translateX(1.5em);
}
}
- &:focus + .slider{
+
+ &:focus + .slider {
//box-shadow: 0 0 1px #2196F3;
}
}
+
.slider {
display: inline-block;
position: relative;
@@ -55,7 +61,8 @@
transition: .4s;
margin-bottom: 0;
margin-top: 0;
- &:before{
+
+ &:before {
position: absolute;
content: "";
height: 1.1em;
@@ -67,30 +74,38 @@
border-radius: 50%;
}
}
- img, svg{
+
+ img, svg {
width: 1.4em;
display: inline;
vertical-align: initial;
- path{
+
+ path {
stroke-color: inherit;
}
}
}
-label{
+
+label {
font-size: 1em !important;
}
-.setting-row:not(.hidden){
+
+.setting-row:not(.hidden) {
line-height: 1;
- padding-top: 0.5em;
- padding-bottom: 0.5em;
+ display: flex;
+ padding: 0.5rem 0.4rem;
+ align-items: center;
+
width: 100%;
cursor: pointer;
background: rgba(195, 195, 195, 0.13);
- //display: inline-block;
- input[type=checkbox]
- {
+ > * {
+ flex: 1;
+ }
+
+ input[type=checkbox] {
margin: 0;
}
}
diff --git a/src/client/sass/wordRotator.scss b/src/client/sass/wordRotator.scss
index 8f1e8e6..660050f 100644
--- a/src/client/sass/wordRotator.scss
+++ b/src/client/sass/wordRotator.scss
@@ -1,11 +1,9 @@
-@import "settings";
-@import "lib/_rotate.scss";
+//@import "lib/_rotate.scss";
@import "lib/_share.scss";
-@import "lib/_tabs.scss";
+//@import "lib/_tabs.scss";
@import "lib/_core.scss";
-@import "lib/_flashMessenger.scss";
-@import "lib/_framework.scss";
-@import "lib/_pwaAssets.scss";
+//@import "lib/_flashMessenger.scss";
+//@import "lib/_framework.scss";
@import "lib/_settingsSite.scss";
@import "lib/_style.scss";
@import "lib/_theme.scss";
@@ -13,19 +11,14 @@
@import "wordrotatorTheme";
-$text-shadow: /*
- 0 0 3px #787878,
- 0 0 10px #000000;
-*/
-
- /*
- 0 3px 3px #787878,
- 15px 15px 8px #000000
- */
- 0 0.2rem 0.2rem #464646, 0.6rem 0.8rem 0.4rem #00000090;
-
-
+$text-shadow: 0 0.2rem 0.2rem #464646, 0.6rem 0.8rem 0.4rem #00000090;
+.no-transition{
+ transition: none !important;
+ * {
+ transition: none !important;
+ }
+}
//ActionBar
nav.top-bar.title-bar {
@@ -355,7 +348,7 @@ $coinTowerDimension: 28px;
top: 0;
left: 0;
- text-shadow: $text-shadow;
+ //text-shadow: $text-shadow;
}
}
@@ -405,7 +398,7 @@ $coinTowerDimension: 28px;
display: none;
}
- #won-text{
+ #won-text {
text-shadow: $text-shadow;
}
@@ -425,7 +418,7 @@ $coinTowerDimension: 28px;
#play-button {
@include breakpoint(small down) {
- margin-bottom: 2px;
+ margin-bottom: 0.5rem;
}
}
@@ -482,4 +475,4 @@ svg {
.fill-background {
fill: white;
}
-}
\ No newline at end of file
+}
diff --git a/src/client/translations/de.json b/src/client/translations/de.json
index 7cab480..39035c1 100644
--- a/src/client/translations/de.json
+++ b/src/client/translations/de.json
@@ -48,5 +48,6 @@
"privacy policy accepted": " akzeptiert",
"message": "Nachricht",
"send": "Senden",
- "the message was sent": "Die Nachricht wurde gesendet."
-}
\ No newline at end of file
+ "the message was sent": "Die Nachricht wurde gesendet.",
+ "wr": "WR"
+}
diff --git a/src/server/public/config.xml b/src/server/public/config.xml
index 5d7407a..0b0dab0 100644
--- a/src/server/public/config.xml
+++ b/src/server/public/config.xml
@@ -1,5 +1,5 @@
-
+
WordRotator
A word-game
diff --git a/src/server/public/service-worker.js.map b/src/server/public/service-worker.js.map
index 78622f8..374c953 100644
--- a/src/server/public/service-worker.js.map
+++ b/src/server/public/service-worker.js.map
@@ -1 +1 @@
-{"version":3,"file":"service-worker.js","sources":["../../../../../tmp/c18028f2f290fd8fb18eae91b1e278f8/service-worker.js"],"sourcesContent":["import {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/silas/Projekte/web/wordRotator/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"autobundle.js\",\n \"revision\": \"13c52d778d9424443ebc2f01ea905320\"\n },\n {\n \"url\": \"autohtml/abstractWindowTemplate.html\",\n \"revision\": \"6c3ea1af1622920ddbc5bf4b548792f1\"\n },\n {\n \"url\": \"autohtml/alphabeticListFragment.html\",\n \"revision\": \"17b160c9c961ee83eced3a2c7d5f7749\"\n },\n {\n \"url\": \"autohtml/changeUserSite.html\",\n \"revision\": \"32ca48dd5c17c3ca7259a192c6ad3e5f\"\n },\n {\n \"url\": \"autohtml/chooseDialog.html\",\n \"revision\": \"1e4a0cfb29c721b64799c342f7586ad6\"\n },\n {\n \"url\": \"autohtml/contactSite.html\",\n \"revision\": \"2cdee4e20c1728e1f8e03110cbfcbd4c\"\n },\n {\n \"url\": \"autohtml/container.html\",\n \"revision\": \"7c9ef0046546b6535e2197845804df3d\"\n },\n {\n \"url\": \"autohtml/credits.html\",\n \"revision\": \"7ad14642353efd449a3890122bb73b1e\"\n },\n {\n \"url\": \"autohtml/end.html\",\n \"revision\": \"162cd57d50145eb4dbf51ca7bc97256a\"\n },\n {\n \"url\": \"autohtml/forgotPasswordSite.html\",\n \"revision\": \"ef290b527ae9e6ecf6e2ec31ecc99b87\"\n },\n {\n \"url\": \"autohtml/impressum.html\",\n \"revision\": \"1533d5dba0bd88309b004d65bc59c5f1\"\n },\n {\n \"url\": \"autohtml/level.html\",\n \"revision\": \"05cef7e7e823c25ed8bb735da3cf585b\"\n },\n {\n \"url\": \"autohtml/loginSite.html\",\n \"revision\": \"28536b28261bdd966784e32ef8e8bda2\"\n },\n {\n \"url\": \"autohtml/menu.html\",\n \"revision\": \"a356869e90f07077cc3a07dd36c238c5\"\n },\n {\n \"url\": \"autohtml/menuSite.html\",\n \"revision\": \"926a7a940ae8741445644f16132a9f20\"\n },\n {\n \"url\": \"autohtml/navbar.html\",\n \"revision\": \"04c4cb0adaa4e69cb43fb35cc8482b0a\"\n },\n {\n \"url\": \"autohtml/notAllowedSite.html\",\n \"revision\": \"da6b73654dccd61eebe8f4f1ba06e340\"\n },\n {\n \"url\": \"autohtml/privacyPolicy.html\",\n \"revision\": \"7319848c6b090b0af30ac56492101ee8\"\n },\n {\n \"url\": \"autohtml/registrationSite.html\",\n \"revision\": \"0911eeabc518befa874ea1661b64c3d7\"\n },\n {\n \"url\": \"autohtml/selectUserDialog.html\",\n \"revision\": \"23ae55ef46c250f2ab2528f4422a14d6\"\n },\n {\n \"url\": \"autohtml/settings.html\",\n \"revision\": \"d8a6ead5c9f8dd6f6319b61caab9d359\"\n },\n {\n \"url\": \"autohtml/settingsSite.html\",\n \"revision\": \"06f47ad4321d3ede658035e0411df0b0\"\n },\n {\n \"url\": \"autohtml/shareDialog.html\",\n \"revision\": \"cc8b45e9c7f6264e7b61d6da3e6210c6\"\n },\n {\n \"url\": \"autohtml/swipeFragment.html\",\n \"revision\": \"553c580ff0a282c49a2efe35dabad809\"\n },\n {\n \"url\": \"autohtml/tabFragment.html\",\n \"revision\": \"ca8c3b2c4a353a0ee7900aef656cc958\"\n },\n {\n \"url\": \"autoimg/arrowLeft.svg\",\n \"revision\": \"6bbb4f0e313bb88cd0cc80c2b3cd36fc\"\n },\n {\n \"url\": \"autoimg/background.png\",\n \"revision\": \"be3db85ac9a143f4bcac7db7f5a4856e\"\n },\n {\n \"url\": \"autoimg/brightAndBeautifull__.mp3\",\n \"revision\": \"2b40fd6c076d254cf639f8f46819d5ca\"\n },\n {\n \"url\": \"autoimg/coin.png\",\n \"revision\": \"5b380862ff8349f6b4b8d5241893f508\"\n },\n {\n \"url\": \"autoimg/coinTower.png\",\n \"revision\": \"50cef0780a1affcd301c2c4be09ccb25\"\n },\n {\n \"url\": \"autoimg/errorIcon.png\",\n \"revision\": \"b48a01a1871b83b30c317f0fc4aed555\"\n },\n {\n \"url\": \"autoimg/help.png\",\n \"revision\": \"45a8dc0493279dc37f72f8026af5bc10\"\n },\n {\n \"url\": \"autoimg/logo.png\",\n \"revision\": \"5246599497de18a878951e1e98083493\"\n },\n {\n \"url\": \"autoimg/music.svg\",\n \"revision\": \"ce36074e94a8d19dfa383f98bd66a1f4\"\n },\n {\n \"url\": \"autoimg/settings.png\",\n \"revision\": \"c44ce577ac56632e53208833ff78e67f\"\n },\n {\n \"url\": \"autoimg/share.svg\",\n \"revision\": \"ac8fc0221ee400fc843090a834df7c9d\"\n },\n {\n \"url\": \"autoimg/single_coin_fall_on_concrete_.mp3\",\n \"revision\": \"7f0de4f503644a7fc14de7e307bbf722\"\n },\n {\n \"url\": \"autoimg/speaker.svg\",\n \"revision\": \"0d926850f1558dd431e1c6b10fe0c2ef\"\n },\n {\n \"url\": \"autoimg/telegram.svg\",\n \"revision\": \"e366fed4603e06142a2d6b8221be51b8\"\n },\n {\n \"url\": \"autoimg/whatsapp.svg\",\n \"revision\": \"0fa4092ac1f91a5390e74a3c2c03d5e3\"\n },\n {\n \"url\": \"autoindex.css\",\n \"revision\": \"57dd368ab96459de433a2a3cbacc765d\"\n },\n {\n \"url\": \"autoindex.html\",\n \"revision\": \"d9da26b18b24767c7bedb06a44bc31ce\"\n },\n {\n \"url\": \"autoscripts/localforage.js\",\n \"revision\": \"7ae08028a75fed2acce92b8e75fbe08c\"\n },\n {\n \"url\": \"autoscripts/sql-wasm.js\",\n \"revision\": \"b34648b4b4c89ba52bcd7468fa035583\"\n },\n {\n \"url\": \"autosql-wasm.wasm\",\n \"revision\": \"bff856e0a3429d33cfb88d20b7f9fcff\"\n }\n], {});\n\n\n\n\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting"],"mappings":"0yBAmBAA,KAAKC,iBAAiB,UAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,mCAY2B,CAClC,KACS,yBACK,oCAEd,KACS,gDACK,oCAEd,KACS,gDACK,oCAEd,KACS,wCACK,oCAEd,KACS,sCACK,oCAEd,KACS,qCACK,oCAEd,KACS,mCACK,oCAEd,KACS,iCACK,oCAEd,KACS,6BACK,oCAEd,KACS,4CACK,oCAEd,KACS,mCACK,oCAEd,KACS,+BACK,oCAEd,KACS,mCACK,oCAEd,KACS,8BACK,oCAEd,KACS,kCACK,oCAEd,KACS,gCACK,oCAEd,KACS,wCACK,oCAEd,KACS,uCACK,oCAEd,KACS,0CACK,oCAEd,KACS,0CACK,oCAEd,KACS,kCACK,oCAEd,KACS,sCACK,oCAEd,KACS,qCACK,oCAEd,KACS,uCACK,oCAEd,KACS,qCACK,oCAEd,KACS,iCACK,oCAEd,KACS,kCACK,oCAEd,KACS,6CACK,oCAEd,KACS,4BACK,oCAEd,KACS,iCACK,oCAEd,KACS,iCACK,oCAEd,KACS,4BACK,oCAEd,KACS,4BACK,oCAEd,KACS,6BACK,oCAEd,KACS,gCACK,oCAEd,KACS,6BACK,oCAEd,KACS,qDACK,oCAEd,KACS,+BACK,oCAEd,KACS,gCACK,oCAEd,KACS,gCACK,oCAEd,KACS,yBACK,oCAEd,KACS,0BACK,oCAEd,KACS,sCACK,oCAEd,KACS,mCACK,oCAEd,KACS,6BACK,qCAEb"}
\ No newline at end of file
+{"version":3,"file":"service-worker.js","sources":["../../../../../tmp/e3f29bc3b67803fdffb5ae8cb8dc01fe/service-worker.js"],"sourcesContent":["import {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/silas/Projekte/web/wordRotator/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"autobundle.js\",\n \"revision\": \"13c52d778d9424443ebc2f01ea905320\"\n },\n {\n \"url\": \"autohtml/abstractWindowTemplate.html\",\n \"revision\": \"6c3ea1af1622920ddbc5bf4b548792f1\"\n },\n {\n \"url\": \"autohtml/alphabeticListFragment.html\",\n \"revision\": \"17b160c9c961ee83eced3a2c7d5f7749\"\n },\n {\n \"url\": \"autohtml/changeUserSite.html\",\n \"revision\": \"32ca48dd5c17c3ca7259a192c6ad3e5f\"\n },\n {\n \"url\": \"autohtml/chooseDialog.html\",\n \"revision\": \"1e4a0cfb29c721b64799c342f7586ad6\"\n },\n {\n \"url\": \"autohtml/contactSite.html\",\n \"revision\": \"2cdee4e20c1728e1f8e03110cbfcbd4c\"\n },\n {\n \"url\": \"autohtml/container.html\",\n \"revision\": \"7c9ef0046546b6535e2197845804df3d\"\n },\n {\n \"url\": \"autohtml/credits.html\",\n \"revision\": \"7ad14642353efd449a3890122bb73b1e\"\n },\n {\n \"url\": \"autohtml/end.html\",\n \"revision\": \"162cd57d50145eb4dbf51ca7bc97256a\"\n },\n {\n \"url\": \"autohtml/forgotPasswordSite.html\",\n \"revision\": \"ef290b527ae9e6ecf6e2ec31ecc99b87\"\n },\n {\n \"url\": \"autohtml/impressum.html\",\n \"revision\": \"1533d5dba0bd88309b004d65bc59c5f1\"\n },\n {\n \"url\": \"autohtml/level.html\",\n \"revision\": \"05cef7e7e823c25ed8bb735da3cf585b\"\n },\n {\n \"url\": \"autohtml/loginSite.html\",\n \"revision\": \"28536b28261bdd966784e32ef8e8bda2\"\n },\n {\n \"url\": \"autohtml/menu.html\",\n \"revision\": \"a356869e90f07077cc3a07dd36c238c5\"\n },\n {\n \"url\": \"autohtml/menuSite.html\",\n \"revision\": \"926a7a940ae8741445644f16132a9f20\"\n },\n {\n \"url\": \"autohtml/navbar.html\",\n \"revision\": \"04c4cb0adaa4e69cb43fb35cc8482b0a\"\n },\n {\n \"url\": \"autohtml/notAllowedSite.html\",\n \"revision\": \"da6b73654dccd61eebe8f4f1ba06e340\"\n },\n {\n \"url\": \"autohtml/privacyPolicy.html\",\n \"revision\": \"7319848c6b090b0af30ac56492101ee8\"\n },\n {\n \"url\": \"autohtml/registrationSite.html\",\n \"revision\": \"0911eeabc518befa874ea1661b64c3d7\"\n },\n {\n \"url\": \"autohtml/selectUserDialog.html\",\n \"revision\": \"23ae55ef46c250f2ab2528f4422a14d6\"\n },\n {\n \"url\": \"autohtml/settings.html\",\n \"revision\": \"d8a6ead5c9f8dd6f6319b61caab9d359\"\n },\n {\n \"url\": \"autohtml/settingsSite.html\",\n \"revision\": \"06f47ad4321d3ede658035e0411df0b0\"\n },\n {\n \"url\": \"autohtml/shareDialog.html\",\n \"revision\": \"cc8b45e9c7f6264e7b61d6da3e6210c6\"\n },\n {\n \"url\": \"autohtml/swipeFragment.html\",\n \"revision\": \"553c580ff0a282c49a2efe35dabad809\"\n },\n {\n \"url\": \"autohtml/tabFragment.html\",\n \"revision\": \"ca8c3b2c4a353a0ee7900aef656cc958\"\n },\n {\n \"url\": \"autoimg/arrowLeft.svg\",\n \"revision\": \"6bbb4f0e313bb88cd0cc80c2b3cd36fc\"\n },\n {\n \"url\": \"autoimg/background.png\",\n \"revision\": \"be3db85ac9a143f4bcac7db7f5a4856e\"\n },\n {\n \"url\": \"autoimg/brightAndBeautifull__.mp3\",\n \"revision\": \"2b40fd6c076d254cf639f8f46819d5ca\"\n },\n {\n \"url\": \"autoimg/coin.png\",\n \"revision\": \"5b380862ff8349f6b4b8d5241893f508\"\n },\n {\n \"url\": \"autoimg/coinTower.png\",\n \"revision\": \"50cef0780a1affcd301c2c4be09ccb25\"\n },\n {\n \"url\": \"autoimg/errorIcon.png\",\n \"revision\": \"b48a01a1871b83b30c317f0fc4aed555\"\n },\n {\n \"url\": \"autoimg/help.png\",\n \"revision\": \"45a8dc0493279dc37f72f8026af5bc10\"\n },\n {\n \"url\": \"autoimg/logo.png\",\n \"revision\": \"5246599497de18a878951e1e98083493\"\n },\n {\n \"url\": \"autoimg/music.svg\",\n \"revision\": \"ce36074e94a8d19dfa383f98bd66a1f4\"\n },\n {\n \"url\": \"autoimg/settings.png\",\n \"revision\": \"c44ce577ac56632e53208833ff78e67f\"\n },\n {\n \"url\": \"autoimg/share.svg\",\n \"revision\": \"ac8fc0221ee400fc843090a834df7c9d\"\n },\n {\n \"url\": \"autoimg/single_coin_fall_on_concrete_.mp3\",\n \"revision\": \"7f0de4f503644a7fc14de7e307bbf722\"\n },\n {\n \"url\": \"autoimg/speaker.svg\",\n \"revision\": \"0d926850f1558dd431e1c6b10fe0c2ef\"\n },\n {\n \"url\": \"autoimg/telegram.svg\",\n \"revision\": \"e366fed4603e06142a2d6b8221be51b8\"\n },\n {\n \"url\": \"autoimg/whatsapp.svg\",\n \"revision\": \"0fa4092ac1f91a5390e74a3c2c03d5e3\"\n },\n {\n \"url\": \"autoindex.css\",\n \"revision\": \"57dd368ab96459de433a2a3cbacc765d\"\n },\n {\n \"url\": \"autoindex.html\",\n \"revision\": \"d9da26b18b24767c7bedb06a44bc31ce\"\n },\n {\n \"url\": \"autoscripts/localforage.js\",\n \"revision\": \"7ae08028a75fed2acce92b8e75fbe08c\"\n },\n {\n \"url\": \"autoscripts/sql-wasm.js\",\n \"revision\": \"b34648b4b4c89ba52bcd7468fa035583\"\n },\n {\n \"url\": \"autosql-wasm.wasm\",\n \"revision\": \"bff856e0a3429d33cfb88d20b7f9fcff\"\n }\n], {});\n\n\n\n\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting"],"mappings":"0yBAmBAA,KAAKC,iBAAiB,UAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,mCAY2B,CAClC,KACS,yBACK,oCAEd,KACS,gDACK,oCAEd,KACS,gDACK,oCAEd,KACS,wCACK,oCAEd,KACS,sCACK,oCAEd,KACS,qCACK,oCAEd,KACS,mCACK,oCAEd,KACS,iCACK,oCAEd,KACS,6BACK,oCAEd,KACS,4CACK,oCAEd,KACS,mCACK,oCAEd,KACS,+BACK,oCAEd,KACS,mCACK,oCAEd,KACS,8BACK,oCAEd,KACS,kCACK,oCAEd,KACS,gCACK,oCAEd,KACS,wCACK,oCAEd,KACS,uCACK,oCAEd,KACS,0CACK,oCAEd,KACS,0CACK,oCAEd,KACS,kCACK,oCAEd,KACS,sCACK,oCAEd,KACS,qCACK,oCAEd,KACS,uCACK,oCAEd,KACS,qCACK,oCAEd,KACS,iCACK,oCAEd,KACS,kCACK,oCAEd,KACS,6CACK,oCAEd,KACS,4BACK,oCAEd,KACS,iCACK,oCAEd,KACS,iCACK,oCAEd,KACS,4BACK,oCAEd,KACS,4BACK,oCAEd,KACS,6BACK,oCAEd,KACS,gCACK,oCAEd,KACS,6BACK,oCAEd,KACS,qDACK,oCAEd,KACS,+BACK,oCAEd,KACS,gCACK,oCAEd,KACS,gCACK,oCAEd,KACS,yBACK,oCAEd,KACS,0BACK,oCAEd,KACS,sCACK,oCAEd,KACS,mCACK,oCAEd,KACS,6BACK,qCAEb"}
\ No newline at end of file
diff --git a/src/server/public/wordRotator.apk b/src/server/public/wordRotator.apk
index 189423dff4f94860b61640833474d655675100a4..39b87a1e4eac4bf000587edce284d6d6625bcec7 100644
GIT binary patch
delta 80772
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