1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-12 08:54:00 +02:00
joplin/ElectronClient/app/theme.js
Luis Orozco 6335cbedb8 Desktop: Improved: UI updates to sidebar and header, changing icon sizes and animations (#1463)
Added animation to icon in synchronize button

Moved sync report above button, which prevents the sync button from moving from its place when the report has text.

Added animation to icon in Toggle Sidebar button, using the css transition property.

Reduced font size for text and icons in header and sidebar

Changed theme color2 from white to a very light grey. It is barely
noticeable, but reduces contrast a bit, improving readability.
2019-04-28 14:20:18 +01:00

324 lines
7.4 KiB
JavaScript

const Setting = require('lib/models/Setting.js');
// globalStyle should be used for properties that do not change across themes
// i.e. should not be used for colors
const globalStyle = {
fontSize: 12,
fontFamily: 'sans-serif',
margin: 15, // No text and no interactive component should be within this margin
itemMarginTop: 10,
itemMarginBottom: 10,
fontSizeSmaller: 14,
disabledOpacity: 0.3,
buttonMinWidth: 50,
buttonMinHeight: 30,
editorFontSize: 12,
textAreaLineHeight: 17,
headerHeight: 35,
headerButtonHPadding: 6,
toolbarHeight: 35,
tagItemPadding: 3,
};
globalStyle.marginRight = globalStyle.margin;
globalStyle.marginLeft = globalStyle.margin;
globalStyle.marginTop = globalStyle.margin;
globalStyle.marginBottom = globalStyle.margin;
globalStyle.htmlMarginLeft = ((globalStyle.marginLeft / 10) * 0.6).toFixed(2) + 'em';
globalStyle.icon = {
fontSize: 30,
};
globalStyle.lineInput = {
fontFamily: globalStyle.fontFamily,
};
globalStyle.headerStyle = {
fontFamily: globalStyle.fontFamily,
};
globalStyle.inputStyle = {
border: '1px solid',
height: 24,
paddingLeft: 5,
paddingRight: 5,
boxSizing: 'border-box',
};
globalStyle.containerStyle = {
overflow: 'auto',
overflowY: 'auto',
};
globalStyle.buttonStyle = {
marginRight: 10,
border: '1px solid',
minHeight: 30,
minWidth: 80,
maxWidth: 160,
paddingLeft: 12,
paddingRight: 12,
};
const lightStyle = {
backgroundColor: "#ffffff",
backgroundColorTransparent: 'rgba(255,255,255,0.9)',
oddBackgroundColor: "#dddddd",
color: "#222222", // For regular text
colorError: "red",
colorWarn: "#9A5B00",
colorFaded: "#777777", // For less important text
colorBright: "#000000", // For important text
dividerColor: "#dddddd",
selectedColor: '#e5e5e5',
urlColor: '#155BDA',
backgroundColor2: "#162B3D",
color2: "#f5f5f5",
selectedColor2: "#0269C2",
colorError2: "#ff6c6c",
raisedBackgroundColor: "#e5e5e5",
raisedColor: "#222222",
warningBackgroundColor: "#FFD08D",
htmlColor:'#222222',
htmlBackgroundColor: 'white',
htmlDividerColor: 'rgb(230,230,230)',
htmlLinkColor: 'rgb(80,130,190)',
htmlTableBackgroundColor: 'rgb(247, 247, 247)',
htmlCodeBackgroundColor: 'rgb(243, 243, 243)',
htmlCodeBorderColor: 'rgb(220, 220, 220)',
htmlCodeColor: 'rgb(0,0,0)',
editorTheme: "chrome",
codeThemeCss: "atom-one-light.css",
};
const darkStyle = {
backgroundColor: '#1D2024',
backgroundColorTransparent: 'rgba(255,255,255,0.9)',
oddBackgroundColor: "#dddddd",
color: '#dddddd',
colorFaded: '#777777',
colorError: "red",
colorWarn: "#9A5B00",
colorFaded: "#777777", // For less important text
colorBright: "#ffffff", // For important text
dividerColor: '#555555',
selectedColor: '#333333',
urlColor: '#4E87EE',
backgroundColor2: "#181A1D",
color2: "#ffffff",
selectedColor2: "#333333",
colorError2: "#ff6c6c",
raisedBackgroundColor: "#474747",
raisedColor: "#ffffff",
warningBackgroundColor: "#CC6600",
htmlColor: 'rgb(220,220,220)',
htmlBackgroundColor: 'rgb(29,32,36)',
htmlDividerColor: '#3D444E',
htmlCodeColor: '#ffffff',
htmlLinkColor: 'rgb(166,166,255)',
htmlTableBackgroundColor: 'rgb(40, 41, 42)',
htmlCodeBackgroundColor: 'rgb(47, 48, 49)',
htmlCodeBorderColor: 'rgb(70, 70, 70)',
editorTheme: 'twilight',
codeThemeCss: "atom-one-dark-reasonable.css",
};
function addExtraStyles(style) {
style.tagStyle = {
fontSize: style.fontSize,
fontFamily: style.fontFamily,
marginTop: style.itemMarginTop * 0.4,
marginBottom: style.itemMarginBottom * 0.4,
marginRight: style.margin * 0.3,
paddingTop: style.tagItemPadding,
paddingBottom: style.tagItemPadding,
paddingRight: style.tagItemPadding * 2,
paddingLeft: style.tagItemPadding * 2,
backgroundColor: style.raisedBackgroundColor,
color: style.raisedColor,
};
style.toolbarStyle = {
height: style.toolbarHeight,
// minWidth: style.toolbarHeight,
display: 'flex',
alignItems: 'center',
paddingLeft: style.headerButtonHPadding,
paddingRight: style.headerButtonHPadding,
textDecoration: 'none',
fontFamily: style.fontFamily,
fontSize: style.fontSize,
boxSizing: 'border-box',
cursor: 'default',
justifyContent: 'center',
color: style.color,
whiteSpace: 'nowrap',
};
style.textStyle = {
fontFamily: globalStyle.fontFamily,
fontSize: style.fontSize,
lineHeight: '1.6em',
color: style.color
};
style.textStyle2 = Object.assign({}, style.textStyle,
{ color: style.color2, }
);
style.urlStyle = Object.assign({}, style.textStyle,
{
textDecoration: 'underline',
color: style.urlColor
}
);
style.h1Style = Object.assign({},
style.textStyle,
{
color: style.color,
fontSize: style.textStyle.fontSize * 1.5,
fontWeight: 'bold'
}
);
style.h2Style = Object.assign({},
style.textStyle,
{
color: style.color,
fontSize: style.textStyle.fontSize * 1.3,
fontWeight: 'bold'
}
);
style.dialogModalLayer = {
zIndex: 9999,
display: 'flex',
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
backgroundColor: 'rgba(0,0,0,0.6)',
alignItems: 'flex-start',
justifyContent: 'center',
};
style.dialogBox = {
backgroundColor: style.backgroundColor,
padding: 16,
boxShadow: '6px 6px 20px rgba(0,0,0,0.5)',
marginTop: 20,
}
style.dialogTitle = Object.assign({}, style.h1Style, { marginBottom: '1.2em' });
return style;
}
let themeCache_ = {};
function themeStyle(theme) {
if (!theme) throw new Error('Theme must be specified');
var zoomRatio = Setting.value('style.zoom') / 100;
var editorFontSize = Setting.value('style.editor.fontSize');
const cacheKey = [theme, zoomRatio, editorFontSize].join('-');
if (themeCache_[cacheKey]) return themeCache_[cacheKey];
let fontSizes = {
fontSize: Math.round(12 * zoomRatio),
editorFontSize: editorFontSize,
textAreaLineHeight: Math.round(17 * editorFontSize / 12),
// For WebView - must correspond to the properties above
htmlFontSize: Math.round(15 * zoomRatio) + 'px',
htmlLineHeight: '1.6em', //Math.round(20 * zoomRatio) + 'px'
htmlCodeFontSize: '.9em',
}
let output = {};
output.zoomRatio = zoomRatio;
output.editorFontSize = editorFontSize;
if (theme == Setting.THEME_LIGHT) {
output = Object.assign({}, globalStyle, fontSizes, lightStyle);
}
else if (theme == Setting.THEME_DARK) {
output = Object.assign({}, globalStyle, fontSizes, darkStyle);
}
// Note: All the theme specific things should go in addExtraStyles
// so that their definition is not split between here and the
// beginning of the file. At least new styles should go in
// addExtraStyles.
output.icon = Object.assign({},
output.icon,
{ color: output.color }
);
output.lineInput = Object.assign({},
output.lineInput,
{
color: output.color,
backgroundColor: output.backgroundColor,
}
);
output.headerStyle = Object.assign({},
output.headerStyle,
{
color: output.color,
backgroundColor: output.backgroundColor,
}
);
output.inputStyle = Object.assign({},
output.inputStyle,
{
color: output.color,
backgroundColor: output.backgroundColor,
borderColor: output.dividerColor,
}
);
output.containerStyle = Object.assign({},
output.containerStyle,
{
color: output.color,
backgroundColor: output.backgroundColor,
}
);
output.buttonStyle = Object.assign({},
output.buttonStyle,
{
color: output.color,
backgroundColor: output.backgroundColor,
borderColor: output.dividerColor,
}
);
output = addExtraStyles(output);
themeCache_[cacheKey] = output;
return themeCache_[cacheKey];
}
module.exports = { themeStyle };