style: Unified spacing to 2 and add editor config

This commit is contained in:
Wessel Tip 2021-03-17 14:01:53 +01:00
parent aec47d9d0b
commit 9981a28638
No known key found for this signature in database
GPG Key ID: 0E8A5B00A5E63132
98 changed files with 2931 additions and 2902 deletions

View File

@ -3,4 +3,4 @@
"plugins": ["@babel/plugin-proposal-class-properties", ["@babel/transform-runtime", {
"regenerator": true
}]]
}
}

8
.editorconfig Normal file
View File

@ -0,0 +1,8 @@
root = true
[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

2
.env
View File

@ -1,3 +1,3 @@
GENERATE_SOURCEMAP=false
INLINE_RUNTIME_CHUNK=false
SKIP_PREFLIGHT_CHECK=true
SKIP_PREFLIGHT_CHECK=true

2
.gitignore vendored
View File

@ -7,4 +7,4 @@ build/
package-lock.json
yarn-error.log
.eslintcache
yarn.lock
yarn.lock

View File

@ -11,7 +11,7 @@ A bug fix? See if it has fixed the issue fully on both Chromium and Firefox. For
implemented.
### Translations
Please don't use Google Translate. When submitting new translations, we'd prefer it if you waited until it's finished before pull requesting or if you opened it as a draft.
Please don't use Google Translate. When submitting new translations, we'd prefer it if you waited until it's finished before pull requesting or if you opened it as a draft.
All translation work should be done by copying the ``en-GB.json`` file to a file with your language code as the name, e.g ``fr.json``.
## Development
@ -34,4 +34,4 @@ Inspired features are fine.
See the note in general.
## Final Note
Contact us before doing anything if you don't want to have to change 1000 things and/or have your pull request closed.
Contact us before doing anything if you don't want to have to change 1000 things and/or have your pull request closed.

View File

@ -150,4 +150,4 @@ Please see our [roadmap](https://github.com/mue/mue/projects)
Many thanks to [Highholding](https://discord.bio/p/highholding), [Noa Shapira](#), [Roee Lupo](https://github.com/RoeeLupo), [Jeroen](#), [Glasvegas](https://twitter.com/_glasvegas), [Anders](https://github.com/FuryingFox), [Oded Shapira](https://twitter.com/dondishdev), Jacob Tyrrell and [Nikka Lai](#) for letting us use their wonderful photographs.
And finally, a big thank you to all the [contributors](https://github.com/mue/mue/graphs/contributors)!
And finally, a big thank you to all the [contributors](https://github.com/mue/mue/graphs/contributors)!

View File

@ -3,4 +3,4 @@ module.exports = {
plugins: ['@babel/plugin-proposal-class-properties', ['@babel/transform-runtime', {
'regenerator': true
}]]
}
}

View File

@ -1,14 +1,14 @@
/* eslint-disable no-undef */
// Original code sourced from https://forums.opera.com/topic/25046/how-to-disable-completely-the-speed-dial/14
//Source https://forums.opera.com/topic/25046/how-to-disable-completely-the-speed-dial/14
chrome.tabs.onCreated.addListener((tab) => {
if (tab.status === 'complete' && tab.url === 'chrome://startpage/') chrome.tabs.update(tab.id, {
url: chrome.extension.getURL('index.html')
});
if (tab.status === 'complete' && tab.url === 'chrome://startpage/') chrome.tabs.update(tab.id, {
url: chrome.extension.getURL('index.html')
});
});
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
if (changeInfo.status === 'complete' && tab.url === 'chrome://startpage/') chrome.tabs.update(tabId, {
url: chrome.extension.getURL('index.html')
});
});
if (changeInfo.status === 'complete' && tab.url === 'chrome://startpage/') chrome.tabs.update(tabId, {
url: chrome.extension.getURL('index.html')
});
});

View File

@ -1,18 +1,18 @@
{
"manifest_version": 2,
"offline_enabled": true,
"name": "Mue",
"description": "Fast, open and free-to-use new tab page for most modern browsers.",
"version": "5.0.0",
"browser_action": {
"default_icon": "icons/128x128.png"
},
"chrome_url_overrides": {
"newtab": "index.html"
},
"icons": {
"16": "icons/16x16.png",
"48": "icons/48x48.png",
"128": "icons/128x128.png"
}
}
"manifest_version": 2,
"offline_enabled": true,
"name": "Mue",
"description": "Fast, open and free-to-use new tab page for most modern browsers.",
"version": "5.0.0",
"browser_action": {
"default_icon": "icons/128x128.png"
},
"chrome_url_overrides": {
"newtab": "index.html"
},
"icons": {
"16": "icons/16x16.png",
"48": "icons/48x48.png",
"128": "icons/128x128.png"
}
}

View File

@ -1,15 +1,15 @@
{
"manifest_version": 2,
"name": "Mue",
"description": "Fast, open and free-to-use new tab page for most modern browsers.",
"version": "5.0.0",
"browser_action": {
"default_icon": "icons/128x128.png"
},
"chrome_url_overrides": {
"newtab": "index.html"
},
"chrome_settings_overrides": {
"homepage": "index.html"
}
"manifest_version": 2,
"name": "Mue",
"description": "Fast, open and free-to-use new tab page for most modern browsers.",
"version": "5.0.0",
"browser_action": {
"default_icon": "icons/128x128.png"
},
"chrome_url_overrides": {
"newtab": "index.html"
},
"chrome_settings_overrides": {
"homepage": "index.html"
}
}

View File

@ -1,17 +1,17 @@
{
"manifest_version": 2,
"name": "Mue",
"description": "Fast, open and free-to-use new tab page for most modern browsers.",
"version": "5.0.0",
"browser_action": {
"default_icon": "icons/128x128.png"
},
"background": {
"scripts": [
"./background-opera.js"
]
},
"permissions": [
"tabs"
"manifest_version": 2,
"name": "Mue",
"description": "Fast, open and free-to-use new tab page for most modern browsers.",
"version": "5.0.0",
"browser_action": {
"default_icon": "icons/128x128.png"
},
"background": {
"scripts": [
"./background-opera.js"
]
}
},
"permissions": [
"tabs"
]
}

View File

@ -35,5 +35,4 @@
</noscript>
<div id='root'></div>
</body>
</html>
</html>

View File

@ -32,15 +32,15 @@ export default class App extends React.PureComponent {
if (!localStorage.getItem('firstRun')) {
SettingsFunctions.setDefaultSettings();
}
if (localStorage.getItem('showWelcome') === 'true') {
this.setState({
welcomeModal: true
this.setState({
welcomeModal: true
});
}
SettingsFunctions.loadSettings();
// These lines of code prevent double clicking the page or pressing CTRL + A from highlighting the page
document.addEventListener('mousedown', (event) => {
if (event.detail > 1) {
@ -49,23 +49,23 @@ export default class App extends React.PureComponent {
}, false);
document.onkeydown = (e) => {
e = e || window.event;
e = e || window.event;
if (!e.ctrlKey) return;
let code = e.which || e.keyCode;
switch (code) {
case 65:
e.preventDefault();
e.stopPropagation();
break;
case 65:
e.preventDefault();
e.stopPropagation();
break;
}
};
}
closeWelcome() {
localStorage.setItem('showWelcome', false);
this.setState({
welcomeModal: false
this.setState({
welcomeModal: false
});
}
@ -78,7 +78,7 @@ export default class App extends React.PureComponent {
modalClassList += ' dark';
tooltipClassList += ' dark';
}
const overlayClassList = (localStorage.getItem('animations') === 'true') ? 'Overlay modal-animation' : 'Overlay';
/// language

View File

@ -1,29 +1,29 @@
import React from 'react';
export default class ErrorBoundary extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
error: false
};
constructor(props) {
super(props);
this.state = {
error: false
};
}
static getDerivedStateFromError(error) {
console.log(error);
return { error: true };
}
render() {
if (this.state.error) {
return (
<div style={{'text-align': 'center'}}>
<h1>Error</h1>
<p>Failed to load this component of Mue.</p>
<button class='refresh' onClick={() => window.location.reload()}>Refresh</button>
</div>
)
}
static getDerivedStateFromError(error) {
console.log(error);
return { error: true };
}
render() {
if (this.state.error) {
return (
<div style={{'text-align': 'center'}}>
<h1>Error</h1>
<p>Failed to load this component of Mue.</p>
<button class='refresh' onClick={() => window.location.reload()}>Refresh</button>
</div>
)
}
return this.props.children;
}
}
return this.props.children;
}
}

View File

@ -1,23 +1,23 @@
import React from 'react';
export default function FeedbackModal(props) {
return (
<div className='feedback'>
<h1>{props.language.modals.feedback.title}</h1>
<span className='closeModal' onClick={props.modalClose}>&times;</span>
<label>{props.language.modals.feedback.question_one}</label>
<br/><br/>
<label className='values'>0</label><input className='range' type='range' min='0' max='100' /><label className='values'>10</label>
<br/><br/>
<label>{props.language.modals.feedback.question_two}</label>
<br/><br/>
<input type='text'/>
<br/><br/>
<label>{props.language.modals.feedback.question_three}</label>
<br/><br/>
<label className='values'>0</label><input className='range' type='range' min='0' max='100' /><label className='values'>10</label>
<br/><br/><br/>
<button>{props.language.modals.feedback.submit}</button>
</div>
);
}
return (
<div className='feedback'>
<h1>{props.language.modals.feedback.title}</h1>
<span className='closeModal' onClick={props.modalClose}>&times;</span>
<label>{props.language.modals.feedback.question_one}</label>
<br/><br/>
<label className='values'>0</label><input className='range' type='range' min='0' max='100' /><label className='values'>10</label>
<br/><br/>
<label>{props.language.modals.feedback.question_two}</label>
<br/><br/>
<input type='text'/>
<br/><br/>
<label>{props.language.modals.feedback.question_three}</label>
<br/><br/>
<label className='values'>0</label><input className='range' type='range' min='0' max='100' /><label className='values'>10</label>
<br/><br/><br/>
<button>{props.language.modals.feedback.submit}</button>
</div>
);
}

View File

@ -26,4 +26,4 @@ export default function MainModal(props) {
</div>
</div>
);
}
}

View File

@ -16,7 +16,7 @@ export default class Update extends React.PureComponent {
async getUpdate() {
const data = await (await fetch(Constants.API_URL + '/getUpdate')).json();
if (data.statusCode === 500 || data.title === null) {
const supportText = `<br/><p>${this.props.language.contact_support}: <a target='_blank' class='modalLink' href='https://muetab.com/contact'>https://muetab.com/contact</a></p>`;
return this.setState({
@ -47,11 +47,11 @@ export default class Update extends React.PureComponent {
render() {
return <div className='updateContent'>
<span className='closeModal' onClick={this.props.modalClose}>&times;</span>
<h1 style={{ 'marginBottom': '-10px' }}>{this.state.title}</h1>
<h5 style={{ 'lineHeight': '0px' }}>{this.state.date}</h5>
{this.state.image ? <img draggable='false' src={this.state.image} alt='Update'></img> : null}
<p dangerouslySetInnerHTML={{ __html: this.state.html }}></p>
<span className='closeModal' onClick={this.props.modalClose}>&times;</span>
<h1 style={{ 'marginBottom': '-10px' }}>{this.state.title}</h1>
<h5 style={{ 'lineHeight': '0px' }}>{this.state.date}</h5>
{this.state.image ? <img draggable='false' src={this.state.image} alt='Update'></img> : null}
<p dangerouslySetInnerHTML={{ __html: this.state.html }}></p>
</div>;
}
}
}
}

View File

@ -7,20 +7,20 @@ import ForumIcon from '@material-ui/icons/Forum';
export default function WelcomeModal(props) {
return (
<div className='welcomeContent'>
<span className='closeModal' onClick={props.modalClose}>&times;</span>
<div className='welcomeModalText'>
<h2 className='subtitle'>{props.language.title}</h2>
<h1 className='welcometitle'>Mue Tab</h1>
<img alt='celebration' style={{ 'height': '200px', 'width': 'auto' }} draggable={false} src='./././icons/undraw_celebration.svg' />
<h2 className='subtitle'>{props.language.information}</h2>
<p>{props.language.thankyoumessage1},<br/> {props.language.thankyoumessage2}</p>
<h2 className='subtitle'>{props.language.support}</h2>
<a href='mailto:hello@muetab.com' className='welcomeLink' target='_blank' rel='noopener noreferrer'><EmailIcon/></a>
<a href='https://twitter.com/getmue' className='welcomeLink' target='_blank' rel='noopener noreferrer'><TwitterIcon/></a>
<a href='https://discord.gg/zv8C9F8' className='welcomeLink' target='_blank' rel='noopener noreferrer'><ForumIcon/></a>
<br/>
<button className='close' onClick={props.modalClose}>{props.language.close}</button>
</div>
</div>
<span className='closeModal' onClick={props.modalClose}>&times;</span>
<div className='welcomeModalText'>
<h2 className='subtitle'>{props.language.title}</h2>
<h1 className='welcometitle'>Mue Tab</h1>
<img alt='celebration' style={{ 'height': '200px', 'width': 'auto' }} draggable={false} src='./././icons/undraw_celebration.svg' />
<h2 className='subtitle'>{props.language.information}</h2>
<p>{props.language.thankyoumessage1},<br/> {props.language.thankyoumessage2}</p>
<h2 className='subtitle'>{props.language.support}</h2>
<a href='mailto:hello@muetab.com' className='welcomeLink' target='_blank' rel='noopener noreferrer'><EmailIcon/></a>
<a href='https://twitter.com/getmue' className='welcomeLink' target='_blank' rel='noopener noreferrer'><TwitterIcon/></a>
<a href='https://discord.gg/zv8C9F8' className='welcomeLink' target='_blank' rel='noopener noreferrer'><ForumIcon/></a>
<br/>
<button className='close' onClick={props.modalClose}>{props.language.close}</button>
</div>
</div>
);
}
}

View File

@ -3,62 +3,62 @@ import React from 'react';
import ArrowBackIcon from '@material-ui/icons/ArrowBack';
export default function Item(props) {
let warningHTML;
try { // For some reason it breaks sometimes so we use try/catch
if (props.content.content.data.quote_api) {
warningHTML = (
<div className='productInformation'>
<ul>
<li className='header'>{this.props.language.quote_warning.title}</li>
<li id='updated'>{this.props.language.quote_warning.description}</li>
</ul>
</div>
);
}
} catch (e) {
// ignore
}
let iconsrc = 'https://external-content.duckduckgo.com/iu/?u=' + props.data.icon; // prevent console error
if (!props.data.icon) {
iconsrc = null;
}
return (
<div id='item'>
<br/>
<ArrowBackIcon className='backArrow' onClick={props.function} />
<br/>
<h1>{props.data.name}</h1>
{props.button}
<br/><br/>
<img alt='product' draggable={false} src={iconsrc} />
<div className='informationContainer'>
<div className='productInformation'>
<h4>{props.language.information}</h4>
<ul>
<br/>
<li className='header'>{props.language.last_updated}</li>
<li>{props.data.updated}</li>
<br/>
<li className='header'>{props.language.version}</li>
<li>{props.data.version}</li>
<br/>
<li className='header'>{props.language.author}</li>
<li>{props.data.author}</li>
</ul>
</div>
<div className='productInformation'>
<ul>
<li className='header'>{props.language.notice.title}</li>
<li id='updated'>{props.language.notice.description}</li>
</ul>
</div>
{warningHTML}
let warningHTML;
try { // For some reason it breaks sometimes so we use try/catch
if (props.content.content.data.quote_api) {
warningHTML = (
<div className='productInformation'>
<ul>
<li className='header'>{this.props.language.quote_warning.title}</li>
<li id='updated'>{this.props.language.quote_warning.description}</li>
</ul>
</div>
<br/>
<h1>{props.language.overview}</h1>
<p className='description' dangerouslySetInnerHTML={{__html: props.data.description}}></p>
);
}
} catch (e) {
// ignore
}
let iconsrc = 'https://external-content.duckduckgo.com/iu/?u=' + props.data.icon; // prevent console error
if (!props.data.icon) {
iconsrc = null;
}
return (
<div id='item'>
<br/>
<ArrowBackIcon className='backArrow' onClick={props.function} />
<br/>
<h1>{props.data.name}</h1>
{props.button}
<br/><br/>
<img alt='product' draggable={false} src={iconsrc} />
<div className='informationContainer'>
<div className='productInformation'>
<h4>{props.language.information}</h4>
<ul>
<br/>
<li className='header'>{props.language.last_updated}</li>
<li>{props.data.updated}</li>
<br/>
<li className='header'>{props.language.version}</li>
<li>{props.data.version}</li>
<br/>
<li className='header'>{props.language.author}</li>
<li>{props.data.author}</li>
</ul>
</div>
<div className='productInformation'>
<ul>
<li className='header'>{props.language.notice.title}</li>
<li id='updated'>{props.language.notice.description}</li>
</ul>
</div>
{warningHTML}
</div>
);
}
<br/>
<h1>{props.language.overview}</h1>
<p className='description' dangerouslySetInnerHTML={{__html: props.data.description}}></p>
</div>
);
}

View File

@ -1,20 +1,20 @@
import React from 'react';
export default function Items(props) {
if (props.items.length === 0) {
return null; // todo: add message here
}
if (props.items.length === 0) {
return null; // todo: add message here
}
return (
<div className='items'>
{props.items.map((item) =>
<div className='item' onClick={() => props.toggleFunction(item.name)} key={item.name}>
<img alt='icon' draggable={false} src={'https://external-content.duckduckgo.com/iu/?u=' + item.icon_url} />
<div className='details'>
<h4>{item.display_name ? item.display_name : item.name}</h4>
<p>{item.author}</p>
</div>
</div>)}
return (
<div className='items'>
{props.items.map((item) =>
<div className='item' onClick={() => props.toggleFunction(item.name)} key={item.name}>
<img alt='icon' draggable={false} src={'https://external-content.duckduckgo.com/iu/?u=' + item.icon_url} />
<div className='details'>
<h4>{item.display_name ? item.display_name : item.name}</h4>
<p>{item.author}</p>
</div>
);
}
</div>)}
</div>
);
}

View File

