New: Cleanup UI tooling, Update to Webpack 4, Gulp 4 (#655)

* New: Webpack 4

* New: Gulp 4

* New: Transpile UI for old browsers

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
pull/661/head
Qstick 5 years ago committed by GitHub
parent fe3761fc2e
commit 0a6f552d5b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1 +0,0 @@
save-prefix=""

@ -0,0 +1,35 @@
const loose = true;
module.exports = {
plugins: [
// Stage 1
'@babel/plugin-proposal-export-default-from',
['@babel/plugin-proposal-optional-chaining', { loose }],
['@babel/plugin-proposal-nullish-coalescing-operator', { loose }],
// Stage 2
'@babel/plugin-proposal-export-namespace-from',
// Stage 3
['@babel/plugin-proposal-class-properties', { loose }],
'@babel/plugin-syntax-dynamic-import'
],
env: {
development: {
presets: [
['@babel/preset-react', { development: true }]
],
plugins: [
'babel-plugin-inline-classnames'
]
},
production: {
presets: [
'@babel/preset-react'
],
plugins: [
'babel-plugin-transform-react-remove-prop-types'
]
}
}
};

@ -0,0 +1,6 @@
module.exports = [
'>0.25%',
'not ie 11',
'not op_mini all',
'not chrome < 60'
];

@ -1,15 +1,17 @@
const gulp = require('gulp'); const gulp = require('gulp');
const runSequence = require('run-sequence');
require('./clean'); require('./clean');
require('./copy'); require('./copy');
require('./webpack');
gulp.task('build', () => { gulp.task('build',
return runSequence('clean', [ gulp.series('clean',
'webpack', gulp.parallel(
'copyHtml', 'webpack',
'copyFonts', 'copyHtml',
'copyImages', 'copyFonts',
'copyJs' 'copyImages',
]); 'copyJs'
}); )
)
);

@ -1,9 +1,10 @@
var path = require('path'); const path = require('path');
var gulp = require('gulp'); const gulp = require('gulp');
var print = require('gulp-print').default; const print = require('gulp-print').default;
var cache = require('gulp-cached'); const cache = require('gulp-cached');
var livereload = require('gulp-livereload'); const flatten = require('gulp-flatten');
var paths = require('./helpers/paths.js'); const livereload = require('gulp-livereload');
const paths = require('./helpers/paths.js');
gulp.task('copyJs', () => { gulp.task('copyJs', () => {
return gulp.src( return gulp.src(
@ -12,6 +13,7 @@ gulp.task('copyJs', () => {
]) ])
.pipe(cache('copyJs')) .pipe(cache('copyJs'))
.pipe(print()) .pipe(print())
.pipe(flatten())
.pipe(gulp.dest(paths.dest.root)) .pipe(gulp.dest(paths.dest.root))
.pipe(livereload()); .pipe(livereload());
}); });
@ -30,7 +32,8 @@ gulp.task('copyFonts', () => {
) )
.pipe(cache('copyFonts')) .pipe(cache('copyFonts'))
.pipe(print()) .pipe(print())
.pipe(gulp.dest(paths.dest.fonts)) .pipe(flatten({ subPath: 2 }))
.pipe(gulp.dest(paths.dest.root))
.pipe(livereload()); .pipe(livereload());
}); });
@ -40,6 +43,7 @@ gulp.task('copyImages', () => {
) )
.pipe(cache('copyImages')) .pipe(cache('copyImages'))
.pipe(print()) .pipe(print())
.pipe(gulp.dest(paths.dest.images)) .pipe(flatten({ subPath: 2 }))
.pipe(gulp.dest(paths.dest.root))
.pipe(livereload()); .pipe(livereload());
}); });

@ -1,8 +1,5 @@
require('./build.js'); require('./build.js');
require('./clean.js'); require('./clean.js');
require('./copy.js'); require('./copy.js');
require('./imageMin.js');
require('./start.js');
require('./stripBom.js');
require('./watch.js'); require('./watch.js');
require('./webpack.js'); require('./webpack.js');

@ -1,6 +1,6 @@
const gulpUtil = require('gulp-util'); const colors = require('ansi-colors');
module.exports = function errorHandler(error) { module.exports = function errorHandler(error) {
gulpUtil.log(gulpUtil.colors.red(`Error (${error.plugin}): ${error.message}`)); console.log(colors.red(`Error (${error.plugin}): ${error.message}`));
this.emit('end'); this.emit('end');
}; };

@ -1,15 +0,0 @@
const path = require('path');
const rootPath = path.resolve(__dirname + '/../../src/');
module.exports = function(source) {
if (this.cacheable) {
this.cacheable();
}
const resourcePath = this.resourcePath.replace(rootPath, '');
const wrappedSource =`
<!-- begin ${resourcePath} -->
${source}
<!-- end ${resourcePath} -->`;
return wrappedSource;
};

@ -3,11 +3,11 @@ const root = './frontend/src/';
const paths = { const paths = {
src: { src: {
root, root,
html: root + '*.html', html: `${root}*.html`,
scripts: root + '**/*.js', scripts: `${root}**/*.js`,
content: root + 'Content/', content: `${root}Content/`,
fonts: root + 'Content/Fonts/', fonts: `${root}Content/Fonts/`,
images: root + 'Content/Images/', images: `${root}Content/Images/`,
exclude: { exclude: {
libs: `!${root}JsLibraries/**` libs: `!${root}JsLibraries/**`
} }

@ -1,15 +0,0 @@
var gulp = require('gulp');
var print = require('gulp-print').default;
var paths = require('./helpers/paths.js');
gulp.task('imageMin', () => {
var imagemin = require('gulp-imagemin');
return gulp.src(paths.src.images)
.pipe(imagemin({
progressive: false,
optimizationLevel: 4,
svgoPlugins: [{ removeViewBox: false }]
}))
.pipe(print())
.pipe(gulp.dest(paths.src.content + 'Images/'));
});

@ -1,104 +0,0 @@
// will download and run lidarr (server) in a non-windows enviroment
// you can use this if you don't care about the server code and just want to work
// with the web code.
var http = require('http');
var gulp = require('gulp');
var fs = require('fs');
var targz = require('tar.gz');
var del = require('del');
var spawn = require('child_process').spawn;
function download(url, dest, cb) {
console.log('Downloading ' + url + ' to ' + dest);
var file = fs.createWriteStream(dest);
http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
console.log('Download completed');
file.close(cb);
});
});
}
function getLatest(cb) {
var branch = 'develop';
process.argv.forEach(function(val) {
var branchMatch = /branch=([\S]*)/.exec(val);
if (branchMatch && branchMatch.length > 1) {
branch = branchMatch[1];
}
});
var url = 'http://services.lidarr.audio/v1/update/' + branch + '?os=osx';
console.log('Checking for latest version:', url);
http.get(url, function(res) {
var data = '';
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
var updatePackage = JSON.parse(data).updatePackage;
console.log('Latest version available: ' + updatePackage.version + ' Release Date: ' + updatePackage.releaseDate);
cb(updatePackage);
});
}).on('error', function(e) {
console.log('problem with request: ' + e.message);
});
}
function extract(source, dest, cb) {
console.log('extracting download page to ' + dest);
new targz().extract(source, dest, function(err) {
if (err) {
console.log(err);
}
console.log('Update package extracted.');
cb();
});
}
gulp.task('getSonarr', function() {
try {
fs.mkdirSync('./_start/');
} catch (e) {
if (e.code !== 'EEXIST') {
throw e;
}
}
getLatest(function(updatePackage) {
var packagePath = './_start/' + updatePackage.filename;
var dirName = './_start/' + updatePackage.version;
download(updatePackage.url, packagePath, function() {
extract(packagePath, dirName, function() {
// clean old binaries
console.log('Cleaning old binaries');
del.sync(['./_output/*', '!./_output/UI/']);
console.log('copying binaries to target');
gulp.src(dirName + '/Lidarr/*.*')
.pipe(gulp.dest('./_output/'));
});
});
});
});
gulp.task('startSonarr', function() {
var ls = spawn('mono', ['--debug', './_output/Lidarr.exe']);
ls.stdout.on('data', function(data) {
process.stdout.write(data);
});
ls.stderr.on('data', function(data) {
process.stdout.write(data);
});
ls.on('close', function(code) {
console.log('child process exited with code ' + code);
});
});

