mirror of
https://github.com/mue/mue.git
synced 2026-07-22 00:07:23 +02:00
feat: navbar hot reload, quick links zoom, add example images to welcome modal, fixes
This commit is contained in:
@@ -38,14 +38,14 @@
|
|||||||
"babel-plugin-transform-react-class-to-function": "^1.2.2",
|
"babel-plugin-transform-react-class-to-function": "^1.2.2",
|
||||||
"copy-webpack-plugin": "^9.0.1",
|
"copy-webpack-plugin": "^9.0.1",
|
||||||
"css-loader": "^5.2.6",
|
"css-loader": "^5.2.6",
|
||||||
"eslint": "^7.29.0",
|
"eslint": "^7.30.0",
|
||||||
"eslint-config-react-app": "^6.0.0",
|
"eslint-config-react-app": "^6.0.0",
|
||||||
"html-webpack-plugin": "^5.3.2",
|
"html-webpack-plugin": "^5.3.2",
|
||||||
"mini-css-extract-plugin": "^2.0.0",
|
"mini-css-extract-plugin": "^2.0.0",
|
||||||
"sass": "^1.35.1",
|
"sass": "^1.35.1",
|
||||||
"sass-loader": "^12.1.0",
|
"sass-loader": "^12.1.0",
|
||||||
"source-map-loader": "^3.0.0",
|
"source-map-loader": "^3.0.0",
|
||||||
"webpack": "^5.41.1",
|
"webpack": "^5.42.0",
|
||||||
"webpack-cli": "^4.7.2",
|
"webpack-cli": "^4.7.2",
|
||||||
"webpack-dev-server": "^4.0.0-beta.3"
|
"webpack-dev-server": "^4.0.0-beta.3"
|
||||||
},
|
},
|
||||||
|
|||||||
BIN
public/welcome-images/example1.webp
Normal file
BIN
public/welcome-images/example1.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 49 KiB |
BIN
public/welcome-images/example2.webp
Normal file
BIN
public/welcome-images/example2.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.0 KiB |
BIN
public/welcome-images/example3.webp
Normal file
BIN
public/welcome-images/example3.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
BIN
public/welcome-images/example4.webp
Normal file
BIN
public/welcome-images/example4.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
@@ -28,8 +28,8 @@ export default function AppearanceSettings() {
|
|||||||
<Radio name='theme' title={appearance.theme.title} options={themeOptions} category='other' />
|
<Radio name='theme' title={appearance.theme.title} options={themeOptions} category='other' />
|
||||||
|
|
||||||
<h3>{appearance.navbar.title}</h3>
|
<h3>{appearance.navbar.title}</h3>
|
||||||
<Checkbox name='notesEnabled' text={appearance.navbar.notes} element='.other' />
|
<Checkbox name='notesEnabled' text={appearance.navbar.notes} category='navbar' />
|
||||||
<Checkbox name='refresh' text={appearance.navbar.refresh} element='.other' />
|
<Checkbox name='refresh' text={appearance.navbar.refresh} category='navbar' />
|
||||||
|
|
||||||
<h3>{appearance.font.title}</h3>
|
<h3>{appearance.font.title}</h3>
|
||||||
<Text title={appearance.font.custom} name='font' upperCaseFirst={true} category='other' />
|
<Text title={appearance.font.custom} name='font' upperCaseFirst={true} category='other' />
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import Switch from '../Switch';
|
import Switch from '../Switch';
|
||||||
import Checkbox from '../Checkbox';
|
import Checkbox from '../Checkbox';
|
||||||
|
import Slider from '../Slider';
|
||||||
|
|
||||||
export default function QuickLinks() {
|
export default function QuickLinks() {
|
||||||
const language = window.language.modals.main.settings.sections.quicklinks;
|
const language = window.language.modals.main.settings.sections.quicklinks;
|
||||||
@@ -11,6 +12,7 @@ export default function QuickLinks() {
|
|||||||
<Checkbox name='quicklinksddgProxy' text={window.language.modals.main.settings.sections.background.ddg_image_proxy} element='.other' />
|
<Checkbox name='quicklinksddgProxy' text={window.language.modals.main.settings.sections.background.ddg_image_proxy} element='.other' />
|
||||||
<Checkbox name='quicklinksnewtab' text={language.open_new} category='quicklinks' />
|
<Checkbox name='quicklinksnewtab' text={language.open_new} category='quicklinks' />
|
||||||
<Checkbox name='quicklinkstooltip' text={language.tooltip} category='quicklinks' />
|
<Checkbox name='quicklinkstooltip' text={language.tooltip} category='quicklinks' />
|
||||||
|
<Slider title={window.language.modals.main.settings.sections.appearance.accessibility.widget_zoom} name='zoomQuicklinks' min='10' max='400' default='100' display='%' category='quicklinks' element='.quicklinks-container' />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,8 +169,8 @@ export default class BackgroundSettings extends React.PureComponent {
|
|||||||
{backgroundSettings}
|
{backgroundSettings}
|
||||||
|
|
||||||
<h3>{background.buttons.title}</h3>
|
<h3>{background.buttons.title}</h3>
|
||||||
<Checkbox name='view' text={background.buttons.view} element='.other' />
|
<Checkbox name='view' text={background.buttons.view} category='navbar' />
|
||||||
<Checkbox name='favouriteEnabled' text={background.buttons.favourite} element='.other' />
|
<Checkbox name='favouriteEnabled' text={background.buttons.favourite} category='navbar' />
|
||||||
<Checkbox name='downloadbtn' text={background.buttons.download} element='.other' />
|
<Checkbox name='downloadbtn' text={background.buttons.download} element='.other' />
|
||||||
|
|
||||||
<h3>{background.effects.title}</h3>
|
<h3>{background.effects.title}</h3>
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ export default class WelcomeSections extends React.Component {
|
|||||||
welcomeImage: 0
|
welcomeImage: 0
|
||||||
};
|
};
|
||||||
this.changeWelcomeImg = this.changeWelcomeImg.bind(this);
|
this.changeWelcomeImg = this.changeWelcomeImg.bind(this);
|
||||||
this.welcomeImages = ['https://external-content.duckduckgo.com/iu/?u=example.com/example.png'];
|
this.welcomeImages = ['./welcome-images/example1.webp', './welcome-images/example2.webp', './welcome-images/example3.webp', './welcome-images/example4.webp'];
|
||||||
}
|
}
|
||||||
|
|
||||||
changeTheme(type) {
|
changeTheme(type) {
|
||||||
@@ -58,6 +58,12 @@ export default class WelcomeSections extends React.Component {
|
|||||||
this.timeout = setTimeout(this.changeWelcomeImg, 3 * 1000);
|
this.timeout = setTimeout(this.changeWelcomeImg, 3 * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
if (this.timeout) {
|
||||||
|
clearTimeout(this.timeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const language = window.language.modals.welcome;
|
const language = window.language.modals.welcome;
|
||||||
let tabContent;
|
let tabContent;
|
||||||
@@ -66,7 +72,7 @@ export default class WelcomeSections extends React.Component {
|
|||||||
<>
|
<>
|
||||||
<h1>{language.sections.intro.title}</h1>
|
<h1>{language.sections.intro.title}</h1>
|
||||||
<p>{language.sections.intro.description}</p>
|
<p>{language.sections.intro.description}</p>
|
||||||
<h3 className='quicktip'>to be added</h3>
|
<h3 className='quicktip'>#shareyourmue</h3>
|
||||||
<div className='examples'>
|
<div className='examples'>
|
||||||
<img src={this.welcomeImages[this.state.welcomeImage]} alt='example mue setup' draggable={false}/>
|
<img src={this.welcomeImages[this.state.welcomeImage]} alt='example mue setup' draggable={false}/>
|
||||||
</div>
|
</div>
|
||||||
@@ -81,6 +87,7 @@ export default class WelcomeSections extends React.Component {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { appearance } = window.language.modals.main.settings.sections;
|
||||||
const theme = (
|
const theme = (
|
||||||
<>
|
<>
|
||||||
<h1>{language.sections.theme.title}</h1>
|
<h1>{language.sections.theme.title}</h1>
|
||||||
@@ -88,16 +95,16 @@ export default class WelcomeSections extends React.Component {
|
|||||||
<div className='themesToggleArea'>
|
<div className='themesToggleArea'>
|
||||||
<div className={this.state.autoClass} onClick={() => this.changeTheme('auto')}>
|
<div className={this.state.autoClass} onClick={() => this.changeTheme('auto')}>
|
||||||
<AutoIcon/>
|
<AutoIcon/>
|
||||||
<span>Auto</span>
|
<span>{appearance.theme.auto}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className='options'>
|
<div className='options'>
|
||||||
<div className={this.state.lightClass} onClick={() => this.changeTheme('light')}>
|
<div className={this.state.lightClass} onClick={() => this.changeTheme('light')}>
|
||||||
<LightModeIcon/>
|
<LightModeIcon/>
|
||||||
<span>Light</span>
|
<span>{appearance.theme.light}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className={this.state.darkClass} onClick={() => this.changeTheme('dark')}>
|
<div className={this.state.darkClass} onClick={() => this.changeTheme('dark')}>
|
||||||
<DarkModeIcon/>
|
<DarkModeIcon/>
|
||||||
<span>Dark</span>
|
<span>{appearance.theme.dark}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h3 className='quicktip'>{language.tip}</h3>
|
<h3 className='quicktip'>{language.tip}</h3>
|
||||||
@@ -139,7 +146,7 @@ export default class WelcomeSections extends React.Component {
|
|||||||
<div className='toggle' onClick={() => this.props.switchTab(3)}>Theme: {this.getSetting('theme')}</div>
|
<div className='toggle' onClick={() => this.props.switchTab(3)}>Theme: {this.getSetting('theme')}</div>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)
|
);
|
||||||
|
|
||||||
switch (this.props.currentTab) {
|
switch (this.props.currentTab) {
|
||||||
case 1: tabContent = chooseLanguage; break;
|
case 1: tabContent = chooseLanguage; break;
|
||||||
|
|||||||
@@ -43,9 +43,9 @@ export default class Widgets extends React.PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
// don't hide when welcome is there
|
// don't show when welcome is there
|
||||||
if (localStorage.getItem('showWelcome') === 'true') {
|
if (localStorage.getItem('showWelcome') !== 'false') {
|
||||||
return <div id='widgets'></div>
|
return <div id='widgets'></div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
// allow for re-ordering widgets
|
// allow for re-ordering widgets
|
||||||
@@ -57,7 +57,7 @@ export default class Widgets extends React.PureComponent {
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// prevent error
|
// prevent error
|
||||||
elements = ['greeting', 'time', 'quicklinks', 'quote', 'date'];
|
elements = [<Greeting/>, <Clock/>, <QuickLinks/>, <Quote/>, <Date/>];
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -10,42 +10,54 @@ import Maximise from '../background/Maximise';
|
|||||||
import Favourite from '../background/Favourite';
|
import Favourite from '../background/Favourite';
|
||||||
import Tooltip from '../../helpers/tooltip/Tooltip';
|
import Tooltip from '../../helpers/tooltip/Tooltip';
|
||||||
|
|
||||||
|
import EventBus from '../../../modules/helpers/eventbus';
|
||||||
|
|
||||||
import './scss/index.scss';
|
import './scss/index.scss';
|
||||||
|
|
||||||
export default function Navbar(props) {
|
export default class Navbar extends React.Component {
|
||||||
if (localStorage.getItem('showWelcome') === 'true') {
|
componentDidMount() {
|
||||||
return null;
|
EventBus.on('refresh', (data) => {
|
||||||
|
if (data === 'navbar') {
|
||||||
|
this.forceUpdate();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const backgroundEnabled = (localStorage.getItem('background') === 'true');
|
render() {
|
||||||
|
if (localStorage.getItem('showWelcome') !== 'false') {
|
||||||
return (
|
return null;
|
||||||
<div className='navbar-container'>
|
}
|
||||||
{(localStorage.getItem('view') === 'true' && backgroundEnabled) ? <Maximise/> : null}
|
|
||||||
{(localStorage.getItem('favouriteEnabled') === 'true' && backgroundEnabled) ? <Favourite/> : null}
|
|
||||||
|
|
||||||
{(localStorage.getItem('notesEnabled') === 'true') ?
|
const backgroundEnabled = (localStorage.getItem('background') === 'true');
|
||||||
<div className='notes'>
|
|
||||||
<NotesIcon className='topicons'/>
|
return (
|
||||||
<Notes/>
|
<div className='navbar-container'>
|
||||||
</div>
|
{(localStorage.getItem('view') === 'true' && backgroundEnabled) ? <Maximise/> : null}
|
||||||
: null}
|
{(localStorage.getItem('favouriteEnabled') === 'true' && backgroundEnabled) ? <Favourite/> : null}
|
||||||
|
|
||||||
{(window.constants.BETA_VERSION === true) ?
|
{(localStorage.getItem('notesEnabled') === 'true') ?
|
||||||
<Tooltip title={window.language.widgets.navbar.tooltips.feedback}>
|
<div className='notes'>
|
||||||
<Report className='topicons' onClick={() => props.openModal('feedbackModal')}/>
|
<NotesIcon className='topicons'/>
|
||||||
|
<Notes/>
|
||||||
|
</div>
|
||||||
|
: null}
|
||||||
|
|
||||||
|
{(window.constants.BETA_VERSION === true) ?
|
||||||
|
<Tooltip title={window.language.widgets.navbar.tooltips.feedback}>
|
||||||
|
<Report className='topicons' onClick={() => this.props.openModal('feedbackModal')}/>
|
||||||
|
</Tooltip>
|
||||||
|
: null}
|
||||||
|
|
||||||
|
{(localStorage.getItem('refresh') === 'true') ?
|
||||||
|
<Tooltip title={window.language.widgets.navbar.tooltips.refresh}>
|
||||||
|
<RefreshIcon className='refreshicon topicons' onClick={() => window.location.reload()}/>
|
||||||
|
</Tooltip>
|
||||||
|
: null}
|
||||||
|
|
||||||
|
<Tooltip title={window.language.modals.main.navbar.settings}>
|
||||||
|
<Gear className='settings-icon topicons' onClick={() => this.props.openModal('mainModal')}/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
: null}
|
</div>
|
||||||
|
);
|
||||||
{(localStorage.getItem('refresh') === 'true') ?
|
}
|
||||||
<Tooltip title={window.language.widgets.navbar.tooltips.refresh}>
|
|
||||||
<RefreshIcon className='refreshicon topicons' onClick={() => window.location.reload()}/>
|
|
||||||
</Tooltip>
|
|
||||||
: null}
|
|
||||||
|
|
||||||
<Tooltip title={window.language.modals.main.navbar.settings}>
|
|
||||||
<Gear className='settings-icon topicons' onClick={() => props.openModal('mainModal')}/>
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,13 @@ export default class QuickLinks extends React.PureComponent {
|
|||||||
window.stats.postEvent('feature', 'Quicklink add');
|
window.stats.postEvent('feature', 'Quicklink add');
|
||||||
|
|
||||||
this.toggleAdd();
|
this.toggleAdd();
|
||||||
|
|
||||||
|
// make sure image is correct size
|
||||||
|
const element = document.querySelector('.quicklinks-container');
|
||||||
|
const images = element.getElementsByTagName('img');
|
||||||
|
for (const img of images) {
|
||||||
|
img.style.height = `${0.87 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleAdd = () => {
|
toggleAdd = () => {
|
||||||
@@ -102,6 +109,12 @@ export default class QuickLinks extends React.PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
element.style.display = 'block';
|
element.style.display = 'block';
|
||||||
|
const images = element.getElementsByTagName('img');
|
||||||
|
for (const img of images) {
|
||||||
|
img.style.height = `${0.87 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
|
||||||
|
};
|
||||||
|
element.querySelector('button').style.fontSize = `${1.15 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
items: JSON.parse(localStorage.getItem('quicklinks'))
|
items: JSON.parse(localStorage.getItem('quicklinks'))
|
||||||
});
|
});
|
||||||
@@ -117,6 +130,13 @@ export default class QuickLinks extends React.PureComponent {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const element = document.querySelector('.quicklinks-container');
|
||||||
|
const images = element.getElementsByTagName('img');
|
||||||
|
for (const img of images) {
|
||||||
|
img.style.height = `${0.87 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
|
||||||
|
};
|
||||||
|
element.querySelector('button').style.fontSize = `${1.15 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"new": "Neuer Link",
|
"new": "Neuer Link",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"add": "hinzufügen",
|
"add": "Hinzufügen",
|
||||||
"name_error": "Muss einen Namen angeben",
|
"name_error": "Muss einen Namen angeben",
|
||||||
"url_error": "Muss eine URL angeben"
|
"url_error": "Muss eine URL angeben"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -64,6 +64,10 @@ module.exports = {
|
|||||||
{
|
{
|
||||||
from: 'public/offline-images',
|
from: 'public/offline-images',
|
||||||
to: 'offline-images'
|
to: 'offline-images'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: 'public/welcome-images',
|
||||||
|
to: 'welcome-images'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}),
|
}),
|
||||||
|
|||||||
Reference in New Issue
Block a user