@ -11,82 +11,82 @@ export default class Added extends React.PureComponent {
constructor(...args) {
super(...args);
this.state = {
installed: JSON.parse(localStorage.getItem('installed')),
current_data: {
type: '',
name: '',
content: {}
},
item_data: {
name: 'Name',
author: 'Author',
description: 'Description',
updated: '???',
version: '1.0.0',
icon: ''
},
button: ''
installed: JSON.parse(localStorage.getItem('installed')),
current_data: {
type: '',
name: '',
content: {}
},
item_data: {
name: 'Name',
author: 'Author',
description: 'Description',
updated: '???',
version: '1.0.0',
icon: ''
},
button: ''
}
this.buttons = {
uninstall: <button className='removeFromMue' onClick={() => this.manage('uninstall')}>Remove</button>,
uninstall: <button className='removeFromMue' onClick={() => this.manage('uninstall')}>Remove</button>,
}
}
toggle(type, type2, data) {
if (type === 'item') {
const installed = JSON.parse(localStorage.getItem('installed'));
const info = installed.find(i => i.name === data);
const installed = JSON.parse(localStorage.getItem('installed'));
const info = installed.find(i => i.name === data);
this.setState({
current_data: {
type: type2,
name: data,
content: info
},
item_data: {
name: info.name,
author: info.author,
description: MarketplaceFunctions.urlParser(info.description.replace(/\n/g, '<br>')),
updated: 'Not Implemented',
version: info.version,
icon: info.screenshot_url
}
});
this.setState({
current_data: {
type: type2,
name: data,
content: info
},
item_data: {
name: info.name,
author: info.author,
description: MarketplaceFunctions.urlParser(info.description.replace(/\n/g, '<br>')),
updated: 'Not Implemented',
version: info.version,
icon: info.screenshot_url
}
});
document.getElementById('item').style.display = 'block';
document.getElementById('marketplace').style.display = 'none';
} else {
document.getElementById('marketplace').style.display = 'block';
document.getElementById('item').style.display = 'none';
document.getElementById('item').style.display = 'block';
document.getElementById('marketplace').style.display = 'none';
} else {
document.getElementById('marketplace').style.display = 'block';
document.getElementById('item').style.display = 'none';
}
this.setState({
button: this.buttons.uninstall
this.setState({
button: this.buttons.uninstall
});
}
manage(type, input) {
switch (type) {
case 'install':
MarketplaceFunctions.install(input.type, input, true);
break;
case 'uninstall':
MarketplaceFunctions.uninstall(this.state.current_data.name, this.state.current_data.content.type);
break;
default:
break;
case 'install':
MarketplaceFunctions.install(input.type, input, true);
break;
case 'uninstall':
MarketplaceFunctions.uninstall(this.state.current_data.name, this.state.current_data.content.type);
break;
default:
break;
}
toast(this.props.toastLanguage[type + 'ed']);
let button = '';
if (type === 'install') {
button = this.buttons.uninstall;
button = this.buttons.uninstall;
}
this.setState({
button: button,
installed: JSON.parse(localStorage.getItem('installed'))
this.setState({
button: button,
installed: JSON.parse(localStorage.getItem('installed'))
});
}
@ -94,26 +94,26 @@ export default class Added extends React.PureComponent {
let content = <Items items={this.state.installed} toggleFunction={(input) => this.toggle('item', 'addon', input)} />;
if (this.state.installed.length === 0) {
content = (
<div className='items'>
<div className='emptyMessage'>
<LocalMallIcon/>
<h1>Empty</h1>
<p className='description'>Nothing here (yet)</p>
<button className='goToMarket'>Take me there</button>
</div>
content = (
<div className='items'>
<div className='emptyMessage'>
<LocalMallIcon/>
<h1>Empty</h1>
<p className='description'>Nothing here (yet)</p>
<button className='goToMarket'>Take me there</button>
</div>
);
</div>
);
}
return (
<React.Fragment>
<React.Fragment>
<div id='marketplace'>
<FileUpload id='file-input' type='settings' accept='application/json' loadFunction={(e) => this.manage('install', JSON.parse(e.target.result))} />
<button className='addToMue sideload' onClick={() => document.getElementById('file-input').click()}>Sideload</button>
{content}
</div>
</React.Fragment>
</React.Fragment>
);
}
}
}

View File

@ -15,94 +15,94 @@ export default class Marketplace extends React.PureComponent {
constructor(...args) {
super(...args);
this.state = {
items: [],
current_data: {
type: '',
name: '',
content: {}
},
button: '',
featured: {},
done: false,
item_data: {
name: 'Name',
author: 'Author',
description: 'Description',
updated: '???',
version: '1.0.0',
icon: ''
}
}
this.buttons = {
uninstall: <button className='removeFromMue' onClick={() => this.manage('uninstall')}>Remove</button>,
install: <button className='addToMue' onClick={() => this.manage('install')}>Add to Mue</button>
items: [],
current_data: {
type: '',
name: '',
content: {}
},
button: '',
featured: {},
done: false,
item_data: {
name: 'Name',
author: 'Author',
description: 'Description',
updated: '???',
version: '1.0.0',
icon: ''
}
}
this.buttons = {
uninstall: <button className='removeFromMue' onClick={() => this.manage('uninstall')}>Remove</button>,
install: <button className='addToMue' onClick={() => this.manage('install')}>Add to Mue</button>
}
}
async toggle(type, data) {
switch (type) {
case 'item':
let info; // get item info
try {
info = await (await fetch(`${Constants.MARKETPLACE_URL}/item/${this.props.type}/${data}`)).json();
} catch (e) {
return toast(this.props.toastLanguage.error);
}
case 'item':
let info; // get item info
try {
info = await (await fetch(`${Constants.MARKETPLACE_URL}/item/${this.props.type}/${data}`)).json();
} catch (e) {
return toast(this.props.toastLanguage.error);
}
// check if already installed
let button = this.buttons.install;
let button = this.buttons.install;
const installed = JSON.parse(localStorage.getItem('installed'));
const installed = JSON.parse(localStorage.getItem('installed'));
if (installed.some(item => item.name === data)) {
button = this.buttons.uninstall;
}
this.setState({
current_data: { type: this.props.type, name: data, content: info },
item_data: {
name: info.data.name,
author: info.data.author,
description: MarketplaceFunctions.urlParser(info.data.description.replace(/\n/g, '<br>')),
updated: info.updated,
version: info.data.version,
icon: info.data.screenshot_url
},
button: button
});
document.getElementById('marketplace').style.display = 'none';
document.getElementById('item').style.display = 'block';
break;
default:
document.getElementById('marketplace').style.display = 'block';
document.getElementById('item').style.display = 'none';
break;
if (installed.some(item => item.name === data)) {
button = this.buttons.uninstall;
}
}
this.setState({
current_data: { type: this.props.type, name: data, content: info },
item_data: {
name: info.data.name,
author: info.data.author,
description: MarketplaceFunctions.urlParser(info.data.description.replace(/\n/g, '<br>')),
updated: info.updated,
version: info.data.version,
icon: info.data.screenshot_url
},
button: button
});
document.getElementById('marketplace').style.display = 'none';
document.getElementById('item').style.display = 'block';
break;
default:
document.getElementById('marketplace').style.display = 'block';
document.getElementById('item').style.display = 'none';
break;
}
}
async getItems() {
const { data } = await (await fetch(Constants.MARKETPLACE_URL + '/all')).json();
const featured = await (await fetch(Constants.MARKETPLACE_URL + '/featured')).json();
this.setState({
items: data[this.props.type],
featured: featured.data,
done: true
items: data[this.props.type],
featured: featured.data,
done: true
});
}
manage(type) {
switch (type) {
case 'install':
MarketplaceFunctions.install(this.state.current_data.type, this.state.current_data.content.data);
break;
case 'uninstall':
MarketplaceFunctions.uninstall(this.state.current_data.content.data.name, this.state.current_data.type);
break;
default:
break;
case 'install':
MarketplaceFunctions.install(this.state.current_data.type, this.state.current_data.content.data);
break;
case 'uninstall':
MarketplaceFunctions.uninstall(this.state.current_data.content.data.name, this.state.current_data.type);
break;
default:
break;
}
toast(this.props.toastLanguage[type + 'ed']);
@ -125,31 +125,31 @@ export default class Marketplace extends React.PureComponent {
render() {
const errorMessage = (msg) => {
return (
<div id='marketplace'>
<div className='emptyMessage' style={{ 'marginTop': '20px', 'transform': 'translateY(80%)' }}>
{msg}
</div>
</div>
);
return (
<div id='marketplace'>
<div className='emptyMessage' style={{ 'marginTop': '20px', 'transform': 'translateY(80%)' }}>
{msg}
</div>
</div>
);
}
if (navigator.onLine === false) {
return errorMessage(
<React.Fragment>
<WifiOffIcon/>
<h1>Offline</h1>
<p className='description'>Mue down!</p>
</React.Fragment>
);
return errorMessage(
<React.Fragment>
<WifiOffIcon/>
<h1>Offline</h1>
<p className='description'>Mue down!</p>
</React.Fragment>
);
}
if (localStorage.getItem('offlineMode') === 'true') {
return errorMessage(
<React.Fragment>
<WifiOffIcon/>
<h1>Offline mode is enabled</h1>
<p className='description'>Please turn off offline mode to access the marketplace</p>
<WifiOffIcon/>
<h1>Offline mode is enabled</h1>
<p className='description'>Please turn off offline mode to access the marketplace</p>
</React.Fragment>
);
}
@ -159,18 +159,18 @@ export default class Marketplace extends React.PureComponent {
}
return (
<React.Fragment>
<div id='marketplace'>
<div className='featured' style={{ 'backgroundColor': this.state.featured.colour }}>
<p>{this.state.featured.title}</p>
<h1>{this.state.featured.name}</h1>
<button className='addToMue' onClick={() => window.location.href = this.state.featured.buttonLink}>{this.state.featured.buttonText}</button>
</div>
<Items
items={this.state.items.slice(0, 3)}
toggleFunction={(input) => this.toggle('item', input)} />
</div>
</React.Fragment>
);
}
}
<React.Fragment>
<div id='marketplace'>
<div className='featured' style={{ 'backgroundColor': this.state.featured.colour }}>
<p>{this.state.featured.title}</p>
<h1>{this.state.featured.name}</h1>
<button className='addToMue' onClick={() => window.location.href = this.state.featured.buttonLink}>{this.state.featured.buttonText}</button>
</div>
<Items
items={this.state.items.slice(0, 3)}
toggleFunction={(input) => this.toggle('item', input)} />
</div>
</React.Fragment>
);
}
}

View File

@ -15,15 +15,15 @@ export default class Checkbox extends React.PureComponent {
handleChange(name) {
SettingsFunctions.setItem(name);
this.setState({
checked: (this.state.checked === true) ? false : true
this.setState({
checked: (this.state.checked === true) ? false : true
});
}
render() {
let text = this.props.text;
if (this.props.newFeature) {
text = <span>{this.props.text} <span className='newFeature'> NEW</span></span>;
} else if (this.props.betaFeature) {
@ -40,4 +40,4 @@ export default class Checkbox extends React.PureComponent {
</React.Fragment>
);
}
}
}

View File

@ -17,4 +17,4 @@ export default class Dropdown extends React.PureComponent {
</React.Fragment>
);
}
}
}

View File

@ -5,24 +5,24 @@ import { toast } from 'react-toastify';
export default class FileUpload extends React.PureComponent {
componentDidMount() {
document.getElementById(this.props.id).onchange = (e) => {
const reader = new FileReader();
const file = e.target.files[0];
const reader = new FileReader();
const file = e.target.files[0];
if (this.props.type === 'settings') {
reader.readAsText(file, 'UTF-8');
} else { // background upload
if (file.size > 2000000) {
return toast('File is over 2MB');
}
reader.readAsDataURL(file);
if (this.props.type === 'settings') {
reader.readAsText(file, 'UTF-8');
} else { // background upload
if (file.size > 2000000) {
return toast('File is over 2MB');
}
reader.addEventListener('load', (e) => this.props.loadFunction(e));
reader.readAsDataURL(file);
}
reader.addEventListener('load', (e) => this.props.loadFunction(e));
};
}
render() {
return <input id={this.props.id} type='file' className='hidden' accept={this.props.accept} />;
}
}
}

View File

@ -15,17 +15,17 @@ export default class Slider extends React.PureComponent {
SettingsFunctions.setItem(setText);
this.setState({
checked: (this.state.checked === true) ? false : true
this.setState({
checked: (this.state.checked === true) ? false : true
});
}
render() {
return (
<label className='switch'>
<input type='checkbox' checked={this.state.checked} onChange={() => this.handleChange()} />
<span className='slider'></span>
</label>
<label className='switch'>
<input type='checkbox' checked={this.state.checked} onChange={() => this.handleChange()} />
<span className='slider'></span>
</label>
);
}
}
}

View File

@ -25,9 +25,9 @@ export default class About extends React.PureComponent {
updateMsg = 'Update available: ' + version;
}
this.setState({
contributors: contributors, // TODO: REMOVE BOTS AND MAKE IT ACTUALLY WORK,
update: updateMsg
this.setState({
contributors: contributors, // TODO: REMOVE BOTS AND MAKE IT ACTUALLY WORK,
update: updateMsg
});
}
@ -38,27 +38,27 @@ export default class About extends React.PureComponent {
render() {
return (
<div>
<h2>About</h2>
<img draggable='false' style={{'height': '100px', 'width': 'auto'}} src='https://raw.githubusercontent.com/mue/branding/master/logo/logo_horizontal.png' alt='Mue logo'></img>
<p>Copyright 2018-{new Date().getFullYear()} Mue Tab (BSD-3 License)</p>
<p>Version {Constants.VERSION} ({this.state.update})</p>
<h3>Resources Used</h3>
<p>Pexels (Background Images)</p>
<p>Google (Pin Icon)</p>
<h3>Contributors</h3>
{this.state.contributors.map((item) =>
<Tooltip title={item.login} placement='top' key={item.login}>
<a href={'https://github.com/' + item.login} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar_url + '&size=256'} alt={item.login}></img></a>
</Tooltip>
)}
{other_contributors.map((item) => // for those who contributed without opening a pull request
<Tooltip title={item.login} placement='top' key={item.login}>
<a href={'https://github.com/' + item.login} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar_url + '&size=256'} alt={item.login}></img></a>
</Tooltip>
)}
<h3>Supporters</h3>
<p>to be implemented</p>
<h2>About</h2>
<img draggable='false' style={{'height': '100px', 'width': 'auto'}} src='https://raw.githubusercontent.com/mue/branding/master/logo/logo_horizontal.png' alt='Mue logo'></img>
<p>Copyright 2018-{new Date().getFullYear()} Mue Tab (BSD-3 License)</p>
<p>Version {Constants.VERSION} ({this.state.update})</p>
<h3>Resources Used</h3>
<p>Pexels (Background Images)</p>
<p>Google (Pin Icon)</p>
<h3>Contributors</h3>
{this.state.contributors.map((item) =>
<Tooltip title={item.login} placement='top' key={item.login}>
<a href={'https://github.com/' + item.login} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar_url + '&size=256'} alt={item.login}></img></a>
</Tooltip>
)}
{other_contributors.map((item) => // for those who contributed without opening a pull request
<Tooltip title={item.login} placement='top' key={item.login}>
<a href={'https://github.com/' + item.login} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar_url + '&size=256'} alt={item.login}></img></a>
</Tooltip>
)}
<h3>Supporters</h3>
<p>to be implemented</p>
</div>
);
}
}
}

View File

@ -8,52 +8,52 @@ import SettingsFunctions from '../../../../modules/helpers/settings';
import { toast } from 'react-toastify';
export default class AdvancedSettings extends React.PureComponent {
resetItem() {
document.getElementById('customcss').value = '';
toast(this.props.toastLanguage.reset);
}
componentDidMount() {
document.getElementById('customcss').value = localStorage.getItem('customcss');
}
settingsImport(e) {
const content = JSON.parse(e.target.result);
for (const key of Object.keys(content)) {
localStorage.setItem(key, content[key]);
}
toast(this.props.toastLanguage.imported);
}
componentWillUnmount() {
localStorage.setItem('customcss', document.getElementById('customcss').value);
resetItem() {
document.getElementById('customcss').value = '';
toast(this.props.toastLanguage.reset);
}
componentDidMount() {
document.getElementById('customcss').value = localStorage.getItem('customcss');
}
settingsImport(e) {
const content = JSON.parse(e.target.result);
for (const key of Object.keys(content)) {
localStorage.setItem(key, content[key]);
}
render() {
return (
<div>
<h2>Advanced</h2>
<Checkbox name='offlineMode' text='Offline Mode' />
<h3>Data</h3>
<button className='reset' onClick={() => SettingsFunctions.setDefaultSettings('reset')}>Reset</button>
<button className='export' onClick={() => SettingsFunctions.exportSettings()}>Export</button>
<button className='import' onClick={() => document.getElementById('file-input').click()}>Import</button>
<FileUpload id='file-input' accept='application/json' type='settings' loadFunction={(e) => this.settingsImport(e)} />
<h3>Customisation</h3>
<ul>
<p>Custom CSS <span className='modalLink' onClick={() => this.resetItem()}>Reset</span></p>
<textarea id='customcss'></textarea>
</ul>
<ul>
<p>Custom JS <span className='modalLink' onClick={() => this.resetItem()}>Reset</span></p>
<textarea id='customjs'></textarea>
</ul>
<h3>Experimental</h3>
<p>Please note that the Mue team cannot provide support if you have experimental mode on. Please disable it first and see if the issues continue to occur before contacting support.</p>
<Checkbox name='experimental' text='Enabled' />
</div>
);
}
}
toast(this.props.toastLanguage.imported);
}
componentWillUnmount() {
localStorage.setItem('customcss', document.getElementById('customcss').value);
}
render() {
return (
<div>
<h2>Advanced</h2>
<Checkbox name='offlineMode' text='Offline Mode' />
<h3>Data</h3>
<button className='reset' onClick={() => SettingsFunctions.setDefaultSettings('reset')}>Reset</button>
<button className='export' onClick={() => SettingsFunctions.exportSettings()}>Export</button>
<button className='import' onClick={() => document.getElementById('file-input').click()}>Import</button>
<FileUpload id='file-input' accept='application/json' type='settings' loadFunction={(e) => this.settingsImport(e)} />
<h3>Customisation</h3>
<ul>
<p>Custom CSS <span className='modalLink' onClick={() => this.resetItem()}>Reset</span></p>
<textarea id='customcss'></textarea>
</ul>
<ul>
<p>Custom JS <span className='modalLink' onClick={() => this.resetItem()}>Reset</span></p>
<textarea id='customjs'></textarea>
</ul>
<h3>Experimental</h3>
<p>Please note that the Mue team cannot provide support if you have experimental mode on. Please disable it first and see if the issues continue to occur before contacting support.</p>
<Checkbox name='experimental' text='Enabled' />
</div>
);
}
}

View File

@ -4,19 +4,19 @@ import Checkbox from '../Checkbox';
export default function AppearanceSettings (props) {
return (
<div>
<h2>{props.language.title}</h2>
<Checkbox name='darkTheme' text={props.language.dark} />
<Checkbox name='brightnessTime' text={props.language.night_mode} betaFeature={true} />
<h3>Accessibility</h3>
<Checkbox name='animations' text={props.language.animations} betaFeature={true} />
<ul>
<p>Zoom (100%) <span className='modalLink'>{props.language.reset}</span></p>
<input className='range' type='range' min='50' max='200' value={100} />
</ul>
<ul>
<p>Toast Duration (2500 milliseconds) <span className='modalLink'>{props.language.reset}</span></p>
<input className='range' type='range' min='50' max='200' value={100} />
</ul>
<h2>{props.language.title}</h2>
<Checkbox name='darkTheme' text={props.language.dark} />
<Checkbox name='brightnessTime' text={props.language.night_mode} betaFeature={true} />
<h3>Accessibility</h3>
<Checkbox name='animations' text={props.language.animations} betaFeature={true} />
<ul>
<p>Zoom (100%) <span className='modalLink'>{props.language.reset}</span></p>
<input className='range' type='range' min='50' max='200' value={100} />
</ul>
<ul>
<p>Toast Duration (2500 milliseconds) <span className='modalLink'>{props.language.reset}</span></p>
<input className='range' type='range' min='50' max='200' value={100} />
</ul>
</div>
);
}
}

View File

