;
}
diff --git a/src/components/Toast.jsx b/src/components/Toast.jsx
deleted file mode 100644
index 507f40d1..00000000
--- a/src/components/Toast.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-//* Imports
-import React from 'react';
-import FileCopy from '@material-ui/icons/AttachFile';
-
-export default class Toast extends React.Component {
- render() {
- return (
-
- );
- }
-}
\ No newline at end of file
diff --git a/src/components/Update.jsx b/src/components/Update.jsx
index d690c3d0..93fbb782 100644
--- a/src/components/Update.jsx
+++ b/src/components/Update.jsx
@@ -1,33 +1,33 @@
import React from 'react';
+import * as Constants from '../modules/constants';
-export default class Update extends React.Component {
+export default class Update extends React.PureComponent {
constructor(...args) {
super(...args);
this.state = {
- title: 'Loading...',
- date: '',
- content: 'Loading...'
+ title: this.props.language.title,
+ date: '21/07/2020',
+ content: this.props.language.title
};
}
async getUpdate() {
- const enabled = localStorage.getItem('offlineMode');
- if (enabled === 'true') return this.setState({
- title: 'Offline',
- content: 'Cannot get update logs while in offline mode'
+ if (localStorage.getItem('offlineMode') === 'true') return this.setState({
+ title: this.props.language.offline.title,
+ content: this.props.language.offline.description
});
- try { // First we try and get a quote from the API...
- let data = await fetch('https://api.muetab.xyz/getUpdate');
+ try { // Get update log from the API
+ let data = await fetch(Constants.API_URL + '/getUpdate');
data = await data.json();
this.setState({
title: data.title,
content: data.content
});
- } catch (e) {
+ } catch (e) { // If it fails, we send an error
this.setState({
- title: 'Error',
- content: 'Could not connect to the server!'
+ title: this.props.language.error.title,
+ content: this.props.language.error.description
});
}
}
@@ -37,10 +37,11 @@ export default class Update extends React.Component {
}
render() {
- return
-
×
-
-
+ return
;
}
}
\ No newline at end of file
diff --git a/src/components/settings/Checkbox.jsx b/src/components/settings/Checkbox.jsx
new file mode 100644
index 00000000..db9e8bf4
--- /dev/null
+++ b/src/components/settings/Checkbox.jsx
@@ -0,0 +1,13 @@
+import React from 'react';
+import * as SettingsFunctions from '../../modules/settingsFunctions';
+
+export default class Checkbox extends React.PureComponent {
+ render() {
+ return (
+
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/components/settings/Slider.jsx b/src/components/settings/Slider.jsx
new file mode 100644
index 00000000..5e9b3b7d
--- /dev/null
+++ b/src/components/settings/Slider.jsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import * as SettingsFunctions from '../../modules/settingsFunctions';
+
+export default class Slider extends React.PureComponent {
+ render() {
+ let setText = this.props.name;
+ if (this.props.override) setText = this.props.override;
+ return (
+
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
index ebc4c284..8d993b54 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,9 +1,7 @@
-//* Imports
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
-//* Render
ReactDOM.render(
,
document.getElementById('root')
diff --git a/src/modules/constants.js b/src/modules/constants.js
new file mode 100644
index 00000000..c8ad7242
--- /dev/null
+++ b/src/modules/constants.js
@@ -0,0 +1,2 @@
+export const API_URL = 'https://api.muetab.xyz';
+export const OFFLINE_IMAGES = 20;
\ No newline at end of file
diff --git a/src/modules/defaultSettings.json b/src/modules/defaultSettings.json
new file mode 100644
index 00000000..d103c2b0
--- /dev/null
+++ b/src/modules/defaultSettings.json
@@ -0,0 +1,62 @@
+[
+ {
+ "name": "time",
+ "value": true
+ },
+ {
+ "name": "greeting",
+ "value": true
+ },
+ {
+ "name": "background",
+ "value": true
+ },
+ {
+ "name": "quote",
+ "value": true
+ },
+ {
+ "name": "searchBar",
+ "value": true
+ },
+ {
+ "name": "blur",
+ "value": 0
+ },
+ {
+ "name": "events",
+ "value": true
+ },
+ {
+ "name": "customBackgroundColour",
+ "value": ""
+ },
+ {
+ "name": "customBackground",
+ "value": ""
+ },
+ {
+ "name": "greetingName",
+ "value": ""
+ },
+ {
+ "name": "defaultGreetingMessage",
+ "value": true
+ },
+ {
+ "name": "language",
+ "value": "en"
+ },
+ {
+ "name": "backgroundAPI",
+ "value": "mue"
+ },
+ {
+ "name": "ampm",
+ "value": true
+ },
+ {
+ "name": "copyButton",
+ "value": false
+ }
+]
\ No newline at end of file
diff --git a/src/modules/settingsFunctions.js b/src/modules/settingsFunctions.js
new file mode 100644
index 00000000..47fd959e
--- /dev/null
+++ b/src/modules/settingsFunctions.js
@@ -0,0 +1,60 @@
+function saveFile(data, filename = 'file') {
+ if (!data) return console.error('No data');
+ if (typeof data === 'object') data = JSON.stringify(data, undefined, 4);
+
+ const blob = new Blob([data], { type: 'text/json' });
+ let e = document.createEvent('MouseEvents');
+ let a = document.createElement('a');
+
+ a.href = window.URL.createObjectURL(blob);
+ a.download = filename;
+ a.dataset.downloadurl = ['text/json', a.download, a.href].join(':');
+
+ e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+ a.dispatchEvent(e);
+}
+
+export function exportSettings() {
+ let settings = {};
+ for (const key of Object.keys(localStorage)) settings[key] = localStorage.getItem(key);
+ saveFile(settings, 'mue-settings.json');
+}
+
+export function setItem(key, value) {
+ let old = localStorage.getItem(key);
+ let val = true;
+
+ if (old !== null && !value) {
+ if (old === 'true') val = false;
+ if (old === 'false') val = true;
+ }
+
+ localStorage.setItem(key, val);
+}
+
+export function toggleExtra(element, element2) {
+ (element.style.display === 'none' || !element.style.display) ? element.style.display = 'block' : element.style.display = 'none';
+ (element2.style.transform === 'rotate(-180deg)') ? element2.style.transform = 'rotate(0)' : element2.style.transform = 'rotate(-180deg)';
+}
+
+export function setSearchEngine(input) {
+ const searchEngineInput = document.getElementById('searchEngineInput');
+ if (input === 'custom') {
+ searchEngineInput.enabled = 'false';
+ searchEngineInput.style.display = 'block';
+ } else {
+ searchEngineInput.style.display = 'none';
+ searchEngineInput.enabled = 'true';
+ localStorage.setItem('searchEngine', input);
+ }
+}
+
+export function saveStuff() {
+ localStorage.setItem('blur', document.getElementById('blurRange').value); // this is better than inline onChange for performance
+ localStorage.setItem('greetingName', document.getElementById('greetingName').value);
+ localStorage.setItem('customBackground', document.getElementById('customBackground').value);
+ if (!document.getElementById('searchEngineInput').enabled === 'false') {
+ localStorage.setItem('customSearchEngine', document.getElementById('searchEngineInput').value);
+ }
+ window.location.reload();
+}
\ No newline at end of file
diff --git a/src/scss/index.scss b/src/scss/index.scss
index 6b516bd0..60227267 100644
--- a/src/scss/index.scss
+++ b/src/scss/index.scss
@@ -57,7 +57,48 @@ body {
transform: scale(1.1);
}
+.fade-in {
+ -webkit-animation: fadein 2s;
+ animation: fadein 2s;
+ -moz-animation: fadein 2s;
+}
+
+@-webkit-keyframes fadein {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+
+@keyframes fadein {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+
+@-moz-keyframes fadein {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+
@font-face {
font-family: 'Lexend Deca';
src: url('/./fonts/LexendDeca-Regular.woff2') format('woff2');
+}
+
+.backgroundEffects {
+ opacity: .7;
+ transition: ease 0.6s;
+}
+
+#searchEngine {
+ width: 130px;
+}
+
+.select-css {
+ background: none;
+ backdrop-filter: blur(10em);
+ height: 34px;
+ width: 100px;
+ border-image-slice: 1;
+ border-image-source: linear-gradient(180deg, #ffb032 0%, #dd3b67 100%);
+ border-left: 10px solid;
+ font-weight: 400;
}
\ No newline at end of file
diff --git a/src/scss/modules/_clock.scss b/src/scss/modules/_clock.scss
index 55066548..cb165118 100644
--- a/src/scss/modules/_clock.scss
+++ b/src/scss/modules/_clock.scss
@@ -7,4 +7,33 @@
.ampm {
font-size: 0.5em;
+}
+
+.analogclock {
+ font-size: 4em;
+ margin: 0 auto;
+ box-shadow: 0 0 25px rgba(0, 0, 0, 0.3);
+ border-radius: 100%;
+ box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.3);
+}
+
+.react-clock__face {
+ border: none;
+ outline: none;
+ border: 3px #fff solid;
+ transition: 2s;
+}
+
+.react-clock__second-hand__body {
+ background: #e84118;
+ box-shadow: 0 0 25px rgba(0, 0, 0, 0.3);
+ transition: 2s;
+}
+.react-clock__hand__body {
+ background: #fff;
+ box-shadow: 0 0 25px rgba(0, 0, 0, 0.3);
+ transition: 2s;
+}
+.react-clock__mark__body {
+ display: none;
}
\ No newline at end of file
diff --git a/src/scss/modules/_credit.scss b/src/scss/modules/_credit.scss
index c0f3e93f..51ccc400 100644
--- a/src/scss/modules/_credit.scss
+++ b/src/scss/modules/_credit.scss
@@ -26,6 +26,7 @@
position: absolute;
bottom: 2px;
left: 2px;
+ transition: all 0.5s ease 0s;
}
.credits {
@@ -33,7 +34,6 @@
left: 0px;
position: absolute;
text-align: left;
- min-width: 50px;
width: auto;
height: auto;
}
@@ -41,26 +41,27 @@
.tooltip {
position: relative;
display: inline-block;
- border-bottom: 1px dotted black;
bottom: 15px;
left: 10px;
-webkit-filter: drop-shadow(0px 3px 3px rgba(0, 0, 0, 0.4));
filter: drop-shadow(0px 3px 3px rgba(0, 0, 0, 0.4));
-
.tooltiptext {
+ width: 200px;
+ display: inline-block;
visibility: hidden;
- background-color: black;
- color: #fff;
- text-align: center;
- border-radius: 6px;
- padding: 20px;
+ border-radius: 12px;
+ background-color: #fff;
+ color: #000;
+ font-size: calc(10px + 1.2vmin);
position: absolute;
z-index: 1;
+ padding: 15px 32px;
bottom: 40px;
left: 60px;
margin-left: -60px;
opacity: 0;
transition: opacity 1s;
+ box-sizing: border-box;
}
}
diff --git a/src/scss/modules/_modal.scss b/src/scss/modules/_modal.scss
index b9d69c4e..7793d183 100644
--- a/src/scss/modules/_modal.scss
+++ b/src/scss/modules/_modal.scss
@@ -1,13 +1,15 @@
.Modal {
color: #000;
background-color: #fff;
- box-shadow: 0 0 200px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);
border: none;
opacity: 1;
z-index: -2;
- padding: 20px;
+ padding: 25px;
cursor: hand;
-
+ transition: 0.6s;
+ transition-timing-function: ease-in;
+ border-radius: 12px;
&:focus {
outline: 0;
}
@@ -16,6 +18,7 @@
.modalLink {
color: #5352ed;
cursor: pointer;
+
&:hover {
opacity: 0.8;
}
@@ -25,6 +28,7 @@
float: right;
font-size: 2em;
cursor: pointer;
+
&:hover {
color: grey;
}
@@ -37,9 +41,40 @@
.ReactModal__Html--open,
.ReactModal__Body--open {
- overflow: hidden; /* prevents background page from scrolling when the modal is open */
+ overflow: hidden;
+ /* prevents background page from scrolling when the modal is open */
}
+@-webkit-keyframes zoom-in {
+ 0% {
+ transform: scale(0);
+ }
+
+ 50% {
+ transform: scale(1.05, 1.05);
+ }
+
+ 100% {
+ transform: scale(1, 1);
+ }
+}
+
+@keyframes zoom-in {
+ 0% {
+ -webkit-transform: scale(0);
+ }
+
+ 50% {
+ -webkit-transform: scale(1.05, 1.05);
+ }
+
+ 100% {
+ -webkit-transform: scale(1, 1);
+ }
+}
+
+
+
.Overlay {
position: fixed;
z-index: 999999;
@@ -55,6 +90,11 @@
margin-top: 20px;
}
+.modal-animation {
+ -webkit-animation: zoom-in 0.6s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+ animation: zoom-in 0.6s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+}
+
.ReactModal__Content {
width: 500px;
max-width: 600px;
@@ -63,3 +103,50 @@
overflow-y: auto;
position: relative;
}
+
+.content {
+ margin-top: -20px;
+ h1 {
+ font-size: 35px;
+ }
+ p {
+ margin-top: -20px;
+ font-size: 16px;
+ }
+ .columns {
+ font-size: 15px;
+ }
+}
+
+.zoom-out {
+ -webkit-animation: zoom-out 0.6s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+ animation: zoom-out 0.6s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+}
+
+@-webkit-keyframes zoom-out {
+ 0% {
+ transform: scale(1, 1);
+ }
+
+ 50% {
+ transform: scale(1.05, 1.05);
+ }
+
+ 100% {
+ transform: scale(0);
+ }
+}
+
+@keyframes zoom-out {
+ 0% {
+ -webkit-transform: scale(1, 1);
+ }
+
+ 50% {
+ -webkit-transform: scale(1.05, 1.05);
+ }
+
+ 100% {
+ -webkit-transform: scale(0);
+ }
+}
\ No newline at end of file
diff --git a/src/scss/modules/_navbar.scss b/src/scss/modules/_navbar.scss
index 074a7893..1e936d98 100644
--- a/src/scss/modules/_navbar.scss
+++ b/src/scss/modules/_navbar.scss
@@ -5,22 +5,35 @@
cursor: pointer;
-webkit-filter: drop-shadow(0 0 6px rgba(0,0,0,.3));
filter: drop-shadow(0 0 6px rgba(0,0,0,.3));
+ top: 50px;
+ svg {
+ transition: ease 0.2s;
+ }
+ &:hover {
+ svg {
+ transform: scale(1.1);
+ color: #fff;
+ }
+ }
}
.navbar1 {
@extend %navbar;
- top: 50px;
right: 0px;
+ svg {
+ -webkit-backface-visibility: hidden;
+ -webkit-transform: translateZ(0) scale(1.0, 1.0);
+ backface-visibility: hidden;
+ transform: translateZ(0) scale(1.0, 1.0);
+ }
}
.navbar2 {
@extend %navbar;
- top: 50px;
right: 50px;
}
.navbar3 {
@extend %navbar;
- top: 50px;
right: 100px;
}
\ No newline at end of file
diff --git a/src/scss/modules/_quote.scss b/src/scss/modules/_quote.scss
index 56bb8b8f..69664438 100644
--- a/src/scss/modules/_quote.scss
+++ b/src/scss/modules/_quote.scss
@@ -30,7 +30,7 @@
float: middle;
margin: 0 auto;
text-align: right;
- transform: rotate(45deg);
+ // transform: rotate(45deg);
}
i.material-icons,
diff --git a/src/scss/modules/_search.scss b/src/scss/modules/_search.scss
index f1652915..e653b8bf 100644
--- a/src/scss/modules/_search.scss
+++ b/src/scss/modules/_search.scss
@@ -1,30 +1,30 @@
.searchbar {
- position: absolute;
- left: 20px;
- top: 20px;
- display: flex;
- flex-direction: row;
- display: block;
- color: #ffff;
- font-family: 'Lexend Deca', sans-serif;;
+ position: absolute;
+ left: 20px;
+ top: 20px;
+ display: flex;
+ flex-direction: row;
+ display: block;
+ color: #ffff;
+ font-family: 'Lexend Deca', sans-serif;;
- input[type=text] {
- font-size: calc(5px + 1.2vmin);
- background: transparent;
- border: 2px solid #ffff;
- padding: 10px;
- color: #ffff;
- position: absolute;
- box-shadow: 0 0 25px rgba(0, 0, 0, 0.3);
- }
+ input[type=text] {
+ font-size: calc(5px + 1.2vmin);
+ background: transparent;
+ border: 2px solid #ffff;
+ padding: 10px;
+ color: #ffff;
+ position: absolute;
+ box-shadow: 0 0 25px rgba(0, 0, 0, 0.3);
+ }
}
.input.searchtext {
- border: none;
+ border: none;
}
.searchbarform {
- display: flex;
- flex-direction: row;
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, .25);
+ display: flex;
+ flex-direction: row;
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, .25);
}
\ No newline at end of file
diff --git a/src/scss/modules/_settings.scss b/src/scss/modules/_settings.scss
index 3f59edc3..0cea8f3a 100644
--- a/src/scss/modules/_settings.scss
+++ b/src/scss/modules/_settings.scss
@@ -14,6 +14,10 @@ $gradient: linear-gradient(90deg, #ffb032 0%, #dd3b67 100%);
}
}
+.hidden {
+ display: none;
+}
+
.slider {
position: absolute;
cursor: pointer;
@@ -32,8 +36,8 @@ $gradient: linear-gradient(90deg, #ffb032 0%, #dd3b67 100%);
left: 4px;
bottom: 4px;
background-color: white;
- -webkit-transition: .4s;
- transition: .4s;
+ -webkit-transition: 0.4s;
+ transition: 0.4s;
border-radius: 50%;
}
@@ -56,7 +60,7 @@ input {
&:checked + .slider {
background: $gradient;
-
+
&:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
@@ -71,7 +75,12 @@ input {
::-webkit-scrollbar {
width: 5px;
- background: #555;
+ background: #bdc3c7;
+ height: auto;
+}
+
+::-webkit-scrollbar-thumb {
+ background: #34495e;
}
h4, .switch, .expandIcons {
@@ -89,8 +98,6 @@ h4, #engines {
}
%settingsButton {
- height: 45px;
- width: 130px;
text-align: center;
border: none;
transition: 0.25s;
@@ -98,12 +105,15 @@ h4, #engines {
cursor: pointer;
display: inline-block;
box-shadow: 20px #000;
- font-size: 1.3em;
position: relative;
+ padding: 15px;
+ width: 120px;
+ font-size: 1.1em;
font-family: 'Lexend Deca', sans-serif;
&:hover {
- transform: translateX(-0.10em);
+ transform: translateY(-0.10em);
+ outline: none;
}
&:before {
@@ -135,10 +145,43 @@ h4, #engines {
}
}
+.import {
+ float: right;
+ @extend %settingsButton;
+ background-color: #dd3b67;
+ margin-right: 5px;
+
+ &:before {
+ background: $gradient;
+ }
+}
+
+.export {
+ float: right;
+ @extend %settingsButton;
+ background-color: #dd3b67;
+
+ &:before {
+ background: $gradient;
+ }
+}
+
+.uploadbg {
+ @extend %settingsButton;
+ background-color: #dd3b67;
+ width: auto;
+ height: auto;
+ padding: 5px 18px;
+
+ &:before {
+ background: $gradient;
+ }
+}
+
.reset {
@extend %settingsButton;
background-color: #ffb032;
- margin-left: 20px;
+ margin-left: 5px;
&:before {
background: linear-gradient(90deg, #dd3b67 0%, #ffb032 100%);
}
@@ -150,7 +193,6 @@ h4, #engines {
vertical-align: middle;
display: inline-flex;
cursor: pointer;
- transition-duration: 0.5s;
}
.extraSettings {
@@ -199,7 +241,7 @@ li {
background: $gradient;
cursor: pointer;
}
-
+
&::-moz-range-thumb {
width: 25px;
height: 25px;
@@ -220,7 +262,7 @@ input[type=color] {
vertical-align: middle;
&::-webkit-color-swatch-wrapper {
- padding: 0;
+ padding: 0;
}
&::-webkit-color-swatch {
@@ -231,4 +273,22 @@ input[type=color] {
input[type=checkbox] {
vertical-align: middle;
+}
+
+#customBackgroundHex {
+ font-size: 1.2em;
+ padding-left: 7px;
+}
+
+select#language {
+ float: right;
+ background: none;
+ backdrop-filter: blur(10em);
+ height: 34px;
+ width: 100px;
+ border-image-slice: 1;
+ border-image-source: linear-gradient(180deg, #ffb032 0%, #dd3b67 100%);
+ border-left: 10px solid;
+ font-weight: 400;
+ font-family: 'Lexend Deca', sans-serif;
}
\ No newline at end of file
diff --git a/src/scss/modules/_toast.scss b/src/scss/modules/_toast.scss
index 9b654063..9fe4bf61 100644
--- a/src/scss/modules/_toast.scss
+++ b/src/scss/modules/_toast.scss
@@ -1,96 +1,29 @@
-#toast {
- visibility: hidden;
- text-align: center;
- position: fixed;
- z-index: 2;
- bottom: 30px;
- padding: 10px;
- box-shadow: 0 0 1rem 0 rgba(0, 0, 0, .2);
- // backdrop-filter: blur(20px); stupid firefox :(
- border-radius: 10px;
- background: #fff;
- color: #000;
- text-align: left;
- font-size: 16px;
- width: auto;
- bottom: 30px;
- right: 30px;
-
- &.show {
- visibility: visible;
- -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s;
- animation: fadein 0.5s, fadeout 0.5s 2.5s;
- }
-
- > img {
- height: 20px;
- width: auto;
- float: left;
- }
-
- > hr {
- margin-left: 10px;
- margin-right: 10px;
- }
+.Toastify__toast-body {
+ font-family: 'Lexend Deca', sans-serif !important;
+ color: #000 !important;
+ font-size: 16px !important;
+ padding: 15px 20px !important;
}
-.copyButton, hr {
- display: inline;
- vertical-align: middle;
+.Toastify__toast {
+ border-radius: 12px !important;
+ min-height: auto !important;
+ height: auto !important;
+ width: auto !important;
+ min-width: auto !important;
+ padding: 0px !important;
}
-hr {
- height: 20px;
- width: 1px;
- margin: 0;
- margin-left: 10px;
+.Toastify__close-button {
+ margin-top: 10px;
margin-right: 10px;
}
-@-webkit-keyframes fadein {
- from {
- bottom: 0;
- opacity: 0;
- }
-
- to {
- bottom: 30px;
- opacity: 1;
- }
+.Toastify__progress-bar--default {
+ height: 3px !important;
+ background: #000 !important;
}
-@keyframes fadein {
- from {
- bottom: 0;
- opacity: 0;
- }
-
- to {
- bottom: 30px;
- opacity: 1;
- }
+.Toastify__toast-container {
+ width: auto !important;
}
-
-@-webkit-keyframes fadeout {
- from {
- bottom: 30px;
- opacity: 1;
- }
-
- to {
- bottom: 0;
- opacity: 0;
- }
-}
-
-@keyframes fadeout {
- from {
- bottom: 30px;
- opacity: 1;
- }
-
- to {
- bottom: 0;
- opacity: 0;
- }
-}
\ No newline at end of file
diff --git a/src/translations/en.json b/src/translations/en.json
new file mode 100644
index 00000000..fb63f262
--- /dev/null
+++ b/src/translations/en.json
@@ -0,0 +1,74 @@
+{
+ "greeting": {
+ "morning": "Good Morning",
+ "afternoon": "Good Afternoon",
+ "evening": "Good Evening",
+ "christmas": "Merry Christmas",
+ "newyear": "Happy new year",
+ "halloween": "Happy Halloween"
+ },
+ "credit": "Photo by",
+ "search": "Search",
+ "settings": {
+ "title": "Settings",
+ "description": "Edit different components to make Mue your new tab.",
+ "time": {
+ "title": "Time",
+ "seconds": "Seconds",
+ "twentyfourhour": "24 Hour",
+ "ampm": "AM/PM (12 hour)",
+ "zero": "Extra Zero",
+ "analog": "Analog"
+ },
+ "greeting": {
+ "title": "Greeting",
+ "events": "Events",
+ "default": "Default Greeting Message",
+ "name": "Name for greeting"
+ },
+ "quote": {
+ "title": "Quote",
+ "copy": "Copy Button"
+ },
+ "background": {
+ "title": "Background",
+ "API": "Background API",
+ "blur": "Adjust Blur",
+ "customURL": "Custom Background URL",
+ "custombackground": "Custom Background",
+ "customcolour": "Custom Background Colour"
+ },
+ "searchbar": {
+ "title": "Search Bar",
+ "searchengine": "Search Engine"
+ },
+ "offline": "Offline Mode",
+ "experimental": {
+ "title": "Experimental",
+ "webp": "Enable WebP",
+ "dark": "Dark Theme",
+ "animations": "Animations"
+ },
+ "language": "Language",
+ "apply": "Apply",
+ "reset": "Reset",
+ "import": "Import",
+ "export": "Export"
+ },
+ "update": {
+ "title": "Update",
+ "offline": {
+ "title": "Offline",
+ "description": "Cannot get update logs while in offline mode"
+ },
+ "error": {
+ "title": "Error",
+ "content": "Could not connect to the server"
+ },
+ "loading": "Loading..."
+ },
+ "toasts": {
+ "quote": "Quote Copied!",
+ "reset": "Reset successfully!"
+ }
+}
\ No newline at end of file
diff --git a/src/translations/fr.json b/src/translations/fr.json
new file mode 100644
index 00000000..fb63f262
--- /dev/null
+++ b/src/translations/fr.json
@@ -0,0 +1,74 @@
+{
+ "greeting": {
+ "morning": "Good Morning",
+ "afternoon": "Good Afternoon",
+ "evening": "Good Evening",
+ "christmas": "Merry Christmas",
+ "newyear": "Happy new year",
+ "halloween": "Happy Halloween"
+ },
+ "credit": "Photo by",
+ "search": "Search",
+ "settings": {
+ "title": "Settings",
+ "description": "Edit different components to make Mue your new tab.",
+ "time": {
+ "title": "Time",
+ "seconds": "Seconds",
+ "twentyfourhour": "24 Hour",
+ "ampm": "AM/PM (12 hour)",
+ "zero": "Extra Zero",
+ "analog": "Analog"
+ },
+ "greeting": {
+ "title": "Greeting",
+ "events": "Events",
+ "default": "Default Greeting Message",
+ "name": "Name for greeting"
+ },
+ "quote": {
+ "title": "Quote",
+ "copy": "Copy Button"
+ },
+ "background": {
+ "title": "Background",
+ "API": "Background API",
+ "blur": "Adjust Blur",
+ "customURL": "Custom Background URL",
+ "custombackground": "Custom Background",
+ "customcolour": "Custom Background Colour"
+ },
+ "searchbar": {
+ "title": "Search Bar",
+ "searchengine": "Search Engine"
+ },
+ "offline": "Offline Mode",
+ "experimental": {
+ "title": "Experimental",
+ "webp": "Enable WebP",
+ "dark": "Dark Theme",
+ "animations": "Animations"
+ },
+ "language": "Language",
+ "apply": "Apply",
+ "reset": "Reset",
+ "import": "Import",
+ "export": "Export"
+ },
+ "update": {
+ "title": "Update",
+ "offline": {
+ "title": "Offline",
+ "description": "Cannot get update logs while in offline mode"
+ },
+ "error": {
+ "title": "Error",
+ "content": "Could not connect to the server"
+ },
+ "loading": "Loading..."
+ },
+ "toasts": {
+ "quote": "Quote Copied!",
+ "reset": "Reset successfully!"
+ }
+}
\ No newline at end of file
diff --git a/src/translations/nl.json b/src/translations/nl.json
new file mode 100644
index 00000000..fb63f262
--- /dev/null
+++ b/src/translations/nl.json
@@ -0,0 +1,74 @@
+{
+ "greeting": {
+ "morning": "Good Morning",
+ "afternoon": "Good Afternoon",
+ "evening": "Good Evening",
+ "christmas": "Merry Christmas",
+ "newyear": "Happy new year",
+ "halloween": "Happy Halloween"
+ },
+ "credit": "Photo by",
+ "search": "Search",
+ "settings": {
+ "title": "Settings",
+ "description": "Edit different components to make Mue your new tab.",
+ "time": {
+ "title": "Time",
+ "seconds": "Seconds",
+ "twentyfourhour": "24 Hour",
+ "ampm": "AM/PM (12 hour)",
+ "zero": "Extra Zero",
+ "analog": "Analog"
+ },
+ "greeting": {
+ "title": "Greeting",
+ "events": "Events",
+ "default": "Default Greeting Message",
+ "name": "Name for greeting"
+ },
+ "quote": {
+ "title": "Quote",
+ "copy": "Copy Button"
+ },
+ "background": {
+ "title": "Background",
+ "API": "Background API",
+ "blur": "Adjust Blur",
+ "customURL": "Custom Background URL",
+ "custombackground": "Custom Background",
+ "customcolour": "Custom Background Colour"
+ },
+ "searchbar": {
+ "title": "Search Bar",
+ "searchengine": "Search Engine"
+ },
+ "offline": "Offline Mode",
+ "experimental": {
+ "title": "Experimental",
+ "webp": "Enable WebP",
+ "dark": "Dark Theme",
+ "animations": "Animations"
+ },
+ "language": "Language",
+ "apply": "Apply",
+ "reset": "Reset",
+ "import": "Import",
+ "export": "Export"
+ },
+ "update": {
+ "title": "Update",
+ "offline": {
+ "title": "Offline",
+ "description": "Cannot get update logs while in offline mode"
+ },
+ "error": {
+ "title": "Error",
+ "content": "Could not connect to the server"
+ },
+ "loading": "Loading..."
+ },
+ "toasts": {
+ "quote": "Quote Copied!",
+ "reset": "Reset successfully!"
+ }
+}
\ No newline at end of file