übertrag zum PC

This commit is contained in:
silas
2018-09-30 16:11:06 +02:00
parent ad1064ffd3
commit ac32aa83dd
32 changed files with 830 additions and 205 deletions

View File

@@ -18,10 +18,13 @@ import "./lib/pwa-user-management"
import {SettingsManager, SettingsSite} from "./lib/pwa-core";
import {SoundManager} from "./lib/pwa-assets";
import {Matomo, SoundManager} from "./lib/pwa-assets";
import {MenuSite} from "../module/Application/pwa/js/site/MenuSite";
import {WordRotatorSettingFragment} from "../module/Application/pwa/js/Fragment/WordRotatorSettingFragment";
import {PrivacyPolicySite} from "../module/Application/pwa/js/site/PrivacyPolicySite";
import {CreditsSite} from "../module/Application/pwa/js/site/CreditsSite";
applyPolyfills();
@@ -41,8 +44,6 @@ ShareManager.addShareButton(new TelegramShareButton('img/telegram.svg'));
let app = new App();
// app.addDeepLink("policy", PrivatePolicySite.name);
// app.setAddThemeAction(true);
// app.addDefaultAction(Translator.generateChangeLanguageMenuAction());
// bridge für Android
window["ThemeManager"] = ThemeManager;
@@ -58,7 +59,7 @@ SettingsSite.setTemplate("html/application/setting-template.html");
RegistrationSite.addAction = false;
LoginSite.addLoginAction = false;
InitPromise.resolve(app).then(function(){
InitPromise.resolve(app).then(async function(){
SettingsSite.settingsAction.showFor = MenuAction.SHOW_ALWAYS;
let settingsManager = SettingsManager.getInstance();
@@ -68,5 +69,8 @@ InitPromise.resolve(app).then(function(){
app.start(MenuSite);
Translator.setLanguage("de");
// let matomo = new Matomo();
// console.log(await matomo._askIsTracking());
});

View File

@@ -1,4 +1,4 @@
import { Helper, Fragment, Translator } from './pwa-lib.js';
import { Helper, InitPromise, Fragment, Translator } from './pwa-lib.js';
class DelayPromise extends Promise {
static async delay(delay) {
@@ -8,6 +8,88 @@ class DelayPromise extends Promise {
}
}
class Matomo {
static init() {
Matomo.isTrackingPromise = new Promise(async (resolve) => {
let shouldTrack = localStorage.getItem(Matomo.LOCAL_STORAGE_KEY);
console.log(shouldTrack,Helper.isNull(shouldTrack));
if (Helper.isNull(shouldTrack)) {
shouldTrack = await Matomo._askIsTracking();
localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, shouldTrack);
}
else {
console.log(shouldTrack, (shouldTrack === "1"));
shouldTrack = (shouldTrack === "1");
Matomo.setTrack(shouldTrack);
}
resolve(shouldTrack);
});
Matomo.isTrackingPromise.then(() => {
Matomo.push(['trackPageView']);
Matomo.push(['enableLinkTracking']);
Matomo.push(['setTrackerUrl', Matomo.TRACK_SITE + '/piwik.php']);
Matomo.push(['setSiteId', '1']);
let d = document, g = d.createElement('script'), s = d.getElementsByTagName('head')[0];
g.type = 'text/javascript';
g.async = true;
g.defer = true;
g.src = Matomo.TRACK_SITE + '/piwik.js';
s.appendChild(g);
});
}
static async _askIsTracking() {
console.log(Matomo.TRACK_SITE + Matomo.BASE_PATH + "isTracked");
Matomo.isTrackingPromise = Matomo.query("isTracked")
.then(xml => {
let textContent = xml.firstChild.textContent;
// localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, textContent);
return (textContent === "1")
});
return Matomo.isTrackingPromise;
}
static async query(method) {
return fetch(Matomo.TRACK_SITE + Matomo.BASE_PATH + method, {
// "method":"POST",
"mode": "cors",
"credentials": "include",
// "headers": {
// 'Access-Control-Allow-Origin': '*',
// 'Access-Control-Allow-Credentials': 'true',
// },
}).then(res => res.text()).then(text => (new window.DOMParser()).parseFromString(text, "text/xml"));
}
static getTrackingPromise() {
return Matomo.isTrackingPromise;
}
static async setTrack(shouldTrack) {
Matomo.isTrackingPromise = Promise.resolve(shouldTrack);
localStorage.setItem(Matomo.LOCAL_STORAGE_KEY, (shouldTrack === true) ? "1" : "0");
return await Matomo.query((shouldTrack) ? "doTrack" : "doIgnore");
}
static async push(arr) {
if (await Matomo.getTrackingPromise()) {
window["_paq"].push(arr);
}
}
}
Matomo.LOCAL_STORAGE_KEY = "matomoShouldTrack";
Matomo.TRACK_SITE = "//matomo.silas.link";
Matomo.BASE_PATH = "/index.php?module=API&method=AjaxOptOut.";
InitPromise.addPromise(() => {
window["_paq"] = window["_paq"] || [];
Matomo.init();
});
class RotateHelper {
rotate(element, degrees){
let rotateText = element.innerText;
@@ -271,4 +353,4 @@ class TabbedFragment extends Fragment {
}
}
export { DelayPromise, RotateHelper, ScaleHelper, SoundManager, TabbedFragment };
export { DelayPromise, Matomo, RotateHelper, ScaleHelper, SoundManager, TabbedFragment };

View File

@@ -355,16 +355,22 @@ class LocalStorageSettingsFragment extends Fragment {
let settings = this.findBy(".setting", true);
const settingsManager = SettingsManager.getInstance();
for (let i = 0; i < settings.length; i++) {
for (let i = 0; i < settings.length; i++) {
let setting = settings[i];
const name = setting.name;
let value = settingsManager.getSetting(name);
let value;
if (!setting["dataset"]["raw"]) {
value = settingsManager.getSetting(name);
} else {
value = localStorage.getItem(name);
}
let isCheckable = false;
if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) {
isCheckable = true;
}
if (!settingsManager.hasSetting(name) && Helper.isNotNull(settings[i]["dataset"]["default"])) {
if (((!setting["dataset"]["raw"] && !settingsManager.hasSetting(name)) || (setting["dataset"]["raw"] && value === null))
&& Helper.isNotNull(settings[i]["dataset"]["default"])) {
value = setting["dataset"]["default"];
if (Helper.isNotNull(setting["dataset"]["defaultTranslateable"])) {
@@ -387,19 +393,15 @@ class LocalStorageSettingsFragment extends Fragment {
}
setting.addEventListener("change", function () {
// console.log(setting);
let value = this.value;
if (isCheckable) {
if (this.checked)
{
settingsManager.setSetting(name, value);
}
else
{
settingsManager.setSetting(name, null);
}
if (isCheckable && !this.checked) {
value = null;
}
else {
if (!setting["dataset"]["raw"]) {
settingsManager.setSetting(name, value);
} else {
localStorage.setItem(name, value);
}
delete setting["dataset"]["translationValue"];
delete setting["dataset"]["translation"];

View File

@@ -2,7 +2,7 @@ import {SystemSettings, Translator} from "./lib/pwa-lib";
let basePath = "/pwa/wordRotator/public/";
if (window.location.pathname.endsWith("publicTest/"))
if (window.location.pathname.includes("publicTest/"))
{
basePath = "/pwa/wordRotator/publicTest/";
}

View File

@@ -0,0 +1 @@
<div></div>

View File

@@ -0,0 +1,5 @@
<div id='theme-choose-container'>
<div id='choose-theme-template'>
<div class='name'></div>
</div>
</div>

View File

@@ -1,103 +1,137 @@
<div class='max-height fill-me'>
<div class='row max-width grow flex-center'>
<div class='columns small-centered small-12 smedium-9 medium-11 large-7'>
<div class='row'>
<div class='columns small-centered small-12 smedium-11 medium-9 large-7'>
<div class='row' id = "theme-chooser">
<span class='columns small-6' data-translation="theme"></span>
<span class='columns small-6'>
<label id = 'theme-radio-template'><input type="radio" class='setting' name='theme'></label>
<span class='columns small-6 text-right'>
<!--<label id='theme-radio-template'><input type="radio" class='setting' name='theme'></label>-->
<div id = 'theme-name'></div>
</span>
</div>
<div class='row'>
<span class='columns small-6' data-translation="sound"></span>
<span class='columns small-6 text-right'>
<label class="switch">
<!--<div data-view="img/speaker.svg"></div>-->
<input type="checkbox" class="setting" id="play-sound" name='play-sound' value="1" data-default="1">
<span class="slider"></span>
</label>
</span>
</div>
<!--<div class='row'>-->
<!--<span class='columns small-6' data-translation="language"></span>-->
<!--<span class='columns small-6'>-->
<!--<label id = 'language-radio-template'><input type="radio" class='setting' name='language'></label>-->
<!--</span>-->
<!--</div>-->
<button id = 'reset-levels' class = "button" data-translation="reset-levels"></button>
<div class='row'>
<span class='columns small-6' data-translation="music"></span>
<span class='columns small-6 text-right'>
<label class="switch">
<!--<div data-view="img/music.svg"></div>-->
<input type="checkbox" class="setting" id="play-music" name='play-music' value="1" data-default="1">
<span class="slider"></span>
</label>
</span>
</div>
<div class='row' id='credits-button'>
<span class='columns small-6' data-translation="credits"></span>
<span class='columns small-6 text-right' data-translation=">"></span>
</div>
<div class='row' id='privacy-policy-button'>
<span class='columns small-6' data-translation="privacy-policy"></span>
<span class='columns small-6 text-right' data-translation=">"></span>
</div>
<div class='row' id='impressum-button'>
<span class='columns small-6' data-translation="impressum"></span>
<span class='columns small-6 text-right' data-translation=">"></span>
</div>
<div class='row'>
<span class='columns small-6' data-translation="track"></span>
<span class='columns small-6 text-right'>
<label class="switch">
<!--<div data-view="img/music.svg"></div>-->
<input type="checkbox" class="setting" id="track-switch" name='matomoShouldTrack' value="1" data-default="1" data-raw="1">
<span class="slider"></span>
</label>
</span>
</div>
<!--<iframe-->
<!--style="border: 0; height: 200px; width: 600px;"-->
<!--src="https://matomo.silas.link/index.php?module=CoreAdminHome&action=optOut&language=de&backgroundColor=&fontColor=&fontSize=&fontFamily="-->
<!--&gt;</iframe>-->
<button id='reset-levels' class="button" data-translation="reset-levels"></button>
<!--<label class='row'>-->
<!--<span class='columns small-6' data-translation="ignore-card-always"></span>-->
<!--<span class='columns small-6'><input type="checkbox" class='setting' name='ignore-card-always'-->
<!--value='true'></span>-->
<!--<span class='columns small-6' data-translation="ignore-card-always"></span>-->
<!--<span class='columns small-6'><input type="checkbox" class='setting' name='ignore-card-always'-->
<!--value='true'></span>-->
<!--</label>-->
<!--<br/>-->
<!--<label class='row'>-->
<!--<span class='columns small-6' data-translation="use-included-latex"></span>-->
<!--<span class='columns small-6'><input type="checkbox" class='setting' name='use-included-latex' data-default="true" value="true"></span>-->
<!--<span class='columns small-6' data-translation="use-included-latex"></span>-->
<!--<span class='columns small-6'><input type="checkbox" class='setting' name='use-included-latex' data-default="true" value="true"></span>-->
<!--</label>-->
<!--<div class='row'>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-1-text"-->
<!--data-default="ignore-card-1" data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-1-text"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-1-time" data-default="120">-->
<!--<span data-translation="settings-ignore-button-1-time"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-1-text"-->
<!--data-default="ignore-card-1" data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-1-text"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-1-time" data-default="120">-->
<!--<span data-translation="settings-ignore-button-1-time"></span>-->
<!--</label>-->
<!--</div>-->
<!--</div>-->
<!--<div class='row'>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-2-text"-->
<!--data-default="ignore-card-2" data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-2-text"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-2-time" data-default="1440">-->
<!--<span data-translation="settings-ignore-button-2-time"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-2-text"-->
<!--data-default="ignore-card-2" data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-2-text"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-2-time" data-default="1440">-->
<!--<span data-translation="settings-ignore-button-2-time"></span>-->
<!--</label>-->
<!--</div>-->
<!--</div>-->
<!--<div class='row'>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-3-text"-->
<!--data-default="ignore-card-3" data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-3-text"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-3-time" data-default="7200">-->
<!--<span data-translation="settings-ignore-button-3-time"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-3-text"-->
<!--data-default="ignore-card-3" data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-3-text"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-3-time" data-default="7200">-->
<!--<span data-translation="settings-ignore-button-3-time"></span>-->
<!--</label>-->
<!--</div>-->
<!--</div>-->
<!--<div class='row'>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-4-text" data-default="ignore-card-4"-->
<!--data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-4-text"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-4-time" data-default="525600">-->
<!--<span data-translation="settings-ignore-button-4-time"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="text" class='setting' required name="ignore-button-4-text" data-default="ignore-card-4"-->
<!--data-default-translateable="1">-->
<!--<span data-translation="settings-ignore-button-4-text"></span>-->
<!--</label>-->
<!--</div>-->
<!--<div class="columns small-12 smedium-6">-->
<!--<label>-->
<!--<input type="number" class='setting' required name="ignore-button-4-time" data-default="525600">-->
<!--<span data-translation="settings-ignore-button-4-time"></span>-->
<!--</label>-->
<!--</div>-->
<!--</div>-->

View File

@@ -17,7 +17,9 @@
<!-- Site Content -->
<div class='max-height fill-me'>
<div class="text-right max-width">
<button class="button show-while-playing" id='help-button' data-translation="help"></button>
<button class="button show-while-playing" id='help-button'>
<img src = "img/help.png"/>
</button>
</div>
<div class = 'height-20 no-transition tutorial-text center flex-center hidden'>
<div class = 'step-1 hidden' data-translation="tutorial-step-1"></div>

View File

@@ -0,0 +1 @@
<div></div>

View File

@@ -1,4 +1,4 @@
<div class="max-height fill-me">
<div class="max-height fill-me overflow-y-scroll">
<ul class="menu vertical plain dropdown hidden" id="settings-fragment-list"></ul>
<h2 data-translation="settings"></h2>
<div id="settings-fragments"></div>

View File

@@ -1,6 +1,10 @@
import {LocalStorageSettingsFragment, SettingsManager, SettingsSite} from "../../../../../js/lib/pwa-core";
import {Helper, InitPromise, ThemeManager, Translator} from "../../../../../js/lib/pwa-lib";
import {WordRotatorDb} from "../WordRotatorDb";
import {Matomo, SoundManager} from "../../../../../js/lib/pwa-assets";
import {CreditsSite} from "../site/CreditsSite";
import {PrivacyPolicySite} from "../site/PrivacyPolicySite";
import {ChooseThemeDialog} from "../dialog/ChooseThemeDialog";
export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
constructor(site) {
@@ -8,28 +12,42 @@ export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
}
onFirstStart() {
let themeTemplate = this.findBy("#theme-radio-template");
delete themeTemplate["id"];
let themeTemplateContainer = themeTemplate.parentNode;
themeTemplateContainer.removeAllChildren();
// let themeTemplate = this.findBy("#theme-radio-template");
// delete themeTemplate["id"];
// let themeTemplateContainer = themeTemplate.parentNode;
// themeTemplateContainer.removeAllChildren();
//
// for (let i = 0; i < ThemeManager.themes.length; i++) {
// let themeElem = Helper.cloneNode(themeTemplate);
// let theme = ThemeManager.themes[i];
// themeElem.appendChild(Translator.makePersistentTranslation(theme._name));
//
// let inputElem = themeElem.querySelector("input");
// inputElem.value = theme._className;
//
// inputElem.addEventListener("change", function() {
// if (this.checked){
// ThemeManager.changeCurrentTheme(theme)
// }
// });
// themeTemplateContainer.appendChild(themeElem);
// }
for (let i = 0; i < ThemeManager.themes.length; i++) {
let themeElem = Helper.cloneNode(themeTemplate);
let theme = ThemeManager.themes[i];
themeElem.appendChild(Translator.makePersistentTranslation(theme._name));
let currentThemeName = ThemeManager.currentTheme._name;
SettingsManager.getInstance().setSetting("theme", currentThemeName);
let inputElem = themeElem.querySelector("input");
inputElem.value = theme._className;
let themeNameElem = this.findBy("#theme-name");
themeNameElem.removeAllChildren().appendChild(Translator.makePersistentTranslation(currentThemeName));
this.findBy("#theme-chooser").addEventListener("click", async () => {
console.log("clicked");
let newTheme = (new ChooseThemeDialog()).show();
if (Helper.isNotNull(newTheme)){
SettingsManager.getInstance().setSetting("theme", newTheme);
ThemeManager.changeCurrentTheme(newTheme);
themeNameElem.removeAllChildren().appendChild(Translator.makePersistentTranslation(newTheme));
}
});
inputElem.addEventListener("change", function() {
if (this.checked){
ThemeManager.changeCurrentTheme(theme)
}
});
themeTemplateContainer.appendChild(themeElem);
}
SettingsManager.getInstance().setSetting("theme", ThemeManager.currentTheme._name);
this.findBy("#reset-levels").addEventListener("click", () => {
localStorage.removeItem("currentLevel");
@@ -39,6 +57,28 @@ export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
WordRotatorDb.getInstance().removeAll(WordRotatorDb.OBJECT_STORE.LEVEL);
});
let playMusicButton = this.findBy("#play-music");
playMusicButton.addEventListener("change", () => {
let soundManager = SoundManager.getInstance();
soundManager.set({muted: !playMusicButton.checked}, SoundManager.CHANNELS.MUSIC);
if (playMusicButton.checked){
soundManager.play(SoundManager.CHANNELS.MUSIC);
}
});
this.findBy("#track-switch").addEventListener("change", function(e) {
Matomo.setTrack(this.checked === true);
e.stopPropagation();
e.preventDefault();
});
this.findBy("#credits-button").addEventListener("click", () => {
this.getSite().startSite(CreditsSite);
});
this.findBy("#privacy-policy-button").addEventListener("click", () => {
this.getSite().startSite(PrivacyPolicySite);
});
return super.onFirstStart();
}
}

View File

@@ -0,0 +1,31 @@
import {Dialog, Helper, ThemeManager, Translator, ViewInflater} from "../../../../../js/lib/pwa-lib";
export class ChooseThemeDialog extends Dialog {
constructor() {
let viewPromise = ViewInflater.inflate("html/application/dialog/chooseTheme.html").then(view => {
let template = view.querySelector("#choose-theme-template");
template.remove();
template.id = null;
let themeTemplateContainer = template.querySelector("#theme-choose-container");
for (let i = 0; i < ThemeManager.themes.length; i++) {
let themeElem = Helper.cloneNode(template);
let theme = ThemeManager.themes[i];
themeElem.querySelector(".name").appendChild(Translator.makePersistentTranslation(theme._name));
themeElem["dataset"]["theme"] = theme._name;
themeElem.addEventListener("click", () => {
this.result = themeElem["dataset"]["theme"];
this.close()
});
themeTemplateContainer.appendChild(themeElem);
}
return view;
});
super(viewPromise, "choose-theme-dialog-title");
}
}

View File

@@ -0,0 +1,13 @@
import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
import {InitPromise} from "../../../../../js/lib/pwa-lib";
import {PrivacyPolicySite} from "./PrivacyPolicySite";
export class CreditsSite extends WordRotatorBaseSite{
constructor(siteManager) {
super(siteManager, "html/application/credits.html", "credits");
}
}
InitPromise.addPromise(app => {
app.addDeepLink("credits", PrivacyPolicySite);
});

View File

@@ -130,7 +130,7 @@ export class LevelSite extends WordRotatorBaseSite {
let levelSegment = this.findBy("#level");
levelSegment.removeAllChildren().appendChild(level.getRootSegment().getElement());
let scaleHelper = new ScaleHelper();
this.levelScaler = await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 1, level.words[0].length*1.5 , null, 0);
this.levelScaler = await scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 1, level.words[0].length * 1.5, null, 0);
this.level = level;
return this.tutorial();
@@ -234,14 +234,9 @@ export class LevelSite extends WordRotatorBaseSite {
}).then(() => {
return Promise.all([new Promise((r) => {
setTimeout(() => {
console.log("fadeIn");
r(continueButton.fadeIn().then(() => {
console.log("fade in ended!")
}));
r(continueButton.fadeIn());
}, 500)
}), audioOptions.loadedPromise.then(() => {
console.log("audio loaded")
}).catch(e => {
}), audioOptions.loadedPromise.catch(e => {
console.error(e)
})]);
});

View File

@@ -0,0 +1,12 @@
import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
import {InitPromise} from "../../../../../js/lib/pwa-lib";
export class PrivacyPolicySite extends WordRotatorBaseSite {
constructor(siteManager) {
super(siteManager, "html/application/privacyPolicy.html", "privacyPolicy");
}
}
InitPromise.addPromise(app => {
app.addDeepLink("privacyPolicy", PrivacyPolicySite);
});

View File

@@ -16,5 +16,13 @@
"tutorial-step-4": "Große Segmente drehst du, indem du diese ziehst.",
"extra-coins-after-first-level":"Für das erste Level gibt es 50 extra Münzen!",
"dark":"Dunkel"
"dark":"Dunkel",
"theme":"Theme:",
"sound":"Sound",
"music":"Musik",
"credits":"Credits",
"privacy-policy":"Datenschutzbestimmungen",
"impressum":"Impressum",
"track":"Anonymisierte Nutzungsdaten senden",
">":">"
}

View File

@@ -26,7 +26,7 @@
background-color:#{map-get($theme, themeColor)} !important;
}
}
.segment:not(.segment-row):not(.segment-triangle):not(.rotating) {
.segment:not(.segment-row):not(.segment-triangle) {
@for $i from 1 through length($rotationDegrees) {
&.rotate-#{nth($rotationDegrees, $i)} {
background-color: #{map-get($theme, background)};;
@@ -41,7 +41,7 @@
}
&.rotate-#{nth($rotationDegrees, $j)} {
background-color: #{map-get($theme, background)};;
background-color: #{map-get($theme, background)};
}
}
}
@@ -51,7 +51,6 @@
}
}
body {
@each $theme, $values in $themes {
@if (map-get($values, class) == '') {

View File

@@ -99,7 +99,6 @@ $coinTowerDimension: 28px;
//Segments
@for $i from 1 through length($rotationDegrees) {
$startDegree: ((nth($rotationDegrees, $i)+270)%360);
@@ -317,33 +316,40 @@ $coinTowerDimension: 28px;
#continue-button {
margin-bottom: 2px;
@include breakpoint(small down) {
margin-bottom: 0;
margin-bottom: 0;
padding: 0.3em .6em;
}
}
#play-button{
@include breakpoint(small down){
#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.4em 0.6em;
padding: 0.2em 0.2em;
max-width: 2em;
}
}
.line-height-1{
line-height:1;
.line-height-1 {
line-height: 1;
}
body{
body {
overscroll-behavior: contain;
}
#site-content{
#site-content {
overflow: hidden;
}
#img-sound:before{
#img-sound:before {
content: "";
max-width: 1.4em;
background: url('../img/speaker.svg')