@ -31,30 +31,30 @@ export default class BackgroundSettings extends React.PureComponent {
switch (key) {
case 'customBackgroundColour':
localStorage.setItem('customBackgroundColour', '');
this.setState({
gradientSettings: this.DefaultGradientSettings
this.setState({
gradientSettings: this.DefaultGradientSettings
});
break;
case 'customBackground':
document.getElementById('customBackground').value = '';
case 'customBackground':
document.getElementById('customBackground').value = '';
break;
case 'blur':
localStorage.setItem('blur', 0);
this.setState({
blur: 0
this.setState({
blur: 0
});
break;
case 'brightness':
localStorage.setItem('brightness', 100);
this.setState({
brightness: 100
this.setState({
brightness: 100
});
break;
default:
default:
toast('resetItem requires a key!');
}
@ -147,21 +147,21 @@ export default class BackgroundSettings extends React.PureComponent {
}
this.setState({
gradientSettings: {
'angle': attrs.degree,
'gradient': attrs.points.map((p) => {
return {
'colour': '#' + rgbToHex(p.red, p.green, p.blue),
'stop': p.left
} }),
'type': attrs.type
gradientSettings: {
'angle': attrs.degree,
'gradient': attrs.points.map((p) => {
return {
'colour': '#' + rgbToHex(p.red, p.green, p.blue),
'stop': p.left
}}),
'type': attrs.type
}
});
};
fileUpload(e) {
localStorage.setItem('customBackground', e.target.result);
this.setState({
this.setState({
customBackground: e.target.result
});
}
@ -186,7 +186,7 @@ export default class BackgroundSettings extends React.PureComponent {
if (this.GradientPickerInitalState === undefined) {
this.InitializeColorPickerState(this.state.gradientSettings);
}
gradientInputs = (
<ColorPicker
onStartChange={(color) => this.onColorPickerChange(color, 'start')}
@ -217,50 +217,50 @@ export default class BackgroundSettings extends React.PureComponent {
}
return (
<div>
<h2>Background</h2>
<Checkbox name='background' text='Enabled' />
<h3>Buttons</h3>
<ul>
<Checkbox name='view' text={this.props.language.view} />
<Checkbox name='favouriteEnabled' text={this.props.language.favourite} />
<Checkbox name='refresh' text={this.props.language.refresh} />
</ul>
<h3>Effects</h3>
<ul>
<p>{this.props.language.blur} ({this.state.blur}%) <span className='modalLink' onClick={() => this.resetItem('blur')}>{this.props.language.reset}</span></p>
<input className='range' type='range' min='0' max='100' value={this.state.blur} onChange={(event) => this.setState({ blur: event.target.value })} />
</ul>
<ul>
<p>{this.props.language.brightness} ({this.state.brightness}%) <span className='modalLink' onClick={() => this.resetItem('brightness')}>{this.props.language.reset}</span></p>
<input className='range' type='range' min='0' max='100' value={this.state.brightness} onChange={(event) => this.setState({ brightness: event.target.value })} />
</ul>
<h3>Source</h3>
<ul>
<Dropdown
label={this.props.language.api}
name='backgroundapi'
id='backgroundAPI'
onChange={() => localStorage.setItem('backgroundAPI', document.getElementById('backgroundAPI').value)} >
<option className='choices' value='mue'>Mue</option>
<option className='choices' value='unsplash'>Unsplash</option>
</Dropdown>
</ul>
<ul>
<p>{this.props.language.custom_url} <span className='modalLink' onClick={() => this.resetItem('customBackground')}>{this.props.language.reset}</span></p>
<input type='text' value={this.state.customBackground} onChange={(e) => this.setState({ customBackground: e.target.value })}></input>
</ul>
<ul>
<p>{this.props.language.custom_background} <span className='modalLink' onClick={() => this.resetItem('customBackground')}>{this.props.language.reset}</span></p>
<button className='uploadbg' onClick={() => document.getElementById('bg-input').click()}>{this.props.language.upload}</button>
<FileUpload id='bg-input' accept='image/jpeg, image/png, image/webp, image/webm, image/gif' loadFunction={(e) => this.fileUpload(e)} />
</ul>
<ul>
<p>{this.props.language.custom_colour} <span className='modalLink' onClick={() => this.resetItem('customBackgroundColour')}>{this.props.language.reset}</span></p>
<input id='customBackgroundHex' type='hidden' value={this.currentGradientSettings()} />
{colourSettings}
</ul>
</div>
<div>
<h2>Background</h2>
<Checkbox name='background' text='Enabled' />
<h3>Buttons</h3>
<ul>
<Checkbox name='view' text={this.props.language.view} />
<Checkbox name='favouriteEnabled' text={this.props.language.favourite} />
<Checkbox name='refresh' text={this.props.language.refresh} />
</ul>
<h3>Effects</h3>
<ul>
<p>{this.props.language.blur} ({this.state.blur}%) <span className='modalLink' onClick={() => this.resetItem('blur')}>{this.props.language.reset}</span></p>
<input className='range' type='range' min='0' max='100' value={this.state.blur} onChange={(event) => this.setState({ blur: event.target.value })} />
</ul>
<ul>
<p>{this.props.language.brightness} ({this.state.brightness}%) <span className='modalLink' onClick={() => this.resetItem('brightness')}>{this.props.language.reset}</span></p>
<input className='range' type='range' min='0' max='100' value={this.state.brightness} onChange={(event) => this.setState({ brightness: event.target.value })} />
</ul>
<h3>Source</h3>
<ul>
<Dropdown
label={this.props.language.api}
name='backgroundapi'
id='backgroundAPI'
onChange={() => localStorage.setItem('backgroundAPI', document.getElementById('backgroundAPI').value)} >
<option className='choices' value='mue'>Mue</option>
<option className='choices' value='unsplash'>Unsplash</option>
</Dropdown>
</ul>
<ul>
<p>{this.props.language.custom_url} <span className='modalLink' onClick={() => this.resetItem('customBackground')}>{this.props.language.reset}</span></p>
<input type='text' value={this.state.customBackground} onChange={(e) => this.setState({ customBackground: e.target.value })}></input>
</ul>
<ul>
<p>{this.props.language.custom_background} <span className='modalLink' onClick={() => this.resetItem('customBackground')}>{this.props.language.reset}</span></p>
<button className='uploadbg' onClick={() => document.getElementById('bg-input').click()}>{this.props.language.upload}</button>
<FileUpload id='bg-input' accept='image/jpeg, image/png, image/webp, image/webm, image/gif' loadFunction={(e) => this.fileUpload(e)} />
</ul>
<ul>
<p>{this.props.language.custom_colour} <span className='modalLink' onClick={() => this.resetItem('customBackgroundColour')}>{this.props.language.reset}</span></p>
<input id='customBackgroundHex' type='hidden' value={this.currentGradientSettings()} />
{colourSettings}
</ul>
</div>
);
}
}
}

View File

@ -4,7 +4,6 @@ import Checkbox from '../Checkbox';
export default function ExperimentalSettings (props) {
return (
<div>
</div>
);
}
}

View File

@ -9,29 +9,29 @@ export default class GreetingSettings extends React.PureComponent {
constructor(...args) {
super(...args);
this.state = {
birthday: new Date(localStorage.getItem('birthday')) || new Date(),
greetingName: localStorage.getItem('greetingName') || ''
birthday: new Date(localStorage.getItem('birthday')) || new Date(),
greetingName: localStorage.getItem('greetingName') || ''
};
}
resetItem() {
this.setState({
greetingName: ''
this.setState({
greetingName: ''
});
toast(this.props.toastLanguage.reset);
}
changeDate(data) {
if (data === 'reset') {
return; //soon
}
if (data === 'reset') {
return; //soon
}
localStorage.setItem('birthday', data);
this.setState({
birthday: data
});
localStorage.setItem('birthday', data);
this.setState({
birthday: data
});
}
componentDidUpdate() {
@ -58,4 +58,4 @@ export default class GreetingSettings extends React.PureComponent {
</div>
);
}
}
}

View File

@ -12,15 +12,15 @@ export default function LanguageSettings (props) {
name='language'
id='language'
onChange={() => localStorage.setItem('language', document.getElementById('language').value)}>
{languages.map(language =>
<option className='choices' value={language.code} key={language.code}>{language.text}</option>
)}
{languages.map(language =>
<option className='choices' value={language.code} key={language.code}>{language.text}</option>
)}
</Dropdown>
<h4 htmlFor='quotelanguage' className='nodropdown'>Quote {props.language.language}</h4>
<Dropdown label={props.language.language} name='quotelanguage' id='quotelanguage' onChange={() => localStorage.setItem('quotelanguage', document.getElementById('quotelanguage').value)}>
<option className='choices' value='English'>English</option>
<option className='choices' value='French'>Français</option>
<option className='choices' value='English'>English</option>
<option className='choices' value='French'>Français</option>
</Dropdown>
</div>
);
}
}

View File

@ -13,4 +13,4 @@ export default function QuoteSettings (props) {
<Checkbox name='favouriteQuoteEnabled' text={props.language.favourite} />
</div>
);
}
}

View File

@ -11,7 +11,7 @@ export default class SearchSettings extends React.PureComponent {
resetSearch() {
localStorage.removeItem('customSearchEngine');
document.getElementById('customSearchEngine').value = '';
toast(this.props.toastLanguage.reset);
}
@ -23,7 +23,7 @@ export default class SearchSettings extends React.PureComponent {
input.style.display = 'block';
input.enabled = 'true';
document.getElementById('customSearchEngine').value = localStorage.getItem('customSearchEngine');
} else {
localStorage.removeItem('customSearchEngine');
@ -36,8 +36,8 @@ export default class SearchSettings extends React.PureComponent {
if (document.getElementById('searchEngineInput').enabled === 'true') {
const input = document.getElementById('customSearchEngine').value;
if (input) {
localStorage.setItem('searchEngine', 'custom');
localStorage.setItem('customSearchEngine', input);
localStorage.setItem('searchEngine', 'custom');
localStorage.setItem('customSearchEngine', input);
}
}
}
@ -45,36 +45,36 @@ export default class SearchSettings extends React.PureComponent {
setSearchEngine(input) {
const searchEngineInput = document.getElementById('searchEngineInput');
if (input === 'custom') {
searchEngineInput.enabled = 'true';
searchEngineInput.style.display = 'block';
searchEngineInput.enabled = 'true';
searchEngineInput.style.display = 'block';
} else {
searchEngineInput.style.display = 'none';
searchEngineInput.enabled = 'false';
localStorage.setItem('searchEngine', input);
searchEngineInput.style.display = 'none';
searchEngineInput.enabled = 'false';
localStorage.setItem('searchEngine', input);
}
}
render() {
return (
<div className='section'>
<h2>Search</h2>
<Checkbox name='voiceSearch' text={this.props.language.voice_search} />
<ul>
<Dropdown label={this.props.language.search_engine}
name='searchEngine'
id='searchEngine'
onChange={() => this.setSearchEngine(document.getElementById('searchEngine').value)} >
{searchEngines.map((engine) =>
<option key={engine.name} className='choices' value={engine.settingsName}>{engine.name}</option>
)}
<option className='choices' value='custom'>Custom</option>
</Dropdown>
</ul>
<ul id='searchEngineInput' style={{ display: 'none' }}>
<p style={{ 'marginTop': '0px' }}>{this.props.language.custom} <span className='modalLink' onClick={() => this.resetSearch()}>{this.props.language.reset}</span></p>
<input type='text' id='customSearchEngine'></input>
</ul>
</div>
<div className='section'>
<h2>Search</h2>
<Checkbox name='voiceSearch' text={this.props.language.voice_search} />
<ul>
<Dropdown label={this.props.language.search_engine}
name='searchEngine'
id='searchEngine'
onChange={() => this.setSearchEngine(document.getElementById('searchEngine').value)} >
{searchEngines.map((engine) =>
<option key={engine.name} className='choices' value={engine.settingsName}>{engine.name}</option>
)}
<option className='choices' value='custom'>Custom</option>
</Dropdown>
</ul>
<ul id='searchEngineInput' style={{ display: 'none' }}>
<p style={{ 'marginTop': '0px' }}>{this.props.language.custom} <span className='modalLink' onClick={() => this.resetSearch()}>{this.props.language.reset}</span></p>
<input type='text' id='customSearchEngine'></input>
</ul>
</div>
);
}
}
}

View File

@ -24,4 +24,4 @@ export default function TimeSettings (props) {
</Dropdown>
</div>
);
}
}

View File

@ -5,16 +5,16 @@ import Added from '../marketplace/sections/Added';
import AddonsTabs from './backend/Tabs';
export default function Addons (props) {
return (
<React.Fragment>
<AddonsTabs>
<div label='Added'>
<Added/>
</div>
<div label=''>
</div>
</AddonsTabs>
</React.Fragment>
);
}
return (
<React.Fragment>
<AddonsTabs>
<div label='Added'>
<Added/>
</div>
<div label=''>
</div>
</AddonsTabs>
</React.Fragment>
);
}

View File

@ -4,16 +4,16 @@ import MarketplaceBackend from '../marketplace/sections/Marketplace';
import MarketplaceTabs from './backend/Tabs';
export default function Marketplace (props) {
return (
<React.Fragment>
<MarketplaceTabs>
<div label='Photo Packs'>
<MarketplaceBackend type='photo_packs'/>
</div>
<div label='Quote Packs'>
<MarketplaceBackend type='quote_packs'/>
</div>
</MarketplaceTabs>
</React.Fragment>
);
}
return (
<React.Fragment>
<MarketplaceTabs>
<div label='Photo Packs'>
<MarketplaceBackend type='photo_packs'/>
</div>
<div label='Quote Packs'>
<MarketplaceBackend type='quote_packs'/>
</div>
</MarketplaceTabs>
</React.Fragment>
);
}

View File

@ -13,43 +13,43 @@ import Advanced from '../settings/sections/Advanced';
import SettingsTabs from './backend/Tabs';
export default function Settings (props) {
return (
<React.Fragment>
<SettingsTabs>
<div label={props.language.sections.time.title}>
<Time language={props.language.sections.time}/>
</div>
<div label={props.language.sections.quote.title}>
<Quote language={props.language.sections.quote}/>
</div>
<div label={props.language.sections.greeting.title}>
<Greeting language={props.language.sections.greeting} toastLanguage={props.language.toasts} />
</div>
<div label={props.language.sections.background.title}>
<Background language={props.language.sections.background} toastLanguage={props.toastLanguage}/>
</div>
<div label={props.language.sections.search.title}>
<Search language={props.language.sections.search}/>
</div>
<div label={props.language.sections.appearance}>
<Appearance language={props.language.sections.appearance} toastLanguage={props.toastLanguage}/>
</div>
<div label={props.language.sections.language}>
<Language language={props.language}/>
</div>
<div label='Advanced'>
<Advanced/>
</div>
<div label='Experimental'>
return (
<React.Fragment>
<SettingsTabs>
<div label={props.language.sections.time.title}>
<Time language={props.language.sections.time}/>
</div>
<div label={props.language.sections.quote.title}>
<Quote language={props.language.sections.quote}/>
</div>
<div label={props.language.sections.greeting.title}>
<Greeting language={props.language.sections.greeting} toastLanguage={props.language.toasts} />
</div>
<div label={props.language.sections.background.title}>
<Background language={props.language.sections.background} toastLanguage={props.toastLanguage}/>
</div>
<div label={props.language.sections.search.title}>
<Search language={props.language.sections.search}/>
</div>
<div label={props.language.sections.appearance}>
<Appearance language={props.language.sections.appearance} toastLanguage={props.toastLanguage}/>
</div>
<div label={props.language.sections.language}>
<Language language={props.language}/>
</div>
<div label='Advanced'>
<Advanced/>
</div>
<div label='Experimental'>
</div>
<div label={props.language.sections.changelog}>
<About/>
</div>
<div label={props.language.sections.about.title}>
<About/>
</div>
</SettingsTabs>
</React.Fragment>
);
}
</div>
<div label={props.language.sections.changelog}>
<About/>
</div>
<div label={props.language.sections.about.title}>
<About/>
</div>
</SettingsTabs>
</React.Fragment>
);
}

View File

@ -23,69 +23,69 @@ import Plugins from '@material-ui/icons/Widgets';
import Added from '@material-ui/icons/AddCircle';
export default class Tab extends React.PureComponent {
onClick = () => {
this.props.onClick(this.props.label);
};
onClick = () => {
this.props.onClick(this.props.label);
};
render() {
let className = 'tab-list-item';
if (this.props.currentTab === this.props.label) {
className += ' tab-list-active';
}
render() {
let className = 'tab-list-item';
if (this.props.currentTab === this.props.label) {
className += ' tab-list-active';
}
if (this.props.navbar === true) {
className = 'navbar-item';
if (this.props.currentTab === this.props.label) {
className += ' navbar-item-active';
}
}
if (this.props.navbar === true) {
className = 'navbar-item';
if (this.props.currentTab === this.props.label) {
className += ' navbar-item-active';
}
}
let icon, divider;
switch (this.props.label) {
// Navbar
case 'Settings': icon = <Settings/>; break;
case 'My Add-ons': icon = <Addons/>; break;
case 'Marketplace': icon = <Marketplace/>; break;
let icon, divider;
switch (this.props.label) {
// Navbar
case 'Settings': icon = <Settings/>; break;
case 'My Add-ons': icon = <Addons/>; break;
case 'Marketplace': icon = <Marketplace/>; break;
// Settings
case 'Time': icon = <Time/>; break;
case 'Greeting': icon = <Greeting/>; break;
case 'Quote': icon = <Quote/>; break;
case 'Background': icon = <Background/>; break;
case 'Search': icon = <Search/>; break;
case 'Appearance': icon = <Appearance/>; break;
case 'Language':
icon = <Language/>;
divider = <div><hr/></div>;
break;
case 'Advanced': icon = <Settings/>; break;
case 'Experimental':
icon = <Experimental/>;
divider = <div><hr/></div>;
break;
case 'Change Log': icon = <Changelog/>; break;
case 'About': icon = <About/>; break;
// Settings
case 'Time': icon = <Time/>; break;
case 'Greeting': icon = <Greeting/>; break;
case 'Quote': icon = <Quote/>; break;
case 'Background': icon = <Background/>; break;
case 'Search': icon = <Search/>; break;
case 'Appearance': icon = <Appearance/>; break;
case 'Language':
icon = <Language/>;
divider = <div><hr/></div>;
break;
case 'Advanced': icon = <Settings/>; break;
case 'Experimental':
icon = <Experimental/>;
divider = <div><hr/></div>;
break;
case 'Change Log': icon = <Changelog/>; break;
case 'About': icon = <About/>; break;
// Store
case 'Themes': icon = <Colors/>; break;
case 'Photo Packs': icon = <Background/>; break;
case 'Quote Packs': icon = <Quote/>; break;
case 'Plugins':
icon = <Plugins/>;
divider = <div><hr/></div>;
break;
case 'Added': icon = <Added/>; break;
default: break;
}
// Store
case 'Themes': icon = <Colors/>; break;
case 'Photo Packs': icon = <Background/>; break;
case 'Quote Packs': icon = <Quote/>; break;
case 'Plugins':
icon = <Plugins/>;
divider = <div><hr/></div>;
break;
case 'Added': icon = <Added/>; break;
return (
<React.Fragment>
<li className={className} onClick={this.onClick}>
{icon} <span>{this.props.label}</span>
</li>
{divider}
</React.Fragment>
)
}
}
default: break;
}
return (
<React.Fragment>
<li className={className} onClick={this.onClick}>
{icon} <span>{this.props.label}</span>
</li>
{divider}
</React.Fragment>
)
}
}

View File

@ -54,4 +54,4 @@ export default class Tabs extends React.PureComponent {
</span>
);
}
}
}

View File