@ -1,13 +0,0 @@
const gulp = require('gulp');
const paths = require('./helpers/paths.js');
const stripbom = require('gulp-stripbom');
function stripBom(dest) {
gulp.src([paths.src.scripts, paths.src.exclude.libs])
.pipe(stripbom({ showLog: false }))
.pipe(gulp.dest(dest));
}
gulp.task('stripBom', () => {
stripBom(paths.src.root);
});

@ -1,27 +1,18 @@
const gulp = require('gulp'); const gulp = require('gulp');
const livereload = require('gulp-livereload'); const livereload = require('gulp-livereload');
const watch = require('gulp-watch'); const gulpWatch = require('gulp-watch');
const paths = require('./helpers/paths.js'); const paths = require('./helpers/paths.js');
require('./copy.js'); require('./copy.js');
require('./webpack.js'); require('./webpack.js');
function watchTask(glob, task) { function watch() {
const options = {
name: `watch: ${task}`,
verbose: true
};
return watch(glob, options, () => {
gulp.start(task);
});
}
gulp.task('watch', ['copyHtml', 'copyFonts', 'copyImages', 'copyJs'], () => {
livereload.listen({ start: true }); livereload.listen({ start: true });
gulp.start('webpackWatch'); gulp.task('webpackWatch')();
gulpWatch(paths.src.html, gulp.series('copyHtml'));
gulpWatch(`${paths.src.fonts}**/*.*`, gulp.series('copyFonts'));
gulpWatch(`${paths.src.images}**/*.*`, gulp.series('copyImages'));
}
watchTask(paths.src.html, 'copyHtml'); gulp.task('watch', gulp.series('build', watch));
watchTask(`${paths.src.fonts}**/*.*`, 'copyFonts');
watchTask(`${paths.src.images}**/*.*`, 'copyImages');
});

