{item.display_name || item.name}
{item.author}
diff --git a/src/components/modals/main/scss/index.scss b/src/components/modals/main/scss/index.scss index 7d85aee9..2c2cdd73 100644 --- a/src/components/modals/main/scss/index.scss +++ b/src/components/modals/main/scss/index.scss @@ -410,3 +410,7 @@ h3 { h5 { font-size: 0.8rem; } + +.checkbox svg { + fill: var(--modal-text) !important; +} diff --git a/src/components/modals/main/settings/Checkbox.jsx b/src/components/modals/main/settings/Checkbox.jsx index 0652d563..034d94b7 100644 --- a/src/components/modals/main/settings/Checkbox.jsx +++ b/src/components/modals/main/settings/Checkbox.jsx @@ -1,7 +1,6 @@ import React from 'react'; import EventBus from '../../../../modules/helpers/eventbus'; -import SettingsFunctions from '../../../../modules/helpers/settings'; import CheckboxUI from '@material-ui/core/Checkbox'; import FormControlLabel from '@material-ui/core/FormControlLabel'; @@ -15,10 +14,11 @@ export default class Checkbox extends React.PureComponent { } handleChange = () => { - SettingsFunctions.setItem(this.props.name); + const value = (this.state.checked === true) ? false : true; + localStorage.setItem(this.props.name, value); this.setState({ - checked: (this.state.checked === true) ? false : true + checked: value }); window.stats.postEvent('setting', `${this.props.name} ${(this.state.checked === true) ? 'enabled' : 'disabled'}`); @@ -45,7 +45,7 @@ export default class Checkbox extends React.PureComponent { return ( <>diff --git a/src/components/modals/main/settings/Switch.jsx b/src/components/modals/main/settings/Switch.jsx index f7a295fe..9bb21a41 100644 --- a/src/components/modals/main/settings/Switch.jsx +++ b/src/components/modals/main/settings/Switch.jsx @@ -1,7 +1,6 @@ import React from 'react'; import EventBus from '../../../../modules/helpers/eventbus'; -import SettingsFunctions from '../../../../modules/helpers/settings'; import SwitchUI from '@material-ui/core/Switch'; import FormControlLabel from '@material-ui/core/FormControlLabel'; @@ -15,10 +14,11 @@ export default class Switch extends React.PureComponent { } handleChange = () => { - SettingsFunctions.setItem(this.props.name); + const value = (this.state.checked === true) ? false : true; + localStorage.setItem(this.props.name, value); this.setState({ - checked: (this.state.checked === true) ? false : true + checked: value }); window.stats.postEvent('setting', `${this.props.name} ${(this.state.checked === true) ? 'enabled' : 'disabled'}`); diff --git a/src/components/modals/main/settings/sections/About.jsx b/src/components/modals/main/settings/sections/About.jsx index 3e2bba5c..74d61783 100644 --- a/src/components/modals/main/settings/sections/About.jsx +++ b/src/components/modals/main/settings/sections/About.jsx @@ -3,7 +3,7 @@ import React from 'react'; import Tooltip from '../../../../helpers/tooltip/Tooltip'; import EmailIcon from '@material-ui/icons/Email'; import TwitterIcon from '@material-ui/icons/Twitter'; -import ForumIcon from '@material-ui/icons/Forum'; +import ChatIcon from '@material-ui/icons/Chat'; import InstagramIcon from '@material-ui/icons/Instagram'; import FacebookIcon from '@material-ui/icons/Facebook'; @@ -96,7 +96,7 @@ export default class About extends React.PureComponent {
{this.language.support_mue}
diff --git a/src/components/modals/main/settings/sections/Advanced.jsx b/src/components/modals/main/settings/sections/Advanced.jsx
index fa64bb6e..2c08af41 100644
--- a/src/components/modals/main/settings/sections/Advanced.jsx
+++ b/src/components/modals/main/settings/sections/Advanced.jsx
@@ -6,9 +6,8 @@ import Text from '../Text';
import Switch from '../Switch';
import ResetModal from '../ResetModal';
-import SettingsFunctions from '../../../../../modules/helpers/settings';
+import SettingsFunctions from '../../../../../modules/helpers/settings/modals';
-import { toast } from 'react-toastify';
import Modal from 'react-modal';
export default class AdvancedSettings extends React.PureComponent {
@@ -20,17 +19,6 @@ export default class AdvancedSettings extends React.PureComponent {
this.language = window.language.modals.main.settings;
}
- settingsImport(e) {
- const content = JSON.parse(e.target.result);
-
- Object.keys(content).forEach((key) => {
- localStorage.setItem(key, content[key]);
- });
-
- toast(window.language.toasts.imported);
- window.stats.postEvent('tab', 'Settings imported');
- }
-
render() {
const { advanced } = this.language.sections;
@@ -43,7 +31,7 @@ export default class AdvancedSettings extends React.PureComponent {
- {search.custom} this.resetSearch()}>{language.buttons.reset} {language.thankyoumessage1} {language.thankyoumessage1} {language.thankyoumessage2} to be added Mue is available in both light and dark theme, or this can be automatically set depending on your system theme. Using the Auto settings will use the theme on your computer. This setting will impact the modals and some of the widgets displayed on the screen, such as weather and notes. Installing Mue on a new device? Feel free to import your old settings! You can export your old settings by navigating to the Advanced tab in your old Mue setup. Then you need to click the export button which will download the JSON file. You can upload this file here to carry across your settings and preferences from your previous Mue installation. to be added Your Mue Tab experience is finally about to begin. To change settings later click on the settings icon in the top right corner of your tab. {this.state.nameError} {this.state.urlError}{advanced.customisation}
{language.title}
{background.title}
{reminder.title}
diff --git a/src/components/modals/main/tabs/backend/Tabs.jsx b/src/components/modals/main/tabs/backend/Tabs.jsx
index 0103bc9e..433f36f0 100644
--- a/src/components/modals/main/tabs/backend/Tabs.jsx
+++ b/src/components/modals/main/tabs/backend/Tabs.jsx
@@ -8,17 +8,19 @@ export default class Tabs extends React.PureComponent {
super(props);
this.state = {
- currentTab: this.props.children[0].props.label
+ currentTab: this.props.children[0].props.label,
+ currentName: this.props.children[0].props.name
};
}
- onClick = (tab) => {
- if (tab !== this.state.currentTab) {
- window.stats.postEvent('tab', `Changed ${this.state.currentTab} to ${tab}`);
+ onClick = (tab, name) => {
+ if (name !== this.state.currentName) {
+ window.stats.postEvent('tab', `Changed ${this.state.currentName} to ${name}`);
}
this.setState({
- currentTab: tab
+ currentTab: tab,
+ currentName: name
});
};
@@ -42,7 +44,7 @@ export default class Tabs extends React.PureComponent {
currentTab={this.state.currentTab}
key={tab.props.label || index}
label={tab.props.label}
- onClick={this.onClick}
+ onClick={(nextTab) => this.onClick(nextTab, tab.props.name)}
navbar={this.props.navbar || false}
/>
))}
diff --git a/src/components/modals/welcome/ProgressBar.jsx b/src/components/modals/welcome/ProgressBar.jsx
new file mode 100644
index 00000000..eb221995
--- /dev/null
+++ b/src/components/modals/welcome/ProgressBar.jsx
@@ -0,0 +1,16 @@
+export default function ProgressBar(props) {
+ return (
+ {language.title}
- Mue Tab
-
-
{language.information}
-
{language.thankyoumessage2}{language.support}
-
-
+ changeTab(minus) {
+ if (minus) {
+ return this.setState({
+ currentTab: this.state.currentTab - 1,
+ image: this.images[this.state.currentTab - 1],
+ buttonText: 'Next'
+ });
+ }
+
+ if (this.state.buttonText === 'Close') {
+ return this.props.modalClose();
+ }
+
+ this.setState({
+ currentTab: this.state.currentTab + 1,
+ image: this.images[this.state.currentTab + 1],
+ buttonText: (this.state.currentTab !== this.state.finalTab) ? 'Next' : 'Close'
+ });
+ }
+
+ // specific
+ switchTab(tab) {
+ this.setState({
+ currentTab: tab,
+ image: this.images[tab],
+ buttonText: 'Next'
+ });
+ }
+
+ render() {
+ return (
+
+
{language.title} Mue Tab
+ to be added
+
+
Choose your language
+ Select a theme
+ Quick Tip
+ Import Settings
+ Quick Tip
+ Privacy Options
+ Final step
+ Changes
+
{this.state.greeting}
diff --git a/src/components/widgets/navbar/Navbar.jsx b/src/components/widgets/navbar/Navbar.jsx
index 522bc5ce..ef531c66 100644
--- a/src/components/widgets/navbar/Navbar.jsx
+++ b/src/components/widgets/navbar/Navbar.jsx
@@ -13,6 +13,10 @@ import Tooltip from '../../helpers/tooltip/Tooltip';
import './scss/index.scss';
export default function Navbar(props) {
+ if (localStorage.getItem('showWelcome') === 'true') {
+ return null;
+ }
+
const backgroundEnabled = (localStorage.getItem('background') === 'true');
return (
diff --git a/src/components/widgets/navbar/Notes.jsx b/src/components/widgets/navbar/Notes.jsx
index f221138b..adc128e7 100644
--- a/src/components/widgets/navbar/Notes.jsx
+++ b/src/components/widgets/navbar/Notes.jsx
@@ -4,7 +4,7 @@ import TextareaAutosize from '@material-ui/core/TextareaAutosize';
import CopyIcon from '@material-ui/icons/FileCopyRounded';
import NotesIcon from '@material-ui/icons/AssignmentRounded';
-import Pin from './Pin';
+import Pin from '@material-ui/icons/PushPin';
import { toast } from 'react-toastify';
@@ -37,7 +37,7 @@ export default class Notes extends React.PureComponent {
copy() {
window.stats.postEvent('feature', 'Notes copied');
- // this.state.notes doesnt work for some reason
+ // this.state.notes doesn't work for some reason
navigator.clipboard.writeText(localStorage.getItem('notes'));
toast(window.language.toasts.notes);
}
@@ -61,7 +61,7 @@ export default class Notes extends React.PureComponent {
{this.language.title}
{this.language.new}
- {this.state.time}{this.state.ampm}
;
diff --git a/src/components/widgets/time/Date.jsx b/src/components/widgets/time/Date.jsx
index b69c572d..7f9fd0f4 100644
--- a/src/components/widgets/time/Date.jsx
+++ b/src/components/widgets/time/Date.jsx
@@ -118,6 +118,10 @@ export default class DateWidget extends React.PureComponent {
this.getDate();
}
+ componentWillUnmount() {
+ EventBus.remove('refresh');
+ }
+
render() {
return {this.state.date}
{this.state.weekNumber};
}
diff --git a/src/index.js b/src/index.js
index 7e921a67..4b99b150 100644
--- a/src/index.js
+++ b/src/index.js
@@ -39,7 +39,8 @@ if (window.languagecode !== 'en_GB' || window.languagecode !== 'en_US') {
}
window.constants = Constants;
-if (localStorage.getItem('stats') === 'true' && localStorage.getItem('offlineMode') !== 'true') {
+// doesn't send to umami when offline mode is on
+if (localStorage.getItem('stats') === 'true') {
window.stats = new Stats(window.constants.UMAMI_ID);
} else {
window.stats = {
diff --git a/src/modules/constants.js b/src/modules/constants.js
index 9dfdfcd6..e9b1804d 100644
--- a/src/modules/constants.js
+++ b/src/modules/constants.js
@@ -6,7 +6,7 @@ export const MARKETPLACE_URL = 'https://marketplace.muetab.com';
export const WEATHER_URL = 'https://weather.muetab.com';
export const SPONSORS_URL = 'https://sponsors.muetab.com';
export const GITHUB_URL = 'https://api.github.com';
-export const DDG_PROXY = 'https://external-content.duckduckgo.com/iu/?u=';
+export const DDG_IMAGE_PROXY = 'https://external-content.duckduckgo.com/iu/?u=';
// Mue URLs
export const WEBSITE_URL = 'https://muetab.com';
@@ -22,4 +22,4 @@ export const OFFLINE_IMAGES = 20;
// Version
export const BETA_VERSION = false;
-export const VERSION = '5.1.0';
+export const VERSION = '5.1.1';
diff --git a/src/modules/helpers/settings.js b/src/modules/helpers/settings/index.js
similarity index 71%
rename from src/modules/helpers/settings.js
rename to src/modules/helpers/settings/index.js
index 441e09c3..feaf90f8 100644
--- a/src/modules/helpers/settings.js
+++ b/src/modules/helpers/settings/index.js
@@ -1,52 +1,9 @@
-import experimentalInit from './experimental';
+import experimentalInit from '../experimental';
-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);
- }
-
- const blob = new Blob([data], { type: 'text/json' });
- let e = document.createEvent('MouseEvents');
- let a = document.createElement('a');
-
- a.href = window.URL.createObjectURL(blob);
- a.download = filename;
- a.dataset.downloadurl = ['text/json', a.download, a.href].join(':');
-
- e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- a.dispatchEvent(e);
-};
+const defaultSettings = require('../../default_settings.json');
+const languages = require('../../languages.json');
export default class SettingsFunctions {
- static exportSettings() {
- let settings = {};
- Object.keys(localStorage).forEach((key) => {
- settings[key] = localStorage.getItem(key);
- });
- saveFile(settings, 'mue-settings.json');
- window.stats.postEvent('tab', 'Settings exported');
- }
-
- 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;
- }
- }
-
- localStorage.setItem(key, val);
- }
-
static setDefaultSettings(reset) {
localStorage.clear();
defaultSettings.forEach((element) => localStorage.setItem(element.name, element.value));
@@ -82,6 +39,8 @@ export default class SettingsFunctions {
case 'auto':
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.body.classList.add('dark');
+ } else {
+ document.body.classList.remove('dark');
}
break;
default:
@@ -96,7 +55,9 @@ export default class SettingsFunctions {
custom.forEach((element) => {
try {
document.head.removeChild(document.getElementById(element));
- } catch (e) {}
+ } catch (e) {
+ // Disregard exception
+ }
});
}
@@ -107,38 +68,24 @@ export default class SettingsFunctions {
const font = localStorage.getItem('font');
if (font) {
- const google = localStorage.getItem('fontGoogle');
-
let url = '';
- let fontweight = '';
- let fontstyle = '';
-
- if (google === 'true') {
+ if (localStorage.getItem('fontGoogle') === 'true') {
url = `@import url('https://fonts.googleapis.com/css2?family=${font}&display=swap');`;
}
- const fontWeight = localStorage.getItem('fontweight');
- if (fontWeight) {
- fontweight = `font-weight: ${fontWeight};`;
- }
-
- const fontStyle = localStorage.getItem('fontstyle');
- if (fontStyle) {
- fontstyle = `font-style: ${fontStyle};`;
- }
-
document.head.insertAdjacentHTML('beforeend', `
`);
}
+ // everything below this either doesn't support hot reload (custom js) or shouldn't run on a hot reload event
if (hotreload === true) {
return;
}
@@ -164,7 +111,7 @@ export default class SettingsFunctions {
██ ██ ██ ██████ ███████ ██
██ ██
██ ██
- ██ Copyright 2018-2021 The Mue Authors ██
+ ██ Copyright 2018-${new Date().getFullYear()} The Mue Authors ██
██ GitHub: https://github.com/mue/mue ██
██ ██
██ Thank you for using Mue! ██
diff --git a/src/modules/helpers/settings/modals.js b/src/modules/helpers/settings/modals.js
new file mode 100644
index 00000000..7b26a810
--- /dev/null
+++ b/src/modules/helpers/settings/modals.js
@@ -0,0 +1,40 @@
+import { toast } from 'react-toastify';
+
+const saveFile = (data, filename = 'file') => {
+ if (typeof data === 'object') {
+ data = JSON.stringify(data, undefined, 4);
+ }
+
+ const blob = new Blob([data], { type: 'text/json' });
+ let e = document.createEvent('MouseEvents');
+ let a = document.createElement('a');
+
+ a.href = window.URL.createObjectURL(blob);
+ a.download = filename;
+ a.dataset.downloadurl = ['text/json', a.download, a.href].join(':');
+
+ e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+ a.dispatchEvent(e);
+};
+
+export default class ModalSettingsFunctions {
+ static exportSettings() {
+ let settings = {};
+ Object.keys(localStorage).forEach((key) => {
+ settings[key] = localStorage.getItem(key);
+ });
+ saveFile(settings, 'mue-settings.json');
+ window.stats.postEvent('tab', 'Settings exported');
+ }
+
+ static importSettings(e) {
+ const content = JSON.parse(e.target.result);
+
+ Object.keys(content).forEach((key) => {
+ localStorage.setItem(key, content[key]);
+ });
+
+ toast(window.language.toasts.imported);
+ window.stats.postEvent('tab', 'Settings imported');
+ }
+}
\ No newline at end of file
diff --git a/src/modules/helpers/stats.js b/src/modules/helpers/stats.js
index d5e182ad..4bcbf13b 100644
--- a/src/modules/helpers/stats.js
+++ b/src/modules/helpers/stats.js
@@ -1,71 +1,73 @@
export default class Stats {
- constructor(id) {
- this.id = id;
- this.domain = window.constants.UMAMI_DOMAIN;
+ constructor(id) {
+ this.id = id;
+ this.url = window.constants.UMAMI_DOMAIN + '/api/collect';
+ this.offline = (localStorage.getItem('offlineMode') !== 'true');
+ }
+
+ async postEvent(type, name) {
+ const value = name.toLowerCase().replaceAll(' ', '-');
+
+ if (!this.offline) {
+ // umami
+ await fetch(this.url, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ type: 'event',
+ payload: {
+ website: this.id,
+ url: '/',
+ event_type: type,
+ event_value: value
+ }
+ })
+ });
}
- async postEvent(type, name) {
- const value = name.toLowerCase().replaceAll(' ', '-');
+ // local
+ let data = JSON.parse(localStorage.getItem('statsData'));
+ // tl;dr this creates the objects if they don't exist
+ // this really needs a cleanup at some point
+ if (!data[type] || !data[type][value]) {
+ if (!data[type]) {
+ data[type] = {};
+ }
- await fetch(this.domain + '/api/collect', {
- method: 'POST',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify({
- type: 'event',
- payload: {
- website: this.id,
- url: '/',
- event_type: type,
- event_value: value,
- hostname: 'localhost',
- language: localStorage.getItem('language').replace('_', '-'),
- screen: `${window.screen.width}x${window.screen.height}`
- }
- })
- });
+ if (!data[type][value]) {
+ data[type][value] = 1;
+ }
+ } else {
+ data[type][value] = data[type][value] + 1;
+ }
+ localStorage.setItem('statsData', JSON.stringify(data));
+ }
- let data = JSON.parse(localStorage.getItem('statsData'));
- // tl;dr this creates the objects if they don't exist
- // this really needs a cleanup at some point
- if (!data[type] || !data[type][value]) {
- if (!data[type]) {
- data[type] = {};
- }
-
- if (!data[type][value]) {
- data[type][value] = 1;
- }
- } else {
- data[type][value] = data[type][value] + 1;
- }
- localStorage.setItem('statsData', JSON.stringify(data));
+ async tabLoad() {
+ if (!this.offline) {
+ // umami
+ await fetch(this.url, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ type: 'pageview',
+ payload: {
+ website: this.id,
+ url: '/',
+ language: localStorage.getItem('language').replace('_', '-'),
+ screen: `${window.screen.width}x${window.screen.height}`
+ }
+ })
+ });
}
- async tabLoad() {
- await fetch(this.domain + '/api/collect', {
- method: 'POST',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify({
- type: 'pageview',
- payload: {
- website: this.id,
- url: '/',
- referrer: '',
- hostname: 'localhost',
- language: localStorage.getItem('language').replace('_', '-'),
- screen: `${window.screen.width}x${window.screen.height}`
- }
- })
- });
-
- let data = JSON.parse(localStorage.getItem('statsData'));
- data['tabs-opened'] = data['tabs-opened'] + 1 || 1;
- localStorage.setItem('statsData', JSON.stringify(data));
- }
+ // local
+ let data = JSON.parse(localStorage.getItem('statsData'));
+ data['tabs-opened'] = data['tabs-opened'] + 1 || 1;
+ localStorage.setItem('statsData', JSON.stringify(data));
+ }
}
\ No newline at end of file
diff --git a/src/scss/_variables.scss b/src/scss/_variables.scss
index a830a5d2..7c0877c8 100644
--- a/src/scss/_variables.scss
+++ b/src/scss/_variables.scss
@@ -16,9 +16,9 @@ $modal: (
'tab-underline': rgba(204, 204, 204, 1),
'tab-underline-active': rgba(0, 0, 0, 1),
'border-radius': 12px,
- 'sidebar': #f0f0f0,
+ 'sidebar': rgb(240, 240, 240),
'tab-active': rgba(219, 219, 219, 0.72),
- 'sidebar-dark': #353b48,
+ 'sidebar-dark': rgb(53, 59, 72),
'tab-active-dark': rgba(65, 71, 84, 0.9),
'modal-link': #5352ed,
'modal-link-dark': #3498db
diff --git a/src/scss/index.scss b/src/scss/index.scss
index c17a4ddc..9ffc13ab 100644
--- a/src/scss/index.scss
+++ b/src/scss/index.scss
@@ -11,7 +11,7 @@ body {
}
* {
- font-family: 'Lexend Deca', 'Montserrat' !important;
+ font-family: 'Lexend Deca', 'Montserrat', sans-serif !important;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
outline: none;
diff --git a/src/scss/modules/_buttons.scss b/src/scss/modules/_buttons.scss
index a3c75e09..fbebc862 100644
--- a/src/scss/modules/_buttons.scss
+++ b/src/scss/modules/_buttons.scss
@@ -56,3 +56,27 @@
color: map-get($button-colours, 'other');
}
}
+
+.upload {
+ width: 100%;
+ height: 100%;
+ border-radius: 20px;
+ border: none;
+ outline: none;
+ padding: 50px;
+ background: var(--sidebar);
+ color: var(--modal-text);
+ cursor: pointer;
+
+ &:hover {
+ background: var(--tab-active);
+ }
+
+ svg {
+ font-size: 4em;
+ }
+
+ span {
+ font-size: 2em;
+ }
+}
\ No newline at end of file
diff --git a/src/translations/de_DE.json b/src/translations/de_DE.json
index 36c3dfed..08864006 100644
--- a/src/translations/de_DE.json
+++ b/src/translations/de_DE.json
@@ -130,7 +130,7 @@
},
"background": {
"title": "Hintergrund",
- "ddg_proxy": "DuckDuckGo Bilder Proxy verwenden",
+ "ddg_image_proxy": "DuckDuckGo Bilder Proxy verwenden",
"transition": "Weicher übergang",
"photo_information": "Show photo information",
"category": "Kategorie",
diff --git a/src/translations/en_GB.json b/src/translations/en_GB.json
index ad43cfb3..7aa2e517 100644
--- a/src/translations/en_GB.json
+++ b/src/translations/en_GB.json
@@ -130,7 +130,7 @@
},
"background": {
"title": "Background",
- "ddg_proxy": "Use DuckDuckGo image proxy",
+ "ddg_image_proxy": "Use DuckDuckGo image proxy",
"transition": "Fade-in transition",
"photo_information": "Show photo information",
"category": "Category",
diff --git a/src/translations/en_US.json b/src/translations/en_US.json
index 3ef42bd8..2e62f899 100644
--- a/src/translations/en_US.json
+++ b/src/translations/en_US.json
@@ -130,7 +130,7 @@
},
"background": {
"title": "Background",
- "ddg_proxy": "Use DuckDuckGo image proxy",
+ "ddg_image_proxy": "Use DuckDuckGo image proxy",
"transition": "Fade-in transition",
"photo_information": "Show photo information",
"category": "Category",
diff --git a/src/translations/es.json b/src/translations/es.json
index 010745d7..eadfbe16 100644
--- a/src/translations/es.json
+++ b/src/translations/es.json
@@ -130,7 +130,7 @@
},
"background": {
"title": "Fondo",
- "ddg_proxy": "Utilizar el proxy de imágenes de DuckDuckGo",
+ "ddg_image_proxy": "Utilizar el proxy de imágenes de DuckDuckGo",
"transition": "Transición fade-in",
"photo_information": "Ver información de la foto",
"category": "Categoría",
diff --git a/src/translations/fr.json b/src/translations/fr.json
index a80376e8..ea13d625 100644
--- a/src/translations/fr.json
+++ b/src/translations/fr.json
@@ -130,7 +130,7 @@
},
"background": {
"title": "Fond",
- "ddg_proxy": "Utiliser le proxy d'image DuckDuckGo",
+ "ddg_image_proxy": "Utiliser le proxy d'image DuckDuckGo",
"transition": "Transition en fondu",
"photo_information": "Show photo information",
"category": "Catégorie",
diff --git a/src/translations/nl.json b/src/translations/nl.json
index eb15853a..062ba051 100644
--- a/src/translations/nl.json
+++ b/src/translations/nl.json
@@ -130,7 +130,7 @@
},
"background": {
"title": "Achtergrond",
- "ddg_proxy": "Use DuckDuckGo image proxy",
+ "ddg_image_proxy": "Use DuckDuckGo image proxy",
"transition": "Fade-in transition",
"photo_information": "Show photo information",
"category": "Category",
diff --git a/src/translations/no.json b/src/translations/no.json
index 9abad357..10f0e46e 100644
--- a/src/translations/no.json
+++ b/src/translations/no.json
@@ -130,7 +130,7 @@
},
"background": {
"title": "Bakgrunn",
- "ddg_proxy": "Use DuckDuckGo image proxy",
+ "ddg_image_proxy": "Use DuckDuckGo image proxy",
"transition": "Fade-in transition",
"photo_information": "Show photo information",
"category": "Category",
diff --git a/src/translations/ru.json b/src/translations/ru.json
index f8ad9a69..a21a4310 100644
--- a/src/translations/ru.json
+++ b/src/translations/ru.json
@@ -130,7 +130,7 @@
},
"background": {
"title": "Фон",
- "ddg_proxy": "Use DuckDuckGo image proxy",
+ "ddg_image_proxy": "Use DuckDuckGo image proxy",
"transition": "Fade-in transition",
"photo_information": "Show photo information",
"category": "Category",
diff --git a/src/translations/zh_CN.json b/src/translations/zh_CN.json
index 6f56d984..8e073d19 100644
--- a/src/translations/zh_CN.json
+++ b/src/translations/zh_CN.json
@@ -130,7 +130,7 @@
},
"background": {
"title": "背景",
- "ddg_proxy": "使用 DuckDuckGo 图像代理",
+ "ddg_image_proxy": "使用 DuckDuckGo 图像代理",
"transition": "渐变",
"photo_information": "Show photo information",
"category": "分类",
diff --git a/webpack.config.js b/webpack.config.js
index 74cf9ea9..f728eebb 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -48,7 +48,7 @@ module.exports = {
clean: true
},
devServer: {
- contentBase: path.resolve(__dirname, './build'),
+ static: path.resolve(__dirname, './build'),
open: true,
port: 3000
},