@ -9,7 +9,7 @@ import Favourite from './background/Favourite';
import Date from './time/Date';
export default class Widgets extends React.PureComponent {
enabled(key) {
enabled(key) {
const stringValue = localStorage.getItem(key);
let enabled = true;
@ -18,7 +18,7 @@ export default class Widgets extends React.PureComponent {
enabled = true;
}
if (stringValue === 'false') {
if (stringValue === 'false') {
enabled = false;
}
}
@ -32,13 +32,13 @@ export default class Widgets extends React.PureComponent {
return (
<React.Fragment>
{enabled('searchBar') ? <Search language={language.widgets.search} /> : null}
{enabled('greeting') ? <Greeting language={language.widgets.greeting} /> : null}
{enabled('time') ? <Clock/> : null}
{enabled('date') ? <Date/> : null}
{enabled('quote') ? <Quote language={language.toasts} languagecode={languagecode} /> : null}
{enabled('view') ? <Maximise/> : null}
{enabled('favouriteEnabled') ? <Favourite/> : null}
{enabled('searchBar') ? <Search language={language.widgets.search} /> : null}
{enabled('greeting') ? <Greeting language={language.widgets.greeting} /> : null}
{enabled('time') ? <Clock/> : null}
{enabled('date') ? <Date/> : null}
{enabled('quote') ? <Quote language={language.toasts} languagecode={languagecode} /> : null}
{enabled('view') ? <Maximise/> : null}
{enabled('favouriteEnabled') ? <Favourite/> : null}
</React.Fragment>
);
}

View File

@ -28,7 +28,7 @@ export default class Background extends React.PureComponent {
localStorage.setItem('customBackgroundColour', JSON.stringify(gradientSettings));
}
}
const background = typeof gradientSettings === 'object' && gradientSettings !== null ? this.gradientStyleBuilder(gradientSettings) : `background-image: url(${url})`;
// Brightness
@ -83,7 +83,7 @@ export default class Background extends React.PureComponent {
const customBackgroundColour = localStorage.getItem('customBackgroundColour');
const customBackground = localStorage.getItem('customBackground');
const favourited = JSON.parse(localStorage.getItem('favourite'));
if (favourited) {
@ -110,7 +110,7 @@ export default class Background extends React.PureComponent {
if (customBackground.includes('.mp4') || customBackground.includes('.webm') || customBackground.includes('.ogg')) {
document.getElementById('backgroundImage').innerHTML = `
<video autoplay muted loop id='backgroundVideo'>
<source src='${customBackground}'/>
<source src='${customBackground}'/>
</video>`;
} else {
this.setBackground(customBackground, null, 'false'); // Local
@ -119,12 +119,12 @@ export default class Background extends React.PureComponent {
if (offlineMode === 'true') {
return this.doOffline();
}
try { // First we try and get an image from the API...
let requestURL;
switch (localStorage.getItem('backgroundAPI')) {
case 'unsplash':
case 'unsplash':
requestURL = `${Constants.UNSPLASH_URL}/getImage`;
break;
default: // Defaults to Mue
@ -151,7 +151,7 @@ export default class Background extends React.PureComponent {
if (data.location.replace(/[null]+/g, '') === ' ') {
return document.querySelector('#backgroundCredits').style.display = 'none';
}
document.getElementById('location').innerText = `${data.location.replace('null', '')}`; // Set the location tooltip
} catch (e) { // ..and if that fails we load one locally
this.doOffline();
@ -171,7 +171,7 @@ export default class Background extends React.PureComponent {
if (localStorage.getItem('animations') === 'true') {
document.querySelector('#backgroundImage').classList.add('fade-in');
}
this.determineMode();
}

View File

@ -4,36 +4,36 @@ import StarIcon from '@material-ui/icons/Star';
import StarIcon2 from '@material-ui/icons/StarBorder';
export default class Favourite extends React.PureComponent {
constructor(...args) {
super(...args);
this.state = {
favourited: <StarIcon2 onClick={() => this.favourite()} />
};
}
constructor(...args) {
super(...args);
this.state = {
favourited: <StarIcon2 onClick={() => this.favourite()} />
};
}
favourite() {
if (localStorage.getItem('favourite')) {
localStorage.removeItem('favourite');
this.setState({
favourited: <StarIcon2 onClick={() => this.favourite()} />
});
} else {
const url = document.getElementById('backgroundImage').style.backgroundImage.replace('url("', '').replace('")', '');
const credit = document.getElementById('credit').textContent;
const location = document.getElementById('location').textContent;
localStorage.setItem('favourite', JSON.stringify({ url: url, credit: credit, location: location }));
this.setState({
favourited: <StarIcon onClick={() => this.favourite()} />
});
}
if (localStorage.getItem('favourite')) {
localStorage.removeItem('favourite');
this.setState({
favourited: <StarIcon2 onClick={() => this.favourite()} />
});
} else {
const url = document.getElementById('backgroundImage').style.backgroundImage.replace('url("', '').replace('")', '');
const credit = document.getElementById('credit').textContent;
const location = document.getElementById('location').textContent;
localStorage.setItem('favourite', JSON.stringify({ url: url, credit: credit, location: location }));
this.setState({
favourited: <StarIcon onClick={() => this.favourite()} />
});
}
}
componentDidMount() {
if (localStorage.getItem('favourite')) {
this.setState({
favourited: <StarIcon onClick={() => this.favourite()} />
this.setState({
favourited: <StarIcon onClick={() => this.favourite()} />
});
}
}
@ -42,9 +42,9 @@ export default class Favourite extends React.PureComponent {
if (localStorage.getItem('favouriteEnabled') === 'false' || localStorage.getItem('background') === 'false' || localStorage.getItem('customBackgroundColour') || localStorage.getItem('customBackground')) {
return null;
}
return <div className='favourite'>
{this.state.favourited}
{this.state.favourited}
</div>
}
}
}

View File

@ -3,53 +3,53 @@ import React from 'react';
import FullscreenIcon from '@material-ui/icons/Fullscreen';
export default class View extends React.PureComponent {
constructor(...args) {
super(...args);
this.state = {
hidden: false
};
}
setAttribute(blur, brightness) {
document.querySelector('#backgroundImage').setAttribute(
'style',
`background-image: url(${document.getElementById('backgroundImage').style.backgroundImage.replace('url("', '').replace('")', '')}); -webkit-filter: blur(${blur}); -webkit-filter: brightness(${brightness}%);`
);
}
viewStuff() {
const elements = ['#searchBar', '.navbar-container', '.clock', '.greeting', '.quotediv', 'time']; // elements to hide
elements.forEach((element) => {
try {
(this.state.hidden === false) ? document.querySelector(element).style.display = 'none' : document.querySelector(element).style.display = 'block';
} catch (e) {
return;
}
});
if (this.state.hidden === false) {
this.setState({
hidden: true
});
this.setAttribute(0, 100);
} else {
this.setState({
hidden: false
});
this.setAttribute(localStorage.getItem('blur'), localStorage.getItem('brightness'));
}
constructor(...args) {
super(...args);
this.state = {
hidden: false
};
}
render() {
if (localStorage.getItem('background') === 'false') {
return null;
setAttribute(blur, brightness) {
document.querySelector('#backgroundImage').setAttribute(
'style',
`background-image: url(${document.getElementById('backgroundImage').style.backgroundImage.replace('url("', '').replace('")', '')}); -webkit-filter: blur(${blur}); -webkit-filter: brightness(${brightness}%);`
);
}
viewStuff() {
const elements = ['#searchBar', '.navbar-container', '.clock', '.greeting', '.quotediv', 'time']; // elements to hide
elements.forEach((element) => {
try {
(this.state.hidden === false) ? document.querySelector(element).style.display = 'none' : document.querySelector(element).style.display = 'block';
} catch (e) {
return;
}
return <div className='view'>
<FullscreenIcon onClick={() => this.viewStuff()} />
</div>
});
if (this.state.hidden === false) {
this.setState({
hidden: true
});
this.setAttribute(0, 100);
} else {
this.setState({
hidden: false
});
this.setAttribute(localStorage.getItem('blur'), localStorage.getItem('brightness'));
}
}
}
render() {
if (localStorage.getItem('background') === 'false') {
return null;
}
return <div className='view'>
<FullscreenIcon onClick={() => this.viewStuff()} />
</div>
}
}

View File

@ -26,4 +26,4 @@ export default function PhotoInformation(props) {
<span id='credit' style={{ 'display': 'none' }}></span>
</div>
);
}
}

View File

@ -1,20 +1,20 @@
{
"Tirachard Kumtanom": {
"photo": [1]
},
"Sohail Na": {
"photo": [4]
},
"Miriam Espacio": {
"photo": [7]
},
"Fabian Wiktor": {
"photo": [20]
},
"Pixabay": {
"photo": [2, 3, 9, 11, 13, 14, 15]
},
"Unknown": {
"photo": [5, 6, 8, 10, 12, 16, 17, 18, 19]
}
}
"Tirachard Kumtanom": {
"photo": [1]
},
"Sohail Na": {
"photo": [4]
},
"Miriam Espacio": {
"photo": [7]
},
"Fabian Wiktor": {
"photo": [20]
},
"Pixabay": {
"photo": [2, 3, 9, 11, 13, 14, 15]
},
"Unknown": {
"photo": [5, 6, 8, 10, 12, 16, 17, 18, 19]
}
}

View File

@ -1,78 +1,78 @@
.photoInformation {
position: absolute;
bottom: 1rem;
left: 1rem;
font-size: calc(10px + 0.1vmin) !important;
text-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
position: absolute;
bottom: 1rem;
left: 1rem;
font-size: calc(10px + 0.1vmin) !important;
text-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
svg {
float: left;
margin-right: 1rem;
font-size: calc(10px + 2vmin);
cursor: pointer;
}
svg {
float: left;
margin-right: 1rem;
font-size: calc(10px + 2vmin);
cursor: pointer;
}
svg,
h1 {
display: inline;
}
svg,
h1 {
display: inline;
}
svg:hover+.infoCard {
display: block;
}
svg:hover+.infoCard {
display: block;
}
}
.infoCard {
display: none;
background: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
color: #000;
position: fixed;
bottom: 3.25rem;
left: 0.7em;
padding: 1rem;
border-radius: 24px 24px 24px 0;
max-width: 500px;
text-align: left;
text-shadow: none;
display: none;
background: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
color: #000;
position: fixed;
bottom: 3.25rem;
left: 0.7em;
padding: 1rem;
border-radius: 24px 24px 24px 0;
max-width: 500px;
text-align: left;
text-shadow: none;
span {
display: block;
}
span {
display: block;
}
svg {
margin-right: 0.5rem;
vertical-align: middle;
display: inline-flex;
padding: 2px;
}
svg {
margin-right: 0.5rem;
vertical-align: middle;
display: inline-flex;
padding: 2px;
}
span,
svg {
font-size: 2em;
}
span,
svg {
font-size: 2em;
}
h1,
.infoIcon {
font-size: 3em;
}
h1,
.infoIcon {
font-size: 3em;
}
.infoIcon {
padding: 4px;
}
.infoIcon {
padding: 4px;
}
hr {
height: 3px;
background: #2d3436;
outline: none;
border: none;
}
hr {
height: 3px;
background: #2d3436;
outline: none;
border: none;
}
&:hover {
display: block !important;
}
&:hover {
display: block !important;
}
}
.dark hr {
background-color: white !important;
}
background-color: white !important;
}

View File

@ -2,63 +2,63 @@
@import '../../../../scss/mixins';
#backgroundImage {
height: 100vh;
background-size: cover;
background-repeat: no-repeat;
background-position: center;
background-attachment: fixed;
height: 100vh;
background-size: cover;
background-repeat: no-repeat;
background-position: center;
background-attachment: fixed;
}
#backgroundVideo {
position: fixed;
right: 0;
bottom: 0;
min-width: 100%;
min-height: 100%;
position: fixed;
right: 0;
bottom: 0;
min-width: 100%;
min-height: 100%;
}
.fade-in {
@include animation('fadein 2s');
@include animation('fadein 2s');
}
@include keyframes(fadein) {
from {
opacity: 0;
}
from {
opacity: 0;
}
to {
opacity: 1;
}
to {
opacity: 1;
}
}
.backgroundEffects {
opacity: 0.7;
transition: ease 0.6s;
opacity: 0.7;
transition: ease 0.6s;
}
.creditlink {
text-decoration: none;
color: white;
text-decoration: none;
color: white;
}
.view {
right: 25px;
right: 25px;
}
.favourite {
right: 50px;
padding-right: 5px;
right: 50px;
padding-right: 5px;
}
.view,
.favourite {
bottom: 10px;
position: absolute;
transition: all 0.5s ease 0s;
width: auto;
cursor: pointer;
bottom: 10px;
position: absolute;
transition: all 0.5s ease 0s;
width: auto;
cursor: pointer;
&:hover {
transform: scale(1.1);
}
}
&:hover {
transform: scale(1.1);
}
}

View File

@ -70,8 +70,8 @@ export default class Greeting extends React.PureComponent {
}
// Set the state to the greeting string
this.setState({
greeting: `${message}${name}`
this.setState({
greeting: `${message}${name}`
});
}

View File

@ -1,4 +1,4 @@
.greeting {
margin: 0;
font-size: 1.6em;
}
margin: 0;
font-size: 1.6em;
}

View File

@ -33,7 +33,7 @@ export default class Navbar extends React.PureComponent {
<Report className='topicons' onClick={() => this.props.openModal('feedbackModal')} />
</Tooltip>
);
if (Constants.BETA_VERSION === false) {
feedbackHTML = null;
}

View File

@ -7,52 +7,52 @@ import NotesIcon from '@material-ui/icons/AssignmentRounded';
import Pin from './Pin';
export default class Notes extends React.PureComponent {
constructor(...args) {
super(...args);
this.state = {
notes: localStorage.getItem('notes') || ''
};
}
setNotes = (e) => {
localStorage.setItem('notes', e.target.value);
this.setState({
notes: e.target.value
});
constructor(...args) {
super(...args);
this.state = {
notes: localStorage.getItem('notes') || ''
};
}
pin() {
document.getElementById('noteContainer').classList.toggle('visibilityshow');
setNotes = (e) => {
localStorage.setItem('notes', e.target.value);
this.setState({
notes: e.target.value
});
};
if (localStorage.getItem('notesPinned') === 'true') {
localStorage.setItem('notesPinned', false);
} else {
localStorage.setItem('notesPinned', true);
}
pin() {
document.getElementById('noteContainer').classList.toggle('visibilityshow');
if (localStorage.getItem('notesPinned') === 'true') {
localStorage.setItem('notesPinned', false);
} else {
localStorage.setItem('notesPinned', true);
}
}
componentDidMount() {
if (localStorage.getItem('notesPinned') === 'true') {
document.getElementById('noteContainer').classList.toggle('visibilityshow');
}
}
render() {
let classList = 'notescontainer';
if (localStorage.getItem('darkTheme') === 'true') {
classList += ' dark';
}
componentDidMount() {
if (localStorage.getItem('notesPinned') === 'true') {
document.getElementById('noteContainer').classList.toggle('visibilityshow');
}
}
render() {
let classList = 'notescontainer';
if (localStorage.getItem('darkTheme') === 'true') {
classList += ' dark';
}
return (
<span id='noteContainer' className={classList}>
<div className='topbarnotes'>
<NotesIcon/>
<h3>{this.props.language.title}</h3>
</div>
<TextareaAutosize rowsMax={50} placeholder={this.props.language.placeholder} value={this.state.notes} onChange={this.setNotes}/>
<button onClick={this.pin} className='pinNote'><Pin/></button>
<button onClick={() => navigator.clipboard.writeText(this.state.notes)} className='saveNote'><CopyIcon/></button>
</span>
);
}
return (
<span id='noteContainer' className={classList}>
<div className='topbarnotes'>
<NotesIcon/>
<h3>{this.props.language.title}</h3>
</div>
<TextareaAutosize rowsMax={50} placeholder={this.props.language.placeholder} value={this.state.notes} onChange={this.setNotes}/>
<button onClick={this.pin} className='pinNote'><Pin/></button>
<button onClick={() => navigator.clipboard.writeText(this.state.notes)} className='saveNote'><CopyIcon/></button>
</span>
);
}
}

View File

@ -17,10 +17,10 @@
import React from 'react';
export default function Pin() {
return (
<svg xmlns='http://www.w3.org/2000/svg' enableBackground='new 0 0 24 24' viewBox='0 0 24 24' fill='black' width='18px' height='18px'>
<g><rect fill='none' height='24' width='24'/></g>
<g><path d='M16,9V4l1,0c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H7C6.45,2,6,2.45,6,3v0 c0,0.55,0.45,1,1,1l1,0v5c0,1.66-1.34,3-3,3h0v2h5.97v7l1,1l1-1v-7H19v-2h0C17.34,12,16,10.66,16,9z' fillRule='evenodd'/></g>
</svg>
);
}
return (
<svg xmlns='http://www.w3.org/2000/svg' enableBackground='new 0 0 24 24' viewBox='0 0 24 24' fill='black' width='18px' height='18px'>
<g><rect fill='none' height='24' width='24'/></g>
<g><path d='M16,9V4l1,0c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H7C6.45,2,6,2.45,6,3v0 c0,0.55,0.45,1,1,1l1,0v5c0,1.66-1.34,3-3,3h0v2h5.97v7l1,1l1-1v-7H19v-2h0C17.34,12,16,10.66,16,9z' fillRule='evenodd'/></g>
</svg>
);
}

View File

@ -1,58 +1,58 @@
.notes {
position: relative;
position: relative;
h3 {
text-shadow: none;
margin: 0;
}
h3 {
text-shadow: none;
margin: 0;
}
}
.notescontainer {
padding: 15px;
visibility: hidden;
background-color: #fff;
color: #000;
text-align: center;
border-radius: 12px;
position: absolute;
top: 80%;
margin-left: -150px;
padding: 15px;
visibility: hidden;
background-color: #fff;
color: #000;
text-align: center;
border-radius: 12px;
position: absolute;
top: 80%;
margin-left: -150px;
svg {
float: left;
}
svg {
float: left;
}
::placeholder {
color: #636e72;
opacity: 1;
}
::placeholder {
color: #636e72;
opacity: 1;
}
}
.notes:hover .notescontainer {
visibility: visible;
visibility: visible;
}
textarea {
border: none;
width: 200px;
resize: none;
height: 100px;
margin: 10px;
border: none;
width: 200px;
resize: none;
height: 100px;
margin: 10px;
}
.topbarnotes {
svg {
font-size: 48px;
padding: 9px;
}
svg {
font-size: 48px;
padding: 9px;
}
h3 {
font-size: 48px;
margin-right: 20px;
}
h3 {
font-size: 48px;
margin-right: 20px;
}
}
.dark textarea {
background-color: #2f3542;
color: white;
}
background-color: #2f3542;
color: white;
}

View File

@ -2,37 +2,37 @@
@import '../../../../scss/variables';
.navbar-container {
position: absolute;
top: 1rem;
right: 1rem;
position: absolute;
top: 1rem;
right: 1rem;
div {
display: inline;
}
img {
height: 1em;
width: auto;
margin: 0.5rem;
}
svg.topicons {
color: map-get($theme-colours, 'main-text-color');
-webkit-font-smoothing: subpixel-antialiased;
font-size: 1em;
margin: 0.5rem;
filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.3));
cursor: pointer;
transition: .2s ease;
&:hover {
color: map-get($theme-colours, 'main-text-color');
transform: translateZ(0);
transform: scale(1.3);
}
div {
display: inline;
}
img {
height: 1em;
width: auto;
margin: 0.5rem;
}
svg.topicons {
color: map-get($theme-colours, 'main-text-color');
-webkit-font-smoothing: subpixel-antialiased;
font-size: 1em;
margin: 0.5rem;
filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.3));
cursor: pointer;
transition: .2s ease;
&:hover {
color: map-get($theme-colours, 'main-text-color');
transform: translateZ(0);
transform: scale(1.3);
}
}
}
.visibilityshow {
visibility: visible !important;
}
visibility: visible !important;
}

View File

@ -16,11 +16,11 @@ export default class Quote extends React.PureComponent {
constructor(...args) {
super(...args);
this.state = {
quote: '',
author: '',
favourited: <StarIcon2 className='copyButton' onClick={() => this.favourite()} />,
tweet: <TwitterIcon className='copyButton' onClick={() => this.tweetQuote()} />,
copy: <FileCopy className='copyButton' onClick={() => this.copyQuote()} />
quote: '',
author: '',
favourited: <StarIcon2 className='copyButton' onClick={() => this.favourite()} />,
tweet: <TwitterIcon className='copyButton' onClick={() => this.tweetQuote()} />,
copy: <FileCopy className='copyButton' onClick={() => this.copyQuote()} />
};
}
@ -40,7 +40,7 @@ export default class Quote extends React.PureComponent {
if (quotePack === 'undefined') {
return this.doOffline();
}
quotePack = JSON.parse(quotePack);
if (quotePack) {
@ -109,19 +109,19 @@ export default class Quote extends React.PureComponent {
favourite() {
if (localStorage.getItem('favouriteQuote')) {
localStorage.removeItem('favouriteQuote');
this.setState({
favourited: <StarIcon2 className='copyButton' onClick={() => this.favourite()} />
this.setState({
favourited: <StarIcon2 className='copyButton' onClick={() => this.favourite()} />
});
} else {
localStorage.setItem('favouriteQuote', this.state.quote + ' - ' + this.state.author);
this.setState({
favourited: <StarIcon className='copyButton' onClick={() => this.favourite()} />
this.setState({
favourited: <StarIcon className='copyButton' onClick={() => this.favourite()} />
});
}
}
componentDidMount() {
this.setState({
this.setState({
favourited: localStorage.getItem('favouriteQuote') ? <StarIcon className='copyButton' onClick={() => this.favourite()} /> : null, // todo: fix (localStorage.getItem('favouriteQuoteEnabled') === 'false')
copy: (localStorage.getItem('copyButton') === 'false') ? null : this.state.copy,
tweet: (localStorage.getItem('tweetButton') === 'false') ? null: this.state.tweet
@ -132,12 +132,12 @@ export default class Quote extends React.PureComponent {
render() {
return (
<div className='quotediv'>
<h1 className='quote'>{`${this.state.quote}`}</h1>
<h1 className='quoteauthor'>
<a href={this.state.authorlink} className='quoteauthorlink' target='_blank' rel='noopener noreferrer'>{this.state.author}</a> {this.state.copy} {this.state.tweet} {this.state.favourited}
</h1>
</div>
<div className='quotediv'>
<h1 className='quote'>{`${this.state.quote}`}</h1>
<h1 className='quoteauthor'>
<a href={this.state.authorlink} className='quoteauthorlink' target='_blank' rel='noopener noreferrer'>{this.state.author}</a> {this.state.copy} {this.state.tweet} {this.state.favourited}
</h1>
</div>
);
}
}

View File

@ -1,80 +1,102 @@
[
{
"author": "Robert De Niro",
"quote": "Time goes on. So whatever youre going to do, do it. Do it now. Dont wait."
},
{
"author": "Walt Disney",
"quote": "All our dreams can come true, if we have the courage to pursue them."
},
{
"author": "Confucius",
"quote": "It does not matter how slowly you go as long as you do not stop."
}, {
"author": "Roy T. Bennett",
"quote": "Believe in yourself. You are braver than you think, more talented than you know, and capable of more than you imagine."
}, {
"author": "Wayne Dyer",
"quote": "If you believe it will work out, youll see opportunities. If you believe it wont, you will see obstacles."
}, {
"author": "George Addair",
"quote": "Everything youve ever wanted is on the other side of fear."
}, {
"author": "Winston Churchill",
"quote": "Success is not final, failure is not fatal: it is the courage to continue that counts."
}, {
"author": "Paulo Coelho",
"quote": "There is only one thing that makes a dream impossible to achieve: the fear of failure"
}, {
"author": "Brian Tracy",
"quote": "Your true success in life begins only when you make the commitment to become excellent at what you do."
}, {
"author": "Chantal Sutherland",
"quote": "Believe in yourself, take on your challenges, dig deep within yourself to conquer fears. Never let anyone bring you down. You got to keep going."
}, {
"author": "Les Brown",
"quote": "Too many of us are not living our dreams because we are living our fears."
}, {
"author": "Bob Riley",
"quote": "Hard times dont create heroes. It is during the hard times when the hero within us is revealed."
}, {
"author": "Jack Canfield",
"quote": "If you can tune into your purpose and really align with it, setting goals so that your vision is an expression of that purpose, then life flows much more easily."
}, {
"author": "Napolean Hill",
"quote": "Whatever the mind can conceive and believe, it can achieve."
}, {
"author": "Jim Rohn",
"quote": "Dont wish it were easier. Wish you were better."
}, {
"author": "Serena Williams",
"quote": "A champion is defined not by their wins but by how they can recover when they fall."
}, {
"author": "Sheryl Sandberg",
"quote": "Motivation comes from working on things we care about."
}, {
"author": "Reese Witherspoon",
"quote": "With the right kind of coaching and determination you can accomplish anything."
}, {
"author": "Hazrat Inayat Khan",
"quote": "Some people look for a beautiful place. Others make a place beautiful."
}, {
"author": "Albert Einstein",
"quote": "Life is like riding a bicycle. To keep your balance, you must keep moving."
}, {
"author": "Walt Disney",
"quote": "The way to get started is to quit talking and begin doing."
}, {
"author": "Winston Churchill",
"quote": "A pessimist sees the difficulty in every opportunity; an optimist sees the opportunity in every difficulty."
}, {
"author": "Will Rogers",
"quote": "Don't let yesterday take up too much of today."
}, {
"author": "Vince Lombardi",
"quote": "It's not whether you get knocked down, it's whether you get up."
}, {
"author": "Steve Jobs",
"quote": "If you are working on something that you really care about, you dont have to be pushed. The vision pulls you."
}
]
{
"author": "Robert De Niro",
"quote": "Time goes on. So whatever youre going to do, do it. Do it now. Dont wait."
},
{
"author": "Walt Disney",
"quote": "All our dreams can come true, if we have the courage to pursue them."
},
{
"author": "Confucius",
"quote": "It does not matter how slowly you go as long as you do not stop."
},
{
"author": "Roy T. Bennett",
"quote": "Believe in yourself. You are braver than you think, more talented than you know, and capable of more than you imagine."
},
{
"author": "Wayne Dyer",
"quote": "If you believe it will work out, youll see opportunities. If you believe it wont, you will see obstacles."
},
{
"author": "George Addair",
"quote": "Everything youve ever wanted is on the other side of fear."
},
{
"author": "Winston Churchill",
"quote": "Success is not final, failure is not fatal: it is the courage to continue that counts."
},
{
"author": "Paulo Coelho",
"quote": "There is only one thing that makes a dream impossible to achieve: the fear of failure"
},
{
"author": "Brian Tracy",
"quote": "Your true success in life begins only when you make the commitment to become excellent at what you do."
},
{
"author": "Chantal Sutherland",
"quote": "Believe in yourself, take on your challenges, dig deep within yourself to conquer fears. Never let anyone bring you down. You got to keep going."
},
{
"author": "Les Brown",
"quote": "Too many of us are not living our dreams because we are living our fears."
},
{
"author": "Bob Riley",
"quote": "Hard times dont create heroes. It is during the hard times when the hero within us is revealed."
},
{
"author": "Jack Canfield",
"quote": "If you can tune into your purpose and really align with it, setting goals so that your vision is an expression of that purpose, then life flows much more easily."
},
{
"author": "Napolean Hill",
"quote": "Whatever the mind can conceive and believe, it can achieve."
},
{
"author": "Jim Rohn",
"quote": "Dont wish it were easier. Wish you were better."
},
{
"author": "Serena Williams",
"quote": "A champion is defined not by their wins but by how they can recover when they fall."
},
{
"author": "Sheryl Sandberg",
"quote": "Motivation comes from working on things we care about."
},
{
"author": "Reese Witherspoon",
"quote": "With the right kind of coaching and determination you can accomplish anything."
},
{
"author": "Hazrat Inayat Khan",
"quote": "Some people look for a beautiful place. Others make a place beautiful."
},
{
"author": "Albert Einstein",
"quote": "Life is like riding a bicycle. To keep your balance, you must keep moving."
},
{
"author": "Walt Disney",
"quote": "The way to get started is to quit talking and begin doing."
},
{
"author": "Winston Churchill",
"quote": "A pessimist sees the difficulty in every opportunity; an optimist sees the opportunity in every difficulty."
},
{
"author": "Will Rogers",
"quote": "Don't let yesterday take up too much of today."
},
{
"author": "Vince Lombardi",
"quote": "It's not whether you get knocked down, it's whether you get up."
},
{
"author": "Steve Jobs",
"quote": "If you are working on something that you really care about, you dont have to be pushed. The vision pulls you."
}
]

View File

@ -1,38 +1,38 @@
@import '../../../scss/variables';
.quote {
font-size: 0.8em;
text-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
font-size: 0.8em;
text-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
}
@media screen and (min-width: 600px) {
.quote {
margin-left: 30%;
margin-right: 30%;
}
.quote {
margin-left: 30%;
margin-right: 30%;
}
}
.quoteauthor {
font-size: 0.9em;
letter-spacing: 0.5px;
font-size: 0.9em;
letter-spacing: 0.5px;
}
.copyButton {
cursor: pointer;
vertical-align: middle;
transition: ease 0.2s !important;
cursor: pointer;
vertical-align: middle;
transition: ease 0.2s !important;
&:hover {
transform: scale(1.1);
}
&:hover {
transform: scale(1.1);
}
}
i.material-icons,
h1.quoteauthor {
display: inline;
display: inline;
}
.quoteauthorlink {
text-decoration: none;
color: white;
}
text-decoration: none;
color: white;
}

View File

@ -67,10 +67,10 @@ export default class Search extends React.PureComponent {
return (
<div id='searchBar'>
<form action={this.state.url}>
{this.state.microphone}
<SearchIcon onClick={() => searchButton()} id='searchButton'/>
<input type='text' placeholder={this.props.language} name={this.state.query} id='searchtext'/>
</form>
{this.state.microphone}
<SearchIcon onClick={() => searchButton()} id='searchButton'/>
<input type='text' placeholder={this.props.language} name={this.state.query} id='searchtext'/>
</form>
</div>
);
}

View File

@ -1,37 +1,37 @@
@import '../../../scss/variables';
#searchBar {
position: absolute;
left: 20px;
top: 20px;
color: map-get($theme-colours, 'main-text-color');
input[type=text] {
width: 140px;
margin-left: 12px;
border-radius: 24px;
font-size: calc(5px + 1.2vmin);
border: none;
position: absolute;
left: 20px;
top: 20px;
color: map-get($theme-colours, 'main-text-color');
background-color: rgba(0, 0, 0, 0.1);
-webkit-transition: width 0.5s ease-in-out;
transition: width 0.5s ease-in-out;
color: white;
input[type=text] {
width: 140px;
margin-left: 12px;
border-radius: 24px;
font-size: calc(5px + 1.2vmin);
border: none;
position: absolute;
background-color: rgba(0, 0, 0, 0.1);
-webkit-transition: width 0.5s ease-in-out;
transition: width 0.5s ease-in-out;
color: white;
&:focus {
width: 400px;
background-color: rgba(0, 0, 0, .3);
}
&:focus {
width: 400px;
background-color: rgba(0, 0, 0, .3);
}
}
.MuiSvgIcon-root {
margin-top: 4px;
font-size: 30px;
filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.3));
cursor: pointer;
}
.MuiSvgIcon-root {
margin-top: 4px;
font-size: 30px;
filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.3));
cursor: pointer;
}
}
.micIcon {
margin-right: 10px;
}
margin-right: 10px;
}

View File

@ -1,48 +1,48 @@
[
{
"name": "DuckDuckGo",
"settingsName": "duckduckgo",
"url": "https://duckduckgo.com"
},
{
"name": "Google",
"settingsName": "google",
"url": "https://google.com/search"
},
{
"name": "Bing",
"settingsName": "bing",
"url": "https://bing.com/search"
},
{
"name": "Yahoo",
"settingsName": "yahoo",
"url": "https://search.yahoo.com/search"
},
{
"name": "Ecosia",
"settingsName": "ecosia",
"url": "https://ecosia.org/search"
},
{
"name": "Яндекс",
"settingsName": "yandex",
"url": "https://yandex.ru/search",
"query": "text"
},
{
"name": "Qwant",
"settingsName": "qwant",
"url": "https://www.qwant.com/"
},
{
"name": "Ask",
"settingsName": "ask",
"url": "https://ask.com/web"
},
{
"name": "Startpage",
"settingsName": "startpage",
"url": "https://www.startpage.com/sp/search"
}
]
{
"name": "DuckDuckGo",
"settingsName": "duckduckgo",
"url": "https://duckduckgo.com"
},
{
"name": "Google",
"settingsName": "google",
"url": "https://google.com/search"
},
{
"name": "Bing",
"settingsName": "bing",
"url": "https://bing.com/search"
},
{
"name": "Yahoo",
"settingsName": "yahoo",
"url": "https://search.yahoo.com/search"
},
{
"name": "Ecosia",
"settingsName": "ecosia",
"url": "https://ecosia.org/search"
},
{
"name": "Яндекс",
"settingsName": "yandex",
"url": "https://yandex.ru/search",
"query": "text"
},
{
"name": "Qwant",
"settingsName": "qwant",
"url": "https://www.qwant.com/"
},
{
"name": "Ask",
"settingsName": "ask",
"url": "https://ask.com/web"
},
{
"name": "Startpage",
"settingsName": "startpage",
"url": "https://www.startpage.com/sp/search"
}
]

View File

@ -21,7 +21,7 @@ export default class Clock extends React.PureComponent {
// Percentage
if (localStorage.getItem('percentageComplete') === 'true') {
return this.setState({
return this.setState({
time: (now.getHours() / 24).toFixed(2).replace('0.', '') + '%'
});
}
@ -30,8 +30,8 @@ export default class Clock extends React.PureComponent {
if (localStorage.getItem('analog') === 'true') {
require('react-clock/dist/Clock.css'); // load analog clock css
this.setState({
time: now
this.setState({
time: now
});
} else {
// Default clock
@ -53,13 +53,13 @@ export default class Clock extends React.PureComponent {
time = `${('00' + now.getHours()).slice(-2)}:${('00' + now.getMinutes()).slice(-2)}${sec}`;
}
this.setState({
time: time
this.setState({
time: time
});
} else {
// 12 hour support
let hours = now.getHours();
if (hours > 12) {
hours -= 12;
}
@ -74,7 +74,7 @@ export default class Clock extends React.PureComponent {
time = `${hours}:${now.getMinutes()}${sec}`;
} else {
time = `${('00' + hours).slice(-2)}:${('00' + now.getMinutes()).slice(-2)}${sec}`;
}
}
this.setState({
time: time,
@ -93,7 +93,7 @@ export default class Clock extends React.PureComponent {
render() {
let clockHTML = <h1 className='clock'>{this.state.time}<span className='ampm'>{this.state.ampm}</span></h1>;
if (localStorage.getItem('analog') === 'true') {
clockHTML = <Analog className='analogclock' value={this.state.time} renderHourMarks={false} renderMinuteMarks={false} />;
}

View File

@ -32,24 +32,24 @@ export default class DateWidget extends React.PureComponent {
day = dateYear;
year = dateDay;
break;
default:
default:
break; // DMY
}
let format;
switch (localStorage.getItem('shortFormat')) {
case 'dash':
format = `${day}-${month}-${year}`;
case 'dash':
format = `${day}-${month}-${year}`;
break;
case 'gaps':
format = `${day} - ${month} - ${year}`;
case 'gaps':
format = `${day} - ${month} - ${year}`;
break;
default:
default:
format = `${day}/${month}/${year}`;
}
this.setState({
date: format
this.setState({
date: format
});
} else {
// Full date
@ -60,8 +60,8 @@ export default class DateWidget extends React.PureComponent {
const month = date.toLocaleDateString(lang, { month: 'long' });
const year = date.getFullYear();
this.setState({
date: `${day} ${nth} ${month} ${year}`
this.setState({
date: `${day} ${nth} ${month} ${year}`
});
}
}
@ -73,4 +73,4 @@ export default class DateWidget extends React.PureComponent {
render() {
return <span style={{ 'textTransform': 'capitalize', 'fontWeight': 'bold' }}>{this.state.date}</span>
}
}
}

View File

@ -1,24 +1,24 @@
@import '../../../scss/variables';
.clock {
font-size: 4em;
margin: 0;
font-size: 4em;
margin: 0;
}
.ampm {
font-size: 0.5em;
font-size: 0.5em;
}
.analogclock,
.react-clock__face {
margin: 0 auto;
border-radius: 100%;
box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.3);
border: none !important;
border: 1px solid map-get($theme-colours, 'main') !important;
margin: 0 auto;
border-radius: 100%;
box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.3);
border: none !important;
border: 1px solid map-get($theme-colours, 'main') !important;
}
.react-clock__hand__body {
background: map-get($theme-colours, 'main') !important;
box-shadow: 0 0 25px rgba(0, 0, 0, 0.3);
}
background: map-get($theme-colours, 'main') !important;
box-shadow: 0 0 25px rgba(0, 0, 0, 0.3);
}

View File

@ -10,6 +10,6 @@ import '@fontsource/lexend-deca/latin-400.css';
import '@fontsource/roboto/cyrillic-400.css';
ReactDOM.render(
<App/>,
document.getElementById('root')
<App/>,
document.getElementById('root')
);

View File

@ -4,4 +4,4 @@ export const MARKETPLACE_URL = 'https://marketplace.muetab.com';
export const WEBSITE_URL = 'https://muetab.com';
export const OFFLINE_IMAGES = 20;
export const BETA_VERSION = false;
export const VERSION = '5.0.0';
export const VERSION = '5.0.0';

View File

@ -1,102 +1,102 @@
[
{
"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": "brightness",
"value": 100
},
{
"name": "events",
"value": true
},
{
"name": "customBackgroundColour",
"value": ""
},
{
"name": "customBackground",
"value": ""
},
{
"name": "greetingName",
"value": ""
},
{
"name": "defaultGreetingMessage",
"value": true
},
{
"name": "backgroundAPI",
"value": "mue"
},
{
"name": "ampm",
"value": true
},
{
"name": "copyButton",
"value": false
},
{
"name": "installed",
"value": "[]"
},
{
"name": "searchEngine",
"value": "duckduckgo"
},
{
"name": "refresh",
"value": true
},
{
"name": "view",
"value": true
},
{
"name": "favouriteEnabled",
"value": true
},
{
"name": "tweetButton",
"value": false
},
{
"name": "favouriteQuoteEnabled",
"value": false
},
{
"name": "showWelcome",
"value": true
},
{
"name": "quotelanguage",
"value": "English"
},
{
"name": "date",
"value": "false"
}
]
{
"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": "brightness",
"value": 100
},
{
"name": "events",
"value": true
},
{
"name": "customBackgroundColour",
"value": ""
},
{
"name": "customBackground",
"value": ""
},
{
"name": "greetingName",
"value": ""
},
{
"name": "defaultGreetingMessage",
"value": true
},
{
"name": "backgroundAPI",
"value": "mue"
},
{
"name": "ampm",
"value": true
},
{
"name": "copyButton",
"value": false
},
{
"name": "installed",
"value": "[]"
},
{
"name": "searchEngine",
"value": "duckduckgo"
},
{
"name": "refresh",
"value": true
},
{
"name": "view",
"value": true
},
{
"name": "favouriteEnabled",
"value": true
},
{
"name": "tweetButton",
"value": false
},
{
"name": "favouriteQuoteEnabled",
"value": false
},
{
"name": "showWelcome",
"value": true
},
{
"name": "quotelanguage",
"value": "English"
},
{
"name": "date",
"value": "false"
}
]

View File

@ -6,30 +6,30 @@ const hexRegexp = /(^#{0,1}[0-9A-F]{6}$)|(^#{0,1}[0-9A-F]{3}$)|(^#{0,1}[0-9A-F]{
const regexp = /([0-9A-F])([0-9A-F])([0-9A-F])/i;
export default function hexToRgb(value) {
const valid = hexRegexp.test(value);
const valid = hexRegexp.test(value);
if (valid) {
if (value[0] === '#') {
value = value.slice(1, value.length);
}
if (value.length === 3){
value = value.replace(regexp, '$1$1$2$2$3$3');
}
const red = parseInt(value.substr(0, 2), 16);
const green = parseInt(value.substr(2, 2), 16);
const blue = parseInt(value.substr(4, 2), 16);
const alpha = parseInt(value.substr(6, 2), 16) / 255;
const color = setRgba(red, green, blue, alpha);
const hsv = rgbToHsv({ ...color });
return {
...color,
...hsv,
};
if (valid) {
if (value[0] === '#') {
value = value.slice(1, value.length);
}
return false;
if (value.length === 3){
value = value.replace(regexp, '$1$1$2$2$3$3');
}
const red = parseInt(value.substr(0, 2), 16);
const green = parseInt(value.substr(2, 2), 16);
const blue = parseInt(value.substr(4, 2), 16);
const alpha = parseInt(value.substr(6, 2), 16) / 255;
const color = setRgba(red, green, blue, alpha);
const hsv = rgbToHsv({ ...color });
return {
...color,
...hsv,
};
}
return false;
}

View File

@ -1,19 +1,19 @@
export default function rgbToHex(red, green, blue) {
let r16 = red.toString(16);
let g16 = green.toString(16);
let b16 = blue.toString(16);
let r16 = red.toString(16);
let g16 = green.toString(16);
let b16 = blue.toString(16);
if (red < 16) {
r16 = `0${r16}`;
}
if (red < 16) {
r16 = `0${r16}`;
}
if (green < 16) {
g16 = `0${g16}`;
}
if (blue < 16) {
b16 = `0${b16}`;
}
if (green < 16) {
g16 = `0${g16}`;
}
return r16 + g16 + b16;
if (blue < 16) {
b16 = `0${b16}`;
}
return r16 + g16 + b16;
}

View File

@ -1,41 +1,41 @@
export default function rgbToHSv({ red, green, blue }) {
let rr, gg, bb, h, s;
let rr, gg, bb, h, s;
const rabs = red / 255;
const gabs = green / 255;
const babs = blue / 255;
const rabs = red / 255;
const gabs = green / 255;
const babs = blue / 255;
const v = Math.max(rabs, gabs, babs);
const diff = v - Math.min(rabs, gabs, babs);
const diffc = c => (v - c) / 6 / diff + 1 / 2;
const v = Math.max(rabs, gabs, babs);
const diff = v - Math.min(rabs, gabs, babs);
const diffc = c => (v - c) / 6 / diff + 1 / 2;
if (diff === 0) {
h = 0;
s = 0;
} else {
s = diff / v;
rr = diffc(rabs);
gg = diffc(gabs);
bb = diffc(babs);
if (diff === 0) {
h = 0;
s = 0;
} else {
s = diff / v;
rr = diffc(rabs);
gg = diffc(gabs);
bb = diffc(babs);
if (rabs === v){
h = bb - gg;
} else if (gabs === v) {
h = (1 / 3) + rr - bb;
} else if (babs === v) {
h = (2 / 3) + gg - rr;
}
if (h < 0) {
h += 1;
} else if (h > 1) {
h -= 1;
}
if (rabs === v){
h = bb - gg;
} else if (gabs === v) {
h = (1 / 3) + rr - bb;
} else if (babs === v) {
h = (2 / 3) + gg - rr;
}
return {
hue: Math.round(h * 360),
saturation: Math.round(s * 100),
value: Math.round(v * 100),
};
if (h < 0) {
h += 1;
} else if (h > 1) {
h -= 1;
}
}
return {
hue: Math.round(h * 360),
saturation: Math.round(s * 100),
value: Math.round(v * 100),
};
}

View File

@ -1,19 +1,19 @@
const isValidRGBValue = (value) => {
return (typeof (value) === 'number' && Number.isNaN(value) === false && value >= 0 && value <= 255);
return (typeof (value) === 'number' && Number.isNaN(value) === false && value >= 0 && value <= 255);
}
export default function setRGBA(red, green, blue, alpha) {
if (isValidRGBValue(red) && isValidRGBValue(green) && isValidRGBValue(blue)) {
const color = {
red: red | 0,
green: green | 0,
blue: blue | 0,
};
if (isValidRGBValue(red) && isValidRGBValue(green) && isValidRGBValue(blue)) {
const color = {
red: red | 0,
green: green | 0,
blue: blue | 0,
};
if (isValidRGBValue(alpha) === true) {
color.alpha = alpha | 0;
}
return color;
if (isValidRGBValue(alpha) === true) {
color.alpha = alpha | 0;
}
return color;
}
}

View File

@ -1,86 +1,86 @@
import { toast } from 'react-toastify';
export default class MarketplaceFunctions {
static urlParser (input) { // based on https://stackoverflow.com/questions/37684/how-to-replace-plain-urls-with-links
const urlPattern = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_+.~#?&//=]*)/;
return input.replace(urlPattern, '<a href="$&" target="_blank">$&</a>');
static urlParser (input) { // based on https://stackoverflow.com/questions/37684/how-to-replace-plain-urls-with-links
const urlPattern = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_+.~#?&//=]*)/;
return input.replace(urlPattern, '<a href="$&" target="_blank">$&</a>');
}
static uninstall(name, type) {
switch (type) {
case 'settings':
const oldSettings = JSON.parse(localStorage.getItem('backup_settings'));
localStorage.clear();
oldSettings.forEach(item => localStorage.setItem(item.name, item.value));
break;
case 'quote_packs':
localStorage.removeItem('quote_packs');
localStorage.removeItem('quoteAPI');
break;
default:
try {
localStorage.removeItem(type);
} catch (e) {
toast('Failed to uninstall addon, check the console');
console.error(e);
}
}
static uninstall(name, type) {
switch (type) {
case 'settings':
const oldSettings = JSON.parse(localStorage.getItem('backup_settings'));
localStorage.clear();
oldSettings.forEach(item => localStorage.setItem(item.name, item.value));
break;
case 'quote_packs':
localStorage.removeItem('quote_packs');
localStorage.removeItem('quoteAPI');
break;
default:
try {
localStorage.removeItem(type);
} catch (e) {
toast('Failed to uninstall addon, check the console');
console.error(e);
}
let installed = JSON.parse(localStorage.getItem('installed'));
for (let i = 0; i < installed.length; i++) {
if (installed[i].name === name) {
installed.splice(i, 1);
break;
}
}
localStorage.setItem('installed', JSON.stringify(installed));
}
static install(type, input, sideload) {
switch (type) {
case 'settings':
localStorage.removeItem('backup_settings');
let oldSettings = [];
for (const key of Object.keys(localStorage)) {
oldSettings.push({
name: key,
value: localStorage.getItem(key)
});
}
let installed = JSON.parse(localStorage.getItem('installed'));
for (let i = 0; i < installed.length; i++) {
if (installed[i].name === name) {
installed.splice(i, 1);
break;
}
localStorage.setItem('backup_settings', JSON.stringify(oldSettings));
input.settings.forEach(element => localStorage.setItem(element.name, element.value));
break;
case 'photo_packs':
localStorage.setItem('photo_packs', JSON.stringify(input.photos));
break;
case 'quote_packs':
if (input.quote_api) {
localStorage.setItem('quoteAPI', JSON.stringify(input.quote_api));
}
localStorage.setItem('installed', JSON.stringify(installed));
localStorage.setItem('quote_packs', JSON.stringify(input.quotes));
break;
default:
break;
}
static install(type, input, sideload) {
switch (type) {
case 'settings':
localStorage.removeItem('backup_settings');
let installed = JSON.parse(localStorage.getItem('installed'));
let oldSettings = [];
for (const key of Object.keys(localStorage)) {
oldSettings.push({
name: key,
value: localStorage.getItem(key)
});
}
localStorage.setItem('backup_settings', JSON.stringify(oldSettings));
input.settings.forEach(element => localStorage.setItem(element.name, element.value));
break;
case 'photo_packs':
localStorage.setItem('photo_packs', JSON.stringify(input.photos));
break;
case 'quote_packs':
if (input.quote_api) {
localStorage.setItem('quoteAPI', JSON.stringify(input.quote_api));
}
localStorage.setItem('quote_packs', JSON.stringify(input.quotes));
break;
default:
break;
if (sideload) {
installed.push({
content: {
updated: 'Unpublished',
data: input
}
let installed = JSON.parse(localStorage.getItem('installed'));
if (sideload) {
installed.push({
content: {
updated: 'Unpublished',
data: input
}
});
} else {
installed.push(input);
}
localStorage.setItem('installed', JSON.stringify(installed));
});
} else {
installed.push(input);
}
}
localStorage.setItem('installed', JSON.stringify(installed));
}
}

View File

@ -1,19 +1,19 @@
export default function deepmerge(...objects) {
let target = {};
let target = {};
const merge = (obj) => {
for (let prop in obj) {
if (obj.hasOwnProperty(prop)) {
if (typeof obj[prop] === 'object') {
target[prop] = deepmerge(target[prop], obj[prop]);
} else {
target[prop] = obj[prop];
}
}
const merge = (obj) => {
for (let prop in obj) {
if (obj.hasOwnProperty(prop)) {
if (typeof obj[prop] === 'object') {
target[prop] = deepmerge(target[prop], obj[prop]);
} else {
target[prop] = obj[prop];
}
};
}
}
};
objects.forEach(object => merge(object));
objects.forEach(object => merge(object));
return target;
}
return target;
}

View File

@ -2,112 +2,112 @@ const defaultSettings = require('../default_settings.json');
const languages = require('../languages.json');
const saveFile = (data, filename = 'file') => {
if (typeof data === 'object') {
data = JSON.stringify(data, undefined, 4);
}
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');
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(':');
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);
e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(e);
};
export default class SettingsFunctions {
static exportSettings() {
let settings = {};
for (const key of Object.keys(localStorage)) {
settings[key] = localStorage.getItem(key);
}
saveFile(settings, 'mue-settings.json');
static exportSettings() {
let settings = {};
for (const key of Object.keys(localStorage)) {
settings[key] = localStorage.getItem(key);
}
saveFile(settings, 'mue-settings.json');
}
static setItem(key, value) {
const old = localStorage.getItem(key);
let val = true;
if (old !== null && !value) {
if (old === 'true') {
val = false;
}
if (old === 'false') {
val = true;
}
}
static setItem(key, value) {
const old = localStorage.getItem(key);
let val = true;
localStorage.setItem(key, val);
}
if (old !== null && !value) {
if (old === 'true') {
val = false;
}
static setDefaultSettings(reset) {
localStorage.clear();
defaultSettings.forEach((element) => localStorage.setItem(element.name, element.value));
if (old === 'false') {
val = true;
}
}
localStorage.setItem(key, val);
// Set theme depending on user preferred
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
localStorage.setItem('darkTheme', true);
} else {
localStorage.setItem('darkTheme', false);
}
static setDefaultSettings(reset) {
localStorage.clear();
defaultSettings.forEach((element) => localStorage.setItem(element.name, element.value));
// Languages
const languageCodes = languages.map(({ code }) => code);
const browserLanguage = (navigator.languages && navigator.languages[0]) || navigator.language;
// Set theme depending on user preferred
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
localStorage.setItem('darkTheme', true);
} else {
localStorage.setItem('darkTheme', false);
}
// Languages
const languageCodes = languages.map(({ code }) => code);
const browserLanguage = (navigator.languages && navigator.languages[0]) || navigator.language;
if (languageCodes.includes(browserLanguage)) {
localStorage.setItem('language', browserLanguage);
if (browserLanguage !== 'en-GB' || browserLanguage !== 'en-US') {
document.documentElement.lang = browserLanguage;
}
} else {
localStorage.setItem('language', 'en-GB');
}
if (reset) {
localStorage.setItem('showWelcome', false);
}
// Finally we set this to true so it doesn't run the function on every load
localStorage.setItem('firstRun', true);
window.location.reload();
if (languageCodes.includes(browserLanguage)) {
localStorage.setItem('language', browserLanguage);
if (browserLanguage !== 'en-GB' || browserLanguage !== 'en-US') {
document.documentElement.lang = browserLanguage;
}
} else {
localStorage.setItem('language', 'en-GB');
}
static loadSettings() {
const css = localStorage.getItem('customcss');
if (css) {
document.head.insertAdjacentHTML('beforeend', '<style>' + css + '</style>');
}
if (localStorage.getItem('darkTheme') === 'true') {
document.getElementsByClassName('Toastify')[0].classList.add('dark');
}
const font = localStorage.getItem('font');
if (font) {
const data = JSON.parse(font);
let url = '';
if (data.google === true) {
url = `@import url('https://fonts.googleapis.com/css2?family=${data.name}&display=swap');`;
if (reset) {
localStorage.setItem('showWelcome', false);
}
// Finally we set this to true so it doesn't run the function on every load
localStorage.setItem('firstRun', true);
window.location.reload();
}
static loadSettings() {
const css = localStorage.getItem('customcss');
if (css) {
document.head.insertAdjacentHTML('beforeend', '<style>' + css + '</style>');
}
if (localStorage.getItem('darkTheme') === 'true') {
document.getElementsByClassName('Toastify')[0].classList.add('dark');
}
const font = localStorage.getItem('font');
if (font) {
const data = JSON.parse(font);
let url = '';
if (data.google === true) {
url = `@import url('https://fonts.googleapis.com/css2?family=${data.name}&display=swap');`;
}
document.head.insertAdjacentHTML('beforeend', `
<style>
${url}
* {
font-family: '${data.name}', 'Lexend Deca' !important;
}
document.head.insertAdjacentHTML('beforeend', `
<style>
${url}
* {
font-family: '${data.name}', 'Lexend Deca' !important;
}
</style>`);
}
const zoom = localStorage.getItem('zoom');
if (zoom !== 100) { // don't bother if it's default zoom
document.body.style.zoom = zoom + '%';
}
</style>`);
}
}
const zoom = localStorage.getItem('zoom');
if (zoom !== 100) { // don't bother if it's default zoom
document.body.style.zoom = zoom + '%';
}
}
}

View File

@ -1,30 +1,30 @@
[
{
"text": "English (UK)",
"code": "en-GB"
},
{
"text": "English (US)",
"code": "en-US"
},
{
"text": "Español",
"code": "es"
},
{
"text": "Français",
"code": "fr"
},
{
"text": "Nederlands",
"code": "nl"
},
{
"text": "Norsk",
"code": "no"
},
{
"text": "Pусский",
"code": "ru"
}
]
{
"text": "English (UK)",
"code": "en-GB"
},
{
"text": "English (US)",
"code": "en-US"
},
{
"text": "Español",
"code": "es"
},
{
"text": "Français",
"code": "fr"
},
{
"text": "Nederlands",
"code": "nl"
},
{
"text": "Norsk",
"code": "no"
},
{
"text": "Pусский",
"code": "ru"
}
]

View File

@ -1,6 +1,6 @@
[
{
"login": "FuryingFox",
"avatar_url": "https://avatars.githubusercontent.com/u/28787893?v=4"
}
]
{
"login": "FuryingFox",
"avatar_url": "https://avatars.githubusercontent.com/u/28787893?v=4"
}
]

View File

@ -1,31 +1,31 @@
// credit: https://joshbroton.com/quick-fix-sass-mixins-for-css-keyframe-animations/
// source: https://joshbroton.com/quick-fix-sass-mixins-for-css-keyframe-animations/
@mixin animation($animate...) {
$max: length($animate);
$animations: '';
$max: length($animate);
$animations: '';
@for $i from 1 through $max {
$animations: #{$animations + nth($animate, $i)};
@for $i from 1 through $max {
$animations: #{$animations + nth($animate, $i)};
@if $i < $max {
$animations: #{$animations + ', '};
}
@if $i < $max {
$animations: #{$animations + ', '};
}
}
-webkit-animation: $animations;
-moz-animation: $animations;
animation: $animations;
-webkit-animation: $animations;
-moz-animation: $animations;
animation: $animations;
}
@mixin keyframes($animationName) {
@-webkit-keyframes #{$animationName} {
@content;
}
@-webkit-keyframes #{$animationName} {
@content;
}
@-moz-keyframes #{$animationName} {
@content;
}
@-moz-keyframes #{$animationName} {
@content;
}
@keyframes #{$animationName} {
@content;
}
}
@keyframes #{$animationName} {
@content;
}
}

View File

@ -28,4 +28,4 @@ $button-colours: (
$main-parts: (
'shadow': 0 0 1rem 0 rgba(0, 0, 0, .2),
);
);

View File

@ -13,46 +13,46 @@
@import 'modules/modals/welcome';
body {
background: #2f3640;
margin: 0;
overflow: hidden;
background: #2f3640;
margin: 0;
overflow: hidden;
}
* {
font-family: 'Lexend Deca', 'Roboto' !important;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
outline: none;
font-family: 'Lexend Deca', 'Roboto' !important;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
outline: none;
}
#center {
margin-left: 2vw;
margin-right: 2vw;
display: flex;
flex-direction: column;
justify-content: center;
font-size: calc(10px + 2vmin);
text-align: center;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
text-shadow: 0 0 25px rgba(0, 0, 0, 0.3);
margin-left: 2vw;
margin-right: 2vw;
display: flex;
flex-direction: column;
justify-content: center;
font-size: calc(10px + 2vmin);
text-align: center;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
text-shadow: 0 0 25px rgba(0, 0, 0, 0.3);
}
::placeholder {
color: map-get($theme-colours, 'main');
opacity: 1;
color: map-get($theme-colours, 'main');
opacity: 1;
}
::selection {
background-color: #c2c2c2;
background-color: #c2c2c2;
}
#root {
min-height: 100vh;
display: grid;
color: map-get($theme-colours, 'main-text-color');
}
min-height: 100vh;
display: grid;
color: map-get($theme-colours, 'main-text-color');
}

View File

@ -198,4 +198,4 @@ input[type=number]::-webkit-outer-spin-button {
&:hover {
color: map-get($button-colours, 'other');
}
}
}

View File

@ -22,4 +22,4 @@
background: url('data:image/gif;base64,R0lGODlhBgAGAKEDAFVVVX9/f9TU1CgmNyH5BAEKAAMALAAAAAAGAAYAAAIODA4hCDKWxlhNvmCnGwUAOw==') right center no-repeat, linear-gradient(180deg, #ffb032 0%, #dd3b67 100%) !important;
background-position: calc(100% - 5px) center !important;
}
}
}

View File

@ -189,4 +189,4 @@ p.description {
font-size: 35px !important;
margin-bottom: -30px;
}
}
}

View File

@ -208,4 +208,4 @@ input[type=color]::-moz-color-swatch {
.MuiCheckbox-colorPrimary.Mui-checked {
color: map-get($button-colours, 'reset') !important;
}
}

View File

@ -1,40 +1,40 @@
.Toastify__toast-body {
color: #000000 !important;
font-size: 16px !important;
padding: 15px 20px !important;
color: #000000 !important;
font-size: 16px !important;
padding: 15px 20px !important;
}
.Toastify__toast {
border-radius: 12px !important;
min-height: auto !important;
height: auto !important;
width: auto !important;
min-width: auto !important;
padding: 0px !important;
border-radius: 12px !important;
min-height: auto !important;
height: auto !important;
width: auto !important;
min-width: auto !important;
padding: 0px !important;
}
.Toastify__close-button {
margin-top: 10px;
margin-right: 10px;
margin-top: 10px;
margin-right: 10px;
}
.Toastify__progress-bar--default {
height: 3px !important;
background: #000000 !important;
height: 3px !important;
background: #000000 !important;
}
.Toastify__toast-container {
width: auto !important;
width: auto !important;
}
.dark {
.Toastify__toast {
background-color: #2f3542 !important;
}
.Toastify__toast {
background-color: #2f3542 !important;
}
.Toastify__toast-body,
.Toastify__progress-bar--default,
.Toastify__close-button {
color: white !important;
}
.Toastify__toast-body,
.Toastify__progress-bar--default,
.Toastify__close-button {
color: white !important;
}
}

View File

@ -1,52 +1,52 @@
#feedbackmodal {
position: absolute;
margin: auto;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 400px;
height: 100px;
position: absolute;
margin: auto;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 400px;
height: 100px;
}
.feedback {
width: 400px;
padding: 5px;
width: 400px;
padding: 5px;
h1,
.closeModal {
font-size: 2.5em;
}
h1,
.closeModal {
font-size: 2.5em;
}
span {
font-size: 6em;
}
span {
font-size: 6em;
}
button {
width: 100%;
border-radius: 48px;
outline: none;
border: none;
padding: 15px 20px;
font-size: 1.5em;
background: linear-gradient(90deg, #ffb032 0%, #dd3b67 100%);
color: #ffffff;
text-transform: uppercase;
cursor: pointer;
}
button {
width: 100%;
border-radius: 48px;
outline: none;
border: none;
padding: 15px 20px;
font-size: 1.5em;
background: linear-gradient(90deg, #ffb032 0%, #dd3b67 100%);
color: #ffffff;
text-transform: uppercase;
cursor: pointer;
}
input[type=text] {
width: 100%;
font-size: 1em;
}
input[type=text] {
width: 100%;
font-size: 1em;
}
input[type=range] {
margin-left: 20px;
margin-right: 20px;
vertical-align: middle;
}
input[type=range] {
margin-left: 20px;
margin-right: 20px;
vertical-align: middle;
}
label.values {
font-weight: 700;
}
}
label.values {
font-weight: 700;
}
}

View File

@ -1,362 +1,362 @@
.Modal {
color: map-get($modal, 'text');
background-color: map-get($modal, 'background');
box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);
border: none;
opacity: 1;
z-index: -2;
padding: 25px;
transition: 0.6s;
transition-timing-function: ease-in;
border-radius: map-get($modal, 'border-radius');
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
scrollbar-width: thin;
scrollbar-color: #34495e #bdc3c7;
position: relative;
color: map-get($modal, 'text');
background-color: map-get($modal, 'background');
box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);
border: none;
opacity: 1;
z-index: -2;
padding: 25px;
transition: 0.6s;
transition-timing-function: ease-in;
border-radius: map-get($modal, 'border-radius');
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
scrollbar-width: thin;
scrollbar-color: #34495e #bdc3c7;
position: relative;
&:focus {
outline: 0;
}
&:focus {
outline: 0;
}
}
.modalLink {
color: #5352ed;
cursor: pointer;
padding-left: 10px;
color: #5352ed;
cursor: pointer;
padding-left: 10px;
&:hover {
opacity: 0.8;
}
&:hover {
opacity: 0.8;
}
}
.closeModal {
position: absolute;
top: 1rem;
right: 2rem;
font-size: 4em;
cursor: pointer;
position: absolute;
top: 1rem;
right: 2rem;
font-size: 4em;
cursor: pointer;
&:hover {
color: grey;
}
&:hover {
color: grey;
}
}
.dark {
background-color: #2f3542 !important;
color: white !important;
background-color: #2f3542 !important;
color: white !important;
.sidebar {
background-color: #2a303b !important;
}
.sidebar {
background-color: #2a303b !important;
}
.tab-list-active {
background: rgba(161, 159, 159, 0.8);
}
.tab-list-active {
background: rgba(161, 159, 159, 0.8);
}
.tab-list-item {
&:hover {
background: rgba(161, 159, 159, 0.8);
}
.tab-list-item {
&:hover {
background: rgba(161, 159, 159, 0.8);
}
}
}
.ReactModal__Html--open,
.ReactModal__Body--open {
overflow: hidden;
overflow: hidden;
}
.Overlay {
position: fixed;
z-index: 100;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100vw;
height: 100vh;
display: flex;
align-items: baseline;
justify-content: center;
position: fixed;
z-index: 100;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100vw;
height: 100vh;
display: flex;
align-items: baseline;
justify-content: center;
}
.ReactModal__Content {
min-height: calc(100vh - 30vh);
max-height: calc(100vh - 10vh);
box-shadow: 0 0 30px 0 rgba(0, 0, 0, 0.25);
overflow-y: auto;
position: relative;
min-height: calc(100vh - 30vh);
max-height: calc(100vh - 10vh);
box-shadow: 0 0 30px 0 rgba(0, 0, 0, 0.25);
overflow-y: auto;
position: relative;
}
@media only screen and (max-height: 700px) {
.ReactModal__Content {
min-height: 500px;
max-height: calc(100vh - 30vh);
}
.ReactModal__Content {
min-height: 500px;
max-height: calc(100vh - 30vh);
}
}
@media only screen and (min-height: 700px) {
.ReactModal__Content {
min-height: 600px;
}
.ReactModal__Content {
min-height: 600px;
}
}
.content {
margin-top: -20px;
width: 900px;
margin-top: -20px;
width: 900px;
h1 {
font-size: 35px;
}
p {
font-size: 16px;
}
.columns {
font-size: 15px;
li {
padding-left: 10px;
}
h1 {
font-size: 35px;
}
p {
font-size: 16px;
}
.columns {
font-size: 15px;
li {
padding-left: 10px;
}
}
}
.ReactModal__Overlay {
opacity: 0;
transform: scale(0);
transition: all 300ms cubic-bezier(.47, 1.64, .41, .8);
opacity: 0;
transform: scale(0);
transition: all 300ms cubic-bezier(.47, 1.64, .41, .8);
}
.ReactModal__Overlay--after-open {
opacity: 1;
transform: scale(1);
opacity: 1;
transform: scale(1);
}
.ReactModal__Overlay--before-close {
opacity: 0;
transform: scale(0);
opacity: 0;
transform: scale(0);
}
ul.sidebar {
position: absolute;
top: 0;
left: 0;
margin: 0;
padding-left: 0;
height: 100%;
background: #f0f0f0;
left: 0;
border-radius: 12px 0 0 12px;
text-align: left;
font-size: 24px;
position: absolute;
top: 0;
left: 0;
margin: 0;
padding-left: 0;
height: 100%;
background: #f0f0f0;
left: 0;
border-radius: 12px 0 0 12px;
text-align: left;
font-size: 24px;
h1 {
text-align: center;
}
h1 {
text-align: center;
}
svg,
li {
font-size: 30px;
}
svg,
li {
font-size: 30px;
}
svg {
vertical-align: middle;
font-size: 32px;
padding: 5px;
}
svg {
vertical-align: middle;
font-size: 32px;
padding: 5px;
}
hr {
height: 3px;
background: rgba(196, 196, 196, 0.74);
width: 75%;
outline: none;
border: none;
}
hr {
height: 3px;
background: rgba(196, 196, 196, 0.74);
width: 75%;
outline: none;
border: none;
}
}
li {
list-style: none;
font-size: 24px;
padding: 5px 30px 5px 30px;
cursor: pointer;
margin-top: 2px;
list-style: none;
font-size: 24px;
padding: 5px 30px 5px 30px;
cursor: pointer;
margin-top: 2px;
}
#modal {
position: absolute;
margin: auto;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 60%;
height: 80%;
position: absolute;
margin: auto;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 60%;
height: 80%;
}
.tab-list-active {
background: rgba(219, 219, 219, 0.72);
background: rgba(219, 219, 219, 0.72);
}
@media only screen and (max-width: 1200px) {
li.tab-list-item {
span {
display: none;
}
li.tab-list-item {
span {
display: none;
}
}
}
@media only screen and (max-width: 1200px) {
ul.sidebar {
h1 {
display: none;
}
ul.sidebar {
h1 {
display: none;
}
}
}
.tab-list-item {
&:hover {
background: rgba(219, 219, 219, 0.8);
}
&:hover {
background: rgba(219, 219, 219, 0.8);
}
}
ul.sectionSelector {
margin: 0;
width: 60%;
padding-left: 30%;
padding-top: 20px;
margin: 0;
width: 60%;
padding-left: 30%;
padding-top: 20px;
.option {
display: inline;
padding: 15px;
font-size: 28px;
}
.option {
display: inline;
padding: 15px;
font-size: 28px;
}
}
@media only screen and (max-width: 1200px) {
ul.sectionSelector {
span {
display: none;
padding: 5px !important;
}
ul.sectionSelector {
span {
display: none;
padding: 5px !important;
}
}
}
.tab-content {
position: absolute;
left: 30%;
width: 60%;
position: absolute;
left: 30%;
width: 60%;
h3 {
text-transform: uppercase;
}
h3 {
text-transform: uppercase;
}
}
@media only screen and (min-width: 1300px) {
.tab-content {
position: absolute;
left: 30%;
}
.tab-content {
position: absolute;
left: 30%;
}
}
.navbar-item {
font-size: 22px;
font-weight: 500;
display: inline-flex;
font-size: 22px;
font-weight: 500;
display: inline-flex;
}
.modalNavbar {
position: absolute;
left: 20rem;
top: 1rem;
justify-content: center;
position: absolute;
left: 20rem;
top: 1rem;
justify-content: center;
svg {
margin-right: 0.5rem;
padding: 3px;
}
svg {
margin-right: 0.5rem;
padding: 3px;
}
}
@media only screen and (max-width: 1200px) {
.modalNavbar {
left: 6rem;
}
.modalNavbar {
left: 6rem;
}
}
.navbar-item {
span,
svg {
font-size: 1.1em !important;
}
span,
svg {
font-size: 1.1em !important;
}
&:hover {
background: none;
}
&:hover {
background: none;
}
}
@media only screen and (max-width: 1200px) {
li.navbar-item {
span {
display: none;
}
li.navbar-item {
span {
display: none;
}
}
}
.tabIndicator {
width: 40px;
height: 3px;
background: #000;
width: 40px;
height: 3px;
background: #000;
}
@media only screen and (max-width: 1200px) {
.tabContent {
left: 20px;
}
.tabContent {
left: 20px;
}
}
@media only screen and (min-width: 1200px) {
ul.sidebar {
width: 310px;
align-items: center;
}
ul.sidebar {
width: 310px;
align-items: center;
}
}
.navbar-item-active {
background: map-get($theme-colours, 'gradient');
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
svg {
color: orange;
}
&:hover {
opacity: .8;
background: map-get($theme-colours, 'gradient');
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
svg {
color: orange;
}
&:hover {
opacity: .8;
background: map-get($theme-colours, 'gradient');
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
}
}
::-webkit-scrollbar {
width: 13px;
background: #bdc3c7;
border-top-right-radius: map-get($modal, 'border-radius');
border-bottom-right-radius: map-get($modal, 'border-radius');
width: 13px;
background: #bdc3c7;
border-top-right-radius: map-get($modal, 'border-radius');
border-bottom-right-radius: map-get($modal, 'border-radius');
}
::-webkit-scrollbar-thumb {
background: #34495e;
border-top-right-radius: map-get($modal, 'border-radius');
border-bottom-right-radius: map-get($modal, 'border-radius');
background: #34495e;
border-top-right-radius: map-get($modal, 'border-radius');
border-bottom-right-radius: map-get($modal, 'border-radius');
}
.abouticon {
width: 96px;
height: auto;
border-radius: 50%;
padding-right: 5px;
}
width: 96px;
height: auto;
border-radius: 50%;
padding-right: 5px;
}

View File

@ -1,14 +1,14 @@
.updateContent {
width: 400px;
padding: 5px;
width: 400px;
padding: 5px;
.closeModal {
margin-top: 10px;
font-size: 45px;
}
.closeModal {
margin-top: 10px;
font-size: 45px;
}
img {
width: 100%;
height: auto;
}
}
img {
width: 100%;
height: auto;
}
}

View File

@ -1,58 +1,60 @@
.dark {
h2.subtitle, svg {
color: white !important;
}
h2.subtitle, svg {
color: white !important;
}
}
.welcomeModalText {
line-height: 2px;
line-height: 2px;
h2.subtitle {
font-size: 24px;
color: #535353;
text-transform: uppercase;
}
h2.subtitle {
font-size: 24px;
color: #535353;
text-transform: uppercase;
}
h1.welcometitle {
font-size: 50px;
}
h1.welcometitle {
font-size: 50px;
}
}
.welcomeContent {
text-align: center;
padding: 25px;
text-align: center;
padding: 25px;
a {
text-decoration: none;
line-height: 20px !important;
color: #5352ED;
cursor: pointer;
&:hover {
opacity: 0.8;
}
}
a {
text-decoration: none;
line-height: 20px !important;
color: #5352ED;
cursor: pointer;
img.icon, svg {
margin-top: -12px;
padding: 10px;
cursor: pointer;
transition: ease 0.2s;
&:hover {
transform: scale(1.1);
}
&:hover {
opacity: 0.8;
}
}
p {
margin-top: 0.7rem;
line-height: 1em;
}
img.icon, svg {
margin-top: -12px;
padding: 10px;
cursor: pointer;
transition: ease 0.2s;
img, svg {
height: 24px;
width: auto;
&:hover {
transform: scale(1.1);
}
}
p {
margin-top: 0.7rem;
line-height: 1em;
}
img, svg {
height: 24px;
width: auto;
}
}
.welcomeLink {
color: black !important;
}
color: black !important;
}

View File

@ -1,17 +1,17 @@
// The following CSS is to work around some assumptions made by the react-color-gradient-picker
* {
box-sizing: inherit; // Required to work around https://github.com/arthay/react-color-gradient-picker/issues/11
box-sizing: inherit; // Required to work around https://github.com/arthay/react-color-gradient-picker/issues/11
}
div.picker-area > div.preview > div.color-hue-alpha > div.alpha,
div.color-preview-area > div > div:nth-child(5) {
display: none;
display: none;
}
.ui-color-picker {
margin: 8px -12px;
margin: 8px -12px;
}
.input-field .label {
color: inherit;
}
color: inherit;
}

View File

@ -1,199 +1,199 @@
{
"widgets": {
"greeting": {
"morning": "Good Morning",
"afternoon": "Good Afternoon",
"evening": "Good Evening",
"christmas": "Merry Christmas",
"newyear": "Happy New Year",
"halloween": "Happy Halloween"
},
"background": {
"credit": "Photo by",
"information": "Information"
},
"search": "Search",
"navbar": {
"tooltips": {
"update": "Update Patch Notes",
"refresh": "Refresh Page"
},
"notes": {
"title": "Notes",
"placeholder": "Type here"
}
}
"widgets": {
"greeting": {
"morning": "Good Morning",
"afternoon": "Good Afternoon",
"evening": "Good Evening",
"christmas": "Merry Christmas",
"newyear": "Happy New Year",
"halloween": "Happy Halloween"
},
"modals": {
"main": {
"title": "Options",
"loading": "Loading...",
"navbar": {
"settings": "Settings",
"addons": "My Add-ons",
"marketplace": "Marketplace"
},
"settings": {
"sections": {
"time": {
"title": "Time",
"seconds": "Seconds",
"twentyfourhour": "24 Hour",
"ampm": "AM/PM (12 hour)",
"zero": "Zero-padded",
"analog": "Analog",
"percentageComplete": "Percentage of the Day Complete",
"date": {
"title": "Date",
"short_date": "Short Date",
"short_format": "Short Format",
"short_separator": {
"title": "Short Separator",
"default": "Default",
"dash": "Dash",
"gaps": "Gaps"
}
}
},
"quote": {
"title": "Quote",
"buttons": "Buttons",
"copy": "Copy",
"tweet": "Tweet",
"favourite": "Favourite"
},
"greeting": {
"title": "Greeting",
"events": "Events",
"default": "Default Greeting Message",
"name": "Name for greeting",
"birthday_enabled": "Birthday Enabled",
"birthday_date": "Birthday Date"
},
"background": {
"title": "Background",
"api": "Background API",
"blur": "Adjust Blur",
"brightness": "Adjust Brightness",
"custom_url": "Custom Background URL",
"custom_background": "Custom Background",
"custom_colour": "Custom Background Colour",
"upload": "Upload",
"add_colour": "Add colour",
"favourite": "Favourite",
"view": "View",
"refresh": "Refresh",
"disabled": "Disabled"
},
"search": {
"title": "Search",
"search_engine": "Search Engine",
"custom": "Custom Search URL"
},
"appearance": "Appearance",
"language": "Language",
"changelog": "Change Log",
"about": {
"title": "About",
"about": {
"copyright": "Copyright",
"version": {
"title": "Version",
"update_available": "Update available",
"no_update": "No update available"
},
"resources_used": {
"title": "Resources Used",
"bg_images": "Background Images",
"pin_icon": "Pin Icon"
},
"contributors": "Contributors",
"supporters": "Supporters"
}
}
},
"buttons": {
"apply": "Apply",
"reset": "Reset",
"import": "Import",
"export": "Export"
}
},
"marketplace": {
"photo_packs": "Photo Packs",
"quote_packs": "Quote Packs",
"preset_settings": "Preset Settings",
"themes": "Themes",
"product": {
"overview": "Overview",
"information": "Information",
"last_updated": "Last Updated",
"version": "Version",
"author": "Author",
"notice": {
"title": "Notice",
"description": "In order for the change to take place, the page must be refreshed."
},
"buttons": {
"addtomue": "Add To Mue",
"remove": "Remove"
},
"quote_warning": {
"title": "Warning",
"description": "This quote pack requests to external servers that may track you!"
}
},
"offline": {
"title": "Looks like you're offline",
"description": "Please connect to the internet."
},
"see_more": "See More"
},
"addons": {
"added": "Added",
"empty": {
"title": "It's empty here",
"description": "Head to the marketplace to add some.",
"button": "Take me there"
},
"sideload": "Sideload"
}
},
"update": {
"title": "Update",
"offline": {
"title": "Offline",
"description": "Cannot get update logs while in offline mode"
},
"error": {
"title": "Error",
"description": "Could not connect to the server"
},
"read_blog": "Read on the blog here",
"contact_support": "Contact us here"
},
"welcome": {
"title": "Welcome to",
"information": "Information",
"thankyoumessage1": "Thank you for downloading Mue Tab,",
"thankyoumessage2": "we hope you enjoy your time with our extension.",
"support": "Support",
"close": "Close"
},
"feedback": {
"title": "Give us feedback",
"question_one": "How would you rate your experience of this Mue build?",
"question_two": "What bugs did you encounter in your use of Mue?",
"question_three": "How likely would you be to recommend this version of Mue to a friend of colleague?",
"submit": "Submit"
}
"background": {
"credit": "Photo by",
"information": "Information"
},
"toasts": {
"quote": "Quote copied",
"reset": "Reset successfully",
"imported": "Successfully imported",
"installed": "Successfully installed",
"uninstalled": "Successfully removed",
"error": "Something went wrong"
"search": "Search",
"navbar": {
"tooltips": {
"update": "Update Patch Notes",
"refresh": "Refresh Page"
},
"notes": {
"title": "Notes",
"placeholder": "Type here"
}
}
}
},
"modals": {
"main": {
"title": "Options",
"loading": "Loading...",
"navbar": {
"settings": "Settings",
"addons": "My Add-ons",
"marketplace": "Marketplace"
},
"settings": {
"sections": {
"time": {
"title": "Time",
"seconds": "Seconds",
"twentyfourhour": "24 Hour",
"ampm": "AM/PM (12 hour)",
"zero": "Zero-padded",
"analog": "Analog",
"percentageComplete": "Percentage of the Day Complete",
"date": {
"title": "Date",
"short_date": "Short Date",
"short_format": "Short Format",
"short_separator": {
"title": "Short Separator",
"default": "Default",
"dash": "Dash",
"gaps": "Gaps"
}
}
},
"quote": {
"title": "Quote",
"buttons": "Buttons",
"copy": "Copy",
"tweet": "Tweet",
"favourite": "Favourite"
},
"greeting": {
"title": "Greeting",
"events": "Events",
"default": "Default Greeting Message",
"name": "Name for greeting",
"birthday_enabled": "Birthday Enabled",
"birthday_date": "Birthday Date"
},
"background": {
"title": "Background",
"api": "Background API",
"blur": "Adjust Blur",
"brightness": "Adjust Brightness",
"custom_url": "Custom Background URL",
"custom_background": "Custom Background",
"custom_colour": "Custom Background Colour",
"upload": "Upload",
"add_colour": "Add colour",
"favourite": "Favourite",
"view": "View",
"refresh": "Refresh",
"disabled": "Disabled"
},
"search": {
"title": "Search",
"search_engine": "Search Engine",
"custom": "Custom Search URL"
},
"appearance": "Appearance",
"language": "Language",
"changelog": "Change Log",
"about": {
"title": "About",
"about": {
"copyright": "Copyright",
"version": {
"title": "Version",
"update_available": "Update available",
"no_update": "No update available"
},
"resources_used": {
"title": "Resources Used",
"bg_images": "Background Images",
"pin_icon": "Pin Icon"
},
"contributors": "Contributors",
"supporters": "Supporters"
}
}
},
"buttons": {
"apply": "Apply",
"reset": "Reset",
"import": "Import",
"export": "Export"
}
},
"marketplace": {
"photo_packs": "Photo Packs",
"quote_packs": "Quote Packs",
"preset_settings": "Preset Settings",
"themes": "Themes",
"product": {
"overview": "Overview",
"information": "Information",
"last_updated": "Last Updated",
"version": "Version",
"author": "Author",
"notice": {
"title": "Notice",
"description": "In order for the change to take place, the page must be refreshed."
},
"buttons": {
"addtomue": "Add To Mue",
"remove": "Remove"
},
"quote_warning": {
"title": "Warning",
"description": "This quote pack requests to external servers that may track you!"
}
},
"offline": {
"title": "Looks like you're offline",
"description": "Please connect to the internet."
},
"see_more": "See More"
},
"addons": {
"added": "Added",
"empty": {
"title": "It's empty here",
"description": "Head to the marketplace to add some.",
"button": "Take me there"
},
"sideload": "Sideload"
}
},
"update": {
"title": "Update",
"offline": {
"title": "Offline",
"description": "Cannot get update logs while in offline mode"
},
"error": {
"title": "Error",
"description": "Could not connect to the server"
},
"read_blog": "Read on the blog here",
"contact_support": "Contact us here"
},
"welcome": {
"title": "Welcome to",
"information": "Information",
"thankyoumessage1": "Thank you for downloading Mue Tab,",
"thankyoumessage2": "we hope you enjoy your time with our extension.",
"support": "Support",
"close": "Close"
},
"feedback": {
"title": "Give us feedback",
"question_one": "How would you rate your experience of this Mue build?",
"question_two": "What bugs did you encounter in your use of Mue?",
"question_three": "How likely would you be to recommend this version of Mue to a friend of colleague?",
"submit": "Submit"
}
},
"toasts": {
"quote": "Quote copied",
"reset": "Reset successfully",
"imported": "Successfully imported",
"installed": "Successfully installed",
"uninstalled": "Successfully removed",
"error": "Something went wrong"
}
}

View File

@ -1,18 +1,18 @@
{
"modals": {
"main": {
"settings": {
"sections": {
"quote": {
"favourite": "Favorite"
},
"background": {
"custom_colour": "Custom Background Color",
"add_colour": "Add color",
"favourite": "Favorite"
}
}
}
"modals": {
"main": {
"settings": {
"sections": {
"quote": {
"favourite": "Favorite"
},
"background": {
"custom_colour": "Custom Background Color",
"add_colour": "Add color",
"favourite": "Favorite"
}
}
}
}
}
}
}

View File

@ -1,134 +1,134 @@
{
"greeting": {
"morning": "Buenos días",
"afternoon": "Buenas tardes",
"evening": "Buenas noches",
"christmas": "Feliz Navidad",
"newyear": "Feliz año nuevo",
"halloween": "Feliz Halloween"
},
"credit": "Foto por",
"search": "Buscar",
"modals": {
"title": "Opciones",
"settings": "Ajustes",
"addons": "Mis complementos",
"marketplace": "Tienda"
},
"settings": {
"time": {
"title": "Tiempo",
"seconds": "Segundos",
"twentyfourhour": "24 Horas",
"ampm": "AM/PM (12 horas)",
"zero": "Sin ceros",
"analog": "Analógico"
},
"greeting": {
"morning": "Buenos días",
"afternoon": "Buenas tardes",
"evening": "Buenas noches",
"christmas": "Feliz Navidad",
"newyear": "Feliz año nuevo",
"halloween": "Feliz Halloween"
"title": "Saludos",
"events": "Eventos",
"default": "Mensaje del saludo por defecto",
"name": "Nombre para el saludo"
},
"credit": "Foto por",
"search": "Buscar",
"modals": {
"title": "Opciones",
"settings": "Ajustes",
"addons": "Mis complementos",
"marketplace": "Tienda"
"quote": {
"title": "Cita",
"copy": "Botón de copiar",
"tweet": "Botón de Tweet",
"favourite": "Botón de favoritos"
},
"settings": {
"time": {
"title": "Tiempo",
"seconds": "Segundos",
"twentyfourhour": "24 Horas",
"ampm": "AM/PM (12 horas)",
"zero": "Sin ceros",
"analog": "Analógico"
},
"greeting": {
"title": "Saludos",
"events": "Eventos",
"default": "Mensaje del saludo por defecto",
"name": "Nombre para el saludo"
},
"quote": {
"title": "Cita",
"copy": "Botón de copiar",
"tweet": "Botón de Tweet",
"favourite": "Botón de favoritos"
},
"background": {
"title": "Fondo",
"API": "Fondos API",
"blur": "Ajustar difuminado",
"brightness": "Ajustar brillo",
"customURL": "URL del fondo personalizado",
"custombackground": "Fondo personalizado",
"customcolour": "Color del fondo personalizado",
"upload": "Subir",
"addcolour": "Añadir color",
"favourite": "Favorito",
"view": "Ver",
"refresh": "Refrescar",
"disabled": "Desactivado"
},
"searchbar": {
"title": "Barra de búsqueda",
"searchengine": "Motor de búsqueda",
"custom": "URL de búsqueda personalizada"
},
"offline": "Modo Offline",
"dark": "Tema Oscuro",
"experimental": {
"title": "Experimental",
"animations": "Animaciones",
"voicesearch": "Búsqueda por voz",
"nightmode": "Modo nocturno automático"
},
"language": "Lenguaje",
"apply": "Aplicar",
"reset": "Reiniciar",
"import": "Importar",
"export": "Exportar"
"background": {
"title": "Fondo",
"API": "Fondos API",
"blur": "Ajustar difuminado",
"brightness": "Ajustar brillo",
"customURL": "URL del fondo personalizado",
"custombackground": "Fondo personalizado",
"customcolour": "Color del fondo personalizado",
"upload": "Subir",
"addcolour": "Añadir color",
"favourite": "Favorito",
"view": "Ver",
"refresh": "Refrescar",
"disabled": "Desactivado"
},
"update": {
"title": "Actualizar",
"offline": {
"title": "Offline",
"description": "No se pueden obtener actualizaciones en modo sin conexión"
},
"error": {
"title": "Error",
"description": "No se pudo conectar con el servidor"
},
"loading": "Cargando...",
"readblog": "Leer en el blog aquí",
"contactsupport": "Contáctanos aquí"
"searchbar": {
"title": "Barra de búsqueda",
"searchengine": "Motor de búsqueda",
"custom": "URL de búsqueda personalizada"
},
"toasts": {
"quote": "Cita copiada",
"reset": "Restablecido correctamente",
"installed": "Instalado correctamente",
"removed": "Retirado correctamente",
"error": "Algo salió mal",
"imported": "Importado correctamente"
"offline": "Modo Offline",
"dark": "Tema Oscuro",
"experimental": {
"title": "Experimental",
"animations": "Animaciones",
"voicesearch": "Búsqueda por voz",
"nightmode": "Modo nocturno automático"
},
"marketplace": {
"photo_packs": "Paquetes de fotos",
"quote_packs": "Paquetes de citas",
"preset_settings": "Ajustes preestablecidos",
"themes": "Tema",
"product": {
"overview": "Visión general",
"information": "Información",
"last_updated": "Última actualización",
"version": "Versión",
"author": "Autor",
"notice": {
"title": "Aviso",
"description": "Para que se realice el cambio, la página debe actualizarse."
},
"buttons": {
"addtomue": "Añadir a Mue",
"remove": "Remover"
},
"quoteWarning": {
"title": "Advertencia",
"description": "¡Este paquete de citas solicita a servidores externos que pueden rastrearlo!"
}
},
"offline": {
"title": "Parece que estás desconectado",
"description": "Por favor conéctate a Internet."
},
"see_more": "Ver más"
"language": "Lenguaje",
"apply": "Aplicar",
"reset": "Reiniciar",
"import": "Importar",
"export": "Exportar"
},
"update": {
"title": "Actualizar",
"offline": {
"title": "Offline",
"description": "No se pueden obtener actualizaciones en modo sin conexión"
},
"addons": {
"added": "Añadido",
"empty": {
"title": "Está vacío aquí",
"description": "Dirígete a la tienda para agregar algunos.",
"button": "Llévame allí"
},
"sideload": "Cargar complemento localmente"
}
}
"error": {
"title": "Error",
"description": "No se pudo conectar con el servidor"
},
"loading": "Cargando...",
"readblog": "Leer en el blog aquí",
"contactsupport": "Contáctanos aquí"
},
"toasts": {
"quote": "Cita copiada",
"reset": "Restablecido correctamente",
"installed": "Instalado correctamente",
"removed": "Retirado correctamente",
"error": "Algo salió mal",
"imported": "Importado correctamente"
},
"marketplace": {
"photo_packs": "Paquetes de fotos",
"quote_packs": "Paquetes de citas",
"preset_settings": "Ajustes preestablecidos",
"themes": "Tema",
"product": {
"overview": "Visión general",
"information": "Información",
"last_updated": "Última actualización",
"version": "Versión",
"author": "Autor",
"notice": {
"title": "Aviso",
"description": "Para que se realice el cambio, la página debe actualizarse."
},
"buttons": {
"addtomue": "Añadir a Mue",
"remove": "Remover"
},
"quoteWarning": {
"title": "Advertencia",
"description": "¡Este paquete de citas solicita a servidores externos que pueden rastrearlo!"
}
},
"offline": {
"title": "Parece que estás desconectado",
"description": "Por favor conéctate a Internet."
},
"see_more": "Ver más"
},
"addons": {
"added": "Añadido",
"empty": {
"title": "Está vacío aquí",
"description": "Dirígete a la tienda para agregar algunos.",
"button": "Llévame allí"
},
"sideload": "Cargar complemento localmente"
}
}

View File

@ -1,133 +1,133 @@
{
"greeting": {
"morning": "Bonjour",
"afternoon": "Bon après-midi",
"evening": "Bonsoir",
"christmas": "Joyeux Noël",
"newyear": "Bonne année",
"halloween": "Joyeux Halloween"
},
"credit": "Photo par",
"search": "Rechercher",
"modals": {
"title": "Options",
"settings": "Paramètres",
"addons": "Mes Options",
"marketplace": "Marché"
},
"settings": {
"time": {
"title": "Heure",
"seconds": "Secondes",
"twentyfourhour": "24 heures",
"ampm": "AM/PM (12 heures)",
"zero": "Complétion de zéros",
"analog": "Analogique"
},
"greeting": {
"morning": "Bonjour",
"afternoon": "Bon après-midi",
"evening": "Bonsoir",
"christmas": "Joyeux Noël",
"newyear": "Bonne année",
"halloween": "Joyeux Halloween"
"title": "Salutation",
"events": "Événements",
"default": "Salutation par défaut",
"name": "Nom pour salutation"
},
"credit": "Photo par",
"search": "Rechercher",
"modals": {
"title": "Options",
"settings": "Paramètres",
"addons": "Mes Options",
"marketplace": "Marché"
"quote": {
"title": "Citation",
"copy": "Bouton Copier",
"tweet": "Bouton Twitter",
"favourite": "Bouton Ajouter aux favoris"
},
"settings": {
"time": {
"title": "Heure",
"seconds": "Secondes",
"twentyfourhour": "24 heures",
"ampm": "AM/PM (12 heures)",
"zero": "Complétion de zéros",
"analog": "Analogique"
},
"greeting": {
"title": "Salutation",
"events": "Événements",
"default": "Salutation par défaut",
"name": "Nom pour salutation"
},
"quote": {
"title": "Citation",
"copy": "Bouton Copier",
"tweet": "Bouton Twitter",
"favourite": "Bouton Ajouter aux favoris"
},
"background": {
"title": "Fond",
"api": "Source",
"blur": "Ajuster le flou",
"brightness": "Ajuster la luminosité",
"custom_url": "URL d'arrière-plan personnalisé",
"custom_background": "Arrière-plan personnalisé",
"custom_colour": "Couleur d'arrière-plan personnalisée",
"upload": "Ajouter",
"add_colour": "Ajouter une couleur",
"favourite": "Ajouter aux favoris",
"view": "Mode vue",
"refresh": "Rafraîchir"
},
"searchbar": {
"title": "Barre de Recherche",
"search_engine": "Moteur de recherche",
"custom": "URL de recherche personnalisée"
},
"offline": "Mode Hors-Ligne",
"dark": "Thème sombre",
"experimental": {
"title": "Expérimental",
"animations": "Animations",
"favourite": "Bouton Ajouter aux favoris",
"voice_search": "Recherche vocale"
},
"language": "Langue",
"apply": "Appliquer",
"reset": "Réinitialiser",
"import": "Importer",
"export": "Exporter"
"background": {
"title": "Fond",
"api": "Source",
"blur": "Ajuster le flou",
"brightness": "Ajuster la luminosité",
"custom_url": "URL d'arrière-plan personnalisé",
"custom_background": "Arrière-plan personnalisé",
"custom_colour": "Couleur d'arrière-plan personnalisée",
"upload": "Ajouter",
"add_colour": "Ajouter une couleur",
"favourite": "Ajouter aux favoris",
"view": "Mode vue",
"refresh": "Rafraîchir"
},
"update": {
"title": "Mise à jour",
"offline": {
"title": "Hors ligne",
"description": "Impossible de se connecter à Internet"
},
"error": {
"title": "Erreur",
"description": "Impossible de se connecter au serveur"
},
"loading": "Chargement...",
"read_blog": "Lire sur le blog ",
"contact_support": "Contactez-nous "
"searchbar": {
"title": "Barre de Recherche",
"search_engine": "Moteur de recherche",
"custom": "URL de recherche personnalisée"
},
"toasts": {
"quote": "Citation copiée",
"reset": "Réinitialisé avec succès",
"installed": "Installé avec succès",
"removed": "Enlevé avec succès",
"error": "Quelque chose s'est mal passé",
"imported": "Importé avec succès"
"offline": "Mode Hors-Ligne",
"dark": "Thème sombre",
"experimental": {
"title": "Expérimental",
"animations": "Animations",
"favourite": "Bouton Ajouter aux favoris",
"voice_search": "Recherche vocale"
},
"marketplace": {
"photo_packs": "Packs Photos",
"quote_packs": "Packs Citations",
"preset_settings": "Paramètres prédéfinis",
"themes": "Thèmes",
"product": {
"overview": "Aperçu",
"information": "Information",
"last_updated": "Dernière mise à jour",
"version": "Version",
"author": "Auteur",
"notice": {
"title": "Remarque",
"description": "Pour appliquer les changements, veuillez recharger la page."
},
"buttons": {
"addtomue": "Ajouter à Mue",
"remove": "Enlever"
},
"quote_warning": {
"title": "Attention",
"description": "Ce pack fait appel à des serveurs externes qui sont susceptibles de vous tracer !"
}
},
"offline": {
"title": "Vous êtes hors ligne",
"description": "Veuillez vous connecter à Internet."
},
"see_more": "Voir plus"
"language": "Langue",
"apply": "Appliquer",
"reset": "Réinitialiser",
"import": "Importer",
"export": "Exporter"
},
"update": {
"title": "Mise à jour",
"offline": {
"title": "Hors ligne",
"description": "Impossible de se connecter à Internet"
},
"addons": {
"added": "Ajoutées",
"empty": {
"title": "C'est vide par ici",
"description": "Dirigez vous vers le marché pour ajouter des options.",
"button": "Naviguer vers le marché"
},
"sideload": "Charger"
}
"error": {
"title": "Erreur",
"description": "Impossible de se connecter au serveur"
},
"loading": "Chargement...",
"read_blog": "Lire sur le blog ",
"contact_support": "Contactez-nous "
},
"toasts": {
"quote": "Citation copiée",
"reset": "Réinitialisé avec succès",
"installed": "Installé avec succès",
"removed": "Enlevé avec succès",
"error": "Quelque chose s'est mal passé",
"imported": "Importé avec succès"
},
"marketplace": {
"photo_packs": "Packs Photos",
"quote_packs": "Packs Citations",
"preset_settings": "Paramètres prédéfinis",
"themes": "Thèmes",
"product": {
"overview": "Aperçu",
"information": "Information",
"last_updated": "Dernière mise à jour",
"version": "Version",
"author": "Auteur",
"notice": {
"title": "Remarque",
"description": "Pour appliquer les changements, veuillez recharger la page."
},
"buttons": {
"addtomue": "Ajouter à Mue",
"remove": "Enlever"
},
"quote_warning": {
"title": "Attention",
"description": "Ce pack fait appel à des serveurs externes qui sont susceptibles de vous tracer !"
}
},
"offline": {
"title": "Vous êtes hors ligne",
"description": "Veuillez vous connecter à Internet."
},
"see_more": "Voir plus"
},
"addons": {
"added": "Ajoutées",
"empty": {
"title": "C'est vide par ici",
"description": "Dirigez vous vers le marché pour ajouter des options.",
"button": "Naviguer vers le marché"
},
"sideload": "Charger"
}
}

View File

@ -1,116 +1,116 @@
{
"greeting": {
"morning": "Goedemorgen",
"afternoon": "Goedemiddag",
"evening": "Goedenavond",
"christmas": "Fijne kerstdagen",
"newyear": "Gelukkig nieuw jaar",
"halloween": "Fijne halloween"
},
"credit": "Afbeelding door",
"search": "Zoeken",
"modals": {
"title": "Opties",
"settings": "Instellingen",
"addons": "Mijn Extensies",
"marketplace": "Marktplaats"
},
"settings": {
"time": {
"title": "Tijd",
"seconds": "Seconden",
"twentyfourhour": "24 uurs",
"ampm": "AM/PM (12 uurs)",
"zero": "Nul Opvulling",
"analog": "Analoog"
},
"greeting": {
"morning": "Goedemorgen",
"afternoon": "Goedemiddag",
"evening": "Goedenavond",
"christmas": "Fijne kerstdagen",
"newyear": "Gelukkig nieuw jaar",
"halloween": "Fijne halloween"
"title": "Groeten",
"events": "Evenementen",
"default": "Standaard begroetingsnaam",
"name": "Naam Voor Groet"
},
"credit": "Afbeelding door",
"search": "Zoeken",
"modals": {
"title": "Opties",
"settings": "Instellingen",
"addons": "Mijn Extensies",
"marketplace": "Marktplaats"
"quote": {
"title": "Citaat",
"copy": "Kopieer Knop"
},
"settings": {
"time": {
"title": "Tijd",
"seconds": "Seconden",
"twentyfourhour": "24 uurs",
"ampm": "AM/PM (12 uurs)",
"zero": "Nul Opvulling",
"analog": "Analoog"
},
"greeting": {
"title": "Groeten",
"events": "Evenementen",
"default": "Standaard begroetingsnaam",
"name": "Naam Voor Groet"
},
"quote": {
"title": "Citaat",
"copy": "Kopieer Knop"
},
"background": {
"title": "Achtergrond",
"api": "Achtergrond API",
"blur": "Onscherpte Aanpassen",
"custom_url": "Aangepaste Achtergrond URL",
"custom_background": "Aangepaste Achtergrond",
"custom_colour": "Aangepaste Achtergrondkleur",
"upload": "Uploaden",
"add_colour": "Kleur toevoegen"
},
"searchbar": {
"title": "Zoekbalk",
"search_engine": "Zoekmachine"
},
"offline": "Offline Modus",
"dark": "Donker Thema",
"experimental": {
"title": "Experimenteel",
"animations": "Animaties"
},
"language": "Taal",
"apply": "Toepassen",
"reset": "Resetten",
"import": "Importeren",
"export": "Exporteren"
"background": {
"title": "Achtergrond",
"api": "Achtergrond API",
"blur": "Onscherpte Aanpassen",
"custom_url": "Aangepaste Achtergrond URL",
"custom_background": "Aangepaste Achtergrond",
"custom_colour": "Aangepaste Achtergrondkleur",
"upload": "Uploaden",
"add_colour": "Kleur toevoegen"
},
"update": {
"title": "Veranderingen",
"offline": {
"title": "Offline",
"description": "Kan veranderingen logboek niet verkrijgen in offline modus"
},
"error": {
"title": "Fout",
"content": "Kon niet verbinden met de servers"
},
"loading": "Aan het laden..."
"searchbar": {
"title": "Zoekbalk",
"search_engine": "Zoekmachine"
},
"toasts": {
"quote": "Quote Copied",
"reset": "Reset successfully",
"installed": "Successvol geïnstalleerd",
"removed": "Successvol verwijderd",
"error": "Iets is verkeerd gegaan"
"offline": "Offline Modus",
"dark": "Donker Thema",
"experimental": {
"title": "Experimenteel",
"animations": "Animaties"
},
"marketplace": {
"photo_packs": "Afbeelding Pakketten",
"quote_packs": "Citaat Pakketten",
"preset_settings": "Vooraf ingestelde instellingen",
"themes": "Themas",
"product": {
"overview": "Overzicht",
"information": "Informatie",
"last_updated": "Laatst Geüpdatet",
"version": "Versie",
"author": "Auteur",
"notice": {
"title": "Aankondiging",
"description": "De veranderingen gaan in zodra je de pagina herlaad."
},
"buttons": {
"addtomue": "Voeg aan Mue toe",
"remove": "Verwijder"
}
},
"offline": {
"title": "Het ziet er uit dat je offline bent",
"description": "Verbind met het internet."
},
"see_more": "Zie Meer"
"language": "Taal",
"apply": "Toepassen",
"reset": "Resetten",
"import": "Importeren",
"export": "Exporteren"
},
"update": {
"title": "Veranderingen",
"offline": {
"title": "Offline",
"description": "Kan veranderingen logboek niet verkrijgen in offline modus"
},
"addons": {
"added": "Toegevoegd",
"empty": {
"title": "Het is hier leeg",
"description": "Ga naar de marktplaats om een paar extensies toe te veogen.",
"button": "Breng me naar de marktplaats"
}
"error": {
"title": "Fout",
"content": "Kon niet verbinden met de servers"
},
"loading": "Aan het laden..."
},
"toasts": {
"quote": "Quote Copied",
"reset": "Reset successfully",
"installed": "Successvol geïnstalleerd",
"removed": "Successvol verwijderd",
"error": "Iets is verkeerd gegaan"
},
"marketplace": {
"photo_packs": "Afbeelding Pakketten",
"quote_packs": "Citaat Pakketten",
"preset_settings": "Vooraf ingestelde instellingen",
"themes": "Themas",
"product": {
"overview": "Overzicht",
"information": "Informatie",
"last_updated": "Laatst Geüpdatet",
"version": "Versie",
"author": "Auteur",
"notice": {
"title": "Aankondiging",
"description": "De veranderingen gaan in zodra je de pagina herlaad."
},
"buttons": {
"addtomue": "Voeg aan Mue toe",
"remove": "Verwijder"
}
},
"offline": {
"title": "Het ziet er uit dat je offline bent",
"description": "Verbind met het internet."
},
"see_more": "Zie Meer"
},
"addons": {
"added": "Toegevoegd",
"empty": {
"title": "Het is hier leeg",
"description": "Ga naar de marktplaats om een paar extensies toe te veogen.",
"button": "Breng me naar de marktplaats"
}
}
}

View File

@ -1,115 +1,115 @@
{
"greeting": {
"morning": "God Morgen",
"afternoon": "God Ettermiddag",
"evening": "God Kveld",
"christmas": "God Jul",
"newyear": "Godt Nyttår",
"halloween": "Ha en god Halloween"
},
"credit": "Bilde av",
"search": "Søk",
"modals": {
"title": "Options",
"settings": "Instillinger",
"addons": "Mine add-ons",
"marketplace": "Markedsplass"
},
"settings": {
"time": {
"title": "Tid",
"seconds": "Sekunder",
"twentyfourhour": "24 Timer",
"ampm": "AM/PM (12 Timer)",
"zero": "Ekstra Null",
"analog": "Analog"
},
"greeting": {
"morning": "God Morgen",
"afternoon": "God Ettermiddag",
"evening": "God Kveld",
"christmas": "God Jul",
"newyear": "Godt Nyttår",
"halloween": "Ha en god Halloween"
"title": "Hallo",
"events": "Planer",
"default": "Standard Hallo Melding",
"name": "Navn for Hallo"
},
"credit": "Bilde av",
"search": "Søk",
"modals": {
"title": "Options",
"settings": "Instillinger",
"addons": "Mine add-ons",
"marketplace": "Markedsplass"
"quote": {
"title": "Sitat",
"copy": "Kopier knapp"
},
"settings": {
"time": {
"title": "Tid",
"seconds": "Sekunder",
"twentyfourhour": "24 Timer",
"ampm": "AM/PM (12 Timer)",
"zero": "Ekstra Null",
"analog": "Analog"
},
"greeting": {
"title": "Hallo",
"events": "Planer",
"default": "Standard Hallo Melding",
"name": "Navn for Hallo"
},
"quote": {
"title": "Sitat",
"copy": "Kopier knapp"
},
"background": {
"title": "Bakgrunn",
"api": "Bakgrunn API",
"blur": "Juster Blur",
"custom_url": "Personlig bakgrunn URL",
"custom_background": "Personlig bakgrunn",
"custom_colour": "Personlig Bakgrunn Farge",
"add_colour": "Legg til farge"
},
"searchbar": {
"title": "Søkebar",
"search_engine": "Søkemotor"
},
"offline": "Frakoblet Modus",
"dark": "Mørkt tema",
"experimental": {
"title": "Eksperimental",
"animations": "Animasjoner"
},
"language": "Språk",
"apply": "Bruk",
"reset": "Nullstill",
"import": "Importer",
"export": "Eksporter"
"background": {
"title": "Bakgrunn",
"api": "Bakgrunn API",
"blur": "Juster Blur",
"custom_url": "Personlig bakgrunn URL",
"custom_background": "Personlig bakgrunn",
"custom_colour": "Personlig Bakgrunn Farge",
"add_colour": "Legg til farge"
},
"update": {
"title": "Oppdater",
"offline": {
"title": "Offline",
"description": "Kan ikke få oppdatering loggene når i offline modus."
},
"error": {
"title": "Error",
"content": "Kan ikke koble til serveren."
},
"loading": "Laster..."
"searchbar": {
"title": "Søkebar",
"search_engine": "Søkemotor"
},
"toasts": {
"quote": "Sitat kopiert",
"reset": "Tilbakestillte vellykket",
"installed": "Installert",
"removed": "Fjernet",
"error": "Noe gikk galt"
"offline": "Frakoblet Modus",
"dark": "Mørkt tema",
"experimental": {
"title": "Eksperimental",
"animations": "Animasjoner"
},
"marketplace": {
"photo_packs": "Bilde pakker",
"quote_packs": "Sitat pakker",
"preset_settings": "Preset instillinger",
"themes": "Themes",
"product": {
"overview": "Oversikt",
"information": "Informasjon",
"last_updated": "Sist oppdatert",
"version": "Versjon",
"author": "Forfatter",
"notice": {
"title": "Vær oppmerksom",
"description": "For at endringen skal ta skje, må siden relastes."
},
"buttons": {
"addtomue": "Legg Til Mue",
"remove": "Fjern"
}
},
"offline": {
"title": "Ser ut som at du er offiline.",
"description": "Vær så snill, koble til internettet."
},
"see_more": "Se mer"
"language": "Språk",
"apply": "Bruk",
"reset": "Nullstill",
"import": "Importer",
"export": "Eksporter"
},
"update": {
"title": "Oppdater",
"offline": {
"title": "Offline",
"description": "Kan ikke få oppdatering loggene når i offline modus."
},
"addons": {
"added": "Lagt til",
"empty": {
"title": "Det er tomt her.",
"description": "Gå til markedsplassen å legg til noe.",
"button": "Ta meg der"
}
"error": {
"title": "Error",
"content": "Kan ikke koble til serveren."
},
"loading": "Laster..."
},
"toasts": {
"quote": "Sitat kopiert",
"reset": "Tilbakestillte vellykket",
"installed": "Installert",
"removed": "Fjernet",
"error": "Noe gikk galt"
},
"marketplace": {
"photo_packs": "Bilde pakker",
"quote_packs": "Sitat pakker",
"preset_settings": "Preset instillinger",
"themes": "Themes",
"product": {
"overview": "Oversikt",
"information": "Informasjon",
"last_updated": "Sist oppdatert",
"version": "Versjon",
"author": "Forfatter",
"notice": {
"title": "Vær oppmerksom",
"description": "For at endringen skal ta skje, må siden relastes."
},
"buttons": {
"addtomue": "Legg Til Mue",
"remove": "Fjern"
}
},
"offline": {
"title": "Ser ut som at du er offiline.",
"description": "Vær så snill, koble til internettet."
},
"see_more": "Se mer"
},
"addons": {
"added": "Lagt til",
"empty": {
"title": "Det er tomt her.",
"description": "Gå til markedsplassen å legg til noe.",
"button": "Ta meg der"
}
}
}
}

View File

@ -1,134 +1,134 @@
{
"greeting": {
"morning": "Доброе утро",
"afternoon": "Добрый день",
"evening": "Добрый вечер",
"christmas": "С Рождеством",
"newyear": "С Новым Годом",
"halloween": "Счастливого Хэллоуина"
},
"credit": "Фото",
"search": "Поиск",
"modals": {
"title": "Options",
"settings": "Settings",
"addons": "My Add-ons",
"marketplace": "Marketplace"
},
"settings": {
"time": {
"title": "Время",
"seconds": "Секунды",
"twentyfourhour": "24 Часа",
"ampm": "AM/PM (12 часов)",
"zero": "Дополнительный ноль",
"analog": "Аналоговое"
},
"greeting": {
"morning": "Доброе утро",
"afternoon": "Добрый день",
"evening": "Добрый вечер",
"christmas": "С Рождеством",
"newyear": "С Новым Годом",
"halloween": "Счастливого Хэллоуина"
"title": "Приветствие",
"events": "События",
"default": "Сообщение с приветствием по-умолчанию",
"name": "Имя для приветствия"
},
"credit": "Фото",
"search": "Поиск",
"modals": {
"title": "Options",
"settings": "Settings",
"addons": "My Add-ons",
"marketplace": "Marketplace"
"quote": {
"title": "Цитата",
"copy": "Кнопка копирования",
"tweet": "Кнопка твита",
"favourite": "Кнопка для оценки"
},
"settings": {
"time": {
"title": "Время",
"seconds": "Секунды",
"twentyfourhour": "24 Часа",
"ampm": "AM/PM (12 часов)",
"zero": "Дополнительный ноль",
"analog": "Аналоговое"
},
"greeting": {
"title": "Приветствие",
"events": "События",
"default": "Сообщение с приветствием по-умолчанию",
"name": "Имя для приветствия"
},
"quote": {
"title": "Цитата",
"copy": "Кнопка копирования",
"tweet": "Кнопка твита",
"favourite": "Кнопка для оценки"
},
"background": {
"title": "Фон",
"api": "API для фона",
"blur": "Размытие",
"brightness": "Яркость",
"custom_url": "Ссылка для пользовательского фона",
"custom_background": "Пользовательский фон",
"custom_colour": "Пользовательский цвет фона",
"upload": "Загрузить",
"add_colour": "Добавить цвет",
"favourite": "Любимые",
"view": "Просмотр",
"refresh": "Обновить",
"disabled": "Выключен"
},
"searchbar": {
"title": "Панель поиска",
"searchengine": "Поисковый движок",
"custom": "Пользовательский поисковый движок"
},
"offline": "Офлайн режим",
"dark": "Тёмная тема",
"experimental": {
"title": "Экспериментальные настройки",
"animations": "Анимации",
"voicesearch": "Поиск голосом",
"nightmode": "Автоматический ночной режим"
},
"language": "Язык",
"apply": "Применить",
"reset": "Сбросить",
"import": "Импорт",
"export": "Экспорт"
"background": {
"title": "Фон",
"api": "API для фона",
"blur": "Размытие",
"brightness": "Яркость",
"custom_url": "Ссылка для пользовательского фона",
"custom_background": "Пользовательский фон",
"custom_colour": "Пользовательский цвет фона",
"upload": "Загрузить",
"add_colour": "Добавить цвет",
"favourite": "Любимые",
"view": "Просмотр",
"refresh": "Обновить",
"disabled": "Выключен"
},
"update": {
"title": "Обновление",
"offline": {
"title": "Офлайн",
"description": "Не удалось получить журнал обновления в офлайн режиме"
},
"error": {
"title": "Ошибка",
"content": "Не удалось подключиться к серверу"
},
"loading": "Загрузка...",
"readblog": "Прочитайте об изменениях в блоге",
"contactsupport": "Связаться с нами"
"searchbar": {
"title": "Панель поиска",
"searchengine": "Поисковый движок",
"custom": "Пользовательский поисковый движок"
},
"toasts": {
"quote": "Цитата скопирована!",
"reset": "Сброшено!",
"installed": "Успешно установлено",
"removed": "Успешно удалено",
"error": "Что-то пошло не так",
"imported": "Успешно импортировано"
"offline": "Офлайн режим",
"dark": "Тёмная тема",
"experimental": {
"title": "Экспериментальные настройки",
"animations": "Анимации",
"voicesearch": "Поиск голосом",
"nightmode": "Автоматический ночной режим"
},
"marketplace": {
"photo_packs": "Наборы фото",
"quote_packs": "Наборы цитат",
"preset_settings": "Пресеты настроек",
"themes": "Темы",
"product": {
"overview": "Обзор",
"information": "Информация",
"last_updated": "Последнее обновление",
"version": "Версия",
"author": "Автор",
"notice": {
"title": "Предупреждение",
"description": "Для того, чтобы изменения вступили в силу необходимо обновить страницу."
},
"buttons": {
"addtomue": "Добавить в Mue",
"remove": "Удалить"
},
"quoteWarning": {
"title": "Предупреждение",
"description": "Этот пакет цитат обращается к внешнему серверу и может отслеживать вас!"
}
},
"offline": {
"title": "Похоже, что вы офлайн",
"description": "Пожалуйста, подключитесь к интернету."
},
"see_more": "Показать больше"
"language": "Язык",
"apply": "Применить",
"reset": "Сбросить",
"import": "Импорт",
"export": "Экспорт"
},
"update": {
"title": "Обновление",
"offline": {
"title": "Офлайн",
"description": "Не удалось получить журнал обновления в офлайн режиме"
},
"addons": {
"added": "Добавлен",
"empty": {
"title": "Здесь пусто",
"description": "Зайдите в магазин, чтобы найти что-то интересное.",
"button": "Перейти"
},
"sideload": "Загрузить"
}
"error": {
"title": "Ошибка",
"content": "Не удалось подключиться к серверу"
},
"loading": "Загрузка...",
"readblog": "Прочитайте об изменениях в блоге",
"contactsupport": "Связаться с нами"
},
"toasts": {
"quote": "Цитата скопирована!",
"reset": "Сброшено!",
"installed": "Успешно установлено",
"removed": "Успешно удалено",
"error": "Что-то пошло не так",
"imported": "Успешно импортировано"
},
"marketplace": {
"photo_packs": "Наборы фото",
"quote_packs": "Наборы цитат",
"preset_settings": "Пресеты настроек",
"themes": "Темы",
"product": {
"overview": "Обзор",
"information": "Информация",
"last_updated": "Последнее обновление",
"version": "Версия",
"author": "Автор",
"notice": {
"title": "Предупреждение",
"description": "Для того, чтобы изменения вступили в силу необходимо обновить страницу."
},
"buttons": {
"addtomue": "Добавить в Mue",
"remove": "Удалить"
},
"quoteWarning": {
"title": "Предупреждение",
"description": "Этот пакет цитат обращается к внешнему серверу и может отслеживать вас!"
}
},
"offline": {
"title": "Похоже, что вы офлайн",
"description": "Пожалуйста, подключитесь к интернету."
},
"see_more": "Показать больше"
},
"addons": {
"added": "Добавлен",
"empty": {
"title": "Здесь пусто",
"description": "Зайдите в магазин, чтобы найти что-то интересное.",
"button": "Перейти"
},
"sideload": "Загрузить"
}
}

View File

@ -8,30 +8,29 @@ module.exports = {
mode: 'development',
module: {
rules: [{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: ['babel-loader']
},
{
test: /\.(sa|sc|c)ss$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: ''
},
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: ['babel-loader']
},
{
test: /\.(sa|sc|c)ss$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: ''
},
'css-loader',
'sass-loader',
],
},
{
test: /\.(woff|woff2|svg)$/,
use: {
loader: 'file-loader',
}
},
'css-loader',
'sass-loader',
],
},
{
test: /\.(woff|woff2|svg)$/,
use: {
loader: 'file-loader',
}
]
}]
},
resolve: {
extensions: ['.js', '.jsx']
@ -65,4 +64,4 @@ module.exports = {
chunkFilename: '[id].css',
})
]
};
};