@ -4,15 +4,16 @@ const livereload = require('gulp-livereload');
const path = require('path'); const path = require('path');
const webpack = require('webpack'); const webpack = require('webpack');
const errorHandler = require('./helpers/errorHandler'); const errorHandler = require('./helpers/errorHandler');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const browsers = require('../browsers');
const uiFolder = 'UI'; const uiFolder = 'UI';
const root = path.join(__dirname, '..', 'src'); const frontendFolder = path.join(__dirname, '..');
const srcFolder = path.join(frontendFolder, 'src');
const isProduction = process.argv.indexOf('--production') > -1; const isProduction = process.argv.indexOf('--production') > -1;
console.log('ROOT:', root); console.log('Source Folder:', srcFolder);
console.log('isProduction:', isProduction); console.log('isProduction:', isProduction);
const cssVarsFiles = [ const cssVarsFiles = [
@ -22,74 +23,21 @@ const cssVarsFiles = [
'../src/Styles/Variables/animations' '../src/Styles/Variables/animations'
].map(require.resolve); ].map(require.resolve);
const extractCSSPlugin = new ExtractTextPlugin({
filename: path.join('_output', uiFolder, 'Content', 'styles.css'),
allChunks: true,
disable: false,
ignoreOrder: true
});
const plugins = [ const plugins = [
extractCSSPlugin,
new OptimizeCssAssetsPlugin({}), new OptimizeCssAssetsPlugin({}),
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor'
}),
new webpack.DefinePlugin({ new webpack.DefinePlugin({
__DEV__: !isProduction, __DEV__: !isProduction,
'process.env.NODE_ENV': isProduction ? JSON.stringify('production') : JSON.stringify('development') 'process.env.NODE_ENV': isProduction ? JSON.stringify('production') : JSON.stringify('development')
}),
new MiniCssExtractPlugin({
filename: path.join('_output', uiFolder, 'Content', 'styles.css')
}) })
]; ];
function babelPlugins() {
const bplugins = [];
bplugins.push(
'@babel/plugin-proposal-class-properties',
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-syntax-import-meta',
'@babel/plugin-proposal-json-strings',
[
'@babel/plugin-proposal-decorators',
{
legacy: true
}
],
'@babel/plugin-proposal-function-sent',
'@babel/plugin-proposal-export-namespace-from',
'@babel/plugin-proposal-numeric-separator',
'@babel/plugin-proposal-throw-expressions'
);
if (process.env.NODE_ENV !== 'production') {
bplugins.push('@babel/transform-react-jsx-source');
}
if (process.env.NODE_ENV === 'production') {
bplugins.push('transform-react-remove-prop-types');
}
return bplugins;
}
if (isProduction) {
plugins.push(new UglifyJSPlugin({
sourceMap: true,
uglifyOptions: {
mangle: false,
output: {
comments: false,
beautify: true
}
}
}));
}
const config = { const config = {
mode: isProduction ? 'production' : 'development',
devtool: '#source-map', devtool: '#source-map',
stats: { stats: {
@ -108,8 +56,8 @@ const config = {
resolve: { resolve: {
modules: [ modules: [
root, srcFolder,
path.join(root, 'Shims'), path.join(srcFolder, 'Shims'),
'node_modules' 'node_modules'
], ],
alias: { alias: {
@ -122,6 +70,10 @@ const config = {
sourceMapFilename: '[file].map' sourceMapFilename: '[file].map'
}, },
optimization: {
chunkIds: 'named'
},
plugins, plugins,
resolveLoader: { resolveLoader: {
@ -136,48 +88,56 @@ const config = {
{ {
test: /\.js?$/, test: /\.js?$/,
exclude: /(node_modules|JsLibraries)/, exclude: /(node_modules|JsLibraries)/,
loader: 'babel-loader', use: [
options: { {
plugins: babelPlugins(), loader: 'babel-loader',
presets: ['@babel/env', '@babel/react'] options: {
} configFile: `${frontendFolder}/babel.config.js`,
envName: isProduction ? 'production' : 'development',
presets: [
[
'@babel/preset-env',
{
modules: false,
loose: true,
debug: false,
useBuiltIns: 'entry',
targets: browsers
}
]
]
}
}
]
}, },
// CSS Modules // CSS Modules
{ {
test: /\.css$/, test: /\.css$/,
exclude: /(node_modules|globals.css)/, exclude: /(node_modules|globals.css)/,
use: extractCSSPlugin.extract({ use: [
fallback: 'style-loader', { loader: MiniCssExtractPlugin.loader },
use: [ {
{ loader: 'css-loader',
loader: 'css-variables-loader', options: {
options: { importLoaders: 1,
cssVarsFiles localIdentName: '[name]/[local]/[hash:base64:5]',
} modules: true
}, }
{ },
loader: 'css-loader', {
options: { loader: 'postcss-loader',
modules: true, options: {
importLoaders: 1, ident: 'postcss',
localIdentName: '[name]-[local]-[hash:base64:5]', config: {
sourceMap: true ctx: {
} cssVarsFiles
}, },
{ path: 'frontend/postcss.config.js'
loader: 'postcss-loader',
options: {
config: {
ctx: {
cssVarsFiles
},
path: 'frontend/postcss.config.js'
}
} }
} }
] }
}) ]
}, },
// Global styles // Global styles
@ -225,17 +185,16 @@ const config = {
}; };
gulp.task('webpack', () => { gulp.task('webpack', () => {
return gulp.src('index.js') return webpackStream(config, webpack)
.pipe(webpackStream(config, webpack)) .pipe(gulp.dest('./'));
.pipe(gulp.dest(''));
}); });
gulp.task('webpackWatch', () => { gulp.task('webpackWatch', () => {
config.watch = true; config.watch = true;
return gulp.src('')
.pipe(webpackStream(config, webpack)) return webpackStream(config, webpack)
.on('error', errorHandler) .on('error', errorHandler)
.pipe(gulp.dest('')) .pipe(gulp.dest('./'))
.on('error', errorHandler) .on('error', errorHandler)
.pipe(livereload()) .pipe(livereload())
.on('error', errorHandler); .on('error', errorHandler);

@ -1,4 +1,5 @@
const reload = require('require-nocache')(module); const reload = require('require-nocache')(module);
const browsers = require('./browsers');
module.exports = (ctx, configPath, options) => { module.exports = (ctx, configPath, options) => {
const config = { const config = {
@ -17,15 +18,7 @@ module.exports = (ctx, configPath, options) => {
'postcss-color-function': {}, 'postcss-color-function': {},
'postcss-nested': {}, 'postcss-nested': {},
autoprefixer: { autoprefixer: {
browsers: [ browsers
'Chrome >= 30',
'Firefox >= 30',
'Safari >= 6',
'Edge >= 12',
'Explorer >= 11',
'iOS >= 7',
'Android >= 4.4'
]
} }
} }
}; };

@ -1,18 +1,18 @@
.language, .language,
.quality { .quality {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 100px; width: 100px;
} }
.indexer { .indexer {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 80px; width: 80px;
} }
.actions { .actions {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 70px; width: 70px;
} }

@ -1,5 +1,5 @@
.description { .description {
composes: title from 'Components/DescriptionList/DescriptionListItemDescription.css'; composes: title from '~Components/DescriptionList/DescriptionListItemDescription.css';
overflow-wrap: break-word; overflow-wrap: break-word;
} }

@ -1,5 +1,5 @@
.markAsFailedButton { .markAsFailedButton {
composes: button from 'Components/Link/Button.css'; composes: button from '~Components/Link/Button.css';
margin-right: auto; margin-right: auto;
} }

@ -1,5 +1,5 @@
.cell { .cell {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 35px; width: 35px;
text-align: center; text-align: center;

@ -1,23 +1,23 @@
.downloadClient { .downloadClient {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 120px; width: 120px;
} }
.indexer { .indexer {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 80px; width: 80px;
} }
.releaseGroup { .releaseGroup {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 110px; width: 110px;
} }
.details { .details {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 30px; width: 30px;
} }

@ -1,12 +1,12 @@
.torrent { .torrent {
composes: label from 'Components/Label.css'; composes: label from '~Components/Label.css';
border-color: $torrentColor; border-color: $torrentColor;
background-color: $torrentColor; background-color: $torrentColor;
} }
.usenet { .usenet {
composes: label from 'Components/Label.css'; composes: label from '~Components/Label.css';
border-color: $usenetColor; border-color: $usenetColor;
background-color: $usenetColor; background-color: $usenetColor;

@ -1,23 +1,23 @@
.quality { .quality {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 150px; width: 150px;
} }
.protocol { .protocol {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 100px; width: 100px;
} }
.progress { .progress {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 150px; width: 150px;
} }
.actions { .actions {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 90px; width: 90px;
} }

@ -1,5 +1,5 @@
.status { .status {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 30px; width: 30px;
} }

@ -1,5 +1,5 @@
.timeleft { .timeleft {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 100px; width: 100px;
} }

@ -17,7 +17,7 @@
} }
.searchInput { .searchInput {
composes: input from 'Components/Form/TextInput.css'; composes: input from '~Components/Form/TextInput.css';
height: 46px; height: 46px;
border-radius: 0; border-radius: 0;

@ -38,29 +38,29 @@
} }
.searchForMissingAlbumsContainer { .searchForMissingAlbumsContainer {
composes: container from 'Components/Form/CheckInput.css'; composes: container from '~Components/Form/CheckInput.css';
flex: 0 1 0; flex: 0 1 0;
} }
.searchForMissingAlbumsInput { .searchForMissingAlbumsInput {
composes: input from 'Components/Form/CheckInput.css'; composes: input from '~Components/Form/CheckInput.css';
margin-top: 0; margin-top: 0;
} }
.modalFooter { .modalFooter {
composes: modalFooter from 'Components/Modal/ModalFooter.css'; composes: modalFooter from '~Components/Modal/ModalFooter.css';
} }
.addButton { .addButton {
@add-mixin truncate; @add-mixin truncate;
composes: button from 'Components/Link/SpinnerButton.css'; composes: button from '~Components/Link/SpinnerButton.css';
} }
.hideLanguageProfile, .hideLanguageProfile,
.hideMetadataProfile { .hideMetadataProfile {
composes: group from 'Components/Form/FormGroup.css'; composes: group from '~Components/Form/FormGroup.css';
display: none; display: none;
} }

@ -14,7 +14,7 @@
} }
.importButton { .importButton {
composes: button from 'Components/Link/SpinnerButton.css'; composes: button from '~Components/Link/SpinnerButton.css';
height: 35px; height: 35px;
} }
@ -26,7 +26,7 @@
} }
.loading { .loading {
composes: loading from 'Components/Loading/LoadingIndicator.css'; composes: loading from '~Components/Loading/LoadingIndicator.css';
margin: 0 10px 0 12px; margin: 0 10px 0 12px;
text-align: left; text-align: left;

@ -1,11 +1,11 @@
.folder { .folder {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 1 0 200px; flex: 1 0 200px;
} }
.monitor { .monitor {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 1 200px; flex: 0 1 200px;
min-width: 185px; min-width: 185px;
@ -14,21 +14,21 @@
.qualityProfile, .qualityProfile,
.languageProfile, .languageProfile,
.metadataProfile { .metadataProfile {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 1 250px; flex: 0 1 250px;
min-width: 170px; min-width: 170px;
} }
.albumFolder { .albumFolder {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 1 150px; flex: 0 1 150px;
min-width: 120px; min-width: 120px;
} }
.artist { .artist {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 1 400px; flex: 0 1 400px;
min-width: 300px; min-width: 300px;

@ -1,16 +1,16 @@
.selectInput { .selectInput {
composes: input from 'Components/Form/CheckInput.css'; composes: input from '~Components/Form/CheckInput.css';
} }
.folder { .folder {
composes: cell from 'Components/Table/Cells/VirtualTableRowCell.css'; composes: cell from '~Components/Table/Cells/VirtualTableRowCell.css';
flex: 1 0 200px; flex: 1 0 200px;
line-height: 36px; line-height: 36px;
} }
.monitor { .monitor {
composes: cell from 'Components/Table/Cells/VirtualTableRowCell.css'; composes: cell from '~Components/Table/Cells/VirtualTableRowCell.css';
flex: 0 1 200px; flex: 0 1 200px;
min-width: 185px; min-width: 185px;
@ -19,21 +19,21 @@
.qualityProfile, .qualityProfile,
.languageProfile, .languageProfile,
.metadataProfile { .metadataProfile {
composes: cell from 'Components/Table/Cells/VirtualTableRowCell.css'; composes: cell from '~Components/Table/Cells/VirtualTableRowCell.css';
flex: 0 1 250px; flex: 0 1 250px;
min-width: 170px; min-width: 170px;
} }
.albumFolder { .albumFolder {
composes: cell from 'Components/Table/Cells/VirtualTableRowCell.css'; composes: cell from '~Components/Table/Cells/VirtualTableRowCell.css';
flex: 0 1 150px; flex: 0 1 150px;
min-width: 120px; min-width: 120px;
} }
.artist { .artist {
composes: cell from 'Components/Table/Cells/VirtualTableRowCell.css'; composes: cell from '~Components/Table/Cells/VirtualTableRowCell.css';
flex: 0 1 400px; flex: 0 1 400px;
min-width: 300px; min-width: 300px;
@ -41,7 +41,7 @@
.hideLanguageProfile, .hideLanguageProfile,
.hideMetadataProfile { .hideMetadataProfile {
composes: cell from 'Components/Table/Cells/VirtualTableRowCell.css'; composes: cell from '~Components/Table/Cells/VirtualTableRowCell.css';
display: none; display: none;
} }

@ -1,3 +1,3 @@
.input { .input {
composes: input from 'Components/Form/CheckInput.css'; composes: input from '~Components/Form/CheckInput.css';
} }

@ -3,7 +3,7 @@
} }
.button { .button {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
position: relative; position: relative;
display: flex; display: flex;
@ -65,7 +65,7 @@
} }
.searchInput { .searchInput {
composes: input from 'Components/Form/TextInput.css'; composes: input from '~Components/Form/TextInput.css';
border-radius: 0; border-radius: 0;
} }

@ -1,5 +1,5 @@
.AlbumSearchCell { .AlbumSearchCell {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 70px; width: 70px;
white-space: nowrap; white-space: nowrap;

@ -1,5 +1,5 @@
.link { .link {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
&:hover { &:hover {
color: $linkHoverColor; color: $linkHoverColor;

@ -69,7 +69,7 @@
} }
.monitorToggleButton { .monitorToggleButton {
composes: toggleButton from 'Components/MonitorToggleButton.css'; composes: toggleButton from '~Components/MonitorToggleButton.css';
width: 40px; width: 40px;
@ -88,7 +88,7 @@
} }
.albumNavigationButton { .albumNavigationButton {
composes: button from 'Components/Link/IconButton.css'; composes: button from '~Components/Link/IconButton.css';
margin-left: 5px; margin-left: 5px;
width: 30px; width: 30px;
@ -111,7 +111,7 @@
} }
.detailsLabel { .detailsLabel {
composes: label from 'Components/Label.css'; composes: label from '~Components/Label.css';
margin: 5px 10px 5px 0; margin: 5px 10px 5px 0;
} }

@ -7,7 +7,7 @@
} }
.linkLabel { .linkLabel {
composes: label from 'Components/Label.css'; composes: label from '~Components/Label.css';
cursor: pointer; cursor: pointer;
} }

@ -29,7 +29,7 @@
} }
.expandButton { .expandButton {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
flex-grow: 1; flex-grow: 1;
margin: 0 20px; margin: 0 20px;
@ -48,13 +48,13 @@
} }
.actionsMenu { .actionsMenu {
composes: menu from 'Components/Menu/Menu.css'; composes: menu from '~Components/Menu/Menu.css';
flex: 0 0 45px; flex: 0 0 45px;
} }
.actionsMenuContent { .actionsMenuContent {
composes: menuContent from 'Components/Menu/MenuContent.css'; composes: menuContent from '~Components/Menu/MenuContent.css';
white-space: nowrap; white-space: nowrap;
font-size: 14px; font-size: 14px;
@ -65,7 +65,7 @@
} }
.actionButton { .actionButton {
composes: button from 'Components/Link/IconButton.css'; composes: button from '~Components/Link/IconButton.css';
width: 30px; width: 30px;
} }

@ -1,23 +1,23 @@
.title { .title {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
white-space: nowrap; white-space: nowrap;
} }
.monitored { .monitored {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 42px; width: 42px;
} }
.trackNumber { .trackNumber {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 50px; width: 50px;
} }
.audio { .audio {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 200px; width: 200px;
} }
@ -25,7 +25,7 @@
.language, .language,
.duration, .duration,
.status { .status {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 100px; width: 100px;
} }

@ -1,17 +1,17 @@
.descriptionList { .descriptionList {
composes: descriptionList from 'Components/DescriptionList/DescriptionList.css'; composes: descriptionList from '~Components/DescriptionList/DescriptionList.css';
margin-right: 10px; margin-right: 10px;
} }
.title { .title {
composes: title from 'Components/DescriptionList/DescriptionListItemTitle.css'; composes: title from '~Components/DescriptionList/DescriptionListItemTitle.css';
width: 80px; width: 80px;
} }
.description { .description {
composes: title from 'Components/DescriptionList/DescriptionListItemDescription.css'; composes: title from '~Components/DescriptionList/DescriptionListItemDescription.css';
margin-left: 100px; margin-left: 100px;
} }

@ -8,7 +8,7 @@
} }
.updateSelectedButton { .updateSelectedButton {
composes: button from 'Components/Link/SpinnerButton.css'; composes: button from '~Components/Link/SpinnerButton.css';
height: 35px; height: 35px;
} }

@ -1,19 +1,19 @@
.status, .status,
.monitored { .monitored {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 50px; width: 50px;
} }
.title { .title {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 1px; width: 1px;
white-space: nowrap; white-space: nowrap;
} }
.albums { .albums {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;

@ -1,17 +1,17 @@
.title { .title {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
white-space: nowrap; white-space: nowrap;
} }
.monitored { .monitored {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 42px; width: 42px;
} }
.status { .status {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 100px; width: 100px;
} }

@ -76,7 +76,7 @@
} }
.monitorToggleButton { .monitorToggleButton {
composes: toggleButton from 'Components/MonitorToggleButton.css'; composes: toggleButton from '~Components/MonitorToggleButton.css';
width: 40px; width: 40px;
@ -95,7 +95,7 @@
} }
.artistNavigationButton { .artistNavigationButton {
composes: button from 'Components/Link/IconButton.css'; composes: button from '~Components/Link/IconButton.css';
margin-left: 5px; margin-left: 5px;
width: 30px; width: 30px;
@ -118,7 +118,7 @@
} }
.detailsLabel { .detailsLabel {
composes: label from 'Components/Label.css'; composes: label from '~Components/Label.css';
margin: 5px 10px 5px 0; margin: 5px 10px 5px 0;
} }

@ -7,7 +7,7 @@
} }
.linkLabel { .linkLabel {
composes: label from 'Components/Label.css'; composes: label from '~Components/Label.css';
cursor: pointer; cursor: pointer;
} }

@ -34,7 +34,7 @@
} }
.expandButton { .expandButton {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
flex-grow: 1; flex-grow: 1;
width: 100%; width: 100%;
@ -53,13 +53,13 @@
} }
.actionsMenu { .actionsMenu {
composes: menu from 'Components/Menu/Menu.css'; composes: menu from '~Components/Menu/Menu.css';
flex: 0 0 45px; flex: 0 0 45px;
} }
.actionsMenuContent { .actionsMenuContent {
composes: menuContent from 'Components/Menu/MenuContent.css'; composes: menuContent from '~Components/Menu/MenuContent.css';
white-space: nowrap; white-space: nowrap;
font-size: $defaultFontSize; font-size: $defaultFontSize;
@ -70,7 +70,7 @@
} }
.actionButton { .actionButton {
composes: button from 'Components/Link/IconButton.css'; composes: button from '~Components/Link/IconButton.css';
width: 30px; width: 30px;
} }

@ -1,5 +1,5 @@
.deleteButton { .deleteButton {
composes: button from 'Components/Link/Button.css'; composes: button from '~Components/Link/Button.css';
margin-right: auto; margin-right: auto;
} }

@ -21,14 +21,14 @@
.organizeSelectedButton, .organizeSelectedButton,
.tagsButton { .tagsButton {
composes: button from 'Components/Link/SpinnerButton.css'; composes: button from '~Components/Link/SpinnerButton.css';
margin-right: 10px; margin-right: 10px;
height: 35px; height: 35px;
} }
.deleteSelectedButton { .deleteSelectedButton {
composes: button from 'Components/Link/SpinnerButton.css'; composes: button from '~Components/Link/SpinnerButton.css';
margin-left: 50px; margin-left: 50px;
height: 35px; height: 35px;

@ -1,5 +1,5 @@
.albumFolder { .albumFolder {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 150px; width: 150px;
} }

@ -1,6 +1,6 @@
.details, .details,
.actions { .actions {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 65px; width: 65px;
} }

@ -5,14 +5,14 @@
} }
.contentBody { .contentBody {
composes: contentBody from 'Components/Page/PageContentBody.css'; composes: contentBody from '~Components/Page/PageContentBody.css';
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
.postersInnerContentBody { .postersInnerContentBody {
composes: innerContentBody from 'Components/Page/PageContentBody.css'; composes: innerContentBody from '~Components/Page/PageContentBody.css';
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -23,7 +23,7 @@
} }
.bannersInnerContentBody { .bannersInnerContentBody {
composes: innerContentBody from 'Components/Page/PageContentBody.css'; composes: innerContentBody from '~Components/Page/PageContentBody.css';
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -34,7 +34,7 @@
} }
.tableInnerContentBody { .tableInnerContentBody {
composes: innerContentBody from 'Components/Page/PageContentBody.css'; composes: innerContentBody from '~Components/Page/PageContentBody.css';
display: flex; display: flex;
flex-direction: column; flex-direction: column;

@ -24,7 +24,7 @@ $hoverScale: 1.05;
} }
.link { .link {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
display: block; display: block;
background-color: $defaultColor; background-color: $defaultColor;
@ -71,7 +71,7 @@ $hoverScale: 1.05;
} }
.action { .action {
composes: button from 'Components/Link/IconButton.css'; composes: button from '~Components/Link/IconButton.css';
&:hover { &:hover {
color: #ccc; color: #ccc;

@ -22,7 +22,7 @@ $hoverScale: 1.05;
} }
.link { .link {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
display: block; display: block;
color: $defaultColor; color: $defaultColor;

@ -24,7 +24,7 @@ $hoverScale: 1.05;
} }
.link { .link {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
position: relative; position: relative;
display: block; display: block;
@ -89,7 +89,7 @@ $hoverScale: 1.05;
} }
.action { .action {
composes: button from 'Components/Link/IconButton.css'; composes: button from '~Components/Link/IconButton.css';
&:hover { &:hover {
color: #ccc; color: #ccc;

@ -1,5 +1,5 @@
.progress { .progress {
composes: container from 'Components/ProgressBar.css'; composes: container from '~Components/ProgressBar.css';
border-radius: 0; border-radius: 0;
background-color: #5b5b5b; background-color: #5b5b5b;
@ -8,7 +8,7 @@
} }
.progressBar { .progressBar {
composes: progressBar from 'Components/ProgressBar.css'; composes: progressBar from '~Components/ProgressBar.css';
transition: width 200ms ease; transition: width 200ms ease;
} }

@ -1,11 +1,11 @@
.status { .status {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 60px; flex: 0 0 60px;
} }
.sortName { .sortName {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 4 0 110px; flex: 4 0 110px;
} }
@ -19,7 +19,7 @@
} }
.artistType { .artistType {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 100px; flex: 0 0 100px;
} }
@ -27,7 +27,7 @@
.qualityProfileId, .qualityProfileId,
.languageProfileId, .languageProfileId,
.metadataProfileId { .metadataProfileId {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 1 0 125px; flex: 1 0 125px;
} }
@ -36,62 +36,62 @@
.lastAlbum, .lastAlbum,
.added, .added,
.genres { .genres {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 180px; flex: 0 0 180px;
} }
.albumCount { .albumCount {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 100px; flex: 0 0 100px;
} }
.trackProgress, .trackProgress,
.latestAlbum { .latestAlbum {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 150px; flex: 0 0 150px;
} }
.trackCount { .trackCount {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 130px; flex: 0 0 130px;
} }
.path { .path {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 1 0 150px; flex: 1 0 150px;
} }
.sizeOnDisk { .sizeOnDisk {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 120px; flex: 0 0 120px;
} }
.ratings { .ratings {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 80px; flex: 0 0 80px;
} }
.tags { .tags {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 1 0 60px; flex: 1 0 60px;
} }
.useSceneNumbering { .useSceneNumbering {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 145px; flex: 0 0 145px;
} }
.actions { .actions {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 1 90px; flex: 0 1 90px;
} }

@ -1,5 +1,5 @@
.cell { .cell {
composes: cell from 'Components/Table/Cells/VirtualTableRowCell.css'; composes: cell from '~Components/Table/Cells/VirtualTableRowCell.css';
display: flex; display: flex;
align-items: center; align-items: center;
@ -32,7 +32,7 @@
} }
.link { .link {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
position: relative; position: relative;
display: block; display: block;
@ -111,7 +111,7 @@
} }
.ratings { .ratings {
composes: headerCell from 'Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 80px; flex: 0 0 80px;
} }
@ -135,7 +135,7 @@
} }
.checkInput { .checkInput {
composes: input from 'Components/Form/CheckInput.css'; composes: input from '~Components/Form/CheckInput.css';
margin-top: 0; margin-top: 0;
} }

@ -1,5 +1,5 @@
.tableContainer { .tableContainer {
composes: tableContainer from 'Components/Table/VirtualTable.css'; composes: tableContainer from '~Components/Table/VirtualTable.css';
flex: 1 0 auto; flex: 1 0 auto;
} }

@ -1,5 +1,5 @@
.status { .status {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 60px; width: 60px;
} }

@ -1,5 +1,5 @@
.doNotMoveButton { .doNotMoveButton {
composes: button from 'Components/Link/Button.css'; composes: button from '~Components/Link/Button.css';
margin-right: auto; margin-right: auto;
} }

@ -59,27 +59,27 @@
*/ */
.downloaded { .downloaded {
composes: downloaded from 'Calendar/Events/CalendarEvent.css'; composes: downloaded from '~Calendar/Events/CalendarEvent.css';
} }
.partial { .partial {
composes: partial from 'Calendar/Events/CalendarEvent.css'; composes: partial from '~Calendar/Events/CalendarEvent.css';
} }
.downloading { .downloading {
composes: downloading from 'Calendar/Events/CalendarEvent.css'; composes: downloading from '~Calendar/Events/CalendarEvent.css';
} }
.unmonitored { .unmonitored {
composes: unmonitored from 'Calendar/Events/CalendarEvent.css'; composes: unmonitored from '~Calendar/Events/CalendarEvent.css';
} }
.missing { .missing {
composes: missing from 'Calendar/Events/CalendarEvent.css'; composes: missing from '~Calendar/Events/CalendarEvent.css';
} }
.unreleased { .unreleased {
composes: unreleased from 'Calendar/Events/CalendarEvent.css'; composes: unreleased from '~Calendar/Events/CalendarEvent.css';
} }
@media only screen and (max-width: $breakpointSmall) { @media only screen and (max-width: $breakpointSmall) {

@ -1,11 +1,11 @@
.calendarPageBody { .calendarPageBody {
composes: contentBody from 'Components/Page/PageContentBody.css'; composes: contentBody from '~Components/Page/PageContentBody.css';
display: flex; display: flex;
} }
.calendarInnerPageBody { .calendarInnerPageBody {
composes: innerContentBody from 'Components/Page/PageContentBody.css'; composes: innerContentBody from '~Components/Page/PageContentBody.css';
display: flex; display: flex;
flex-direction: column; flex-direction: column;

@ -8,7 +8,7 @@
} }
.todayButton { .todayButton {
composes: button from 'Components/Link/Button.css'; composes: button from '~Components/Link/Button.css';
margin-left: 5px; margin-left: 5px;
} }
@ -30,13 +30,13 @@
} }
.viewMenu { .viewMenu {
composes: menu from 'Components/Menu/Menu.css'; composes: menu from '~Components/Menu/Menu.css';
line-height: 31px; line-height: 31px;
} }
.loading { .loading {
composes: loading from 'Components/Loading/LoadingIndicator.css'; composes: loading from '~Components/Loading/LoadingIndicator.css';
margin-top: 5px; margin-top: 5px;
margin-right: 10px; margin-right: 10px;

@ -13,29 +13,29 @@
*/ */
.downloaded { .downloaded {
composes: downloaded from 'Calendar/Events/CalendarEvent.css'; composes: downloaded from '~Calendar/Events/CalendarEvent.css';
} }
.partial { .partial {
composes: partial from 'Calendar/Events/CalendarEvent.css'; composes: partial from '~Calendar/Events/CalendarEvent.css';
} }
.downloading { .downloading {
composes: downloading from 'Calendar/Events/CalendarEvent.css'; composes: downloading from '~Calendar/Events/CalendarEvent.css';
} }
.unmonitored { .unmonitored {
composes: unmonitored from 'Calendar/Events/CalendarEvent.css'; composes: unmonitored from '~Calendar/Events/CalendarEvent.css';
} }
.onAir { .onAir {
composes: onAir from 'Calendar/Events/CalendarEvent.css'; composes: onAir from '~Calendar/Events/CalendarEvent.css';
} }
.missing { .missing {
composes: missing from 'Calendar/Events/CalendarEvent.css'; composes: missing from '~Calendar/Events/CalendarEvent.css';
} }
.unreleased { .unreleased {
composes: unreleased from 'Calendar/Events/CalendarEvent.css'; composes: unreleased from '~Calendar/Events/CalendarEvent.css';
} }

@ -1,5 +1,5 @@
.modal { .modal {
composes: modal from 'Components/Modal/Modal.css'; composes: modal from '~Components/Modal/Modal.css';
height: 600px; height: 600px;
} }

@ -1,12 +1,12 @@
.modalBody { .modalBody {
composes: modalBody from 'Components/Modal/ModalBody.css'; composes: modalBody from '~Components/Modal/ModalBody.css';
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
.mappedDrivesWarning { .mappedDrivesWarning {
composes: alert from 'Components/Alert.css'; composes: alert from '~Components/Alert.css';
margin: 0; margin: 0;
margin-bottom: 20px; margin-bottom: 20px;
@ -18,7 +18,7 @@
} }
.pathInput { .pathInput {
composes: pathInputWrapper from 'Components/Form/PathInput.css'; composes: pathInputWrapper from '~Components/Form/PathInput.css';
flex: 0 0 auto; flex: 0 0 auto;
} }

@ -1,5 +1,5 @@
.type { .type {
composes: cell from 'Components/Table/Cells/TableRowCell.css'; composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 32px; width: 32px;
} }

@ -3,13 +3,13 @@
} }
.numberInput { .numberInput {
composes: input from 'Components/Form/TextInput.css'; composes: input from '~Components/Form/TextInput.css';
margin-right: 3px; margin-right: 3px;
} }
.selectInput { .selectInput {
composes: select from 'Components/Form/SelectInput.css'; composes: select from '~Components/Form/SelectInput.css';
margin-left: 3px; margin-left: 3px;
} }

@ -3,7 +3,8 @@ import React, { Component } from 'react';
import convertToBytes from 'Utilities/Number/convertToBytes'; import convertToBytes from 'Utilities/Number/convertToBytes';
import formatBytes from 'Utilities/Number/formatBytes'; import formatBytes from 'Utilities/Number/formatBytes';
import { kinds, filterBuilderTypes, filterBuilderValueTypes } from 'Helpers/Props'; import { kinds, filterBuilderTypes, filterBuilderValueTypes } from 'Helpers/Props';
import TagInput, { tagShape } from 'Components/Form/TagInput'; import tagShape from 'Helpers/Props/Shapes/tagShape';
import TagInput from 'Components/Form/TagInput';
import FilterBuilderRowValueTag from './FilterBuilderRowValueTag'; import FilterBuilderRowValueTag from './FilterBuilderRowValueTag';
export const NAME = 'value'; export const NAME = 'value';

@ -7,7 +7,7 @@
} }
.label { .label {
composes: label from 'Components/Label.css'; composes: label from '~Components/Label.css';
border-style: none; border-style: none;
font-size: 13px; font-size: 13px;

@ -2,8 +2,8 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import tagShape from 'Helpers/Props/Shapes/tagShape';
import { fetchIndexers } from 'Store/Actions/settingsActions'; import { fetchIndexers } from 'Store/Actions/settingsActions';
import { tagShape } from 'Components/Form/TagInput';
import FilterBuilderRowValue from './FilterBuilderRowValue'; import FilterBuilderRowValue from './FilterBuilderRowValue';
function createMapStateToProps() { function createMapStateToProps() {

@ -3,8 +3,8 @@ import React, { Component } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import getQualities from 'Utilities/Quality/getQualities'; import getQualities from 'Utilities/Quality/getQualities';
import tagShape from 'Helpers/Props/Shapes/tagShape';
import { fetchQualityProfileSchema } from 'Store/Actions/settingsActions'; import { fetchQualityProfileSchema } from 'Store/Actions/settingsActions';
import { tagShape } from 'Components/Form/TagInput';
import FilterBuilderRowValue from './FilterBuilderRowValue'; import FilterBuilderRowValue from './FilterBuilderRowValue';
function createMapStateToProps() { function createMapStateToProps() {

@ -1,13 +1,13 @@
.input { .input {
composes: input from 'Components/Form/Input.css'; composes: input from '~Components/Form/Input.css';
} }
.hasError { .hasError {
composes: hasError from 'Components/Form/Input.css'; composes: hasError from '~Components/Form/Input.css';
} }
.hasWarning { .hasWarning {
composes: hasWarning from 'Components/Form/Input.css'; composes: hasWarning from '~Components/Form/Input.css';
} }
.inputWrapper { .inputWrapper {

@ -3,19 +3,19 @@
} }
.input { .input {
composes: input from 'Components/Form/Input.css'; composes: input from '~Components/Form/Input.css';
} }
.hasError { .hasError {
composes: hasError from 'Components/Form/Input.css'; composes: hasError from '~Components/Form/Input.css';
} }
.hasWarning { .hasWarning {
composes: hasWarning from 'Components/Form/Input.css'; composes: hasWarning from '~Components/Form/Input.css';
} }
.hasButton { .hasButton {
composes: hasButton from 'Components/Form/Input.css'; composes: hasButton from '~Components/Form/Input.css';
} }
.recaptchaWrapper { .recaptchaWrapper {

@ -94,7 +94,7 @@
} }
.helpText { .helpText {
composes: helpText from 'Components/Form/FormInputHelpText.css'; composes: helpText from '~Components/Form/FormInputHelpText.css';
margin-top: 8px; margin-top: 8px;
margin-left: 5px; margin-left: 5px;

@ -3,6 +3,6 @@
} }
.inputContainer { .inputContainer {
composes: inputContainer from './TagInput.css'; composes: inputContainer from '~./TagInput.css';
composes: hasButton from 'Components/Form/Input.css'; composes: hasButton from '~Components/Form/Input.css';
} }

@ -1,9 +1,10 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import tagShape from 'Helpers/Props/Shapes/tagShape';
import Icon from 'Components/Icon'; import Icon from 'Components/Icon';
import FormInputButton from './FormInputButton'; import FormInputButton from './FormInputButton';
import TagInput, { tagShape } from './TagInput'; import TagInput from './TagInput';
import styles from './DeviceInput.css'; import styles from './DeviceInput.css';
class DeviceInput extends Component { class DeviceInput extends Component {

@ -3,8 +3,8 @@
} }
.enhancedSelect { .enhancedSelect {
composes: input from 'Components/Form/Input.css'; composes: input from '~Components/Form/Input.css';
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
position: relative; position: relative;
display: flex; display: flex;
@ -21,11 +21,11 @@
} }
.hasError { .hasError {
composes: hasError from 'Components/Form/Input.css'; composes: hasError from '~Components/Form/Input.css';
} }
.hasWarning { .hasWarning {
composes: hasWarning from 'Components/Form/Input.css'; composes: hasWarning from '~Components/Form/Input.css';
} }
.isDisabled { .isDisabled {
@ -62,7 +62,7 @@
} }
.optionsModalBody { .optionsModalBody {
composes: modalBody from 'Components/Modal/ModalBody.css'; composes: modalBody from '~Components/Modal/ModalBody.css';
display: flex; display: flex;
justify-content: center; justify-content: center;
@ -71,7 +71,7 @@
} }
.optionsModalScroller { .optionsModalScroller {
composes: scroller from 'Components/Scroller/Scroller.css'; composes: scroller from '~Components/Scroller/Scroller.css';
border: 1px solid $inputBorderColor; border: 1px solid $inputBorderColor;
border-radius: 4px; border-radius: 4px;

@ -1,5 +1,5 @@
.button { .button {
composes: button from 'Components/Link/Button.css'; composes: button from '~Components/Link/Button.css';
border-left: none; border-left: none;
border-top-left-radius: 0; border-top-left-radius: 0;

@ -33,7 +33,7 @@
} }
.link { .link {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
margin-left: 5px; margin-left: 5px;
} }

@ -1,5 +1,5 @@
.inputContainer { .inputContainer {
composes: input from 'Components/Form/Input.css'; composes: input from '~Components/Form/Input.css';
position: relative; position: relative;
min-height: 35px; min-height: 35px;
@ -13,9 +13,9 @@
} }
.hasError { .hasError {
composes: hasError from 'Components/Form/Input.css'; composes: hasError from '~Components/Form/Input.css';
} }
.hasWarning { .hasWarning {
composes: hasWarning from 'Components/Form/Input.css'; composes: hasWarning from '~Components/Form/Input.css';
} }

@ -1,5 +1,5 @@
.input { .input {
composes: input from 'Components/Form/TextInput.css'; composes: input from '~Components/Form/TextInput.css';
font-family: $passwordFamily; font-family: $passwordFamily;
} }

@ -1,17 +1,17 @@
.path { .path {
composes: input from 'Components/Form/Input.css'; composes: input from '~Components/Form/Input.css';
} }
.hasError { .hasError {
composes: hasError from 'Components/Form/Input.css'; composes: hasError from '~Components/Form/Input.css';
} }
.hasWarning { .hasWarning {
composes: hasWarning from 'Components/Form/Input.css'; composes: hasWarning from '~Components/Form/Input.css';
} }
.hasFileBrowser { .hasFileBrowser {
composes: hasButton from 'Components/Form/Input.css'; composes: hasButton from '~Components/Form/Input.css';
} }
.pathInputWrapper { .pathInputWrapper {
@ -62,7 +62,7 @@
} }
.fileBrowserButton { .fileBrowserButton {
composes: button from './FormInputButton.css'; composes: button from '~./FormInputButton.css';
height: 35px; height: 35px;
} }

@ -1,5 +1,5 @@
.selectedValue { .selectedValue {
composes: selectedValue from './EnhancedSelectInputSelectedValue.css'; composes: selectedValue from '~./EnhancedSelectInputSelectedValue.css';
display: flex; display: flex;
align-items: center; align-items: center;

@ -1,15 +1,15 @@
.select { .select {
composes: input from 'Components/Form/Input.css'; composes: input from '~Components/Form/Input.css';
padding: 0 11px; padding: 0 11px;
} }
.hasError { .hasError {
composes: hasError from 'Components/Form/Input.css'; composes: hasError from '~Components/Form/Input.css';
} }
.hasWarning { .hasWarning {
composes: hasWarning from 'Components/Form/Input.css'; composes: hasWarning from '~Components/Form/Input.css';
} }
.isDisabled { .isDisabled {

@ -1,5 +1,5 @@
.inputContainer { .inputContainer {
composes: input from 'Components/Form/Input.css'; composes: input from '~Components/Form/Input.css';
position: relative; position: relative;
padding: 0; padding: 0;
@ -14,11 +14,11 @@
} }
.hasError { .hasError {
composes: hasError from 'Components/Form/Input.css'; composes: hasError from '~Components/Form/Input.css';
} }
.hasWarning { .hasWarning {
composes: hasWarning from 'Components/Form/Input.css'; composes: hasWarning from '~Components/Form/Input.css';
} }
.tags { .tags {

@ -4,6 +4,7 @@ import React, { Component } from 'react';
import Autosuggest from 'react-autosuggest'; import Autosuggest from 'react-autosuggest';
import classNames from 'classnames'; import classNames from 'classnames';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import tagShape from 'Helpers/Props/Shapes/tagShape';
import TagInputInput from './TagInputInput'; import TagInputInput from './TagInputInput';
import TagInputTag from './TagInputTag'; import TagInputTag from './TagInputTag';
import styles from './TagInput.css'; import styles from './TagInput.css';
@ -266,11 +267,6 @@ class TagInput extends Component {
} }
} }
export const tagShape = {
id: PropTypes.oneOfType([PropTypes.bool, PropTypes.number, PropTypes.string]).isRequired,
name: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired
};
TagInput.propTypes = { TagInput.propTypes = {
className: PropTypes.string.isRequired, className: PropTypes.string.isRequired,
inputClassName: PropTypes.string.isRequired, inputClassName: PropTypes.string.isRequired,

@ -1,7 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import { tagShape } from './TagInput'; import tagShape from 'Helpers/Props/Shapes/tagShape';
import styles from './TagInputInput.css'; import styles from './TagInputInput.css';
class TagInputInput extends Component { class TagInputInput extends Component {

@ -1,9 +1,9 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import tagShape from 'Helpers/Props/Shapes/tagShape';
import Label from 'Components/Label'; import Label from 'Components/Label';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import { tagShape } from './TagInput';
class TagInputTag extends Component { class TagInputTag extends Component {

@ -1,5 +1,5 @@
.input { .input {
composes: input from 'Components/Form/Input.css'; composes: input from '~Components/Form/Input.css';
} }
.readOnly { .readOnly {
@ -7,13 +7,13 @@
} }
.hasError { .hasError {
composes: hasError from 'Components/Form/Input.css'; composes: hasError from '~Components/Form/Input.css';
} }
.hasWarning { .hasWarning {
composes: hasWarning from 'Components/Form/Input.css'; composes: hasWarning from '~Components/Form/Input.css';
} }
.hasButton { .hasButton {
composes: hasButton from 'Components/Form/Input.css'; composes: hasButton from '~Components/Form/Input.css';
} }

@ -1,5 +1,5 @@
.button { .button {
composes: link from './Link.css'; composes: link from '~./Link.css';
overflow: hidden; overflow: hidden;
border: 1px solid; border: 1px solid;

@ -1,5 +1,5 @@
.button { .button {
composes: button from 'Components/Form/FormInputButton.css'; composes: button from '~Components/Form/FormInputButton.css';
position: relative; position: relative;
} }

@ -1,5 +1,5 @@
.button { .button {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
display: inline-block; display: inline-block;
margin: 0 2px; margin: 0 2px;

@ -1,5 +1,5 @@
.button { .button {
composes: button from 'Components/Link/Button.css'; composes: button from '~Components/Link/Button.css';
position: relative; position: relative;
} }

@ -1,5 +1,5 @@
.iconContainer { .iconContainer {
composes: spinnerContainer from 'Components/Link/SpinnerButton.css'; composes: spinnerContainer from '~Components/Link/SpinnerButton.css';
} }
.icon { .icon {
@ -7,7 +7,7 @@
} }
.label { .label {
composes: label from 'Components/Link/SpinnerButton.css'; composes: label from '~Components/Link/SpinnerButton.css';
} }
.showIcon { .showIcon {

@ -1,5 +1,5 @@
.filterMenu { .filterMenu {
composes: menu from './Menu.css'; composes: menu from '~./Menu.css';
} }
@media only screen and (max-width: $breakpointSmall) { @media only screen and (max-width: $breakpointSmall) {

@ -1,5 +1,5 @@
.menuButton { .menuButton {
composes: menuButton from './MenuButton.css'; composes: menuButton from '~./MenuButton.css';
&:hover { &:hover {
color: #666; color: #666;

@ -1,5 +1,5 @@
.menuButton { .menuButton {
composes: menuButton from './MenuButton.css'; composes: menuButton from '~./MenuButton.css';
width: $toolbarButtonWidth; width: $toolbarButtonWidth;
height: $toolbarHeight; height: $toolbarHeight;
@ -7,5 +7,5 @@
} }
.label { .label {
composes: label from 'Components/Page/Toolbar/PageToolbarButton.css'; composes: label from '~Components/Page/Toolbar/PageToolbarButton.css';
} }

@ -1,5 +1,5 @@
.message { .message {
composes: message from 'Components/Error/ErrorBoundaryError.css'; composes: message from '~Components/Error/ErrorBoundaryError.css';
margin: 0; margin: 0;
margin-bottom: 30px; margin-bottom: 30px;
@ -8,7 +8,7 @@
} }
.details { .details {
composes: details from 'Components/Error/ErrorBoundaryError.css'; composes: details from '~Components/Error/ErrorBoundaryError.css';
margin: 0; margin: 0;
margin-top: 20px; margin-top: 20px;

@ -1,5 +1,5 @@
.toggleButton { .toggleButton {
composes: button from 'Components/Link/IconButton.css'; composes: button from '~Components/Link/IconButton.css';
padding: 0; padding: 0;
font-size: inherit; font-size: inherit;

@ -1,5 +1,5 @@
.page { .page {
composes: page from './Page.css'; composes: page from '~./Page.css';
margin-top: 20px; margin-top: 20px;
text-align: center; text-align: center;

@ -38,7 +38,7 @@
} }
.donate { .donate {
composes: link from 'Components/Link/Link.css'; composes: link from '~Components/Link/Link.css';
width: 30px; width: 30px;
color: $themeRed; color: $themeRed;

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save