From 7357d085df4054d7e1d1a884d947a590c327a344 Mon Sep 17 00:00:00 2001 From: "jmesserly@google.com" Date: Wed, 14 Aug 2013 21:11:30 +0000 Subject: [PATCH 001/245] move csslib into dart svn deleted files that duplicate those in the Dart repository (LICENSE, pubspec.yaml, codereview.settings, .gitignore) Otherwise, just changed pkg.status and pubspec R=terry@google.com Review URL: https://codereview.chromium.org//23168002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@26155 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/README.md | 84 + pkgs/csslib/bin/css.dart | 8 + pkgs/csslib/example/call_parser.dart | 90 + pkgs/csslib/example/call_parser.html | 13 + pkgs/csslib/example/test.css | 6 + pkgs/csslib/lib/css.dart | 84 + pkgs/csslib/lib/parser.dart | 2402 +++++++++++++++++++++++ pkgs/csslib/lib/src/analyzer.dart | 513 +++++ pkgs/csslib/lib/src/css_printer.dart | 476 +++++ pkgs/csslib/lib/src/messages.dart | 129 ++ pkgs/csslib/lib/src/options.dart | 94 + pkgs/csslib/lib/src/property.dart | 1250 ++++++++++++ pkgs/csslib/lib/src/token.dart | 53 + pkgs/csslib/lib/src/tokenizer.dart | 409 ++++ pkgs/csslib/lib/src/tokenizer_base.dart | 445 +++++ pkgs/csslib/lib/src/tokenkind.dart | 756 +++++++ pkgs/csslib/lib/src/tree.dart | 1054 ++++++++++ pkgs/csslib/lib/src/tree_base.dart | 109 + pkgs/csslib/lib/src/tree_printer.dart | 512 +++++ pkgs/csslib/lib/src/validate.dart | 135 ++ pkgs/csslib/lib/visitor.dart | 445 +++++ pkgs/csslib/pubspec.yaml | 12 + pkgs/csslib/test/compiler_test.dart | 728 +++++++ pkgs/csslib/test/declaration_test.dart | 1036 ++++++++++ pkgs/csslib/test/error_test.dart | 355 ++++ pkgs/csslib/test/nested_test.dart | 614 ++++++ pkgs/csslib/test/run.sh | 39 + pkgs/csslib/test/run_all.dart | 39 + pkgs/csslib/test/selector_test.dart | 67 + pkgs/csslib/test/testing.dart | 64 + pkgs/csslib/test/var_test.dart | 629 ++++++ pkgs/csslib/test/visitor_test.dart | 114 ++ 32 files changed, 12764 insertions(+) create mode 100644 pkgs/csslib/README.md create mode 100644 pkgs/csslib/bin/css.dart create mode 100644 pkgs/csslib/example/call_parser.dart create mode 100644 pkgs/csslib/example/call_parser.html create mode 100644 pkgs/csslib/example/test.css create mode 100644 pkgs/csslib/lib/css.dart create mode 100644 pkgs/csslib/lib/parser.dart create mode 100644 pkgs/csslib/lib/src/analyzer.dart create mode 100644 pkgs/csslib/lib/src/css_printer.dart create mode 100644 pkgs/csslib/lib/src/messages.dart create mode 100644 pkgs/csslib/lib/src/options.dart create mode 100644 pkgs/csslib/lib/src/property.dart create mode 100644 pkgs/csslib/lib/src/token.dart create mode 100644 pkgs/csslib/lib/src/tokenizer.dart create mode 100644 pkgs/csslib/lib/src/tokenizer_base.dart create mode 100644 pkgs/csslib/lib/src/tokenkind.dart create mode 100644 pkgs/csslib/lib/src/tree.dart create mode 100644 pkgs/csslib/lib/src/tree_base.dart create mode 100644 pkgs/csslib/lib/src/tree_printer.dart create mode 100644 pkgs/csslib/lib/src/validate.dart create mode 100644 pkgs/csslib/lib/visitor.dart create mode 100644 pkgs/csslib/pubspec.yaml create mode 100644 pkgs/csslib/test/compiler_test.dart create mode 100644 pkgs/csslib/test/declaration_test.dart create mode 100644 pkgs/csslib/test/error_test.dart create mode 100644 pkgs/csslib/test/nested_test.dart create mode 100755 pkgs/csslib/test/run.sh create mode 100644 pkgs/csslib/test/run_all.dart create mode 100644 pkgs/csslib/test/selector_test.dart create mode 100644 pkgs/csslib/test/testing.dart create mode 100644 pkgs/csslib/test/var_test.dart create mode 100644 pkgs/csslib/test/visitor_test.dart diff --git a/pkgs/csslib/README.md b/pkgs/csslib/README.md new file mode 100644 index 000000000..b84dae4f2 --- /dev/null +++ b/pkgs/csslib/README.md @@ -0,0 +1,84 @@ +csslib in Pure Dart +=================== + +This is a pure [Dart][dart] [CSS parser][cssparse]. Since it's 100% +Dart you can use it safely from a script or server side app. + +[![Build Status](https://drone.io/github.com/dart-lang/csslib/status.png)](https://drone.io/github.com/dart-lang/csslib/latest) + +Installation +------------ + +Add this to your `pubspec.yaml` (or create it): +```yaml +dependencies: + csslib: any +``` +Then run the [Pub Package Manager][pub] (comes with the Dart SDK): + + pub install + +Usage +----- + +Parsing CSS is easy! +```dart +import 'package:csslib/parser.dart' show parse; +import 'package:csslib/css.dart'; + +main() { + var stylesheet = parse( + '.foo { color: red; left: 20px; top: 20px; width: 100px; height:200px }'); + print(stylesheet.toString()); +} +``` + +You can pass a String or list of bytes to `parse`. + + +Updating +-------- + +You can upgrade the library with: + + pub update + +Disclaimer: the APIs are not finished. Updating may break your code. If that +happens, you can check the +[commit log](https://github.com/dart-lang/csslib/commits/master), to figure +out what the change was. + +If you want to avoid breakage, you can also put the version constraint in your +`pubspec.yaml` in place of the word `any`. + +Running Tests +------------- + +All tests (both canary and suite) should be passing. Canary are quick test +verifies that basic CSS is working. The suite tests are a comprehensive set of +~11,000 tests. + +```bash +export DART_SDK=path/to/dart/sdk + +# Make sure dependencies are installed +pub install + +# Run command both canary and the suite tests +test/run.sh +``` + + Run only the canary test: + +```bash + test/run.sh canary +``` + + Run only the suite tests: + +```bash + test/run.sh suite +``` + +[dart]: http://www.dartlang.org/ +[pub]: http://www.dartlang.org/docs/pub-package-manager/ diff --git a/pkgs/csslib/bin/css.dart b/pkgs/csslib/bin/css.dart new file mode 100644 index 000000000..08f29304a --- /dev/null +++ b/pkgs/csslib/bin/css.dart @@ -0,0 +1,8 @@ +#!/usr/bin/env dart +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:csslib/css.dart' as css; + +void main() => css.main(); diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart new file mode 100644 index 000000000..627105719 --- /dev/null +++ b/pkgs/csslib/example/call_parser.dart @@ -0,0 +1,90 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a + +import 'package:csslib/parser.dart' as css; +import 'package:csslib/visitor.dart'; + +/** + * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, + * CSS will allow any property/value pairs regardless of validity; all of our + * tests (by default) will ensure that the CSS is really valid. + */ +StyleSheet parseCss(String cssInput, {List errors, List opts}) => + css.parse(cssInput, errors: errors, options: opts == null ? + ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts); + +// Pretty printer for CSS. +var emitCss = new CssPrinter(); +String prettyPrint(StyleSheet ss) => + (emitCss..visitTree(ss, pretty: true)).toString(); + +main() { + var errors = []; + + // Parse a simple stylesheet. + print('1. Good CSS, parsed CSS emitted:'); + print(' ============================='); + var stylesheet = parseCss( + '@import "support/at-charset-019.css"; div { color: red; }' + 'button[type] { background-color: red; }' + '.foo { ' + 'color: red; left: 20px; top: 20px; width: 100px; height:200px' + '}' + '#div {' + 'color : #00F578; border-color: #878787;' + '}', errors: errors); + + if (!errors.isEmpty) { + print("Got ${errors.length} errors.\n"); + for (var error in errors) { + print(error); + } + } else { + print(prettyPrint(stylesheet)); + } + + // Parse a stylesheet with errors + print('2. Catch severe syntax errors:'); + print(' ==========================='); + var stylesheetError = parseCss( + '.foo #%^&*asdf{ ' + 'color: red; left: 20px; top: 20px; width: 100px; height:200px' + '}', errors: errors); + + if (!errors.isEmpty) { + print("Got ${errors.length} errors.\n"); + for (var error in errors) { + print(error); + } + } else { + print(stylesheetError.toString()); + } + + // Parse a stylesheet that warns (checks) problematic CSS. + print('3. Detect CSS problem with checking on:'); + print(' ==================================='); + stylesheetError = parseCss( '# div1 { color: red; }', errors: errors); + + if (!errors.isEmpty) { + print("Detected ${errors.length} problem in checked mode.\n"); + for (var error in errors) { + print(error); + } + } else { + print(stylesheetError.toString()); + } + + // Parse a CSS selector. + print('4. Parse a selector only:'); + print(' ======================'); + var selectorAst = css.selector('#div .foo', errors: errors); + if (!errors.isEmpty) { + print("Got ${errors.length} errors.\n"); + for (var error in errors) { + print(error); + } + } else { + print(prettyPrint(selectorAst)); + } + +} diff --git a/pkgs/csslib/example/call_parser.html b/pkgs/csslib/example/call_parser.html new file mode 100644 index 000000000..8dc02e474 --- /dev/null +++ b/pkgs/csslib/example/call_parser.html @@ -0,0 +1,13 @@ + + + + + + Call CSS Parser from Browser (Dart2JS and Dartium) + + +

Dartium/Dart2JS Test

+ + + + diff --git a/pkgs/csslib/example/test.css b/pkgs/csslib/example/test.css new file mode 100644 index 000000000..42aa04821 --- /dev/null +++ b/pkgs/csslib/example/test.css @@ -0,0 +1,6 @@ +.foo #abc { + color: red; + width: 300px; + left: 50px; + right: 50px; +} \ No newline at end of file diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart new file mode 100644 index 000000000..ebfc67525 --- /dev/null +++ b/pkgs/csslib/lib/css.dart @@ -0,0 +1,84 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library css; + +import 'dart:async'; +import 'dart:collection'; +import 'dart:io'; +import 'dart:math' as Math; + +import 'package:path/path.dart' as path; +import 'package:source_maps/span.dart' show SourceFile; + +import 'parser.dart'; +import 'visitor.dart'; +import 'src/messages.dart'; +import 'src/options.dart'; + +void main() { + // TODO(jmesserly): fix this to return a proper exit code + var options = PreprocessorOptions.parse(new Options().arguments); + if (options == null) return; + + messages = new Messages(options: options); + + _time('Total time spent on ${options.inputFile}', () { + _compile(options.inputFile, options.verbose); + }, true); +} + +void _compile(String inputPath, bool verbose) { + var ext = path.extension(inputPath); + if (ext != '.css' && ext != '.scss') { + messages.error("Please provide a CSS/Sass file", null); + return; + } + try { + // Read the file. + var filename = path.basename(inputPath); + var contents = new File(inputPath).readAsStringSync(); + var file = new SourceFile.text(inputPath, contents); + + // Parse the CSS. + var tree = _time('Parse $filename', + () => new Parser(file, contents).parse(), verbose); + + _time('Analyzer $filename', + () => new Analyzer([tree], messages), verbose).run(); + + // Emit the processed CSS. + var emitter = new CssPrinter(); + _time('Codegen $filename', + () => emitter.visitTree(tree, pretty: true), verbose); + + // Write the contents to a file. + var outPath = path.join(path.dirname(inputPath), '_$filename'); + new File(outPath).writeAsStringSync(emitter.toString()); + } catch (e) { + messages.error('error processing $inputPath. Original message:\n $e', null); + } +} + +_time(String message, callback(), bool printTime) { + if (!printTime) return callback(); + final watch = new Stopwatch(); + watch.start(); + var result = callback(); + watch.stop(); + final duration = watch.elapsedMilliseconds; + _printMessage(message, duration); + return result; +} + +void _printMessage(String message, int duration) { + var buf = new StringBuffer(); + buf.write(message); + for (int i = message.length; i < 60; i++) buf.write(' '); + buf.write(' -- '); + if (duration < 10) buf.write(' '); + if (duration < 100) buf.write(' '); + buf..write(duration)..write(' ms'); + print(buf.toString()); +} diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart new file mode 100644 index 000000000..a1cd7158d --- /dev/null +++ b/pkgs/csslib/lib/parser.dart @@ -0,0 +1,2402 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library csslib.parser; + +import 'dart:math' as math; + +import 'package:source_maps/span.dart' show SourceFile, Span, FileSpan; + +import "visitor.dart"; +import 'src/messages.dart'; +import 'src/options.dart'; + +part 'src/analyzer.dart'; +part 'src/property.dart'; +part 'src/token.dart'; +part 'src/tokenizer_base.dart'; +part 'src/tokenizer.dart'; +part 'src/tokenkind.dart'; + + +/** Used for parser lookup ahead (used for nested selectors Less support). */ +class ParserState extends TokenizerState { + final Token peekToken; + final Token previousToken; + + ParserState(this.peekToken, this.previousToken, Tokenizer tokenizer) + : super(tokenizer); +} + +void _createMessages({List errors, List options}) { + if (errors == null) errors = []; + + if (options == null) { + options = ['--no-colors', 'memory']; + } + var opt = PreprocessorOptions.parse(options); + messages = new Messages(options: opt, printHandler: errors.add); +} + +/** CSS checked mode enabled. */ +bool get isChecked => messages.options.checked; + +// TODO(terry): Remove nested name parameter. +/** Parse and analyze the CSS file. */ +StyleSheet compile(var input, {List errors, List options, bool nested: true}) { + var source = _inputAsString(input); + + _createMessages(errors: errors, options: options); + + var file = new SourceFile.text(null, source); + + var tree = new Parser(file, source).parse(); + + analyze([tree], errors: errors, options: options); + + return tree; +} + +/** Analyze the CSS file. */ +void analyze(List styleSheets, {List errors, List options}) { + _createMessages(errors: errors, options: options); + new Analyzer(styleSheets, messages).run(); +} + +/** + * Parse the [input] CSS stylesheet into a tree. The [input] can be a [String], + * or [List] of bytes and returns a [StyleSheet] AST. The optional + * [errors] list will contain each error/warning as a [Message]. + */ +StyleSheet parse(var input, {List errors, List options}) { + var source = _inputAsString(input); + + _createMessages(errors: errors, options: options); + + var file = new SourceFile.text(null, source); + + return new Parser(file, source).parse(); +} + +/** + * Parse the [input] CSS selector into a tree. The [input] can be a [String], + * or [List] of bytes and returns a [StyleSheet] AST. The optional + * [errors] list will contain each error/warning as a [Message]. + */ +StyleSheet selector(var input, {List errors}) { + var source = _inputAsString(input); + + _createMessages(errors: errors); + + var file = new SourceFile.text(null, source); + + return new Parser(file, source).parseSelector(); +} + +String _inputAsString(var input) { + String source; + + if (input is String) { + source = input; + } else if (input is List) { + // TODO(terry): The parse function needs an "encoding" argument and will + // default to whatever encoding CSS defaults to. + // + // Here's some info about CSS encodings: + // http://www.w3.org/International/questions/qa-css-charset.en.php + // + // As JMesserly suggests it will probably need a "preparser" html5lib + // (encoding_parser.dart) that interprets the bytes as ASCII and scans for + // @charset. But for now an "encoding" argument would work. Often the + // HTTP header will indicate the correct encoding. + // + // See encoding helpers at: package:html5lib/lib/src/char_encodings.dart + // These helpers can decode in different formats given an encoding name + // (mostly unicode, ascii, windows-1252 which is html5 default encoding). + source = new String.fromCharCodes(input); + } else { + // TODO(terry): Support RandomAccessFile using console. + throw new ArgumentError("'source' must be a String or " + "List (of bytes). RandomAccessFile not supported from this " + "simple interface"); + } + + return source; +} + +/** A simple recursive descent parser for CSS. */ +class Parser { + Tokenizer tokenizer; + + /** Base url of CSS file. */ + final String _baseUrl; + + /** + * File containing the source being parsed, used to report errors with + * source-span locations. + */ + final SourceFile file; + + Token _previousToken; + Token _peekToken; + + Parser(SourceFile file, String text, {int start: 0, String baseUrl}) + : this.file = file, + _baseUrl = baseUrl, + tokenizer = new Tokenizer(file, text, true, start) { + _peekToken = tokenizer.next(); + } + + /** Main entry point for parsing an entire CSS file. */ + StyleSheet parse() { + List productions = []; + + int start = _peekToken.start; + while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) { + // TODO(terry): Need to handle charset. + var directive = processDirective(); + if (directive != null) { + productions.add(directive); + _maybeEat(TokenKind.SEMICOLON); + } else { + RuleSet ruleset = processRuleSet(); + if (ruleset != null) { + productions.add(ruleset); + } else { + break; + } + } + } + + checkEndOfFile(); + + return new StyleSheet(productions, _makeSpan(start)); + } + + /** Main entry point for parsing a simple selector sequence. */ + StyleSheet parseSelector() { + List productions = []; + + int start = _peekToken.start; + while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) { + var selector = processSelector(); + if (selector != null) { + productions.add(selector); + } + } + + checkEndOfFile(); + + return new StyleSheet.selector(productions, _makeSpan(start)); + } + + /** Generate an error if [file] has not been completely consumed. */ + void checkEndOfFile() { + if (!(_peekKind(TokenKind.END_OF_FILE) || + _peekKind(TokenKind.INCOMPLETE_COMMENT))) { + _error('premature end of file unknown CSS', _peekToken.span); + } + } + + /** Guard to break out of parser when an unexpected end of file is found. */ + // TODO(jimhug): Failure to call this method can lead to inifinite parser + // loops. Consider embracing exceptions for more errors to reduce + // the danger here. + bool isPrematureEndOfFile() { + if (_maybeEat(TokenKind.END_OF_FILE)) { + _error('unexpected end of file', _peekToken.span); + return true; + } else { + return false; + } + } + + /////////////////////////////////////////////////////////////////// + // Basic support methods + /////////////////////////////////////////////////////////////////// + int _peek() { + return _peekToken.kind; + } + + Token _next({unicodeRange : false}) { + _previousToken = _peekToken; + _peekToken = tokenizer.next(unicodeRange: unicodeRange); + return _previousToken; + } + + bool _peekKind(int kind) { + return _peekToken.kind == kind; + } + + /* Is the next token a legal identifier? This includes pseudo-keywords. */ + bool _peekIdentifier() { + return TokenKind.isIdentifier(_peekToken.kind); + } + + /** Marks the parser/tokenizer look ahead to support Less nested selectors. */ + ParserState get _mark => + new ParserState(_peekToken, _previousToken, tokenizer); + + /** Restores the parser/tokenizer state to state remembered by _mark. */ + void _restore(ParserState markedData) { + tokenizer.restore(markedData); + _peekToken = markedData.peekToken; + _previousToken = markedData.previousToken; + } + + bool _maybeEat(int kind, {unicodeRange : false}) { + if (_peekToken.kind == kind) { + _previousToken = _peekToken; + _peekToken = tokenizer.next(unicodeRange: unicodeRange); + return true; + } else { + return false; + } + } + + void _eat(int kind, {unicodeRange : false}) { + if (!_maybeEat(kind, unicodeRange: unicodeRange)) { + _errorExpected(TokenKind.kindToString(kind)); + } + } + + void _eatSemicolon() { + _eat(TokenKind.SEMICOLON); + } + + void _errorExpected(String expected) { + var tok = _next(); + var message; + try { + message = 'expected $expected, but found $tok'; + } catch (e) { + message = 'parsing error expected $expected'; + } + _error(message, tok.span); + } + + void _error(String message, Span location) { + if (location == null) { + location = _peekToken.span; + } + messages.error(message, location); + } + + void _warning(String message, Span location) { + if (location == null) { + location = _peekToken.span; + } + messages.warning(message, location); + } + + Span _makeSpan(int start) { + // TODO(terry): there are places where we are creating spans before we eat + // the tokens, so using _previousToken.end is not always valid. + var end = _previousToken != null && _previousToken.end >= start + ? _previousToken.end : _peekToken.end; + return file.span(start, end); + } + + /////////////////////////////////////////////////////////////////// + // Top level productions + /////////////////////////////////////////////////////////////////// + + /** + * The media_query_list production below replaces the media_list production + * from CSS2 the new grammar is: + * + * media_query_list + * : S* [media_query [ ',' S* media_query ]* ]? + * media_query + * : [ONLY | NOT]? S* media_type S* [ AND S* expression ]* + * | expression [ AND S* expression ]* + * media_type + * : IDENT + * expression + * : '(' S* media_feature S* [ ':' S* expr ]? ')' S* + * media_feature + * : IDENT + */ + List processMediaQueryList() { + var mediaQueries = []; + + bool firstTime = true; + var mediaQuery; + do { + mediaQuery = processMediaQuery(firstTime == true); + if (mediaQuery != null) { + mediaQueries.add(mediaQuery); + firstTime = false; + continue; + } + + // Any more more media types separated by comma. + if (!_maybeEat(TokenKind.COMMA)) break; + + // Yep more media types start again. + firstTime = true; + } while ((!firstTime && mediaQuery != null) || firstTime); + + return mediaQueries; + } + + MediaQuery processMediaQuery([bool startQuery = true]) { + // Grammar: [ONLY | NOT]? S* media_type S* + // [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]* + + int start = _peekToken.start; + + // Is it a unary media operator? + var op = _peekToken.text; + var opLen = op.length; + var unaryOp = TokenKind.matchMediaOperator(op, 0, opLen); + if (unaryOp != -1) { + if (isChecked) { + if (startQuery && + unaryOp != TokenKind.MEDIA_OP_NOT || + unaryOp != TokenKind.MEDIA_OP_ONLY) { + _warning("Only the unary operators NOT and ONLY allowed", + _makeSpan(start)); + } + if (!startQuery && unaryOp != TokenKind.MEDIA_OP_AND) { + _warning("Only the binary AND operator allowed", _makeSpan(start)); + } + } + _next(); + start = _peekToken.start; + } + + var type; + if (startQuery && unaryOp != TokenKind.MEDIA_OP_AND) { + // Get the media type. + if (_peekIdentifier()) type = identifier(); + } + + var exprs = []; + + if (unaryOp == -1 || unaryOp == TokenKind.MEDIA_OP_AND) { + var andOp = false; + while (true) { + var expr = processMediaExpression(andOp); + if (expr == null) break; + + exprs.add(expr); + op = _peekToken.text; + opLen = op.length; + andOp = TokenKind.matchMediaOperator(op, 0, opLen) == + TokenKind.MEDIA_OP_AND; + if (!andOp) break; + _next(); + } + } + + if (unaryOp != -1 || type != null || exprs.length > 0) { + return new MediaQuery(unaryOp, type, exprs, _makeSpan(start)); + } + } + + MediaExpression processMediaExpression([bool andOperator = false]) { + int start = _peekToken.start; + + // Grammar: '(' S* media_feature S* [ ':' S* expr ]? ')' S* + if (_maybeEat(TokenKind.LPAREN)) { + if (_peekIdentifier()) { + var feature = identifier(); // Media feature. + while (_maybeEat(TokenKind.COLON)) { + int startExpr = _peekToken.start; + var exprs = processExpr(); + if (_maybeEat(TokenKind.RPAREN)) { + return new MediaExpression(andOperator, feature, exprs, + _makeSpan(startExpr)); + } else if (isChecked) { + _warning("Missing parenthesis around media expression", + _makeSpan(start)); + return null; + } + } + } else if (isChecked) { + _warning("Missing media feature in media expression", _makeSpan(start)); + return null; + } + } + } + + // Directive grammar: + // + // import: '@import' [string | URI] media_list? + // media: '@media' media_query_list '{' ruleset '}' + // page: '@page' [':' IDENT]? '{' declarations '}' + // stylet: '@stylet' IDENT '{' ruleset '}' + // media_query_list: IDENT [',' IDENT] + // keyframes: '@-webkit-keyframes ...' (see grammar below). + // font_face: '@font-face' '{' declarations '}' + // namespace: '@namespace name url("xmlns") + // host: '@host '{' ruleset '}' + processDirective() { + int start = _peekToken.start; + + var tokId = _peek(); + // Handle case for @ directive (where there's a whitespace between the @ + // sign and the directive name. Technically, it's not valid grammar but + // a number of CSS tests test for whitespace between @ and name. + if (tokId == TokenKind.AT) { + Token tok = _next(); + tokId = _peek(); + if (_peekIdentifier()) { + // Is it a directive? + var directive = _peekToken.text; + var directiveLen = directive.length; + tokId = TokenKind.matchDirectives(directive, 0, directiveLen); + if (tokId == -1) { + tokId = TokenKind.matchMarginDirectives(directive, 0, directiveLen); + } + } + + if (tokId == -1) { + if (messages.options.lessSupport) { + // Less compatibility: + // @name: value; => var-name: value; (VarDefinition) + // property: @name; => property: var(name); (VarUsage) + var name; + if (_peekIdentifier()) { + name = identifier(); + } + + _eat(TokenKind.COLON); + + Expressions exprs = processExpr(); + + var span = _makeSpan(start); + return new VarDefinitionDirective( + new VarDefinition(name, exprs, span), span); + } else if (isChecked) { + _error('unexpected directive @$_peekToken', _peekToken.span); + } + } + } + + switch (tokId) { + case TokenKind.DIRECTIVE_IMPORT: + _next(); + + // @import "uri_string" or @import url("uri_string") are identical; only + // a url can follow an @import. + String importStr; + if (_peekIdentifier()) { + var func = processFunction(identifier()); + if (func is UriTerm) { + importStr = func.text; + } + } else { + importStr = processQuotedString(false); + } + + // Any medias? + var medias = processMediaQueryList(); + + if (importStr == null) { + _error('missing import string', _peekToken.span); + } + + return new ImportDirective(importStr.trim(), medias, _makeSpan(start)); + + case TokenKind.DIRECTIVE_MEDIA: + _next(); + + // Any medias? + var media = processMediaQueryList(); + + List rulesets = []; + if (_maybeEat(TokenKind.LBRACE)) { + while (!_maybeEat(TokenKind.END_OF_FILE)) { + RuleSet ruleset = processRuleSet(); + if (ruleset == null) break; + rulesets.add(ruleset); + } + + if (!_maybeEat(TokenKind.RBRACE)) { + _error('expected } after ruleset for @media', _peekToken.span); + } + } else { + _error('expected { after media before ruleset', _peekToken.span); + } + return new MediaDirective(media, rulesets, _makeSpan(start)); + + case TokenKind.DIRECTIVE_HOST: + _next(); + + List rulesets = []; + if (_maybeEat(TokenKind.LBRACE)) { + while (!_maybeEat(TokenKind.END_OF_FILE)) { + RuleSet ruleset = processRuleSet(); + if (ruleset == null) break; + rulesets.add(ruleset); + } + + if (!_maybeEat(TokenKind.RBRACE)) { + _error('expected } after ruleset for @host', _peekToken.span); + } + } else { + _error('expected { after host before ruleset', _peekToken.span); + } + return new HostDirective(rulesets, _makeSpan(start)); + + case TokenKind.DIRECTIVE_PAGE: + /* + * @page S* IDENT? pseudo_page? + * S* '{' S* + * [ declaration | margin ]? + * [ ';' S* [ declaration | margin ]? ]* '}' S* + * + * pseudo_page : + * ':' [ "left" | "right" | "first" ] + * + * margin : + * margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S* + * + * margin_sym : @top-left-corner, @top-left, @bottom-left, etc. + * + * See http://www.w3.org/TR/css3-page/#CSS21 + */ + _next(); + + // Page name + var name; + if (_peekIdentifier()) { + name = identifier(); + } + + // Any pseudo page? + var pseudoPage; + if (_maybeEat(TokenKind.COLON)) { + if (_peekIdentifier()) { + pseudoPage = identifier(); + // TODO(terry): Normalize pseudoPage to lowercase. + if (isChecked && + !(pseudoPage.name == 'left' || + pseudoPage.name == 'right' || + pseudoPage.name == 'first')) { + _warning("Pseudo page must be left, top or first", + pseudoPage.span); + return; + } + } + } + + String pseudoName = pseudoPage is Identifier ? pseudoPage.name : ''; + String ident = name is Identifier ? name.name : ''; + return new PageDirective(ident, pseudoName, + processMarginsDeclarations(), _makeSpan(start)); + + case TokenKind.DIRECTIVE_CHARSET: + // @charset S* STRING S* ';' + _next(); + + var charEncoding = processQuotedString(false); + if (isChecked && charEncoding == null) { + // Missing character encoding. + _warning('missing character encoding string', _makeSpan(start)); + } + + return new CharsetDirective(charEncoding, _makeSpan(start)); + + // TODO(terry): Workaround Dart2js bug continue not implemented in switch + // see https://code.google.com/p/dart/issues/detail?id=8270 + /* + case TokenKind.DIRECTIVE_MS_KEYFRAMES: + // TODO(terry): For now only IE 10 (are base level) supports @keyframes, + // -moz- has only been optional since Oct 2012 release of Firefox, not + // all versions of webkit support @keyframes and opera doesn't yet + // support w/o -o- prefix. Add more warnings for other prefixes when + // they become optional. + if (isChecked) { + _warning('@-ms-keyframes should be @keyframes', _makeSpan(start)); + } + continue keyframeDirective; + + keyframeDirective: + */ + case TokenKind.DIRECTIVE_KEYFRAMES: + case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES: + case TokenKind.DIRECTIVE_MOZ_KEYFRAMES: + case TokenKind.DIRECTIVE_O_KEYFRAMES: + // TODO(terry): Remove workaround when bug 8270 is fixed. + case TokenKind.DIRECTIVE_MS_KEYFRAMES: + if (tokId == TokenKind.DIRECTIVE_MS_KEYFRAMES && isChecked) { + _warning('@-ms-keyframes should be @keyframes', _makeSpan(start)); + } + // TODO(terry): End of workaround. + + /* Key frames grammar: + * + * @[browser]? keyframes [IDENT|STRING] '{' keyframes-blocks '}'; + * + * browser: [-webkit-, -moz-, -ms-, -o-] + * + * keyframes-blocks: + * [keyframe-selectors '{' declarations '}']* ; + * + * keyframe-selectors: + * ['from'|'to'|PERCENTAGE] [',' ['from'|'to'|PERCENTAGE] ]* ; + */ + _next(); + + var name; + if (_peekIdentifier()) { + name = identifier(); + } + + _eat(TokenKind.LBRACE); + + var keyframe = new KeyFrameDirective(tokId, name, _makeSpan(start)); + + do { + Expressions selectors = new Expressions(_makeSpan(start)); + + do { + var term = processTerm(); + + // TODO(terry): Only allow from, to and PERCENTAGE ... + + selectors.add(term); + } while (_maybeEat(TokenKind.COMMA)); + + keyframe.add(new KeyFrameBlock(selectors, processDeclarations(), + _makeSpan(start))); + + } while (!_maybeEat(TokenKind.RBRACE) && !isPrematureEndOfFile()); + + return keyframe; + + case TokenKind.DIRECTIVE_FONTFACE: + _next(); + return new FontFaceDirective(processDeclarations(), _makeSpan(start)); + + case TokenKind.DIRECTIVE_STYLET: + /* Stylet grammar: + * + * @stylet IDENT '{' + * ruleset + * '}' + */ + _next(); + + var name; + if (_peekIdentifier()) { + name = identifier(); + } + + _eat(TokenKind.LBRACE); + + List productions = []; + + start = _peekToken.start; + while (!_maybeEat(TokenKind.END_OF_FILE)) { + RuleSet ruleset = processRuleSet(); + if (ruleset == null) { + break; + } + productions.add(ruleset); + } + + _eat(TokenKind.RBRACE); + + return new StyletDirective(name, productions, _makeSpan(start)); + + case TokenKind.DIRECTIVE_NAMESPACE: + /* Namespace grammar: + * + * @namespace S* [namespace_prefix S*]? [STRING|URI] S* ';' S* + * namespace_prefix : IDENT + * + */ + _next(); + + var prefix; + if (_peekIdentifier()) { + prefix = identifier(); + } + + // The namespace URI can be either a quoted string url("uri_string") + // are identical. + String namespaceUri; + if (_peekIdentifier()) { + var func = processFunction(identifier()); + if (func is UriTerm) { + namespaceUri = func.text; + } + } else { + if (prefix != null && prefix.name == 'url') { + var func = processFunction(prefix); + if (func is UriTerm) { + // @namespace url(""); + namespaceUri = func.text; + prefix = null; + } + } else { + namespaceUri = processQuotedString(false); + } + } + + return new NamespaceDirective(prefix != null ? prefix.name : '', + namespaceUri, _makeSpan(start)); + } + } + + RuleSet processRuleSet([SelectorGroup selectorGroup]) { + if (selectorGroup == null) { + selectorGroup = processSelectorGroup(); + } + if (selectorGroup != null) { + return new RuleSet(selectorGroup, processDeclarations(), + selectorGroup.span); + } + } + + /** + * Look ahead to see if what should be a declaration is really a selector. + * If it's a selector than it's a nested selector. This support's Less' + * nested selector syntax (requires a look ahead). E.g., + * + * div { + * width : 20px; + * span { + * color: red; + * } + * } + * + * Two tag name selectors div and span equivalent to: + * + * div { + * width: 20px; + * } + * div span { + * color: red; + * } + * + * Return [null] if no selector or [SelectorGroup] if a selector was parsed. + */ + SelectorGroup _nestedSelector() { + Messages oldMessages = messages; + _createMessages(); + + var markedData = _mark; + + // Look a head do we have a nested selector instead of a declaration? + SelectorGroup selGroup = processSelectorGroup(); + + var nestedSelector = selGroup != null && _peekKind(TokenKind.LBRACE) && + messages.messages.isEmpty; + + if (!nestedSelector) { + // Not a selector so restore the world. + _restore(markedData); + messages = oldMessages; + return null; + } else { + // Remember any messages from look ahead. + oldMessages.mergeMessages(messages); + messages = oldMessages; + return selGroup; + } + } + + processDeclarations({bool checkBrace: true}) { + int start = _peekToken.start; + + if (checkBrace) _eat(TokenKind.LBRACE); + + List decls = []; + List dartStyles = []; // List of latest styles exposed to Dart. + + do { + var selectorGroup = _nestedSelector(); + while (selectorGroup != null) { + // Nested selector so process as a ruleset. + var ruleset = processRuleSet(selectorGroup); + decls.add(ruleset); + selectorGroup = _nestedSelector(); + } + + Declaration decl = processDeclaration(dartStyles); + if (decl != null) { + if (decl.hasDartStyle) { + var newDartStyle = decl.dartStyle; + + // Replace or add latest Dart style. + bool replaced = false; + for (var i = 0; i < dartStyles.length; i++) { + var dartStyle = dartStyles[i]; + if (dartStyle.isSame(newDartStyle)) { + dartStyles[i] = newDartStyle; + replaced = true; + break; + } + } + if (!replaced) { + dartStyles.add(newDartStyle); + } + } + decls.add(decl); + } + } while (_maybeEat(TokenKind.SEMICOLON)); + + if (checkBrace) _eat(TokenKind.RBRACE); + + // Fixup declaration to only have dartStyle that are live for this set of + // declarations. + for (var decl in decls) { + if (decl is Declaration) { + if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) { + // Dart style not live, ignore these styles in this Declarations. + decl.dartStyle = null; + } + } + } + + return new DeclarationGroup(decls, _makeSpan(start)); + } + + List processMarginsDeclarations() { + List groups = []; + + int start = _peekToken.start; + + _eat(TokenKind.LBRACE); + + List decls = []; + List dartStyles = []; // List of latest styles exposed to Dart. + + do { + switch (_peek()) { + case TokenKind.MARGIN_DIRECTIVE_TOPLEFTCORNER: + case TokenKind.MARGIN_DIRECTIVE_TOPLEFT: + case TokenKind.MARGIN_DIRECTIVE_TOPCENTER: + case TokenKind.MARGIN_DIRECTIVE_TOPRIGHT: + case TokenKind.MARGIN_DIRECTIVE_TOPRIGHTCORNER: + case TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFTCORNER: + case TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFT: + case TokenKind.MARGIN_DIRECTIVE_BOTTOMCENTER: + case TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHT: + case TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHTCORNER: + case TokenKind.MARGIN_DIRECTIVE_LEFTTOP: + case TokenKind.MARGIN_DIRECTIVE_LEFTMIDDLE: + case TokenKind.MARGIN_DIRECTIVE_LEFTBOTTOM: + case TokenKind.MARGIN_DIRECTIVE_RIGHTTOP: + case TokenKind.MARGIN_DIRECTIVE_RIGHTMIDDLE: + case TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM: + // Margin syms processed. + // margin : + // margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S* + // + // margin_sym : @top-left-corner, @top-left, @bottom-left, etc. + var marginSym = _peek(); + + _next(); + + var declGroup = processDeclarations(); + if (declGroup != null) { + groups.add(new MarginGroup(marginSym, declGroup.declarations, + _makeSpan(start))); + } + break; + default: + Declaration decl = processDeclaration(dartStyles); + if (decl != null) { + if (decl.hasDartStyle) { + var newDartStyle = decl.dartStyle; + + // Replace or add latest Dart style. + bool replaced = false; + for (var i = 0; i < dartStyles.length; i++) { + var dartStyle = dartStyles[i]; + if (dartStyle.isSame(newDartStyle)) { + dartStyles[i] = newDartStyle; + replaced = true; + break; + } + } + if (!replaced) { + dartStyles.add(newDartStyle); + } + } + decls.add(decl); + } + _maybeEat(TokenKind.SEMICOLON); + break; + } + } while (!_maybeEat(TokenKind.RBRACE) && !isPrematureEndOfFile()); + + // Fixup declaration to only have dartStyle that are live for this set of + // declarations. + for (var decl in decls) { + if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) { + // Dart style not live, ignore these styles in this Declarations. + decl.dartStyle = null; + } + } + + if (decls.length > 0) { + groups.add(new DeclarationGroup(decls, _makeSpan(start))); + } + + return groups; + } + + SelectorGroup processSelectorGroup() { + List selectors = []; + int start = _peekToken.start; + do { + Selector selector = processSelector(); + if (selector != null) { + selectors.add(selector); + } + } while (_maybeEat(TokenKind.COMMA)); + + if (selectors.length > 0) { + return new SelectorGroup(selectors, _makeSpan(start)); + } + } + + /** + * Return list of selectors + */ + processSelector() { + List simpleSequences = []; + int start = _peekToken.start; + while (true) { + // First item is never descendant make sure it's COMBINATOR_NONE. + var selectorItem = simpleSelectorSequence(simpleSequences.length == 0); + if (selectorItem != null) { + simpleSequences.add(selectorItem); + } else { + break; + } + } + + if (simpleSequences.length > 0) { + return new Selector(simpleSequences, _makeSpan(start)); + } + } + + simpleSelectorSequence(bool forceCombinatorNone) { + var start = _peekToken.start; + var combinatorType = TokenKind.COMBINATOR_NONE; + var thisOperator = false; + + switch (_peek()) { + case TokenKind.PLUS: + _eat(TokenKind.PLUS); + combinatorType = TokenKind.COMBINATOR_PLUS; + break; + case TokenKind.GREATER: + _eat(TokenKind.GREATER); + combinatorType = TokenKind.COMBINATOR_GREATER; + break; + case TokenKind.TILDE: + _eat(TokenKind.TILDE); + combinatorType = TokenKind.COMBINATOR_TILDE; + break; + case TokenKind.AMPERSAND: + _eat(TokenKind.AMPERSAND); + thisOperator = true; + break; + } + + // Check if WHITESPACE existed between tokens if so we're descendent. + if (combinatorType == TokenKind.COMBINATOR_NONE && !forceCombinatorNone) { + if (this._previousToken != null && + this._previousToken.end != this._peekToken.start) { + combinatorType = TokenKind.COMBINATOR_DESCENDANT; + } + } + + var span = _makeSpan(start); + var simpleSel = thisOperator ? + new ElementSelector(new ThisOperator(span), span) : simpleSelector(); + if (simpleSel == null && + (combinatorType == TokenKind.COMBINATOR_PLUS || + combinatorType == TokenKind.COMBINATOR_GREATER || + combinatorType == TokenKind.COMBINATOR_TILDE)) { + // For "+ &", "~ &" or "> &" a selector sequence with no name is needed + // so that the & will have a combinator too. This is needed to + // disambiguate selector expressions: + // .foo&:hover combinator before & is NONE + // .foo & combinator before & is DESCDENDANT + // .foo > & combinator before & is GREATER + simpleSel = new ElementSelector(new Identifier("", span), span); + } + if (simpleSel != null) { + return new SimpleSelectorSequence(simpleSel, span, combinatorType); + } + } + + /** + * Simple selector grammar: + * + * simple_selector_sequence + * : [ type_selector | universal ] + * [ HASH | class | attrib | pseudo | negation ]* + * | [ HASH | class | attrib | pseudo | negation ]+ + * type_selector + * : [ namespace_prefix ]? element_name + * namespace_prefix + * : [ IDENT | '*' ]? '|' + * element_name + * : IDENT + * universal + * : [ namespace_prefix ]? '*' + * class + * : '.' IDENT + */ + simpleSelector() { + // TODO(terry): Nathan makes a good point parsing of namespace and element + // are essentially the same (asterisk or identifier) other + // than the error message for element. Should consolidate the + // code. + // TODO(terry): Need to handle attribute namespace too. + var first; + int start = _peekToken.start; + switch (_peek()) { + case TokenKind.ASTERISK: + // Mark as universal namespace. + var tok = _next(); + first = new Wildcard(_makeSpan(tok.start)); + break; + case TokenKind.IDENTIFIER: + first = identifier(); + break; + default: + // Expecting simple selector. + // TODO(terry): Could be a synthesized token like value, etc. + if (TokenKind.isKindIdentifier(_peek())) { + first = identifier(); + } else if (_peekKind(TokenKind.SEMICOLON)) { + // Can't be a selector if we found a semi-colon. + return null; + } + break; + } + + if (_maybeEat(TokenKind.NAMESPACE)) { + var element; + switch (_peek()) { + case TokenKind.ASTERISK: + // Mark as universal element + var tok = _next(); + element = new Wildcard(_makeSpan(tok.start)); + break; + case TokenKind.IDENTIFIER: + element = identifier(); + break; + default: + _error('expected element name or universal(*), but found $_peekToken', + _peekToken.span); + break; + } + + return new NamespaceSelector(first, + new ElementSelector(element, element.span), _makeSpan(start)); + } else if (first != null) { + return new ElementSelector(first, _makeSpan(start)); + } else { + // Check for HASH | class | attrib | pseudo | negation + return simpleSelectorTail(); + } + } + + bool _anyWhiteSpaceBeforePeekToken(int kind) { + if (_previousToken != null && _peekToken != null && + _previousToken.kind == kind) { + // If end of previous token isn't same as the start of peek token then + // there's something between these tokens probably whitespace. + return _previousToken.end != _peekToken.start; + } + + return false; + } + + /** + * type_selector | universal | HASH | class | attrib | pseudo + */ + simpleSelectorTail() { + // Check for HASH | class | attrib | pseudo | negation + int start = _peekToken.start; + switch (_peek()) { + case TokenKind.HASH: + _eat(TokenKind.HASH); + + bool hasWhiteSpace = false; + if (_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) { + _warning("Not a valid ID selector expected #id", _makeSpan(start)); + hasWhiteSpace = true; + } + if (_peekIdentifier()) { + var id = identifier(); + if (hasWhiteSpace) { + // Generate bad selector id (normalized). + id.name = " ${id.name}"; + } + return new IdSelector(id, _makeSpan(start)); + } + return null; + case TokenKind.DOT: + _eat(TokenKind.DOT); + + bool hasWhiteSpace = false; + if (_anyWhiteSpaceBeforePeekToken(TokenKind.DOT)) { + _warning("Not a valid class selector expected .className", + _makeSpan(start)); + hasWhiteSpace = true; + } + var id = identifier(); + if (hasWhiteSpace) { + // Generate bad selector class (normalized). + id.name = " ${id.name}"; + } + return new ClassSelector(id, _makeSpan(start)); + case TokenKind.COLON: + // :pseudo-class ::pseudo-element + // TODO(terry): '::' should be token. + _eat(TokenKind.COLON); + bool pseudoElement = _maybeEat(TokenKind.COLON); + + // TODO(terry): If no identifier specified consider optimizing out the + // : or :: and making this a normal selector. For now, + // create an empty pseudoName. + var pseudoName; + if (_peekIdentifier()) { + pseudoName = identifier(); + } else { + return null; + } + + // Functional pseudo? + if (_maybeEat(TokenKind.LPAREN)) { + if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') { + // Negation : ':NOT(' S* negation_arg S* ')' + var negArg = simpleSelector(); + + _eat(TokenKind.RPAREN); + return new NegationSelector(negArg, _makeSpan(start)); + } else { + // Handle function expression. + var span = _makeSpan(start); + var expr = processSelectorExpression(); + + // Used during selector look-a-head if not a SelectorExpression is + // bad. + if (expr is! SelectorExpression) { + _errorExpected("CSS expression"); + return null; + } + + _eat(TokenKind.RPAREN); + return (pseudoElement) ? + new PseudoElementFunctionSelector(pseudoName, expr, span) : + new PseudoClassFunctionSelector(pseudoName, expr, span); + } + } + + // TODO(terry): Need to handle specific pseudo class/element name and + // backward compatible names that are : as well as :: as well as + // parameters. Current, spec uses :: for pseudo-element and : for + // pseudo-class. However, CSS2.1 allows for : to specify old + // pseudo-elements (:first-line, :first-letter, :before and :after) any + // new pseudo-elements defined would require a ::. + return pseudoElement ? + new PseudoElementSelector(pseudoName, _makeSpan(start)) : + new PseudoClassSelector(pseudoName, _makeSpan(start)); + case TokenKind.LBRACK: + return processAttribute(); + case TokenKind.DOUBLE: + _error('name must start with a alpha character, but found a number', + _peekToken.span); + _next(); + break; + } + } + + /** + * In CSS3, the expressions are identifiers, strings, or of the form "an+b". + * + * : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+ + * + * num [0-9]+|[0-9]*\.[0-9]+ + * PLUS '+' + * DIMENSION {num}{ident} + * NUMBER {num} + */ + processSelectorExpression() { + int start = _peekToken.start; + + var expression = new SelectorExpression(_makeSpan(start)); + + Token termToken; + var value; + + // Special parsing for expressions in pseudo functions. Minus is used as + // operator not identifier. + tokenizer.selectorExpression = true; + + bool keepParsing = true; + while (keepParsing) { + switch (_peek()) { + case TokenKind.PLUS: + start = _peekToken.start; + termToken = _next(); + expression.add(new OperatorPlus(_makeSpan(start))); + break; + case TokenKind.MINUS: + start = _peekToken.start; + termToken = _next(); + expression.add(new OperatorMinus(_makeSpan(start))); + break; + case TokenKind.INTEGER: + termToken = _next(); + value = int.parse(termToken.text); + break; + case TokenKind.DOUBLE: + termToken = _next(); + value = double.parse(termToken.text); + break; + case TokenKind.SINGLE_QUOTE: + case TokenKind.DOUBLE_QUOTE: + value = processQuotedString(false); + value = '"${_escapeString(value)}"'; + return new LiteralTerm(value, value, _makeSpan(start)); + case TokenKind.IDENTIFIER: + value = identifier(); // Snarf up the ident we'll remap, maybe. + break; + default: + keepParsing = false; + } + + if (keepParsing && value != null) { + var unitTerm; + // Don't process the dimension if MINUS or PLUS is next. + if (_peek() != TokenKind.MINUS && _peek() != TokenKind.PLUS) { + unitTerm = processDimension(termToken, value, _makeSpan(start)); + } + if (unitTerm == null) { + unitTerm = new LiteralTerm(value, value.name, _makeSpan(start)); + } + expression.add(unitTerm); + + value = null; + } + } + + tokenizer.selectorExpression = false; + + return expression; + } + + // Attribute grammar: + // + // attributes : + // '[' S* IDENT S* [ ATTRIB_MATCHES S* [ IDENT | STRING ] S* ]? ']' + // + // ATTRIB_MATCHES : + // [ '=' | INCLUDES | DASHMATCH | PREFIXMATCH | SUFFIXMATCH | SUBSTRMATCH ] + // + // INCLUDES: '~=' + // + // DASHMATCH: '|=' + // + // PREFIXMATCH: '^=' + // + // SUFFIXMATCH: '$=' + // + // SUBSTRMATCH: '*=' + // + // + processAttribute() { + int start = _peekToken.start; + + if (_maybeEat(TokenKind.LBRACK)) { + var attrName = identifier(); + + int op; + switch (_peek()) { + case TokenKind.EQUALS: + case TokenKind.INCLUDES: // ~= + case TokenKind.DASH_MATCH: // |= + case TokenKind.PREFIX_MATCH: // ^= + case TokenKind.SUFFIX_MATCH: // $= + case TokenKind.SUBSTRING_MATCH: // *= + op = _peek(); + _next(); + break; + default: + op = TokenKind.NO_MATCH; + } + + var value; + if (op != TokenKind.NO_MATCH) { + // Operator hit so we require a value too. + if (_peekIdentifier()) { + value = identifier(); + } else { + value = processQuotedString(false); + } + + if (value == null) { + _error('expected attribute value string or ident', _peekToken.span); + } + } + + _eat(TokenKind.RBRACK); + + return new AttributeSelector(attrName, op, value, _makeSpan(start)); + } + } + + // Declaration grammar: + // + // declaration: property ':' expr prio? + // + // property: IDENT [or IE hacks] + // prio: !important + // expr: (see processExpr) + // + // Here are the ugly IE hacks we need to support: + // property: expr prio? \9; - IE8 and below property, /9 before semi-colon + // *IDENT - IE7 or below + // _IDENT - IE6 property (automatically a valid ident) + // + processDeclaration(List dartStyles) { + Declaration decl; + + int start = _peekToken.start; + + // IE7 hack of * before property name if so the property is IE7 or below. + var ie7 = _peekKind(TokenKind.ASTERISK); + if (ie7) { + _next(); + } + + // IDENT ':' expr '!important'? + if (TokenKind.isIdentifier(_peekToken.kind)) { + var propertyIdent = identifier(); + + var ieFilterProperty = propertyIdent.name.toLowerCase() == 'filter'; + + _eat(TokenKind.COLON); + + Expressions exprs = processExpr(ieFilterProperty); + + var dartComposite = _styleForDart(propertyIdent, exprs, dartStyles); + + // Handle !important (prio) + var importantPriority = _maybeEat(TokenKind.IMPORTANT); + + decl = new Declaration(propertyIdent, exprs, dartComposite, + _makeSpan(start), important: importantPriority, ie7: ie7); + } else if (_peekToken.kind == TokenKind.VAR_DEFINITION) { + _next(); + var definedName; + if (_peekIdentifier()) definedName = identifier(); + + _eat(TokenKind.COLON); + + Expressions exprs = processExpr(); + + decl = new VarDefinition(definedName, exprs, _makeSpan(start)); + } + + return decl; + } + + /** List of styles exposed to the Dart UI framework. */ + static const int _fontPartFont= 0; + static const int _fontPartVariant = 1; + static const int _fontPartWeight = 2; + static const int _fontPartSize = 3; + static const int _fontPartFamily = 4; + static const int _fontPartStyle = 5; + static const int _marginPartMargin = 6; + static const int _marginPartLeft = 7; + static const int _marginPartTop = 8; + static const int _marginPartRight = 9; + static const int _marginPartBottom = 10; + static const int _lineHeightPart = 11; + static const int _borderPartBorder = 12; + static const int _borderPartLeft = 13; + static const int _borderPartTop = 14; + static const int _borderPartRight = 15; + static const int _borderPartBottom = 16; + static const int _borderPartWidth = 17; + static const int _borderPartLeftWidth = 18; + static const int _borderPartTopWidth = 19; + static const int _borderPartRightWidth = 20; + static const int _borderPartBottomWidth = 21; + static const int _heightPart = 22; + static const int _widthPart = 23; + static const int _paddingPartPadding = 24; + static const int _paddingPartLeft = 25; + static const int _paddingPartTop = 26; + static const int _paddingPartRight = 27; + static const int _paddingPartBottom = 28; + + static const Map _stylesToDart = const { + 'font': _fontPartFont, + 'font-family': _fontPartFamily, + 'font-size': _fontPartSize, + 'font-style': _fontPartStyle, + 'font-variant': _fontPartVariant, + 'font-weight': _fontPartWeight, + 'line-height': _lineHeightPart, + 'margin': _marginPartMargin, + 'margin-left': _marginPartLeft, + 'margin-right': _marginPartRight, + 'margin-top': _marginPartTop, + 'margin-bottom': _marginPartBottom, + 'border': _borderPartBorder, + 'border-left': _borderPartLeft, + 'border-right': _borderPartRight, + 'border-top': _borderPartTop, + 'border-bottom': _borderPartBottom, + 'border-width': _borderPartWidth, + 'border-left-width': _borderPartLeftWidth, + 'border-top-width': _borderPartTopWidth, + 'border-right-width': _borderPartRightWidth, + 'border-bottom-width': _borderPartBottomWidth, + 'height': _heightPart, + 'width': _widthPart, + 'padding': _paddingPartPadding, + 'padding-left': _paddingPartLeft, + 'padding-top': _paddingPartTop, + 'padding-right': _paddingPartRight, + 'padding-bottom': _paddingPartBottom + }; + + static const Map _nameToFontWeight = const { + 'bold' : FontWeight.bold, + 'normal' : FontWeight.normal + }; + + static _findStyle(String styleName) { + if (_stylesToDart.containsKey(styleName)) { + return _stylesToDart[styleName]; + } + } + + _styleForDart(Identifier property, Expressions exprs, List dartStyles) { + int styleType = _findStyle(property.name.toLowerCase()); + if (styleType != null) { + return buildDartStyleNode(styleType, exprs, dartStyles); + } + } + + FontExpression _mergeFontStyles(FontExpression fontExpr, List dartStyles) { + // Merge all font styles for this class selector. + for (var dartStyle in dartStyles) { + if (dartStyle.isFont) { + fontExpr = new FontExpression.merge(dartStyle, fontExpr); + } + } + + return fontExpr; + } + + buildDartStyleNode(int styleType, Expressions exprs, List dartStyles) { + switch (styleType) { + /* + * Properties in order: + * + * font-style font-variant font-weight font-size/line-height font-family + * + * The font-size and font-family values are required. If other values are + * missing; a default, if it exist, will be used. + */ + case _fontPartFont: + var processor = new ExpressionsProcessor(exprs); + return _mergeFontStyles(processor.processFont(), dartStyles); + case _fontPartFamily: + var processor = new ExpressionsProcessor(exprs); + + try { + return _mergeFontStyles(processor.processFontFamily(), dartStyles); + } catch (fontException) { + _error(fontException, _peekToken.span); + } + break; + case _fontPartSize: + var processor = new ExpressionsProcessor(exprs); + return _mergeFontStyles(processor.processFontSize(), dartStyles); + case _fontPartStyle: + /* Possible style values: + * normal [default] + * italic + * oblique + * inherit + */ + // TODO(terry): TBD + break; + case _fontPartVariant: + /* Possible variant values: + * normal [default] + * small-caps + * inherit + */ + // TODO(terry): TBD + break; + case _fontPartWeight: + /* Possible weight values: + * normal [default] + * bold + * bolder + * lighter + * 100 - 900 + * inherit + */ + // TODO(terry): Only 'normal', 'bold', or values of 100-900 supoorted + // need to handle bolder, lighter, and inherit. See + // https://github.com/dart-lang/csslib/issues/1 + var expr = exprs.expressions[0]; + if (expr is NumberTerm) { + var fontExpr = new FontExpression(expr.span, + weight: expr.value); + return _mergeFontStyles(fontExpr, dartStyles); + } else if (expr is LiteralTerm) { + int weight = _nameToFontWeight[expr.value.toString()]; + if (weight != null) { + var fontExpr = new FontExpression(expr.span, weight: weight); + return _mergeFontStyles(fontExpr, dartStyles); + } + } + break; + case _lineHeightPart: + num lineHeight; + if (exprs.expressions.length == 1) { + var expr = exprs.expressions[0]; + if (expr is UnitTerm) { + UnitTerm unitTerm = expr; + // TODO(terry): Need to handle other units and LiteralTerm normal + // See https://github.com/dart-lang/csslib/issues/2. + if (unitTerm.unit == TokenKind.UNIT_LENGTH_PX || + unitTerm.unit == TokenKind.UNIT_LENGTH_PT) { + var fontExpr = new FontExpression(expr.span, + lineHeight: new LineHeight(expr.value, inPixels: true)); + return _mergeFontStyles(fontExpr, dartStyles); + } else if (isChecked) { + _warning("Unexpected unit for line-height", expr.span); + } + } else if (expr is NumberTerm) { + var fontExpr = new FontExpression(expr.span, + lineHeight: new LineHeight(expr.value, inPixels: false)); + return _mergeFontStyles(fontExpr, dartStyles); + } else if (isChecked) { + _warning("Unexpected value for line-height", expr.span); + } + } + break; + case _marginPartMargin: + return new MarginExpression.boxEdge(exprs.span, processFourNums(exprs)); + case _borderPartBorder: + for (var expr in exprs.expressions) { + var v = marginValue(expr); + if (v != null) { + final box = new BoxEdge.uniform(v); + return new BorderExpression.boxEdge(exprs.span, box); + } + } + break; + case _borderPartWidth: + var v = marginValue(exprs.expressions[0]); + if (v != null) { + final box = new BoxEdge.uniform(v); + return new BorderExpression.boxEdge(exprs.span, box); + } + break; + case _paddingPartPadding: + return new PaddingExpression.boxEdge(exprs.span, + processFourNums(exprs)); + case _marginPartLeft: + case _marginPartTop: + case _marginPartRight: + case _marginPartBottom: + case _borderPartLeft: + case _borderPartTop: + case _borderPartRight: + case _borderPartBottom: + case _borderPartLeftWidth: + case _borderPartTopWidth: + case _borderPartRightWidth: + case _borderPartBottomWidth: + case _heightPart: + case _widthPart: + case _paddingPartLeft: + case _paddingPartTop: + case _paddingPartRight: + case _paddingPartBottom: + if (exprs.expressions.length > 0) { + return processOneNumber(exprs, styleType); + } + break; + default: + // Don't handle it. + return; + } + } + + // TODO(terry): Look at handling width of thin, thick, etc. any none numbers + // to convert to a number. + processOneNumber(Expressions exprs, int part) { + var value = marginValue(exprs.expressions[0]); + if (value != null) { + switch (part) { + case _marginPartLeft: + return new MarginExpression(exprs.span, left: value); + case _marginPartTop: + return new MarginExpression(exprs.span, top: value); + case _marginPartRight: + return new MarginExpression(exprs.span, right: value); + case _marginPartBottom: + return new MarginExpression(exprs.span, bottom: value); + case _borderPartLeft: + case _borderPartLeftWidth: + return new BorderExpression(exprs.span, left: value); + case _borderPartTop: + case _borderPartTopWidth: + return new BorderExpression(exprs.span, top: value); + case _borderPartRight: + case _borderPartRightWidth: + return new BorderExpression(exprs.span, right: value); + case _borderPartBottom: + case _borderPartBottomWidth: + return new BorderExpression(exprs.span, bottom: value); + case _heightPart: + return new HeightExpression(exprs.span, value); + case _widthPart: + return new WidthExpression(exprs.span, value); + case _paddingPartLeft: + return new PaddingExpression(exprs.span, left: value); + case _paddingPartTop: + return new PaddingExpression(exprs.span, top: value); + case _paddingPartRight: + return new PaddingExpression(exprs.span, right: value); + case _paddingPartBottom: + return new PaddingExpression(exprs.span, bottom: value); + } + } + } + + /** + * Margins are of the format: + * + * top,right,bottom,left (4 parameters) + * top,right/left, bottom (3 parameters) + * top/bottom,right/left (2 parameters) + * top/right/bottom/left (1 parameter) + * + * The values of the margins can be a unit or unitless or auto. + */ + processFourNums(Expressions exprs) { + num top; + num right; + num bottom; + num left; + + int totalExprs = exprs.expressions.length; + switch (totalExprs) { + case 1: + top = marginValue(exprs.expressions[0]); + right = top; + bottom = top; + left = top; + break; + case 2: + top = marginValue(exprs.expressions[0]); + bottom = top; + right = marginValue(exprs.expressions[1]); + left = right; + break; + case 3: + top = marginValue(exprs.expressions[0]); + right = marginValue(exprs.expressions[1]); + left = right; + bottom = marginValue(exprs.expressions[2]); + break; + case 4: + top = marginValue(exprs.expressions[0]); + right = marginValue(exprs.expressions[1]); + bottom = marginValue(exprs.expressions[2]); + left = marginValue(exprs.expressions[3]); + break; + default: + return; + } + + return new BoxEdge.clockwiseFromTop(top, right, bottom, left); + } + + // TODO(terry): Need to handle auto. + marginValue(var exprTerm) { + if (exprTerm is UnitTerm || exprTerm is NumberTerm) { + return exprTerm.value; + } + } + + // Expression grammar: + // + // expression: term [ operator? term]* + // + // operator: '/' | ',' + // term: (see processTerm) + // + processExpr([bool ieFilter = false]) { + int start = _peekToken.start; + Expressions expressions = new Expressions(_makeSpan(start)); + + bool keepGoing = true; + var expr; + while (keepGoing && (expr = processTerm(ieFilter)) != null) { + var op; + + int opStart = _peekToken.start; + + switch (_peek()) { + case TokenKind.SLASH: + op = new OperatorSlash(_makeSpan(opStart)); + break; + case TokenKind.COMMA: + op = new OperatorComma(_makeSpan(opStart)); + break; + case TokenKind.BACKSLASH: + // Backslash outside of string; detected IE8 or older signaled by \9 at + // end of an expression. + var ie8Start = _peekToken.start; + + _next(); + if (_peekKind(TokenKind.INTEGER)) { + var numToken = _next(); + var value = int.parse(numToken.text); + if (value == 9) { + op = new IE8Term(_makeSpan(ie8Start)); + } else if (isChecked) { + _warning("\$value is not valid in an expression", _makeSpan(start)); + } + } + break; + } + + if (expr != null) { + expressions.add(expr); + } else { + keepGoing = false; + } + + if (op != null) { + expressions.add(op); + if (op is IE8Term) { + keepGoing = false; + } else { + _next(); + } + } + } + + return expressions; + } + + static int MAX_UNICODE = int.parse('0x10FFFF'); + + // Term grammar: + // + // term: + // unary_operator? + // [ term_value ] + // | STRING S* | IDENT S* | URI S* | UNICODERANGE S* | hexcolor + // + // term_value: + // NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* | + // TIME S* | FREQ S* | function + // + // NUMBER: {num} + // PERCENTAGE: {num}% + // LENGTH: {num}['px' | 'cm' | 'mm' | 'in' | 'pt' | 'pc'] + // EMS: {num}'em' + // EXS: {num}'ex' + // ANGLE: {num}['deg' | 'rad' | 'grad'] + // TIME: {num}['ms' | 's'] + // FREQ: {num}['hz' | 'khz'] + // function: IDENT '(' expr ')' + // + processTerm([bool ieFilter = false]) { + int start = _peekToken.start; + Token t; // token for term's value + var value; // value of term (numeric values) + + var unary = ""; + switch (_peek()) { + case TokenKind.HASH: + this._eat(TokenKind.HASH); + if (!_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) { + String hexText; + if (_peekKind(TokenKind.INTEGER)) { + String hexText1 = _peekToken.text; + _next(); + if (_peekIdentifier()) { + hexText = '$hexText1${identifier().name}'; + } else { + hexText = hexText1; + } + } else if (_peekIdentifier()) { + hexText = identifier().name; + } + if (hexText != null) { + return _parseHex(hexText, _makeSpan(start)); + } + } + + if (isChecked) { + _warning("Expected hex number", _makeSpan(start)); + } + // Construct the bad hex value with a #number. + return _parseHex(" ${processTerm().text}", _makeSpan(start)); + case TokenKind.INTEGER: + t = _next(); + value = int.parse("${unary}${t.text}"); + break; + case TokenKind.DOUBLE: + t = _next(); + value = double.parse("${unary}${t.text}"); + break; + case TokenKind.SINGLE_QUOTE: + case TokenKind.DOUBLE_QUOTE: + value = processQuotedString(false); + value = '"${_escapeString(value)}"'; + return new LiteralTerm(value, value, _makeSpan(start)); + case TokenKind.LPAREN: + _next(); + + GroupTerm group = new GroupTerm(_makeSpan(start)); + + var term; + do { + term = processTerm(); + if (term != null && term is LiteralTerm) { + group.add(term); + } + } while (term != null && !_maybeEat(TokenKind.RPAREN) && + !isPrematureEndOfFile()); + + return group; + case TokenKind.LBRACK: + _next(); + + var term = processTerm(); + if (!(term is NumberTerm)) { + _error('Expecting a positive number', _makeSpan(start)); + } + + _eat(TokenKind.RBRACK); + + return new ItemTerm(term.value, term.text, _makeSpan(start)); + case TokenKind.IDENTIFIER: + var nameValue = identifier(); // Snarf up the ident we'll remap, maybe. + + if (!ieFilter && _maybeEat(TokenKind.LPAREN)) { + // FUNCTION + return processFunction(nameValue); + } if (ieFilter) { + if (_maybeEat(TokenKind.COLON) && + nameValue.name.toLowerCase() == 'progid') { + // IE filter:progid: + return processIEFilter(start); + } else { + // Handle filter: where name is any filter e.g., alpha, chroma, + // Wave, blur, etc. + return processIEFilter(start); + } + } + + // TODO(terry): Need to have a list of known identifiers today only + // 'from' is special. + if (nameValue.name == 'from') { + return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); + } + + // What kind of identifier is it, named color? + var colorEntry = TokenKind.matchColorName(nameValue.name); + if (colorEntry == null) { + if (isChecked) { + var propName = nameValue.name; + var errMsg = TokenKind.isPredefinedName(propName) ? + "Improper use of property value ${propName}" : + "Unknown property value ${propName}"; + _warning(errMsg, _makeSpan(start)); + } + return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); + } + + // Yes, process the color as an RGB value. + String rgbColor = TokenKind.decimalToHex( + TokenKind.colorValue(colorEntry), 6); + return _parseHex(rgbColor, _makeSpan(start)); + case TokenKind.UNICODE_RANGE: + var first; + var second; + var firstNumber; + var secondNumber; + _eat(TokenKind.UNICODE_RANGE, unicodeRange: true); + if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { + first = _previousToken.text; + firstNumber = int.parse('0x$first'); + if (firstNumber > MAX_UNICODE) { + _error("unicode range must be less than 10FFFF", _makeSpan(start)); + } + if (_maybeEat(TokenKind.MINUS, unicodeRange: true)) { + if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { + second = _previousToken.text; + secondNumber = int.parse('0x$second'); + if (secondNumber > MAX_UNICODE) { + _error("unicode range must be less than 10FFFF", + _makeSpan(start)); + } + if (firstNumber > secondNumber) { + _error("unicode first range can not be greater than last", + _makeSpan(start)); + } + } + } + } else if (_maybeEat(TokenKind.HEX_RANGE, unicodeRange: true)) { + first = _previousToken.text; + } + + return new UnicodeRangeTerm(first, second, _makeSpan(start)); + case TokenKind.AT: + if (messages.options.lessSupport) { + _next(); + + var expr = processExpr(); + if (isChecked && expr.expressions.length > 1) { + _error("only @name for Less syntax", _peekToken.span); + } + + var param = expr.expressions[0]; + return new VarUsage(param.text, [], _makeSpan(start)); + } + break; + } + + return processDimension(t, value, _makeSpan(start)); + } + + /** Process all dimension units. */ + processDimension(Token t, var value, Span span) { + var term; + var unitType = this._peek(); + + switch (unitType) { + case TokenKind.UNIT_EM: + term = new EmTerm(value, t.text, span); + _next(); // Skip the unit + break; + case TokenKind.UNIT_EX: + term = new ExTerm(value, t.text, span); + _next(); // Skip the unit + break; + case TokenKind.UNIT_LENGTH_PX: + case TokenKind.UNIT_LENGTH_CM: + case TokenKind.UNIT_LENGTH_MM: + case TokenKind.UNIT_LENGTH_IN: + case TokenKind.UNIT_LENGTH_PT: + case TokenKind.UNIT_LENGTH_PC: + term = new LengthTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_ANGLE_DEG: + case TokenKind.UNIT_ANGLE_RAD: + case TokenKind.UNIT_ANGLE_GRAD: + case TokenKind.UNIT_ANGLE_TURN: + term = new AngleTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_TIME_MS: + case TokenKind.UNIT_TIME_S: + term = new TimeTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_FREQ_HZ: + case TokenKind.UNIT_FREQ_KHZ: + term = new FreqTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.PERCENT: + term = new PercentageTerm(value, t.text, span); + _next(); // Skip the % + break; + case TokenKind.UNIT_FRACTION: + term = new FractionTerm(value, t.text, span); + _next(); // Skip the unit + break; + case TokenKind.UNIT_RESOLUTION_DPI: + case TokenKind.UNIT_RESOLUTION_DPCM: + case TokenKind.UNIT_RESOLUTION_DPPX: + term = new ResolutionTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_CH: + term = new ChTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_REM: + term = new RemTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_VIEWPORT_VW: + case TokenKind.UNIT_VIEWPORT_VH: + case TokenKind.UNIT_VIEWPORT_VMIN: + case TokenKind.UNIT_VIEWPORT_VMAX: + term = new ViewportTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + default: + if (value != null && t != null) { + term = (value is Identifier) + ? new LiteralTerm(value, value.name, span) + : new NumberTerm(value, t.text, span); + } + break; + } + + return term; + } + + processQuotedString([bool urlString = false]) { + int start = _peekToken.start; + + // URI term sucks up everything inside of quotes(' or ") or between parens + int stopToken = urlString ? TokenKind.RPAREN : -1; + switch (_peek()) { + case TokenKind.SINGLE_QUOTE: + stopToken = TokenKind.SINGLE_QUOTE; + start = _peekToken.start + 1; // Skip the quote might have whitespace. + _next(); // Skip the SINGLE_QUOTE. + break; + case TokenKind.DOUBLE_QUOTE: + stopToken = TokenKind.DOUBLE_QUOTE; + start = _peekToken.start + 1; // Skip the quote might have whitespace. + _next(); // Skip the DOUBLE_QUOTE. + break; + default: + if (urlString) { + if (_peek() == TokenKind.LPAREN) { + _next(); // Skip the LPAREN. + start = _peekToken.start; + } + stopToken = TokenKind.RPAREN; + } else { + _error('unexpected string', _makeSpan(start)); + } + break; + } + + // Gobble up everything until we hit our stop token. + int runningStart = _peekToken.start; + while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) { + var tok = _next(); + } + + // All characters between quotes is the string. + int end = _peekToken.end; + var stringValue = (_peekToken.span as FileSpan).file.getText(start, + end - 1); + + if (stopToken != TokenKind.RPAREN) { + _next(); // Skip the SINGLE_QUOTE or DOUBLE_QUOTE; + } + + return stringValue; + } + + // TODO(terry): Should probably understand IE's non-standard filter syntax to + // fully support calc, var(), etc. + /** + * IE's filter property breaks CSS value parsing. IE's format can be: + * + * filter: progid:DXImageTransform.MS.gradient(Type=0, Color='#9d8b83'); + * + * We'll just parse everything after the 'progid:' look for the left paren + * then parse to the right paren ignoring everything in between. + */ + processIEFilter(int startAfterProgidColon) { + int parens = 0; + + while (_peek() != TokenKind.END_OF_FILE) { + switch (_peek()) { + case TokenKind.LPAREN: + _eat(TokenKind.LPAREN); + parens++; + break; + case TokenKind.RPAREN: + _eat(TokenKind.RPAREN); + if (--parens == 0) { + var tok = tokenizer.makeIEFilter(startAfterProgidColon, + _peekToken.start); + return new LiteralTerm(tok.text, tok.text, tok.span); + } + break; + default: + _eat(_peek()); + } + } + } + + // Function grammar: + // + // function: IDENT '(' expr ')' + // + processFunction(Identifier func) { + int start = _peekToken.start; + + String name = func.name; + + switch (name) { + case 'url': + // URI term sucks up everything inside of quotes(' or ") or between parens + String urlParam = processQuotedString(true); + + // TODO(terry): Better error messge and checking for mismatched quotes. + if (_peek() == TokenKind.END_OF_FILE) { + _error("problem parsing URI", _peekToken.span); + } + + if (_peek() == TokenKind.RPAREN) { + _next(); + } + + return new UriTerm(urlParam, _makeSpan(start)); + case 'calc': + // TODO(terry): Implement expression handling... + break; + case 'var': + // TODO(terry): Consider handling var in IE specific filter/progid. This + // will require parsing entire IE specific syntax e.g., + // param = value or progid:com_id, etc. for example: + // + // var-blur: Blur(Add = 0, Direction = 225, Strength = 10); + // var-gradient: progid:DXImageTransform.Microsoft.gradient" + // (GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670'); + var expr = processExpr(); + if (!_maybeEat(TokenKind.RPAREN)) { + _error("problem parsing var expected ), ", _peekToken.span); + } + if (isChecked && + expr.expressions.where((e) => e is OperatorComma).length > 1) { + _error("too many parameters to var()", _peekToken.span); + } + + var paramName = expr.expressions[0].text; + + // [0] - var name, [1] - OperatorComma, [2] - default value. + var defaultValues = expr.expressions.length >= 3 + ? expr.expressions.sublist(2) : []; + return new VarUsage(paramName, defaultValues, _makeSpan(start)); + default: + var expr = processExpr(); + if (!_maybeEat(TokenKind.RPAREN)) { + _error("problem parsing function expected ), ", _peekToken.span); + } + + return new FunctionTerm(name, name, expr, _makeSpan(start)); + } + + return null; + } + + identifier() { + var tok = _next(); + + if (!TokenKind.isIdentifier(tok.kind) && + !TokenKind.isKindIdentifier(tok.kind)) { + if (isChecked) { + _warning('expected identifier, but found $tok', tok.span); + } + return new Identifier("", _makeSpan(tok.start)); + } + + return new Identifier(tok.text, _makeSpan(tok.start)); + } + + // TODO(terry): Move this to base <= 36 and into shared code. + static int _hexDigit(int c) { + if(c >= 48/*0*/ && c <= 57/*9*/) { + return c - 48; + } else if (c >= 97/*a*/ && c <= 102/*f*/) { + return c - 87; + } else if (c >= 65/*A*/ && c <= 70/*F*/) { + return c - 55; + } else { + return -1; + } + } + + HexColorTerm _parseHex(String hexText, Span span) { + int hexValue = 0; + + for (int i = 0; i < hexText.length; i++) { + var digit = _hexDigit(hexText.codeUnitAt(i)); + if (digit < 0) { + _warning('Bad hex number', span); + return new HexColorTerm(new BAD_HEX_VALUE(), hexText, span); + } + hexValue = (hexValue << 4) + digit; + } + + // Make 3 character hex value #RRGGBB => #RGB iff: + // high/low nibble of RR is the same, high/low nibble of GG is the same and + // high/low nibble of BB is the same. + if (hexText.length == 6 && + hexText[0] == hexText[1] && + hexText[2] == hexText[3] && + hexText[4] == hexText[5]) { + hexText = '${hexText[0]}${hexText[2]}${hexText[4]}'; + } else if (hexText.length == 4 && + hexText[0] == hexText[1] && + hexText[2] == hexText[3]) { + hexText = '${hexText[0]}${hexText[2]}'; + } else if (hexText.length == 2 && hexText[0] == hexText[1]) { + hexText = '${hexText[0]}'; + } + return new HexColorTerm(hexValue, hexText, span); + } +} + +class ExpressionsProcessor { + final Expressions _exprs; + int _index = 0; + + ExpressionsProcessor(this._exprs); + + // TODO(terry): Only handles ##px unit. + processFontSize() { + /* font-size[/line-height] + * + * Possible size values: + * xx-small + * small + * medium [default] + * large + * x-large + * xx-large + * smaller + * larger + * ##length in px, pt, etc. + * ##%, percent of parent elem's font-size + * inherit + */ + LengthTerm size; + LineHeight lineHt; + bool nextIsLineHeight = false; + for (; _index < _exprs.expressions.length; _index++) { + var expr = _exprs.expressions[_index]; + if (size == null && expr is LengthTerm) { + // font-size part. + size = expr; + } else if (size != null) { + if (expr is OperatorSlash) { + // LineHeight could follow? + nextIsLineHeight = true; + } else if (nextIsLineHeight && expr is LengthTerm) { + assert(expr.unit == TokenKind.UNIT_LENGTH_PX); + lineHt = new LineHeight(expr.value, inPixels: true); + nextIsLineHeight = false; + _index++; + break; + } else { + break; + } + } else { + break; + } + } + + return new FontExpression(_exprs.span, size: size, lineHeight: lineHt); + } + + processFontFamily() { + final List family = []; + + /* Possible family values: + * font-family: arial, Times new roman ,Lucida Sans Unicode,Courier; + * font-family: "Times New Roman", arial, Lucida Sans Unicode, Courier; + */ + bool moreFamilies = false; + + for (; _index < _exprs.expressions.length; _index++) { + Expression expr = _exprs.expressions[_index]; + if (expr is LiteralTerm) { + if (family.length == 0 || moreFamilies) { + // It's font-family now. + family.add(expr.toString()); + moreFamilies = false; + } else if (isChecked) { + messages.warning('Only font-family can be a list', _exprs.span); + } + } else if (expr is OperatorComma && family.length > 0) { + moreFamilies = true; + } else { + break; + } + } + + return new FontExpression(_exprs.span, family: family); + } + + processFont() { + var family; + + // Process all parts of the font expression. + FontExpression fontSize; + FontExpression fontFamily; + for (; _index < _exprs.expressions.length; _index++) { + var expr = _exprs.expressions[_index]; + // Order is font-size font-family + if (fontSize == null) { + fontSize = processFontSize(); + } + if (fontFamily == null) { + fontFamily = processFontFamily(); + } + //TODO(terry): Handle font-weight, font-style, and font-variant. See + // https://github.com/dart-lang/csslib/issues/3 + // https://github.com/dart-lang/csslib/issues/4 + // https://github.com/dart-lang/csslib/issues/5 + } + + return new FontExpression(_exprs.span, + size: fontSize.font.size, + lineHeight: fontSize.font.lineHeight, + family: fontFamily.font.family); + } +} + +/** + * Escapes [text] for use in a CSS string. + * [single] specifies single quote `'` vs double quote `"`. + */ +String _escapeString(String text, {bool single: false}) { + StringBuffer result = null; + + for (int i = 0; i < text.length; i++) { + int code = text.codeUnitAt(i); + var replace = null; + switch (code) { + case 34/*'"'*/: if (!single) replace = r'\"'; break; + case 39/*"'"*/: if (single) replace = r"\'"; break; + } + + if (replace != null && result == null) { + result = new StringBuffer(text.substring(0, i)); + } + + if (result != null) result.write(replace != null ? replace : text[i]); + } + + return result == null ? text : result.toString(); +} diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart new file mode 100644 index 000000000..9e366a5fd --- /dev/null +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -0,0 +1,513 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of csslib.parser; + + +// TODO(terry): Detect invalid directive usage. All @imports must occur before +// all rules other than @charset directive. Any @import directive +// after any non @charset or @import directive are ignored. e.g., +// @import "a.css"; +// div { color: red; } +// @import "b.css"; +// becomes: +// @import "a.css"; +// div { color: red; } +// + +/** + * Analysis phase will validate/fixup any new CSS feature or any SASS style + * feature. + */ +class Analyzer { + final List _styleSheets; + final Messages _messages; + VarDefinitions varDefs; + + Analyzer(this._styleSheets, this._messages); + + void run() { + varDefs = new VarDefinitions(_styleSheets); + + // Any cycles? + var cycles = findAllCycles(); + for (var cycle in cycles) { + _messages.warning("var cycle detected var-${cycle.definedName}", + cycle.span); + // TODO(terry): What if no var definition for a var usage an error? + // TODO(terry): Ensure a var definition imported from a different style + // sheet works. + } + + // Remove any var definition from the stylesheet that has a cycle. + _styleSheets.forEach((styleSheet) => + new RemoveVarDefinitions(cycles).visitStyleSheet(styleSheet)); + + // Expand any nested selectors using selector desendant combinator to + // signal CSS inheritance notation. + _styleSheets.forEach((styleSheet) => new ExpandNestedSelectors() + ..visitStyleSheet(styleSheet) + ..flatten(styleSheet)); + } + + List findAllCycles() { + var cycles = []; + + varDefs.map.values.forEach((value) { + if (hasCycle(value.property)) cycles.add(value); + }); + + // Update our local list of known varDefs remove any varDefs with a cycle. + // So the same varDef cycle isn't reported for each style sheet processed. + for (var cycle in cycles) { + varDefs.map.remove(cycle.property); + } + + return cycles; + } + + Iterable variablesOf(Expressions exprs) => + exprs.expressions.where((e) => e is VarUsage); + + bool hasCycle(String varName, {Set visiting, Set visited}) { + if (visiting == null) visiting = new Set(); + if (visited == null) visited = new Set(); + if (visiting.contains(varName)) return true; + if (visited.contains(varName)) return false; + visiting.add(varName); + visited.add(varName); + bool cycleDetected = false; + if (varDefs.map[varName] != null) { + for (var usage in variablesOf(varDefs.map[varName].expression)) { + if (hasCycle(usage.name, visiting: visiting, visited: visited)) { + cycleDetected = true; + break; + } + } + } + visiting.remove(varName); + return cycleDetected; + } + + // TODO(terry): Need to start supporting @host, custom pseudo elements, + // composition, intrinsics, etc. +} + + +/** Find all var definitions from a list of stylesheets. */ +class VarDefinitions extends Visitor { + /** Map of variable name key to it's definition. */ + final Map map = new Map(); + + VarDefinitions(List styleSheets) { + for (var styleSheet in styleSheets) { + visitTree(styleSheet); + } + } + + void visitVarDefinition(VarDefinition node) { + // Replace with latest variable definition. + map[node.definedName] = node; + super.visitVarDefinition(node); + } + + void visitVarDefinitionDirective(VarDefinitionDirective node) { + visitVarDefinition(node.def); + } +} + +/** + * Remove the var definition from the stylesheet where it is defined; if it is + * a definition from the list to delete. + */ +class RemoveVarDefinitions extends Visitor { + final List _varDefsToRemove; + + RemoveVarDefinitions(this._varDefsToRemove); + + void visitStyleSheet(StyleSheet ss) { + var idx = ss.topLevels.length; + while(--idx >= 0) { + var topLevel = ss.topLevels[idx]; + if (topLevel is VarDefinitionDirective && + _varDefsToRemove.contains(topLevel.def)) { + ss.topLevels.removeAt(idx); + } + } + + super.visitStyleSheet(ss); + } + + void visitDeclarationGroup(DeclarationGroup node) { + var idx = node.declarations.length; + while (--idx >= 0) { + var decl = node.declarations[idx]; + if (decl is VarDefinition && _varDefsToRemove.contains(decl)) { + node.declarations.removeAt(idx); + } + } + + super.visitDeclarationGroup(node); + } +} + +/** + * Traverse all rulesets looking for nested ones. If a ruleset is in a + * declaration group (implies nested selector) then generate new ruleset(s) at + * level 0 of CSS using selector inheritance syntax (flattens the nesting). + * + * How the AST works for a rule [RuleSet] and nested rules. First of all a + * CSS rule [RuleSet] consist of a selector and a declaration e.g., + * + * selector { + * declaration + * } + * + * AST structure of a [RuleSet] is: + * + * RuleSet + * SelectorGroup + * List + * List + * Combinator // +, >, ~, DESCENDENT, or NONE + * SimpleSelector // class, id, element, namespace, attribute + * DeclarationGroup + * List // Declaration or RuleSet + * + * For the simple rule: + * + * div + span { color: red; } + * + * the AST [RuleSet] is: + * + * RuleSet + * SelectorGroup + * List + * [0] + * List + * [0] Combinator = COMBINATOR_NONE + * ElementSelector (name = div) + * [1] Combinator = COMBINATOR_PLUS + * ElementSelector (name = span) + * DeclarationGroup + * List // Declarations or RuleSets + * [0] + * Declaration (property = color, expression = red) + * + * Usually a SelectorGroup contains 1 Selector. Consider the selectors: + * + * div { color: red; } + * a { color: red; } + * + * are equivalent to + * + * div, a { color : red; } + * + * In the above the RuleSet would have a SelectorGroup with 2 selectors e.g., + * + * RuleSet + * SelectorGroup + * List + * [0] + * List + * [0] Combinator = COMBINATOR_NONE + * ElementSelector (name = div) + * [1] + * List + * [0] Combinator = COMBINATOR_NONE + * ElementSelector (name = a) + * DeclarationGroup + * List // Declarations or RuleSets + * [0] + * Declaration (property = color, expression = red) + * + * For a nested rule e.g., + * + * div { + * color : blue; + * a { color : red; } + * } + * + * Would map to the follow CSS rules: + * + * div { color: blue; } + * div a { color: red; } + * + * The AST for the former nested rule is: + * + * RuleSet + * SelectorGroup + * List + * [0] + * List + * [0] Combinator = COMBINATOR_NONE + * ElementSelector (name = div) + * DeclarationGroup + * List // Declarations or RuleSets + * [0] + * Declaration (property = color, expression = blue) + * [1] + * RuleSet + * SelectorGroup + * List + * [0] + * List + * [0] Combinator = COMBINATOR_NONE + * ElementSelector (name = a) + * DeclarationGroup + * List // Declarations or RuleSets + * [0] + * Declaration (property = color, expression = red) + * + * Nested rules is a terse mechanism to describe CSS inheritance. The analyzer + * will flatten and expand the nested rules to it's flatten strucure. Using the + * all parent [RuleSets] (selector expressions) and applying each nested + * [RuleSet] to the list of [Selectors] in a [SelectorGroup]. + * + * Then result is a style sheet where all nested rules have been flatten and + * expanded. + */ +class ExpandNestedSelectors extends Visitor { + /** Parent [RuleSet] if a nested rule otherwise [null]. */ + RuleSet _parentRuleSet; + + /** Top-most rule if nested rules. */ + SelectorGroup _topLevelSelectorGroup; + + /** SelectorGroup at each nesting level. */ + SelectorGroup _nestedSelectorGroup; + + /** Declaration (sans the nested selectors). */ + DeclarationGroup _flatDeclarationGroup; + + /** Each nested selector get's a flatten RuleSet. */ + List _expandedRuleSets = []; + + /** Maping of a nested rule set to the fully expanded list of RuleSet(s). */ + final Map> _expansions = new Map(); + + void visitRuleSet(RuleSet node) { + final oldParent = _parentRuleSet; + + var oldNestedSelectorGroups = _nestedSelectorGroup; + + if (_nestedSelectorGroup == null) { + // Create top-level selector (may have nested rules). + final newSelectors = node.selectorGroup.selectors.toList(); + _topLevelSelectorGroup = new SelectorGroup(newSelectors, node.span); + _nestedSelectorGroup = _topLevelSelectorGroup; + } else { + // Generate new selector groups from the nested rules. + _nestedSelectorGroup = _mergeToFlatten(node); + } + + _parentRuleSet = node; + + super.visitRuleSet(node); + + _parentRuleSet = oldParent; + + // Remove nested rules; they're all flatten and in the _expandedRuleSets. + node.declarationGroup.declarations.removeWhere((declaration) => + declaration is RuleSet); + + _nestedSelectorGroup = oldNestedSelectorGroups; + + // If any expandedRuleSets and we're back at the top-level rule set then + // there were nested rule set(s). + if (_parentRuleSet == null) { + if (!_expandedRuleSets.isEmpty) { + // Remember ruleset to replace with these flattened rulesets. + _expansions[node] = _expandedRuleSets; + _expandedRuleSets = []; + } + assert(_flatDeclarationGroup == null); + assert(_nestedSelectorGroup == null); + } + } + + /** + * Build up the list of all inherited sequences from the parent selector + * [node] is the current nested selector and it's parent is the last entry in + * the [_nestedSelectorGroup]. + */ + SelectorGroup _mergeToFlatten(RuleSet node) { + // Create a new SelectorGroup for this nesting level. + var nestedSelectors = _nestedSelectorGroup.selectors; + var selectors = node.selectorGroup.selectors; + + // Create a merged set of previous parent selectors and current selectors. + var newSelectors = []; + for (Selector selector in selectors) { + for (Selector nestedSelector in nestedSelectors) { + var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences, + selector.simpleSelectorSequences); + newSelectors.add(new Selector(seq, node.span)); + } + } + + return new SelectorGroup(newSelectors, node.span); + } + + /** + * Merge the nested selector sequences [current] to the [parent] sequences or + * substitue any & with the parent selector. + */ + List _mergeNestedSelector( + List parent, + List current) { + + // If any & operator then the parent selector will be substituted otherwise + // the parent selector is pre-pended to the current selector. + var hasThis = current.any((s) => s.simpleSelector.isThis); + + var newSequence = []; + + if (!hasThis) { + // If no & in the sector group then prefix with the parent selector. + newSequence.addAll(parent); + newSequence.addAll(_convertToDescendentSequence(current)); + } else { + for (var sequence in current) { + if (sequence.simpleSelector.isThis) { + // Substitue the & with the parent selector and only use a combinator + // descendant if & is prefix by a sequence with an empty name e.g., + // "... + &", "&", "... ~ &", etc. + var hasPrefix = !newSequence.isEmpty && + !newSequence.last.simpleSelector.name.isEmpty; + newSequence.addAll( + hasPrefix ? _convertToDescendentSequence(parent) : parent); + } else { + newSequence.add(sequence); + } + } + } + + return newSequence; + } + + /** + * Return selector sequences with first sequence combinator being a + * descendant. Used for nested selectors when the parent selector needs to + * be prefixed to a nested selector or to substitute the this (&) with the + * parent selector. + */ + List _convertToDescendentSequence( + List sequences) { + if (sequences.isEmpty) return sequences; + + var newSequences = []; + var first = sequences.first; + newSequences.add(new SimpleSelectorSequence(first.simpleSelector, + first.span, TokenKind.COMBINATOR_DESCENDANT)); + newSequences.addAll(sequences.skip(1)); + + return newSequences; + } + + void visitDeclarationGroup(DeclarationGroup node) { + var span = node.span; + + var currentGroup = new DeclarationGroup([], span); + + var oldGroup = _flatDeclarationGroup; + _flatDeclarationGroup = currentGroup; + + var expandedLength = _expandedRuleSets.length; + + super.visitDeclarationGroup(node); + + // We're done with the group. + _flatDeclarationGroup = oldGroup; + + // No nested rule to process it's a top-level rule. + if (_nestedSelectorGroup == _topLevelSelectorGroup) return; + + // If flatten selector's declaration is empty skip this selector, no need + // to emit an empty nested selector. + if (currentGroup.declarations.isEmpty) return; + + var selectorGroup = _nestedSelectorGroup; + + // Build new rule set from the nested selectors and declarations. + var newRuleSet = new RuleSet(selectorGroup, currentGroup, span); + + // Place in order so outer-most rule is first. + if (expandedLength == _expandedRuleSets.length) { + _expandedRuleSets.add(newRuleSet); + } else { + _expandedRuleSets.insert(expandedLength, newRuleSet); + } + } + + // Record all declarations in a nested selector (Declaration, VarDefinition + // and MarginGroup) but not the nested rule in the Declaration. + + void visitDeclaration(Declaration node) { + if (_parentRuleSet != null) { + _flatDeclarationGroup.declarations.add(node); + } + super.visitDeclaration(node); + } + + void visitVarDefinition(VarDefinition node) { + if (_parentRuleSet != null) { + _flatDeclarationGroup.declarations.add(node); + } + super.visitVarDefinition(node); + } + + void visitMarginGroup(MarginGroup node) { + if (_parentRuleSet != null) { + _flatDeclarationGroup.declarations.add(node); + } + super.visitMarginGroup(node); + } + + /** + * Replace the rule set that contains nested rules with the flatten rule sets. + */ + void flatten(StyleSheet styleSheet) { + // TODO(terry): Iterate over topLevels instead of _expansions it's already + // a map (this maybe quadratic). + _expansions.forEach((RuleSet ruleSet, List newRules) { + var index = styleSheet.topLevels.indexOf(ruleSet); + if (index == -1) { + // Check any @media directives for nested rules and replace them. + var found = _MediaRulesReplacer.replace(styleSheet, ruleSet, newRules); + assert(found); + } else { + styleSheet.topLevels.insertAll(index + 1, newRules); + } + }); + _expansions.clear(); + } +} + +class _MediaRulesReplacer extends Visitor { + RuleSet _ruleSet; + List _newRules; + bool _foundAndReplaced = false; + + /** + * Look for the [ruleSet] inside of an @media directive; if found then replace + * with the [newRules]. If [ruleSet] is found and replaced return true. + */ + static bool replace(StyleSheet styleSheet, RuleSet ruleSet, + ListnewRules) { + var visitor = new _MediaRulesReplacer(ruleSet, newRules); + visitor.visitStyleSheet(styleSheet); + return visitor._foundAndReplaced; + } + + _MediaRulesReplacer(this._ruleSet, this._newRules); + + visitMediaDirective(MediaDirective node) { + var index = node.rulesets.indexOf(_ruleSet); + if (index != -1) { + node.rulesets.insertAll(index + 1, _newRules); + _foundAndReplaced = true; + } + } +} diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart new file mode 100644 index 000000000..b8000b70a --- /dev/null +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -0,0 +1,476 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of csslib.visitor; + +/** + * Visitor that produces a formatted string representation of the CSS tree. + */ +class CssPrinter extends Visitor { + StringBuffer _buff = new StringBuffer(); + bool prettyPrint = true; + + /** + * Walk the [tree] Stylesheet. [pretty] if true emits line breaks, extra + * spaces, friendly property values, etc., if false emits compacted output. + */ + void visitTree(StyleSheet tree, {bool pretty: false}) { + prettyPrint = pretty; + _buff = new StringBuffer(); + visitStyleSheet(tree); + } + + /** Appends [str] to the output buffer. */ + void emit(String str) { + _buff.write(str); + } + + /** Returns the output buffer. */ + String toString() => _buff.toString().trim(); + + String get _newLine => prettyPrint ? '\n' : ' '; + String get _sp => prettyPrint ? ' ' : ''; + + // TODO(terry): When adding obfuscation we'll need isOptimized (compact w/ + // obufuscation) and have isTesting (compact no obfuscation) and + // isCompact would be !prettyPrint. We'll need another boolean + // flag for obfuscation. + bool get _isTesting => !prettyPrint; + + void visitCssComment(CssComment node) { + emit('/* ${node.comment} */'); + } + + void visitCommentDefinition(CommentDefinition node) { + emit(''); + } + + void visitMediaExpression(MediaExpression node) { + emit(node.andOperator ? ' AND ' : ' '); + emit('(${node.mediaFeature}:'); + visitExpressions(node.exprs); + emit(')'); + } + + void visitMediaQuery(MediaQuery query) { + var unary = query.hasUnary ? ' ${query.unary}' : ''; + var mediaType = query.hasMediaType ? ' ${query.mediaType}' : ''; + emit('$unary$mediaType'); + for (var expression in query.expressions) { + visitMediaExpression(expression); + } + } + + void emitMediaQueries(queries) { + var queriesLen = queries.length; + for (var i = 0; i < queriesLen; i++) { + var query = queries[i]; + if (query.hasMediaType && i > 0) emit(','); + visitMediaQuery(query); + } + } + + void visitMediaDirective(MediaDirective node) { + emit(' @media'); + emitMediaQueries(node.mediaQueries); + emit(' {'); + for (var ruleset in node.rulesets) { + ruleset.visit(this); + } + emit('$_newLine\}'); + } + + void visitHostDirective(HostDirective node) { + emit('\n@host {'); + for (var ruleset in node.rulesets) { + ruleset.visit(this); + } + emit('$_newLine\}'); + } + + /** + * @page : pseudoPage { + * decls + * } + */ + void visitPageDirective(PageDirective node) { + emit('$_newLine@page'); + if (node.hasIdent || node.hasPseudoPage) { + if (node.hasIdent) emit(' '); + emit(node._ident); + emit(node.hasPseudoPage ? ':${node._pseudoPage}' : ''); + } + emit(' '); + + var declsMargin = node._declsMargin; + int declsMarginLength = declsMargin.length; + for (var i = 0; i < declsMarginLength; i++) { + if (i > 0) emit(_newLine); + emit('{$_newLine'); + declsMargin[i].visit(this); + emit('}'); + } + } + + /** @charset "charset encoding" */ + void visitCharsetDirective(CharsetDirective node) { + emit('$_newLine@charset "${node.charEncoding}";'); + } + + void visitImportDirective(ImportDirective node) { + bool isStartingQuote(String ch) => ('\'"'.indexOf(ch[0]) >= 0); + + if (_isTesting) { + // Emit assuming url() was parsed; most suite tests use url function. + emit(' @import url(${node.import})'); + } else if (isStartingQuote(node.import)) { + emit(' @import ${node.import}'); + } else { + // url(...) isn't needed only a URI can follow an @import directive; emit + // url as a string. + emit(' @import "${node.import}"'); + } + emitMediaQueries(node.mediaQueries); + emit(';'); + } + + void visitKeyFrameDirective(KeyFrameDirective node) { + emit('$_newLine${node.keyFrameName} '); + node._name.visit(this); + emit('$_sp{$_newLine'); + for (final block in node._blocks) { + block.visit(this); + } + emit('}'); + } + + void visitFontFaceDirective(FontFaceDirective node) { + emit('$_newLine@font-face '); + emit('$_sp{$_newLine'); + node._declarations.visit(this); + emit('}'); + } + + void visitKeyFrameBlock(KeyFrameBlock node) { + emit('$_sp$_sp'); + node._blockSelectors.visit(this); + emit('$_sp{$_newLine'); + node._declarations.visit(this); + emit('$_sp$_sp}$_newLine'); + } + + void visitStyletDirective(StyletDirective node) { + emit('/* @stylet export as ${node._dartClassName} */\n'); + } + + void visitNamespaceDirective(NamespaceDirective node) { + bool isStartingQuote(String ch) => ('\'"'.indexOf(ch) >= 0); + + if (isStartingQuote(node._uri)) { + emit(' @namespace ${node.prefix}"${node._uri}"'); + } else { + if (_isTesting) { + // Emit exactly was we parsed. + emit(' @namespace ${node.prefix}url(${node._uri})'); + } else { + // url(...) isn't needed only a URI can follow a: + // @namespace prefix directive. + emit(' @namespace ${node.prefix}${node._uri}'); + } + } + emit(';'); + } + + void visitVarDefinitionDirective(VarDefinitionDirective node) { + visitVarDefinition(node.def); + emit(';$_newLine'); + } + + void visitRuleSet(RuleSet node) { + emit("$_newLine"); + node._selectorGroup.visit(this); + emit(" {$_newLine"); + node._declarationGroup.visit(this); + emit("}"); + } + + void visitDeclarationGroup(DeclarationGroup node) { + var declarations = node._declarations; + var declarationsLength = declarations.length; + for (var i = 0; i < declarationsLength; i++) { + if (i > 0) emit(_newLine); + emit("$_sp$_sp"); + declarations[i].visit(this); + emit(";"); + } + if (declarationsLength > 0) emit(_newLine); + } + + void visitMarginGroup(MarginGroup node) { + var margin_sym_name = + TokenKind.idToValue(TokenKind.MARGIN_DIRECTIVES, node.margin_sym); + + emit("@$margin_sym_name {$_newLine"); + + visitDeclarationGroup(node); + + emit("}$_newLine"); + } + + void visitDeclaration(Declaration node) { + String importantAsString() => node.important ? '$_sp!important' : ''; + + emit("${node.property}: "); + node._expression.visit(this); + + emit("${importantAsString()}"); + } + + void visitVarDefinition(VarDefinition node) { + emit("var-${node.definedName}: "); + node._expression.visit(this); + } + + void visitSelectorGroup(SelectorGroup node) { + var selectors = node._selectors; + var selectorsLength = selectors.length; + for (var i = 0; i < selectorsLength; i++) { + if (i > 0) emit(',$_sp'); + selectors[i].visit(this); + } + } + + void visitSimpleSelectorSequence(SimpleSelectorSequence node) { + emit('${node._combinatorToString}'); + node._selector.visit(this); + } + + void visitSimpleSelector(SimpleSelector node) { + emit(node.name); + } + + void visitNamespaceSelector(NamespaceSelector node) { + emit("${node.namespace}|${node.nameAsSimpleSelector.name}"); + } + + void visitElementSelector(ElementSelector node) { + emit("${node.name}"); + } + + void visitAttributeSelector(AttributeSelector node) { + emit("[${node.name}${node.matchOperator()}${node.valueToString()}]"); + } + + void visitIdSelector(IdSelector node) { + emit("#${node.name}"); + } + + void visitClassSelector(ClassSelector node) { + emit(".${node.name}"); + } + + void visitPseudoClassSelector(PseudoClassSelector node) { + emit(":${node.name}"); + } + + void visitPseudoElementSelector(PseudoElementSelector node) { + emit("::${node.name}"); + } + + void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { + emit(":${node.name}("); + node.expression.visit(this); + emit(')'); + } + + void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) { + emit("::${node.name}("); + node.expression.visit(this); + emit(')'); + } + + void visitNegationSelector(NegationSelector node) { + emit(':not('); + node.negationArg.visit(this); + emit(')'); + } + + void visitSelectorExpression(SelectorExpression node) { + var expressions = node._expressions; + var expressionsLength = expressions.length; + for (var i = 0; i < expressionsLength; i++) { + // Add space seperator between terms without an operator. + var expression = expressions[i]; + expression.visit(this); + } + } + + void visitUnicodeRangeTerm(UnicodeRangeTerm node) { + if (node.hasSecond) { + emit("U+${node.first}-${node.second}"); + } else { + emit("U+${node.first}"); + } + } + + void visitLiteralTerm(LiteralTerm node) { + emit(node.text); + } + + void visitHexColorTerm(HexColorTerm node) { + var mappedName; + if (_isTesting && (node.value is! BAD_HEX_VALUE)) { + mappedName = TokenKind.hexToColorName(node.value); + } + if (mappedName == null) { + mappedName = '#${node.text}'; + } + + emit(mappedName); + } + + void visitNumberTerm(NumberTerm node) { + visitLiteralTerm(node); + } + + void visitUnitTerm(UnitTerm node) { + emit(node.toString()); + } + + void visitLengthTerm(LengthTerm node) { + emit(node.toString()); + } + + void visitPercentageTerm(PercentageTerm node) { + emit('${node.text}%'); + } + + void visitEmTerm(EmTerm node) { + emit('${node.text}em'); + } + + void visitExTerm(ExTerm node) { + emit('${node.text}ex'); + } + + void visitAngleTerm(AngleTerm node) { + emit(node.toString()); + } + + void visitTimeTerm(TimeTerm node) { + emit(node.toString()); + } + + void visitFreqTerm(FreqTerm node) { + emit(node.toString()); + } + + void visitFractionTerm(FractionTerm node) { + emit('${node.text}fr'); + } + + void visitUriTerm(UriTerm node) { + emit('url("${node.text}")'); + } + + void visitResolutionTerm(ResolutionTerm node) { + emit(node.toString()); + } + + void visitViewportTerm(ViewportTerm node) { + emit(node.toString()); + } + + void visitFunctionTerm(FunctionTerm node) { + // TODO(terry): Optimize rgb to a hexcolor. + emit('${node.text}('); + node._params.visit(this); + emit(')'); + } + + void visitGroupTerm(GroupTerm node) { + emit('('); + var terms = node._terms; + var termsLength = terms.length; + for (var i = 0; i < termsLength; i++) { + if (i > 0) emit('$_sp'); + terms[i].visit(this); + } + emit(')'); + } + + void visitItemTerm(ItemTerm node) { + emit('[${node.text}]'); + } + + void visitIE8Term(IE8Term node) { + visitLiteralTerm(node); + } + + void visitOperatorSlash(OperatorSlash node) { + emit('/'); + } + + void visitOperatorComma(OperatorComma node) { + emit(','); + } + + void visitOperatorPlus(OperatorPlus node) { + emit('+'); + } + + void visitOperatorMinus(OperatorMinus node) { + emit('-'); + } + + void visitVarUsage(VarUsage node) { + emit('var(${node.name}'); + if (!node.defaultValues.isEmpty) { + emit(','); + for (var defaultValue in node.defaultValues) { + emit(' '); + defaultValue.visit(this); + } + } + emit(')'); + } + + void visitExpressions(Expressions node) { + var expressions = node.expressions; + var expressionsLength = expressions.length; + for (var i = 0; i < expressionsLength; i++) { + // Add space seperator between terms without an operator. + // TODO(terry): Should have a BinaryExpression to solve this problem. + var expression = expressions[i]; + if (i > 0 && + !(expression is OperatorComma || expression is OperatorSlash)) { + emit(' '); + } + expression.visit(this); + } + } + + void visitBinaryExpression(BinaryExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } + + void visitUnaryExpression(UnaryExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } + + void visitIdentifier(Identifier node) { + emit(node.name); + } + + void visitWildcard(Wildcard node) { + emit('*'); + } + + void visitDartStyleExpression(DartStyleExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } +} diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart new file mode 100644 index 000000000..3c9f3fcc1 --- /dev/null +++ b/pkgs/csslib/lib/src/messages.dart @@ -0,0 +1,129 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library csslib.src.messages; + +import 'package:logging/logging.dart' show Level; +import 'package:source_maps/span.dart' show Span; + +import 'package:csslib/parser.dart'; + +import 'options.dart'; + +// TODO(terry): Remove the global messages, use some object that tracks +// compilation state. + +/** The global [Messages] for tracking info/warnings/messages. */ +Messages messages; + +// Color constants used for generating messages. +final String GREEN_COLOR = '\u001b[32m'; +final String RED_COLOR = '\u001b[31m'; +final String MAGENTA_COLOR = '\u001b[35m'; +final String NO_COLOR = '\u001b[0m'; + +/** Map between error levels and their display color. */ +final Map _ERROR_COLORS = (() { + var colorsMap = new Map(); + colorsMap[Level.SEVERE] = RED_COLOR; + colorsMap[Level.WARNING] = MAGENTA_COLOR; + colorsMap[Level.INFO] = GREEN_COLOR; + return colorsMap; +})(); + +/** Map between error levels and their friendly name. */ +final Map _ERROR_LABEL = (() { + var labels = new Map(); + labels[Level.SEVERE] = 'error'; + labels[Level.WARNING] = 'warning'; + labels[Level.INFO] = 'info'; + return labels; +})(); + +/** A single message from the compiler. */ +class Message { + final Level level; + final String message; + final Span span; + final bool useColors; + + Message(this.level, this.message, {Span span, bool useColors: false}) + : this.span = span, this.useColors = useColors; + + String toString() { + var output = new StringBuffer(); + bool colors = useColors && _ERROR_COLORS.containsKey(level); + var levelColor = _ERROR_COLORS[level]; + if (colors) output.write(levelColor); + output..write(_ERROR_LABEL[level])..write(' '); + if (colors) output.write(NO_COLOR); + + if (span == null) { + output.write(message); + } else { + output.write(span.getLocationMessage(message, useColors: colors, + color: levelColor)); + } + + return output.toString(); + } +} + +typedef void PrintHandler(Object obj); + +/** + * This class tracks and prints information, warnings, and errors emitted by the + * compiler. + */ +class Messages { + /** Called on every error. Set to blank function to supress printing. */ + final PrintHandler printHandler; + + final PreprocessorOptions options; + + final List messages = []; + + Messages({PreprocessorOptions options, this.printHandler: print}) + : options = options != null ? options : new PreprocessorOptions(); + + /** Report a compile-time CSS error. */ + void error(String message, Span span) { + var msg = new Message(Level.SEVERE, message, span: span, + useColors: options.useColors); + + messages.add(msg); + + printHandler(msg); + } + + /** Report a compile-time CSS warning. */ + void warning(String message, Span span) { + if (options.warningsAsErrors) { + error(message, span); + } else { + var msg = new Message(Level.WARNING, message, span: span, + useColors: options.useColors); + + messages.add(msg); + } + } + + /** Report and informational message about what the compiler is doing. */ + void info(String message, Span span) { + var msg = new Message(Level.INFO, message, span: span, + useColors: options.useColors); + + messages.add(msg); + + if (options.verbose) printHandler(msg); + } + + /** Merge [newMessages] to this message lsit. */ + void mergeMessages(Messages newMessages) { + messages.addAll(newMessages.messages); + newMessages.messages.where((message) => + message.level.value == Level.SEVERE || options.verbose) + .forEach((message) { printHandler(message); }); + } +} diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/options.dart new file mode 100644 index 000000000..a62ef71f0 --- /dev/null +++ b/pkgs/csslib/lib/src/options.dart @@ -0,0 +1,94 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library csslib.src.options; + +import 'package:args/args.dart'; + +class PreprocessorOptions { + /** Report warnings as errors. */ + final bool warningsAsErrors; + + /** Throw an exception on warnings (not used by command line tool). */ + final bool throwOnWarnings; + + /** Throw an exception on errors (not used by command line tool). */ + final bool throwOnErrors; + + /** True to show informational messages. The `--verbose` flag. */ + final bool verbose; + + /** True to show warning messages for bad CSS. The '--checked' flag. */ + final bool checked; + + // TODO(terry): Add mixin support and nested rules. + /** + * Subset of Less commands enabled; disable with '--no-less'. + * Less syntax supported: + * - @name at root level statically defines variables resolved at compilation + * time. Essentially a directive e.g., @var-name. + */ + final bool lessSupport; + + /** Whether to use colors to print messages on the terminal. */ + final bool useColors; + + /** File to process by the compiler. */ + String inputFile; + + // We could make this faster, if it ever matters. + factory PreprocessorOptions() => parse(['']); + + PreprocessorOptions.fromArgs(ArgResults args) + : warningsAsErrors = args['warnings_as_errors'], + throwOnWarnings = args['throw_on_warnings'], + throwOnErrors = args['throw_on_errors'], + verbose = args['verbose'], + checked = args['checked'], + lessSupport = args['less'], + useColors = args['colors'], + inputFile = args.rest.length > 0 ? args.rest[0] : null; + + // tool.dart [options...] + static PreprocessorOptions parse(List arguments) { + var parser = new ArgParser() + ..addFlag('verbose', abbr: 'v', defaultsTo: false, negatable: false, + help: 'Display detail info') + ..addFlag('checked', defaultsTo: false, negatable: false, + help: 'Validate CSS values invalid value display a warning message') + ..addFlag('less', defaultsTo: true, negatable: true, + help: 'Supports subset of Less syntax') + ..addFlag('suppress_warnings', defaultsTo: true, + help: 'Warnings not displayed') + ..addFlag('warnings_as_errors', defaultsTo: false, + help: 'Warning handled as errors') + ..addFlag('throw_on_errors', defaultsTo: false, + help: 'Throw on errors encountered') + ..addFlag('throw_on_warnings', defaultsTo: false, + help: 'Throw on warnings encountered') + ..addFlag('colors', defaultsTo: true, + help: 'Display errors/warnings in colored text') + ..addFlag('help', abbr: 'h', defaultsTo: false, negatable: false, + help: 'Displays this help message'); + + try { + var results = parser.parse(arguments); + if (results['help'] || results.rest.length == 0) { + showUsage(parser); + return null; + } + return new PreprocessorOptions.fromArgs(results); + } on FormatException catch (e) { + print(e.message); + showUsage(parser); + return null; + } + } + + static showUsage(parser) { + print('Usage: css [options...] input.css'); + print(parser.getUsage()); + } + +} diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart new file mode 100644 index 000000000..8dc4dcb41 --- /dev/null +++ b/pkgs/csslib/lib/src/property.dart @@ -0,0 +1,1250 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +/** Representations of CSS styles. */ + +part of csslib.parser; + +// TODO(terry): Prune down this file we do need some of the code in this file +// for darker, lighter, how to represent a Font, etc but alot of +// the complexity can be removed. +// See https://github.com/dart-lang/csslib/issues/7 + +/** + * Base for all style properties (e.g., Color, Font, Border, Margin, etc.) + */ +abstract class _StyleProperty { + /** + * Returns the expression part of a CSS declaration. Declaration is: + * + * property:expression; + * + * E.g., if property is color then expression could be rgba(255,255,0) the + * CSS declaration would be 'color:rgba(255,255,0);'. + * + * then _cssExpression would return 'rgba(255,255,0)'. See + * + */ + String get cssExpression; +} + + +/** + * Base interface for Color, HSL and RGB. + */ +abstract class ColorBase { + /** + * Canonical form for color #rrggbb with alpha blending (0.0 == full + * transparency and 1.0 == fully opaque). If _argb length is 6 it's an + * rrggbb otherwise it's aarrggbb. + */ + String toHexArgbString(); + + /** + * Return argb as a value (int). + */ + int get argbValue; +} + + +/** + * General purpse Color class. Represent a color as an ARGB value that can be + * converted to and from num, hex string, hsl, hsla, rgb, rgba and SVG pre- + * defined color constant. + */ +class Color implements _StyleProperty, ColorBase { + // If _argb length is 6 it's an rrggbb otherwise it's aarrggbb. + final String _argb; + + // TODO(terry): Look at reducing Rgba and Hsla classes as factories for + // converting from Color to an Rgba or Hsla for reading only. + // Usefulness of creating an Rgba or Hsla is limited. + + /** + * Create a color with an integer representing the rgb value of red, green, + * and blue. The value 0xffffff is the color white #ffffff (CSS style). + * The [rgb] value of 0xffd700 would map to #ffd700 or the constant + * Color.gold, where ff is red intensity, d7 is green intensity, and 00 is + * blue intensity. + */ + Color(int rgb, [num alpha]) : + this._argb = Color._rgbToArgbString(rgb, alpha); + + /** + * RGB takes three values. The [red], [green], and [blue] parameters are + * the intensity of those components where '0' is the least and '256' is the + * greatest. + * + * If [alpha] is provided, it is the level of translucency which ranges from + * '0' (completely transparent) to '1.0' (completely opaque). It will + * internally be mapped to an int between '0' and '255' like the other color + * components. + */ + Color.createRgba(int red, int green, int blue, [num alpha]) : + this._argb = Color.convertToHexString(Color._clamp(red, 0, 255), + Color._clamp(green, 0, 255), + Color._clamp(blue, 0, 255), + alpha != null ? Color._clamp(alpha, 0, 1) : alpha); + + /** + * Creates a new color from a CSS color string. For more information, see + * . + */ + Color.css(String color) : + this._argb = Color._convertCssToArgb(color); + + // TODO(jmesserly): I found the use of percents a bit suprising. + /** + * HSL takes three values. The [hueDegree] degree on the color wheel; '0' is + * the least and '100' is the greatest. The value '0' or '360' is red, '120' + * is green, '240' is blue. Numbers in between reflect different shades. + * The [saturationPercent] percentage; where'0' is the least and '100' is the + * greatest (100 represents full color). The [lightnessPercent] percentage; + * where'0' is the least and '100' is the greatest. The value 0 is dark or + * black, 100 is light or white and 50 is a medium lightness. + * + * If [alpha] is provided, it is the level of translucency which ranges from + * '0' (completely transparent foreground) to '1.0' (completely opaque + * foreground). + */ + Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent, + [num alpha]) : + this._argb = new Hsla(Color._clamp(hueDegree, 0, 360) / 360, + Color._clamp(saturationPercent, 0, 100) / 100, + Color._clamp(lightnessPercent, 0, 100) / 100, + alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString(); + + /** + * The hslaRaw takes three values. The [hue] degree on the color wheel; '0' + * is the least and '1' is the greatest. The value '0' or '1' is red, the + * ratio of 120/360 is green, and the ratio of 240/360 is blue. Numbers in + * between reflect different shades. The [saturation] is a percentage; '0' + * is the least and '1' is the greatest. The value of '1' is equivalent to + * 100% (full colour). The [lightness] is a percentage; '0' is the least and + * '1' is the greatest. The value of '0' is dark (black), the value of '1' + * is light (white), and the value of '.50' is a medium lightness. + * + * The fourth optional parameter is: + * [alpha] level of translucency range of values is 0..1, zero is a + * completely transparent foreground and 1 is a completely + * opaque foreground. + */ + Color.hslaRaw(num hue, num saturation, num lightness, [num alpha]) : + this._argb = new Hsla(Color._clamp(hue, 0, 1), + Color._clamp(saturation, 0, 1), + Color._clamp(lightness, 0, 1), + alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString(); + + /** + * Generate a real constant for pre-defined colors (no leading #). + */ + const Color.hex(this._argb); + + // TODO(jmesserly): this is needed by the example so leave it exposed for now. + String toString() => cssExpression; + + // TODO(terry): Regardless of how color is set (rgb, num, css or hsl) we'll + // always return a rgb or rgba loses fidelity when debugging in + // CSS if user uses hsl and would like to edit as hsl, etc. If + // this is an issue we should keep the original value and not re- + // create the CSS from the normalized value. + String get cssExpression { + if (_argb.length == 6) { + return "#$_argb"; // RGB only, no alpha blending. + } else { + num alpha = Color.hexToInt(_argb.substring(0, 2)); + String a = (alpha / 255).toStringAsPrecision(2); + int r = Color.hexToInt(_argb.substring(2, 4)); + int g = Color.hexToInt(_argb.substring(4, 6)); + int b = Color.hexToInt(_argb.substring(6, 8)); + return "rgba($r,$g,$b,$a)"; + } + } + + Rgba get rgba { + int nextIndex = 0; + num a; + if (_argb.length == 8) { + // Get alpha blending value 0..255 + int alpha = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); + // Convert to value from 0..1 + a = double.parse((alpha / 255).toStringAsPrecision(2)); + nextIndex += 2; + } + int r = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); + nextIndex += 2; + int g = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); + nextIndex += 2; + int b = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); + return new Rgba(r, g, b, a); + } + + Hsla get hsla => new Hsla.fromRgba(rgba); + + int get argbValue => Color.hexToInt(_argb); + + bool operator ==(Object other) => Color.equal(this, other); + + String toHexArgbString() => _argb; + + Color darker(num amount) { + Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, -amount); + return new Color.hex("${newRgba.toHexArgbString()}"); + } + + Color lighter(num amount) { + Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, amount); + return new Color.hex("${newRgba.toHexArgbString()}"); + } + + static bool equal(ColorBase curr, Object other) { + if (other is Color) { + Color o = other; + return o.toHexArgbString() == curr.toHexArgbString(); + } else if (other is Rgba) { + Rgba rgb = other; + return rgb.toHexArgbString() == curr.toHexArgbString(); + } else if (other is Hsla) { + Hsla hsla = other; + return hsla.toHexArgbString() == curr.toHexArgbString(); + } else { + return false; + } + } + + int get hashCode => _argb.hashCode; + + // Conversion routines: + + static String _rgbToArgbString(int rgba, num alpha) { + int a; + // If alpha is defined then adjust from 0..1 to 0..255 value, if not set + // then a is left as undefined and passed to convertToHexString. + if (alpha != null) { + a = (Color._clamp(alpha, 0, 1) * 255).round(); + } + + int r = (rgba & 0xff0000) >> 0x10; + int g = (rgba & 0xff00) >> 8; + int b = rgba & 0xff; + + return Color.convertToHexString(r, g, b, a); + } + + static const int _rgbCss = 1; + static const int _rgbaCss = 2; + static const int _hslCss = 3; + static const int _hslaCss = 4; + /** + * Parse CSS expressions of the from #rgb, rgb(r,g,b), rgba(r,g,b,a), + * hsl(h,s,l), hsla(h,s,l,a) and SVG colors (e.g., darkSlateblue, etc.) and + * convert to argb. + */ + static String _convertCssToArgb(String value) { + // TODO(terry): Better parser/regex for converting CSS properties. + String color = value.trim().replaceAll("\\s", ""); + if (color[0] == '#') { + String v = color.substring(1); + Color.hexToInt(v); // Valid hexadecimal, throws if not. + return v; + } else if (color.length > 0 && color[color.length - 1] == ')') { + int type; + if (color.indexOf("rgb(") == 0 || color.indexOf("RGB(") == 0) { + color = color.substring(4); + type = _rgbCss; + } else if (color.indexOf("rgba(") == 0 || color.indexOf("RGBA(") == 0) { + type = _rgbaCss; + color = color.substring(5); + } else if (color.indexOf("hsl(") == 0 || color.indexOf("HSL(") == 0) { + type = _hslCss; + color = color.substring(4); + } else if (color.indexOf("hsla(") == 0 || color.indexOf("HSLA(") == 0) { + type = _hslaCss; + color = color.substring(5); + } else { + throw new UnsupportedError('CSS property not implemented'); + } + + color = color.substring(0, color.length - 1); // Strip close paren. + + var args = []; + List params = color.split(","); + for (String param in params) { + args.add(double.parse(param)); + } + switch (type) { + case _rgbCss: + return Color.convertToHexString(args[0], args[1], args[2]); + case _rgbaCss: + return Color.convertToHexString(args[0], args[1], args[2], args[3]); + case _hslCss: + return new Hsla(args[0], args[1], args[2]).toHexArgbString(); + case _hslaCss: + return new Hsla(args[0], args[1], args[2], + args[3]).toHexArgbString(); + default: + // Type not defined UnsupportedOperationException should have thrown. + assert(true); + break; + } + } + } + + /** + * [hex] hexadecimal string to convert to scalar. + * returns hexadecimal number as an integer. + * throws BadNumberFormatException if [hex] isn't a valid hexadecimal number. + */ + // TODO(terry): Should be part of Dart standard library see bug + // + static int hexToInt(String hex) { + int val = 0; + + int len = hex.length; + for (int i = 0; i < len; i++) { + int hexDigit = hex.codeUnitAt(i); + if (hexDigit >= 48 && hexDigit <= 57) { + val += (hexDigit - 48) * (1 << (4 * (len - 1 - i))); + } else if (hexDigit >= 65 && hexDigit <= 70) { + // A..F + val += (hexDigit - 55) * (1 << (4 * (len - 1 - i))); + } else if (hexDigit >= 97 && hexDigit <= 102) { + // a..f + val += (hexDigit - 87) * (1 << (4 * (len - 1 - i))); + } else { + throw throw new FormatException("Bad hexadecimal value"); + } + } + + return val; + } + + static String convertToHexString(int r, int g, int b, [num a]) { + String rHex = Color._numAs2DigitHex(Color._clamp(r, 0, 255)); + String gHex = Color._numAs2DigitHex(Color._clamp(g, 0, 255)); + String bHex = Color._numAs2DigitHex(Color._clamp(b, 0, 255)); + String aHex = (a != null) ? + Color._numAs2DigitHex((Color._clamp(a, 0, 1) * 255).round()) : ""; + + // TODO(terry) 15.toRadixString(16) return 'F' on Dartium not f as in JS. + // bug: + return "$aHex$rHex$gHex$bHex".toLowerCase(); + } + + static String _numAs2DigitHex(num v) { + // TODO(terry): v.toInt().toRadixString instead of v.toRadixString + // Bug . + String hex = v.toInt().toRadixString(16); + if (hex.length == 1) { + hex = "0${hex}"; + } + return hex; + } + + static num _clamp(num value, num min, num max) => + math.max(math.min(max, value), min); + + /** + * Change the tint (make color lighter) or shade (make color darker) of all + * parts of [rgba] (r, g and b). The [amount] is percentage darker between + * -1 to 0 for darker and 0 to 1 for lighter; '0' is no change. The [amount] + * will darken or lighten the rgb values; it will not change the alpha value. + * If [amount] is outside of the value -1 to +1 then [amount] is changed to + * either the min or max direction -1 or 1. + * + * Darker will approach the color #000000 (black) and lighter will approach + * the color #ffffff (white). + */ + static Rgba _createNewTintShadeFromRgba(Rgba rgba, num amount) { + int r, g, b; + num tintShade = Color._clamp(amount, -1, 1); + if (amount < 0 && rgba.r == 255 && rgba.g == 255 && rgba.b == 255) { + // TODO(terry): See TODO in _changeTintShadeColor; eliminate this test + // by converting to HSL and adjust lightness although this + // is fastest lighter/darker algorithm. + // Darkening white special handling. + r = Color._clamp((255 + (255 * tintShade)).round().toInt(), 0, 255); + g = Color._clamp((255 + (255 * tintShade)).round().toInt(), 0, 255); + b = Color._clamp((255 + (255 * tintShade)).round().toInt(), 0, 255); + } else { + // All other colors then darkening white go here. + r = Color._changeTintShadeColor(rgba.r, tintShade).round().toInt(); + g = Color._changeTintShadeColor(rgba.g, tintShade).round().toInt(); + b = Color._changeTintShadeColor(rgba.b, tintShade).round().toInt(); + } + return new Rgba(r, g, b, rgba.a); + } + + // TODO(terry): This does an okay lighter/darker; better would be convert to + // HSL then change the lightness. + /** + * The parameter [v] is the color to change (r, g, or b) in the range '0' to + * '255'. The parameter [delta] is a number between '-1' and '1'. A value + * between '-1' and '0' is darker and a value between '0' and '1' is lighter + * ('0' imples no change). + */ + static num _changeTintShadeColor(num v, num delta) => + Color._clamp(((1 - delta) * v + (delta * 255)).round(), 0, 255); + + // Predefined CSS colors see + static final Color transparent = const Color.hex("00ffffff"); // Alpha 0.0 + static final Color aliceBlue = const Color.hex("0f08ff"); + static final Color antiqueWhite = const Color.hex("0faebd7"); + static final Color aqua = const Color.hex("00ffff"); + static final Color aquaMarine = const Color.hex("7fffd4"); + static final Color azure = const Color.hex("f0ffff"); + static final Color beige = const Color.hex("f5f5dc"); + static final Color bisque = const Color.hex("ffe4c4"); + static final Color black = const Color.hex("000000"); + static final Color blanchedAlmond = const Color.hex("ffebcd"); + static final Color blue = const Color.hex("0000ff"); + static final Color blueViolet = const Color.hex("8a2be2"); + static final Color brown = const Color.hex("a52a2a"); + static final Color burlyWood = const Color.hex("deb887"); + static final Color cadetBlue = const Color.hex("5f9ea0"); + static final Color chartreuse = const Color.hex("7fff00"); + static final Color chocolate = const Color.hex("d2691e"); + static final Color coral = const Color.hex("ff7f50"); + static final Color cornFlowerBlue = const Color.hex("6495ed"); + static final Color cornSilk = const Color.hex("fff8dc"); + static final Color crimson = const Color.hex("dc143c"); + static final Color cyan = const Color.hex("00ffff"); + static final Color darkBlue = const Color.hex("00008b"); + static final Color darkCyan = const Color.hex("008b8b"); + static final Color darkGoldenRod = const Color.hex("b8860b"); + static final Color darkGray = const Color.hex("a9a9a9"); + static final Color darkGreen = const Color.hex("006400"); + static final Color darkGrey = const Color.hex("a9a9a9"); + static final Color darkKhaki = const Color.hex("bdb76b"); + static final Color darkMagenta = const Color.hex("8b008b"); + static final Color darkOliveGreen = const Color.hex("556b2f"); + static final Color darkOrange = const Color.hex("ff8c00"); + static final Color darkOrchid = const Color.hex("9932cc"); + static final Color darkRed = const Color.hex("8b0000"); + static final Color darkSalmon = const Color.hex("e9967a"); + static final Color darkSeaGreen = const Color.hex("8fbc8f"); + static final Color darkSlateBlue = const Color.hex("483d8b"); + static final Color darkSlateGray = const Color.hex("2f4f4f"); + static final Color darkSlateGrey = const Color.hex("2f4f4f"); + static final Color darkTurquoise = const Color.hex("00ced1"); + static final Color darkViolet = const Color.hex("9400d3"); + static final Color deepPink = const Color.hex("ff1493"); + static final Color deepSkyBlue = const Color.hex("00bfff"); + static final Color dimGray = const Color.hex("696969"); + static final Color dimGrey = const Color.hex("696969"); + static final Color dodgerBlue = const Color.hex("1e90ff"); + static final Color fireBrick = const Color.hex("b22222"); + static final Color floralWhite = const Color.hex("fffaf0"); + static final Color forestGreen = const Color.hex("228b22"); + static final Color fuchsia = const Color.hex("ff00ff"); + static final Color gainsboro = const Color.hex("dcdcdc"); + static final Color ghostWhite = const Color.hex("f8f8ff"); + static final Color gold = const Color.hex("ffd700"); + static final Color goldenRod = const Color.hex("daa520"); + static final Color gray = const Color.hex("808080"); + static final Color green = const Color.hex("008000"); + static final Color greenYellow = const Color.hex("adff2f"); + static final Color grey = const Color.hex("808080"); + static final Color honeydew = const Color.hex("f0fff0"); + static final Color hotPink = const Color.hex("ff69b4"); + static final Color indianRed = const Color.hex("cd5c5c"); + static final Color indigo = const Color.hex("4b0082"); + static final Color ivory = const Color.hex("fffff0"); + static final Color khaki = const Color.hex("f0e68c"); + static final Color lavender = const Color.hex("e6e6fa"); + static final Color lavenderBlush = const Color.hex("fff0f5"); + static final Color lawnGreen = const Color.hex("7cfc00"); + static final Color lemonChiffon = const Color.hex("fffacd"); + static final Color lightBlue = const Color.hex("add8e6"); + static final Color lightCoral = const Color.hex("f08080"); + static final Color lightCyan = const Color.hex("e0ffff"); + static final Color lightGoldenRodYellow = const Color.hex("fafad2"); + static final Color lightGray = const Color.hex("d3d3d3"); + static final Color lightGreen = const Color.hex("90ee90"); + static final Color lightGrey = const Color.hex("d3d3d3"); + static final Color lightPink = const Color.hex("ffb6c1"); + static final Color lightSalmon = const Color.hex("ffa07a"); + static final Color lightSeaGreen = const Color.hex("20b2aa"); + static final Color lightSkyBlue = const Color.hex("87cefa"); + static final Color lightSlateGray = const Color.hex("778899"); + static final Color lightSlateGrey = const Color.hex("778899"); + static final Color lightSteelBlue = const Color.hex("b0c4de"); + static final Color lightYellow = const Color.hex("ffffe0"); + static final Color lime = const Color.hex("00ff00"); + static final Color limeGreen = const Color.hex("32cd32"); + static final Color linen = const Color.hex("faf0e6"); + static final Color magenta = const Color.hex("ff00ff"); + static final Color maroon = const Color.hex("800000"); + static final Color mediumAquaMarine = const Color.hex("66cdaa"); + static final Color mediumBlue = const Color.hex("0000cd"); + static final Color mediumOrchid = const Color.hex("ba55d3"); + static final Color mediumPurple = const Color.hex("9370db"); + static final Color mediumSeaGreen = const Color.hex("3cb371"); + static final Color mediumSlateBlue = const Color.hex("7b68ee"); + static final Color mediumSpringGreen = const Color.hex("00fa9a"); + static final Color mediumTurquoise = const Color.hex("48d1cc"); + static final Color mediumVioletRed = const Color.hex("c71585"); + static final Color midnightBlue = const Color.hex("191970"); + static final Color mintCream = const Color.hex("f5fffa"); + static final Color mistyRose = const Color.hex("ffe4e1"); + static final Color moccasin = const Color.hex("ffe4b5"); + static final Color navajoWhite = const Color.hex("ffdead"); + static final Color navy = const Color.hex("000080"); + static final Color oldLace = const Color.hex("fdf5e6"); + static final Color olive = const Color.hex("808000"); + static final Color oliveDrab = const Color.hex("6b8e23"); + static final Color orange = const Color.hex("ffa500"); + static final Color orangeRed = const Color.hex("ff4500"); + static final Color orchid = const Color.hex("da70d6"); + static final Color paleGoldenRod = const Color.hex("eee8aa"); + static final Color paleGreen = const Color.hex("98fb98"); + static final Color paleTurquoise = const Color.hex("afeeee"); + static final Color paleVioletRed = const Color.hex("db7093"); + static final Color papayaWhip = const Color.hex("ffefd5"); + static final Color peachPuff = const Color.hex("ffdab9"); + static final Color peru = const Color.hex("cd85ef"); + static final Color pink = const Color.hex("ffc0cb"); + static final Color plum = const Color.hex("dda0dd"); + static final Color powderBlue = const Color.hex("b0e0e6"); + static final Color purple = const Color.hex("800080"); + static final Color red = const Color.hex("ff0000"); + static final Color rosyBrown = const Color.hex("bc8f8f"); + static final Color royalBlue = const Color.hex("4169e1"); + static final Color saddleBrown = const Color.hex("8b4513"); + static final Color salmon = const Color.hex("fa8072"); + static final Color sandyBrown = const Color.hex("f4a460"); + static final Color seaGreen = const Color.hex("2e8b57"); + static final Color seashell = const Color.hex("fff5ee"); + static final Color sienna = const Color.hex("a0522d"); + static final Color silver = const Color.hex("c0c0c0"); + static final Color skyBlue = const Color.hex("87ceeb"); + static final Color slateBlue = const Color.hex("6a5acd"); + static final Color slateGray = const Color.hex("708090"); + static final Color slateGrey = const Color.hex("708090"); + static final Color snow = const Color.hex("fffafa"); + static final Color springGreen = const Color.hex("00ff7f"); + static final Color steelBlue = const Color.hex("4682b4"); + static final Color tan = const Color.hex("d2b48c"); + static final Color teal = const Color.hex("008080"); + static final Color thistle = const Color.hex("d8bfd8"); + static final Color tomato = const Color.hex("ff6347"); + static final Color turquoise = const Color.hex("40e0d0"); + static final Color violet = const Color.hex("ee82ee"); + static final Color wheat = const Color.hex("f5deb3"); + static final Color white = const Color.hex("ffffff"); + static final Color whiteSmoke = const Color.hex("f5f5f5"); + static final Color yellow = const Color.hex("ffff00"); + static final Color yellowGreen = const Color.hex("9acd32"); +} + + +/** + * Rgba class for users that want to interact with a color as a RGBA value. + */ +class Rgba implements _StyleProperty, ColorBase { + // TODO(terry): Consider consolidating rgba to a single 32-bit int, make sure + // it works under JS and Dart VM. + final int r; + final int g; + final int b; + final num a; + + Rgba(int red, int green, int blue, [num alpha]) : + this.r = Color._clamp(red, 0, 255), + this.g = Color._clamp(green, 0, 255), + this.b = Color._clamp(blue, 0, 255), + this.a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; + + factory Rgba.fromString(String hexValue) => + new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; + + factory Rgba.fromColor(Color color) => color.rgba; + + factory Rgba.fromArgbValue(num value) { + return new Rgba(((value.toInt() & 0xff000000) >> 0x18), /* a */ + ((value.toInt() & 0xff0000) >> 0x10), /* r */ + ((value.toInt() & 0xff00) >> 8), /* g */ + ((value.toInt() & 0xff))); /* b */ + } + + factory Rgba.fromHsla(Hsla hsla) { + // Convert to Rgba. + // See site for good documentation + // and color conversion routines. + + num h = hsla.hue; + num s = hsla.saturation; + num l = hsla.lightness; + num a = hsla.alpha; + + int r; + int g; + int b; + + if (s == 0) { + r = (l * 255).round().toInt(); + g = r; + b = r; + } else { + num var2; + + if (l < 0.5) { + var2 = l * (1 + s); + } else { + var2 = (l + s) - (s * l); + } + num var1 = 2 * l - var2; + + r = (255 * Rgba._hueToRGB(var1, var2, h + (1/3))).round().toInt(); + g = (255 * Rgba._hueToRGB(var1, var2, h)).round().toInt(); + b = (255 * Rgba._hueToRGB(var1, var2, h - (1/3))).round().toInt(); + } + + return new Rgba(r, g, b, a); + } + + static num _hueToRGB(num v1, num v2, num vH) { + if (vH < 0) { + vH += 1; + } + + if (vH > 1) { + vH -= 1; + } + + if ((6 * vH) < 1) { + return (v1 + (v2 - v1) * 6 * vH); + } + + if ((2 * vH) < 1) { + return v2; + } + + if ((3 * vH) < 2) { + return (v1 + (v2 - v1) * ((2 / 3 - vH) * 6)); + } + + return v1; + } + + bool operator ==(Object other) => Color.equal(this, other); + + String get cssExpression { + if (a == null) { + return "#${Color.convertToHexString(r, g, b)}"; + } else { + return "rgba($r,$g,$b,$a)"; + } + } + + String toHexArgbString() => Color.convertToHexString(r, g, b, a); + + int get argbValue { + int value = 0; + if (a != null) { + value = (a.toInt() << 0x18); + } + value += (r << 0x10); + value += (g << 0x08); + value += b; + } + + Color get color => new Color.createRgba(r, g, b, a); + Hsla get hsla => new Hsla.fromRgba(this); + + Rgba darker(num amount) => Color._createNewTintShadeFromRgba(this, -amount); + Rgba lighter(num amount) => Color._createNewTintShadeFromRgba(this, amount); + + int get hashCode => toHexArgbString().hashCode; +} + + +/** + * Hsl class support to interact with a color as a hsl with hue, saturation, and + * lightness with optional alpha blending. The hue is a ratio of 360 degrees + * 360° = 1 or 0, (1° == (1/360)), saturation and lightness is a 0..1 fraction + * (1 == 100%) and alpha is a 0..1 fraction. + */ +class Hsla implements _StyleProperty, ColorBase { + final num _h; // Value from 0..1 + final num _s; // Value from 0..1 + final num _l; // Value from 0..1 + final num _a; // Value from 0..1 + + /** + * [hue] is a 0..1 fraction of 360 degrees (360 == 0). + * [saturation] is a 0..1 fraction (100% == 1). + * [lightness] is a 0..1 fraction (100% == 1). + * [alpha] is a 0..1 fraction, alpha blending between 0..1, 1 == 100% opaque. + */ + Hsla(num hue, num saturation, num lightness, [num alpha]) : + this._h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1), + this._s = Color._clamp(saturation, 0, 1), + this._l = Color._clamp(lightness, 0, 1), + this._a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; + + factory Hsla.fromString(String hexValue) { + Rgba rgba = new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; + return _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a); + } + + factory Hsla.fromColor(Color color) { + Rgba rgba = color.rgba; + return _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a); + } + + factory Hsla.fromArgbValue(num value) { + num a = (value.toInt() & 0xff000000) >> 0x18; + int r = (value.toInt() & 0xff0000) >> 0x10; + int g = (value.toInt() & 0xff00) >> 8; + int b = value.toInt() & 0xff; + + // Convert alpha to 0..1 from (0..255). + if (a != null) { + a = double.parse((a / 255).toStringAsPrecision(2)); + } + + return _createFromRgba(r, g, b, a); + } + + factory Hsla.fromRgba(Rgba rgba) => + _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a); + + static Hsla _createFromRgba(num r, num g, num b, num a) { + // Convert RGB to hsl. + // See site for good documentation + // and color conversion routines. + r /= 255; + g /= 255; + b /= 255; + + // Hue, saturation and lightness. + num h; + num s; + num l; + + num minRgb = math.min(r, math.min(g, b)); + num maxRgb = math.max(r, math.max(g, b)); + l = (maxRgb + minRgb) / 2; + if (l <= 0) { + return new Hsla(0, 0, l); // Black; + } + + num vm = maxRgb - minRgb; + s = vm; + if (s > 0) { + s /= (l < 0.5) ? (maxRgb + minRgb) : (2 - maxRgb - minRgb); + } else { + return new Hsla(0, 0, l); // White + } + + num r2, g2, b2; + r2 = (maxRgb - r) / vm; + g2 = (maxRgb - g) / vm; + b2 = (maxRgb - b) / vm; + if (r == maxRgb) { + h = (g == minRgb) ? 5.0 + b2 : 1 - g2; + } else if (g == maxRgb) { + h = (b == minRgb) ? 1 + r2 : 3 - b2; + } else { + h = (r == minRgb) ? 3 + g2 : 5 - r2; + } + h /= 6; + + return new Hsla(h, s, l, a); + } + + /** + * Returns 0..1 fraction (ratio of 360°, e.g. 1° == 1/360). + */ + num get hue => _h; + + /** + * Returns 0..1 fraction (1 == 100%) + */ + num get saturation => _s; + + /** + * Returns 0..1 fraction (1 == 100%). + */ + num get lightness => _l; + + /** + * Returns number as degrees 0..360. + */ + num get hueDegrees => (_h * 360).round(); + + /** + * Returns number as percentage 0..100 + */ + num get saturationPercentage => (_s * 100).round(); + + /** + * Returns number as percentage 0..100. + */ + num get lightnessPercentage => (_l * 100).round(); + + /** + * Returns number as 0..1 + */ + num get alpha => _a; + + bool operator ==(Object other) => Color.equal(this, other); + + String get cssExpression => (_a == null) ? + "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)" : + "hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)"; + + String toHexArgbString() => new Rgba.fromHsla(this).toHexArgbString(); + + int get argbValue => Color.hexToInt(this.toHexArgbString()); + + Color get color => new Color.createHsla(_h, _s, _l, _a); + Rgba get rgba => new Rgba.fromHsla(this); + + Hsla darker(num amount) => + new Hsla.fromRgba(new Rgba.fromHsla(this).darker(amount)); + + Hsla lighter(num amount) => + new Hsla.fromRgba(new Rgba.fromHsla(this).lighter(amount)); + + int get hashCode => toHexArgbString().hashCode; +} + + +/** X,Y position. */ +class PointXY implements _StyleProperty { + final num x, y; + const PointXY(this.x, this.y); + + String get cssExpression { + // TODO(terry): TBD + } +} + + +// TODO(terry): Implement style and color. +/** + * Supports border for measuring with layout. + */ +class Border implements _StyleProperty { + final int top, left, bottom, right; + + // TODO(terry): Just like CSS, 1-arg -> set all properties, 2-args -> top and + // bottom are first arg, left and right are second, 3-args, and + // 4-args -> tlbr or trbl. + const Border([this.top, this.left, this.bottom, this.right]); + + // TODO(terry): Consider using Size or width and height. + Border.uniform(num amount) : + top = amount, left = amount, bottom = amount, right = amount; + + int get width => left + right; + int get height => top + bottom; + + String get cssExpression { + return (top == left && bottom == right && top == right) ? "${left}px" : + "${top != null ? '$top' : '0'}px ${ + right != null ? '$right' : '0'}px ${ + bottom != null ? '$bottom' : '0'}px ${ + left != null ? '$left' : '0'}px"; + } +} + + +/** Font style constants. */ +class FontStyle { + /** Font style [normal] default. */ + static const String normal = "normal"; + /** + * Font style [italic] use explicity crafted italic font otherwise inclined + * on the fly like oblique. + */ + static const String italic = "italic"; + /** + * Font style [oblique] is rarely used. The normal style of a font is inclined + * on the fly to the right by 8-12 degrees. + */ + static const String oblique = "oblique"; +} + + +/** Font variant constants. */ +class FontVariant { + /** Font style [normal] default. */ + static const String normal = "normal"; + /** Font variant [smallCaps]. */ + static const String smallCaps = "small-caps"; +} + + +/** Font weight constants values 100, 200, 300, 400, 500, 600, 700, 800, 900. */ +class FontWeight { + /** Font weight normal [default] */ + static const int normal = 400; + /** Font weight bold */ + static const int bold = 700; + + static const int wt100 = 100; + static const int wt200 = 200; + static const int wt300 = 300; + static const int wt400 = 400; + static const int wt500 = 500; + static const int wt600 = 600; + static const int wt700 = 700; + static const int wt800 = 800; + static const int wt900 = 900; +} + + +/** Generic font family names. */ +class FontGeneric { + /** Generic family sans-serif font (w/o serifs). */ + static const String sansSerif = "sans-serif"; + /** Generic family serif font. */ + static const String serif = "serif"; + /** Generic family fixed-width font. */ + static const monospace = "monospace"; + /** Generic family emulate handwriting font. */ + static const String cursive = "cursive"; + /** Generic family decorative font. */ + static const String fantasy = "fantasy"; +} + + +/** + * List of most common font families across different platforms. Use the + * collection names in the Font class (e.g., Font.SANS_SERIF, Font.FONT_SERIF, + * Font.MONOSPACE, Font.CURSIVE or Font.FANTASY). These work best on all + * platforms using the fonts that best match availability on each platform. + * See for a good + * description of fonts available between platforms and browsers. + */ +class FontFamily { + /** Sans-Serif font for Windows similar to Helvetica on Mac bold/italic. */ + static const String arial = "arial"; + /** Sans-Serif font for Windows less common already bolded. */ + static const String arialBlack = "arial black"; + /** Sans-Serif font for Mac since 1984, similar to Arial/Helvetica. */ + static const String geneva = "geneva"; + /** Sans-Serif font for Windows most readable sans-serif font for displays. */ + static const String verdana = "verdana"; + /** Sans-Serif font for Mac since 1984 is identical to Arial. */ + static const String helvetica = "helvetica"; + + /** Serif font for Windows traditional font with “old-style” numerals. */ + static const String georgia = "georgia"; + /** + * Serif font for Mac. PCs may have the non-scalable Times use Times New + * Roman instead. Times is more compact than Times New Roman. + */ + static const String times = "times"; + /** + * Serif font for Windows most common serif font and default serif font for + * most browsers. + */ + static const String timesNewRoman = "times new roman"; + + /** + * Monospace font for Mac/Windows most common. Scalable on Mac not scalable + * on Windows. + */ + static const String courier = "courier"; + /** Monospace font for Mac/Windows scalable on both platforms. */ + static const String courierNew = "courier new"; + + /** Cursive font for Windows and default cursive font for IE. */ + static const String comicSansMs = "comic sans ms"; + /** Cursive font for Mac on Macs 2000 and newer. */ + static const String textile = "textile"; + /** Cursive font for older Macs. */ + static const String appleChancery = "apple chancery"; + /** Cursive font for some PCs. */ + static const String zaphChancery = "zaph chancery"; + + /** Fantasy font on most Mac/Windows/Linux platforms. */ + static const String impact = "impact"; + /** Fantasy font for Windows. */ + static const String webdings = "webdings"; +} + +class LineHeight { + final num height; + final bool inPixels; + const LineHeight(this.height, {this.inPixels : true}); +} + +// TODO(terry): Support @font-face fule. +/** + * Font style support for size, family, weight, style, variant, and lineheight. + */ +class Font implements _StyleProperty { + /** Collection of most common sans-serif fonts in order. */ + static const List sansSerif = const [FontFamily.arial, + FontFamily.verdana, + FontFamily.geneva, + FontFamily.helvetica, + FontGeneric.sansSerif]; + + /** Collection of most common serif fonts in order. */ + static const List serif = const [FontFamily.georgia, + FontFamily.timesNewRoman, + FontFamily.times, + FontGeneric.serif]; + /** Collection of most common monospace fonts in order. */ + static const List monospace = const [FontFamily.courierNew, + FontFamily.courier, + FontGeneric.monospace]; + /** Collection of most common cursive fonts in order. */ + static const List cursive = const [FontFamily.textile, + FontFamily.appleChancery, + FontFamily.zaphChancery, + FontGeneric.fantasy]; + /** Collection of most common fantasy fonts in order. */ + static const List fantasy = const [FontFamily.comicSansMs, + FontFamily.impact, + FontFamily.webdings, + FontGeneric.fantasy]; + + // TODO(terry): Should support the values xx-small, small, large, xx-large, + // etc. (mapped to a pixel sized font)? + /** Font size in pixels. */ + final num size; + + // TODO(terry): _family should be an immutable list, wrapper class to do this + // should exist in Dart. + /** + * Family specifies a list of fonts, the browser will sequentially select the + * the first known/supported font. There are two types of font families the + * family-name (e.g., arial, times, courier, etc) or the generic-family (e.g., + * serif, sans-seric, etc.) + */ + final List family; + + /** Font weight from 100, 200, 300, 400, 500, 600, 700, 800, 900 */ + final int weight; + + /** Style of a font normal, italic, oblique. */ + final String style; + + /** + * Font variant NORMAL (default) or SMALL_CAPS. Different set of font glyph + * lower case letters designed to have to fit within the font-height and + * weight of the corresponding lowercase letters. + */ + final String variant; + + final LineHeight lineHeight; + + // TODO(terry): Size and computedLineHeight are in pixels. Need to figure out + // how to handle in other units (specified in other units) like + // points, inches, etc. Do we have helpers like Units.Points(12) + // where 12 is in points and that's converted to pixels? + // TODO(terry): lineHeight is computed as 1.2 although CSS_RESET is 1.0 we + // need to be consistent some browsers use 1 others 1.2. + // TODO(terry): There is a school of thought "Golden Ratio Typography". + // Where width to display the text is also important in computing the line + // height. Classic typography suggest the ratio be 1.5. See + // and + // . + /** + * Create a font using [size] of font in pixels, [family] name of font(s) + * using [FontFamily], [style] of the font using [FontStyle], [variant] using + * [FontVariant], and [lineHeight] extra space (leading) around the font in + * pixels, if not specified it's 1.2 the font size. + */ + const Font({this.size, this.family, this.weight, this.style, this.variant, + this.lineHeight}); + + /** + * Merge the two fonts and return the result. See [Style.merge] for + * more information. + */ + factory Font.merge(Font a, Font b) { + if (a == null) return b; + if (b == null) return a; + return new Font._merge(a, b); + } + + Font._merge(Font a, Font b) + : size = _mergeVal(a.size, b.size), + family = _mergeVal(a.family, b.family), + weight = _mergeVal(a.weight, b.weight), + style = _mergeVal(a.style, b.style), + variant = _mergeVal(a.variant, b.variant), + lineHeight = _mergeVal(a.lineHeight, b.lineHeight); + + /** + * Shorthand CSS format for font is: + * + * font-style font-variant font-weight font-size/line-height font-family + * + * The font-size and font-family values are required. If any of the other + * values are missing the default value is used. + */ + String get cssExpression { + // TODO(jimhug): include variant, style, other options + if (weight != null) { + // TODO(jacobr): is this really correct for lineHeight? + if (lineHeight != null) { + return "$weight ${size}px/$lineHeightInPixels $_fontsAsString"; + } + return '$weight ${size}px $_fontsAsString'; + } + + return '${size}px $_fontsAsString'; + } + + Font scale(num ratio) => + new Font(size: size * ratio, family: family, weight: weight, style: style, + variant: variant); + + /** + * The lineHeight, provides an indirect means to specify the leading. The + * leading is the difference between the font-size height and the (used) + * value of line height in pixels. If lineHeight is not specified it's + * automatically computed as 1.2 of the font size. Firefox is 1.2, Safari is + * ~1.2, and CSS suggest a ration from 1 to 1.2 of the font-size when + * computing line-height. The Font class constructor has the computation for + * _lineHeight. + */ + num get lineHeightInPixels { + if (lineHeight != null) { + if (lineHeight.inPixels) { + return lineHeight.height; + } else { + return (size != null) ? lineHeight.height * size : null; + } + } else { + return (size != null) ? size * 1.2 : null; + } + } + + int get hashCode { + // TODO(jimhug): Lot's of potential collisions here. List of fonts, etc. + return size.toInt() % family[0].hashCode; + } + + bool operator ==(Object other) { + if (other is! Font) return false; + Font o = other; + return o.size == size && o.family == family && o.weight == weight && + o.lineHeight == lineHeight && o.style == style && o.variant == variant; + } + + // TODO(terry): This is fragile should probably just iterate through the list + // of fonts construction the font-family string. + /** Return fonts as a comma seperated list sans the square brackets. */ + String get _fontsAsString { + String fonts = family.toString(); + return fonts.length > 2 ? fonts.substring(1, fonts.length - 1) : ""; + } +} + +/** + * This class stores the sizes of the box edges in the CSS [box model][]. Each + * edge area is placed around the sides of the content box. The innermost area + * is the [Style.padding] area which has a background and surrounds the content. + * The content and padding area is surrounded by the [Style.border], which + * itself is surrounded by the transparent [Style.margin]. This box represents + * the eges of padding, border, or margin depending on which accessor was used + * to retrieve it. + * + * [box model]: https://developer.mozilla.org/en/CSS/box_model + */ +class BoxEdge { + /** The size of the left edge, or null if the style has no edge. */ + final num left; + + /** The size of the top edge, or null if the style has no edge. */ + final num top; + + /** The size of the right edge, or null if the style has no edge. */ + final num right; + + /** The size of the bottom edge, or null if the style has no edge. */ + final num bottom; + + /** + * Creates a box edge with the specified [left], [top], [right], and + * [bottom] width. + */ + const BoxEdge([this.left, this.top, this.right, this.bottom]); + + /** + * Creates a box edge with the specified [top], [right], [bottom], and + * [left] width. This matches the typical CSS order: + * + * + * . + */ + const BoxEdge.clockwiseFromTop(this.top, this.right, this.bottom, this.left); + + /** + * This is a helper to creates a box edge with the same [left], [top] + * [right], and [bottom] widths. + */ + const BoxEdge.uniform(num size) + : top = size, left = size, bottom = size, right = size; + + /** + * Takes a possibly null box edge, with possibly null metrics, and fills + * them in with 0 instead. + */ + factory BoxEdge.nonNull(BoxEdge other) { + if (other == null) return const BoxEdge(0, 0, 0, 0); + num left = other.left; + num top = other.top; + num right = other.right; + num bottom = other.bottom; + bool make = false; + if (left == null) { + make = true; + left = 0; + } + if (top == null) { + make = true; + top = 0; + } + if (right == null) { + make = true; + right = 0; + } + if (bottom == null) { + make = true; + bottom = 0; + } + return make ? new BoxEdge(left, top, right, bottom) : other; + } + + /** + * Merge the two box edge sizes and return the result. See [Style.merge] for + * more information. + */ + factory BoxEdge.merge(BoxEdge x, BoxEdge y) { + if (x == null) return y; + if (y == null) return x; + return new BoxEdge._merge(x, y); + } + + BoxEdge._merge(BoxEdge x, BoxEdge y) + : left = _mergeVal(x.left, y.left), + top = _mergeVal(x.top, y.top), + right = _mergeVal(x.right, y.right), + bottom = _mergeVal(x.bottom, y.bottom); + + /** + * The total size of the horizontal edges. Equal to [left] + [right], where + * null is interpreted as 0px. + */ + num get width => (left != null ? left : 0) + (right != null ? right : 0); + + /** + * The total size of the vertical edges. Equal to [top] + [bottom], where + * null is interpreted as 0px. + */ + num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0); +} + +_mergeVal(x, y) => y != null ? y : x; diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart new file mode 100644 index 000000000..cf9e376ee --- /dev/null +++ b/pkgs/csslib/lib/src/token.dart @@ -0,0 +1,53 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of csslib.parser; + +/** + * A single token in the Dart language. + */ +class Token { + /** A member of [TokenKind] specifying what kind of token this is. */ + final int kind; + + /** The location where this token was parsed from. */ + final Span span; + + /** The start offset of this token. */ + int get start => span.start.offset; + + /** The end offset of this token. */ + int get end => span.end.offset; + + /** Returns the source text corresponding to this [Token]. */ + String get text => span.text; + + Token(this.kind, this.span); + + /** Returns a pretty representation of this token for error messages. **/ + String toString() { + var kindText = TokenKind.kindToString(kind); + var actualText = text; + if (kindText != actualText) { + if (actualText.length > 10) { + actualText = '${actualText.substring(0, 8)}...'; + } + return '$kindText($actualText)'; + } else { + return kindText; + } + } +} + +/** A token containing a parsed literal value. */ +class LiteralToken extends Token { + var value; + LiteralToken(int kind, Span span, this.value) : super(kind, span); +} + +/** A token containing error information. */ +class ErrorToken extends Token { + String message; + ErrorToken(int kind, Span span, this.message) : super(kind, span); +} diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart new file mode 100644 index 000000000..e3cdfdca1 --- /dev/null +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -0,0 +1,409 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of csslib.parser; + +class Tokenizer extends TokenizerBase { + /** U+ prefix for unicode characters. */ + final UNICODE_U = 'U'.codeUnitAt(0); + final UNICODE_LOWER_U = 'u'.codeUnitAt(0); + final UNICODE_PLUS = '+'.codeUnitAt(0); + + final QUESTION_MARK = '?'.codeUnitAt(0); + + /** CDATA keyword. */ + final List CDATA_NAME = 'CDATA'.codeUnits; + + Tokenizer(SourceFile file, String text, bool skipWhitespace, + [int index = 0]) + : super(file, text, skipWhitespace, index); + + Token next({unicodeRange: false}) { + // keep track of our starting position + _startIndex = _index; + + int ch; + ch = _nextChar(); + switch (ch) { + case TokenChar.NEWLINE: + case TokenChar.RETURN: + case TokenChar.SPACE: + case TokenChar.TAB: + return finishWhitespace(); + case TokenChar.END_OF_FILE: + return _finishToken(TokenKind.END_OF_FILE); + case TokenChar.AT: + int peekCh = _peekChar(); + if (TokenizerHelpers.isIdentifierStart(peekCh)) { + var oldIndex = _index; + var oldStartIndex = _startIndex; + + _startIndex = _index; + ch = _nextChar(); + Token ident = this.finishIdentifier(ch); + + // Is it a directive? + int tokId = TokenKind.matchDirectives(_text, _startIndex, + _index - _startIndex); + if (tokId == -1) { + // No, is it a margin directive? + tokId = TokenKind.matchMarginDirectives(_text, _startIndex, + _index - _startIndex); + } + + if (tokId != -1) { + return _finishToken(tokId); + } else { + // Didn't find a CSS directive or margin directive so the @name is + // probably the Less definition '@name: value_variable_definition'. + _startIndex = oldStartIndex; + _index = oldIndex; + } + } + return _finishToken(TokenKind.AT); + case TokenChar.DOT: + int start = _startIndex; // Start where the dot started. + if (maybeEatDigit()) { + // looks like a number dot followed by digit(s). + Token number = finishNumber(); + if (number.kind == TokenKind.INTEGER) { + // It's a number but it's preceeded by a dot, so make it a double. + _startIndex = start; + return _finishToken(TokenKind.DOUBLE); + } else { + // Don't allow dot followed by a double (e.g, '..1'). + return _errorToken(); + } + } + // It's really a dot. + return _finishToken(TokenKind.DOT); + case TokenChar.LPAREN: + return _finishToken(TokenKind.LPAREN); + case TokenChar.RPAREN: + return _finishToken(TokenKind.RPAREN); + case TokenChar.LBRACE: + return _finishToken(TokenKind.LBRACE); + case TokenChar.RBRACE: + return _finishToken(TokenKind.RBRACE); + case TokenChar.LBRACK: + return _finishToken(TokenKind.LBRACK); + case TokenChar.RBRACK: + if (_maybeEatChar(TokenChar.RBRACK) && + _maybeEatChar(TokenChar.GREATER)) { + // ]]> + return next(); + } + return _finishToken(TokenKind.RBRACK); + case TokenChar.HASH: + return _finishToken(TokenKind.HASH); + case TokenChar.PLUS: + if (maybeEatDigit()) return finishNumber(); + return _finishToken(TokenKind.PLUS); + case TokenChar.MINUS: + if (selectorExpression || unicodeRange) { + // If parsing in pseudo function expression then minus is an operator + // not part of identifier e.g., interval value range (e.g. U+400-4ff) + // or minus operator in selector expression. + return _finishToken(TokenKind.MINUS); + } else if (maybeEatDigit()) { + return finishNumber(); + } else if (TokenizerHelpers.isIdentifierStart(ch)) { + return this.finishIdentifier(ch); + } + return _finishToken(TokenKind.MINUS); + case TokenChar.GREATER: + return _finishToken(TokenKind.GREATER); + case TokenChar.TILDE: + if (_maybeEatChar(TokenChar.EQUALS)) { + return _finishToken(TokenKind.INCLUDES); // ~= + } + return _finishToken(TokenKind.TILDE); + case TokenChar.ASTERISK: + if (_maybeEatChar(TokenChar.EQUALS)) { + return _finishToken(TokenKind.SUBSTRING_MATCH); // *= + } + return _finishToken(TokenKind.ASTERISK); + case TokenChar.AMPERSAND: + return _finishToken(TokenKind.AMPERSAND); + case TokenChar.NAMESPACE: + return _finishToken(TokenKind.NAMESPACE); + case TokenChar.COLON: + return _finishToken(TokenKind.COLON); + case TokenChar.COMMA: + return _finishToken(TokenKind.COMMA); + case TokenChar.SEMICOLON: + return _finishToken(TokenKind.SEMICOLON); + case TokenChar.PERCENT: + return _finishToken(TokenKind.PERCENT); + case TokenChar.SINGLE_QUOTE: + return _finishToken(TokenKind.SINGLE_QUOTE); + case TokenChar.DOUBLE_QUOTE: + return _finishToken(TokenKind.DOUBLE_QUOTE); + case TokenChar.SLASH: + if (_maybeEatChar(TokenChar.ASTERISK)) return finishMultiLineComment(); + return _finishToken(TokenKind.SLASH); + case TokenChar.LESS: // (CDC). */ + if (_maybeEatChar(TokenChar.MINUS)) { + if (_maybeEatChar(TokenChar.GREATER)) { + if (_skipWhitespace) { + return next(); + } else { + return _finishToken(TokenKind.HTML_COMMENT); + } + } + } + } + } + return _errorToken(); + } + +} + +/** Static helper methods. */ +class TokenizerHelpers { + static bool isIdentifierStart(int c) { + return isIdentifierStartExpr(c) || c == 45 /*-*/; + } + + static bool isDigit(int c) { + return (c >= 48/*0*/ && c <= 57/*9*/); + } + + static bool isHexDigit(int c) { + return (isDigit(c) || (c >= 97/*a*/ && c <= 102/*f*/) + || (c >= 65/*A*/ && c <= 70/*F*/)); + } + + static bool isIdentifierPart(int c) { + return isIdentifierPartExpr(c) || c == 45 /*-*/; + } + + /** Pseudo function expressions identifiers can't have a minus sign. */ + static bool isIdentifierStartExpr(int c) { + return ((c >= 97/*a*/ && c <= 122/*z*/) || (c >= 65/*A*/ && c <= 90/*Z*/) || + c == 95/*_*/); + } + + /** Pseudo function expressions identifiers can't have a minus sign. */ + static bool isIdentifierPartExpr(int c) { + return (isIdentifierStartExpr(c) || isDigit(c)); + } +} diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart new file mode 100644 index 000000000..f33a3629c --- /dev/null +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -0,0 +1,445 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Generated by scripts/tokenizer_gen.py. + +part of csslib.parser; + +/** Tokenizer state to support look ahead for Less' nested selectors. */ +class TokenizerState { + final int index; + final int startIndex; + final bool selectorExpression; + + TokenizerState(TokenizerBase base) : + this.index = base._index, + this.startIndex = base._startIndex, + this.selectorExpression = base.selectorExpression; +} + +/** + * The base class for our tokenizer. The hand coded parts are in this file, with + * the generated parts in the subclass Tokenizer. + */ +abstract class TokenizerBase { + final SourceFile _file; + final bool _skipWhitespace; + final String _text; + + /** + * Changes tokenization when in a pseudo function expression. If true then + * minus signs are handled as operators instead of identifiers. + */ + bool selectorExpression = false; + + int _index; + int _startIndex; + + static const String _CDATA_START = ''; + + TokenizerBase(this._file, this._text, this._skipWhitespace, + [this._index = 0]); + + Token next(); + int getIdentifierKind(); + + /** Snapshot of Tokenizer scanning state. */ + TokenizerState get mark => new TokenizerState(this); + + /** Restore Tokenizer scanning state. */ + void restore(TokenizerState markedData) { + _index = markedData.index; + _startIndex = markedData.startIndex; + selectorExpression = markedData.selectorExpression; + } + + int _nextChar() { + if (_index < _text.length) { + return _text.codeUnitAt(_index++); + } else { + return 0; + } + } + + int _peekChar() { + if (_index < _text.length) { + return _text.codeUnitAt(_index); + } else { + return 0; + } + } + + bool _maybeEatChar(int ch) { + if (_index < _text.length) { + if (_text.codeUnitAt(_index) == ch) { + _index++; + return true; + } else { + return false; + } + } else { + return false; + } + } + + String _tokenText() { + if (_index < _text.length) { + return _text.substring(_startIndex, _index); + } else { + return _text.substring(_startIndex, _text.length); + } + } + + Token _finishToken(int kind) { + return new Token(kind, _file.span(_startIndex, _index)); + } + + Token _errorToken([String message = null]) { + return new ErrorToken( + TokenKind.ERROR, _file.span(_startIndex, _index), message); + } + + Token finishWhitespace() { + _index--; + while (_index < _text.length) { + final ch = _text.codeUnitAt(_index++); + if (ch == TokenChar.SPACE || + ch == TokenChar.TAB || + ch == TokenChar.RETURN) { + // do nothing + } else if (ch == TokenChar.NEWLINE) { + if (!_skipWhitespace) { + return _finishToken(TokenKind.WHITESPACE); // note the newline? + } + } else { + _index--; + if (_skipWhitespace) { + return next(); + } else { + return _finishToken(TokenKind.WHITESPACE); + } + } + + } + return _finishToken(TokenKind.END_OF_FILE); + } + + Token finishSingleLineComment() { + while (true) { + int ch = _nextChar(); + if (ch == 0 || ch == TokenChar.NEWLINE || ch == TokenChar.RETURN) { + if (_skipWhitespace) { + return next(); + } else { + return _finishToken(TokenKind.COMMENT); + } + } + } + } + + Token finishMultiLineComment() { + int nesting = 1; + do { + int ch = _nextChar(); + if (ch == 0) { + return _errorToken(); + } else if (ch == TokenChar.ASTERISK) { + if (_maybeEatChar(TokenChar.SLASH)) { + nesting--; + } + } else if (ch == TokenChar.SLASH) { + if (_maybeEatChar(TokenChar.ASTERISK)) { + nesting++; + } + } + } while (nesting > 0); + + if (_skipWhitespace) { + return next(); + } else { + return _finishToken(TokenKind.COMMENT); + } + } + + void eatDigits() { + while (_index < _text.length) { + if (TokenizerHelpers.isDigit(_text.codeUnitAt(_index))) { + _index++; + } else { + return; + } + } + } + + static int _hexDigit(int c) { + if(c >= 48/*0*/ && c <= 57/*9*/) { + return c - 48; + } else if (c >= 97/*a*/ && c <= 102/*f*/) { + return c - 87; + } else if (c >= 65/*A*/ && c <= 70/*F*/) { + return c - 55; + } else { + return -1; + } + } + + int readHex([int hexLength]) { + int maxIndex; + if (hexLength == null) { + maxIndex = _text.length - 1; + } else { + // TODO(jimhug): What if this is too long? + maxIndex = _index + hexLength; + if (maxIndex >= _text.length) return -1; + } + var result = 0; + while (_index < maxIndex) { + final digit = _hexDigit(_text.codeUnitAt(_index)); + if (digit == -1) { + if (hexLength == null) { + return result; + } else { + return -1; + } + } + _hexDigit(_text.codeUnitAt(_index)); + // Multiply by 16 rather than shift by 4 since that will result in a + // correct value for numbers that exceed the 32 bit precision of JS + // 'integers'. + // TODO: Figure out a better solution to integer truncation. Issue 638. + result = (result * 16) + digit; + _index++; + } + + return result; + } + + Token finishNumber() { + eatDigits(); + + if (_peekChar() == TokenChar.DOT) { + // Handle the case of 1.toString(). + _nextChar(); + if (TokenizerHelpers.isDigit(_peekChar())) { + eatDigits(); + return finishNumberExtra(TokenKind.DOUBLE); + } else { + _index--; + } + } + + return finishNumberExtra(TokenKind.INTEGER); + } + + Token finishNumberExtra(int kind) { + if (_maybeEatChar(101/*e*/) || _maybeEatChar(69/*E*/)) { + kind = TokenKind.DOUBLE; + _maybeEatChar(TokenKind.MINUS); + _maybeEatChar(TokenKind.PLUS); + eatDigits(); + } + if (_peekChar() != 0 && TokenizerHelpers.isIdentifierStart(_peekChar())) { + _nextChar(); + return _errorToken("illegal character in number"); + } + + return _finishToken(kind); + } + + Token _makeStringToken(List buf, bool isPart) { + final s = new String.fromCharCodes(buf); + final kind = isPart ? TokenKind.STRING_PART : TokenKind.STRING; + return new LiteralToken(kind, _file.span(_startIndex, _index), s); + } + + Token makeIEFilter(int start, int end) { + var filter = _text.substring(start, end); + return new LiteralToken(TokenKind.STRING, _file.span(start, end), filter); + } + + Token _makeRawStringToken(bool isMultiline) { + var s; + if (isMultiline) { + // Skip initial newline in multiline strings + int start = _startIndex + 4; + if (_text[start] == '\n') start++; + s = _text.substring(start, _index - 3); + } else { + s = _text.substring(_startIndex + 2, _index - 1); + } + return new LiteralToken(TokenKind.STRING, + _file.span(_startIndex, _index), s); + } + + Token finishMultilineString(int quote) { + var buf = []; + while (true) { + int ch = _nextChar(); + if (ch == 0) { + return _errorToken(); + } else if (ch == quote) { + if (_maybeEatChar(quote)) { + if (_maybeEatChar(quote)) { + return _makeStringToken(buf, false); + } + buf.add(quote); + } + buf.add(quote); + } else if (ch == TokenChar.BACKSLASH) { + var escapeVal = readEscapeSequence(); + if (escapeVal == -1) { + return _errorToken("invalid hex escape sequence"); + } else { + buf.add(escapeVal); + } + } else { + buf.add(ch); + } + } + } + + Token _finishOpenBrace() { + return _finishToken(TokenKind.LBRACE); + } + + Token _finishCloseBrace() { + return _finishToken(TokenKind.RBRACE); + } + + Token finishString(int quote) { + if (_maybeEatChar(quote)) { + if (_maybeEatChar(quote)) { + // skip an initial newline + _maybeEatChar(TokenChar.NEWLINE); + return finishMultilineString(quote); + } else { + return _makeStringToken(new List(), false); + } + } + return finishStringBody(quote); + } + + Token finishRawString(int quote) { + if (_maybeEatChar(quote)) { + if (_maybeEatChar(quote)) { + return finishMultilineRawString(quote); + } else { + return _makeStringToken([], false); + } + } + while (true) { + int ch = _nextChar(); + if (ch == quote) { + return _makeRawStringToken(false); + } else if (ch == 0) { + return _errorToken(); + } + } + } + + Token finishMultilineRawString(int quote) { + while (true) { + int ch = _nextChar(); + if (ch == 0) { + return _errorToken(); + } else if (ch == quote && _maybeEatChar(quote) && _maybeEatChar(quote)) { + return _makeRawStringToken(true); + } + } + } + + Token finishStringBody(int quote) { + var buf = new List(); + while (true) { + int ch = _nextChar(); + if (ch == quote) { + return _makeStringToken(buf, false); + } else if (ch == 0) { + return _errorToken(); + } else if (ch == TokenChar.BACKSLASH) { + var escapeVal = readEscapeSequence(); + if (escapeVal == -1) { + return _errorToken("invalid hex escape sequence"); + } else { + buf.add(escapeVal); + } + } else { + buf.add(ch); + } + } + } + + int readEscapeSequence() { + final ch = _nextChar(); + int hexValue; + switch (ch) { + case 110/*n*/: + return TokenChar.NEWLINE; + case 114/*r*/: + return TokenChar.RETURN; + case 102/*f*/: + return TokenChar.FF; + case 98/*b*/: + return TokenChar.BACKSPACE; + case 116/*t*/: + return TokenChar.TAB; + case 118/*v*/: + return TokenChar.FF; + case 120/*x*/: + hexValue = readHex(2); + break; + case 117/*u*/: + if (_maybeEatChar(TokenChar.LBRACE)) { + hexValue = readHex(); + if (!_maybeEatChar(TokenChar.RBRACE)) { + return -1; + } + } else { + hexValue = readHex(4); + } + break; + default: return ch; + } + + if (hexValue == -1) return -1; + + // According to the Unicode standard the high and low surrogate halves + // used by UTF-16 (U+D800 through U+DFFF) and values above U+10FFFF + // are not legal Unicode values. + if (hexValue < 0xD800 || hexValue > 0xDFFF && hexValue <= 0xFFFF) { + return hexValue; + } else if (hexValue <= 0x10FFFF){ + messages.error('unicode values greater than 2 bytes not implemented yet', + _file.span(_startIndex, _startIndex + 1)); + return -1; + } else { + return -1; + } + } + + Token finishDot() { + if (TokenizerHelpers.isDigit(_peekChar())) { + eatDigits(); + return finishNumberExtra(TokenKind.DOUBLE); + } else { + return _finishToken(TokenKind.DOT); + } + } + + Token finishIdentifier(int ch) { + while (_index < _text.length) { + if (!TokenizerHelpers.isIdentifierPart(_text.codeUnitAt(_index++))) { + _index--; + break; + } + } + int kind = getIdentifierKind(); + if (kind == TokenKind.IDENTIFIER) { + return _finishToken(TokenKind.IDENTIFIER); + } else { + return _finishToken(kind); + } + } +} + diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart new file mode 100644 index 000000000..ebe0615ea --- /dev/null +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -0,0 +1,756 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of csslib.parser; + +// TODO(terry): Need to be consistent with tokens either they're ASCII tokens +// e.g., ASTERISK or they're CSS e.g., PSEUDO, COMBINATOR_*. +class TokenKind { + // Common shared tokens used in TokenizerBase. + static const int UNUSED = 0; // Unused place holder... + static const int END_OF_FILE = 1; // EOF + static const int LPAREN = 2; // ( + static const int RPAREN = 3; // ) + static const int LBRACK = 4; // [ + static const int RBRACK = 5; // ] + static const int LBRACE = 6; // { + static const int RBRACE = 7; // } + static const int DOT = 8; // . + static const int SEMICOLON = 9; // ; + + // Unique tokens for CSS. + static const int AT = 10; // @ + static const int HASH = 11; // # + static const int PLUS = 12; // + + static const int GREATER = 13; // > + static const int TILDE = 14; // ~ + static const int ASTERISK = 15; // * + static const int NAMESPACE = 16; // | + static const int COLON = 17; // : + static const int PRIVATE_NAME = 18; // _ prefix private class or id + static const int COMMA = 19; // , + static const int SPACE = 20; + static const int TAB = 21; // /t + static const int NEWLINE = 22; // /n + static const int RETURN = 23; // /r + static const int PERCENT = 24; // % + static const int SINGLE_QUOTE = 25; // ' + static const int DOUBLE_QUOTE = 26; // " + static const int SLASH = 27; // / + static const int EQUALS = 28; // = + static const int OR = 29; // | + static const int CARET = 30; // ^ + static const int DOLLAR = 31; // $ + static const int LESS = 32; // < + static const int BANG = 33; // ! + static const int MINUS = 34; // - + static const int BACKSLASH = 35; // \ + static const int AMPERSAND = 36; // & + + // WARNING: Tokens from this point and above must have the corresponding ASCII + // character in the TokenChar list at the bottom of this file. The + // order of the above tokens should be the same order as TokenChar. + + /** [TokenKind] representing integer tokens. */ + static const int INTEGER = 60; + + /** [TokenKind] representing hex integer tokens. */ + static const int HEX_INTEGER = 61; + + /** [TokenKind] representing double tokens. */ + static const int DOUBLE = 62; + + /** [TokenKind] representing whitespace tokens. */ + static const int WHITESPACE = 63; + + /** [TokenKind] representing comment tokens. */ + static const int COMMENT = 64; + + /** [TokenKind] representing error tokens. */ + static const int ERROR = 65; + + /** [TokenKind] representing incomplete string tokens. */ + static const int INCOMPLETE_STRING = 66; + + /** [TokenKind] representing incomplete comment tokens. */ + static const int INCOMPLETE_COMMENT = 67; + + static const int VAR_DEFINITION = 400; // var-NNN-NNN + static const int VAR_USAGE = 401; // var(NNN-NNN [,default]) + + // Synthesized Tokens (no character associated with TOKEN). + static const int STRING = 500; + static const int STRING_PART = 501; + static const int NUMBER = 502; + static const int HEX_NUMBER = 503; + static const int HTML_COMMENT = 504; // ). +class CommentDefinition extends CssComment { + CommentDefinition(String comment, Span span): super(comment, span); + visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); +} + +class SelectorGroup extends TreeNode { + List _selectors; + + SelectorGroup(this._selectors, Span span): super(span); + + List get selectors => _selectors; + + visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); +} + +class Selector extends TreeNode { + final List _simpleSelectorSequences; + + Selector(this._simpleSelectorSequences, Span span) : super(span); + + List get simpleSelectorSequences => + _simpleSelectorSequences; + + add(SimpleSelectorSequence seq) => _simpleSelectorSequences.add(seq); + + int get length => _simpleSelectorSequences.length; + + visit(VisitorBase visitor) => visitor.visitSelector(this); +} + +class SimpleSelectorSequence extends TreeNode { + /** +, >, ~, NONE */ + final int _combinator; + final SimpleSelector _selector; + + SimpleSelectorSequence(this._selector, Span span, + [int combinator = TokenKind.COMBINATOR_NONE]) + : _combinator = combinator, super(span); + + get simpleSelector => _selector; + + bool get isCombinatorNone => _combinator == TokenKind.COMBINATOR_NONE; + bool get isCombinatorPlus => _combinator == TokenKind.COMBINATOR_PLUS; + bool get isCombinatorGreater => _combinator == TokenKind.COMBINATOR_GREATER; + bool get isCombinatorTilde => _combinator == TokenKind.COMBINATOR_TILDE; + bool get isCombinatorDescendant => + _combinator == TokenKind.COMBINATOR_DESCENDANT; + + String get _combinatorToString => + isCombinatorDescendant ? ' ' : + isCombinatorPlus ? ' + ' : + isCombinatorGreater ? ' > ' : + isCombinatorTilde ? ' ~ ' : ''; + + visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); +} + +/* All other selectors (element, #id, .class, attribute, pseudo, negation, + * namespace, *) are derived from this selector. + */ +class SimpleSelector extends TreeNode { + final _name; + + SimpleSelector(this._name, Span span) : super(span); + + // Name can be an Identifier or WildCard we'll return either the name or '*'. + String get name => isWildcard ? '*' : isThis ? '&' : _name.name; + + bool get isWildcard => _name is Wildcard; + + bool get isThis => _name is ThisOperator; + + visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); +} + +// element name +class ElementSelector extends SimpleSelector { + ElementSelector(name, Span span) : super(name, span); + visit(VisitorBase visitor) => visitor.visitElementSelector(this); +} + +// namespace|element +class NamespaceSelector extends SimpleSelector { + final _namespace; // null, Wildcard or Identifier + + NamespaceSelector(this._namespace, var name, Span span) : super(name, span); + + String get namespace => + _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name; + + bool get isNamespaceWildcard => _namespace is Wildcard; + + SimpleSelector get nameAsSimpleSelector => _name; + + visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); +} + +// [attr op value] +class AttributeSelector extends SimpleSelector { + final int _op; + final _value; + + AttributeSelector(Identifier name, this._op, this._value, + Span span) : super(name, span); + + String matchOperator() { + switch (_op) { + case TokenKind.EQUALS: + return '='; + case TokenKind.INCLUDES: + return '~='; + case TokenKind.DASH_MATCH: + return '|='; + case TokenKind.PREFIX_MATCH: + return '^='; + case TokenKind.SUFFIX_MATCH: + return '\$='; + case TokenKind.SUBSTRING_MATCH: + return '*='; + case TokenKind.NO_MATCH: + return ''; + } + } + + // Return the TokenKind for operator used by visitAttributeSelector. + String matchOperatorAsTokenString() { + switch (_op) { + case TokenKind.EQUALS: + return 'EQUALS'; + case TokenKind.INCLUDES: + return 'INCLUDES'; + case TokenKind.DASH_MATCH: + return 'DASH_MATCH'; + case TokenKind.PREFIX_MATCH: + return 'PREFIX_MATCH'; + case TokenKind.SUFFIX_MATCH: + return 'SUFFIX_MATCH'; + case TokenKind.SUBSTRING_MATCH: + return 'SUBSTRING_MATCH'; + } + } + + String valueToString() { + if (_value != null) { + if (_value is Identifier) { + return _value.name; + } else { + return '"${_value}"'; + } + } else { + return ''; + } + } + + visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); +} + +// #id +class IdSelector extends SimpleSelector { + IdSelector(Identifier name, Span span) : super(name, span); + visit(VisitorBase visitor) => visitor.visitIdSelector(this); +} + +// .class +class ClassSelector extends SimpleSelector { + ClassSelector(Identifier name, Span span) : super(name, span); + visit(VisitorBase visitor) => visitor.visitClassSelector(this); +} + +// :pseudoClass +class PseudoClassSelector extends SimpleSelector { + PseudoClassSelector(Identifier name, Span span) : super(name, span); + visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); +} + +// ::pseudoElement +class PseudoElementSelector extends SimpleSelector { + PseudoElementSelector(Identifier name, Span span) : super(name, span); + visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); +} + +// :pseudoClassFunction(expression) +class PseudoClassFunctionSelector extends PseudoClassSelector { + SelectorExpression expression; + + PseudoClassFunctionSelector(Identifier name, this.expression, Span span) + : super(name, span); + visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); +} + +// ::pseudoElementFunction(expression) +class PseudoElementFunctionSelector extends PseudoElementSelector { + SelectorExpression expression; + + PseudoElementFunctionSelector(Identifier name, this.expression, Span span) + : super(name, span); + visit(VisitorBase visitor) => + visitor.visitPseudoElementFunctionSelector(this); +} + +class SelectorExpression extends TreeNode { + final List _expressions = []; + + SelectorExpression(Span span): super(span); + + add(Expression expression) { + _expressions.add(expression); + } + + List get expressions => _expressions; + + visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); +} + +// :NOT(negation_arg) +class NegationSelector extends SimpleSelector { + SimpleSelector negationArg; + + NegationSelector(this.negationArg, Span span) + : super(new Negation(span), span); + + visit(VisitorBase visitor) => visitor.visitNegationSelector(this); +} + +class StyleSheet extends TreeNode { + /** + * Contains charset, ruleset, directives (media, page, etc.), and selectors. + */ + final topLevels; + + StyleSheet(this.topLevels, Span span) : super(span) { + for (final node in topLevels) { + assert(node is TopLevelProduction || node is Directive); + } + } + + /** Selectors only in this tree. */ + StyleSheet.selector(this.topLevels, Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitStyleSheet(this); +} + +class TopLevelProduction extends TreeNode { + TopLevelProduction(Span span) : super(span); + visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); +} + +class RuleSet extends TopLevelProduction { + final SelectorGroup _selectorGroup; + final DeclarationGroup _declarationGroup; + + RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span); + + SelectorGroup get selectorGroup => _selectorGroup; + DeclarationGroup get declarationGroup => _declarationGroup; + + visit(VisitorBase visitor) => visitor.visitRuleSet(this); +} + +class Directive extends TreeNode { + Directive(Span span) : super(span); + + bool get isBuiltIn => true; // Known CSS directive? + bool get isExtension => false; // SCSS extension? + + visit(VisitorBase visitor) => visitor.visitDirective(this); +} + +class ImportDirective extends Directive { + /** import name specified. */ + final String import; + + /** Any media queries for this import. */ + final List mediaQueries; + + ImportDirective(this.import, this.mediaQueries, Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitImportDirective(this); +} + +/** + * MediaExpression grammar: + * '(' S* media_feature S* [ ':' S* expr ]? ')' S* + */ +class MediaExpression extends TreeNode { + final bool andOperator; + final Identifier _mediaFeature; + final Expressions exprs; + + MediaExpression(this.andOperator, this._mediaFeature, this.exprs, Span span) + : super(span); + + String get mediaFeature => _mediaFeature.name; + + visit(VisitorBase visitor) => visitor.visitMediaExpression(this); +} + +/** + * MediaQuery grammar: + * : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]* + * | media_expression [ AND S* media_expression ]* + * media_type + * : IDENT + * media_expression + * : '(' S* media_feature S* [ ':' S* expr ]? ')' S* + * media_feature + * : IDENT + */ +class MediaQuery extends TreeNode { + /** not, only or no operator. */ + final int _mediaUnary; + final Identifier _mediaType; + final List expressions; + + MediaQuery(this._mediaUnary, this._mediaType, this.expressions, Span span) + : super(span); + + bool get hasMediaType => _mediaType != null; + String get mediaType => _mediaType.name; + + bool get hasUnary => _mediaUnary != -1; + String get unary => + TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); + + visit(VisitorBase visitor) => visitor.visitMediaQuery(this); +} + +class MediaDirective extends Directive { + List mediaQueries; + List rulesets; + + MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitMediaDirective(this); +} + +class HostDirective extends Directive { + List rulesets; + + HostDirective(this.rulesets, Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitHostDirective(this); +} + +class PageDirective extends Directive { + final String _ident; + final String _pseudoPage; + List _declsMargin; + + PageDirective(this._ident, this._pseudoPage, this._declsMargin, + Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitPageDirective(this); + + bool get hasIdent => _ident != null && _ident.length > 0; + bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0; +} + +class CharsetDirective extends Directive { + final String charEncoding; + + CharsetDirective(this.charEncoding, Span span) : super(span); + visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); +} + +class KeyFrameDirective extends Directive { + /* + * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-. + */ + final int _keyframeName; + final _name; + final List _blocks; + + KeyFrameDirective(this._keyframeName, this._name, Span span) + : _blocks = [], super(span); + + add(KeyFrameBlock block) { + _blocks.add(block); + } + + String get keyFrameName { + switch (_keyframeName) { + case TokenKind.DIRECTIVE_KEYFRAMES: + case TokenKind.DIRECTIVE_MS_KEYFRAMES: + return '@keyframes'; + case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES: return '@-webkit-keyframes'; + case TokenKind.DIRECTIVE_MOZ_KEYFRAMES: return '@-moz-keyframes'; + case TokenKind.DIRECTIVE_O_KEYFRAMES: return '@-o-keyframes'; + } + } + + String get name => _name; + + visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); +} + +class KeyFrameBlock extends Expression { + final Expressions _blockSelectors; + final DeclarationGroup _declarations; + + KeyFrameBlock(this._blockSelectors, this._declarations, Span span) + : super(span); + + visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); +} + +class FontFaceDirective extends Directive { + final DeclarationGroup _declarations; + + FontFaceDirective(this._declarations, Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); +} + +class StyletDirective extends Directive { + final String _dartClassName; + final List _rulesets; + + StyletDirective(this._dartClassName, this._rulesets, Span span) : super(span); + + bool get isBuiltIn => false; + bool get isExtension => true; + + String get dartClassName => _dartClassName; + List get rulesets => _rulesets; + + visit(VisitorBase visitor) => visitor.visitStyletDirective(this); +} + +class NamespaceDirective extends Directive { + /** Namespace prefix. */ + final String _prefix; + + /** URI associated with this namespace. */ + final String _uri; + + NamespaceDirective(this._prefix, this._uri, Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); + + String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; +} + +/** To support Less syntax @name: expression */ +class VarDefinitionDirective extends Directive { + final VarDefinition def; + + VarDefinitionDirective(this.def, Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); +} + +class Declaration extends TreeNode { + final Identifier _property; + final Expression _expression; + /** Style exposed to Dart. */ + var _dart; + final bool important; + + /** + * IE CSS hacks that can only be read by a particular IE version. + * 7 implies IE 7 or older property (e.g., *background: blue;) + * Note: IE 8 or older property (e.g., background: green\9;) is handled + * by IE8Term in declaration expression handling. + * Note: IE 6 only property with a leading underscore is a valid IDENT + * since an ident can start with underscore (e.g., _background: red;) + */ + final bool isIE7; + + Declaration(this._property, this._expression, this._dart, Span span, + {important: false, ie7: false}) + : this.important = important, this.isIE7 = ie7, super(span); + + String get property => isIE7 ? '*${_property.name}' : _property.name; + Expression get expression => _expression; + + bool get hasDartStyle => _dart != null; + get dartStyle => _dart; + set dartStyle(dStyle) { + _dart = dStyle; + } + + visit(VisitorBase visitor) => visitor.visitDeclaration(this); +} + +// TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and +// dynamic when in a declaration. Currently, Less syntax +// '@foo: expression' and 'var-foo: expression' in a declaration +// are statically resolved. Better solution, if @foo or var-foo +// are top-level are then statically resolved and var-foo in a +// declaration group (surrounded by a selector) would be dynamic. +class VarDefinition extends Declaration { + VarDefinition(Identifier definedName, Expression expr, Span span) + : super(definedName, expr, null, span); + + String get definedName => _property.name; + + set dartStyle(dStyle) { } + + visit(VisitorBase visitor) => visitor.visitVarDefinition(this); +} + +class DeclarationGroup extends TreeNode { + /** Can be either Declaration or RuleSet (if nested selector). */ + final List _declarations; + + DeclarationGroup(this._declarations, Span span) : super(span); + + List get declarations => _declarations; + + visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); +} + +class MarginGroup extends DeclarationGroup { + final int margin_sym; // TokenType for for @margin sym. + + MarginGroup(this.margin_sym, List decls, Span span) + : super(decls, span); + visit(VisitorBase visitor) => visitor.visitMarginGroup(this); +} + +class VarUsage extends Expression { + final String name; + final List defaultValues; + + VarUsage(this.name, this.defaultValues, Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitVarUsage(this); +} + +class OperatorSlash extends Expression { + OperatorSlash(Span span) : super(span); + visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); +} + +class OperatorComma extends Expression { + OperatorComma(Span span) : super(span); + visit(VisitorBase visitor) => visitor.visitOperatorComma(this); +} + +class OperatorPlus extends Expression { + OperatorPlus(Span span) : super(span); + visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); +} + +class OperatorMinus extends Expression { + OperatorMinus(Span span) : super(span); + visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); +} + +class UnicodeRangeTerm extends Expression { + final String first; + final String second; + + UnicodeRangeTerm(this.first, this.second, Span span) : super(span); + + bool get hasSecond => second != null; + + visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); +} + +class LiteralTerm extends Expression { + // TODO(terry): value and text fields can be made final once all CSS resources + // are copied/symlink'd in the build tool and UriVisitor in + // web_ui is removed. + var value; + String text; + + LiteralTerm(this.value, this.text, Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); +} + +class NumberTerm extends LiteralTerm { + NumberTerm(value, String t, Span span) : super(value, t, span); + visit(VisitorBase visitor) => visitor.visitNumberTerm(this); +} + +class UnitTerm extends LiteralTerm { + final int _unit; + + UnitTerm(value, String t, Span span, this._unit) : super(value, t, span); + + int get unit => _unit; + + visit(VisitorBase visitor) => visitor.visitUnitTerm(this); + + String unitToString() => TokenKind.unitToString(_unit); + + String toString() => '$text${unitToString()}'; +} + +class LengthTerm extends UnitTerm { + LengthTerm(value, String t, Span span, + [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + assert(this._unit == TokenKind.UNIT_LENGTH_PX || + this._unit == TokenKind.UNIT_LENGTH_CM || + this._unit == TokenKind.UNIT_LENGTH_MM || + this._unit == TokenKind.UNIT_LENGTH_IN || + this._unit == TokenKind.UNIT_LENGTH_PT || + this._unit == TokenKind.UNIT_LENGTH_PC); + } + + visit(VisitorBase visitor) => visitor.visitLengthTerm(this); +} + +class PercentageTerm extends LiteralTerm { + PercentageTerm(value, String t, Span span) : super(value, t, span); + visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); +} + +class EmTerm extends LiteralTerm { + EmTerm(value, String t, Span span) : super(value, t, span); + visit(VisitorBase visitor) => visitor.visitEmTerm(this); +} + +class ExTerm extends LiteralTerm { + ExTerm(value, String t, Span span) : super(value, t, span); + visit(VisitorBase visitor) => visitor.visitExTerm(this); +} + +class AngleTerm extends UnitTerm { + AngleTerm(var value, String t, Span span, + [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + assert(this._unit == TokenKind.UNIT_ANGLE_DEG || + this._unit == TokenKind.UNIT_ANGLE_RAD || + this._unit == TokenKind.UNIT_ANGLE_GRAD || + this._unit == TokenKind.UNIT_ANGLE_TURN); + } + + visit(VisitorBase visitor) => visitor.visitAngleTerm(this); +} + +class TimeTerm extends UnitTerm { + TimeTerm(var value, String t, Span span, + [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + assert(this._unit == TokenKind.UNIT_ANGLE_DEG || + this._unit == TokenKind.UNIT_TIME_MS || + this._unit == TokenKind.UNIT_TIME_S); + } + + visit(VisitorBase visitor) => visitor.visitTimeTerm(this); +} + +class FreqTerm extends UnitTerm { + FreqTerm(var value, String t, Span span, + [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ); + } + + visit(VisitorBase visitor) => visitor.visitFreqTerm(this); +} + +class FractionTerm extends LiteralTerm { + FractionTerm(var value, String t, Span span) : super(value, t, span); + + visit(VisitorBase visitor) => visitor.visitFractionTerm(this); +} + +class UriTerm extends LiteralTerm { + UriTerm(String value, Span span) : super(value, value, span); + + visit(VisitorBase visitor) => visitor.visitUriTerm(this); +} + +class ResolutionTerm extends UnitTerm { + ResolutionTerm(var value, String t, Span span, + [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + assert(_unit == TokenKind.UNIT_RESOLUTION_DPI || + _unit == TokenKind.UNIT_RESOLUTION_DPCM || + _unit == TokenKind.UNIT_RESOLUTION_DPPX); + } + + visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); +} + +class ChTerm extends UnitTerm { + ChTerm(var value, String t, Span span, + [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + assert(_unit == TokenKind.UNIT_CH); + } + + visit(VisitorBase visitor) => visitor.visitChTerm(this); +} + +class RemTerm extends UnitTerm { + RemTerm(var value, String t, Span span, + [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + assert(_unit == TokenKind.UNIT_REM); + } + + visit(VisitorBase visitor) => visitor.visitRemTerm(this); +} + +class ViewportTerm extends UnitTerm { + ViewportTerm(var value, String t, Span span, + [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + assert(_unit == TokenKind.UNIT_VIEWPORT_VW || + _unit == TokenKind.UNIT_VIEWPORT_VH || + _unit == TokenKind.UNIT_VIEWPORT_VMIN || + _unit == TokenKind.UNIT_VIEWPORT_VMAX); + } + + visit(VisitorBase visitor) => visitor.visitViewportTerm(this); +} + +/** Type to signal a bad hex value for HexColorTerm.value. */ +class BAD_HEX_VALUE { } + +class HexColorTerm extends LiteralTerm { + HexColorTerm(var value, String t, Span span) : super(value, t, span); + + visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); +} + +class FunctionTerm extends LiteralTerm { + final Expressions _params; + + FunctionTerm(var value, String t, this._params, Span span) + : super(value, t, span); + + visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); +} + +/** + * A "\9" was encountered at the end of the expression and before a semi-colon. + * This is an IE trick to ignore a property or value except by IE 8 and older + * browsers. + */ +class IE8Term extends LiteralTerm { + IE8Term(Span span) : super('\\9', '\\9', span); + visit(VisitorBase visitor) => visitor.visitIE8Term(this); +} + +class GroupTerm extends Expression { + final List _terms; + + GroupTerm(Span span) : _terms = [], super(span); + + add(LiteralTerm term) { + _terms.add(term); + } + + visit(VisitorBase visitor) => visitor.visitGroupTerm(this); +} + +class ItemTerm extends NumberTerm { + ItemTerm(var value, String t, Span span) : super(value, t, span); + + visit(VisitorBase visitor) => visitor.visitItemTerm(this); +} + +class Expressions extends Expression { + final List expressions = []; + + Expressions(Span span): super(span); + + add(Expression expression) { + expressions.add(expression); + } + + visit(VisitorBase visitor) => visitor.visitExpressions(this); +} + +class BinaryExpression extends Expression { + final Token op; + final Expression x; + final Expression y; + + BinaryExpression(this.op, this.x, this.y, Span span): super(span); + + visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); +} + +class UnaryExpression extends Expression { + final Token op; + final Expression self; + + UnaryExpression(this.op, this.self, Span span): super(span); + + visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); +} + +abstract class DartStyleExpression extends TreeNode { + static final int unknownType = 0; + static final int fontStyle = 1; + static final int marginStyle = 2; + static final int borderStyle = 3; + static final int paddingStyle = 4; + static final int heightStyle = 5; + static final int widthStyle = 6; + + final int _styleType; + int priority; + + DartStyleExpression(this._styleType, Span span) : super(span); + + /* + * Merges give 2 DartStyleExpression (or derived from DartStyleExpression, + * e.g., FontExpression, etc.) will merge if the two expressions are of the + * same property name (implies same exact type e.g, FontExpression). + */ + merged(DartStyleExpression newDartExpr); + + bool get isUnknown => _styleType == 0 || _styleType == null; + bool get isFont => _styleType == fontStyle; + bool get isMargin => _styleType == marginStyle; + bool get isBorder => _styleType == borderStyle; + bool get isPadding => _styleType == paddingStyle; + bool get isHeight => _styleType == heightStyle; + bool get isWidth => _styleType == widthStyle; + bool get isBoxExpression => isMargin || isBorder || isPadding; + + bool isSame(DartStyleExpression other) => this._styleType == other._styleType; + + visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); +} + +class FontExpression extends DartStyleExpression { + Font font; + + // font-style font-variant font-weight font-size/line-height font-family + FontExpression(Span span, {var size, Listfamily, + int weight, String style, String variant, LineHeight lineHeight}) + : super(DartStyleExpression.fontStyle, span) { + // TODO(terry): Only px/pt for now need to handle all possible units to + // support calc expressions on units. + font = new Font(size : size is LengthTerm ? size.value : size, + family: family, weight: weight, style: style, variant: variant, + lineHeight: lineHeight); + } + + merged(FontExpression newFontExpr) { + if (this.isFont && newFontExpr.isFont) { + return new FontExpression.merge(this, newFontExpr); + } + + return null; + } + + /** + * Merge the two FontExpression and return the result. + */ + factory FontExpression.merge(FontExpression x, FontExpression y) { + return new FontExpression._merge(x, y, y.span); + } + + FontExpression._merge(FontExpression x, FontExpression y, Span span) + : super(DartStyleExpression.fontStyle, span), + font = new Font.merge(x.font, y.font); + + visit(VisitorBase visitor) => visitor.visitFontExpression(this); +} + +abstract class BoxExpression extends DartStyleExpression { + final BoxEdge box; + + BoxExpression(int styleType, Span span, this.box) + : super(styleType, span); + + /* + * Merges give 2 DartStyleExpression (or derived from DartStyleExpression, + * e.g., FontExpression, etc.) will merge if the two expressions are of the + * same property name (implies same exact type e.g, FontExpression). + */ + merged(BoxExpression newDartExpr); + + visit(VisitorBase visitor) => visitor.visitBoxExpression(this); + + String get formattedBoxEdge { + if (box.top == box.left && box.top == box.bottom && + box.top== box.right) { + return '.uniform(${box.top})'; + } else { + var left = box.left == null ? 0 : box.left; + var top = box.top == null ? 0 : box.top; + var right = box.right == null ? 0 : box.right; + var bottom = box.bottom == null ? 0 : box.bottom; + return '.clockwiseFromTop($top,$right,$bottom,$left)'; + } + } +} + +class MarginExpression extends BoxExpression { + // TODO(terry): Does auto for margin need to be exposed to Dart UI framework? + /** Margin expression ripped apart. */ + MarginExpression(Span span, {num top, num right, num bottom, num left}) + : super(DartStyleExpression.marginStyle, span, + new BoxEdge(left, top, right, bottom)); + + MarginExpression.boxEdge(Span span, BoxEdge box) + : super(DartStyleExpression.marginStyle, span, box); + + merged(MarginExpression newMarginExpr) { + if (this.isMargin && newMarginExpr.isMargin) { + return new MarginExpression.merge(this, newMarginExpr); + } + + return null; + } + + /** + * Merge the two MarginExpressions and return the result. + */ + factory MarginExpression.merge(MarginExpression x, MarginExpression y) { + return new MarginExpression._merge(x, y, y.span); + } + + MarginExpression._merge(MarginExpression x, MarginExpression y, Span span) + : super(x._styleType, span, new BoxEdge.merge(x.box, y.box)); + + visit(VisitorBase visitor) => visitor.visitMarginExpression(this); +} + +class BorderExpression extends BoxExpression { + /** Border expression ripped apart. */ + BorderExpression(Span span, {num top, num right, num bottom, num left}) + : super(DartStyleExpression.borderStyle, span, + new BoxEdge(left, top, right, bottom)); + + BorderExpression.boxEdge(Span span, BoxEdge box) + : super(DartStyleExpression.borderStyle, span, box); + + merged(BorderExpression newBorderExpr) { + if (this.isBorder && newBorderExpr.isBorder) { + return new BorderExpression.merge(this, newBorderExpr); + } + + return null; + } + + /** + * Merge the two BorderExpression and return the result. + */ + factory BorderExpression.merge(BorderExpression x, BorderExpression y) { + return new BorderExpression._merge(x, y, y.span); + } + + BorderExpression._merge(BorderExpression x, BorderExpression y, + Span span) + : super(DartStyleExpression.borderStyle, span, + new BoxEdge.merge(x.box, y.box)); + + visit(VisitorBase visitor) => visitor.visitBorderExpression(this); +} + +class HeightExpression extends DartStyleExpression { + final height; + + HeightExpression(Span span, this.height) + : super(DartStyleExpression.heightStyle, span); + + merged(HeightExpression newHeightExpr) { + if (this.isHeight && newHeightExpr.isHeight) { + return newHeightExpr; + } + + return null; + } + + visit(VisitorBase visitor) => visitor.visitHeightExpression(this); +} + +class WidthExpression extends DartStyleExpression { + final width; + + WidthExpression(Span span, this.width) + : super(DartStyleExpression.widthStyle, span); + + merged(WidthExpression newWidthExpr) { + if (this.isWidth && newWidthExpr.isWidth) { + return newWidthExpr; + } + + return null; + } + + visit(VisitorBase visitor) => visitor.visitWidthExpression(this); +} + +class PaddingExpression extends BoxExpression { + /** Padding expression ripped apart. */ + PaddingExpression(Span span, {num top, num right, num bottom, num left}) + : super(DartStyleExpression.paddingStyle, span, + new BoxEdge(left, top, right, bottom)); + + PaddingExpression.boxEdge(Span span, BoxEdge box) + : super(DartStyleExpression.paddingStyle, span, box); + + merged(PaddingExpression newPaddingExpr) { + if (this.isPadding && newPaddingExpr.isPadding) { + return new PaddingExpression.merge(this, newPaddingExpr); + } + + return null; + } + + /** + * Merge the two PaddingExpression and return the result. + */ + factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) { + return new PaddingExpression._merge(x, y, y.span); + } + + PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span) + : super(DartStyleExpression.paddingStyle, span, + new BoxEdge.merge(x.box, y.box)); + + visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); +} diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart new file mode 100644 index 000000000..31411d6d0 --- /dev/null +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -0,0 +1,109 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of csslib.visitor; + +/** + * The base type for all nodes in a CSS abstract syntax tree. + */ +abstract class TreeNode { + /** The source code this [TreeNode] represents. */ + Span span; + + TreeNode(this.span) {} + + /** Classic double-dispatch visitor for implementing passes. */ + visit(VisitorBase visitor); + + /** A multiline string showing the node and its children. */ + String toDebugString() { + var to = new TreeOutput(); + var tp = new _TreePrinter(to, true); + this.visit(tp); + return to.buf.toString(); + } +} + +/** The base type for expressions. */ +abstract class Expression extends TreeNode { + Expression(Span span): super(span); +} + +/** Simple class to provide a textual dump of trees for debugging. */ +class TreeOutput { + int depth = 0; + final StringBuffer buf = new StringBuffer(); + var printer; + + void write(String s) { + for (int i=0; i < depth; i++) { + buf.write(' '); + } + buf.write(s); + } + + void writeln(String s) { + write(s); + buf.write('\n'); + } + + void heading(String name, [span]) { + write(name); + if (span != null) { + buf.write(' (${span.getLocationMessage('')})'); + } + buf.write('\n'); + } + + String toValue(value) { + if (value == null) return 'null'; + else if (value is Identifier) return value.name; + else return value.toString(); + } + + void writeNode(String label, TreeNode node) { + write('${label}: '); + depth += 1; + if (node != null) node.visit(printer); + else writeln('null'); + depth -= 1; + } + + void writeValue(String label, value) { + var v = toValue(value); + writeln('${label}: ${v}'); + } + + void writeList(String label, List list) { + write('${label}: '); + if (list == null) { + buf.write('null'); + buf.write('\n'); + } else { + for (var item in list) { + buf.write(item.toString()); + buf.write(', '); + } + buf.write('\n'); + } + } + + void writeNodeList(String label, List list) { + writeln('${label} ['); + if (list != null) { + depth += 1; + for (var node in list) { + if (node != null) { + node.visit(printer); + } else { + writeln('null'); + } + } + depth -= 1; + writeln(']'); + } + } + + String toString() => buf.toString(); +} diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart new file mode 100644 index 000000000..24cca64f1 --- /dev/null +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -0,0 +1,512 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of csslib.visitor; + +// TODO(terry): Enable class for debug only; when conditional imports enabled. + +/** Helper function to dump the CSS AST. */ +String treeToDebugString(styleSheet, [bool useSpan = false]) { + var to = new TreeOutput(); + new _TreePrinter(to, useSpan)..visitTree(styleSheet); + return to.toString(); +} + +/** Tree dump for debug output of the CSS AST. */ +class _TreePrinter extends Visitor { + var output; + final bool useSpan; + _TreePrinter(this.output, this.useSpan) { output.printer = this; } + + void visitTree(tree) => visitStylesheet(tree); + + void heading(String heading, node) { + if (useSpan) { + output.heading(heading, node.span); + } else { + output.heading(heading); + } + } + + void visitStylesheet(StyleSheet node) { + heading('Stylesheet', node); + output.depth++; + super.visitStyleSheet(node); + output.depth--; + } + + void visitTopLevelProduction(TopLevelProduction node) { + heading('TopLevelProduction', node); + } + + void visitDirective(Directive node) { + heading('Directive', node); + } + + void visitCssComment(CssComment node) { + heading('Comment', node); + output.depth++; + output.writeValue('comment value', node.comment); + output.depth--; + } + + void visitCommentDefinition(CommentDefinition node) { + heading('CommentDefinition (CDO/CDC)', node); + output.depth++; + output.writeValue('comment value', node.comment); + output.depth--; + } + + void visitMediaExpression(MediaExpression node) { + heading('MediaExpression', node); + output.writeValue('feature', node.mediaFeature); + if (node.andOperator) output.writeValue('AND operator', ''); + visitExpressions(node.exprs); + } + + void visitMediaQueries(MediaQuery query) { + output.headeing('MediaQueries'); + output.writeValue('unary', query.unary); + output.writeValue('media type', query.mediaType); + output.writeNodeList('media expressions', query.expressions); + } + + void visitMediaDirective(MediaDirective node) { + heading('MediaDirective', node); + output.depth++; + output.writeNodeList('media queries', node.mediaQueries); + output.writeNodeList('rule sets', node.rulesets); + super.visitMediaDirective(node); + output.depth--; + } + + void visitPageDirective(PageDirective node) { + heading('PageDirective', node); + output.depth++; + output.writeValue('pseudo page', node._pseudoPage); + super.visitPageDirective(node); + output.depth; + } + + void visitCharsetDirective(CharsetDirective node) { + heading('Charset Directive', node); + output.writeValue('charset encoding', node.charEncoding); + } + + void visitImportDirective(ImportDirective node) { + heading('ImportDirective', node); + output.depth++; + output.writeValue('import', node.import); + super.visitImportDirective(node); + output.writeNodeList('media', node.mediaQueries); + output.depth--; + } + + void visitKeyFrameDirective(KeyFrameDirective node) { + heading('KeyFrameDirective', node); + output.depth++; + output.writeValue('keyframe', node.keyFrameName); + output.writeValue('name', node._name); + output.writeNodeList('blocks', node._blocks); + output.depth--; + } + + void visitKeyFrameBlock(KeyFrameBlock node) { + heading('KeyFrameBlock', node); + output.depth++; + super.visitKeyFrameBlock(node); + output.depth--; + } + + void visitFontFaceDirective(FontFaceDirective node) { + // TODO(terry): To Be Implemented + } + + void visitStyletDirective(StyletDirective node) { + heading('StyletDirective', node); + output.writeValue('dartClassName', node._dartClassName); + output.depth++; + output.writeNodeList('rulesets', node._rulesets); + output.depth--; + } + + void visitNamespaceDirective(NamespaceDirective node) { + heading('NamespaceDirective', node); + output.depth++; + output.writeValue('prefix', node._prefix); + output.writeValue('uri', node._uri); + output.depth--; + } + + void visitVarDefinitionDirective(VarDefinitionDirective node) { + heading('Less variable definition', node); + visitVarDefinition(node.def); + } + + void visitRuleSet(RuleSet node) { + heading('Ruleset', node); + output.depth++; + super.visitRuleSet(node); + output.depth--; + } + + void visitDeclarationGroup(DeclarationGroup node) { + heading('DeclarationGroup', node); + output.depth++; + output.writeNodeList('declarations', node._declarations); + output.depth--; + } + + void visitMarginGroup(MarginGroup node) { + heading('MarginGroup', node); + output.depth++; + output.writeValue('@directive', node.margin_sym); + output.writeNodeList('declarations', node._declarations); + output.depth--; + } + + void visitDeclaration(Declaration node) { + heading('Declaration', node); + output.depth++; + if (node.isIE7) output.write('IE7 property'); + output.write('property'); + super.visitDeclaration(node); + output.writeNode('expression', node._expression); + if (node.important) { + output.writeValue('!important', 'true'); + } + output.depth--; + } + + void visitVarDefinition(VarDefinition node) { + heading('Var', node); + output.depth++; + output.write('defintion'); + super.visitVarDefinition(node); + output.writeNode('expression', node._expression); + output.depth--; + } + + void visitSelectorGroup(SelectorGroup node) { + heading('Selector Group', node); + output.depth++; + output.writeNodeList('selectors', node.selectors); + output.depth--; + } + + void visitSelector(Selector node) { + heading('Selector', node); + output.depth++; + output.writeNodeList('simpleSelectorsSequences', + node._simpleSelectorSequences); + output.depth--; + } + + void visitSimpleSelectorSequence(SimpleSelectorSequence node) { + heading('SimpleSelectorSequence', node); + output.depth++; + if (node.isCombinatorNone) { + output.writeValue('combinator', "NONE"); + } else if (node.isCombinatorDescendant) { + output.writeValue('combinator', "descendant"); + } else if (node.isCombinatorPlus) { + output.writeValue('combinator', "+"); + } else if (node.isCombinatorGreater) { + output.writeValue('combinator', ">"); + } else if (node.isCombinatorTilde) { + output.writeValue('combinator', "~"); + } else { + output.writeValue('combinator', "ERROR UNKNOWN"); + } + + super.visitSimpleSelectorSequence(node); + + output.depth--; + } + + void visitNamespaceSelector(NamespaceSelector node) { + heading('Namespace Selector', node); + output.depth++; + + super.visitNamespaceSelector(node); + + visitSimpleSelector(node.nameAsSimpleSelector); + output.depth--; + } + + void visitElementSelector(ElementSelector node) { + heading('Element Selector', node); + output.depth++; + super.visitElementSelector(node); + output.depth--; + } + + void visitAttributeSelector(AttributeSelector node) { + heading('AttributeSelector', node); + output.depth++; + super.visitAttributeSelector(node); + String tokenStr = node.matchOperatorAsTokenString(); + output.writeValue('operator', '${node.matchOperator()} (${tokenStr})'); + output.writeValue('value', node.valueToString()); + output.depth--; + } + + void visitIdSelector(IdSelector node) { + heading('Id Selector', node); + output.depth++; + super.visitIdSelector(node); + output.depth--; + } + + void visitClassSelector(ClassSelector node) { + heading('Class Selector', node); + output.depth++; + super.visitClassSelector(node); + output.depth--; + } + + void visitPseudoClassSelector(PseudoClassSelector node) { + heading('Pseudo Class Selector', node); + output.depth++; + super.visitPseudoClassSelector(node); + output.depth--; + } + + void visitPseudoElementSelector(PseudoElementSelector node) { + heading('Pseudo Element Selector', node); + output.depth++; + super.visitPseudoElementSelector(node); + output.depth--; + } + + void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { + heading('Pseudo Class Function Selector', node); + output.depth++; + visitSelectorExpression(node.expression); + super.visitPseudoClassFunctionSelector(node); + output.depth--; + } + + void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) { + heading('Pseudo Element Function Selector', node); + output.depth++; + visitSelectorExpression(node.expression); + super.visitPseudoElementFunctionSelector(node); + output.depth--; + } + + void visitSelectorExpression(SelectorExpression node) { + heading('Selector Expression', node); + output.depth++; + output.writeNodeList('expressions', node.expressions); + output.depth--; + } + + void visitNegationSelector(NegationSelector node) { + super.visitNegationSelector(node); + output.depth++; + heading('Negation Selector', node); + output.writeNode('Negation arg', node.negationArg); + output.depth--; + } + + void visitUnicodeRangeTerm(UnicodeRangeTerm node) { + heading('UnicodeRangeTerm', node); + output.depth++; + output.writeValue('1st value', node.first); + output.writeValue('2nd value', node.second); + output.depth--; + } + + void visitLiteralTerm(LiteralTerm node) { + heading('LiteralTerm', node); + output.depth++; + output.writeValue('value', node.text); + output.depth--; + } + + void visitHexColorTerm(HexColorTerm node) { + heading('HexColorTerm', node); + output.depth++; + output.writeValue('hex value', node.text); + output.writeValue('decimal value', node.value); + output.depth--; + } + + void visitNumberTerm(NumberTerm node) { + heading('NumberTerm', node); + output.depth++; + output.writeValue('value', node.text); + output.depth--; + } + + void visitUnitTerm(UnitTerm node) { + String unitValue; + + output.depth++; + output.writeValue('value', node.text); + output.writeValue('unit', node.unitToString()); + output.depth--; + } + + void visitLengthTerm(LengthTerm node) { + heading('LengthTerm', node); + super.visitLengthTerm(node); + } + + void visitPercentageTerm(PercentageTerm node) { + heading('PercentageTerm', node); + output.depth++; + super.visitPercentageTerm(node); + output.depth--; + } + + void visitEmTerm(EmTerm node) { + heading('EmTerm', node); + output.depth++; + super.visitEmTerm(node); + output.depth--; + } + + void visitExTerm(ExTerm node) { + heading('ExTerm', node); + output.depth++; + super.visitExTerm(node); + output.depth--; + } + + void visitAngleTerm(AngleTerm node) { + heading('AngleTerm', node); + super.visitAngleTerm(node); + } + + void visitTimeTerm(TimeTerm node) { + heading('TimeTerm', node); + super.visitTimeTerm(node); + } + + void visitFreqTerm(FreqTerm node) { + heading('FreqTerm', node); + super.visitFreqTerm(node); + } + + void visitFractionTerm(FractionTerm node) { + heading('FractionTerm', node); + output.depth++; + super.visitFractionTerm(node); + output.depth--; + } + + void visitUriTerm(UriTerm node) { + heading('UriTerm', node); + output.depth++; + super.visitUriTerm(node); + output.depth--; + } + + void visitFunctionTerm(FunctionTerm node) { + heading('FunctionTerm', node); + output.depth++; + super.visitFunctionTerm(node); + output.depth--; + } + + void visitGroupTerm(GroupTerm node) { + heading('GroupTerm', node); + output.depth++; + output.writeNodeList('grouped terms', node._terms); + output.depth--; + } + + void visitItemTerm(ItemTerm node) { + heading('ItemTerm', node); + super.visitItemTerm(node); + } + + void visitIE8Term(IE8Term node) { + heading('IE8Term', node); + visitLiteralTerm(node); + } + + void visitOperatorSlash(OperatorSlash node) { + heading('OperatorSlash', node); + } + + void visitOperatorComma(OperatorComma node) { + heading('OperatorComma', node); + } + + void visitOperatorPlus(OperatorPlus node) { + heading('OperatorPlus', node); + } + + void visitOperatorMinus(OperatorMinus node) { + heading('OperatorMinus', node); + } + + void visitVarUsage(VarUsage node) { + heading('Var', node); + output.depth++; + output.write('usage ${node.name}'); + output.writeNodeList('default values', node.defaultValues); + output.depth--; + } + + void visitExpressions(Expressions node) { + heading('Expressions', node); + output.depth++; + output.writeNodeList('expressions', node.expressions); + output.depth--; + } + + void visitBinaryExpression(BinaryExpression node) { + heading('BinaryExpression', node); + // TODO(terry): TBD + } + + void visitUnaryExpression(UnaryExpression node) { + heading('UnaryExpression', node); + // TODO(terry): TBD + } + + void visitIdentifier(Identifier node) { + heading('Identifier(${output.toValue(node.name)})', node); + } + + void visitWildcard(Wildcard node) { + heading('Wildcard(*)', node); + } + + void visitDartStyleExpression(DartStyleExpression node) { + heading('DartStyleExpression', node); + } + + void visitFontExpression(FontExpression node) { + heading('Dart Style FontExpression', node); + } + + void visitBoxExpression(BoxExpression node) { + heading('Dart Style BoxExpression', node); + } + + void visitMarginExpression(MarginExpression node) { + heading('Dart Style MarginExpression', node); + } + + void visitBorderExpression(BorderExpression node) { + heading('Dart Style BorderExpression', node); + } + + void visitHeightExpression(HeightExpression node) { + heading('Dart Style HeightExpression', node); + } + + void visitPaddingExpression(PaddingExpression node) { + heading('Dart Style PaddingExpression', node); + } + + void visitWidthExpression(WidthExpression node) { + heading('Dart Style WidthExpression', node); + } +} diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart new file mode 100644 index 000000000..d2301d79d --- /dev/null +++ b/pkgs/csslib/lib/src/validate.dart @@ -0,0 +1,135 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library csslib.src.validate; + +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; +import 'package:source_maps/span.dart' show Span; + +/** Can be thrown on any Css runtime problem includes source location. */ +class CssSelectorException implements Exception { + final String _message; + final Span _span; + + CssSelectorException(this._message, [this._span]); + + String toString() { + var msg = _span == null ? _message : _span.getLocationMessage(_message); + return 'CssSelectorException: $msg'; + } +} + +List classes = []; +List ids = []; + +class Validate { + static int _classNameCheck(var selector, int matches) { + if (selector.isCombinatorDescendant() || + (selector.isCombinatorNone() && matches == 0)) { + if (matches < 0) { + String tooMany = selector.simpleSelector.toString(); + throw new CssSelectorException( + 'Can not mix Id selector with class selector(s). Id ' + 'selector must be singleton too many starting at $tooMany'); + } + + return matches + 1; + } else { + String error = selector.toString(); + throw new CssSelectorException( + 'Selectors can not have combinators (>, +, or ~) before $error'); + } + } + + static int _elementIdCheck(var selector, int matches) { + if (selector.isCombinatorNone() && matches == 0) { + // Perfect just one element id returns matches of -1. + return -1; + } else if (selector.isCombinatorDescendant()) { + String tooMany = selector.simpleSelector.toString(); + throw new CssSelectorException( + 'Use of Id selector must be singleton starting at $tooMany'); + } else { + String error = selector.simpleSelector.toString(); + throw new CssSelectorException( + 'Selectors can not have combinators (>, +, or ~) before $error'); + } + } + + // Validate the @{css expression} only .class and #elementId are valid inside + // of @{...}. + static template(List selectors) { + var errorSelector; // signal which selector didn't match. + bool found = false; // signal if a selector is matched. + int matches = 0; // < 0 IdSelectors, > 0 ClassSelector + + // At most one selector group (any number of simple selector sequences). + assert(selectors.length <= 1); + + for (final sels in selectors) { + for (final selector in sels.simpleSelectorSequences) { + found = false; + var simpleSelector = selector.simpleSelector; + if (simpleSelector is ClassSelector) { + // Any class name starting with an underscore is a private class name + // that doesn't have to match the world of known classes. + if (!simpleSelector.name.startsWith('_')) { + // TODO(terry): For now iterate through all classes look for faster + // mechanism hash map, etc. + for (final className in classes) { + if (selector.simpleSelector.name == className) { + matches = _classNameCheck(selector, matches); + found = true; // .class found. + break; + } + for (final className2 in classes) { + print(className2); + } + } + + } else { + // Don't check any class name that is prefixed with an underscore. + // However, signal as found and bump up matches; it's a valid class + // name. + matches = _classNameCheck(selector, matches); + found = true; // ._class are always okay. + } + } else if (simpleSelector is IdSelector) { + // Any element id starting with an underscore is a private element id + // that doesn't have to match the world of known elemtn ids. + if (!simpleSelector.name.startsWith('_')) { + for (final id in ids) { + if (simpleSelector.name == id) { + matches = _elementIdCheck(selector, matches); + found = true; // #id found. + break; + } + } + } else { + // Don't check any element ID that is prefixed with an underscore. + // Signal as found and bump up matches; it's a valid element ID. + matches = _elementIdCheck(selector, matches); + found = true; // #_id are always okay + } + } else { + String badSelector = simpleSelector.toString(); + throw new CssSelectorException( + 'Invalid template selector $badSelector'); + } + + if (!found) { + String unknownName = simpleSelector.toString(); + throw new CssSelectorException('Unknown selector name $unknownName'); + } + } + } + + // Every selector must match. + Selector selector = selectors[0]; + assert((matches >= 0 ? matches : -matches) == + selector.simpleSelectorSequences.length); + } +} + diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart new file mode 100644 index 000000000..d2f24c9b6 --- /dev/null +++ b/pkgs/csslib/lib/visitor.dart @@ -0,0 +1,445 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library csslib.visitor; + +import 'package:source_maps/span.dart' show Span; +import 'parser.dart'; + +part 'src/css_printer.dart'; +part 'src/tree.dart'; +part 'src/tree_base.dart'; +part 'src/tree_printer.dart'; + +abstract class VisitorBase { + void visitCssComment(CssComment node); + void visitCommentDefinition(CommentDefinition node); + void visitStyleSheet(StyleSheet node); + void visitTopLevelProduction(TopLevelProduction node); + void visitDirective(Directive node); + void visitMediaExpression(MediaExpression node); + void visitMediaQuery(MediaQuery node); + void visitMediaDirective(MediaDirective node); + void visitHostDirective(HostDirective node); + void visitPageDirective(PageDirective node); + void visitCharsetDirective(CharsetDirective node); + void visitImportDirective(ImportDirective node); + void visitKeyFrameDirective(KeyFrameDirective node); + void visitKeyFrameBlock(KeyFrameBlock node); + void visitFontFaceDirective(FontFaceDirective node); + void visitStyletDirective(StyletDirective node); + void visitNamespaceDirective(NamespaceDirective node); + void visitVarDefinitionDirective(VarDefinitionDirective node); + + void visitRuleSet(RuleSet node); + void visitDeclarationGroup(DeclarationGroup node); + void visitMarginGroup(DeclarationGroup node); + void visitDeclaration(Declaration node); + void visitVarDefinition(VarDefinition node); + void visitSelectorGroup(SelectorGroup node); + void visitSelector(Selector node); + void visitSimpleSelectorSequence(SimpleSelectorSequence node); + void visitSimpleSelector(SimpleSelector node); + void visitElementSelector(ElementSelector node); + void visitNamespaceSelector(NamespaceSelector node); + void visitAttributeSelector(AttributeSelector node); + void visitIdSelector(IdSelector node); + void visitClassSelector(ClassSelector node); + void visitPseudoClassSelector(PseudoClassSelector node); + void visitPseudoElementSelector(PseudoElementSelector node); + void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node); + void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node); + void visitNegationSelector(NegationSelector node); + void visitSelectorExpression(SelectorExpression node); + + void visitUnicodeRangeTerm(UnicodeRangeTerm node); + void visitLiteralTerm(LiteralTerm node); + void visitHexColorTerm(HexColorTerm node); + void visitNumberTerm(NumberTerm node); + void visitUnitTerm(UnitTerm node); + void visitLengthTerm(LengthTerm node); + void visitPercentageTerm(PercentageTerm node); + void visitEmTerm(EmTerm node); + void visitExTerm(ExTerm node); + void visitAngleTerm(AngleTerm node); + void visitTimeTerm(TimeTerm node); + void visitFreqTerm(FreqTerm node); + void visitFractionTerm(FractionTerm node); + void visitUriTerm(UriTerm node); + void visitResolutionTerm(ResolutionTerm node); + void visitChTerm(ChTerm node); + void visitRemTerm(RemTerm node); + void visitViewportTerm(ViewportTerm node); + void visitFunctionTerm(FunctionTerm node); + void visitGroupTerm(GroupTerm node); + void visitItemTerm(ItemTerm node); + void visitIE8Term(IE8Term node); + void visitOperatorSlash(OperatorSlash node); + void visitOperatorComma(OperatorComma node); + void visitOperatorPlus(OperatorPlus node); + void visitOperatorMinus(OperatorMinus node); + void visitVarUsage(VarUsage node); + + void visitExpressions(Expressions node); + void visitBinaryExpression(BinaryExpression node); + void visitUnaryExpression(UnaryExpression node); + + void visitIdentifier(Identifier node); + void visitWildcard(Wildcard node); + void visitThisOperator(ThisOperator node); + void visitNegation(Negation node); + + void visitDartStyleExpression(DartStyleExpression node); + void visitFontExpression(FontExpression node); + void visitBoxExpression(BoxExpression node); + void visitMarginExpression(MarginExpression node); + void visitBorderExpression(BorderExpression node); + void visitHeightExpression(HeightExpression node); + void visitPaddingExpression(PaddingExpression node); + void visitWidthExpression(WidthExpression node); +} + +/** Base vistor class for the style sheet AST. */ +class Visitor implements VisitorBase { + /** Helper function to walk a list of nodes. */ + void _visitNodeList(list) { + // Don't use iterable otherwise the list can't grow while using Visitor. + // It certainly can't have items deleted before the index being iterated + // but items could be added after the index. + for (var index = 0; index < list.length; index++) { + list[index].visit(this); + } + } + + void visitTree(StyleSheet tree) => visitStyleSheet(tree); + + void visitStyleSheet(StyleSheet ss) { + _visitNodeList(ss.topLevels); + } + + void visitTopLevelProduction(TopLevelProduction node) { } + + void visitDirective(Directive node) { } + + void visitCssComment(CssComment node) { } + + void visitCommentDefinition(CommentDefinition node) { } + + void visitMediaExpression(MediaExpression node) { + visitExpressions(node.exprs); + } + + void visitMediaQuery(MediaQuery node) { + for (var mediaExpr in node.expressions) { + visitMediaExpression(mediaExpr); + } + } + + void visitMediaDirective(MediaDirective node) { + for (var mediaQuery in node.mediaQueries) { + visitMediaQuery(mediaQuery); + } + for (var ruleset in node.rulesets) { + visitRuleSet(ruleset); + } + } + + void visitHostDirective(HostDirective node) { + for (var ruleset in node.rulesets) { + visitRuleSet(ruleset); + } + } + + void visitPageDirective(PageDirective node) { + for (var declGroup in node._declsMargin) { + if (declGroup is MarginGroup) { + visitMarginGroup(declGroup); + } else { + visitDeclarationGroup(declGroup); + } + } + } + + void visitCharsetDirective(CharsetDirective node) { } + + void visitImportDirective(ImportDirective node) { + for (var mediaQuery in node.mediaQueries) { + visitMediaQuery(mediaQuery); + } + } + + void visitKeyFrameDirective(KeyFrameDirective node) { + visitIdentifier(node._name); + _visitNodeList(node._blocks); + } + + void visitKeyFrameBlock(KeyFrameBlock node) { + visitExpressions(node._blockSelectors); + visitDeclarationGroup(node._declarations); + } + + void visitFontFaceDirective(FontFaceDirective node) { + visitDeclarationGroup(node._declarations); + } + + void visitStyletDirective(StyletDirective node) { + _visitNodeList(node._rulesets); + } + + void visitNamespaceDirective(NamespaceDirective node) { } + + void visitVarDefinitionDirective(VarDefinitionDirective node) { + visitVarDefinition(node.def); + } + + void visitRuleSet(RuleSet node) { + visitSelectorGroup(node._selectorGroup); + visitDeclarationGroup(node._declarationGroup); + } + + void visitDeclarationGroup(DeclarationGroup node) { + _visitNodeList(node._declarations); + } + + void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); + + void visitDeclaration(Declaration node) { + visitIdentifier(node._property); + if (node._expression != null) node._expression.visit(this); + } + + void visitVarDefinition(VarDefinition node) { + visitIdentifier(node._property); + if (node._expression != null) node._expression.visit(this); + } + + void visitSelectorGroup(SelectorGroup node) { + _visitNodeList(node.selectors); + } + + void visitSelector(Selector node) { + _visitNodeList(node._simpleSelectorSequences); + } + + void visitSimpleSelectorSequence(SimpleSelectorSequence node) { + var selector = node._selector; + if (selector is NamespaceSelector) { + visitNamespaceSelector(selector); + } else if (selector is ElementSelector) { + visitElementSelector(selector); + } else if (selector is IdSelector) { + visitIdSelector(selector); + } else if (selector is ClassSelector) { + visitClassSelector(selector); + } else if (selector is PseudoClassFunctionSelector) { + visitPseudoClassFunctionSelector(selector); + } else if (selector is PseudoElementFunctionSelector) { + visitPseudoElementFunctionSelector(selector); + } else if (selector is PseudoClassSelector) { + visitPseudoClassSelector(selector); + } else if (selector is PseudoElementSelector) { + visitPseudoElementSelector(selector); + } else if (selector is NegationSelector) { + visitNegationSelector(selector); + } else if (selector is SelectorExpression) { + visitSelectorExpression(selector); + } else if (selector is AttributeSelector) { + visitAttributeSelector(selector); + } else { + visitSimpleSelector(selector); + } + } + + void visitSimpleSelector(SimpleSelector node) => node._name.visit(this); + + void visitNamespaceSelector(NamespaceSelector node) { + var namespace = node._namespace; + if (namespace is Identifier) { + visitIdentifier(namespace); + } else if (namespace is Wildcard) { + visitWildcard(namespace); + } + + visitSimpleSelector(node.nameAsSimpleSelector); + } + + void visitElementSelector(ElementSelector node) => visitSimpleSelector(node); + + void visitAttributeSelector(AttributeSelector node) { + visitSimpleSelector(node); + } + + void visitIdSelector(IdSelector node) => visitSimpleSelector(node); + + void visitClassSelector(ClassSelector node) => visitSimpleSelector(node); + + void visitPseudoClassSelector(PseudoClassSelector node) => + visitSimpleSelector(node); + + void visitPseudoElementSelector(PseudoElementSelector node) => + visitSimpleSelector(node); + + void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) => + visitSimpleSelector(node); + + void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) => + visitSimpleSelector(node); + + void visitNegationSelector(NegationSelector node) => + visitSimpleSelector(node); + + void visitSelectorExpression(SelectorExpression node) { + _visitNodeList(node._expressions); + } + + void visitUnicodeRangeTerm(UnicodeRangeTerm node) { } + + void visitLiteralTerm(LiteralTerm node) { } + + void visitHexColorTerm(HexColorTerm node) { } + + void visitNumberTerm(NumberTerm node) { } + + void visitUnitTerm(UnitTerm node) { } + + void visitLengthTerm(LengthTerm node) { + visitUnitTerm(node); + } + + void visitPercentageTerm(PercentageTerm node) { + visitLiteralTerm(node); + } + + void visitEmTerm(EmTerm node) { + visitLiteralTerm(node); + } + + void visitExTerm(ExTerm node) { + visitLiteralTerm(node); + } + + void visitAngleTerm(AngleTerm node) { + visitUnitTerm(node); + } + + void visitTimeTerm(TimeTerm node) { + visitUnitTerm(node); + } + + void visitFreqTerm(FreqTerm node) { + visitUnitTerm(node); + } + + void visitFractionTerm(FractionTerm node) { + visitLiteralTerm(node); + } + + void visitUriTerm(UriTerm node) { + visitLiteralTerm(node); + } + + void visitResolutionTerm(ResolutionTerm node) { + visitUnitTerm(node); + } + + void visitChTerm(ChTerm node) { + visitUnitTerm(node); + } + + void visitRemTerm(RemTerm node) { + visitUnitTerm(node); + } + + void visitViewportTerm(ViewportTerm node) { + visitUnitTerm(node); + } + + void visitFunctionTerm(FunctionTerm node) { + visitLiteralTerm(node); + visitExpressions(node._params); + } + + void visitGroupTerm(GroupTerm node) { + for (var term in node._terms) { + term.visit(this); + } + } + + void visitItemTerm(ItemTerm node) { + visitNumberTerm(node); + } + + void visitIE8Term(IE8Term node) { } + + void visitOperatorSlash(OperatorSlash node) { } + + void visitOperatorComma(OperatorComma node) { } + + void visitOperatorPlus(OperatorPlus node) { } + + void visitOperatorMinus(OperatorMinus node) { } + + void visitVarUsage(VarUsage node) { + _visitNodeList(node.defaultValues); + } + + void visitExpressions(Expressions node) { + _visitNodeList(node.expressions); + } + + void visitBinaryExpression(BinaryExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } + + void visitUnaryExpression(UnaryExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } + + void visitIdentifier(Identifier node) { } + + void visitWildcard(Wildcard node) { } + + void visitThisOperator(ThisOperator node) { } + + void visitNegation(Negation node) { } + + void visitDartStyleExpression(DartStyleExpression node) { } + + void visitFontExpression(FontExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } + + void visitBoxExpression(BoxExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } + + void visitMarginExpression(MarginExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } + + void visitBorderExpression(BorderExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } + + void visitHeightExpression(HeightExpression node) { + // TODO(terry): TB + throw UnimplementedError; + } + + void visitPaddingExpression(PaddingExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } + + void visitWidthExpression(WidthExpression node) { + // TODO(terry): TBD + throw UnimplementedError; + } +} diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml new file mode 100644 index 000000000..b82194155 --- /dev/null +++ b/pkgs/csslib/pubspec.yaml @@ -0,0 +1,12 @@ +name: csslib +author: "Web UI Team " +description: A library for parsing CSS. +homepage: https://www.dartlang.org +dependencies: + args: any + logging: any + path: any + source_maps: any +dev_dependencies: + browser: any + unittest: any diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart new file mode 100644 index 000000000..ee37f299e --- /dev/null +++ b/pkgs/csslib/test/compiler_test.dart @@ -0,0 +1,728 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library compiler_test; + +import 'dart:utf'; +import 'package:unittest/unittest.dart'; +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; +import 'testing.dart'; + +void testClass() { + var errors = []; + var input = ".foobar {}"; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + + var ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + var selectorSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + expect(selectorSeqs.length, 1); + final simpSelector = selectorSeqs[0].simpleSelector; + expect(simpSelector is ClassSelector, true); + expect(selectorSeqs[0].isCombinatorNone, true); + expect(simpSelector.name, "foobar"); +} + +void testClass2() { + var errors = []; + var input = ".foobar .bar .no-story {}"; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + var ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + expect(simpleSeqs.length, 3); + + var simpSelector0 = simpleSeqs[0].simpleSelector; + expect(simpSelector0 is ClassSelector, true); + expect(simpleSeqs[0].isCombinatorNone, true); + expect(simpSelector0.name, "foobar"); + + var simpSelector1 = simpleSeqs[1].simpleSelector; + expect(simpSelector1 is ClassSelector, true); + expect(simpleSeqs[1].isCombinatorDescendant, true); + expect(simpSelector1.name, "bar"); + + var simpSelector2 = simpleSeqs[2].simpleSelector; + expect(simpSelector2 is ClassSelector, true); + expect(simpleSeqs[2].isCombinatorDescendant, true); + expect(simpSelector2.name, "no-story"); +} + +void testId() { + var errors = []; + var input = "#elemId {}"; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + var ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 1); + var simpSelector = simpleSeqs[0].simpleSelector; + expect(simpSelector is IdSelector, true); + expect(simpleSeqs[0].isCombinatorNone, true); + expect(simpSelector.name, "elemId"); +} + +void testElement() { + var errors = []; + var input = "div {}"; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + var ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 1); + + final simpSelector = simpleSeqs[0].simpleSelector; + expect(simpSelector is ElementSelector, true); + expect(simpleSeqs[0].isCombinatorNone, true); + expect(simpSelector.name, "div"); + + input = "div div span {}"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 3); + + var simpSelector0 = simpleSeqs[0].simpleSelector; + expect(simpSelector0 is ElementSelector, true); + expect(simpleSeqs[0].isCombinatorNone, true); + expect(simpSelector0.name, "div"); + + var simpSelector1 = simpleSeqs[1].simpleSelector; + expect(simpSelector1 is ElementSelector, true); + expect(simpleSeqs[1].isCombinatorDescendant, true); + expect(simpSelector1.name, "div"); + + var simpSelector2 = simpleSeqs[2].simpleSelector; + expect(simpSelector2 is ElementSelector, true); + expect(simpleSeqs[2].isCombinatorDescendant, true); + expect(simpSelector2.name, "span"); +} + +void testNamespace() { + var errors = []; + var input = "ns1|div {}"; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + var ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 1); + var simpSelector = simpleSeqs[0].simpleSelector; + expect(simpSelector is NamespaceSelector, true); + expect(simpleSeqs[0].isCombinatorNone, true); + expect(simpSelector.isNamespaceWildcard, false); + expect(simpSelector.namespace, "ns1"); + var elementSelector = simpSelector.nameAsSimpleSelector; + expect(elementSelector is ElementSelector, true); + expect(elementSelector.isWildcard, false); + expect(elementSelector.name, "div"); +} + +void testNamespace2() { + var errors = []; + var input = "ns1|div div ns2|span .foobar {}"; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + var ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 4); + + var simpSelector0 = simpleSeqs[0].simpleSelector; + expect(simpSelector0 is NamespaceSelector, true); + expect(simpleSeqs[0].isCombinatorNone, true); + expect(simpSelector0.namespace, "ns1"); + var elementSelector0 = simpSelector0.nameAsSimpleSelector; + expect(elementSelector0 is ElementSelector, true); + expect(elementSelector0.isWildcard, false); + expect(elementSelector0.name, "div"); + + var simpSelector1 = simpleSeqs[1].simpleSelector; + expect(simpSelector1 is ElementSelector, true); + expect(simpleSeqs[1].isCombinatorDescendant, true); + expect(simpSelector1.name, "div"); + + var simpSelector2 = simpleSeqs[2].simpleSelector; + expect(simpSelector2 is NamespaceSelector, true); + expect(simpleSeqs[2].isCombinatorDescendant, true); + expect(simpSelector2.namespace, "ns2"); + var elementSelector2 = simpSelector2.nameAsSimpleSelector; + expect(elementSelector2 is ElementSelector, true); + expect(elementSelector2.isWildcard, false); + expect(elementSelector2.name, "span"); + + var simpSelector3 = simpleSeqs[3].simpleSelector; + expect(simpSelector3 is ClassSelector, true); + expect(simpleSeqs[3].isCombinatorDescendant, true); + expect(simpSelector3.name, "foobar"); +} + +void testSelectorGroups() { + var errors = []; + var input = + "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}"; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + var ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 5); + expect(ruleset.declarationGroup.declarations.length, 0); + + var groupSelector0 = ruleset.selectorGroup.selectors[0]; + expect(groupSelector0.simpleSelectorSequences.length, 1); + var selector0 = groupSelector0.simpleSelectorSequences[0]; + var simpleSelector0 = selector0.simpleSelector; + expect(simpleSelector0 is ElementSelector, true); + expect(selector0.isCombinatorNone, true); + expect(simpleSelector0.name, "div"); + + var groupSelector1 = ruleset.selectorGroup.selectors[1]; + expect(groupSelector1.simpleSelectorSequences.length, 1); + var selector1 = groupSelector1.simpleSelectorSequences[0]; + var simpleSelector1 = selector1.simpleSelector; + expect(simpleSelector1 is ClassSelector, true); + expect(selector1.isCombinatorNone, true); + expect(simpleSelector1.name, "foobar"); + + var groupSelector2 = ruleset.selectorGroup.selectors[2]; + expect(groupSelector2.simpleSelectorSequences.length, 1); + var selector2 = groupSelector2.simpleSelectorSequences[0]; + var simpleSelector2 = selector2.simpleSelector; + expect(simpleSelector2 is IdSelector, true); + expect(selector2.isCombinatorNone, true); + expect(simpleSelector2.name, "elemId"); + + var groupSelector3 = ruleset.selectorGroup.selectors[3]; + expect(groupSelector3.simpleSelectorSequences.length, 2); + + var selector30 = groupSelector3.simpleSelectorSequences[0]; + var simpleSelector30 = selector30.simpleSelector; + expect(simpleSelector30 is ClassSelector, true); + expect(selector30.isCombinatorNone, true); + expect(simpleSelector30.name, "xyzzy"); + + var selector31 = groupSelector3.simpleSelectorSequences[1]; + var simpleSelector31 = selector31.simpleSelector; + expect(simpleSelector31 is ClassSelector, true); + expect(selector31.isCombinatorDescendant, true); + expect(simpleSelector31.name, "test"); + + var groupSelector4 = ruleset.selectorGroup.selectors[4]; + expect(groupSelector4.simpleSelectorSequences.length, 4); + + var selector40 = groupSelector4.simpleSelectorSequences[0]; + var simpleSelector40 = selector40.simpleSelector; + expect(simpleSelector40 is NamespaceSelector, true); + expect(selector40.isCombinatorNone, true); + expect(simpleSelector40.namespace, "ns1"); + var elementSelector = simpleSelector40.nameAsSimpleSelector; + expect(elementSelector is ElementSelector, true); + expect(elementSelector.isWildcard, false); + expect(elementSelector.name, "div"); + + var selector41 = groupSelector4.simpleSelectorSequences[1]; + var simpleSelector41 = selector41.simpleSelector; + expect(simpleSelector41 is ElementSelector, true); + expect(selector41.isCombinatorDescendant, true); + expect(simpleSelector41.name, "div"); + + var selector42 = groupSelector4.simpleSelectorSequences[2]; + var simpleSelector42 = selector42.simpleSelector; + expect(simpleSelector42 is IdSelector, true); + expect(selector42.isCombinatorDescendant, true); + expect(simpleSelector42.name, "elemId"); + + var selector43 = groupSelector4.simpleSelectorSequences[3]; + var simpleSelector43 = selector43.simpleSelector; + expect(selector43.isCombinatorDescendant, true); + expect(simpleSelector43.name, "foobar"); +} + +void testCombinator() { + var errors = []; + var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}"; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + var ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 5); + + var selector0 = simpleSeqs[0]; + var simpleSelector0 = selector0.simpleSelector; + expect(simpleSelector0 is ClassSelector, true); + expect(selector0.isCombinatorNone, true); + expect(simpleSelector0.name, "foobar"); + + var selector1 = simpleSeqs[1]; + var simpleSelector1 = selector1.simpleSelector; + expect(simpleSelector1 is ClassSelector, true); + expect(selector1.isCombinatorGreater, true); + expect(simpleSelector1.name, "bar"); + + var selector2 = simpleSeqs[2]; + var simpleSelector2 = selector2.simpleSelector; + expect(simpleSelector2 is ClassSelector, true); + expect(selector2.isCombinatorPlus, true); + expect(simpleSelector2.name, "no-story"); + + var selector3 = simpleSeqs[3]; + var simpleSelector3 = selector3.simpleSelector; + expect(simpleSelector3 is NamespaceSelector, true); + expect(selector3.isCombinatorTilde, true); + expect(simpleSelector3.namespace, "myNs"); + var elementSelector = simpleSelector3.nameAsSimpleSelector; + expect(elementSelector is ElementSelector, true); + expect(elementSelector.isWildcard, false); + expect(elementSelector.name, "div"); + + var selector4 = simpleSeqs[4]; + var simpleSelector4 = selector4.simpleSelector; + expect(simpleSelector4 is IdSelector, true); + expect(selector4.isCombinatorDescendant, true); + expect(simpleSelector4.name, "elemId"); +} + +void testWildcard() { + var errors = []; + var input = "* {}"; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + var ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 1); + var simpSelector = simpleSeqs[0].simpleSelector; + expect(simpSelector is ElementSelector, true); + expect(simpleSeqs[0].isCombinatorNone, true); + expect(simpSelector.isWildcard, true); + expect(simpSelector.name, "*"); + + input = "*.foobar {}"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 2); + + var selector0 = simpleSeqs[0]; + var simpleSelector0 = selector0.simpleSelector; + expect(simpleSelector0 is ElementSelector, true); + expect(selector0.isCombinatorNone, true); + expect(simpleSelector0.isWildcard, true); + expect(simpleSelector0.name, "*"); + + var selector1 = simpleSeqs[1]; + var simpleSelector1 = selector1.simpleSelector; + expect(simpleSelector1 is ClassSelector, true); + expect(selector1.isCombinatorNone, true); + expect(simpleSelector1.name, "foobar"); + + input = "myNs|*.foobar {}"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels.length, 1); + + expect(stylesheet.topLevels[0] is RuleSet, true); + ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 2); + + selector0 = simpleSeqs[0]; + simpleSelector0 = selector0.simpleSelector; + expect(simpleSelector0 is NamespaceSelector, true); + expect(selector0.isCombinatorNone, true); + expect(simpleSelector0.isNamespaceWildcard, false); + var elementSelector = simpleSelector0.nameAsSimpleSelector; + expect("myNs", simpleSelector0.namespace); + expect(elementSelector.isWildcard, true); + expect("*", elementSelector.name); + + selector1 = simpleSeqs[1]; + simpleSelector1 = selector1.simpleSelector; + expect(simpleSelector1 is ClassSelector, true); + expect(selector1.isCombinatorNone, true); + expect("foobar", simpleSelector1.name); + + input = "*|*.foobar {}"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(stylesheet.topLevels[0] is RuleSet, true); + ruleset = stylesheet.topLevels[0]; + expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.declarationGroup.declarations.length, 0); + + simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + + expect(simpleSeqs.length, 2); + + selector0 = simpleSeqs[0]; + simpleSelector0 = selector0.simpleSelector; + expect(simpleSelector0 is NamespaceSelector, true); + expect(selector0.isCombinatorNone, true); + expect(simpleSelector0.isNamespaceWildcard, true); + expect("*", simpleSelector0.namespace); + elementSelector = simpleSelector0.nameAsSimpleSelector; + expect(elementSelector.isWildcard, true); + expect("*", elementSelector.name); + + selector1 = simpleSeqs[1]; + simpleSelector1 = selector1.simpleSelector; + expect(simpleSelector1 is ClassSelector, true); + expect(selector1.isCombinatorNone, true); + expect("foobar", simpleSelector1.name); +} + +/** Test List as input to parser. */ +void testArrayOfChars() { + var errors = []; + var input = ''; + + var stylesheet = parse(encodeUtf8(input), errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + expect(prettyPrint(stylesheet), r''' +.foo { + color: #f00; + left: 20px; + top: 20px; + width: 100px; + height: 200px; +} +#div { + color: #00F578; + border-color: #878787; +}'''); +} + +void testPseudo() { + var errors = []; + + final input = r''' +html:lang(fr-ca) { quotes: '" ' ' "' } +zoom: { } + +a:link { color: red } +:link { color: blue } + +a:focus { background: yellow } +a:focus:hover { background: white } + +p.special:first-letter {color: #ffd800} + +p:not(#example){ + background-color: yellow; +} + +input:not([DISABLED]){ + background-color: yellow; +} + +html|*:not(:link):not(:visited) { + border: 1px solid black; +} + +*:not(FOO) { + height: 20px; +} + +*|*:not(*) { + color: orange; +} + +*|*:not(:hover) { + color: magenta; +} + +p:nth-child(3n-3) { } + +div:nth-child(2n) { color : red; } +'''; + + var stylesheet = parseCss(input, errors: errors, + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), r''' +html:lang(fr-ca) { + quotes: "\" " " \""; +} +zoom { +} +a:link { + color: #f00; +} +:link { + color: #00f; +} +a:focus { + background: #ff0; +} +a:focus:hover { + background: #fff; +} +p.special:first-letter { + color: #ffd800; +} +p:not(#example) { + background-color: #ff0; +} +input:not([DISABLED]) { + background-color: #ff0; +} +html|*:not(:link):not(:visited) { + border: 1px solid #000; +} +*:not(FOO) { + height: 20px; +} +*|*:not(*) { + color: #ffa500; +} +*|*:not(:hover) { + color: #f0f; +} +p:nth-child(3n-3) { +} +div:nth-child(2n) { + color: #f00; +}'''); +} + +void testAttribute() { + // TODO(terry): Implement +} + +void testNegation() { + // TODO(terry): Implement +} + +void testHost() { + var errors = []; + var input = '@host { ' + ':scope {' + 'white-space: nowrap;' + 'overflow-style: marquee-line;' + 'overflow-x: marquee;' + '}' + '* { color: red; }' + '*:hover { font-weight: bold; }' + ':nth-child(odd) { color: blue; }' + '}'; + var stylesheet = parseCss(input, errors: errors, + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), r''' +@host { +:scope { + white-space: nowrap; + overflow-style: marquee-line; + overflow-x: marquee; +} +* { + color: #f00; +} +*:hover { + font-weight: bold; +} +:nth-child(odd) { + color: #00f; +} +}'''); +} + +// TODO(terry): Move to emitter_test.dart when real emitter exist. +void testEmitter() { + var errors = []; + var input = '.foo { ' + 'color: red; left: 20px; top: 20px; width: 100px; height:200px' + '}' + '#div {' + 'color : #00F578; border-color: #878787;' + '}'; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(prettyPrint(stylesheet), r''' +.foo { + color: #f00; + left: 20px; + top: 20px; + width: 100px; + height: 200px; +} +#div { + color: #00F578; + border-color: #878787; +}'''); +} + +main() { + test('Classes', testClass); + test('Classes 2', testClass2); + test('Ids', testId); + test('Elements', testElement); + test('Namespace', testNamespace); + test('Namespace 2', testNamespace2); + test('Selector Groups', testSelectorGroups); + test('Combinator', testCombinator); + test('Wildcards', testWildcard); + test('Pseudo', testPseudo); + test('Attributes', testAttribute); + test('Negation', testNegation); + test('@host', testHost); + test('Parse List as input', testArrayOfChars); + test('Simple Emitter', testEmitter); +} diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart new file mode 100644 index 000000000..3d6912cd0 --- /dev/null +++ b/pkgs/csslib/test/declaration_test.dart @@ -0,0 +1,1036 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library declaration_test; + +import 'package:unittest/unittest.dart'; +import 'testing.dart'; +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; + + +/** CSS compiler options no checks in in memory style sheet. */ +List options = ['--no-colors', 'memory']; + +void testSimpleTerms() { + var errors = []; + final String input = r''' +@ import url("test.css"); +.foo { + background-color: #191919; + width: 10PX; + height: 22mM !important; + border-width: 20cm; + margin-width: 33%; + border-height: 30EM; + width: .6in; + length: 1.2in; + -web-stuff: -10Px; +}'''; + final String generated = r''' +@import "test.css"; +.foo { + background-color: #191919; + width: 10px; + height: 22mm !important; + border-width: 20cm; + margin-width: 33%; + border-height: 30em; + width: .6in; + length: 1.2in; + -web-stuff: -10px; +}'''; + + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + final String input2 = r''' +* { + border-color: green; +}'''; + final String generated2 = r''' +* { + border-color: #008000; +}'''; + + stylesheet = parseCss(input2, errors: errors..clear()); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated2); +} + +/** + * Declarations with comments, references with single-quotes, double-quotes, + * no quotes. Hex values with # and letters, and functions (rgba, url, etc.) + */ +void testDeclarations() { + var errors = []; + final String input = r''' +.more { + color: white; + color: black; + color: cyan; + color: red; + color: #aabbcc; /* test -- 3 */ + color: blue; + background-image: url(http://test.jpeg); + background-image: url("http://double_quote.html"); + background-image: url('http://single_quote.html'); + color: rgba(10,20,255); + color: #123aef; /* hex # part integer and part identifier */ +}'''; + final String generated = r''' +.more { + color: #fff; + color: #000; + color: #0ff; + color: #f00; + color: #abc; + color: #00f; + background-image: url("http://test.jpeg"); + background-image: url("http://double_quote.html"); + background-image: url("http://single_quote.html"); + color: rgba(10, 20, 255); + color: #123aef; +}'''; + + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void testIdentifiers() { + var errors = []; + final String input = r''' +#da { + height: 100px; +} +#foo { + width: 10px; + color: #ff00cc; +} +'''; + final String generated = r''' +#da { + height: 100px; +} +#foo { + width: 10px; + color: #f0c; +}'''; + + var stylesheet = parseCss(input, errors: errors); + + expect(errors.isEmpty, true, reason: errors.toString()); + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), generated); +} + +void testComposites() { + var errors = []; + final String input = r''' +.xyzzy { + border: 10px 80px 90px 100px; + width: 99%; +} +@-webkit-keyframes pulsate { + 0% { + -webkit-transform: translate3d(0, 0, 0) scale(1.0); + } +}'''; + final String generated = r''' +.xyzzy { + border: 10px 80px 90px 100px; + width: 99%; +} +@-webkit-keyframes pulsate { + 0% { + -webkit-transform: translate3d(0, 0, 0) scale(1.0); + } +}'''; + + var stylesheet = parseCss(input, errors: errors); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void testUnits() { + var errors = []; + final String input = r''' +#id-1 { + transition: color 0.4s; + animation-duration: 500ms; + top: 1em; + left: 200ex; + right: 300px; + bottom: 400cm; + border-width: 2.5mm; + margin-top: .5in; + margin-left: 5pc; + margin-right: 5ex; + margin-bottom: 5ch; + font-size: 10pt; + padding-top: 22rem; + padding-left: 33vw; + padding-right: 34vh; + padding-bottom: 3vmin; + transform: rotate(20deg); + voice-pitch: 10hz; +} +#id-2 { + left: 2fr; + font-size: 10vmax; + transform: rotatex(20rad); + voice-pitch: 10khz; + -web-kit-resolution: 2dpi; /* Bogus property name testing dpi unit. */ +} +#id-3 { + -web-kit-resolution: 3dpcm; /* Bogus property name testing dpi unit. */ + transform: rotatey(20grad); +} +#id-4 { + -web-kit-resolution: 4dppx; /* Bogus property name testing dpi unit. */ + transform: rotatez(20turn); +} +'''; + + final String generated = r''' +#id-1 { + transition: color 0.4s; + animation-duration: 500ms; + top: 1em; + left: 200ex; + right: 300px; + bottom: 400cm; + border-width: 2.5mm; + margin-top: .5in; + margin-left: 5pc; + margin-right: 5ex; + margin-bottom: 5ch; + font-size: 10pt; + padding-top: 22rem; + padding-left: 33vw; + padding-right: 34vh; + padding-bottom: 3vmin; + transform: rotate(20deg); + voice-pitch: 10hz; +} +#id-2 { + left: 2fr; + font-size: 10vmax; + transform: rotatex(20rad); + voice-pitch: 10khz; + -web-kit-resolution: 2dpi; +} +#id-3 { + -web-kit-resolution: 3dpcm; + transform: rotatey(20grad); +} +#id-4 { + -web-kit-resolution: 4dppx; + transform: rotatez(20turn); +}'''; + + var stylesheet = parseCss(input, errors: errors, opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void testUnicode() { + var errors = []; + final String input = r''' +.toggle:after { + content: '✔'; + line-height: 43px; + font-size: 20px; + color: #d9d9d9; + text-shadow: 0 -1px 0 #bfbfbf; +} +'''; + + final String generated = r''' +.toggle:after { + content: "✔"; + line-height: 43px; + font-size: 20px; + color: #d9d9d9; + text-shadow: 0 -1px 0 #bfbfbf; +}'''; + + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void testNewerCss() { + var errors = []; + final String input = r''' +@media screen,print { + .foobar_screen { + width: 10px; + } +} +@page { + height: 22px; + size: 3in 3in; +} +@page : left { + width: 10px; +} +@page bar : left { @top-left { margin: 8px; } } +@charset "ISO-8859-1"; +@charset 'ASCII';'''; + + final String generated = r''' +@media screen, print { +.foobar_screen { + width: 10px; +} +} +@page { + height: 22px; + size: 3in 3in; +} +@page:left { + width: 10px; +} +@page bar:left { +@top-left { + margin: 8px; +} +} +@charset "ISO-8859-1"; +@charset "ASCII";'''; + + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void testMediaQueries() { + var errors = []; + String input = ''' +@media screen and (-webkit-min-device-pixel-ratio:0) { + .todo-item .toggle { + background: none; + } + #todo-item .toggle { + height: 40px; + } +}'''; + String generated = ''' +@media screen AND (-webkit-min-device-pixel-ratio:0) { +.todo-item .toggle { + background: none; +} +#todo-item .toggle { + height: 40px; +} +}'''; + + var stylesheet = parseCss(input, errors: errors, opts: options); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + input = ''' + @media handheld and (min-width: 20em), + screen and (min-width: 20em) { + #id { color: red; } + .myclass { height: 20px; } + } + @media print and (min-resolution: 300dpi) { + #anotherId { + color: #fff; + } + } + @media print and (min-resolution: 280dpcm) { + #finalId { + color: #aaa; + } + .class2 { + border: 20px; + } + }'''; + generated = + '''@media handheld AND (min-width:20em), screen AND (min-width:20em) { +#id { + color: #f00; +} +.myclass { + height: 20px; +} +} @media print AND (min-resolution:300dpi) { +#anotherId { + color: #fff; +} +} @media print AND (min-resolution:280dpcm) { +#finalId { + color: #aaa; +} +.class2 { + border: 20px; +} +}'''; + + stylesheet = parseCss(input, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + input = ''' +@media only screen and (min-device-width: 4000px) and + (min-device-height: 2000px), screen (another: 100px) { + html { + font-size: 10em; + } + }'''; + generated = '@media ONLY screen AND (min-device-width:4000px) ' + 'AND (min-device-height:2000px), screen (another:100px) {\n' + 'html {\n font-size: 10em;\n}\n}'; + + stylesheet = parseCss(input, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + input = ''' +@media screen,print (min-device-width: 4000px) and + (min-device-height: 2000px), screen (another: 100px) { + html { + font-size: 10em; + } + }'''; + generated = '@media screen, print (min-device-width:4000px) AND ' + '(min-device-height:2000px), screen (another:100px) {\n' + 'html {\n font-size: 10em;\n}\n}'; + + stylesheet = parseCss(input, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + input = ''' +@import "test.css" ONLY screen, NOT print (min-device-width: 4000px);'''; + generated = + '@import "test.css" ONLY screen, NOT print (min-device-width:4000px);'; + + stylesheet = parseCss(input, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void testFontFace() { + var errors = []; + + final String input = ''' +@font-face { + font-family: BBCBengali; + src: url(fonts/BBCBengali.ttf) format("opentype"); + unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; +}'''; + final String generated = '''@font-face { + font-family: BBCBengali; + src: url("fonts/BBCBengali.ttf") format("opentype"); + unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; +}'''; + var stylesheet = parseCss(input, errors: errors, opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + final String input1 = ''' +@font-face { + font-family: Gentium; + src: url(http://example.com/fonts/Gentium.ttf); + src: url(http://example.com/fonts/Gentium.ttf); +}'''; + final String generated1 = '''@font-face { + font-family: Gentium; + src: url("http://example.com/fonts/Gentium.ttf"); + src: url("http://example.com/fonts/Gentium.ttf"); +}'''; + + stylesheet = parseCss(input1, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated1); + + final String input2 = ''' +@font-face { +src: url(ideal-sans-serif.woff) format("woff"), + url(basic-sans-serif.ttf) format("opentype"), + local(Gentium Bold); +}'''; + final String generated2 = + '@font-face {\n' + ' src: url("ideal-sans-serif.woff") ' + 'format("woff"), url("basic-sans-serif.ttf") ' + 'format("opentype"), local(Gentium Bold);\n}'; + + stylesheet = parseCss(input2, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated2); + + final String input3 = '''@font-face { + font-family: MyGentium Text Ornaments; + src: local(Gentium Bold), /* full font name */ + local(Gentium-Bold), /* Postscript name */ + url(GentiumBold.ttf); /* otherwise, download it */ + font-weight: bold; +}'''; + final String generated3 = '''@font-face { + font-family: MyGentium Text Ornaments; + src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); + font-weight: bold; +}'''; + + stylesheet = parseCss(input3, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated3); + + final String input4 = ''' +@font-face { + font-family: STIXGeneral; + src: local(STIXGeneral), url(/stixfonts/STIXGeneral.otf); + unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; +}'''; + final String generated4 = '''@font-face { + font-family: STIXGeneral; + src: local(STIXGeneral), url("/stixfonts/STIXGeneral.otf"); + unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; +}'''; + stylesheet = parseCss(input4, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated4); +} + +void testCssFile() { + var errors = []; + final String input = r''' +@import 'simple.css' +@import "test.css" print +@import url(test.css) screen, print +@import url(http://google.com/maps/maps.css); + +div[href^='test'] { + height: 10px; +} + +@-webkit-keyframes pulsate { + from { + -webkit-transform: translate3d(0, 0, 0) scale(1.0); + } + 10% { + -webkit-transform: translate3d(0, 0, 0) scale(1.0); + } + 30% { + -webkit-transform: translate3d(0, 2, 0) scale(1.0); + } +} + +.foobar { + grid-columns: 10px ("content" 1fr 10px)[4]; +} + +.test-background { + background: url(http://www.foo.com/bar.png); +} +'''; + + final String generated = + '@import "simple.css"; ' + '@import "test.css" print; ' + '@import "test.css" screen, print; ' + '@import "http://google.com/maps/maps.css";\n' + 'div[href^="test"] {\n' + ' height: 10px;\n' + '}\n' + '@-webkit-keyframes pulsate {\n' + ' from {\n' + ' -webkit-transform: translate3d(0, 0, 0) scale(1.0);\n' + ' }\n' + ' 10% {\n' + ' -webkit-transform: translate3d(0, 0, 0) scale(1.0);\n' + ' }\n' + ' 30% {\n' + ' -webkit-transform: translate3d(0, 2, 0) scale(1.0);\n' + ' }\n' + '}\n' + '.foobar {\n' + ' grid-columns: 10px ("content" 1fr 10px) [4];\n' + '}\n' + '.test-background {\n' + ' background: url("http://www.foo.com/bar.png");\n' + '}'; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void testCompactEmitter() { + var errors = []; + + // Check !import compactly emitted. + final String input = r''' +div { + color: green !important; +} +'''; + final String generated = "div { color: green!important; }"; + + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(compactOuptut(stylesheet), generated); + + // Check namespace directive compactly emitted. + final String input2 = "@namespace a url(http://www.example.org/a);"; + final String generated2 = "@namespace a url(http://www.example.org/a);"; + + var stylesheet2 = parseCss(input2, errors: errors..clear()); + + expect(stylesheet2 != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(compactOuptut(stylesheet2), generated2); +} + +void testNotSelectors() { + var errors = []; + + final String input = r''' +.details:not(.open-details) x-element, +.details:not(.open-details) .summary { + overflow: hidden; +} + +.details:not(.open-details) x-icon { + margin-left: 99px; +} + +.kind-class .details:not(.open-details) x-icon { + margin-left: 0px; +} + +.name { + margin-left: 0px; +} + +.details:not(.open-details) .the-class { + width: 80px; +} + +*:focus +{ + outline: none; +} + +body > h2:not(:first-of-type):not(:last-of-type) { + color: red; +} + +.details-1:not([DISABLED]) { + outline: none; +} + +html|*:not(:link):not(:visited) { + width: 92%; +} + +*|*:not(*) { + font-weight: bold; +} + +*:not(:not([disabled])) { color: blue; } +'''; + final String generated = r''' +.details:not(.open-details) x-element, .details:not(.open-details) .summary { + overflow: hidden; +} +.details:not(.open-details) x-icon { + margin-left: 99px; +} +.kind-class .details:not(.open-details) x-icon { + margin-left: 0px; +} +.name { + margin-left: 0px; +} +.details:not(.open-details) .the-class { + width: 80px; +} +*:focus { + outline: none; +} +body > h2:not(:first-of-type):not(:last-of-type) { + color: #f00; +} +.details-1:not([DISABLED]) { + outline: none; +} +html|*:not(:link):not(:visited) { + width: 92%; +} +*|*:not(*) { + font-weight: bold; +} +*:not(:not([disabled])) { + color: #00f; +}'''; + + var stylesheet = parseCss(input, errors: errors, opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void testIE() { + var errors = []; + final String input = +".test {\n" +" filter: progid:DXImageTransform.Microsoft.gradient" +"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" +"}"; + final String generated = +".test {\n" +" filter: progid:DXImageTransform.Microsoft.gradient" +"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" +"}"; + + var stylesheet = parseCss(input, errors: errors, opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + final String input2 = +".test {\n" +" filter: progid:DXImageTransform.Microsoft.gradient" +"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" +" progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n" +"}"; + + final String generated2 = +".test {\n" +" filter: progid:DXImageTransform.Microsoft.gradient" +"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" +" progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n" +"}"; + + stylesheet = parseCss(input2, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated2); + + final String input3 = ''' +div { + filter: alpha(opacity=80); /* IE7 and under */ + -ms-filter: "Alpha(Opacity=40)"; /* IE8 and newer */ + + Filter: Blur(Add = 0, Direction = 225, Strength = 10); + Filter: FlipV; + Filter: Gray; + FILTER: Chroma(Color = #000000) Mask(Color=#00FF00); + Filter: Alpha(Opacity=100, FinishOpacity=0, Style=2, StartX=20, StartY=40, + FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20, + Phase=220, Strength=10); +} +'''; + final String generated3 = 'div {\n filter: alpha(opacity=80);\n' + ' -ms-filter: "Alpha(Opacity=40)";\n' + ' Filter: Blur(Add = 0, Direction = 225, Strength = 10);\n' + ' Filter: FlipV;\n Filter: Gray;\n' + ' FILTER: Chroma(Color = #000000) Mask(Color=#00FF00);\n' + ' Filter: Alpha(Opacity=100, FinishOpacity=0, Style=2, ' + 'StartX=20, StartY=40, \n' + ' FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20, \n' + ' Phase=220, Strength=10);\n}'; + + stylesheet = parseCss(input3, errors: errors..clear(), opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated3); +} + +/** + * Test IE specific declaration syntax: + * IE6 property name prefixed with _ (normal CSS property name can start + * with an underscore). + * + * IE7 or below property add asterisk before the CSS property. + * + * IE8 or below add \9 at end of declaration expression e.g., + * background: red\9; + */ +void testIEDeclaration() { + var errors = []; + + final input = ''' +.testIE-6 { + _zoom : 5; +} +.clearfix { + *zoom: 1; +} +audio, video { + display: inline-block; + *display: inline; + *zoom: 1; +} +input { + *overflow: visible; + line-height: normal; +} +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \\9; /* IE6-9 */ +} + +input[type="radio"], input[type="checkbox"] { + margin-top: 1px \\9; + *margin-top: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \\9; + padding-left: 14px; + padding-left: 4px \\9; /* IE7-8 no border-radius, don't indent padding. */ +} + +.btn.active { + background-color: #cccccc \\9; +} + +@-webkit-keyframes progress-bar-stripes { +from { +background-position: 40px 0; +} +to { +background-position: 0 0; +} +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +}'''; + + final generated = '''.testIE-6 { + _zoom: 5; +} +.clearfix { + *zoom: 1; +} +audio, video { + display: inline-block; + *display: inline; + *zoom: 1; +} +input { + *overflow: visible; + line-height: normal; +} +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \\9; +} +input[type="radio"], input[type="checkbox"] { + margin-top: 1px \\9; + *margin-top: 0; +} +input.search-query { + padding-right: 14px; + padding-right: 4px \\9; + padding-left: 14px; + padding-left: 4px \\9; +} +.btn.active { + background-color: #ccc \\9; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +}'''; + + var stylesheet = parseCss(input, errors: errors, opts: options); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void testHangs() { + final optionErrors = ['--no-colors', '--warnings_as_errors', 'memory']; + var errors = []; + + // Bad hexvalue had caused a hang in processTerm. + final input = r'''#a { color: #ebebeburl(0/IE8+9+); }'''; + var stylesheet = parseCss(input, errors: errors, opts: optionErrors); + + expect(stylesheet != null, true); + expect(errors.length, 3, reason: errors.toString()); + + var errorMessage = errors[0]; + expect(errorMessage.message, contains('Bad hex number')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 0); + expect(errorMessage.span.start.column, 12); + expect(errorMessage.span.text, '#ebebeburl'); + + errorMessage = errors[1]; + expect(errorMessage.message, contains('expected }, but found +')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 0); + expect(errorMessage.span.start.column, 30); + expect(errorMessage.span.text, '+'); + + errorMessage = errors[2]; + expect(errorMessage.message, contains('premature end of file unknown CSS')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 0); + expect(errorMessage.span.start.column, 31); + expect(errorMessage.span.text, ')'); + + // Missing closing parenthesis for keyframes. + final input2 = r'''@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +'''; + + stylesheet = parseCss(input2, errors: errors..clear(), opts: optionErrors); + + expect(stylesheet != null, true); + + expect(errors.length, 1, reason: errors.toString()); + + errorMessage = errors[0]; + expect(errorMessage.message, contains('unexpected end of file')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 7); + expect(errorMessage.span.start.column, 0); + expect(errorMessage.span.text, ''); +} + +main() { + test('Simple Terms', testSimpleTerms); + test('Declarations', testDeclarations); + test('Identifiers', testIdentifiers); + test('Composites', testComposites); + test('Units', testUnits); + test('Unicode', testUnicode); + test('Newer CSS', testNewerCss); + test('Media Queries', testMediaQueries); + test('Font-Face', testFontFace); + test('CSS file', testCssFile); + test('Compact Emitter', testCompactEmitter); + test('Selector Negation', testNotSelectors); + test('IE stuff', testIE); + test('IE declaration syntax', testIEDeclaration); + test('Hanging bugs', testHangs); +} diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart new file mode 100644 index 000000000..98acffc3c --- /dev/null +++ b/pkgs/csslib/test/error_test.dart @@ -0,0 +1,355 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library error_test; + +import 'package:unittest/unittest.dart'; +import 'testing.dart'; +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; +import 'package:csslib/src/messages.dart'; + +/** + * Test for unsupported font-weights values of bolder, lighter and inherit. + */ +void testUnsupportedFontWeights() { + var errors = []; + + // TODO(terry): Need to support bolder. + // font-weight value bolder. + var input = ".foobar { font-weight: bolder; }"; + var stylesheet = parseCss(input, errors: errors); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:24: Unknown property value bolder +.foobar { font-weight: bolder; } + ^^^^^^'''); + expect(stylesheet != null, true); + + expect(prettyPrint(stylesheet), r''' +.foobar { + font-weight: bolder; +}'''); + + // TODO(terry): Need to support lighter. + // font-weight value lighter. + input = ".foobar { font-weight: lighter; }"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:24: Unknown property value lighter +.foobar { font-weight: lighter; } + ^^^^^^^'''); + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +.foobar { + font-weight: lighter; +}'''); + + // TODO(terry): Need to support inherit. + // font-weight value inherit. + input = ".foobar { font-weight: inherit; }"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:24: Unknown property value inherit +.foobar { font-weight: inherit; } + ^^^^^^^'''); + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +.foobar { + font-weight: inherit; +}'''); +} + +/** + * Test for unsupported line-height values of units other than px, pt and + * inherit. + */ +void testUnsupportedLineHeights() { + var errors = []; + + // line-height value in percentge unit. + var input = ".foobar { line-height: 120%; }"; + var stylesheet = parseCss(input, errors: errors); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:24: Unexpected value for line-height +.foobar { line-height: 120%; } + ^^^'''); + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +.foobar { + line-height: 120%; +}'''); + + // TODO(terry): Need to support all units. + // line-height value in cm unit. + input = ".foobar { line-height: 20cm; }"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:24: Unexpected unit for line-height +.foobar { line-height: 20cm; } + ^^'''); + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +.foobar { + line-height: 20cm; +}'''); + + // TODO(terry): Need to support inherit. + // line-height value inherit. + input = ".foobar { line-height: inherit; }"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:24: Unknown property value inherit +.foobar { line-height: inherit; } + ^^^^^^^'''); + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +.foobar { + line-height: inherit; +}'''); +} + +/** Test for bad selectors. */ +void testBadSelectors() { + var errors = []; + + // Invalid id selector. + var input = "# foo { color: #ff00ff; }"; + var stylesheet = parseCss(input, errors: errors); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:1: Not a valid ID selector expected #id +# foo { color: #ff00ff; } +^'''); + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +# foo { + color: #f0f; +}'''); + + // Invalid class selector. + input = ". foo { color: #ff00ff; }"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:1: Not a valid class selector expected .className +. foo { color: #ff00ff; } +^'''); + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +. foo { + color: #f0f; +}'''); +} + +/** Test for bad hex values. */ +void testBadHexValues() { + var errors = []; + + // Invalid hex value. + var input = ".foobar { color: #AH787; }"; + var stylesheet = parseCss(input, errors: errors); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:18: Bad hex number +.foobar { color: #AH787; } + ^^^^^^'''); + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +.foobar { + color: #AH787; +}'''); + + // Bad color constant. + input = ".foobar { color: redder; }"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:18: Unknown property value redder +.foobar { color: redder; } + ^^^^^^'''); + + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +.foobar { + color: redder; +}'''); + + // Bad hex color #ffffff. + input = ".foobar { color: # ffffff; }"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:18: Expected hex number +.foobar { color: # ffffff; } + ^'''); + + expect(stylesheet != null, true); + expect(prettyPrint(stylesheet), r''' +.foobar { + color: # ffffff; +}'''); + + // Bad hex color #123fff. + input = ".foobar { color: # 123fff; }"; + stylesheet = parseCss(input, errors: errors..clear()); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:18: Expected hex number +.foobar { color: # 123fff; } + ^'''); + + expect(stylesheet != null, true); + + // Formating is off with an extra space. However, the entire value is bad + // and isn't processed anyway. + expect(prettyPrint(stylesheet), r''' +.foobar { + color: # 123 fff; +}'''); + +} + +void testBadUnicode() { + var errors = []; + final String input = ''' +@font-face { + src: url(fonts/BBCBengali.ttf) format("opentype"); + unicode-range: U+400-200; +}'''; + + var stylesheet = parseCss(input, errors: errors); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), + 'error :3:20: unicode first range can not be greater than last\n' + ' unicode-range: U+400-200;\n' + ' ^^^^^^^'); + + final String input2 = ''' +@font-face { + src: url(fonts/BBCBengali.ttf) format("opentype"); + unicode-range: U+12FFFF; +}'''; + + stylesheet = parseCss(input2, errors: errors..clear()); + + expect(errors.isEmpty, false); + expect(errors[0].toString(), + 'error :3:20: unicode range must be less than 10FFFF\n' + ' unicode-range: U+12FFFF;\n' + ' ^^^^^^'); +} + +void testBadNesting() { + var errors = []; + + // Test for bad declaration in a nested rule. + final String input = ''' +div { + width: 20px; + span + ul { color: blue; } + span + ul > #aaaa { + color: #ffghghgh; + } + background-color: red; +} +'''; + + var stylesheet = parseCss(input, errors: errors); + expect(errors.length, 1); + var errorMessage = messages.messages[0]; + expect(errorMessage.message, contains('Bad hex number')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 4); + expect(errorMessage.span.start.column, 11); + expect(errorMessage.span.text, '#ffghghgh'); + + // Test for bad selector syntax. + final String input2 = ''' +div { + span + ul #aaaa > (3333) { + color: #ffghghgh; + } +} +'''; + var stylesheet2 = parseCss(input2, errors: errors..clear()); + expect(errors.length, 4); + errorMessage = messages.messages[0]; + expect(errorMessage.message, contains(':, but found +')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 1); + expect(errorMessage.span.start.column, 7); + expect(errorMessage.span.text, '+'); + + errorMessage = messages.messages[1]; + expect(errorMessage.message, contains('Unknown property value ul')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 1); + expect(errorMessage.span.start.column, 9); + expect(errorMessage.span.text, 'ul'); + + errorMessage = messages.messages[2]; + expect(errorMessage.message, contains('expected }, but found >')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 1); + expect(errorMessage.span.start.column, 18); + expect(errorMessage.span.text, '>'); + + errorMessage = messages.messages[3]; + expect(errorMessage.message, contains('premature end of file unknown CSS')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 1); + expect(errorMessage.span.start.column, 20); + expect(errorMessage.span.text, '('); + + // Test for missing close braces and bad declaration. + final String input3 = ''' +div { + span { + color: #green; +} +'''; + var stylesheet3 = parseCss(input3, errors: errors..clear()); + expect(errors.length, 2); + errorMessage = messages.messages[0]; + expect(errorMessage.message, contains('Bad hex number')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 2); + expect(errorMessage.span.start.column, 11); + expect(errorMessage.span.text, '#green'); + + errorMessage = messages.messages[1]; + expect(errorMessage.message, contains('expected }, but found end of file')); + expect(errorMessage.span, isNotNull); + expect(errorMessage.span.start.line, 3); + expect(errorMessage.span.start.column, 1); + expect(errorMessage.span.text, '\n'); +} + +main() { + test('font-weight value errors', testUnsupportedFontWeights); + test('line-height value errors', testUnsupportedLineHeights); + test('bad selectors', testBadSelectors); + test('bad Hex values', testBadHexValues); + test('bad unicode ranges', testBadUnicode); + test('nested rules', testBadNesting); +} diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart new file mode 100644 index 000000000..e6b00255d --- /dev/null +++ b/pkgs/csslib/test/nested_test.dart @@ -0,0 +1,614 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library nested_test; + +import 'dart:utf'; +import 'package:unittest/unittest.dart'; +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; +import 'testing.dart'; + +List optionsCss = ['--no-colors', 'memory']; + +compileAndValidate(String input, String generated) { + var errors = []; + var stylesheet = compileCss(input, errors: errors, opts: optionsCss); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +selectorVariations() { + final input1 = r'''html { color: red; }'''; + final generated1 = r'''html { + color: #f00; +}'''; + compileAndValidate(input1, generated1); + + final input2 = r'''button { span { height: 200 } }'''; + final generated2 = r'''button { +} +button span { + height: 200; +}'''; + compileAndValidate(input2, generated2); + + final input3 = r'''div { color: red; } button { span { height: 200 } }'''; + final generated3 = r'''div { + color: #f00; +} +button { +} +button span { + height: 200; +}'''; + compileAndValidate(input3, generated3); + + final input4 = r'''#header { color: red; h1 { font-size: 26px; } }'''; + final generated4 = r'''#header { + color: #f00; +} +#header h1 { + font-size: 26px; +}'''; + compileAndValidate(input4, generated4); + + final input5 = r''' +#header { + color: red; + h1 { font-size: 26px; } + background-color: blue; +}'''; + final generated5 = r'''#header { + color: #f00; + background-color: #00f; +} +#header h1 { + font-size: 26px; +}'''; + compileAndValidate(input5, generated5); + + final input6 = r'''html { body {color: red; }}'''; + final generated6 = r'''html { +} +html body { + color: #f00; +}'''; + compileAndValidate(input6, generated6); + + final input7 = r'''html body {color: red; }'''; + final generated7 = r'''html body { + color: #f00; +}'''; + compileAndValidate(input7, generated7); + + final input8 = r''' +html, body { color: red; } +button { height: 200 } +body { width: 300px; }'''; + final generated8 = r'''html, body { + color: #f00; +} +button { + height: 200; +} +body { + width: 300px; +}'''; + compileAndValidate(input8, generated8); + + final input9 = ''' +html, body { + color: red; + button { height: 200 } + div { width: 300px; } +}'''; + final generated9 = r'''html, body { + color: #f00; +} +html button, body button { + height: 200; +} +html div, body div { + width: 300px; +}'''; + compileAndValidate(input9, generated9); + + final input10 = ''' +html { + color: red; + button, div { height: 200 } + body { width: 300px; } +}'''; + final generated10 = r'''html { + color: #f00; +} +html button, html div { + height: 200; +} +html body { + width: 300px; +}'''; + compileAndValidate(input10, generated10); + + final input11 = ''' +html, body { + color: red; + button, div { height: 200 } + table { width: 300px; } +}'''; + final generated11 = r'''html, body { + color: #f00; +} +html button, body button, html div, body div { + height: 200; +} +html table, body table { + width: 300px; +}'''; + compileAndValidate(input11, generated11); + + final input12 = ''' +html, body { + color: red; + button, div { + span, a, ul { height: 200 } + } + table { width: 300px; } +}'''; + final generated12 = r'''html, body { + color: #f00; +} +''' +'html button span, body button span, html div span, body div span, ' +'html button a, body button a, html div a, body div a, html button ul, ' +r'''body button ul, html div ul, body div ul { + height: 200; +} +html table, body table { + width: 300px; +}'''; + compileAndValidate(input12, generated12); + + final input13 = r''' +#header { + div { + width: 100px; + a { height: 200px; } + } + color: blue; +} +span { color: #1f1f1f; } +'''; + final generated13 = r'''#header { + color: #00f; +} +#header div { + width: 100px; +} +#header div a { + height: 200px; +} +span { + color: #1f1f1f; +}'''; + compileAndValidate(input13, generated13); +} + +void simpleNest() { + final errors = []; + final input = ''' +div span { color: green; } +#header { + color: red; + h1 { + font-size: 26px; + font-weight: bold; + } + p { + font-size: 12px; + a { + text-decoration: none; + } + } + background-color: blue; +} +div > span[attr="foo"] { color: yellow; } +'''; + + final generated = +r'''div span { + color: #008000; +} +#header { + color: #f00; + background-color: #00f; +} +#header h1 { + font-size: 26px; + font-weight: bold; +} +#header p { + font-size: 12px; +} +#header p a { + text-decoration: none; +} +div > span[attr="foo"] { + color: #ff0; +}'''; + compileAndValidate(input, generated); +} + +void complexNest() { + final errors = []; + final input = ''' +@font-face { font-family: arial; } +div { color: #f0f0f0; } +#header + div { + color: url(abc.png); + *[attr="bar"] { + font-size: 26px; + font-weight: bold; + } + p~ul { + font-size: 12px; + :not(p) { + text-decoration: none; + div > span[attr="foo"] { color: yellow; } + } + } + background-color: blue; + span { + color: red; + .one { color: blue; } + .two { color: green; } + .three { color: yellow; } + .four { + .four-1 { background-color: #00000f; } + .four-2 { background-color: #0000ff; } + .four-3 { background-color: #000fff; } + .four-4 { + height: 44px; + .four-4-1 { height: 10px; } + .four-4-2 { height: 20px; } + .four-4-3 { height: 30px; } + width: 44px; + } + } + } +} +span { color: #1f1f2f; } +'''; + + final generated = r'''@font-face { + font-family: arial; +} +div { + color: #f0f0f0; +} +#header + div { + color: url("abc.png"); + background-color: #00f; +} +#header + div *[attr="bar"] { + font-size: 26px; + font-weight: bold; +} +#header + div p ~ ul { + font-size: 12px; +} +#header + div p ~ ul :not(p) { + text-decoration: none; +} +#header + div p ~ ul :not(p) div > span[attr="foo"] { + color: #ff0; +} +#header + div span { + color: #f00; +} +#header + div span .one { + color: #00f; +} +#header + div span .two { + color: #008000; +} +#header + div span .three { + color: #ff0; +} +#header + div span .four .four-1 { + background-color: #00000f; +} +#header + div span .four .four-2 { + background-color: #00f; +} +#header + div span .four .four-3 { + background-color: #000fff; +} +#header + div span .four .four-4 { + height: 44px; + width: 44px; +} +#header + div span .four .four-4 .four-4-1 { + height: 10px; +} +#header + div span .four .four-4 .four-4-2 { + height: 20px; +} +#header + div span .four .four-4 .four-4-3 { + height: 30px; +} +span { + color: #1f1f2f; +}'''; + + compileAndValidate(input, generated); +} + +void mediaNesting() { + var errors = []; + + final input = r''' +@media screen and (-webkit-min-device-pixel-ratio:0) { + #toggle-all { + image: url(test.jpb); + div, table { + background: none; + a { width: 100px; } + } + color: red; + } +} +'''; + final generated = r'''@media screen AND (-webkit-min-device-pixel-ratio:0) { +#toggle-all { + image: url("test.jpb"); + color: #f00; +} +#toggle-all div, #toggle-all table { + background: none; +} +#toggle-all div a, #toggle-all table a { + width: 100px; +} +}'''; + + compileAndValidate(input, generated); +} + +void simpleThis() { + final errors = []; + final input = '''#header { + h1 { + font-size: 26px; + font-weight: bold; + } + p { font-size: 12px; + a { text-decoration: none; + &:hover { border-width: 1px } + } + } +} +'''; + + final generated = r'''#header { +} +#header h1 { + font-size: 26px; + font-weight: bold; +} +#header p { + font-size: 12px; +} +#header p a { + text-decoration: none; +} +#header p a:hover { + border-width: 1px; +}'''; + + compileAndValidate(input, generated); +} + +void complexThis() { + var errors = []; + + final input1 = r''' +.light { + .leftCol { + .textLink { + color: fooL1; + &:hover { color: barL1;} + } + .picLink { + background-image: url(/fooL1.jpg); + &:hover { background-image: url(/barL1.jpg);} + } + .textWithIconLink { + color: fooL2; + background-image: url(/fooL2.jpg); + &:hover { color: barL2; background-image: url(/barL2.jpg);} + } + } +}'''; + + final generated1 = r'''.light { +} +.light .leftCol .textLink { + color: fooL1; +} +.light .leftCol .textLink:hover { + color: barL1; +} +.light .leftCol .picLink { + background-image: url("/fooL1.jpg"); +} +.light .leftCol .picLink:hover { + background-image: url("/barL1.jpg"); +} +.light .leftCol .textWithIconLink { + color: fooL2; + background-image: url("/fooL2.jpg"); +} +.light .leftCol .textWithIconLink:hover { + color: barL2; + background-image: url("/barL2.jpg"); +}'''; + + compileAndValidate(input1, generated1); + + final input2 = r''' +.textLink { + .light .leftCol & { + color: fooL1; + &:hover { color: barL1; } + } + .light .rightCol & { + color: fooL3; + &:hover { color: barL3; } + } +}'''; + + final generated2 = r''' +.textLink { +} +.light .leftCol .textLink { + color: fooL1; +} +.light .leftCol .textLink:hover { + color: barL1; +} +.light .rightCol .textLink { + color: fooL3; +} +.light .rightCol .textLink:hover { + color: barL3; +}'''; + + compileAndValidate(input2, generated2); +} + +variationsThis() { + var errors = []; + + final input1 = r''' +.textLink { + a { + light .leftCol & { + color: red; + } + } +}'''; + final generated1 = r'''.textLink { +} +light .leftCol .textLink a { + color: #f00; +}'''; + + compileAndValidate(input1, generated1); + + final input2 = r'''.textLink { + a { + & light .leftCol & { + color: red; + } + } +}'''; + final generated2 = r'''.textLink { +} +.textLink a light .leftCol .textLink a { + color: #f00; +}'''; + compileAndValidate(input2, generated2); + + final input3 = r''' +.textLink { + a { + & light .leftCol { color: red; } + } +}'''; + final generated3 = r'''.textLink { +} +.textLink a light .leftCol { + color: #f00; +}'''; + compileAndValidate(input3, generated3); + + final input4 = r''' +.textLink { + a { + & light .leftCol { color: red; } + &:hover { width: 100px; } + } +}'''; + final generated4 = r'''.textLink { +} +.textLink a light .leftCol { + color: #f00; +} +.textLink a:hover { + width: 100px; +}'''; + compileAndValidate(input4, generated4); + + final input5 = r'''.textLink { a { &:hover { color: red; } } }'''; + final generated5 = r'''.textLink { +} +.textLink a:hover { + color: #f00; +}'''; + + compileAndValidate(input5, generated5); + + final input6 = r'''.textLink { &:hover { color: red; } }'''; + final generated6 = r'''.textLink { +} +.textLink:hover { + color: #f00; +}'''; + compileAndValidate(input6, generated6); + + final input7 = r'''.textLink { a { & + & { color: red; } } }'''; + final generated7 = r'''.textLink { +} +.textLink a + .textLink a { + color: #f00; +}'''; + compileAndValidate(input7, generated7); + + final input8 = r'''.textLink { a { & { color: red; } } }'''; + final generated8 = r'''.textLink { +} +.textLink a { + color: #f00; +}'''; + compileAndValidate(input8, generated8); + + final input9 = r'''.textLink { a { & ~ & { color: red; } } }'''; + final generated9 = r'''.textLink { +} +.textLink a ~ .textLink a { + color: #f00; +}'''; + compileAndValidate(input9, generated9); + + final input10 = r'''.textLink { a { & & { color: red; } } }'''; + final generated10 = r'''.textLink { +} +.textLink a .textLink a { + color: #f00; +}'''; + compileAndValidate(input10, generated10); +} + +main() { + test('Selector and Nested Variations', selectorVariations); + test('Simple nesting', simpleNest); + test('Complex nesting', complexNest); + test('@media nesting', mediaNesting); + test('Simple &', simpleThis); + test("Variations &", variationsThis); + test('Complex &', complexThis); +} diff --git a/pkgs/csslib/test/run.sh b/pkgs/csslib/test/run.sh new file mode 100755 index 000000000..7d2620904 --- /dev/null +++ b/pkgs/csslib/test/run.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +# for details. All rights reserved. Use of this source code is governed by a +# BSD-style license that can be found in the LICENSE file. + +# Usage: call directly in the commandline as test/run.sh ensuring that you have +# 'dart' in your path. Filter tests by passing a pattern as an argument to this +# script. + +# TODO(sigmund): replace with a real test runner + +# bail on error +set -e + +# print commands executed by this script +# set -x + +DIR=$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd ) +DART_FLAGS="--checked" +TEST_PATTERN=$1 + +if [[ ($TEST_PATTERN == "") ]]; then + # Note: dart_analyzer needs to be run from the root directory for proper path + # canonicalization. + pushd $DIR/.. &>/dev/null + echo Analyzing compiler for warnings or type errors + dartanalyzer --fatal-warnings --fatal-type-errors bin/css.dart + popd &>/dev/null +fi + +pushd $DIR &>/dev/null +if [[ ($TEST_PATTERN == "canary") || ($TEST_PATTERN = "") ]]; then + dart $DART_FLAGS run_all.dart +else + dart $DART_FLAGS run_all.dart $TEST_PATTERN +fi +popd &>/dev/null + +echo All tests completed. diff --git a/pkgs/csslib/test/run_all.dart b/pkgs/csslib/test/run_all.dart new file mode 100644 index 000000000..517d5a0bf --- /dev/null +++ b/pkgs/csslib/test/run_all.dart @@ -0,0 +1,39 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +/** + * This is a helper for run.sh. We try to run all of the Dart code in one + * instance of the Dart VM to reduce warm-up time. + */ +library run_impl; + +import 'dart:io'; +import 'package:unittest/unittest.dart'; +import 'package:unittest/compact_vm_config.dart'; +import 'testing.dart'; + +import 'compiler_test.dart' as compiler_test; +import 'declaration_test.dart' as declaration_test; +import 'var_test.dart' as var_test; +import 'nested_test.dart' as nested_test; +import 'error_test.dart' as error_test; +import 'selector_test.dart' as selector_test; +import 'visitor_test.dart' as visitor_test; + +main() { + var args = new Options().arguments; + + var pattern = new RegExp(args.length > 0 ? args[0] : '.'); + + useCompactVMConfiguration(); + useMockMessages(); + + if (pattern.hasMatch('compiler_test.dart')) compiler_test.main(); + if (pattern.hasMatch('declaration_test.dart')) declaration_test.main(); + if (pattern.hasMatch('var_test.dart')) var_test.main(); + if (pattern.hasMatch('nested_test.dart')) nested_test.main(); + if (pattern.hasMatch('selector_test.dart')) selector_test.main(); + if (pattern.hasMatch('visitor_test.dart')) visitor_test.main(); + if (pattern.hasMatch('error_test.dart')) error_test.main(); +} diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart new file mode 100644 index 000000000..ad015bb57 --- /dev/null +++ b/pkgs/csslib/test/selector_test.dart @@ -0,0 +1,67 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library selector_test; + +import 'package:unittest/unittest.dart'; +import 'testing.dart'; +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; + +void testSelectorSuccesses() { + var errors = []; + var selectorAst = selector('#div .foo', errors: errors); + expect(errors.isEmpty, true, reason: errors.toString()); + expect('#div .foo', compactOuptut(selectorAst)); + + // Valid selectors for class names. + selectorAst = selector('.foo', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect('.foo', compactOuptut(selectorAst)); + + selectorAst = selector('.foobar .xyzzy', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect('.foobar .xyzzy', compactOuptut(selectorAst)); + + selectorAst = selector('.foobar .a-story .xyzzy', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect('.foobar .a-story .xyzzy', compactOuptut(selectorAst)); + + selectorAst = selector('.foobar .xyzzy .a-story .b-story', + errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect('.foobar .xyzzy .a-story .b-story', compactOuptut(selectorAst)); + + // Valid selectors for element IDs. + selectorAst = selector('#id1', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect('#id1', compactOuptut(selectorAst)); + + selectorAst = selector('#id-number-3', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect('#id-number-3', compactOuptut(selectorAst)); + + selectorAst = selector('#_privateId', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect('#_privateId', compactOuptut(selectorAst)); +} + +// TODO(terry): Move this failure case to a failure_test.dart when the analyzer +// and validator exit then they'll be a bunch more checks. +void testSelectorFailures() { + var errors = []; + + // Test for invalid class name (can't start with number). + var selectorAst = selector('.foobar .1a-story .xyzzy', errors: errors); + expect(errors.isEmpty, false); + expect(errors[0].toString(), r''' +error :1:9: name must start with a alpha character, but found a number +.foobar .1a-story .xyzzy + ^^'''); +} + +main() { + test('Valid Selectors', testSelectorSuccesses); + test('Invalid Selectors', testSelectorFailures); +} diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart new file mode 100644 index 000000000..e7b14bdc4 --- /dev/null +++ b/pkgs/csslib/test/testing.dart @@ -0,0 +1,64 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +/** Common definitions used for setting up the test environment. */ +library testing; + +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; +import 'package:csslib/src/messages.dart'; + +useMockMessages() { + messages = new Messages(printHandler: (message) {}); +} + +/** + * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, + * CSS will allow any property/value pairs regardless of validity; all of our + * tests (by default) will ensure that the CSS is really valid. + */ +StyleSheet parseCss(String cssInput, {List errors, List opts}) => + parse(cssInput, errors: errors, options: opts == null ? + ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts); + +/** + * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, + * CSS will allow any property/value pairs regardless of validity; all of our + * tests (by default) will ensure that the CSS is really valid. + */ +StyleSheet compileCss(String cssInput, {List errors, List opts}) => + compile(cssInput, errors: errors, options: opts == null ? + ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts); + +/** CSS emitter walks the style sheet tree and emits readable CSS. */ +var _emitCss = new CssPrinter(); + +/** Simple Visitor does nothing but walk tree. */ +var _cssVisitor = new Visitor(); + +/** Pretty printer for CSS. */ +String prettyPrint(StyleSheet ss) { + // Walk the tree testing basic Vistor class. + walkTree(ss); + return (_emitCss..visitTree(ss, pretty: true)).toString(); +} + +/** + * Helper function to emit compact (non-pretty printed) CSS for suite test + * comparsions. Spaces, new lines, etc. are reduced for easier comparsions of + * expected suite test results. + */ +String compactOuptut(StyleSheet ss) { + walkTree(ss); + return (_emitCss..visitTree(ss, pretty: false)).toString(); +} + +/** Walks the style sheet tree does nothing; insures the basic walker works. */ +void walkTree(StyleSheet ss) { + _cssVisitor..visitTree(ss); +} + +String dumpTree(StyleSheet ss) => treeToDebugString(ss); + + diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart new file mode 100644 index 000000000..fb870c727 --- /dev/null +++ b/pkgs/csslib/test/var_test.dart @@ -0,0 +1,629 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library var_test; + +import 'dart:utf'; +import 'package:unittest/unittest.dart'; +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; +import 'testing.dart'; + +void simpleVar() { + final errors = []; + final input = ''':root { + var-color-background: red; + var-color-foreground: blue; + + var-a: var(b); + var-b: var(c); + var-c: #00ff00; +} +.testIt { + color: var(color-foreground); + background: var(color-background); +} +'''; + + final generated = ''':root { + var-color-background: #f00; + var-color-foreground: #00f; + var-a: var(b); + var-b: var(c); + var-c: #0f0; +} +.testIt { + color: var(color-foreground); + background: var(color-background); +}'''; + + var stylesheet = compileCss(input, errors: errors, + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void expressionsVar() { + final errors = []; + final input = ''':root { + var-color-background: red; + var-color-foreground: blue; + + var-a: var(b); + var-b: var(c); + var-c: #00ff00; + + var-image: url(test.png); + + var-b-width: 20cm; + var-m-width: 33%; + var-b-height: 30EM; + var-width: .6in; + var-length: 1.2in; + var-web-stuff: -10Px; + var-rgba: rgba(10,20,255); + var-transition: color 0.4s; + var-transform: rotate(20deg); + var-content: "✔"; + var-text-shadow: 0 -1px 0 #bfbfbf; + var-font-family: Gentium; + var-src: url("http://example.com/fonts/Gentium.ttf"); + var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); + var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; + var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???; + var-grid-columns: 10px ("content" 1fr 10px) [4]; +} + +.testIt { + color: var(color-foreground); + background: var(c); + background-image: var(image); + + border-width: var(b-width); + margin-width: var(m-width); + border-height: var(b-height); + width: var(width); + length: var(length); + -web-stuff: var(web-stuff); + background-color: var(rgba); + + transition: var(transition); + transform: var(transform); + content: var(content); + text-shadow: var(text-shadow); +} + +@font-face { + font-family: var(font-family); + src: var(src); + unicode-range: var(unicode-range); +} + +@font-face { + font-family: var(font-family); + src: var(src-1); + unicode-range: var(unicode-range-1); +} + +.foobar { + grid-columns: var(grid-columns); +} +'''; + + final generated = ''':root { + var-color-background: #f00; + var-color-foreground: #00f; + var-a: var(b); + var-b: var(c); + var-c: #0f0; + var-image: url("test.png"); + var-b-width: 20cm; + var-m-width: 33%; + var-b-height: 30em; + var-width: .6in; + var-length: 1.2in; + var-web-stuff: -10px; + var-rgba: rgba(10, 20, 255); + var-transition: color 0.4s; + var-transform: rotate(20deg); + var-content: "✔"; + var-text-shadow: 0 -1px 0 #bfbfbf; + var-font-family: Gentium; + var-src: url("http://example.com/fonts/Gentium.ttf"); + var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); + var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; + var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???; + var-grid-columns: 10px ("content" 1fr 10px) [4]; +} +.testIt { + color: var(color-foreground); + background: var(c); + background-image: var(image); + border-width: var(b-width); + margin-width: var(m-width); + border-height: var(b-height); + width: var(width); + length: var(length); + -web-stuff: var(web-stuff); + background-color: var(rgba); + transition: var(transition); + transform: var(transform); + content: var(content); + text-shadow: var(text-shadow); +} +@font-face { + font-family: var(font-family); + src: var(src); + unicode-range: var(unicode-range); +} +@font-face { + font-family: var(font-family); + src: var(src-1); + unicode-range: var(unicode-range-1); +} +.foobar { + grid-columns: var(grid-columns); +}'''; + + var stylesheet = compileCss(input, errors: errors, + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void defaultVar() { + final errors = []; + final input = ''' +:root { + var-color-background: red; + var-color-foreground: blue; + + var-a: var(b); + var-b: var(c); + var-c: #00ff00; + + var-image: url(test.png); + + var-b-width: 20cm; + var-m-width: 33%; + var-b-height: 30EM; +} + +.test { + background-color: var(test, orange); +} + +body { + background: var(a) var(image) no-repeat right top; +} + +div { + background: var(color-background) url('img_tree.png') no-repeat right top; +} + +.test-2 { + background: var(color-background) var(image-2, url('img_1.png')) + no-repeat right top; +} + +.test-3 { + background: var(color-background) var(image-2) no-repeat right top; +} + +.test-4 { + background: #ffff00 var(image) no-repeat right top; +} + +.test-5 { + background: var(test-color, var(a)) var(image) no-repeat right top; +} + +.test-6 { + border: red var(a-1, solid 20px); +} +'''; + + final generated = ''':root { + var-color-background: #f00; + var-color-foreground: #00f; + var-a: var(b); + var-b: var(c); + var-c: #0f0; + var-image: url("test.png"); + var-b-width: 20cm; + var-m-width: 33%; + var-b-height: 30em; +} +.test { + background-color: var(test, #ffa500); +} +body { + background: var(a) var(image) no-repeat right top; +} +div { + background: var(color-background) url("img_tree.png") no-repeat right top; +} +.test-2 { + background: var(color-background) var(image-2, url("img_1.png")) no-repeat right top; +} +.test-3 { + background: var(color-background) var(image-2) no-repeat right top; +} +.test-4 { + background: #ff0 var(image) no-repeat right top; +} +.test-5 { + background: var(test-color, var(a)) var(image) no-repeat right top; +} +.test-6 { + border: #f00 var(a-1, solid 20px); +}'''; + + var stylesheet = compileCss(input, errors: errors, + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void cyclesVar() { + final errors = []; + final input = ''':root { + var-color-background: red; + var-color-foreground: blue; + + var-a: var(b); + var-b: var(c); + var-c: #00ff00; + + var-one: var(two); + var-two: var(one); + + var-four: var(five); + var-five: var(six); + var-six: var(four); + + var-def-1: var(def-2); + var-def-2: var(def-3); + var-def-3: var(def-2); +} +.testIt { + color: var(color-foreground); + background: var(color-background); +} +.test-2 { + color: var(one); +} +'''; + + final generated = ''':root { + var-color-background: #f00; + var-color-foreground: #00f; + var-a: var(b); + var-b: var(c); + var-c: #0f0; +} +.testIt { + color: var(color-foreground); + background: var(color-background); +} +.test-2 { + color: var(one); +}'''; + + var stylesheet = compileCss(input, errors: errors, + opts: ['--no-colors', '--warnings_as_errors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.length, 8, reason: errors.toString()); + expect(errors[0].toString(), + 'error :14:3: var cycle detected var-six\n' + ' var-six: var(four);\n' + ' ^^^^^^^^^^^^^^^^^^'); + expect(errors[1].toString(), + 'error :18:3: var cycle detected var-def-3\n' + ' var-def-3: var(def-2);\n' + ' ^^^^^^^^^^^^^^^^^^^^^'); + expect(errors[2].toString(), + 'error :10:3: var cycle detected var-two\n' + ' var-two: var(one);\n' + ' ^^^^^^^^^^^^^^^^^'); + expect(errors[3].toString(), + 'error :17:3: var cycle detected var-def-2\n' + ' var-def-2: var(def-3);\n' + ' ^^^^^^^^^^^^^^^^^^^^^'); + expect(errors[4].toString(), + 'error :16:3: var cycle detected var-def-1\n' + ' var-def-1: var(def-2);\n' + ' ^^^^^^^^^^^^^^^^^^^^^'); + expect(errors[5].toString(), + 'error :13:3: var cycle detected var-five\n' + ' var-five: var(six);\n' + ' ^^^^^^^^^^^^^^^^^^'); + expect(errors[6].toString(), + 'error :9:3: var cycle detected var-one\n' + ' var-one: var(two);\n' + ' ^^^^^^^^^^^^^^^^^'); + expect(errors[7].toString(), + 'error :12:3: var cycle detected var-four\n' + ' var-four: var(five);\n' + ' ^^^^^^^^^^^^^^^^^^^'); + expect(prettyPrint(stylesheet), generated); +} + +parserVar() { + final errors = []; + final input = ''':root { + var-color-background: red; + var-color-foreground: blue; + + var-a: var(b); + var-b: var(c); + var-c: #00ff00; + + var-image: url(test.png); + + var-b-width: 20cm; + var-m-width: 33%; + var-b-height: 30EM; + var-width: .6in; + var-length: 1.2in; + var-web-stuff: -10Px; + var-rgba: rgba(10,20,255); + var-transition: color 0.4s; + var-transform: rotate(20deg); + var-content: "✔"; + var-text-shadow: 0 -1px 0 #bfbfbf; + var-font-family: Gentium; + var-src: url("http://example.com/fonts/Gentium.ttf"); + var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); + var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; + var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???; + var-grid-columns: 10px ("content" 1fr 10px) [4]; +} + +.testIt { + color: var(color-foreground); + background: var(c); + background-image: var(image); + + border-width: var(b-width); + margin-width: var(m-width); + border-height: var(b-height); + width: var(width); + length: var(length); + -web-stuff: var(web-stuff); + background-color: var(rgba); + + transition: var(transition); + transform: var(transform); + content: var(content); + text-shadow: var(text-shadow); +} + +@font-face { + font-family: var(font-family); + src: var(src); + unicode-range: var(unicode-range); +} + +@font-face { + font-family: var(font-family); + src: var(src-1); + unicode-range: var(unicode-range-1); +} + +.foobar { + grid-columns: var(grid-columns); +} +'''; + + final generated = ''':root { + var-color-background: #f00; + var-color-foreground: #00f; + var-a: var(b); + var-b: var(c); + var-c: #0f0; + var-image: url("test.png"); + var-b-width: 20cm; + var-m-width: 33%; + var-b-height: 30em; + var-width: .6in; + var-length: 1.2in; + var-web-stuff: -10px; + var-rgba: rgba(10, 20, 255); + var-transition: color 0.4s; + var-transform: rotate(20deg); + var-content: "✔"; + var-text-shadow: 0 -1px 0 #bfbfbf; + var-font-family: Gentium; + var-src: url("http://example.com/fonts/Gentium.ttf"); + var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); + var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; + var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???; + var-grid-columns: 10px ("content" 1fr 10px) [4]; +} +.testIt { + color: var(color-foreground); + background: var(c); + background-image: var(image); + border-width: var(b-width); + margin-width: var(m-width); + border-height: var(b-height); + width: var(width); + length: var(length); + -web-stuff: var(web-stuff); + background-color: var(rgba); + transition: var(transition); + transform: var(transform); + content: var(content); + text-shadow: var(text-shadow); +} +@font-face { + font-family: var(font-family); + src: var(src); + unicode-range: var(unicode-range); +} +@font-face { + font-family: var(font-family); + src: var(src-1); + unicode-range: var(unicode-range-1); +} +.foobar { + grid-columns: var(grid-columns); +}'''; + + var stylesheet = parseCss(input, errors: errors, + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +testVar() { + final errors = []; + final input = ''' +@color-background: red; +@color-foreground: blue; + +.test { + background-color: var(color-background); + color: var(color-foreground); +} +'''; + final generated = ''' +var-color-background: #f00; +var-color-foreground: #00f; + +.test { + background-color: var(color-background); + color: var(color-foreground); +}'''; + + var stylesheet = parseCss(input, errors: errors, + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + stylesheet = compileCss(input, errors: errors..clear(), + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + final input2 = ''' +@color-background: red; +@color-foreground: blue; + +.test { + background-color: @color-background; + color: @color-foreground; +} +'''; + final generated2 = '''var-color-background: #f00; +var-color-foreground: #00f; + +.test { + background-color: var(color-background); + color: var(color-foreground); +}'''; + + stylesheet = parseCss(input, errors: errors..clear(), + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated2); + + stylesheet = compileCss(input2, errors: errors..clear(), + opts: ['--no-colors', 'memory', '--no-less']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated2); +} + +testLess() { + final errors = []; + final input = ''' +@color-background: red; +@color-foreground: blue; + +.test { + background-color: var(color-background); + color: var(color-foreground); +} +'''; + final generated = '''var-color-background: #f00; +var-color-foreground: #00f; + +.test { + background-color: var(color-background); + color: var(color-foreground); +}'''; + + var stylesheet = parseCss(input, errors: errors, + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + stylesheet = compileCss(input, errors: errors..clear(), + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); + + final input2 = ''' +@color-background: red; +@color-foreground: blue; + +.test { + background-color: @color-background; + color: @color-foreground; +} +'''; + final generated2 = '''var-color-background: #f00; +var-color-foreground: #00f; + +.test { + background-color: var(color-background); + color: var(color-foreground); +}'''; + + stylesheet = parseCss(input, errors: errors..clear(), + opts: ['--no-colors', 'memory']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated2); + + stylesheet = compileCss(input2, errors: errors..clear(), + opts: ['--no-colors', 'memory', '--no-less']); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated2); +} + +main() { + test('Simple var', simpleVar); + test('Expressions var', expressionsVar); + test('Default value in var()', defaultVar); + test('CSS Parser only var', parserVar); + test('Var syntax', testVar); + test('Cycles var', cyclesVar); + test('Less syntax', testLess); +} diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart new file mode 100644 index 000000000..e60dbc598 --- /dev/null +++ b/pkgs/csslib/test/visitor_test.dart @@ -0,0 +1,114 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library visitor_test; + +import 'dart:utf'; +import 'package:unittest/unittest.dart'; +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; +import 'testing.dart'; + +class ClassVisitor extends Visitor { + final List expectedClasses; + final Set foundClasses = new Set(); + + ClassVisitor(this.expectedClasses); + + void visitClassSelector(ClassSelector node) { + foundClasses.add(node.name); + } + + bool get matches { + bool match = true; + foundClasses.forEach((value) { + match = match && expectedClasses.contains(value); + }); + expectedClasses.forEach((value) { + match = match && foundClasses.contains(value); + }); + + return match; + } +} + +void testClassVisitors() { + var errors = []; + var in1 = '.foobar { }'; + + var s = parseCss(in1, errors: errors); + + expect(s != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + var clsVisits = new ClassVisitor(['foobar'])..visitTree(s); + expect(clsVisits.matches, true); + + in1= ''' + .foobar1 { } + .xyzzy .foo #my-div { color: red; } + div.hello { font: arial; } + '''; + + s = parseCss(in1, errors: errors..clear(), opts: ['--no-colors', 'memory']); + + expect(s != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + clsVisits = + new ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello'])..visitTree(s); + expect(clsVisits.matches, true); + + expect(prettyPrint(s), r''' +.foobar1 { +} +.xyzzy .foo #my-div { + color: #f00; +} +div.hello { + font: arial; +}'''); +} + +class PolyfillEmitter extends CssPrinter { + final String _prefix; + + PolyfillEmitter(this._prefix); + + void visitClassSelector(ClassSelector node) { + emit('.${_prefix}_${node.name}'); + } +} + +String polyfillPrint(String prefix, StyleSheet ss) => + (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString(); + +void testPolyFill() { + var errors = []; + final input = r''' +.foobar { } +div.xyzzy { } +#foo .foo .bar .foobar { } +'''; + + final generated = r''' +.myComponent_foobar { +} +div.myComponent_xyzzy { +} +#foo .myComponent_foo .myComponent_bar .myComponent_foobar { +}'''; + + var s = parseCss(input, errors: errors); + expect(s != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + final emitted = polyfillPrint('myComponent', s); + expect(emitted, generated); +} + +main() { + test('Class Visitors', testClassVisitors); + test('Polyfill', testPolyFill); +} From 48ccb036267cc0a276430f8e993957f94749bbbf Mon Sep 17 00:00:00 2001 From: "lrn@google.com" Date: Tue, 27 Aug 2013 08:43:46 +0000 Subject: [PATCH 002/245] Reapply "Make Map constructors return LinkedHashMap." Updated tests assuming a specific ordering of an unlinked hash map to not be daft. R=floitsch@google.com, jmesserly@google.com Review URL: https://codereview.chromium.org//22859069 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@26693 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/test/var_test.dart | 40 +++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index fb870c727..ecbd22d69 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -207,7 +207,7 @@ div { } .test-2 { - background: var(color-background) var(image-2, url('img_1.png')) + background: var(color-background) var(image-2, url('img_1.png')) no-repeat right top; } @@ -322,38 +322,44 @@ void cyclesVar() { expect(stylesheet != null, true); expect(errors.length, 8, reason: errors.toString()); - expect(errors[0].toString(), + int testBitMap = 0; + var errorStrings = [ 'error :14:3: var cycle detected var-six\n' ' var-six: var(four);\n' - ' ^^^^^^^^^^^^^^^^^^'); - expect(errors[1].toString(), + ' ^^^^^^^^^^^^^^^^^^', 'error :18:3: var cycle detected var-def-3\n' ' var-def-3: var(def-2);\n' - ' ^^^^^^^^^^^^^^^^^^^^^'); - expect(errors[2].toString(), + ' ^^^^^^^^^^^^^^^^^^^^^', 'error :10:3: var cycle detected var-two\n' ' var-two: var(one);\n' - ' ^^^^^^^^^^^^^^^^^'); - expect(errors[3].toString(), + ' ^^^^^^^^^^^^^^^^^', 'error :17:3: var cycle detected var-def-2\n' ' var-def-2: var(def-3);\n' - ' ^^^^^^^^^^^^^^^^^^^^^'); - expect(errors[4].toString(), + ' ^^^^^^^^^^^^^^^^^^^^^', 'error :16:3: var cycle detected var-def-1\n' ' var-def-1: var(def-2);\n' - ' ^^^^^^^^^^^^^^^^^^^^^'); - expect(errors[5].toString(), + ' ^^^^^^^^^^^^^^^^^^^^^', 'error :13:3: var cycle detected var-five\n' ' var-five: var(six);\n' - ' ^^^^^^^^^^^^^^^^^^'); - expect(errors[6].toString(), + ' ^^^^^^^^^^^^^^^^^^', 'error :9:3: var cycle detected var-one\n' ' var-one: var(two);\n' - ' ^^^^^^^^^^^^^^^^^'); - expect(errors[7].toString(), + ' ^^^^^^^^^^^^^^^^^', 'error :12:3: var cycle detected var-four\n' ' var-four: var(five);\n' - ' ^^^^^^^^^^^^^^^^^^^'); + ' ^^^^^^^^^^^^^^^^^^^' + ]; + outer: for (var error in errors) { + var errorString = error.toString(); + for (int i = 0; i < 8; i++) { + if (errorString == errorStrings[i]) { + testBitMap |= 1 << i; + continue outer; + } + } + fail("Unexpected error string: $errorString"); + } + expect(testBitMap, equals((1 << 8) - 1)); expect(prettyPrint(stylesheet), generated); } From c3ea36e0c040baa41d156723ad59f5918e74b68c Mon Sep 17 00:00:00 2001 From: "floitsch@google.com" Date: Tue, 27 Aug 2013 13:18:34 +0000 Subject: [PATCH 003/245] Some more removals of dart:utf. R=jmesserly@google.com, lrn@google.com, nweiz@google.com Review URL: https://codereview.chromium.org//22909059 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@26712 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/test/compiler_test.dart | 4 ++-- pkgs/csslib/test/nested_test.dart | 1 - pkgs/csslib/test/var_test.dart | 1 - pkgs/csslib/test/visitor_test.dart | 1 - 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index ee37f299e..f545a6d30 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -4,7 +4,7 @@ library compiler_test; -import 'dart:utf'; +import 'dart:convert'; import 'package:unittest/unittest.dart'; import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; @@ -521,7 +521,7 @@ void testArrayOfChars() { 'color : #00F578; border-color: #878787;' '}]]>'; - var stylesheet = parse(encodeUtf8(input), errors: errors); + var stylesheet = parse(UTF8.encode(input), errors: errors); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index e6b00255d..5423644bb 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -4,7 +4,6 @@ library nested_test; -import 'dart:utf'; import 'package:unittest/unittest.dart'; import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index ecbd22d69..afdc57023 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -4,7 +4,6 @@ library var_test; -import 'dart:utf'; import 'package:unittest/unittest.dart'; import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index e60dbc598..7fcde970b 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -4,7 +4,6 @@ library visitor_test; -import 'dart:utf'; import 'package:unittest/unittest.dart'; import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; From 93a5e9df07bb730a490220933edbaf4f34f20ea6 Mon Sep 17 00:00:00 2001 From: "terry@google.com" Date: Mon, 9 Sep 2013 23:16:12 +0000 Subject: [PATCH 004/245] Include tests for polyfill and without polyfill BUG= R=sigmund@google.com Review URL: https://codereview.chromium.org//23868008 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@27320 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/parser.dart | 9 +- pkgs/csslib/lib/src/polyfill.dart | 246 ++++++++++++++++++++++++++++++ pkgs/csslib/test/testing.dart | 6 +- pkgs/csslib/test/var_test.dart | 26 ++++ 4 files changed, 284 insertions(+), 3 deletions(-) create mode 100644 pkgs/csslib/lib/src/polyfill.dart diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index a1cd7158d..9f7b3ff1d 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -13,6 +13,7 @@ import 'src/messages.dart'; import 'src/options.dart'; part 'src/analyzer.dart'; +part 'src/polyfill.dart'; part 'src/property.dart'; part 'src/token.dart'; part 'src/tokenizer_base.dart'; @@ -44,7 +45,8 @@ bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. /** Parse and analyze the CSS file. */ -StyleSheet compile(var input, {List errors, List options, bool nested: true}) { +StyleSheet compile(var input, + {List errors, List options, bool nested: true, bool polyfill: false}) { var source = _inputAsString(input); _createMessages(errors: errors, options: options); @@ -55,6 +57,11 @@ StyleSheet compile(var input, {List errors, List options, bool nested: true}) { analyze([tree], errors: errors, options: options); + if (polyfill) { + var processCss = new PolyFill(messages, true); + processCss.process(tree); + } + return tree; } diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart new file mode 100644 index 000000000..ab56771e6 --- /dev/null +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -0,0 +1,246 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of csslib.parser; + +/** + * CSS polyfill emits CSS to be understood by older parsers that which do not + * understand (var, calc, etc.). + */ +class PolyFill { + final Messages _messages; + final bool _warningsAsErrors; + + Set allStyleSheets = new Set(); + + /** + * [_pseudoElements] list of known pseudo attributes found in HTML, any + * CSS pseudo-elements 'name::custom-element' is mapped to the manged name + * associated with the pseudo-element key. + */ + PolyFill(this._messages, this._warningsAsErrors); + + /** + * Run the analyzer on every file that is a style sheet or any component that + * has a style tag. + */ + void process(StyleSheet stylesheet) { + // TODO(terry): Process all imported stylesheets. + + var styleSheets = processVars([stylesheet]); + allStyleSheets.addAll(styleSheets); + + normalize(); + } + + void normalize() { + // Remove all var definitions for all style sheets analyzed. + for (var tree in allStyleSheets) + new _RemoveVarDefinitions().visitTree(tree); + } + + List processVars(List styleSheets) { + // TODO(terry): Process all dependencies. + // Build list of all var definitions. + Map varDefs = new Map(); + for (var tree in styleSheets) { + var allDefs = (new _VarDefinitions()..visitTree(tree)).found; + allDefs.forEach((key, value) { + varDefs[key] = value; + }); + } + + // Resolve all definitions to a non-VarUsage (terminal expression). + varDefs.forEach((key, value) { + for (var expr in (value.expression as Expressions).expressions) { + var def = _findTerminalVarDefinition(varDefs, value); + varDefs[key] = def; + } + }); + + // Resolve all var usages. + for (var tree in styleSheets) { + new _ResolveVarUsages(varDefs).visitTree(tree); + } + + return styleSheets; + } +} + +/** + * Find var- definitions in a style sheet. + * [found] list of known definitions. + */ +class _VarDefinitions extends Visitor { + final Map found = new Map(); + + void visitTree(StyleSheet tree) { + visitStyleSheet(tree); + } + + visitVarDefinition(VarDefinition node) { + // Replace with latest variable definition. + found[node.definedName] = node; + super.visitVarDefinition(node); + } + + void visitVarDefinitionDirective(VarDefinitionDirective node) { + visitVarDefinition(node.def); + } +} + +/** + * Resolve any CSS expression which contains a var() usage to the ultimate real + * CSS expression value e.g., + * + * var-one: var(two); + * var-two: #ff00ff; + * + * .test { + * color: var(one); + * } + * + * then .test's color would be #ff00ff + */ +class _ResolveVarUsages extends Visitor { + final Map varDefs; + bool inVarDefinition = false; + bool inUsage = false; + Expressions currentExpressions; + + _ResolveVarUsages(this.varDefs); + + void visitTree(StyleSheet tree) { + visitStyleSheet(tree); + } + + void visitVarDefinition(VarDefinition varDef) { + inVarDefinition = true; + super.visitVarDefinition(varDef); + inVarDefinition = false; + } + + void visitExpressions(Expressions node) { + currentExpressions = node; + super.visitExpressions(node); + currentExpressions = null; + } + + void visitVarUsage(VarUsage node) { + // Don't process other var() inside of a varUsage. That implies that the + // default is a var() too. Also, don't process any var() inside of a + // varDefinition (they're just place holders until we've resolved all real + // usages. + if (!inUsage && !inVarDefinition && currentExpressions != null) { + var expressions = currentExpressions.expressions; + var index = expressions.indexOf(node); + assert(index >= 0); + var def = varDefs[node.name]; + if (def != null) { + // Found a VarDefinition use it. + _resolveVarUsage(currentExpressions.expressions, index, def); + } else if (node.defaultValues.any((e) => e is VarUsage)) { + // Don't have a VarDefinition need to use default values resolve all + // default values. + var terminalDefaults = []; + for (var defaultValue in node.defaultValues) { + terminalDefaults.addAll(resolveUsageTerminal(defaultValue)); + } + expressions.replaceRange(index, index + 1, terminalDefaults); + } else { + // No VarDefinition but default value is a terminal expression; use it. + expressions.replaceRange(index, index + 1, node.defaultValues); + } + } + + inUsage = true; + super.visitVarUsage(node); + inUsage = false; + } + + List resolveUsageTerminal(VarUsage usage) { + var result = []; + + var varDef = varDefs[usage.name]; + var expressions; + if (varDef == null) { + // VarDefinition not found try the defaultValues. + expressions = usage.defaultValues; + } else { + // Use the VarDefinition found. + expressions = (varDef.expression as Expressions).expressions; + } + + for (var expr in expressions) { + if (expr is VarUsage) { + // Get terminal value. + result.addAll(resolveUsageTerminal(expr)); + } + } + + // We're at a terminal just return the VarDefinition expression. + if (result.isEmpty && varDef != null) { + result = (varDef.expression as Expressions).expressions; + } + + return result; + } + + _resolveVarUsage(List expressions, int index, + VarDefinition def) { + var defExpressions = (def.expression as Expressions).expressions; + expressions.replaceRange(index, index + 1, defExpressions); + } +} + +/** Remove all var definitions. */ +class _RemoveVarDefinitions extends Visitor { + void visitTree(StyleSheet tree) { + visitStyleSheet(tree); + } + + void visitStyleSheet(StyleSheet ss) { + ss.topLevels.removeWhere((e) => e is VarDefinitionDirective); + super.visitStyleSheet(ss); + } + + void visitDeclarationGroup(DeclarationGroup node) { + node.declarations.removeWhere((e) => e is VarDefinition); + super.visitDeclarationGroup(node); + } +} + +/** Find terminal definition (non VarUsage implies real CSS value). */ +VarDefinition _findTerminalVarDefinition(Map varDefs, + VarDefinition varDef) { + var expressions = varDef.expression as Expressions; + for (var expr in expressions.expressions) { + if (expr is VarUsage) { + var usageName = (expr as VarUsage).name; + var foundDef = varDefs[usageName]; + + // If foundDef is unknown check if defaultValues; if it exist then resolve + // to terminal value. + if (foundDef == null) { + // We're either a VarUsage or terminal definition if in varDefs; + // either way replace VarUsage with it's default value because the + // VarDefinition isn't found. + var defaultValues = (expr as VarUsage).defaultValues; + var replaceExprs = expressions.expressions; + assert(replaceExprs.length == 1); + replaceExprs.replaceRange(0, 1, defaultValues); + return varDef; + } + if (foundDef is VarDefinition) { + return _findTerminalVarDefinition(varDefs, foundDef); + } + } else { + // Return real CSS property. + return varDef; + } + } + + // Didn't point to a var definition that existed. + return varDef; +} diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index e7b14bdc4..f2e1273b0 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -27,9 +27,11 @@ StyleSheet parseCss(String cssInput, {List errors, List opts}) => * CSS will allow any property/value pairs regardless of validity; all of our * tests (by default) will ensure that the CSS is really valid. */ -StyleSheet compileCss(String cssInput, {List errors, List opts}) => +StyleSheet compileCss(String cssInput, + {List errors, List opts, bool polyfill: false}) => compile(cssInput, errors: errors, options: opts == null ? - ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts); + ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts, + polyfill: polyfill); /** CSS emitter walks the style sheet tree and emits readable CSS. */ var _emitCss = new CssPrinter(); diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index afdc57023..11e94be3d 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -623,6 +623,31 @@ var-color-foreground: #00f; expect(prettyPrint(stylesheet), generated2); } +void polyfill() { + var errors = []; + var input = r''' +@color-background: red; +@color-foreground: blue; +.test { + background-color: @color-background; + color: @color-foreground; +}'''; + + var generated = r'''.test { + background-color: #f00; + color: #00f; +}'''; + + var stylesheet = compileCss(input, errors: errors, + opts: ['--no-colors', 'memory'], polyfill: true); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + + + main() { test('Simple var', simpleVar); test('Expressions var', expressionsVar); @@ -631,4 +656,5 @@ main() { test('Var syntax', testVar); test('Cycles var', cyclesVar); test('Less syntax', testLess); + test('Polyfill', polyfill); } From 3bf385ce1d506b1058f0253a20dab11395a8dcb8 Mon Sep 17 00:00:00 2001 From: "terry@google.com" Date: Fri, 11 Oct 2013 21:03:04 +0000 Subject: [PATCH 005/245] - Added @mixin and @include support for top-level and declarations. - Added parameter support for mixins. - Support var definition with multiple parameters as an @include parameter. - Support @extend and @extend with nested selectors. - Removed hoisting var and cycle checks - can only reference known vars. - Added bunch of tests. BUG= Review URL: https://codereview.chromium.org//23819036 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@28555 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/css.dart | 5 +- pkgs/csslib/lib/parser.dart | 477 +++++++--- pkgs/csslib/lib/src/analyzer.dart | 731 +++++++++++++--- pkgs/csslib/lib/src/css_printer.dart | 55 +- pkgs/csslib/lib/src/messages.dart | 2 - pkgs/csslib/lib/src/options.dart | 6 + pkgs/csslib/lib/src/polyfill.dart | 176 ++-- pkgs/csslib/lib/src/tokenkind.dart | 39 +- pkgs/csslib/lib/src/tree.dart | 360 +++++++- pkgs/csslib/lib/src/tree_base.dart | 2 + pkgs/csslib/lib/src/tree_printer.dart | 45 + pkgs/csslib/lib/visitor.dart | 39 + pkgs/csslib/test/big_1_test.dart | 1168 +++++++++++++++++++++++++ pkgs/csslib/test/extend_test.dart | 235 +++++ pkgs/csslib/test/mixin_test.dart | 665 ++++++++++++++ pkgs/csslib/test/nested_test.dart | 34 +- pkgs/csslib/test/run_all.dart | 7 +- pkgs/csslib/test/testing.dart | 9 +- pkgs/csslib/test/var_test.dart | 488 ++++++++--- 19 files changed, 4084 insertions(+), 459 deletions(-) create mode 100644 pkgs/csslib/test/big_1_test.dart create mode 100644 pkgs/csslib/test/extend_test.dart create mode 100644 pkgs/csslib/test/mixin_test.dart diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index ebfc67525..92070ad06 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -1,13 +1,10 @@ -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. library css; -import 'dart:async'; -import 'dart:collection'; import 'dart:io'; -import 'dart:math' as Math; import 'package:path/path.dart' as path; import 'package:source_maps/span.dart' show SourceFile; diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 9f7b3ff1d..fd5a0c2bc 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -45,21 +45,25 @@ bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. /** Parse and analyze the CSS file. */ -StyleSheet compile(var input, - {List errors, List options, bool nested: true, bool polyfill: false}) { +StyleSheet compile(var input, {List errors, List options, bool nested: true, + bool polyfill: false, List includes: null}) { + if (includes == null) { + includes = []; + } + var source = _inputAsString(input); _createMessages(errors: errors, options: options); var file = new SourceFile.text(null, source); - var tree = new Parser(file, source).parse(); + var tree = new _Parser(file, source).parse(); analyze([tree], errors: errors, options: options); if (polyfill) { var processCss = new PolyFill(messages, true); - processCss.process(tree); + processCss.process(tree, includes: includes); } return tree; @@ -83,7 +87,7 @@ StyleSheet parse(var input, {List errors, List options}) { var file = new SourceFile.text(null, source); - return new Parser(file, source).parse(); + return new _Parser(file, source).parse(); } /** @@ -98,7 +102,7 @@ StyleSheet selector(var input, {List errors}) { var file = new SourceFile.text(null, source); - return new Parser(file, source).parseSelector(); + return new _Parser(file, source).parseSelector(); } String _inputAsString(var input) { @@ -132,8 +136,20 @@ String _inputAsString(var input) { return source; } -/** A simple recursive descent parser for CSS. */ +// TODO(terry): Consider removing this class when all usages can be eliminated +// or replaced with compile API. +/** Public parsing interface for csslib. */ class Parser { + final _Parser _parser; + + Parser(SourceFile file, String text, {int start: 0, String baseUrl}) : + _parser = new _Parser(file, text, start: start, baseUrl: baseUrl); + + StyleSheet parse() => _parser.parse(); +} + +/** A simple recursive descent parser for CSS. */ +class _Parser { Tokenizer tokenizer; /** Base url of CSS file. */ @@ -148,7 +164,7 @@ class Parser { Token _previousToken; Token _peekToken; - Parser(SourceFile file, String text, {int start: 0, String baseUrl}) + _Parser(SourceFile file, String text, {int start: 0, String baseUrl}) : this.file = file, _baseUrl = baseUrl, tokenizer = new Tokenizer(file, text, true, start) { @@ -429,60 +445,28 @@ class Parser { } } - // Directive grammar: - // - // import: '@import' [string | URI] media_list? - // media: '@media' media_query_list '{' ruleset '}' - // page: '@page' [':' IDENT]? '{' declarations '}' - // stylet: '@stylet' IDENT '{' ruleset '}' - // media_query_list: IDENT [',' IDENT] - // keyframes: '@-webkit-keyframes ...' (see grammar below). - // font_face: '@font-face' '{' declarations '}' - // namespace: '@namespace name url("xmlns") - // host: '@host '{' ruleset '}' + /** + * Directive grammar: + * + * import: '@import' [string | URI] media_list? + * media: '@media' media_query_list '{' ruleset '}' + * page: '@page' [':' IDENT]? '{' declarations '}' + * stylet: '@stylet' IDENT '{' ruleset '}' + * media_query_list: IDENT [',' IDENT] + * keyframes: '@-webkit-keyframes ...' (see grammar below). + * font_face: '@font-face' '{' declarations '}' + * namespace: '@namespace name url("xmlns") + * host: '@host '{' ruleset '}' + * mixin: '@mixin name [(args,...)] '{' declarations/ruleset '}' + * include: '@include name [(@arg,@arg1)] + * '@include name [(@arg...)] + * content '@content' + */ processDirective() { int start = _peekToken.start; - var tokId = _peek(); - // Handle case for @ directive (where there's a whitespace between the @ - // sign and the directive name. Technically, it's not valid grammar but - // a number of CSS tests test for whitespace between @ and name. - if (tokId == TokenKind.AT) { - Token tok = _next(); - tokId = _peek(); - if (_peekIdentifier()) { - // Is it a directive? - var directive = _peekToken.text; - var directiveLen = directive.length; - tokId = TokenKind.matchDirectives(directive, 0, directiveLen); - if (tokId == -1) { - tokId = TokenKind.matchMarginDirectives(directive, 0, directiveLen); - } - } - - if (tokId == -1) { - if (messages.options.lessSupport) { - // Less compatibility: - // @name: value; => var-name: value; (VarDefinition) - // property: @name; => property: var(name); (VarUsage) - var name; - if (_peekIdentifier()) { - name = identifier(); - } - - _eat(TokenKind.COLON); - - Expressions exprs = processExpr(); - - var span = _makeSpan(start); - return new VarDefinitionDirective( - new VarDefinition(name, exprs, span), span); - } else if (isChecked) { - _error('unexpected directive @$_peekToken', _peekToken.span); - } - } - } - + var tokId = processVariableOrDirective(); + if (tokId is VarDefinitionDirective) return tokId; switch (tokId) { case TokenKind.DIRECTIVE_IMPORT: _next(); @@ -748,7 +732,237 @@ class Parser { return new NamespaceDirective(prefix != null ? prefix.name : '', namespaceUri, _makeSpan(start)); + + case TokenKind.DIRECTIVE_MIXIN: + return processMixin(start); + + case TokenKind.DIRECTIVE_INCLUDE: + return processInclude( _makeSpan(start)); + + case TokenKind.DIRECTIVE_CONTENT: + // TODO(terry): TBD + _warning("@content not implemented.", _makeSpan(start)); + return; + } + } + + /** + * Parse the mixin beginning token offset [start]. Returns a [MixinDefinition] + * node. + * + * Mixin grammar: + * + * @mixin IDENT [(args,...)] '{' + * [ruleset | property | directive]* + * '}' + */ + MixinDefinition processMixin(int start) { + _next(); + + var name = identifier(); + + List params = []; + // Any parameters? + if (_maybeEat(TokenKind.LPAREN)) { + var mustHaveParam = false; + var keepGoing = true; + while (keepGoing) { + var varDef = processVariableOrDirective(mixinParameter: true); + if (varDef is VarDefinitionDirective || varDef is VarDefinition) { + params.add(varDef); + } else if (mustHaveParam) { + _warning("Expecting parameter", _makeSpan(_peekToken.start)); + keepGoing = false; + } + if (_maybeEat(TokenKind.COMMA)) { + mustHaveParam = true; + continue; + } + keepGoing = !_maybeEat(TokenKind.RPAREN); + } + } + + _eat(TokenKind.LBRACE); + + List productions = []; + List declarations = []; + var mixinDirective; + + start = _peekToken.start; + while (!_maybeEat(TokenKind.END_OF_FILE)) { + var directive = processDirective(); + if (directive != null) { + productions.add(directive); + continue; + } + + var declGroup = processDeclarations(checkBrace: false); + var decls = []; + if (declGroup.declarations.any((decl) { + return decl is Declaration && + decl is! IncludeMixinAtDeclaration; + })) { + var newDecls = []; + productions.forEach((include) { + // If declGroup has items that are declarations then we assume + // this mixin is a declaration mixin not a top-level mixin. + if (include is IncludeDirective) { + newDecls.add(new IncludeMixinAtDeclaration(include, + include.span)); + } else { + _warning("Error mixing of top-level vs declarations mixins", + _makeSpan(include)); + } + }); + declGroup.declarations.insertAll(0, newDecls); + productions = []; + } else { + // Declarations are just @includes make it a list of productions + // not a declaration group (anything else is a ruleset). Make it a + // list of productions, not a declaration group. + for (var decl in declGroup.declarations) { + productions.add(decl is IncludeMixinAtDeclaration ? + decl.include : decl); + }; + declGroup.declarations.clear(); + } + + if (declGroup.declarations.isNotEmpty) { + if (productions.isEmpty) { + mixinDirective = new MixinDeclarationDirective(name.name, params, + false, declGroup, _makeSpan(start)); + break; + } else { + for (var decl in declGroup.declarations) { + productions.add(decl is IncludeMixinAtDeclaration ? + decl.include : decl); + } + } + } else { + mixinDirective = new MixinRulesetDirective(name.name, params, + false, productions, _makeSpan(start)); + break; + } + } + + if (productions.isNotEmpty) { + mixinDirective = new MixinRulesetDirective(name.name, params, + false, productions, _makeSpan(start)); + } + + _eat(TokenKind.RBRACE); + + return mixinDirective; + } + + /** + * Returns a VarDefinitionDirective or VarDefinition if a varaible otherwise + * return the token id of a directive or -1 if neither. + */ + processVariableOrDirective({bool mixinParameter: false}) { + int start = _peekToken.start; + + var tokId = _peek(); + // Handle case for @ directive (where there's a whitespace between the @ + // sign and the directive name. Technically, it's not valid grammar but + // a number of CSS tests test for whitespace between @ and name. + if (tokId == TokenKind.AT) { + Token tok = _next(); + tokId = _peek(); + if (_peekIdentifier()) { + // Is it a directive? + var directive = _peekToken.text; + var directiveLen = directive.length; + tokId = TokenKind.matchDirectives(directive, 0, directiveLen); + if (tokId == -1) { + tokId = TokenKind.matchMarginDirectives(directive, 0, directiveLen); + } + } + + if (tokId == -1) { + if (messages.options.lessSupport) { + // Less compatibility: + // @name: value; => var-name: value; (VarDefinition) + // property: @name; => property: var(name); (VarUsage) + var name; + if (_peekIdentifier()) { + name = identifier(); + } + + Expressions exprs; + if (mixinParameter && _maybeEat(TokenKind.COLON)) { + exprs = processExpr(); + } else if (!mixinParameter) { + _eat(TokenKind.COLON); + exprs = processExpr(); + } + + var span = _makeSpan(start); + return new VarDefinitionDirective( + new VarDefinition(name, exprs, span), span); + } else if (isChecked) { + _error('unexpected directive @$_peekToken', _peekToken.span); + } + } + } else if (mixinParameter && _peekToken.kind == TokenKind.VAR_DEFINITION) { + _next(); + var definedName; + if (_peekIdentifier()) definedName = identifier(); + + Expressions exprs; + if (_maybeEat(TokenKind.COLON)) { + exprs = processExpr(); + } + + return new VarDefinition(definedName, exprs, _makeSpan(start)); } + + return tokId; + } + + IncludeDirective processInclude(Span span, {bool eatSemiColon: true}) { + /* Stylet grammar: + * + * @include IDENT [(args,...)]; + */ + _next(); + + var name; + if (_peekIdentifier()) { + name = identifier(); + } + + var params = []; + + // Any parameters? Parameters can be multiple terms per argument e.g., + // 3px solid yellow, green is two parameters: + // 1. 3px solid yellow + // 2. green + // the first has 3 terms and the second has 1 term. + if (_maybeEat(TokenKind.LPAREN)) { + var terms = []; + var expr; + var keepGoing = true; + while (keepGoing && (expr = processTerm()) != null) { + // VarUsage is returns as a list + terms.add(expr is List ? expr[0] : expr); + keepGoing = !_peekKind(TokenKind.RPAREN); + if (keepGoing) { + if (_maybeEat(TokenKind.COMMA)) { + params.add(terms); + terms = []; + } + } + } + params.add(terms); + _maybeEat(TokenKind.RPAREN); + } + + if (eatSemiColon) { + _eat(TokenKind.SEMICOLON); + } + + return new IncludeDirective(name.name, params, span); } RuleSet processRuleSet([SelectorGroup selectorGroup]) { @@ -809,7 +1023,7 @@ class Parser { } } - processDeclarations({bool checkBrace: true}) { + DeclarationGroup processDeclarations({bool checkBrace: true}) { int start = _peekToken.start; if (checkBrace) _eat(TokenKind.LBRACE); @@ -1165,56 +1379,7 @@ class Parser { return new ClassSelector(id, _makeSpan(start)); case TokenKind.COLON: // :pseudo-class ::pseudo-element - // TODO(terry): '::' should be token. - _eat(TokenKind.COLON); - bool pseudoElement = _maybeEat(TokenKind.COLON); - - // TODO(terry): If no identifier specified consider optimizing out the - // : or :: and making this a normal selector. For now, - // create an empty pseudoName. - var pseudoName; - if (_peekIdentifier()) { - pseudoName = identifier(); - } else { - return null; - } - - // Functional pseudo? - if (_maybeEat(TokenKind.LPAREN)) { - if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') { - // Negation : ':NOT(' S* negation_arg S* ')' - var negArg = simpleSelector(); - - _eat(TokenKind.RPAREN); - return new NegationSelector(negArg, _makeSpan(start)); - } else { - // Handle function expression. - var span = _makeSpan(start); - var expr = processSelectorExpression(); - - // Used during selector look-a-head if not a SelectorExpression is - // bad. - if (expr is! SelectorExpression) { - _errorExpected("CSS expression"); - return null; - } - - _eat(TokenKind.RPAREN); - return (pseudoElement) ? - new PseudoElementFunctionSelector(pseudoName, expr, span) : - new PseudoClassFunctionSelector(pseudoName, expr, span); - } - } - - // TODO(terry): Need to handle specific pseudo class/element name and - // backward compatible names that are : as well as :: as well as - // parameters. Current, spec uses :: for pseudo-element and : for - // pseudo-class. However, CSS2.1 allows for : to specify old - // pseudo-elements (:first-line, :first-letter, :before and :after) any - // new pseudo-elements defined would require a ::. - return pseudoElement ? - new PseudoElementSelector(pseudoName, _makeSpan(start)) : - new PseudoClassSelector(pseudoName, _makeSpan(start)); + return processPseudoSelector(start); case TokenKind.LBRACK: return processAttribute(); case TokenKind.DOUBLE: @@ -1225,6 +1390,60 @@ class Parser { } } + processPseudoSelector(int start) { + // :pseudo-class ::pseudo-element + // TODO(terry): '::' should be token. + _eat(TokenKind.COLON); + bool pseudoElement = _maybeEat(TokenKind.COLON); + + // TODO(terry): If no identifier specified consider optimizing out the + // : or :: and making this a normal selector. For now, + // create an empty pseudoName. + var pseudoName; + if (_peekIdentifier()) { + pseudoName = identifier(); + } else { + return null; + } + + // Functional pseudo? + if (_maybeEat(TokenKind.LPAREN)) { + if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') { + // Negation : ':NOT(' S* negation_arg S* ')' + var negArg = simpleSelector(); + + _eat(TokenKind.RPAREN); + return new NegationSelector(negArg, _makeSpan(start)); + } else { + // Handle function expression. + var span = _makeSpan(start); + var expr = processSelectorExpression(); + + // Used during selector look-a-head if not a SelectorExpression is + // bad. + if (expr is! SelectorExpression) { + _errorExpected("CSS expression"); + return null; + } + + _eat(TokenKind.RPAREN); + return (pseudoElement) ? + new PseudoElementFunctionSelector(pseudoName, expr, span) : + new PseudoClassFunctionSelector(pseudoName, expr, span); + } + } + + // TODO(terry): Need to handle specific pseudo class/element name and + // backward compatible names that are : as well as :: as well as + // parameters. Current, spec uses :: for pseudo-element and : for + // pseudo-class. However, CSS2.1 allows for : to specify old + // pseudo-elements (:first-line, :first-letter, :before and :after) any + // new pseudo-elements defined would require a ::. + return pseudoElement ? + new PseudoElementSelector(pseudoName, _makeSpan(start)) : + new PseudoClassSelector(pseudoName, _makeSpan(start)); + } + /** * In CSS3, the expressions are identifiers, strings, or of the form "an+b". * @@ -1411,6 +1630,32 @@ class Parser { Expressions exprs = processExpr(); decl = new VarDefinition(definedName, exprs, _makeSpan(start)); + } else if (_peekToken.kind == TokenKind.DIRECTIVE_INCLUDE) { + // @include mixinName in the declaration area. + var span = _makeSpan(start); + var include = processInclude(span, eatSemiColon: false); + decl = new IncludeMixinAtDeclaration(include, span); + } else if (_peekToken.kind == TokenKind.DIRECTIVE_EXTEND) { + List simpleSequences = []; + + _next(); + var span = _makeSpan(start); + var selector = simpleSelector(); + if (selector == null) { + _warning("@extends expecting simple selector name", span); + } else { + simpleSequences.add(selector); + } + if (_peekKind(TokenKind.COLON)) { + var pseudoSelector = processPseudoSelector(_peekToken.start); + if (pseudoSelector is PseudoElementSelector || + pseudoSelector is PseudoClassSelector) { + simpleSequences.add(pseudoSelector); + } else { + _warning("not a valid selector", span); + } + } + decl = new ExtendDeclaration(simpleSequences, span); } return decl; @@ -1791,7 +2036,13 @@ class Parser { } if (expr != null) { - expressions.add(expr); + if (expr is List) { + expr.forEach((exprItem) { + expressions.add(exprItem); + }); + } else { + expressions.add(expr); + } } else { keepGoing = false; } @@ -1985,7 +2236,9 @@ class Parser { } var param = expr.expressions[0]; - return new VarUsage(param.text, [], _makeSpan(start)); + var varUsage = new VarUsage(param.text, [], _makeSpan(start)); + expr.expressions[0] = varUsage; + return expr.expressions; } break; } diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 9e366a5fd..cd0c6fbb3 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -5,6 +5,9 @@ part of csslib.parser; +// TODO(terry): Add optimizing phase to remove duplicated selectors in the same +// selector group (e.g., .btn, .btn { color: red; }). Also, look +// at simplifying selectors expressions too (much harder). // TODO(terry): Detect invalid directive usage. All @imports must occur before // all rules other than @charset directive. Any @import directive // after any non @charset or @import directive are ignored. e.g., @@ -23,132 +26,35 @@ part of csslib.parser; class Analyzer { final List _styleSheets; final Messages _messages; - VarDefinitions varDefs; Analyzer(this._styleSheets, this._messages); + // TODO(terry): Currently each feature walks the AST each time. Once we have + // our complete feature set consider benchmarking the cost and + // possibly combine in one walk. void run() { - varDefs = new VarDefinitions(_styleSheets); - - // Any cycles? - var cycles = findAllCycles(); - for (var cycle in cycles) { - _messages.warning("var cycle detected var-${cycle.definedName}", - cycle.span); - // TODO(terry): What if no var definition for a var usage an error? - // TODO(terry): Ensure a var definition imported from a different style - // sheet works. - } + // Expand top-level @include. + _styleSheets.forEach((styleSheet) => + TopLevelIncludes.expand(_messages, _styleSheets)); - // Remove any var definition from the stylesheet that has a cycle. + // Expand @include in declarations. _styleSheets.forEach((styleSheet) => - new RemoveVarDefinitions(cycles).visitStyleSheet(styleSheet)); + DeclarationIncludes.expand(_messages, _styleSheets)); + + // Remove all @mixin and @include + _styleSheets.forEach((styleSheet) => MixinsAndIncludes.remove(styleSheet)); // Expand any nested selectors using selector desendant combinator to // signal CSS inheritance notation. _styleSheets.forEach((styleSheet) => new ExpandNestedSelectors() ..visitStyleSheet(styleSheet) ..flatten(styleSheet)); - } - - List findAllCycles() { - var cycles = []; - - varDefs.map.values.forEach((value) { - if (hasCycle(value.property)) cycles.add(value); - }); - - // Update our local list of known varDefs remove any varDefs with a cycle. - // So the same varDef cycle isn't reported for each style sheet processed. - for (var cycle in cycles) { - varDefs.map.remove(cycle.property); - } - - return cycles; - } - - Iterable variablesOf(Expressions exprs) => - exprs.expressions.where((e) => e is VarUsage); - - bool hasCycle(String varName, {Set visiting, Set visited}) { - if (visiting == null) visiting = new Set(); - if (visited == null) visited = new Set(); - if (visiting.contains(varName)) return true; - if (visited.contains(varName)) return false; - visiting.add(varName); - visited.add(varName); - bool cycleDetected = false; - if (varDefs.map[varName] != null) { - for (var usage in variablesOf(varDefs.map[varName].expression)) { - if (hasCycle(usage.name, visiting: visiting, visited: visited)) { - cycleDetected = true; - break; - } - } - } - visiting.remove(varName); - return cycleDetected; - } - - // TODO(terry): Need to start supporting @host, custom pseudo elements, - // composition, intrinsics, etc. -} - - -/** Find all var definitions from a list of stylesheets. */ -class VarDefinitions extends Visitor { - /** Map of variable name key to it's definition. */ - final Map map = new Map(); - - VarDefinitions(List styleSheets) { - for (var styleSheet in styleSheets) { - visitTree(styleSheet); - } - } - - void visitVarDefinition(VarDefinition node) { - // Replace with latest variable definition. - map[node.definedName] = node; - super.visitVarDefinition(node); - } - - void visitVarDefinitionDirective(VarDefinitionDirective node) { - visitVarDefinition(node.def); - } -} - -/** - * Remove the var definition from the stylesheet where it is defined; if it is - * a definition from the list to delete. - */ -class RemoveVarDefinitions extends Visitor { - final List _varDefsToRemove; - - RemoveVarDefinitions(this._varDefsToRemove); - void visitStyleSheet(StyleSheet ss) { - var idx = ss.topLevels.length; - while(--idx >= 0) { - var topLevel = ss.topLevels[idx]; - if (topLevel is VarDefinitionDirective && - _varDefsToRemove.contains(topLevel.def)) { - ss.topLevels.removeAt(idx); - } - } - - super.visitStyleSheet(ss); - } - - void visitDeclarationGroup(DeclarationGroup node) { - var idx = node.declarations.length; - while (--idx >= 0) { - var decl = node.declarations[idx]; - if (decl is VarDefinition && _varDefsToRemove.contains(decl)) { - node.declarations.removeAt(idx); - } - } - - super.visitDeclarationGroup(node); + // Expand any @extend. + _styleSheets.forEach((styleSheet) { + var allExtends = new AllExtends()..visitStyleSheet(styleSheet); + new InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet); + }); } } @@ -458,6 +364,13 @@ class ExpandNestedSelectors extends Visitor { super.visitVarDefinition(node); } + void visitExtendDeclaration(ExtendDeclaration node) { + if (_parentRuleSet != null) { + _flatDeclarationGroup.declarations.add(node); + } + super.visitExtendDeclaration(node); + } + void visitMarginGroup(MarginGroup node) { if (_parentRuleSet != null) { _flatDeclarationGroup.declarations.add(node); @@ -511,3 +424,595 @@ class _MediaRulesReplacer extends Visitor { } } } + +/** + * Expand all @include at the top-level the ruleset(s) associated with the + * mixin. + */ +class TopLevelIncludes extends Visitor { + StyleSheet _styleSheet; + final Messages _messages; + /** Map of variable name key to it's definition. */ + final Map map = new Map(); + MixinDefinition currDef; + + static void expand(Messages messages, List styleSheets) { + new TopLevelIncludes(messages, styleSheets); + } + + bool _anyRulesets(MixinRulesetDirective def) => + def.rulesets.any((rule) => rule is RuleSet); + + TopLevelIncludes(this._messages, List styleSheets) { + for (var styleSheet in styleSheets) { + visitTree(styleSheet); + } + } + + void visitStyleSheet(StyleSheet ss) { + _styleSheet = ss; + super.visitStyleSheet(ss); + _styleSheet = null; + } + + void visitIncludeDirective(IncludeDirective node) { + if (map.containsKey(node.name)) { + var mixinDef = map[node.name]; + if (mixinDef is MixinRulesetDirective) { + _TopLevelIncludeReplacer.replace(_messages, _styleSheet, node, + mixinDef.rulesets); + } else if (currDef is MixinRulesetDirective && _anyRulesets(currDef)) { + // currDef is MixinRulesetDirective + MixinRulesetDirective mixinRuleset = currDef; + int index = mixinRuleset.rulesets.indexOf(node as dynamic); + mixinRuleset.rulesets.replaceRange(index, index + 1, [new NoOp()]); + _messages.warning( + 'Using declaration mixin ${node.name} as top-level mixin', + node.span); + } + } else { + if (currDef is MixinRulesetDirective) { + MixinRulesetDirective rulesetDirect = currDef as MixinRulesetDirective; + var index = 0; + rulesetDirect.rulesets.forEach((entry) { + if (entry == node) { + rulesetDirect.rulesets.replaceRange(index, index + 1, [new NoOp()]); + _messages.warning('Undefined mixin ${node.name}', node.span); + } + index++; + }); + } + } + super.visitIncludeDirective(node); + } + + void visitMixinRulesetDirective(MixinRulesetDirective node) { + currDef = node; + + super.visitMixinRulesetDirective(node); + + // Replace with latest top-level mixin definition. + map[node.name] = node; + currDef = null; + } + + void visitMixinDeclarationDirective(MixinDeclarationDirective node) { + currDef = node; + + super.visitMixinDeclarationDirective(node); + + // Replace with latest mixin definition. + map[node.name] = node; + currDef = null; + } +} + +/** @include as a top-level with ruleset(s). */ +class _TopLevelIncludeReplacer extends Visitor { + final Messages _messages; + final IncludeDirective _include; + final List _newRules; + bool _foundAndReplaced = false; + + /** + * Look for the [ruleSet] inside of an @media directive; if found then replace + * with the [newRules]. If [ruleSet] is found and replaced return true. + */ + static bool replace(Messages messages, StyleSheet styleSheet, + IncludeDirective include, ListnewRules) { + var visitor = new _TopLevelIncludeReplacer(messages, include, newRules); + visitor.visitStyleSheet(styleSheet); + return visitor._foundAndReplaced; + } + + _TopLevelIncludeReplacer(this._messages, this._include, this._newRules); + + visitStyleSheet(StyleSheet node) { + var index = node.topLevels.indexOf(_include); + if (index != -1) { + node.topLevels.insertAll(index + 1, _newRules); + node.topLevels.replaceRange(index, index + 1, [new NoOp()]); + _foundAndReplaced = true; + } + super.visitStyleSheet(node); + } + + void visitMixinRulesetDirective(MixinRulesetDirective node) { + var index = node.rulesets.indexOf(_include as dynamic); + if (index != -1) { + node.rulesets.insertAll(index + 1, _newRules); + // Only the resolve the @include once. + node.rulesets.replaceRange(index, index + 1, [new NoOp()]); + _foundAndReplaced = true; + } + super.visitMixinRulesetDirective(node); + } +} + +/** + * Utility function to match an include to a list of either Declarations or + * RuleSets, depending on type of mixin (ruleset or declaration). The include + * can be an include in a declaration or an include directive (top-level). + */ +int _findInclude(List list, var node) { + IncludeDirective matchNode = (node is IncludeMixinAtDeclaration) ? + node.include : node; + + var index = 0; + for (var item in list) { + var includeNode = (item is IncludeMixinAtDeclaration) ? + item.include : item; + if (includeNode == matchNode) return index; + index++; + } + return -1; +} + +/** + * Stamp out a mixin with the defined args substituted with the user's + * parameters. + */ +class CallMixin extends Visitor { + var mixinDef; + List _definedArgs; + Expressions _currExpressions; + int _currIndex = -1; + + final varUsages = new Map>>(); + + /** Only var defs with more than one expression (comma separated). */ + final Map varDefs; + + CallMixin(this.mixinDef, [this.varDefs]) { + if (mixinDef is MixinRulesetDirective) { + visitMixinRulesetDirective(mixinDef); + } else { + visitMixinDeclarationDirective(mixinDef); + } + } + + /** + * Given a mixin's defined arguments return a cloned mixin defintion that has + * replaced all defined arguments with user's supplied VarUsages. + */ + transform(List callArgs) { + // TODO(terry): Handle default arguments and varArgs. + // Transform mixin with callArgs. + var index = 0; + for (var index = 0; index < _definedArgs.length; index++) { + var definedArg = _definedArgs[index]; + VarDefinition varDef; + if (definedArg is VarDefinition) { + varDef = definedArg; + } else if (definedArg is VarDefinitionDirective) { + VarDefinitionDirective varDirective = definedArg; + varDef = varDirective.def; + } + var callArg = callArgs[index]; + + // Is callArg a var definition with multi-args (expressions > 1). + var defArgs = _varDefsAsCallArgs(callArg); + if (defArgs.isNotEmpty) { + // Replace call args with the var def parameters. + callArgs.insertAll(index, defArgs); + callArgs.removeAt(index + defArgs.length); + callArg = callArgs[index]; + } + + var expressions = varUsages[varDef.definedName]; + var expressionsLength = expressions.length; + expressions.forEach((k, v) { + for (var usagesIndex in v) { + k.expressions.replaceRange(usagesIndex, usagesIndex + 1, callArg); + } + }); + } + + // Clone the mixin + return mixinDef.clone(); + } + + /** Rip apart var def with multiple parameters. */ + List> _varDefsAsCallArgs(var callArg) { + var defArgs = []; + if (callArg is List && callArg[0] is VarUsage) { + var varDef = varDefs[callArg[0].name]; + var expressions = varDef.expression.expressions; + assert(expressions.length > 1); + for (var expr in expressions) { + if (expr is! OperatorComma) { + defArgs.add([expr]); + } + } + } + return defArgs; + } + + void visitExpressions(Expressions node) { + var oldExpressions = _currExpressions; + var oldIndex = _currIndex; + + _currExpressions = node; + for (_currIndex = 0; _currIndex < node.expressions.length; _currIndex++) { + node.expressions[_currIndex].visit(this); + } + + _currIndex = oldIndex; + _currExpressions = oldExpressions; + } + + void _addExpression(Map> expressions) { + var indexSet = new Set(); + indexSet.add(_currIndex); + expressions[_currExpressions] = indexSet; + } + + void visitVarUsage(VarUsage node) { + assert(_currIndex != -1); + assert(_currExpressions != null); + if (varUsages.containsKey(node.name)) { + Map> expressions = varUsages[node.name]; + Set allIndexes = expressions[_currExpressions]; + if (allIndexes == null) { + _addExpression(expressions); + } else { + allIndexes.add(_currIndex); + } + } else { + var newExpressions = new Map>(); + _addExpression(newExpressions); + varUsages[node.name] = newExpressions; + } + super.visitVarUsage(node); + } + + void visitMixinDeclarationDirective(MixinDeclarationDirective node) { + _definedArgs = node.definedArgs; + super.visitMixinDeclarationDirective(node); + } + + void visitMixinRulesetDirective(MixinRulesetDirective node) { + _definedArgs = node.definedArgs; + super.visitMixinRulesetDirective(node); + } +} + +/** Expand all @include inside of a declaration associated with a mixin. */ +class DeclarationIncludes extends Visitor { + StyleSheet _styleSheet; + final Messages _messages; + /** Map of variable name key to it's definition. */ + final Map map = new Map(); + /** Cache of mixin called with parameters. */ + final Map callMap = new Map(); + MixinDefinition currDef; + DeclarationGroup currDeclGroup; + + /** Var definitions with more than 1 expression. */ + final Map varDefs = new Map(); + + static void expand(Messages messages, List styleSheets) { + new DeclarationIncludes(messages, styleSheets); + } + + DeclarationIncludes(this._messages, List styleSheets) { + for (var styleSheet in styleSheets) { + visitTree(styleSheet); + } + } + + bool _allIncludes(rulesets) => + rulesets.every((rule) => rule is IncludeDirective || rule is NoOp); + + CallMixin _createCallDeclMixin(mixinDef) { + callMap.putIfAbsent(mixinDef.name, () => + callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs)); + return callMap[mixinDef.name]; + } + + void visitStyleSheet(StyleSheet ss) { + _styleSheet = ss; + super.visitStyleSheet(ss); + _styleSheet = null; + } + + void visitDeclarationGroup(DeclarationGroup node) { + currDeclGroup = node; + super.visitDeclarationGroup(node); + currDeclGroup = null; + } + + void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { + if (map.containsKey(node.include.name)) { + var mixinDef = map[node.include.name]; + + // Fix up any mixin that is really a Declaration but has includes. + if (mixinDef is MixinRulesetDirective) { + if (!_allIncludes(mixinDef.rulesets) && currDeclGroup != null) { + var index = _findInclude(currDeclGroup.declarations, node); + if (index != -1) { + currDeclGroup.declarations.replaceRange(index, index + 1, + [new NoOp()]); + } + _messages.warning( + "Using top-level mixin ${node.include.name} as a declaration", + node.span); + } else { + // We're a list of @include(s) inside of a mixin ruleset - convert + // to a list of IncludeMixinAtDeclaration(s). + var origRulesets = mixinDef.rulesets; + var rulesets = []; + if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) { + origRulesets.forEach((ruleset) { + rulesets.add(new IncludeMixinAtDeclaration(ruleset, + ruleset.span)); + }); + _IncludeReplacer.replace(_styleSheet, node, rulesets); + } + } + } + + if ( mixinDef.definedArgs.length > 0 && node.include.args.length > 0) { + var callMixin = _createCallDeclMixin(mixinDef); + mixinDef = callMixin.transform(node.include.args); + } + + if (mixinDef is MixinDeclarationDirective) { + _IncludeReplacer.replace(_styleSheet, node, + mixinDef.declarations.declarations); + } + } else { + _messages.warning("Undefined mixin ${node.include.name}", node.span); + } + + super.visitIncludeMixinAtDeclaration(node); + } + + void visitIncludeDirective(IncludeDirective node) { + if (map.containsKey(node.name)) { + var mixinDef = map[node.name]; + if (currDef is MixinDeclarationDirective && + mixinDef is MixinDeclarationDirective) { + _IncludeReplacer.replace(_styleSheet, node, + mixinDef.declarations.declarations); + } else if (currDef is MixinDeclarationDirective) { + var decls = (currDef as MixinDeclarationDirective) + .declarations.declarations; + var index = _findInclude(decls, node); + if (index != -1) { + decls.replaceRange(index, index + 1, [new NoOp()]); + } + } + } + + super.visitIncludeDirective(node); + } + + void visitMixinRulesetDirective(MixinRulesetDirective node) { + currDef = node; + + super.visitMixinRulesetDirective(node); + + // Replace with latest top-level mixin definition. + map[node.name] = node; + currDef = null; + } + + void visitMixinDeclarationDirective(MixinDeclarationDirective node) { + currDef = node; + + super.visitMixinDeclarationDirective(node); + + // Replace with latest mixin definition. + map[node.name] = node; + currDef = null; + } + + void visitVarDefinition(VarDefinition node) { + // Only record var definitions that have multiple expressions (comma + // separated for mixin parameter substitution. + var exprs = (node.expression as Expressions).expressions; + if (exprs.length > 1) { + varDefs[node.definedName] = node; + } + super.visitVarDefinition(node); + } + + void visitVarDefinitionDirective(VarDefinitionDirective node) { + visitVarDefinition(node.def); + } +} + +/** @include as a top-level with ruleset(s). */ +class _IncludeReplacer extends Visitor { + final _include; + final List _newDeclarations; + bool _foundAndReplaced = false; + + /** + * Look for the [ruleSet] inside of a @media directive; if found then replace + * with the [newRules]. + */ + static void replace(StyleSheet ss, var include, + List newDeclarations) { + var visitor = new _IncludeReplacer(include, newDeclarations); + visitor.visitStyleSheet(ss); + } + + _IncludeReplacer(this._include, this._newDeclarations); + + void visitDeclarationGroup(DeclarationGroup node) { + var index = _findInclude(node.declarations, _include); + if (index != -1) { + node.declarations.insertAll(index + 1, _newDeclarations); + // Change @include to NoOp so it's processed only once. + node.declarations.replaceRange(index, index + 1, [new NoOp()]); + _foundAndReplaced = true; + } + super.visitDeclarationGroup(node); + } +} + +/** + * Remove all @mixin and @include and any NoOp used as placeholder for @include. + */ +class MixinsAndIncludes extends Visitor { + static void remove(StyleSheet styleSheet) { + new MixinsAndIncludes()..visitStyleSheet(styleSheet); + } + + bool _nodesToRemove(node) => + node is IncludeDirective || node is MixinDefinition || node is NoOp; + + void visitStyleSheet(StyleSheet ss) { + var index = ss.topLevels.length; + while (--index >= 0) { + if (_nodesToRemove(ss.topLevels[index])) { + ss.topLevels.removeAt(index); + } + } + super.visitStyleSheet(ss); + } + + void visitDeclarationGroup(DeclarationGroup node) { + var index = node.declarations.length; + while (--index >= 0) { + if (_nodesToRemove(node.declarations[index])) { + node.declarations.removeAt(index); + } + } + super.visitDeclarationGroup(node); + } +} + +/** Find all @extend to create inheritance. */ +class AllExtends extends Visitor { + final Map> inherits = + new Map>(); + + SelectorGroup _currSelectorGroup; + List _currDecls; + int _currDeclIndex; + List _extendsToRemove = []; + + void visitRuleSet(RuleSet node) { + var oldSelectorGroup = _currSelectorGroup; + _currSelectorGroup = node.selectorGroup; + + super.visitRuleSet(node); + + _currSelectorGroup = oldSelectorGroup; + } + + void visitExtendDeclaration(ExtendDeclaration node) { + var inheritName = ""; + for (var selector in node.selectors) { + inheritName += selector.toString(); + } + if (inherits.containsKey(inheritName)) { + inherits[inheritName].add(_currSelectorGroup); + } else { + inherits[inheritName] = [_currSelectorGroup]; + } + + // Remove this @extend + _extendsToRemove.add(_currDeclIndex); + + super.visitExtendDeclaration(node); + } + + void visitDeclarationGroup(DeclarationGroup node) { + var oldDeclIndex = _currDeclIndex; + + var decls = node.declarations; + for (_currDeclIndex = 0; _currDeclIndex < decls.length; _currDeclIndex++) { + decls[_currDeclIndex].visit(this); + } + + if (_extendsToRemove.isNotEmpty) { + var removeTotal = _extendsToRemove.length - 1; + for (var index = removeTotal; index >= 0; index--) { + decls.removeAt(_extendsToRemove[index]); + } + _extendsToRemove.clear(); + } + + _currDeclIndex = oldDeclIndex; + } +} + +// TODO(terry): Need to handle merging selector sequences +// TODO(terry): Need to handle @extend-Only selectors. +// TODO(terry): Need to handle !optional glag. +/** + * Changes any selector that matches @extend. + */ +class InheritExtends extends Visitor { + Messages _messages; + AllExtends _allExtends; + + InheritExtends(this._messages, this._allExtends); + + void visitSelectorGroup(SelectorGroup node) { + for (var selectorsIndex = 0; selectorsIndex < node.selectors.length; + selectorsIndex++) { + var selectors = node.selectors[selectorsIndex]; + var isLastNone = false; + var selectorName = ""; + for (var index = 0; index < selectors.simpleSelectorSequences.length; + index++) { + var simpleSeq = selectors.simpleSelectorSequences[index]; + var namePart = simpleSeq.simpleSelector.toString(); + selectorName = (isLastNone) ? (selectorName + namePart) : namePart; + List matches = _allExtends.inherits[selectorName]; + if (matches != null) { + for (var match in matches) { + // Create a new group. + var newSelectors = selectors.clone(); + var newSeq = match.selectors[0].clone(); + if (isLastNone) { + // Add the inherited selector. + node.selectors.add(newSeq); + } else { + // Replace the selector sequence to the left of the pseudo class + // or pseudo element. + + // Make new selector seq combinator the same as the original. + var orgCombinator = + newSelectors.simpleSelectorSequences[index].combinator; + newSeq.simpleSelectorSequences[0].combinator = orgCombinator; + + newSelectors.simpleSelectorSequences.replaceRange(index, + index + 1, newSeq.simpleSelectorSequences); + node.selectors.add(newSelectors); + } + isLastNone = false; + } + } else { + isLastNone = simpleSeq.isCombinatorNone; + } + } + } + super.visitSelectorGroup(node); + } +} diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index b8000b70a..b532544cc 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -187,6 +187,34 @@ class CssPrinter extends Visitor { emit(';$_newLine'); } + void visitMixinRulesetDirective(MixinRulesetDirective node) { + emit('@mixin ${node.name} {'); + for (var ruleset in node.rulesets) { + ruleset.visit(this); + } + emit('}'); + } + + void visitMixinDeclarationDirective(MixinDeclarationDirective node) { + emit('@mixin ${node.name} {\n'); + visitDeclarationGroup(node.declarations); + emit('}'); + } + + /** + * Added optional newLine for handling @include at top-level vs/ inside of + * a declaration group. + */ + void visitIncludeDirective(IncludeDirective node, [bool topLevel = true]) { + if (topLevel) emit(_newLine); + emit('@include ${node.name}'); + emit(';'); + } + + void visitContentDirective(ContentDirective node) { + // TODO(terry): TBD + } + void visitRuleSet(RuleSet node) { emit("$_newLine"); node._selectorGroup.visit(this); @@ -232,6 +260,19 @@ class CssPrinter extends Visitor { node._expression.visit(this); } + void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { + // Don't emit a new line we're inside of a declaration group. + visitIncludeDirective(node.include, false); + } + + void visitExtendDeclaration(ExtendDeclaration node) { + emit("@extend "); + for (var selector in node.selectors) { + selector.visit(this); + } + } + + void visitSelectorGroup(SelectorGroup node) { var selectors = node._selectors; var selectorsLength = selectors.length; @@ -251,31 +292,31 @@ class CssPrinter extends Visitor { } void visitNamespaceSelector(NamespaceSelector node) { - emit("${node.namespace}|${node.nameAsSimpleSelector.name}"); + emit(node.toString()); } void visitElementSelector(ElementSelector node) { - emit("${node.name}"); + emit(node.toString()); } void visitAttributeSelector(AttributeSelector node) { - emit("[${node.name}${node.matchOperator()}${node.valueToString()}]"); + emit(node.toString()); } void visitIdSelector(IdSelector node) { - emit("#${node.name}"); + emit(node.toString()); } void visitClassSelector(ClassSelector node) { - emit(".${node.name}"); + emit(node.toString()); } void visitPseudoClassSelector(PseudoClassSelector node) { - emit(":${node.name}"); + emit(node.toString()); } void visitPseudoElementSelector(PseudoElementSelector node) { - emit("::${node.name}"); + emit(node.toString()); } void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 3c9f3fcc1..829b419a4 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -7,8 +7,6 @@ library csslib.src.messages; import 'package:logging/logging.dart' show Level; import 'package:source_maps/span.dart' show Span; -import 'package:csslib/parser.dart'; - import 'options.dart'; // TODO(terry): Remove the global messages, use some object that tracks diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/options.dart index a62ef71f0..a344a39dc 100644 --- a/pkgs/csslib/lib/src/options.dart +++ b/pkgs/csslib/lib/src/options.dart @@ -7,6 +7,9 @@ library csslib.src.options; import 'package:args/args.dart'; class PreprocessorOptions { + /** Generate polyfill code (e.g., var, etc.) */ + final bool polyfill; + /** Report warnings as errors. */ final bool warningsAsErrors; @@ -48,6 +51,7 @@ class PreprocessorOptions { checked = args['checked'], lessSupport = args['less'], useColors = args['colors'], + polyfill = args['polyfill'], inputFile = args.rest.length > 0 ? args.rest[0] : null; // tool.dart [options...] @@ -69,6 +73,8 @@ class PreprocessorOptions { help: 'Throw on warnings encountered') ..addFlag('colors', defaultsTo: true, help: 'Display errors/warnings in colored text') + ..addFlag('polyfill', defaultsTo: false, + help: 'Generate polyfill for new CSS features') ..addFlag('help', abbr: 'h', defaultsTo: false, negatable: false, help: 'Displays this help message'); diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index ab56771e6..ef3c7b97d 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. @@ -11,6 +11,8 @@ part of csslib.parser; class PolyFill { final Messages _messages; final bool _warningsAsErrors; + Map _allVarDefinitions = + new Map(); Set allStyleSheets = new Set(); @@ -25,55 +27,45 @@ class PolyFill { * Run the analyzer on every file that is a style sheet or any component that * has a style tag. */ - void process(StyleSheet stylesheet) { - // TODO(terry): Process all imported stylesheets. - - var styleSheets = processVars([stylesheet]); - allStyleSheets.addAll(styleSheets); + void process(StyleSheet styleSheet, {List includes: null}) { + if (includes != null) { + processVarDefinitions(includes); + } + processVars(styleSheet); - normalize(); + // Remove all var definitions for this style sheet. + new _RemoveVarDefinitions().visitTree(styleSheet); } - void normalize() { - // Remove all var definitions for all style sheets analyzed. - for (var tree in allStyleSheets) - new _RemoveVarDefinitions().visitTree(tree); + /** Process all includes looking for var definitions. */ + void processVarDefinitions(List includes) { + for (var include in includes) { + _allVarDefinitions = (new _VarDefinitionsIncludes(_allVarDefinitions) + ..visitTree(include)).varDefs; + } } - List processVars(List styleSheets) { - // TODO(terry): Process all dependencies. + void processVars(StyleSheet styleSheet) { // Build list of all var definitions. - Map varDefs = new Map(); - for (var tree in styleSheets) { - var allDefs = (new _VarDefinitions()..visitTree(tree)).found; - allDefs.forEach((key, value) { - varDefs[key] = value; - }); - } + var mainStyleSheetVarDefs = + (new _VarDefAndUsage(this._messages, _allVarDefinitions) + ..visitTree(styleSheet)).varDefs; // Resolve all definitions to a non-VarUsage (terminal expression). - varDefs.forEach((key, value) { - for (var expr in (value.expression as Expressions).expressions) { - var def = _findTerminalVarDefinition(varDefs, value); - varDefs[key] = def; + mainStyleSheetVarDefs.forEach((key, value) { + for (Expression expr in (value.expression as Expressions).expressions) { + mainStyleSheetVarDefs[key] = + _findTerminalVarDefinition(_allVarDefinitions, value); } }); - - // Resolve all var usages. - for (var tree in styleSheets) { - new _ResolveVarUsages(varDefs).visitTree(tree); - } - - return styleSheets; } } -/** - * Find var- definitions in a style sheet. - * [found] list of known definitions. - */ -class _VarDefinitions extends Visitor { - final Map found = new Map(); +/** Build list of all var definitions in all includes. */ +class _VarDefinitionsIncludes extends Visitor { + final Map varDefs; + + _VarDefinitionsIncludes(this.varDefs); void visitTree(StyleSheet tree) { visitStyleSheet(tree); @@ -81,9 +73,9 @@ class _VarDefinitions extends Visitor { visitVarDefinition(VarDefinition node) { // Replace with latest variable definition. - found[node.definedName] = node; + varDefs[node.definedName] = node; super.visitVarDefinition(node); - } + } void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); @@ -91,78 +83,98 @@ class _VarDefinitions extends Visitor { } /** - * Resolve any CSS expression which contains a var() usage to the ultimate real - * CSS expression value e.g., - * - * var-one: var(two); - * var-two: #ff00ff; - * - * .test { - * color: var(one); - * } - * - * then .test's color would be #ff00ff + * Find var- definitions in a style sheet. + * [found] list of known definitions. */ -class _ResolveVarUsages extends Visitor { - final Map varDefs; - bool inVarDefinition = false; - bool inUsage = false; - Expressions currentExpressions; +class _VarDefAndUsage extends Visitor { + final Messages _messages; + final Map _knownVarDefs; + final Map varDefs = new Map(); - _ResolveVarUsages(this.varDefs); + VarDefinition currVarDefinition; + List currentExpressions; + + _VarDefAndUsage(this._messages, this._knownVarDefs); void visitTree(StyleSheet tree) { visitStyleSheet(tree); } - void visitVarDefinition(VarDefinition varDef) { - inVarDefinition = true; - super.visitVarDefinition(varDef); - inVarDefinition = false; + visitVarDefinition(VarDefinition node) { + // Replace with latest variable definition. + currVarDefinition = node; + + _knownVarDefs[node.definedName] = node; + varDefs[node.definedName] = node; + + super.visitVarDefinition(node); + + currVarDefinition = null; + } + + void visitVarDefinitionDirective(VarDefinitionDirective node) { + visitVarDefinition(node.def); } void visitExpressions(Expressions node) { - currentExpressions = node; + currentExpressions = node.expressions; super.visitExpressions(node); currentExpressions = null; } void visitVarUsage(VarUsage node) { + if (currVarDefinition != null && currVarDefinition.badUsage) return; + // Don't process other var() inside of a varUsage. That implies that the // default is a var() too. Also, don't process any var() inside of a // varDefinition (they're just place holders until we've resolved all real // usages. - if (!inUsage && !inVarDefinition && currentExpressions != null) { - var expressions = currentExpressions.expressions; - var index = expressions.indexOf(node); - assert(index >= 0); - var def = varDefs[node.name]; - if (def != null) { - // Found a VarDefinition use it. - _resolveVarUsage(currentExpressions.expressions, index, def); - } else if (node.defaultValues.any((e) => e is VarUsage)) { - // Don't have a VarDefinition need to use default values resolve all - // default values. - var terminalDefaults = []; - for (var defaultValue in node.defaultValues) { - terminalDefaults.addAll(resolveUsageTerminal(defaultValue)); + var expressions = currentExpressions; + var index = expressions.indexOf(node); + assert(index >= 0); + var def = _knownVarDefs[node.name]; + if (def != null) { + if (def.badUsage) { + // Remove any expressions pointing to a bad var definition. + expressions.removeAt(index); + return; + } + _resolveVarUsage(currentExpressions, index, + _findTerminalVarDefinition(_knownVarDefs, def)); + } else if (node.defaultValues.any((e) => e is VarUsage)) { + // Don't have a VarDefinition need to use default values resolve all + // default values. + var terminalDefaults = []; + for (var defaultValue in node.defaultValues) { + terminalDefaults.addAll(resolveUsageTerminal(defaultValue)); + } + expressions.replaceRange(index, index + 1, terminalDefaults); + } else if (node.defaultValues.isNotEmpty){ + // No VarDefinition but default value is a terminal expression; use it. + expressions.replaceRange(index, index + 1, node.defaultValues); + } else { + if (currVarDefinition != null) { + currVarDefinition.badUsage = true; + var mainStyleSheetDef = varDefs[node.name]; + if (mainStyleSheetDef != null) { + varDefs.remove(currVarDefinition.property); } - expressions.replaceRange(index, index + 1, terminalDefaults); - } else { - // No VarDefinition but default value is a terminal expression; use it. - expressions.replaceRange(index, index + 1, node.defaultValues); } + // Remove var usage that points at an undefined definition. + expressions.removeAt(index); + _messages.warning("Variable is not defined.", node.span); } - inUsage = true; + var oldExpressions = currentExpressions; + currentExpressions = node.defaultValues; super.visitVarUsage(node); - inUsage = false; + currentExpressions = oldExpressions; } List resolveUsageTerminal(VarUsage usage) { var result = []; - var varDef = varDefs[usage.name]; + var varDef = _knownVarDefs[usage.name]; var expressions; if (varDef == null) { // VarDefinition not found try the defaultValues. diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index ebe0615ea..b9d4309cd 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -142,20 +142,24 @@ class TokenKind { static const int UNIT_VIEWPORT_VMAX = 626; // Directives (@nnnn) - static const int DIRECTIVE_NONE = 650; - static const int DIRECTIVE_IMPORT = 651; - static const int DIRECTIVE_MEDIA = 652; - static const int DIRECTIVE_PAGE = 653; - static const int DIRECTIVE_CHARSET = 654; - static const int DIRECTIVE_STYLET = 655; - static const int DIRECTIVE_KEYFRAMES = 656; - static const int DIRECTIVE_WEB_KIT_KEYFRAMES = 657; - static const int DIRECTIVE_MOZ_KEYFRAMES = 658; - static const int DIRECTIVE_MS_KEYFRAMES = 659; - static const int DIRECTIVE_O_KEYFRAMES = 660; - static const int DIRECTIVE_FONTFACE = 661; - static const int DIRECTIVE_NAMESPACE = 662; - static const int DIRECTIVE_HOST = 663; + static const int DIRECTIVE_NONE = 640; + static const int DIRECTIVE_IMPORT = 641; + static const int DIRECTIVE_MEDIA = 642; + static const int DIRECTIVE_PAGE = 643; + static const int DIRECTIVE_CHARSET = 644; + static const int DIRECTIVE_STYLET = 645; + static const int DIRECTIVE_KEYFRAMES = 646; + static const int DIRECTIVE_WEB_KIT_KEYFRAMES = 647; + static const int DIRECTIVE_MOZ_KEYFRAMES = 648; + static const int DIRECTIVE_MS_KEYFRAMES = 649; + static const int DIRECTIVE_O_KEYFRAMES = 650; + static const int DIRECTIVE_FONTFACE = 651; + static const int DIRECTIVE_NAMESPACE = 652; + static const int DIRECTIVE_HOST = 653; + static const int DIRECTIVE_MIXIN = 654; + static const int DIRECTIVE_INCLUDE = 655; + static const int DIRECTIVE_CONTENT = 656; + static const int DIRECTIVE_EXTEND = 657; // Media query operators static const int MEDIA_OP_ONLY = 665; // Unary. @@ -205,6 +209,10 @@ class TokenKind { const {'type': TokenKind.DIRECTIVE_FONTFACE, 'value' : 'font-face'}, const {'type': TokenKind.DIRECTIVE_NAMESPACE, 'value' : 'namespace'}, const {'type': TokenKind.DIRECTIVE_HOST, 'value' : 'host'}, + const {'type': TokenKind.DIRECTIVE_MIXIN, 'value' : 'mixin'}, + const {'type': TokenKind.DIRECTIVE_INCLUDE, 'value' : 'include'}, + const {'type': TokenKind.DIRECTIVE_CONTENT, 'value' : 'content'}, + const {'type': TokenKind.DIRECTIVE_EXTEND, 'value' : 'extend'}, ]; static const List> MEDIA_OPERATORS = const [ @@ -684,6 +692,9 @@ class TokenKind { case TokenKind.DIRECTIVE_FONTFACE: case TokenKind.DIRECTIVE_NAMESPACE: case TokenKind.DIRECTIVE_HOST: + case TokenKind.DIRECTIVE_MIXIN: + case TokenKind.DIRECTIVE_INCLUDE: + case TokenKind.DIRECTIVE_CONTENT: case TokenKind.UNIT_EM: case TokenKind.UNIT_EX: case TokenKind.UNIT_LENGTH_PX: diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index e8411d31f..1de595709 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -13,6 +13,8 @@ class Identifier extends TreeNode { Identifier(this.name, Span span): super(span); + Identifier clone() => new Identifier(name, span); + visit(VisitorBase visitor) => visitor.visitIdentifier(this); String toString() => name; @@ -20,16 +22,19 @@ class Identifier extends TreeNode { class Wildcard extends TreeNode { Wildcard(Span span): super(span); + Wildcard clone() => new Wildcard(span); visit(VisitorBase visitor) => visitor.visitWildcard(this); } class ThisOperator extends TreeNode { ThisOperator(Span span): super(span); + ThisOperator clone() => new ThisOperator(span); visit(VisitorBase visitor) => visitor.visitThisOperator(this); } class Negation extends TreeNode { Negation(Span span): super(span); + Negation clone() => new Negation(span); visit(VisitorBase visitor) => visitor.visitNegation(this); } @@ -38,12 +43,14 @@ class CssComment extends TreeNode { final String comment; CssComment(this.comment, Span span): super(span); + CssComment clone() => new CssComment(comment, span); visit(VisitorBase visitor) => visitor.visitCssComment(this); } // CDO/CDC (Comment Definition Open ). class CommentDefinition extends CssComment { CommentDefinition(String comment, Span span): super(comment, span); + CommentDefinition clone() => new CommentDefinition(comment, span); visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); } @@ -54,6 +61,8 @@ class SelectorGroup extends TreeNode { List get selectors => _selectors; + SelectorGroup clone() => new SelectorGroup(_selectors, span); + visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); } @@ -69,26 +78,34 @@ class Selector extends TreeNode { int get length => _simpleSelectorSequences.length; + Selector clone() { + var simpleSequences = []; + for (var simpleSeq in simpleSelectorSequences) { + simpleSequences.add(simpleSeq.clone()); + } + return new Selector(simpleSequences, span); + } + visit(VisitorBase visitor) => visitor.visitSelector(this); } class SimpleSelectorSequence extends TreeNode { /** +, >, ~, NONE */ - final int _combinator; + int combinator; final SimpleSelector _selector; SimpleSelectorSequence(this._selector, Span span, [int combinator = TokenKind.COMBINATOR_NONE]) - : _combinator = combinator, super(span); + : combinator = combinator, super(span); get simpleSelector => _selector; - bool get isCombinatorNone => _combinator == TokenKind.COMBINATOR_NONE; - bool get isCombinatorPlus => _combinator == TokenKind.COMBINATOR_PLUS; - bool get isCombinatorGreater => _combinator == TokenKind.COMBINATOR_GREATER; - bool get isCombinatorTilde => _combinator == TokenKind.COMBINATOR_TILDE; + bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE; + bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS; + bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER; + bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE; bool get isCombinatorDescendant => - _combinator == TokenKind.COMBINATOR_DESCENDANT; + combinator == TokenKind.COMBINATOR_DESCENDANT; String get _combinatorToString => isCombinatorDescendant ? ' ' : @@ -96,6 +113,9 @@ class SimpleSelectorSequence extends TreeNode { isCombinatorGreater ? ' > ' : isCombinatorTilde ? ' ~ ' : ''; + SimpleSelectorSequence clone() => + new SimpleSelectorSequence(_selector, span, combinator); + visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); } @@ -114,6 +134,8 @@ class SimpleSelector extends TreeNode { bool get isThis => _name is ThisOperator; + SimpleSelector clone() => new SimpleSelector(_name, span); + visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); } @@ -121,6 +143,8 @@ class SimpleSelector extends TreeNode { class ElementSelector extends SimpleSelector { ElementSelector(name, Span span) : super(name, span); visit(VisitorBase visitor) => visitor.visitElementSelector(this); + + String toString() => name; } // namespace|element @@ -136,7 +160,11 @@ class NamespaceSelector extends SimpleSelector { SimpleSelector get nameAsSimpleSelector => _name; + NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span); + visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); + + String toString() => "$namespace|${nameAsSimpleSelector.name}"; } // [attr op value] @@ -196,31 +224,45 @@ class AttributeSelector extends SimpleSelector { } } + AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span); + visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); + + String toString() => "[$name${matchOperator()}${valueToString()}]"; } // #id class IdSelector extends SimpleSelector { IdSelector(Identifier name, Span span) : super(name, span); + IdSelector clone() => new IdSelector(_name, span); visit(VisitorBase visitor) => visitor.visitIdSelector(this); + + String toString() => "#$_name"; } // .class class ClassSelector extends SimpleSelector { ClassSelector(Identifier name, Span span) : super(name, span); + ClassSelector clone() => new ClassSelector(_name, span); visit(VisitorBase visitor) => visitor.visitClassSelector(this); + + String toString() => ".$_name"; } // :pseudoClass class PseudoClassSelector extends SimpleSelector { PseudoClassSelector(Identifier name, Span span) : super(name, span); visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); + + String toString() => ":$name"; } // ::pseudoElement class PseudoElementSelector extends SimpleSelector { PseudoElementSelector(Identifier name, Span span) : super(name, span); visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); + + String toString() => "::$name"; } // :pseudoClassFunction(expression) @@ -229,6 +271,8 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { PseudoClassFunctionSelector(Identifier name, this.expression, Span span) : super(name, span); + PseudoClassFunctionSelector clone() => + new PseudoClassFunctionSelector(_name, expression, span); visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); } @@ -238,6 +282,8 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { PseudoElementFunctionSelector(Identifier name, this.expression, Span span) : super(name, span); + PseudoElementFunctionSelector clone() => + new PseudoElementFunctionSelector(_name, expression, span); visit(VisitorBase visitor) => visitor.visitPseudoElementFunctionSelector(this); } @@ -253,6 +299,14 @@ class SelectorExpression extends TreeNode { List get expressions => _expressions; + SelectorExpression clone() { + var selectorExpr = new SelectorExpression(span); + for (var expr in _expressions) { + selectorExpr.add(expr.clone()); + } + return selectorExpr; + } + visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); } @@ -263,9 +317,19 @@ class NegationSelector extends SimpleSelector { NegationSelector(this.negationArg, Span span) : super(new Negation(span), span); + NegationSelector clone() => new NegationSelector(negationArg, span); + visit(VisitorBase visitor) => visitor.visitNegationSelector(this); } +class NoOp extends TreeNode { + NoOp() : super(null); + + NoOp clone() => new NoOp(); + + visit(VisitorBase visitor) => visitor.visitNoOp(this); +} + class StyleSheet extends TreeNode { /** * Contains charset, ruleset, directives (media, page, etc.), and selectors. @@ -281,11 +345,18 @@ class StyleSheet extends TreeNode { /** Selectors only in this tree. */ StyleSheet.selector(this.topLevels, Span span) : super(span); + StyleSheet clone() { + var clonedTopLevels = []; + clonedTopLevels.add(topLevels.clone()); + return new StyleSheet(clonedTopLevels, span); + } + visit(VisitorBase visitor) => visitor.visitStyleSheet(this); } class TopLevelProduction extends TreeNode { TopLevelProduction(Span span) : super(span); + TopLevelProduction clone() => new TopLevelProduction(span); visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); } @@ -298,6 +369,12 @@ class RuleSet extends TopLevelProduction { SelectorGroup get selectorGroup => _selectorGroup; DeclarationGroup get declarationGroup => _declarationGroup; + RuleSet clone() { + var cloneSelectorGroup = _selectorGroup.clone(); + var cloneDeclarationGroup = _declarationGroup.clone(); + return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); + } + visit(VisitorBase visitor) => visitor.visitRuleSet(this); } @@ -307,6 +384,7 @@ class Directive extends TreeNode { bool get isBuiltIn => true; // Known CSS directive? bool get isExtension => false; // SCSS extension? + Directive clone() => new Directive(span); visit(VisitorBase visitor) => visitor.visitDirective(this); } @@ -319,6 +397,14 @@ class ImportDirective extends Directive { ImportDirective(this.import, this.mediaQueries, Span span) : super(span); + ImportDirective clone() { + var cloneMediaQueries = []; + for (var mediaQuery in mediaQueries) { + cloneMediaQueries.add(mediaQuery.clone()); + } + return new ImportDirective(import, cloneMediaQueries, span); + } + visit(VisitorBase visitor) => visitor.visitImportDirective(this); } @@ -336,6 +422,11 @@ class MediaExpression extends TreeNode { String get mediaFeature => _mediaFeature.name; + MediaExpression clone() { + var clonedExprs = exprs.clone(); + return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span); + } + visit(VisitorBase visitor) => visitor.visitMediaExpression(this); } @@ -366,6 +457,13 @@ class MediaQuery extends TreeNode { String get unary => TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); + MediaQuery clone() { + var cloneExpressions = []; + for (var expr in expressions) { + cloneExpressions.add(expr.clone()); + } + return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); + } visit(VisitorBase visitor) => visitor.visitMediaQuery(this); } @@ -375,6 +473,17 @@ class MediaDirective extends Directive { MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span); + MediaDirective clone() { + var cloneQueries = []; + for (var mediaQuery in mediaQueries) { + cloneQueries.add(mediaQuery.clone()); + } + var cloneRulesets = []; + for (var ruleset in rulesets) { + cloneRulesets.add(ruleset.clone()); + } + return new MediaDirective(cloneQueries, cloneRulesets, span); + } visit(VisitorBase visitor) => visitor.visitMediaDirective(this); } @@ -383,6 +492,13 @@ class HostDirective extends Directive { HostDirective(this.rulesets, Span span) : super(span); + HostDirective clone() { + var cloneRulesets = []; + for (var ruleset in rulesets) { + cloneRulesets.add(ruleset.clone()); + } + return new HostDirective(cloneRulesets, span); + } visit(VisitorBase visitor) => visitor.visitHostDirective(this); } @@ -394,6 +510,13 @@ class PageDirective extends Directive { PageDirective(this._ident, this._pseudoPage, this._declsMargin, Span span) : super(span); + PageDirective clone() { + var cloneDeclsMargin = []; + for (var declMargin in _declsMargin) { + cloneDeclsMargin.add(declMargin.clone()); + } + return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span); + } visit(VisitorBase visitor) => visitor.visitPageDirective(this); bool get hasIdent => _ident != null && _ident.length > 0; @@ -404,6 +527,7 @@ class CharsetDirective extends Directive { final String charEncoding; CharsetDirective(this.charEncoding, Span span) : super(span); + CharsetDirective clone() => new CharsetDirective(charEncoding, span); visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); } @@ -435,6 +559,13 @@ class KeyFrameDirective extends Directive { String get name => _name; + KeyFrameDirective clone() { + var cloneBlocks = []; + for (var block in _blocks) { + cloneBlocks.add(block.clone()); + } + return new KeyFrameDirective(_keyframeName, cloneBlocks, span); + } visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); } @@ -445,6 +576,8 @@ class KeyFrameBlock extends Expression { KeyFrameBlock(this._blockSelectors, this._declarations, Span span) : super(span); + KeyFrameBlock clone() => + new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); } @@ -453,6 +586,8 @@ class FontFaceDirective extends Directive { FontFaceDirective(this._declarations, Span span) : super(span); + FontFaceDirective clone() => + new FontFaceDirective(_declarations.clone(), span); visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); } @@ -468,6 +603,13 @@ class StyletDirective extends Directive { String get dartClassName => _dartClassName; List get rulesets => _rulesets; + StyletDirective clone() { + var cloneRulesets = []; + for (var ruleset in _rulesets) { + cloneRulesets.add(ruleset.clone()); + } + return new StyletDirective(_dartClassName, cloneRulesets, span); + } visit(VisitorBase visitor) => visitor.visitStyletDirective(this); } @@ -480,6 +622,7 @@ class NamespaceDirective extends Directive { NamespaceDirective(this._prefix, this._uri, Span span) : super(span); + NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; @@ -491,9 +634,95 @@ class VarDefinitionDirective extends Directive { VarDefinitionDirective(this.def, Span span) : super(span); + VarDefinitionDirective clone() => + new VarDefinitionDirective(def.clone(), span); visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); } +class MixinDefinition extends Directive { + final String name; + final List definedArgs; + final bool varArgs; + + MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span) + : super(span); + + MixinDefinition clone() { + var cloneDefinedArgs = []; + for (var definedArg in definedArgs) { + cloneDefinedArgs.add(definedArg.clone()); + } + return new MixinDefinition(name, cloneDefinedArgs, varArgs, span); + } + visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); +} + +/** Support a Sass @mixin. See http://sass-lang.com for description. */ +class MixinRulesetDirective extends MixinDefinition { + final List rulesets; + + MixinRulesetDirective(String name, List args, + bool varArgs, this.rulesets, Span span) : + super(name, args, varArgs, span); + + MixinRulesetDirective clone() { + var clonedArgs = []; + for (var arg in definedArgs) { + clonedArgs.add(arg.clone()); + } + var clonedRulesets = []; + for (var ruleset in rulesets) { + clonedRulesets.add(ruleset.clone()); + } + return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets, + span); + } + visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); +} + +class MixinDeclarationDirective extends MixinDefinition { + final DeclarationGroup declarations; + + MixinDeclarationDirective(String name, List args, + bool varArgs, this.declarations, Span span) : + super(name, args, varArgs, span); + MixinDeclarationDirective clone() { + var clonedArgs = []; + for (var arg in definedArgs) { + clonedArgs.add(arg.clone()); + } + return new MixinDeclarationDirective(name, clonedArgs, varArgs, + declarations.clone(), span); + } + visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); +} + +/** To support consuming a SASS mixin @include. */ +class IncludeDirective extends Directive { + final String name; + final List> args; + + IncludeDirective(this.name, this.args, Span span) : super(span); + + IncludeDirective clone() { + var cloneArgs = []; + for (var arg in args) { + for (var term in arg) { + cloneArgs.add(term.clone()); + } + } + return new IncludeDirective(name, cloneArgs, span); + } + visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); +} + +/** To support SASS @content. */ +class ContentDirective extends Directive { + ContentDirective(Span span) : super(span); + + visit(VisitorBase visitor) => visitor.visitContentDirective(this); +} + class Declaration extends TreeNode { final Identifier _property; final Expression _expression; @@ -524,6 +753,9 @@ class Declaration extends TreeNode { _dart = dStyle; } + Declaration clone() => + new Declaration(_property.clone(), _expression.clone(), _dart, span, + important: important); visit(VisitorBase visitor) => visitor.visitDeclaration(this); } @@ -534,6 +766,8 @@ class Declaration extends TreeNode { // are top-level are then statically resolved and var-foo in a // declaration group (surrounded by a selector) would be dynamic. class VarDefinition extends Declaration { + bool badUsage = false; + VarDefinition(Identifier definedName, Expression expr, Span span) : super(definedName, expr, null, span); @@ -541,9 +775,47 @@ class VarDefinition extends Declaration { set dartStyle(dStyle) { } + VarDefinition clone() => + new VarDefinition(_property.clone(), + expression != null ? expression.clone() : null, span); visit(VisitorBase visitor) => visitor.visitVarDefinition(this); } +/** + * Node for usage of @include mixin[(args,...)] found in a declaration group + * instead of at a ruleset (toplevel) e.g., + * div { + * @include mixin1; + * } + */ +class IncludeMixinAtDeclaration extends Declaration { + final IncludeDirective include; + + IncludeMixinAtDeclaration(this.include, Span span) + : super(null, null, null, span); + + IncludeMixinAtDeclaration clone() => + new IncludeMixinAtDeclaration(include.clone(), span); + visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this); +} + +class ExtendDeclaration extends Declaration { + List selectors; + + ExtendDeclaration(this.selectors, Span span) : + super(null, null, null, span); + + ExtendDeclaration clone() { + List newSelector = []; + for (var selectorSeq in selectors) { + newSelector.add(selectorSeq.clone()); + } + return new ExtendDeclaration(newSelector, span); + } + + visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); +} + class DeclarationGroup extends TreeNode { /** Can be either Declaration or RuleSet (if nested selector). */ final List _declarations; @@ -552,6 +824,13 @@ class DeclarationGroup extends TreeNode { List get declarations => _declarations; + DeclarationGroup clone() { + var clonedDecls = []; + for (var decl in _declarations) { + clonedDecls.add(decl.clone()); + } + return new DeclarationGroup(clonedDecls, span); + } visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); } @@ -560,6 +839,8 @@ class MarginGroup extends DeclarationGroup { MarginGroup(this.margin_sym, List decls, Span span) : super(decls, span); + MarginGroup clone() => + new MarginGroup(margin_sym, super.clone() as dynamic, span); visit(VisitorBase visitor) => visitor.visitMarginGroup(this); } @@ -569,26 +850,37 @@ class VarUsage extends Expression { VarUsage(this.name, this.defaultValues, Span span) : super(span); + VarUsage clone() { + var clonedValues = []; + for (var expr in defaultValues) { + clonedValues.addd(expr.clone()); + } + return new VarUsage(name, clonedValues, span); + } visit(VisitorBase visitor) => visitor.visitVarUsage(this); } class OperatorSlash extends Expression { OperatorSlash(Span span) : super(span); + OperatorSlash clone() => new OperatorSlash(span); visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); } class OperatorComma extends Expression { OperatorComma(Span span) : super(span); + OperatorComma clone() => new OperatorComma(span); visit(VisitorBase visitor) => visitor.visitOperatorComma(this); } class OperatorPlus extends Expression { OperatorPlus(Span span) : super(span); + OperatorPlus clone() => new OperatorPlus(span); visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); } class OperatorMinus extends Expression { OperatorMinus(Span span) : super(span); + OperatorMinus clone() => new OperatorMinus(span); visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); } @@ -600,6 +892,8 @@ class UnicodeRangeTerm extends Expression { bool get hasSecond => second != null; + UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span); + visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); } @@ -612,11 +906,14 @@ class LiteralTerm extends Expression { LiteralTerm(this.value, this.text, Span span) : super(span); + LiteralTerm clone() => new LiteralTerm(value, text, span); + visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); } class NumberTerm extends LiteralTerm { NumberTerm(value, String t, Span span) : super(value, t, span); + NumberTerm clone() => new NumberTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitNumberTerm(this); } @@ -627,6 +924,8 @@ class UnitTerm extends LiteralTerm { int get unit => _unit; + UnitTerm clone() => new UnitTerm(value, text, span, _unit); + visit(VisitorBase visitor) => visitor.visitUnitTerm(this); String unitToString() => TokenKind.unitToString(_unit); @@ -644,22 +943,25 @@ class LengthTerm extends UnitTerm { this._unit == TokenKind.UNIT_LENGTH_PT || this._unit == TokenKind.UNIT_LENGTH_PC); } - + LengthTerm clone() => new LengthTerm(value, text, span, _unit); visit(VisitorBase visitor) => visitor.visitLengthTerm(this); } class PercentageTerm extends LiteralTerm { PercentageTerm(value, String t, Span span) : super(value, t, span); + PercentageTerm clone() => new PercentageTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); } class EmTerm extends LiteralTerm { EmTerm(value, String t, Span span) : super(value, t, span); + EmTerm clone() => new EmTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitEmTerm(this); } class ExTerm extends LiteralTerm { ExTerm(value, String t, Span span) : super(value, t, span); + ExTerm clone() => new ExTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitExTerm(this); } @@ -672,6 +974,7 @@ class AngleTerm extends UnitTerm { this._unit == TokenKind.UNIT_ANGLE_TURN); } + AngleTerm clone() => new AngleTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitAngleTerm(this); } @@ -683,6 +986,7 @@ class TimeTerm extends UnitTerm { this._unit == TokenKind.UNIT_TIME_S); } + TimeTerm clone() => new TimeTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitTimeTerm(this); } @@ -692,18 +996,21 @@ class FreqTerm extends UnitTerm { assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ); } + FreqTerm clone() => new FreqTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitFreqTerm(this); } class FractionTerm extends LiteralTerm { FractionTerm(var value, String t, Span span) : super(value, t, span); + FractionTerm clone() => new FractionTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitFractionTerm(this); } class UriTerm extends LiteralTerm { UriTerm(String value, Span span) : super(value, value, span); + UriTerm clone() => new UriTerm(value, span); visit(VisitorBase visitor) => visitor.visitUriTerm(this); } @@ -715,6 +1022,7 @@ class ResolutionTerm extends UnitTerm { _unit == TokenKind.UNIT_RESOLUTION_DPPX); } + ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); } @@ -724,6 +1032,7 @@ class ChTerm extends UnitTerm { assert(_unit == TokenKind.UNIT_CH); } + ChTerm clone() => new ChTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitChTerm(this); } @@ -733,6 +1042,7 @@ class RemTerm extends UnitTerm { assert(_unit == TokenKind.UNIT_REM); } + RemTerm clone() => new RemTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitRemTerm(this); } @@ -745,6 +1055,7 @@ class ViewportTerm extends UnitTerm { _unit == TokenKind.UNIT_VIEWPORT_VMAX); } + ViewportTerm clone() => new ViewportTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitViewportTerm(this); } @@ -754,6 +1065,7 @@ class BAD_HEX_VALUE { } class HexColorTerm extends LiteralTerm { HexColorTerm(var value, String t, Span span) : super(value, t, span); + HexColorTerm clone() => new HexColorTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); } @@ -763,6 +1075,7 @@ class FunctionTerm extends LiteralTerm { FunctionTerm(var value, String t, this._params, Span span) : super(value, t, span); + FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span); visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); } @@ -773,6 +1086,7 @@ class FunctionTerm extends LiteralTerm { */ class IE8Term extends LiteralTerm { IE8Term(Span span) : super('\\9', '\\9', span); + IE8Term clone() => new IE8Term(span); visit(VisitorBase visitor) => visitor.visitIE8Term(this); } @@ -785,12 +1099,14 @@ class GroupTerm extends Expression { _terms.add(term); } + GroupTerm clone() => new GroupTerm(span); visit(VisitorBase visitor) => visitor.visitGroupTerm(this); } class ItemTerm extends NumberTerm { ItemTerm(var value, String t, Span span) : super(value, t, span); + ItemTerm clone() => new ItemTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitItemTerm(this); } @@ -803,6 +1119,13 @@ class Expressions extends Expression { expressions.add(expression); } + Expressions clone() { + var clonedExprs = new Expressions(span); + for (var expr in expressions) { + clonedExprs.add(expr.clone()); + } + return clonedExprs; + } visit(VisitorBase visitor) => visitor.visitExpressions(this); } @@ -813,6 +1136,8 @@ class BinaryExpression extends Expression { BinaryExpression(this.op, this.x, this.y, Span span): super(span); + BinaryExpression clone() => + new BinaryExpression(op, x.clone(), y.clone(), span); visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); } @@ -822,6 +1147,7 @@ class UnaryExpression extends Expression { UnaryExpression(this.op, this.self, Span span): super(span); + UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); } @@ -893,6 +1219,11 @@ class FontExpression extends DartStyleExpression { : super(DartStyleExpression.fontStyle, span), font = new Font.merge(x.font, y.font); + FontExpression clone() => + new FontExpression(span, size: font.size, family: font.family, + weight: font.weight, style: font.style, variant: font.variant, + lineHeight: font.lineHeight); + visit(VisitorBase visitor) => visitor.visitFontExpression(this); } @@ -953,6 +1284,10 @@ class MarginExpression extends BoxExpression { MarginExpression._merge(MarginExpression x, MarginExpression y, Span span) : super(x._styleType, span, new BoxEdge.merge(x.box, y.box)); + MarginExpression clone() => + new MarginExpression(span, top: box.top, right: box.right, + bottom: box.bottom, left: box.left); + visit(VisitorBase visitor) => visitor.visitMarginExpression(this); } @@ -985,6 +1320,10 @@ class BorderExpression extends BoxExpression { : super(DartStyleExpression.borderStyle, span, new BoxEdge.merge(x.box, y.box)); + BorderExpression clone() => + new BorderExpression(span, top: box.top, right: box.right, + bottom: box.bottom, left: box.left); + visit(VisitorBase visitor) => visitor.visitBorderExpression(this); } @@ -1002,6 +1341,7 @@ class HeightExpression extends DartStyleExpression { return null; } + HeightExpression clone() => new HeightExpression(span, height); visit(VisitorBase visitor) => visitor.visitHeightExpression(this); } @@ -1019,6 +1359,7 @@ class WidthExpression extends DartStyleExpression { return null; } + WidthExpression clone() => new WidthExpression(span, width); visit(VisitorBase visitor) => visitor.visitWidthExpression(this); } @@ -1050,5 +1391,8 @@ class PaddingExpression extends BoxExpression { : super(DartStyleExpression.paddingStyle, span, new BoxEdge.merge(x.box, y.box)); + PaddingExpression clone() => + new PaddingExpression(span, top: box.top, right: box.right, + bottom: box.bottom, left: box.left); visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); } diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 31411d6d0..29b955dcd 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -13,6 +13,8 @@ abstract class TreeNode { TreeNode(this.span) {} + TreeNode clone(); + /** Classic double-dispatch visitor for implementing passes. */ visit(VisitorBase visitor); diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 24cca64f1..3dc2afd56 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -103,6 +103,10 @@ class _TreePrinter extends Visitor { output.depth--; } + void visitContentDirective(ContentDirective node) { + print("ContentDirective not implemented"); + } + void visitKeyFrameDirective(KeyFrameDirective node) { heading('KeyFrameDirective', node); output.depth++; @@ -141,7 +145,48 @@ class _TreePrinter extends Visitor { void visitVarDefinitionDirective(VarDefinitionDirective node) { heading('Less variable definition', node); + output.depth++; visitVarDefinition(node.def); + output.depth--; + } + + void visitMixinRulesetDirective(MixinRulesetDirective node) { + heading('Mixin top-level ${node.name}', node); + output.writeNodeList('parameters', node.definedArgs); + output.depth++; + _visitNodeList(node.rulesets); + output.depth--; + } + + void visitMixinDeclarationDirective(MixinDeclarationDirective node) { + heading('Mixin declaration ${node.name}', node); + output.writeNodeList('parameters', node.definedArgs); + output.depth++; + visitDeclarationGroup(node.declarations); + output.depth--; + } + + /** + * Added optional newLine for handling @include at top-level vs/ inside of + * a declaration group. + */ + void visitIncludeDirective(IncludeDirective node) { + heading('IncludeDirective ${node.name}', node); + output.writeNodeList('parameters', node.args); + } + + void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { + heading('IncludeMixinAtDeclaration ${node.include.name}', node); + output.depth++; + visitIncludeDirective(node.include); + output.depth--; + } + + void visitExtendDeclaration(ExtendDeclaration node) { + heading('ExtendDeclaration', node); + output.depth++; + _visitNodeList(node.selectors); + output.depth--; } void visitRuleSet(RuleSet node) { diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index d2f24c9b6..91fa71402 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -16,6 +16,7 @@ abstract class VisitorBase { void visitCssComment(CssComment node); void visitCommentDefinition(CommentDefinition node); void visitStyleSheet(StyleSheet node); + void visitNoOp(NoOp node); void visitTopLevelProduction(TopLevelProduction node); void visitDirective(Directive node); void visitMediaExpression(MediaExpression node); @@ -31,12 +32,19 @@ abstract class VisitorBase { void visitStyletDirective(StyletDirective node); void visitNamespaceDirective(NamespaceDirective node); void visitVarDefinitionDirective(VarDefinitionDirective node); + void visitMixinDefinition(MixinDefinition node); + void visitMixinRulesetDirective(MixinRulesetDirective node); + void visitMixinDeclarationDirective(MixinDeclarationDirective node); + void visitIncludeDirective(IncludeDirective node); + void visitContentDirective(ContentDirective node); void visitRuleSet(RuleSet node); void visitDeclarationGroup(DeclarationGroup node); void visitMarginGroup(DeclarationGroup node); void visitDeclaration(Declaration node); void visitVarDefinition(VarDefinition node); + void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node); + void visitExtendDeclaration(ExtendDeclaration node); void visitSelectorGroup(SelectorGroup node); void visitSelector(Selector node); void visitSimpleSelectorSequence(SimpleSelectorSequence node); @@ -118,6 +126,8 @@ class Visitor implements VisitorBase { _visitNodeList(ss.topLevels); } + void visitNoOp(NoOp node) { } + void visitTopLevelProduction(TopLevelProduction node) { } void visitDirective(Directive node) { } @@ -193,6 +203,27 @@ class Visitor implements VisitorBase { visitVarDefinition(node.def); } + void visitMixinRulesetDirective(MixinRulesetDirective node) { + _visitNodeList(node.rulesets); + } + + void visitMixinDefinition(MixinDefinition node) { } + + void visitMixinDeclarationDirective(MixinDeclarationDirective node) { + visitDeclarationGroup(node.declarations); + } + + void visitIncludeDirective(IncludeDirective node) { + for (var index = 0; index < node.args.length; index++) { + var param = node.args[index]; + _visitNodeList(param); + } + } + + void visitContentDirective(ContentDirective node) { + // TODO(terry): TBD + } + void visitRuleSet(RuleSet node) { visitSelectorGroup(node._selectorGroup); visitDeclarationGroup(node._declarationGroup); @@ -214,6 +245,14 @@ class Visitor implements VisitorBase { if (node._expression != null) node._expression.visit(this); } + void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { + visitIncludeDirective(node.include); + } + + void visitExtendDeclaration(ExtendDeclaration node) { + _visitNodeList(node.selectors); + } + void visitSelectorGroup(SelectorGroup node) { _visitNodeList(node.selectors); } diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart new file mode 100644 index 000000000..5210115b0 --- /dev/null +++ b/pkgs/csslib/test/big_1_test.dart @@ -0,0 +1,1168 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library big_1_test; + +import 'package:unittest/unittest.dart'; +import 'testing.dart'; + +var options = ['--warnings_as_errors', '--no-colors', 'memory']; + +compilePolyfillAndValidate(String input, String generated) { + var errors = []; + var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void big_test() { + var input = r''' +/******************************************************************** + * Kennedy colors + ********************************************************************/ +@kennedy-red: #dd4b39; +@kennedy-blue: #4d90fe; +@kennedy-green: #3d9400; + +/******************************************************************** + * link colors + ********************************************************************/ +@link-color-1: #1155cc; +@link-color-2: #666666; + +/******************************************************************** + * text and header colors + ********************************************************************/ +@text-color-emphasized-1: #222222; +@text-color-emphasized-2: #333333; +@text-color-regular: #666666; +@text-color-deemphasized-1: #777777; +@text-color-deemphasized-2: #999999; + +/******************************************************************** + * icon colors + ********************************************************************/ +@zippy-icon-color: #b2b2b2; +@zippy-icon-color-hover: #666666; + +@mutate-icon-color: #b2b2b2; + +@silhouette-color: #8bb7fe; + +/******************************************************************** + * Panel and Card colors + ********************************************************************/ +@panel-header-color: #f7f7f7; +@panel-body-color: #ffffff; +@panel-border-color: #dcdcdc; + +/******************************************************************** + * App area colors + ********************************************************************/ + @apparea-background-color: #f2f2f2; + +/******************************************************************** + * Table colors + ********************************************************************/ +@table-row-numbers: #666666; +@table-row-item-links: #1155cc; +@table-row-item: #666666; + +/* Borders */ +@table-border-color: #dcdcdc; +@table-header-border-color: #dcdcdc; +@table-row-data-border-color: #eaeaea; + +/* General column - USED: We are not currently spec'ing different colors + * for the currently sorted/unsorted on column. + */ +@table-header-label-color: #666666; +@table-header-background-color: #f8f8f8; +@table-column-background-color: #ffffff; + + +/* Sorted column - UNUSED: We are not currently spec'ing different colors + * for the currently sorted/unsorted on column. + */ +@table-sorted-header-label-color: #666666; +@table-sorted-header-background-color: #e6e6e6; +@table-sorted-column-background-color: #f8f8f8; + +/* Unsorted column - UNUSED: We are not currently spec'ing different colors + * for the currently sorted/unsorted on column. + */ +@table-unsorted-header-label-color: #999999; +@table-unsorted-header-background-color: #f8f8f8; +@table-unsorted-column-background-color: #ffffff; + +@acux-border-color-1: #e5e5e5; +@acux-border-color-2: #3b7bea; +@acux-link-color: #3b7bea; +@acux-shell-background-color: #f2f2f2; + +/******************************************************************** + * Tooltip and popup colors + ********************************************************************/ +@tooltip-border-color: #333; +@tooltip-color: #fff; +@popup-border-color: #fff; + +/* Border radii */ +@button-radius: 2px; + +@mixin button-gradient(@from, @to) { + background-color: @from; + background-image: -webkit-linear-gradient(top, @from, @to); + background-image: linear-gradient(top, @from, @to); +} + +@mixin button-transition(@property, @time) { + -webkit-transition: @property @time; + transition: @property @time; +} + +@mixin text-not-selectable() { + -webkit-user-select: none; + user-select: none; +} + +/* + * Buttons and their states + */ +@mixin btn-base { + display: inline-block; + min-width: 62px; + text-align: center; + font-size: 11px; + font-weight: bold; + height: 28px; + padding: 0 8px; + line-height: 27px; + border-radius: @button-radius; + cursor: default; + + color: #444; + border: 1px solid rgba(0,0,0,0.1); + @include button-transition(all, 0.218s); + @include button-gradient(#f5f5f5, #f1f1f1); + + &:hover { + border: 1px solid #C6C6C6; + color: #222; + box-shadow: 0px 1px 1px rgba(0,0,0,0.1); + @include button-transition(all, 0s); + @include button-gradient(#f8f8f8, #f1f1f1); + } + + &:active { + border: 1px solid #C6C6C6; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0,0,0,0.1); + @include button-gradient(#f6f6f6, #f1f1f1); + } + + &:focus { + outline: none; + border: 1px solid #4D90FE; + z-index: 4 !important; + } + + &.selected, &.popup-open { + border: 1px solid #CCC; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0,0,0,0.1); + @include button-gradient(#EEEEEE, #E0E0E0); + } + + &.disabled, &.disabled:hover, &.disabled:active, + &[disabled], &[disabled]:hover, &[disabled]:active { + background: none; + color: #b8b8b8; + border: 1px solid rgba(0,0,0,0.05); + cursor: default; + pointer-events: none; + } + + &.flat { + background: none; + border-color: transparent; + padding: 0; + box-shadow: none; + } + + &.invalid { + outline: none; + border: 1px solid @kennedy-red; + box-shadow: inset 0px 1px 2px rgba(0,0,0,0.3); + } +} + +.btn-container { + padding: 10px; +} + +.btn { + @include btn-base; +} + +.btn-small { + /* TODO(prsd): Implement using a mix-in. */ + min-width: 30px; +} + +.btn-left { + @include btn-base; + border-radius: @button-radius 0 0 @button-radius; + margin-right: 0; + padding: 0; + min-width: 30px; +} + +.btn-right { + @include btn-base; + border-radius: 0 @button-radius @button-radius 0; + border-left: none; + margin-left: 0; + padding: 0; + min-width: 30px; +} + +.btn + .btn { + margin-left: 5px; +} + +/* Primary Button and it's states */ +.btn-primary { + color: #FFF !important; + width: 94px; + border-color: #3079ed; + @include button-gradient(#4d90fe, #4787ed); + + &:hover, &:active { + border-color: #2f5bb7; + @include button-gradient(#4d90fe, #357ae8); + } + + &:focus { + border-color: #4D90FE; + box-shadow:inset 0 0 0 1px rgba(255,255,255,0.5); + } + + &:focus:hover { + box-shadow:inset 0 0 0 1px #fff, 0px 1px 1px rgba(0,0,0,0.1); + } + + &.disabled, &.disabled:hover, &.disabled:active, + &[disabled], &[disabled]:hover, &[disabled]:active { + border-color:#3079ed; + background-color: #4d90fe; + opacity: 0.7; + } +} + +/* Checkbox displayed as a toggled button + * Invisible checkbox followed by a label with 'for' set to checkbox */ +input[type="checkbox"].toggle-button { + display: none; + + & + label { + @extend .btn; + } + + &:checked + label, + & + label.popup-open { + border: 1px solid #CCC; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0,0,0,0.1); + @include button-gradient(#EEEEEE, #E0E0E0); + } +} + +.txt-input { + display:inline-block; + *display:inline; + *zoom:1; + padding:4px 12px; + margin-bottom:0; + font-size:14px; + line-height:20px; + vertical-align:middle; + color:#333333; + border-color:#e6e6e6 #e6e6e6 #bfbfbf; + border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border:1px solid #cccccc; + *border:0; + border-bottom-color:#b3b3b3; + -webkit-border-radius:4px; + -moz-border-radius:4px; + border-radius:4px; + *margin-left:.3em; + -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px + rgba(0,0,0,.05); + -moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); +} + +input[type="text"], input:not([type]), .txt-input { + height: 29px; + background-color: white; + padding: 4px 0 4px 8px; + color: 333; + border: 1px solid #d9d9d9; + border-top: 1px solid #c0c0c0; + display: inline-block; + vertical-align: top; + box-sizing: border-box; + border-radius: 1px; + + &:hover { + border: 1px solid #b9b9b9; + border-top: 1px solid #a0a0a0; + box-shadow: inset 0px 1px 2px rgba(0,0,0,0.1); + } + + &:focus { + outline: none; + border: 1px solid @kennedy-blue; + box-shadow: inset 0px 1px 2px rgba(0,0,0,0.3); + } + + &.disabled, &.disabled:hover, &.disabled:active, &:disabled { + background: #fff; + border: 1px solid #f3f3f3; + border: 1px solid rgba(0,0,0,0.05); + color: #b8b8b8; + cursor: default; + pointer-events: none; + } + + &.invalid, &:focus:invalid, &:required:invalid { + outline: none; + border: 1px solid @kennedy-red; + box-shadow: inset 0px 1px 2px rgba(0,0,0,0.3); + } +} + +/* Text area */ +textarea { + @extend .txt-input; + height: 3em; +} + +/* Hide the spin button in datepickers */ +input[type="date"]::-webkit-inner-spin-button, +input[type="datetime"]::-webkit-inner-spin-button, +input[type="datetime-local"]::-webkit-inner-spin-button, +input[type="month"]::-webkit-inner-spin-button, +input[type="time"]::-webkit-inner-spin-button, +input[type="week"]::-webkit-inner-spin-button { + display: none; +} + + +/* + * Selects & Dropdowns + */ +.dropdown-menu, +.popup { + width: auto; + padding: 0; + margin: 0 0 0 1px; + background: white; + text-align: left; + z-index: 1000; + outline: 1px solid rgba(0,0,0,0.2); + white-space: nowrap; + list-style: none; + box-shadow: 0px 2px 4px rgba(0,0,0,0.2); + @include button-transition(opacity, 0.218s); +} + +.popup { + padding: 0 0 6px; +} +.dropdown-menu, +.popup { + pointer-events: all; +} + +.popup ul { + margin: 0; + padding: 0; +} +.popup li { + list-style-type: none; + padding: 5px 10px; + cursor: default; +} +.popup .header { + padding: 5px 10px; +} + + /* existing styles defined here */ +.popup .divider, +.dropdown-menu .divider { + width:100%; + height:1px; + padding: 0; + overflow:hidden; + background-color:#c0c0c0; + border-bottom:1px solid @popup-border-color; +} + +.dropdown-menu { + max-height: 600px; + overflow-x: hidden; + overflow-y: auto; +} +.popup { + overflow: hidden; +} + +.dropdown-menuitem, +.dropdown-menu > li { + display: block; + padding: 6px 44px 6px 16px; + color: #666; + font-size:13px; + font-weight: normal; + cursor: default; + margin: 0; + text-decoration: none; + @include text-not-selectable(); + + &.disabled { + color: #CCC; + background-color: #FFF; + } + + &:hover, &.selected { + color: #222; + background-color: #F1F1F1; + } +} + +.dropdown-menuheader { + padding: 6px 44px 6px 16px; + color: #666; + font-size:11px; + font-weight: bold; + cursor: default; + margin: 0; + text-decoration: none; + background-color: #F1F1F1; + @include text-not-selectable(); +} + +li.dropdown-menudivider { + width:100%; + height:1px; + padding: 0; + overflow:hidden; + background-color:#D0D0D0; + border-bottom:1px solid #ffffff; +} + +.btn-container { + padding: 10px; +} + +/* + * Modal dialogs + */ + +.modal-frame { + position: relative; + background-color: white; + outline: 1px solid rgba(0, 0, 0, 0.2); + padding: 30px 42px; + min-width: 480px; + z-index: 9000; + pointer-events: auto; + box-shadow: 0 4px 16px 0 rgba(0,0,0,0.2); + + @include button-transition(all, 0.218s); + + &.medium { + padding: 28px 32px; + min-width: 280px; + } + + &.small { + padding: 16px 20px; + } + +} + +.modal-backdrop { + background-color: rgba(0,0,0,0.1); + position: fixed; + height: 100%; + width: 100%; + left: 0; + right: 0; + top: 0; + bottom: 0; + z-index: 99; + margin: 0; + + display: none; + opacity: 0; + @include button-transition(all, 0.218s); + + &.visible { + display: -webkit-flex; + display: flex; + -webkit-align-items: center; + align-items: center; + -webkit-justify-content: space-around; + justify-content: space-around; + opacity: 1; + } +} + +/* + * Scrollbars + */ + +::-webkit-scrollbar { + width: 10px; + height: 10px; + background: white; +} + +::-webkit-scrollbar-button { + height: 0px; + width: 0px; + + &:start:decrement, + &:end:increment { + display: block; + } + + &:vertical:start:increment, + &:vertical:end:decrement { + display: none; + } +} + +::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, .2); + background-clip: padding-box; + border: solid transparent; + border-width: 1px 1px 1px 2px; + min-height: 28px; + padding: 100px 0 0; + box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1), + inset 0 -1px 0 rgba(0, 0, 0, .07); + + &:hover { + background-color: rgba(0,0,0,0.4); + -webkit-box-shadow: inset 1px 1px 1px rgba(0,0,0,0.25); + } + + &:active { + -webkit-box-shadow: inset 1px 1px 3px rgba(0,0,0,0.35); + background-color: rgba(0,0,0,0.5); + } + + &:vertical { + border-top: 0px solid transparent; + border-bottom: 0px solid transparent; + border-right: 0px solid transparent; + border-left: 1px solid transparent; + } + + &:horizontal { + border-top: 1px solid transparent; + border-bottom: 0px solid transparent; + border-right: 0px solid transparent; + border-left: 0px solid transparent; + } +} + +::-webkit-scrollbar-track { + background-clip: padding-box; + background-color: white; + + &:hover { + background-color: rgba(0,0,0,0.05); + -webkit-box-shadow: inset 1px 0px 0px rgba(0,0,0,0.10); + } + + &:active { + background-color: rgba(0,0,0,0.05); + -webkit-box-shadow: inset 1px 0px 0px rgba(0,0,0,0.14), + inset -1px -1px 0px rgba(0,0,0,0.07); + } + + &:vertical { + border-right: 0px solid transparent; + border-left: 1px solid transparent; + } + + &:horizontal { + border-bottom: 0px solid transparent; + border-top: 1px solid transparent; + } +} + +/* Tooltips */ +.tooltip { + background: @tooltip-border-color; + border-radius: 2px; + color: @tooltip-color; + padding: 4px 8px; + font-size: 10px; +} + +.tooltip a, +.tooltip div, +.tooltip span { + color: @tooltip-color; +} +'''; + + var generated = r'''.btn-container { + padding: 10px; +} +.btn, input[type="checkbox"].toggle-button + label { + display: inline-block; + min-width: 62px; + text-align: center; + font-size: 11px; + font-weight: bold; + height: 28px; + padding: 0 8px; + line-height: 27px; + border-radius: 2px; + cursor: default; + color: #444; + border: 1px solid rgba(0, 0, 0, 0.1); + -webkit-transition: all 0.218s; + transition: all 0.218s; + background-color: #f5f5f5; + background-image: -webkit-linear-gradient(top, #f5f5f5, #f1f1f1); + background-image: linear-gradient(top, #f5f5f5, #f1f1f1); +} +.btn:hover, input[type="checkbox"].toggle-button + label:hover { + border: 1px solid #C6C6C6; + color: #222; + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); + -webkit-transition: all 0s; + transition: all 0s; + background-color: #f8f8f8; + background-image: -webkit-linear-gradient(top, #f8f8f8, #f1f1f1); + background-image: linear-gradient(top, #f8f8f8, #f1f1f1); +} +.btn:active, input[type="checkbox"].toggle-button + label:active { + border: 1px solid #C6C6C6; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1); + background-color: #f6f6f6; + background-image: -webkit-linear-gradient(top, #f6f6f6, #f1f1f1); + background-image: linear-gradient(top, #f6f6f6, #f1f1f1); +} +.btn:focus, input[type="checkbox"].toggle-button + label:focus { + outline: none; + border: 1px solid #4D90FE; + z-index: 4 !important; +} +.btn.selected, .btn.popup-open, input[type="checkbox"].toggle-button + label.selected, input[type="checkbox"].toggle-button + label.popup-open { + border: 1px solid #CCC; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1); + background-color: #EEE; + background-image: -webkit-linear-gradient(top, #EEE, #E0E0E0); + background-image: linear-gradient(top, #EEE, #E0E0E0); +} +.btn.disabled, .btn.disabled:hover, .btn.disabled:active, .btn[disabled], .btn[disabled]:hover, .btn[disabled]:active, input[type="checkbox"].toggle-button + label.disabled, input[type="checkbox"].toggle-button + label.disabled:hover, input[type="checkbox"].toggle-button + label.disabled:active, input[type="checkbox"].toggle-button + label[disabled], input[type="checkbox"].toggle-button + label[disabled]:hover, input[type="checkbox"].toggle-button + label[disabled]:active { + background: none; + color: #b8b8b8; + border: 1px solid rgba(0, 0, 0, 0.05); + cursor: default; + pointer-events: none; +} +.btn.flat, input[type="checkbox"].toggle-button + label.flat { + background: none; + border-color: transparent; + padding: 0; + box-shadow: none; +} +.btn.invalid, input[type="checkbox"].toggle-button + label.invalid { + outline: none; + border: 1px solid #dd4b39; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3); +} +.btn-small { + min-width: 30px; +} +.btn-left { + display: inline-block; + min-width: 62px; + text-align: center; + font-size: 11px; + font-weight: bold; + height: 28px; + padding: 0 8px; + line-height: 27px; + border-radius: 2px; + cursor: default; + color: #444; + border: 1px solid rgba(0, 0, 0, 0.1); + -webkit-transition: all 0.218s; + transition: all 0.218s; + background-color: #f5f5f5; + background-image: -webkit-linear-gradient(top, #f5f5f5, #f1f1f1); + background-image: linear-gradient(top, #f5f5f5, #f1f1f1); + border-radius: 2px 0 0 2px; + margin-right: 0; + padding: 0; + min-width: 30px; +} +.btn-left:hover { + border: 1px solid #C6C6C6; + color: #222; + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); + -webkit-transition: all 0s; + transition: all 0s; + background-color: #f8f8f8; + background-image: -webkit-linear-gradient(top, #f8f8f8, #f1f1f1); + background-image: linear-gradient(top, #f8f8f8, #f1f1f1); +} +.btn-left:active { + border: 1px solid #C6C6C6; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1); + background-color: #f6f6f6; + background-image: -webkit-linear-gradient(top, #f6f6f6, #f1f1f1); + background-image: linear-gradient(top, #f6f6f6, #f1f1f1); +} +.btn-left:focus { + outline: none; + border: 1px solid #4D90FE; + z-index: 4 !important; +} +.btn-left.selected, .btn-left.popup-open { + border: 1px solid #CCC; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1); + background-color: #EEE; + background-image: -webkit-linear-gradient(top, #EEE, #E0E0E0); + background-image: linear-gradient(top, #EEE, #E0E0E0); +} +.btn-left.disabled, .btn-left.disabled:hover, .btn-left.disabled:active, .btn-left[disabled], .btn-left[disabled]:hover, .btn-left[disabled]:active { + background: none; + color: #b8b8b8; + border: 1px solid rgba(0, 0, 0, 0.05); + cursor: default; + pointer-events: none; +} +.btn-left.flat { + background: none; + border-color: transparent; + padding: 0; + box-shadow: none; +} +.btn-left.invalid { + outline: none; + border: 1px solid #dd4b39; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3); +} +.btn-right { + display: inline-block; + min-width: 62px; + text-align: center; + font-size: 11px; + font-weight: bold; + height: 28px; + padding: 0 8px; + line-height: 27px; + border-radius: 2px; + cursor: default; + color: #444; + border: 1px solid rgba(0, 0, 0, 0.1); + -webkit-transition: all 0.218s; + transition: all 0.218s; + background-color: #f5f5f5; + background-image: -webkit-linear-gradient(top, #f5f5f5, #f1f1f1); + background-image: linear-gradient(top, #f5f5f5, #f1f1f1); + border-radius: 0 2px 2px 0; + border-left: none; + margin-left: 0; + padding: 0; + min-width: 30px; +} +.btn-right:hover { + border: 1px solid #C6C6C6; + color: #222; + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); + -webkit-transition: all 0s; + transition: all 0s; + background-color: #f8f8f8; + background-image: -webkit-linear-gradient(top, #f8f8f8, #f1f1f1); + background-image: linear-gradient(top, #f8f8f8, #f1f1f1); +} +.btn-right:active { + border: 1px solid #C6C6C6; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1); + background-color: #f6f6f6; + background-image: -webkit-linear-gradient(top, #f6f6f6, #f1f1f1); + background-image: linear-gradient(top, #f6f6f6, #f1f1f1); +} +.btn-right:focus { + outline: none; + border: 1px solid #4D90FE; + z-index: 4 !important; +} +.btn-right.selected, .btn-right.popup-open { + border: 1px solid #CCC; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1); + background-color: #EEE; + background-image: -webkit-linear-gradient(top, #EEE, #E0E0E0); + background-image: linear-gradient(top, #EEE, #E0E0E0); +} +.btn-right.disabled, .btn-right.disabled:hover, .btn-right.disabled:active, .btn-right[disabled], .btn-right[disabled]:hover, .btn-right[disabled]:active { + background: none; + color: #b8b8b8; + border: 1px solid rgba(0, 0, 0, 0.05); + cursor: default; + pointer-events: none; +} +.btn-right.flat { + background: none; + border-color: transparent; + padding: 0; + box-shadow: none; +} +.btn-right.invalid { + outline: none; + border: 1px solid #dd4b39; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3); +} +.btn + .btn, input[type="checkbox"].toggle-button + label + .btn, .btn + input[type="checkbox"].toggle-button + label, input[type="checkbox"].toggle-button + label + input[type="checkbox"].toggle-button + label, input[type="checkbox"].toggle-button + label + input[type="checkbox"].toggle-button + label { + margin-left: 5px; +} +.btn-primary { + color: #FFF !important; + width: 94px; + border-color: #3079ed; + background-color: #4d90fe; + background-image: -webkit-linear-gradient(top, #4d90fe, #4787ed); + background-image: linear-gradient(top, #4d90fe, #4787ed); +} +.btn-primary:hover, .btn-primary:active { + border-color: #2f5bb7; + background-color: #4d90fe; + background-image: -webkit-linear-gradient(top, #4d90fe, #357ae8); + background-image: linear-gradient(top, #4d90fe, #357ae8); +} +.btn-primary:focus { + border-color: #4D90FE; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.5); +} +.btn-primary:focus:hover { + box-shadow: inset 0 0 0 1px #fff, 0px 1px 1px rgba(0, 0, 0, 0.1); +} +.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:active { + border-color: #3079ed; + background-color: #4d90fe; + opacity: 0.7; +} +input[type="checkbox"].toggle-button { + display: none; +} +input[type="checkbox"].toggle-button + label { +} +input[type="checkbox"].toggle-button:checked + label, input[type="checkbox"].toggle-button + label.popup-open { + border: 1px solid #CCC; + color: #666; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1); + background-color: #EEE; + background-image: -webkit-linear-gradient(top, #EEE, #E0E0E0); + background-image: linear-gradient(top, #EEE, #E0E0E0); +} +.txt-input, textarea { + display: inline-block; + *display: inline; + *zoom: 1; + padding: 4px 12px; + margin-bottom: 0; + font-size: 14px; + line-height: 20px; + vertical-align: middle; + color: #333; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border: 1px solid #ccc; + *border: 0; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *margin-left: .3em; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); +} +input[type="text"], input:not([type]), .txt-input, textarea { + height: 29px; + background-color: #fff; + padding: 4px 0 4px 8px; + color: 333; + border: 1px solid #d9d9d9; + border-top: 1px solid #c0c0c0; + display: inline-block; + vertical-align: top; + box-sizing: border-box; + border-radius: 1px; +} +input[type="text"]:hover, input:not([type]):hover, .txt-input:hover, textarea:hover { + border: 1px solid #b9b9b9; + border-top: 1px solid #a0a0a0; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1); +} +input[type="text"]:focus, input:not([type]):focus, .txt-input:focus, textarea:focus { + outline: none; + border: 1px solid #4d90fe; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3); +} +input[type="text"].disabled, input:not([type]).disabled, .txt-input.disabled, input[type="text"].disabled:hover, input:not([type]).disabled:hover, .txt-input.disabled:hover, input[type="text"].disabled:active, input:not([type]).disabled:active, .txt-input.disabled:active, input[type="text"]:disabled, input:not([type]):disabled, .txt-input:disabled, textarea.disabled, textarea.disabled:hover, textarea.disabled:active, textarea:disabled { + background: #fff; + border: 1px solid #f3f3f3; + border: 1px solid rgba(0, 0, 0, 0.05); + color: #b8b8b8; + cursor: default; + pointer-events: none; +} +input[type="text"].invalid, input:not([type]).invalid, .txt-input.invalid, input[type="text"]:focus:invalid, input:not([type]):focus:invalid, .txt-input:focus:invalid, input[type="text"]:required:invalid, input:not([type]):required:invalid, .txt-input:required:invalid, textarea.invalid, textarea:focus:invalid, textarea:required:invalid { + outline: none; + border: 1px solid #dd4b39; + box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3); +} +textarea { + height: 3em; +} +input[type="date"]::-webkit-inner-spin-button, input[type="datetime"]::-webkit-inner-spin-button, input[type="datetime-local"]::-webkit-inner-spin-button, input[type="month"]::-webkit-inner-spin-button, input[type="time"]::-webkit-inner-spin-button, input[type="week"]::-webkit-inner-spin-button { + display: none; +} +.dropdown-menu, .popup { + width: auto; + padding: 0; + margin: 0 0 0 1px; + background: #fff; + text-align: left; + z-index: 1000; + outline: 1px solid rgba(0, 0, 0, 0.2); + white-space: nowrap; + list-style: none; + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); + -webkit-transition: opacity 0.218s; + transition: opacity 0.218s; +} +.popup { + padding: 0 0 6px; +} +.dropdown-menu, .popup { + pointer-events: all; +} +.popup ul { + margin: 0; + padding: 0; +} +.popup li { + list-style-type: none; + padding: 5px 10px; + cursor: default; +} +.popup .header { + padding: 5px 10px; +} +.popup .divider, .dropdown-menu .divider { + width: 100%; + height: 1px; + padding: 0; + overflow: hidden; + background-color: #c0c0c0; + border-bottom: 1px solid #fff; +} +.dropdown-menu { + max-height: 600px; + overflow-x: hidden; + overflow-y: auto; +} +.popup { + overflow: hidden; +} +.dropdown-menuitem, .dropdown-menu > li { + display: block; + padding: 6px 44px 6px 16px; + color: #666; + font-size: 13px; + font-weight: normal; + cursor: default; + margin: 0; + text-decoration: none; + -webkit-user-select: none; + user-select: none; +} +.dropdown-menuitem.disabled, .dropdown-menu > li.disabled { + color: #CCC; + background-color: #FFF; +} +.dropdown-menuitem:hover, .dropdown-menu > li:hover, .dropdown-menuitem.selected, .dropdown-menu > li.selected { + color: #222; + background-color: #F1F1F1; +} +.dropdown-menuheader { + padding: 6px 44px 6px 16px; + color: #666; + font-size: 11px; + font-weight: bold; + cursor: default; + margin: 0; + text-decoration: none; + background-color: #F1F1F1; + -webkit-user-select: none; + user-select: none; +} +li.dropdown-menudivider { + width: 100%; + height: 1px; + padding: 0; + overflow: hidden; + background-color: #D0D0D0; + border-bottom: 1px solid #fff; +} +.btn-container { + padding: 10px; +} +.modal-frame { + position: relative; + background-color: #fff; + outline: 1px solid rgba(0, 0, 0, 0.2); + padding: 30px 42px; + min-width: 480px; + z-index: 9000; + pointer-events: auto; + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.2); + -webkit-transition: all 0.218s; + transition: all 0.218s; +} +.modal-frame.medium { + padding: 28px 32px; + min-width: 280px; +} +.modal-frame.small { + padding: 16px 20px; +} +.modal-backdrop { + background-color: rgba(0, 0, 0, 0.1); + position: fixed; + height: 100%; + width: 100%; + left: 0; + right: 0; + top: 0; + bottom: 0; + z-index: 99; + margin: 0; + display: none; + opacity: 0; + -webkit-transition: all 0.218s; + transition: all 0.218s; +} +.modal-backdrop.visible { + display: -webkit-flex; + display: flex; + -webkit-align-items: center; + align-items: center; + -webkit-justify-content: space-around; + justify-content: space-around; + opacity: 1; +} +::-webkit-scrollbar { + width: 10px; + height: 10px; + background: #fff; +} +::-webkit-scrollbar-button { + height: 0px; + width: 0px; +} +::-webkit-scrollbar-button:start:decrement, ::-webkit-scrollbar-button:end:increment { + display: block; +} +::-webkit-scrollbar-button:vertical:start:increment, ::-webkit-scrollbar-button:vertical:end:decrement { + display: none; +} +::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, .2); + background-clip: padding-box; + border: solid transparent; + border-width: 1px 1px 1px 2px; + min-height: 28px; + padding: 100px 0 0; + box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1), inset 0 -1px 0 rgba(0, 0, 0, .07); +} +::-webkit-scrollbar-thumb:hover { + background-color: rgba(0, 0, 0, 0.4); + -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.25); +} +::-webkit-scrollbar-thumb:active { + -webkit-box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.35); + background-color: rgba(0, 0, 0, 0.5); +} +::-webkit-scrollbar-thumb:vertical { + border-top: 0px solid transparent; + border-bottom: 0px solid transparent; + border-right: 0px solid transparent; + border-left: 1px solid transparent; +} +::-webkit-scrollbar-thumb:horizontal { + border-top: 1px solid transparent; + border-bottom: 0px solid transparent; + border-right: 0px solid transparent; + border-left: 0px solid transparent; +} +::-webkit-scrollbar-track { + background-clip: padding-box; + background-color: #fff; +} +::-webkit-scrollbar-track:hover { + background-color: rgba(0, 0, 0, 0.05); + -webkit-box-shadow: inset 1px 0px 0px rgba(0, 0, 0, 0.10); +} +::-webkit-scrollbar-track:active { + background-color: rgba(0, 0, 0, 0.05); + -webkit-box-shadow: inset 1px 0px 0px rgba(0, 0, 0, 0.14), inset -1px -1px 0px rgba(0, 0, 0, 0.07); +} +::-webkit-scrollbar-track:vertical { + border-right: 0px solid transparent; + border-left: 1px solid transparent; +} +::-webkit-scrollbar-track:horizontal { + border-bottom: 0px solid transparent; + border-top: 1px solid transparent; +} +.tooltip { + background: #333; + border-radius: 2px; + color: #fff; + padding: 4px 8px; + font-size: 10px; +} +.tooltip a, .tooltip div, .tooltip span { + color: #fff; +}'''; + + compilePolyfillAndValidate(input, generated); +} + +main() { + test('big #1', big_test); +} diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart new file mode 100644 index 000000000..7136c45cc --- /dev/null +++ b/pkgs/csslib/test/extend_test.dart @@ -0,0 +1,235 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library extend_test; + +import 'package:unittest/unittest.dart'; +import 'testing.dart'; + +var options = ['--warnings_as_errors', '--no-colors', 'memory']; + +compileAndValidate(String input, String generated) { + var errors = []; + var stylesheet = compileCss(input, errors: errors, opts: options); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void simpleExtend() { + compileAndValidate(r''' +.error { + border: 1px red; + background-color: #fdd; +} +.seriousError { + @extend .error; + border-width: 3px; +} +''', r'''.error, .seriousError { + border: 1px #f00; + background-color: #fdd; +} +.seriousError { + border-width: 3px; +}'''); +} + +void complexSelectors() { + compileAndValidate(r''' +.error { + border: 1px #f00; + background-color: #fdd; +} +.error.intrusion { + background-image: url("/image/hacked.png"); +} +.seriousError { + @extend .error; + border-width: 3px; +} +''', r'''.error, .seriousError { + border: 1px #f00; + background-color: #fdd; +} +.error.intrusion, .seriousError.intrusion { + background-image: url("/image/hacked.png"); +} +.seriousError { + border-width: 3px; +}'''); + + compileAndValidate(r''' +a:hover { + text-decoration: underline; +} +.hoverlink { + @extend a:hover; +} +''', r'''a:hover, .hoverlink { + text-decoration: underline; +} +.hoverlink { +}'''); +} + +void multipleExtends() { + compileAndValidate(r''' +.error { + border: 1px #f00; + background-color: #fdd; +} +.attention { + font-size: 3em; + background-color: #ff0; +} +.seriousError { + @extend .error; + @extend .attention; + border-width: 3px; +} +''', r'''.error, .seriousError { + border: 1px #f00; + background-color: #fdd; +} +.attention, .seriousError { + font-size: 3em; + background-color: #ff0; +} +.seriousError { + border-width: 3px; +}'''); +} + +void chaining() { + compileAndValidate(r''' +.error { + border: 1px #f00; + background-color: #fdd; +} +.seriousError { + @extend .error; + border-width: 3px; +} +.criticalError { + @extend .seriousError; + position: fixed; + top: 10%; + bottom: 10%; + left: 10%; + right: 10%; +} +''', r'''.error, .seriousError, .criticalError { + border: 1px #f00; + background-color: #fdd; +} +.seriousError, .criticalError { + border-width: 3px; +} +.criticalError { + position: fixed; + top: 10%; + bottom: 10%; + left: 10%; + right: 10%; +}'''); +} + +void nestedSelectors() { + compileAndValidate(r''' +a { + color: blue; + &:hover { + text-decoration: underline; + } +} + +#fake-links .link { + @extend a; +} +''', r'''a, #fake-links .link { + color: #00f; +} +a:hover, #fake-links .link:hover { + text-decoration: underline; +} +#fake-links .link { +}'''); +} + +void nestedMulty() { + compileAndValidate(r''' +.btn { + display: inline-block; +} + +input[type="checkbox"].toggle-button { + color: red; + + + label { + @extend .btn; + } +} +''', r'''.btn, input[type="checkbox"].toggle-button label { + display: inline-block; +} +input[type="checkbox"].toggle-button { + color: #f00; +} +input[type="checkbox"].toggle-button label { +}'''); +} + +void nWayExtends() { + compileAndValidate(r''' +.btn > .btn { + margin-left: 5px; +} +input.second + label { + @extend .btn; +} +''', '.btn > .btn, ' + 'input.second + label > .btn, ' + '.btn > input.second + label, ' + 'input.second + label > input.second + label, ' + 'input.second + label > input.second + label {\n' + ' margin-left: 5px;\n}\n' + 'input.second + label {\n' + '}'); + + // TODO(terry): Optimize merge selectors would be: + // + // .btn + .btn, input.second + label + .btn, input.second.btn + label { + // margin-left: 5px; + // } + // input.second + label { + // color: blue; + // } + compileAndValidate(r''' +.btn + .btn { + margin-left: 5px; +} +input.second + label { + @extend .btn; + color: blue; +} +''', '.btn + .btn, ' + 'input.second + label + .btn, ' + '.btn + input.second + label, ' + 'input.second + label + input.second + label, ' + 'input.second + label + input.second + label {\n' + ' margin-left: 5px;\n}\n' + 'input.second + label {\n' + ' color: #00f;\n}'); +} + +main() { + test("Simple Extend", simpleExtend); + test("complex", complexSelectors); + test("multiple", multipleExtends); + test("chaining", chaining); + test("nested selectors", nestedSelectors); + test("nested many selector sequences", nestedMulty); + test("N-way extends", nWayExtends); +} diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart new file mode 100644 index 000000000..853dfc421 --- /dev/null +++ b/pkgs/csslib/test/mixin_test.dart @@ -0,0 +1,665 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library mixin_test; + +import 'package:unittest/unittest.dart'; +import 'testing.dart'; + +final options = ['--warnings_as_errors', '--no-colors', 'memory']; + +compileAndValidate(String input, String generated) { + var errors = []; + var stylesheet = compileCss(input, errors: errors, opts: options); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +compilePolyfillAndValidate(String input, String generated) { + var errors = []; + var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void topLevelMixin() { + compileAndValidate(r''' +@mixin silly-links { + a { + color: blue; + background-color: red; + } +} + +@include silly-links; +''', r'''a { + color: #00f; + background-color: #f00; +}'''); +} + +void topLevelMixinTwoIncludes() { + compileAndValidate(r''' +@mixin a { + a { + color: blue; + background-color: red; + } +} +@mixin b { + span { + color: black; + background-color: orange; + } +} +@include a; +@include b; +''', r'''a { + color: #00f; + background-color: #f00; +} +span { + color: #000; + background-color: #ffa500; +}'''); +} + +/** Tests top-level mixins that includes another mixin. */ +void topLevelMixinMultiRulesets() { + compileAndValidate(r''' +@mixin a { + a { + color: blue; + background-color: red; + } +} +@mixin b { + #foo-id { + border-top: 1px solid red; + border-bottom: 2px solid green; + } +} +@mixin c { + span { + color: black; + background-color: orange; + } + @include b; +} +@include a; +@include c; +''', r'''a { + color: #00f; + background-color: #f00; +} +span { + color: #000; + background-color: #ffa500; +} +#foo-id { + border-top: 1px solid #f00; + border-bottom: 2px solid #008000; +}'''); +} + +void topLevelMixinDeeplyNestedRulesets() { + compileAndValidate(r''' +@mixin a { + a { + color: blue; + background-color: red; + } +} +@mixin b { + #foo-id { + border-top: 1px solid red; + border-bottom: 2px solid green; + } +} +@mixin f { + #split-bar div { + border: 1px solid lightgray; + } +} +@mixin e { + #split-bar:visited { + color: gray; + } + @include f; +} +@mixin d { + a:hover { + cursor: arrow; + } + @include e +} +@mixin c { + @include a; + span { + color: black; + background-color: orange; + } + @include b; + @include d; +} +@include c; +''', r'''a { + color: #00f; + background-color: #f00; +} +span { + color: #000; + background-color: #ffa500; +} +#foo-id { + border-top: 1px solid #f00; + border-bottom: 2px solid #008000; +} +a:hover { + cursor: arrow; +} +#split-bar:visited { + color: #808080; +} +#split-bar div { + border: 1px solid #d3d3d3; +}'''); +} + +/** Tests selector groups and other combinators. */ +void topLevelMixinSelectors() { + compileAndValidate(r''' +@mixin a { + a, b { + color: blue; + background-color: red; + } + div > span { + color: black; + background-color: orange; + } +} + +@include a; +''', r'''a, b { + color: #00f; + background-color: #f00; +} +div > span { + color: #000; + background-color: #ffa500; +}'''); +} + +void declSimpleMixin() { + compileAndValidate(r''' +@mixin div-border { + border: 2px dashed red; +} +div { + @include div-border; +} +''', r'''div { + border: 2px dashed #f00; +}'''); +} + +void declMixinTwoIncludes() { + compileAndValidate(r''' +@mixin div-border { + border: 2px dashed red; +} +@mixin div-color { + color: blue; +} +div { + @include div-border; + @include div-color; +} +''', r'''div { + border: 2px dashed #f00; + color: #00f; +}'''); +} + +void declMixinNestedIncludes() { + compileAndValidate(r''' +@mixin div-border { + border: 2px dashed red; +} +@mixin div-padding { + padding: .5em; +} +@mixin div-margin { + margin: 5px; +} +@mixin div-color { + @include div-padding; + color: blue; + @include div-margin; +} +div { + @include div-border; + @include div-color; +} +''', r'''div { + border: 2px dashed #f00; + padding: .5em; + color: #00f; + margin: 5px; +}'''); +} + +void declMixinDeeperNestedIncludes() { + compileAndValidate(r''' +@mixin div-border { + border: 2px dashed red; +} +@mixin div-padding { + padding: .5em; +} +@mixin div-margin { + margin: 5px; +} +@mixin div-color { + @include div-padding; + @include div-margin; +} +div { + @include div-border; + @include div-color; +} +''', r'''div { + border: 2px dashed #f00; + padding: .5em; + margin: 5px; +}'''); +} + +void mixinArg() { + compileAndValidate(r''' +@mixin div-border-1 { + border: 2px dashed red; +} +@mixin div-border-2() { + border: 22px solid blue; +} +@mixin div-left(@dist) { + margin-left: @dist; +} +@mixin div-right(var-margin) { + margin-right: var(margin); +} +div-1 { + @include div-left(10px); + @include div-right(100px); + @include div-border-1; +} +div-2 { + @include div-left(20em); + @include div-right(5in); + @include div-border-2(); +} +div-3 { + @include div-border-1(); +} +div-4 { + @include div-border-2; +} +''', r'''div-1 { + margin-left: 10px; + margin-right: 100px; + border: 2px dashed #f00; +} +div-2 { + margin-left: 20em; + margin-right: 5in; + border: 22px solid #00f; +} +div-3 { + border: 2px dashed #f00; +} +div-4 { + border: 22px solid #00f; +}'''); +} + +void mixinArgs() { + compileAndValidate(r''' +@mixin box-shadow(@shadows...) { + -moz-box-shadow: @shadows; + -webkit-box-shadow: @shadows; + box-shadow: var(shadows); +} + +.shadows { + @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999); +}''', r''' +.shadowed { + -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; + -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; + box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; +} +'''); +} + +void mixinManyArgs() { + compileAndValidate(r''' +@mixin border(@border-values) { + border: @border-values +} + +.primary { + @include border(3px solid green); +} +''', r''' +.primary { + border: 3px solid #008000; +}'''); + + compileAndValidate(r''' +@mixin setup(@border-color, @border-style, @border-size, @color) { + border: @border-size @border-style @border-color; + color: @color; +} + +.primary { + @include setup(red, solid, 5px, blue); +} +''', r''' +.primary { + border: 5px solid #f00; + color: #00f; +}'''); + + // Test passing a declaration that is multiple parameters. + compileAndValidate(r''' +@mixin colors(@text, @background, @border) { + color: @text; + background-color: @background; + border-color: @border; +} + +@values: #ff0000, #00ff00, #0000ff; +.primary { + @include colors(@values); +} +''', r'''var-values: #f00, #0f0, #00f; + +.primary { + color: #f00; + background-color: #0f0; + border-color: #00f; +}'''); + + compilePolyfillAndValidate(r''' +@mixin colors(@text, @background, @border) { + color: @text; + background-color: @background; + border-color: @border; +} + +@values: #ff0000, #00ff00, #0000ff; +.primary { + @include colors(@values); +} +''', r'''.primary { + color: #f00; + background-color: #0f0; + border-color: #00f; +}'''); +} + +void badDeclarationInclude() { + final errors = []; + final input = r''' +@mixin a { + #foo-id { + color: red; + } +} +@mixin b { + span { + border: 2px dashed red; + @include a; + } +} +@include b; +'''; + + var stylesheet = compileCss(input, errors: errors, opts: options); + + expect(stylesheet != null, true); + expect(errors.isNotEmpty, true); + expect(errors.length, 1, reason: errors.toString()); + var error = errors[0]; + expect(error.message, 'Using top-level mixin a as a declaration'); + expect(error.span.start.line, 8); + expect(error.span.end.offset, 105); +} + +void badTopInclude() { + final errors = []; + final input = r''' +@mixin b { + color: red; +} + +@mixin a { + span { + border: 2px dashed red; + } + @include b; +} + +@include a; + '''; + + var generated = r'''span { + border: 2px dashed #f00; +}'''; + + var stylesheet = compileCss(input, errors: errors, opts: options); + expect(stylesheet != null, true); + expect(errors.length, 1, reason: errors.toString()); + var error = errors[0]; + expect(error.message, 'Using declaration mixin b as top-level mixin'); + expect(error.span.start.line, 8); + expect(error.span.end.offset, 90); +} + +void emptyMixin() { + final errors = []; + final input = r''' +@mixin a { +} +@mixin b { + border: 2px dashed red; + @include a; +} +div { + @include b; +} + '''; + + var generated = r'''div { + border: 2px dashed #f00; +}'''; + + var stylesheet = compileCss(input, errors: errors, opts: options); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + + +void undefinedTopLevel() { + final errors = []; + final input = r''' +@mixin a { + @include b; +} +@mixin b { + span { + border: 2px dashed red; + } + @include a; +} + +@include b; + + '''; + + var stylesheet = compileCss(input, errors: errors, opts: options); + + expect(stylesheet != null, true); + expect(errors.isNotEmpty, true); + expect(errors.length, 1, reason: errors.toString()); + var error = errors[0]; + expect(error.message, 'Undefined mixin b'); + expect(error.span.start.line, 1); + expect(error.span.start.offset, 14); +} + +void undefinedDeclaration() { + final errors = []; + final input = r''' +@mixin a { + @include b; +} +@mixin b { + border: 2px dashed red; + @include a; +} +div { + @include b; +} + '''; + + var stylesheet = compileCss(input, errors: errors, opts: options); + + expect(stylesheet != null, true); + expect(errors.isNotEmpty, true); + expect(errors.length, 1, reason: errors.toString()); + var error = errors[0]; + expect(error.message, 'Undefined mixin b'); + expect(error.span.start.line, 1); + expect(error.span.start.offset, 14); +} + +void includeGrammar() { + compileAndValidate(r''' +@mixin a { + foo { color: red } +} + +@mixin b { + @include a; + @include a; +} + +@include b; +''', r'''foo { + color: #f00; +} +foo { + color: #f00; +}'''); + + compileAndValidate(r''' +@mixin a { + color: red +} + +foo { + @include a; + @include a +} +''', r'''foo { + color: #f00; + color: #f00; +}'''); + + var errors = []; + var input = r''' +@mixin a { + foo { color: red } +} + +@mixin b { + @include a + @include a +} + +@include b +'''; + + var stylesheet = compileCss(input, errors: errors, opts: options); + + expect(stylesheet != null, true); + + expect(errors.isNotEmpty, true); + expect(errors.length, 6, reason: errors.toString()); + var error = errors[0]; + expect(error.message, 'parsing error expected ;'); + expect(error.span.start.line, 6); + expect(error.span.end.offset, 69); + error = errors[1]; + expect(error.message, 'expected :, but found }'); + expect(error.span.start.line, 7); + expect(error.span.end.offset, 73); + error = errors[2]; + expect(error.message, 'parsing error expected }'); + expect(error.span.start.line, 9); + expect(error.span.end.offset, 83); + error = errors[3]; + expect(error.message, 'expected {, but found end of file(\n)'); + expect(error.span.start.line, 9); + expect(error.span.end.offset, 86); + error = errors[4]; + expect(error.message, 'expected }, but found end of file()'); + expect(error.span.start.line, 10); + expect(error.span.end.offset, 86); + error = errors[5]; + expect(error.message, 'Using top-level mixin a as a declaration'); + expect(error.span.start.line, 5); + expect(error.span.end.offset, 56); +} + +main() { + group('Basic mixin', () { + test('include grammar', includeGrammar); + test('empty mixin content', emptyMixin); + }); + + group('Top-level mixin', () { + test('simple mixin', topLevelMixin); + test('mixin with two @includes', topLevelMixinTwoIncludes); + test('multi rulesets', topLevelMixinMultiRulesets); + test('multi rulesets and nesting', topLevelMixinDeeplyNestedRulesets); + test('selector groups', topLevelMixinSelectors); + }); + + group('Declaration mixin', () { + test('simple', declSimpleMixin); + test('with two @includes', declMixinTwoIncludes); + test('with includes', declMixinNestedIncludes); + test('with deeper nesting', declMixinDeeperNestedIncludes); + }); + + group('Mixin arguments', () { + test('simple arg', mixinArg); + test('multiple args and var decls as args', mixinManyArgs); + }); + + group('Mixin warnings', () { + test('undefined top-level', undefinedTopLevel); + test('undefined declaration', undefinedDeclaration); + test('detect bad top-level as declaration', badDeclarationInclude); + test('detect bad declaration as top-level', badTopInclude); + }); +} diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index 5423644bb..ef7cb46c4 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -5,8 +5,6 @@ library nested_test; import 'package:unittest/unittest.dart'; -import 'package:csslib/parser.dart'; -import 'package:csslib/visitor.dart'; import 'testing.dart'; List optionsCss = ['--no-colors', 'memory']; @@ -602,6 +600,37 @@ light .leftCol .textLink a { compileAndValidate(input10, generated10); } +thisCombinator() { + var errors = []; + var input = r''' +.btn { + color: red; +} +.btn + .btn { + margin-left: 5px; +} +input.second { + & + label { + color: blue; + } +} +'''; + + var generated = r'''.btn { + color: #f00; +} +.btn + .btn { + margin-left: 5px; +} +input.second { +} +input.second + label { + color: #00f; +}'''; + + compileAndValidate(input, generated); +} + main() { test('Selector and Nested Variations', selectorVariations); test('Simple nesting', simpleNest); @@ -610,4 +639,5 @@ main() { test('Simple &', simpleThis); test("Variations &", variationsThis); test('Complex &', complexThis); + test('& with + selector', thisCombinator); } diff --git a/pkgs/csslib/test/run_all.dart b/pkgs/csslib/test/run_all.dart index 517d5a0bf..2ec893889 100644 --- a/pkgs/csslib/test/run_all.dart +++ b/pkgs/csslib/test/run_all.dart @@ -9,7 +9,6 @@ library run_impl; import 'dart:io'; -import 'package:unittest/unittest.dart'; import 'package:unittest/compact_vm_config.dart'; import 'testing.dart'; @@ -20,6 +19,9 @@ import 'nested_test.dart' as nested_test; import 'error_test.dart' as error_test; import 'selector_test.dart' as selector_test; import 'visitor_test.dart' as visitor_test; +import 'mixin_test.dart' as mixin_test; +import 'extend_test.dart' as extend_test; +import 'big_1_test.dart' as big_1_test; main() { var args = new Options().arguments; @@ -34,6 +36,9 @@ main() { if (pattern.hasMatch('var_test.dart')) var_test.main(); if (pattern.hasMatch('nested_test.dart')) nested_test.main(); if (pattern.hasMatch('selector_test.dart')) selector_test.main(); + if (pattern.hasMatch('mixin_test.dart')) mixin_test.main(); + if (pattern.hasMatch('extend_test.dart')) extend_test.main(); + if (pattern.hasMatch('big_1_test.dart')) big_1_test.main(); if (pattern.hasMatch('visitor_test.dart')) visitor_test.main(); if (pattern.hasMatch('error_test.dart')) error_test.main(); } diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index f2e1273b0..f15805cff 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -27,11 +27,14 @@ StyleSheet parseCss(String cssInput, {List errors, List opts}) => * CSS will allow any property/value pairs regardless of validity; all of our * tests (by default) will ensure that the CSS is really valid. */ -StyleSheet compileCss(String cssInput, - {List errors, List opts, bool polyfill: false}) => +StyleSheet compileCss(String cssInput, {List errors, List opts, + bool polyfill: false, List includes: null}) => compile(cssInput, errors: errors, options: opts == null ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts, - polyfill: polyfill); + polyfill: polyfill, includes: includes); + +StyleSheet polyFillCompileCss(input, {List errors, List opts}) => + compileCss(input, errors: errors, polyfill: true, opts: opts); /** CSS emitter walks the style sheet tree and emits readable CSS. */ var _emitCss = new CssPrinter(); diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 11e94be3d..d38569ac9 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -5,19 +5,34 @@ library var_test; import 'package:unittest/unittest.dart'; -import 'package:csslib/parser.dart'; -import 'package:csslib/visitor.dart'; import 'testing.dart'; +List options = ['--no-colors', '--warnings_as_errors', 'memory']; + +compileAndValidate(String input, String generated) { + var errors = []; + var stylesheet = compileCss(input, errors: errors, opts: options); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +compilePolyfillAndValidate(String input, String generated) { + var errors = []; + var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + void simpleVar() { - final errors = []; final input = ''':root { var-color-background: red; var-color-foreground: blue; - var-a: var(b); - var-b: var(c); var-c: #00ff00; + var-b: var(c); + var-a: var(b); } .testIt { color: var(color-foreground); @@ -28,21 +43,24 @@ void simpleVar() { final generated = ''':root { var-color-background: #f00; var-color-foreground: #00f; - var-a: var(b); - var-b: var(c); var-c: #0f0; + var-b: var(c); + var-a: var(b); } .testIt { color: var(color-foreground); background: var(color-background); }'''; - var stylesheet = compileCss(input, errors: errors, - opts: ['--no-colors', 'memory']); + final generatedPolyfill = ''':root { +} +.testIt { + color: #00f; + background: #f00; +}'''; - expect(stylesheet != null, true); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated); + compileAndValidate(input, generated); + compilePolyfillAndValidate(input, generatedPolyfill); } void expressionsVar() { @@ -51,9 +69,9 @@ void expressionsVar() { var-color-background: red; var-color-foreground: blue; - var-a: var(b); - var-b: var(c); var-c: #00ff00; + var-b: var(c); + var-a: var(b); var-image: url(test.png); @@ -115,9 +133,9 @@ void expressionsVar() { final generated = ''':root { var-color-background: #f00; var-color-foreground: #00f; - var-a: var(b); - var-b: var(c); var-c: #0f0; + var-b: var(c); + var-a: var(b); var-image: url("test.png"); var-b-width: 20cm; var-m-width: 33%; @@ -167,12 +185,41 @@ void expressionsVar() { grid-columns: var(grid-columns); }'''; - var stylesheet = compileCss(input, errors: errors, - opts: ['--no-colors', 'memory']); + compileAndValidate(input, generated); - expect(stylesheet != null, true); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated); + var generatedPolyfill = r''':root { +} +.testIt { + color: #00f; + background: #0f0; + background-image: url("test.png"); + border-width: 20cm; + margin-width: 33%; + border-height: 30em; + width: .6in; + length: 1.2in; + -web-stuff: -10px; + background-color: rgba(10, 20, 255); + transition: color 0.4s; + transform: rotate(20deg); + content: "✔"; + text-shadow: 0 -1px 0 #bfbfbf; +} +@font-face { + font-family: Gentium; + src: url("http://example.com/fonts/Gentium.ttf"); + unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; +} +@font-face { + font-family: Gentium; + src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); + unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; +} +.foobar { + grid-columns: 10px ("content" 1fr 10px) [4]; +}'''; + + compilePolyfillAndValidate(input, generatedPolyfill); } void defaultVar() { @@ -182,8 +229,8 @@ void defaultVar() { var-color-background: red; var-color-foreground: blue; - var-a: var(b); - var-b: var(c); + var-a: var(b, #0a0); + var-b: var(c, #0b0); var-c: #00ff00; var-image: url(test.png); @@ -211,7 +258,7 @@ div { } .test-3 { - background: var(color-background) var(image-2) no-repeat right top; + background: var(color-background) var(image) no-repeat right top; } .test-4 { @@ -230,8 +277,8 @@ div { final generated = ''':root { var-color-background: #f00; var-color-foreground: #00f; - var-a: var(b); - var-b: var(c); + var-a: var(b, #0a0); + var-b: var(c, #0b0); var-c: #0f0; var-image: url("test.png"); var-b-width: 20cm; @@ -251,7 +298,7 @@ div { background: var(color-background) var(image-2, url("img_1.png")) no-repeat right top; } .test-3 { - background: var(color-background) var(image-2) no-repeat right top; + background: var(color-background) var(image) no-repeat right top; } .test-4 { background: #ff0 var(image) no-repeat right top; @@ -263,15 +310,39 @@ div { border: #f00 var(a-1, solid 20px); }'''; - var stylesheet = compileCss(input, errors: errors, - opts: ['--no-colors', 'memory']); + compileAndValidate(input, generated); - expect(stylesheet != null, true); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated); + var generatedPolyfill = r''':root { +} +.test { + background-color: #ffa500; +} +body { + background: #0a0 url("test.png") no-repeat right top; +} +div { + background: #f00 url("img_tree.png") no-repeat right top; } +.test-2 { + background: #f00 url("img_1.png") no-repeat right top; +} +.test-3 { + background: #f00 url("test.png") no-repeat right top; +} +.test-4 { + background: #ff0 url("test.png") no-repeat right top; +} +.test-5 { + background: #0a0 url("test.png") no-repeat right top; +} +.test-6 { + border: #f00 solid 20px; +}'''; -void cyclesVar() { + compilePolyfillAndValidate(input, generatedPolyfill); +} + +void undefinedVars() { final errors = []; final input = ''':root { var-color-background: red; @@ -292,65 +363,99 @@ void cyclesVar() { var-def-2: var(def-3); var-def-3: var(def-2); } + .testIt { color: var(color-foreground); background: var(color-background); } +.test-1 { + color: var(c); +} .test-2 { color: var(one); + background: var(six); } '''; - final generated = ''':root { + final generatedPolyfill = ''':root { +} +.testIt { + color: #00f; + background: #f00; +} +.test-1 { + color: #0f0; +} +.test-2 { + color: ; + background: ; +}'''; + + var errorStrings = [ + 'error :5:14: Variable is not defined.\n' + ' var-a: var(b);\n' + ' ^^', + 'error :6:14: Variable is not defined.\n' + ' var-b: var(c);\n' + ' ^^', + 'error :9:16: Variable is not defined.\n' + ' var-one: var(two);\n' + ' ^^^^', + 'error :12:17: Variable is not defined.\n' + ' var-four: var(five);\n' + ' ^^^^^', + 'error :13:17: Variable is not defined.\n' + ' var-five: var(six);\n' + ' ^^^^', + 'error :16:18: Variable is not defined.\n' + ' var-def-1: var(def-2);\n' + ' ^^^^^^', + 'error :17:18: Variable is not defined.\n' + ' var-def-2: var(def-3);\n' + ' ^^^^^^', + ]; + + var generated = r''':root { var-color-background: #f00; var-color-foreground: #00f; var-a: var(b); var-b: var(c); var-c: #0f0; + var-one: var(two); + var-two: var(one); + var-four: var(five); + var-five: var(six); + var-six: var(four); + var-def-1: var(def-2); + var-def-2: var(def-3); + var-def-3: var(def-2); } .testIt { color: var(color-foreground); background: var(color-background); } +.test-1 { + color: var(c); +} .test-2 { color: var(one); + background: var(six); }'''; + int testBitMap = 0; + + compileAndValidate(input, generated); - var stylesheet = compileCss(input, errors: errors, - opts: ['--no-colors', '--warnings_as_errors', 'memory']); + var stylesheet = polyFillCompileCss(input, errors: errors..clear(), + opts: options); expect(stylesheet != null, true); - expect(errors.length, 8, reason: errors.toString()); - int testBitMap = 0; - var errorStrings = [ - 'error :14:3: var cycle detected var-six\n' - ' var-six: var(four);\n' - ' ^^^^^^^^^^^^^^^^^^', - 'error :18:3: var cycle detected var-def-3\n' - ' var-def-3: var(def-2);\n' - ' ^^^^^^^^^^^^^^^^^^^^^', - 'error :10:3: var cycle detected var-two\n' - ' var-two: var(one);\n' - ' ^^^^^^^^^^^^^^^^^', - 'error :17:3: var cycle detected var-def-2\n' - ' var-def-2: var(def-3);\n' - ' ^^^^^^^^^^^^^^^^^^^^^', - 'error :16:3: var cycle detected var-def-1\n' - ' var-def-1: var(def-2);\n' - ' ^^^^^^^^^^^^^^^^^^^^^', - 'error :13:3: var cycle detected var-five\n' - ' var-five: var(six);\n' - ' ^^^^^^^^^^^^^^^^^^', - 'error :9:3: var cycle detected var-one\n' - ' var-one: var(two);\n' - ' ^^^^^^^^^^^^^^^^^', - 'error :12:3: var cycle detected var-four\n' - ' var-four: var(five);\n' - ' ^^^^^^^^^^^^^^^^^^^' - ]; + + expect(errors.length, errorStrings.length, reason: errors.toString()); + testBitMap = 0; + outer: for (var error in errors) { var errorString = error.toString(); - for (int i = 0; i < 8; i++) { + for (int i = 0; i < errorStrings.length; i++) { if (errorString == errorStrings[i]) { testBitMap |= 1 << i; continue outer; @@ -358,19 +463,18 @@ void cyclesVar() { } fail("Unexpected error string: $errorString"); } - expect(testBitMap, equals((1 << 8) - 1)); - expect(prettyPrint(stylesheet), generated); + expect(testBitMap, equals((1 << errorStrings.length) - 1)); + expect(prettyPrint(stylesheet), generatedPolyfill); } parserVar() { - final errors = []; final input = ''':root { var-color-background: red; var-color-foreground: blue; - var-a: var(b); - var-b: var(c); var-c: #00ff00; + var-b: var(c); + var-a: var(b); var-image: url(test.png); @@ -432,9 +536,9 @@ parserVar() { final generated = ''':root { var-color-background: #f00; var-color-foreground: #00f; - var-a: var(b); - var-b: var(c); var-c: #0f0; + var-b: var(c); + var-a: var(b); var-image: url("test.png"); var-b-width: 20cm; var-m-width: 33%; @@ -484,12 +588,40 @@ parserVar() { grid-columns: var(grid-columns); }'''; - var stylesheet = parseCss(input, errors: errors, - opts: ['--no-colors', 'memory']); + compileAndValidate(input, generated); - expect(stylesheet != null, true); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated); + var generatedPolyfill = r''':root { +} +.testIt { + color: #00f; + background: #0f0; + background-image: url("test.png"); + border-width: 20cm; + margin-width: 33%; + border-height: 30em; + width: .6in; + length: 1.2in; + -web-stuff: -10px; + background-color: rgba(10, 20, 255); + transition: color 0.4s; + transform: rotate(20deg); + content: "✔"; + text-shadow: 0 -1px 0 #bfbfbf; +} +@font-face { + font-family: Gentium; + src: url("http://example.com/fonts/Gentium.ttf"); + unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; +} +@font-face { + font-family: Gentium; + src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); + unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; +} +.foobar { + grid-columns: 10px ("content" 1fr 10px) [4]; +}'''; + compilePolyfillAndValidate(input, generatedPolyfill); } testVar() { @@ -519,12 +651,7 @@ var-color-foreground: #00f; expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); - stylesheet = compileCss(input, errors: errors..clear(), - opts: ['--no-colors', 'memory']); - - expect(stylesheet != null, true); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated); + compileAndValidate(input, generated); final input2 = ''' @color-background: red; @@ -550,12 +677,7 @@ var-color-foreground: #00f; expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); - stylesheet = compileCss(input2, errors: errors..clear(), - opts: ['--no-colors', 'memory', '--no-less']); - - expect(stylesheet != null, true); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated2); + compileAndValidate(input2, generated2); } testLess() { @@ -584,12 +706,7 @@ var-color-foreground: #00f; expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); - stylesheet = compileCss(input, errors: errors..clear(), - opts: ['--no-colors', 'memory']); - - expect(stylesheet != null, true); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated); + compileAndValidate(input, generated); final input2 = ''' @color-background: red; @@ -615,38 +732,185 @@ var-color-foreground: #00f; expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); - stylesheet = compileCss(input2, errors: errors..clear(), - opts: ['--no-colors', 'memory', '--no-less']); - - expect(stylesheet != null, true); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated2); + compileAndValidate(input2, generated2); } void polyfill() { - var errors = []; - var input = r''' + compilePolyfillAndValidate(r''' @color-background: red; @color-foreground: blue; .test { background-color: @color-background; color: @color-foreground; -}'''; - - var generated = r'''.test { +}''', r'''.test { background-color: #f00; color: #00f; +}'''); +} + +void testIndirects() { + compilePolyfillAndValidate(''' +:root { + var-redef: #0f0; + + var-a1: #fff; + var-a2: var(a1); + var-a3: var(a2); + + var-redef: #000; +} +.test { + background-color: @a1; + color: @a2; + border-color: @a3; +} +.test-1 { + color: @redef; +}''', r''':root { +} +.test { + background-color: #fff; + color: #fff; + border-color: #fff; +} +.test-1 { + color: #000; +}'''); +} + +void includes() { + var errors = []; + var file1Input = r''' +:root { + var-redef: #0f0; + + var-a1: #fff; + var-a2: var(a1); + var-a3: var(a2); + + var-redef: #000; +} +.test-1 { + background-color: @a1; + color: @a2; + border-color: @a3; +} +.test-1a { + color: @redef; +} +'''; + + var file2Input = r''' +:root { + var-redef: #0b0; + var-b3: var(a3); +} +.test-2 { + color: var(b3); + background-color: var(redef); + border-color: var(a3); +} +'''; + + var input = r''' +:root { + var-redef: #0c0; +} +.test-main { + color: var(b3); + background-color: var(redef); + border-color: var(a3); +} +'''; + + var generated1 = r''':root { + var-redef: #0f0; + var-a1: #fff; + var-a2: var(a1); + var-a3: var(a2); + var-redef: #000; +} +.test-1 { + background-color: var(a1); + color: var(a2); + border-color: var(a3); +} +.test-1a { + color: var(redef); }'''; - var stylesheet = compileCss(input, errors: errors, - opts: ['--no-colors', 'memory'], polyfill: true); + var stylesheet1 = compileCss(file1Input, errors: errors, opts: options); + expect(stylesheet1 != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet1), generated1); - expect(stylesheet != null, true); + var generated2 = r''':root { + var-redef: #0b0; + var-b3: var(a3); +} +.test-2 { + color: var(b3); + background-color: var(redef); + border-color: var(a3); +}'''; + + var stylesheet2 = compileCss(file2Input, includes: [stylesheet1], + errors: errors..clear(), opts: options); + expect(stylesheet2 != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated); + expect(prettyPrint(stylesheet2), generated2); + + var generatedPolyfill1 = r''':root { +} +.test-1 { + background-color: #fff; + color: #fff; + border-color: #fff; } +.test-1a { + color: #000; +}'''; + var styleSheet1Polyfill = compileCss(file1Input, errors: errors..clear(), + polyfill: true, opts: options); + expect(styleSheet1Polyfill != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(styleSheet1Polyfill), generatedPolyfill1); + + var generatedPolyfill2 = r''':root { +} +.test-2 { + color: #fff; + background-color: #0b0; + border-color: #fff; +}'''; + var styleSheet2Polyfill = compileCss(file2Input, includes: [stylesheet1], + errors: errors..clear(), polyfill: true, opts: options); + expect(styleSheet2Polyfill != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(styleSheet2Polyfill), generatedPolyfill2); + // Make sure includes didn't change. + expect(prettyPrint(stylesheet1), generated1); + var generatedPolyfill = r''':root { +} +.test-main { + color: #fff; + background-color: #0c0; + border-color: #fff; +}'''; + var stylesheetPolyfill = compileCss(input, + includes: [stylesheet1, stylesheet2], errors: errors..clear(), + polyfill: true, opts: options); + + expect(stylesheetPolyfill != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheetPolyfill), generatedPolyfill); + + // Make sure includes didn't change. + expect(prettyPrint(stylesheet1), generated1); + expect(prettyPrint(stylesheet2), generated2); +} main() { test('Simple var', simpleVar); @@ -654,7 +918,9 @@ main() { test('Default value in var()', defaultVar); test('CSS Parser only var', parserVar); test('Var syntax', testVar); - test('Cycles var', cyclesVar); + test('Indirects', testIndirects); + test('Forward Refs', undefinedVars); test('Less syntax', testLess); test('Polyfill', polyfill); + test('Multi-file', includes); } From 4cc17921957417c24521018beb1fd185b7528bb3 Mon Sep 17 00:00:00 2001 From: "whesse@google.com" Date: Wed, 30 Oct 2013 15:17:01 +0000 Subject: [PATCH 006/245] Remove uses of Options from pkg, samples, tests, and third_party directories. BUG= R=sgjesse@google.com Review URL: https://codereview.chromium.org//52573002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@29552 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/css.dart | 4 ++-- pkgs/csslib/test/run_all.dart | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index 92070ad06..2d94e5c33 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -14,9 +14,9 @@ import 'visitor.dart'; import 'src/messages.dart'; import 'src/options.dart'; -void main() { +void main(List arguments) { // TODO(jmesserly): fix this to return a proper exit code - var options = PreprocessorOptions.parse(new Options().arguments); + var options = PreprocessorOptions.parse(arguments); if (options == null) return; messages = new Messages(options: options); diff --git a/pkgs/csslib/test/run_all.dart b/pkgs/csslib/test/run_all.dart index 2ec893889..f57ff3eee 100644 --- a/pkgs/csslib/test/run_all.dart +++ b/pkgs/csslib/test/run_all.dart @@ -23,10 +23,8 @@ import 'mixin_test.dart' as mixin_test; import 'extend_test.dart' as extend_test; import 'big_1_test.dart' as big_1_test; -main() { - var args = new Options().arguments; - - var pattern = new RegExp(args.length > 0 ? args[0] : '.'); +main(List arguments) { + var pattern = new RegExp(arguments.length > 0 ? arguments[0] : '.'); useCompactVMConfiguration(); useMockMessages(); From 056373584d03e115d9c1a03181a26df655a6307d Mon Sep 17 00:00:00 2001 From: "jmesserly@google.com" Date: Thu, 31 Oct 2013 02:43:00 +0000 Subject: [PATCH 007/245] fix csslib and watcher warnings R=rnystrom@google.com, terry@google.com Review URL: https://codereview.chromium.org//50703011 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@29632 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/parser.dart | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index fd5a0c2bc..92f16524e 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -570,7 +570,7 @@ class _Parser { pseudoPage.name == 'first')) { _warning("Pseudo page must be left, top or first", pseudoPage.span); - return; + return null; } } } @@ -742,8 +742,9 @@ class _Parser { case TokenKind.DIRECTIVE_CONTENT: // TODO(terry): TBD _warning("@content not implemented.", _makeSpan(start)); - return; + return null; } + return null; } /** @@ -1890,7 +1891,7 @@ class _Parser { break; default: // Don't handle it. - return; + return null; } } @@ -1979,7 +1980,7 @@ class _Parser { left = marginValue(exprs.expressions[3]); break; default: - return; + return null; } return new BoxEdge.clockwiseFromTop(top, right, bottom, left); From da1bf5ffea32deef0b08bb5540d524a46739826a Mon Sep 17 00:00:00 2001 From: "jmesserly@google.com" Date: Wed, 6 Nov 2013 03:27:58 +0000 Subject: [PATCH 008/245] add versions and constraints for packages and samples - all packages at 0.9.0, except "analyzer" which had a version already - dependencies at ">=0.9.0 <0.10.0" except analyzer is ">=0.10.0 <0.11.0" - sdk constraint ">=1.0.0 <2.0.0" R=sigmund@google.com Review URL: https://codereview.chromium.org//59763006 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@29957 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index b82194155..6422dd661 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,12 +1,15 @@ name: csslib +version: 0.9.0 author: "Web UI Team " description: A library for parsing CSS. homepage: https://www.dartlang.org dependencies: - args: any - logging: any - path: any - source_maps: any + args: ">=0.9.0 <0.10.0" + logging: ">=0.9.0 <0.10.0" + path: ">=0.9.0 <0.10.0" + source_maps: ">=0.9.0 <0.10.0" dev_dependencies: - browser: any - unittest: any + browser: ">=0.9.0 <0.10.0" + unittest: ">=0.9.0 <0.10.0" +environment: + sdk: ">=1.0.0 <2.0.0" From 6e672a238901bd5b38834288fb2b6ba76bc2c359 Mon Sep 17 00:00:00 2001 From: "ajohnsen@google.com" Date: Wed, 6 Nov 2013 09:09:18 +0000 Subject: [PATCH 009/245] Revert "add versions and constraints for packages and samples" This is currently blocking us from testing samples. BUG= R=kasperl@google.com Review URL: https://codereview.chromium.org//59513007 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@29960 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 6422dd661..b82194155 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,15 +1,12 @@ name: csslib -version: 0.9.0 author: "Web UI Team " description: A library for parsing CSS. homepage: https://www.dartlang.org dependencies: - args: ">=0.9.0 <0.10.0" - logging: ">=0.9.0 <0.10.0" - path: ">=0.9.0 <0.10.0" - source_maps: ">=0.9.0 <0.10.0" + args: any + logging: any + path: any + source_maps: any dev_dependencies: - browser: ">=0.9.0 <0.10.0" - unittest: ">=0.9.0 <0.10.0" -environment: - sdk: ">=1.0.0 <2.0.0" + browser: any + unittest: any From 0f4df87d96b4afeb639069ad0f1f2d8d2e7b3da4 Mon Sep 17 00:00:00 2001 From: "dgrove@google.com" Date: Wed, 6 Nov 2013 18:28:22 +0000 Subject: [PATCH 010/245] Re-land r29957 (add versions and constraints for packages and samples), with SDK constraints bumped from 1.0.0 to 0.8.10+6 . R=ricow@google.com, sigmund@google.com Review URL: https://codereview.chromium.org//62473002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@29986 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index b82194155..a995672e4 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,12 +1,15 @@ name: csslib +version: 0.9.0 author: "Web UI Team " description: A library for parsing CSS. homepage: https://www.dartlang.org dependencies: - args: any - logging: any - path: any - source_maps: any + args: ">=0.9.0 <0.10.0" + logging: ">=0.9.0 <0.10.0" + path: ">=0.9.0 <0.10.0" + source_maps: ">=0.9.0 <0.10.0" dev_dependencies: - browser: any - unittest: any + browser: ">=0.9.0 <0.10.0" + unittest: ">=0.9.0 <0.10.0" +environment: + sdk: ">=0.8.10+6 <2.0.0" From 6152877f7d0f9274faca276729aad5610907a4d3 Mon Sep 17 00:00:00 2001 From: "kevmoo@j832.com" Date: Wed, 6 Nov 2013 20:13:09 +0000 Subject: [PATCH 011/245] pkg/csslib: remove drone.io reference from README R=jmesserly@google.com Review URL: https://codereview.chromium.org//62913002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@29992 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkgs/csslib/README.md b/pkgs/csslib/README.md index b84dae4f2..e64fd9bc6 100644 --- a/pkgs/csslib/README.md +++ b/pkgs/csslib/README.md @@ -4,8 +4,6 @@ csslib in Pure Dart This is a pure [Dart][dart] [CSS parser][cssparse]. Since it's 100% Dart you can use it safely from a script or server side app. -[![Build Status](https://drone.io/github.com/dart-lang/csslib/status.png)](https://drone.io/github.com/dart-lang/csslib/latest) - Installation ------------ From dfe731049c6e15d6d852c988e4aa1174be1c2003 Mon Sep 17 00:00:00 2001 From: "kevmoo@j832.com" Date: Thu, 7 Nov 2013 14:45:52 +0000 Subject: [PATCH 012/245] pkg/csslib: types, fixes, cleanup R=terry@google.com Review URL: https://codereview.chromium.org//64373003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@30049 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/bin/css.dart | 2 +- pkgs/csslib/lib/src/css_printer.dart | 6 +- pkgs/csslib/lib/src/tree.dart | 205 ++++++++++++------------- pkgs/csslib/lib/src/tree_base.dart | 12 +- pkgs/csslib/lib/src/tree_printer.dart | 12 +- pkgs/csslib/lib/src/validate.dart | 1 - pkgs/csslib/lib/visitor.dart | 6 +- pkgs/csslib/test/debug_test.dart | 30 ++++ pkgs/csslib/test/declaration_test.dart | 2 - pkgs/csslib/test/error_test.dart | 2 - pkgs/csslib/test/run_all.dart | 15 +- pkgs/csslib/test/selector_test.dart | 1 - pkgs/csslib/test/testing.dart | 8 +- pkgs/csslib/test/visitor_test.dart | 1 - 14 files changed, 162 insertions(+), 141 deletions(-) create mode 100644 pkgs/csslib/test/debug_test.dart diff --git a/pkgs/csslib/bin/css.dart b/pkgs/csslib/bin/css.dart index 08f29304a..f64faac45 100644 --- a/pkgs/csslib/bin/css.dart +++ b/pkgs/csslib/bin/css.dart @@ -5,4 +5,4 @@ import 'package:csslib/css.dart' as css; -void main() => css.main(); +void main(List args) => css.main(args); diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index b532544cc..73c298451 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -137,7 +137,7 @@ class CssPrinter extends Visitor { void visitKeyFrameDirective(KeyFrameDirective node) { emit('$_newLine${node.keyFrameName} '); - node._name.visit(this); + node.name.visit(this); emit('$_sp{$_newLine'); for (final block in node._blocks) { block.visit(this); @@ -274,7 +274,7 @@ class CssPrinter extends Visitor { void visitSelectorGroup(SelectorGroup node) { - var selectors = node._selectors; + var selectors = node.selectors; var selectorsLength = selectors.length; for (var i = 0; i < selectorsLength; i++) { if (i > 0) emit(',$_sp'); @@ -284,7 +284,7 @@ class CssPrinter extends Visitor { void visitSimpleSelectorSequence(SimpleSelectorSequence node) { emit('${node._combinatorToString}'); - node._selector.visit(this); + node.simpleSelector.visit(this); } void visitSimpleSelector(SimpleSelector node) { diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 1de595709..941eb570b 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -15,7 +15,7 @@ class Identifier extends TreeNode { Identifier clone() => new Identifier(name, span); - visit(VisitorBase visitor) => visitor.visitIdentifier(this); + void visit(VisitorBase visitor) => visitor.visitIdentifier(this); String toString() => name; } @@ -55,51 +55,44 @@ class CommentDefinition extends CssComment { } class SelectorGroup extends TreeNode { - List _selectors; + final List selectors; - SelectorGroup(this._selectors, Span span): super(span); + SelectorGroup(this.selectors, Span span): super(span); - List get selectors => _selectors; + SelectorGroup clone() => new SelectorGroup(selectors, span); - SelectorGroup clone() => new SelectorGroup(_selectors, span); - - visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); + void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); } class Selector extends TreeNode { - final List _simpleSelectorSequences; - - Selector(this._simpleSelectorSequences, Span span) : super(span); + final List simpleSelectorSequences; - List get simpleSelectorSequences => - _simpleSelectorSequences; + Selector(this.simpleSelectorSequences, Span span) : super(span); - add(SimpleSelectorSequence seq) => _simpleSelectorSequences.add(seq); + void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq); - int get length => _simpleSelectorSequences.length; + int get length => simpleSelectorSequences.length; Selector clone() { - var simpleSequences = []; - for (var simpleSeq in simpleSelectorSequences) { - simpleSequences.add(simpleSeq.clone()); - } + var simpleSequences = simpleSelectorSequences + .map((ss) => ss.clone()) + .toList(); + return new Selector(simpleSequences, span); } - visit(VisitorBase visitor) => visitor.visitSelector(this); + void visit(VisitorBase visitor) => visitor.visitSelector(this); } class SimpleSelectorSequence extends TreeNode { /** +, >, ~, NONE */ int combinator; - final SimpleSelector _selector; + final SimpleSelector simpleSelector; - SimpleSelectorSequence(this._selector, Span span, + SimpleSelectorSequence(this.simpleSelector, Span span, [int combinator = TokenKind.COMBINATOR_NONE]) : combinator = combinator, super(span); - get simpleSelector => _selector; - bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE; bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS; bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER; @@ -114,16 +107,16 @@ class SimpleSelectorSequence extends TreeNode { isCombinatorTilde ? ' ~ ' : ''; SimpleSelectorSequence clone() => - new SimpleSelectorSequence(_selector, span, combinator); + new SimpleSelectorSequence(simpleSelector, span, combinator); - visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); + void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); } /* All other selectors (element, #id, .class, attribute, pseudo, negation, * namespace, *) are derived from this selector. */ class SimpleSelector extends TreeNode { - final _name; + final _name; // Wildcard, ThisOperator, Identifier, others? SimpleSelector(this._name, Span span) : super(span); @@ -136,7 +129,7 @@ class SimpleSelector extends TreeNode { SimpleSelector clone() => new SimpleSelector(_name, span); - visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); + void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); } // element name @@ -319,7 +312,7 @@ class NegationSelector extends SimpleSelector { NegationSelector clone() => new NegationSelector(negationArg, span); - visit(VisitorBase visitor) => visitor.visitNegationSelector(this); + void visit(VisitorBase visitor) => visitor.visitNegationSelector(this); } class NoOp extends TreeNode { @@ -334,7 +327,7 @@ class StyleSheet extends TreeNode { /** * Contains charset, ruleset, directives (media, page, etc.), and selectors. */ - final topLevels; + final List topLevels; StyleSheet(this.topLevels, Span span) : super(span) { for (final node in topLevels) { @@ -346,12 +339,11 @@ class StyleSheet extends TreeNode { StyleSheet.selector(this.topLevels, Span span) : super(span); StyleSheet clone() { - var clonedTopLevels = []; - clonedTopLevels.add(topLevels.clone()); + var clonedTopLevels = topLevels.map((e) => e.clone()).toList(); return new StyleSheet(clonedTopLevels, span); } - visit(VisitorBase visitor) => visitor.visitStyleSheet(this); + void visit(VisitorBase visitor) => visitor.visitStyleSheet(this); } class TopLevelProduction extends TreeNode { @@ -385,7 +377,7 @@ class Directive extends TreeNode { bool get isExtension => false; // SCSS extension? Directive clone() => new Directive(span); - visit(VisitorBase visitor) => visitor.visitDirective(this); + void visit(VisitorBase visitor) => visitor.visitDirective(this); } class ImportDirective extends Directive { @@ -405,7 +397,7 @@ class ImportDirective extends Directive { return new ImportDirective(import, cloneMediaQueries, span); } - visit(VisitorBase visitor) => visitor.visitImportDirective(this); + void visit(VisitorBase visitor) => visitor.visitImportDirective(this); } /** @@ -427,7 +419,7 @@ class MediaExpression extends TreeNode { return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span); } - visit(VisitorBase visitor) => visitor.visitMediaExpression(this); + void visit(VisitorBase visitor) => visitor.visitMediaExpression(this); } /** @@ -468,8 +460,8 @@ class MediaQuery extends TreeNode { } class MediaDirective extends Directive { - List mediaQueries; - List rulesets; + final List mediaQueries; + final List rulesets; MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span); @@ -484,11 +476,12 @@ class MediaDirective extends Directive { } return new MediaDirective(cloneQueries, cloneRulesets, span); } - visit(VisitorBase visitor) => visitor.visitMediaDirective(this); + + void visit(VisitorBase visitor) => visitor.visitMediaDirective(this); } class HostDirective extends Directive { - List rulesets; + final List rulesets; HostDirective(this.rulesets, Span span) : super(span); @@ -499,13 +492,14 @@ class HostDirective extends Directive { } return new HostDirective(cloneRulesets, span); } - visit(VisitorBase visitor) => visitor.visitHostDirective(this); + + void visit(VisitorBase visitor) => visitor.visitHostDirective(this); } class PageDirective extends Directive { final String _ident; final String _pseudoPage; - List _declsMargin; + final List _declsMargin; PageDirective(this._ident, this._pseudoPage, this._declsMargin, Span span) : super(span); @@ -517,7 +511,8 @@ class PageDirective extends Directive { } return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span); } - visit(VisitorBase visitor) => visitor.visitPageDirective(this); + + void visit(VisitorBase visitor) => visitor.visitPageDirective(this); bool get hasIdent => _ident != null && _ident.length > 0; bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0; @@ -528,7 +523,7 @@ class CharsetDirective extends Directive { CharsetDirective(this.charEncoding, Span span) : super(span); CharsetDirective clone() => new CharsetDirective(charEncoding, span); - visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); + void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); } class KeyFrameDirective extends Directive { @@ -536,10 +531,10 @@ class KeyFrameDirective extends Directive { * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-. */ final int _keyframeName; - final _name; + final name; final List _blocks; - KeyFrameDirective(this._keyframeName, this._name, Span span) + KeyFrameDirective(this._keyframeName, this.name, Span span) : _blocks = [], super(span); add(KeyFrameBlock block) { @@ -557,8 +552,6 @@ class KeyFrameDirective extends Directive { } } - String get name => _name; - KeyFrameDirective clone() { var cloneBlocks = []; for (var block in _blocks) { @@ -566,7 +559,7 @@ class KeyFrameDirective extends Directive { } return new KeyFrameDirective(_keyframeName, cloneBlocks, span); } - visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); + void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); } class KeyFrameBlock extends Expression { @@ -578,7 +571,7 @@ class KeyFrameBlock extends Expression { KeyFrameBlock clone() => new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); - visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); + void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); } class FontFaceDirective extends Directive { @@ -588,7 +581,7 @@ class FontFaceDirective extends Directive { FontFaceDirective clone() => new FontFaceDirective(_declarations.clone(), span); - visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); + void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); } class StyletDirective extends Directive { @@ -610,7 +603,7 @@ class StyletDirective extends Directive { } return new StyletDirective(_dartClassName, cloneRulesets, span); } - visit(VisitorBase visitor) => visitor.visitStyletDirective(this); + void visit(VisitorBase visitor) => visitor.visitStyletDirective(this); } class NamespaceDirective extends Directive { @@ -623,7 +616,7 @@ class NamespaceDirective extends Directive { NamespaceDirective(this._prefix, this._uri, Span span) : super(span); NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); - visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); + void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; } @@ -636,7 +629,7 @@ class VarDefinitionDirective extends Directive { VarDefinitionDirective clone() => new VarDefinitionDirective(def.clone(), span); - visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); + void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); } class MixinDefinition extends Directive { @@ -654,7 +647,7 @@ class MixinDefinition extends Directive { } return new MixinDefinition(name, cloneDefinedArgs, varArgs, span); } - visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); + void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); } /** Support a Sass @mixin. See http://sass-lang.com for description. */ @@ -677,7 +670,7 @@ class MixinRulesetDirective extends MixinDefinition { return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets, span); } - visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); + void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); } class MixinDeclarationDirective extends MixinDefinition { @@ -694,7 +687,7 @@ class MixinDeclarationDirective extends MixinDefinition { return new MixinDeclarationDirective(name, clonedArgs, varArgs, declarations.clone(), span); } - visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); + void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); } /** To support consuming a SASS mixin @include. */ @@ -713,21 +706,22 @@ class IncludeDirective extends Directive { } return new IncludeDirective(name, cloneArgs, span); } - visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); + + void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); } /** To support SASS @content. */ class ContentDirective extends Directive { ContentDirective(Span span) : super(span); - visit(VisitorBase visitor) => visitor.visitContentDirective(this); + void visit(VisitorBase visitor) => visitor.visitContentDirective(this); } class Declaration extends TreeNode { final Identifier _property; final Expression _expression; /** Style exposed to Dart. */ - var _dart; + dynamic _dart; final bool important; /** @@ -756,7 +750,8 @@ class Declaration extends TreeNode { Declaration clone() => new Declaration(_property.clone(), _expression.clone(), _dart, span, important: important); - visit(VisitorBase visitor) => visitor.visitDeclaration(this); + + void visit(VisitorBase visitor) => visitor.visitDeclaration(this); } // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and @@ -778,7 +773,7 @@ class VarDefinition extends Declaration { VarDefinition clone() => new VarDefinition(_property.clone(), expression != null ? expression.clone() : null, span); - visit(VisitorBase visitor) => visitor.visitVarDefinition(this); + void visit(VisitorBase visitor) => visitor.visitVarDefinition(this); } /** @@ -796,7 +791,9 @@ class IncludeMixinAtDeclaration extends Declaration { IncludeMixinAtDeclaration clone() => new IncludeMixinAtDeclaration(include.clone(), span); - visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this); + + void visit(VisitorBase visitor) => + visitor.visitIncludeMixinAtDeclaration(this); } class ExtendDeclaration extends Declaration { @@ -813,7 +810,7 @@ class ExtendDeclaration extends Declaration { return new ExtendDeclaration(newSelector, span); } - visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); + void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); } class DeclarationGroup extends TreeNode { @@ -831,7 +828,8 @@ class DeclarationGroup extends TreeNode { } return new DeclarationGroup(clonedDecls, span); } - visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); + + void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); } class MarginGroup extends DeclarationGroup { @@ -841,7 +839,7 @@ class MarginGroup extends DeclarationGroup { : super(decls, span); MarginGroup clone() => new MarginGroup(margin_sym, super.clone() as dynamic, span); - visit(VisitorBase visitor) => visitor.visitMarginGroup(this); + void visit(VisitorBase visitor) => visitor.visitMarginGroup(this); } class VarUsage extends Expression { @@ -853,35 +851,36 @@ class VarUsage extends Expression { VarUsage clone() { var clonedValues = []; for (var expr in defaultValues) { - clonedValues.addd(expr.clone()); + clonedValues.add(expr.clone()); } return new VarUsage(name, clonedValues, span); } - visit(VisitorBase visitor) => visitor.visitVarUsage(this); + + void visit(VisitorBase visitor) => visitor.visitVarUsage(this); } class OperatorSlash extends Expression { OperatorSlash(Span span) : super(span); OperatorSlash clone() => new OperatorSlash(span); - visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); + void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); } class OperatorComma extends Expression { OperatorComma(Span span) : super(span); OperatorComma clone() => new OperatorComma(span); - visit(VisitorBase visitor) => visitor.visitOperatorComma(this); + void visit(VisitorBase visitor) => visitor.visitOperatorComma(this); } class OperatorPlus extends Expression { OperatorPlus(Span span) : super(span); OperatorPlus clone() => new OperatorPlus(span); - visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); + void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); } class OperatorMinus extends Expression { OperatorMinus(Span span) : super(span); OperatorMinus clone() => new OperatorMinus(span); - visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); + void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); } class UnicodeRangeTerm extends Expression { @@ -894,27 +893,27 @@ class UnicodeRangeTerm extends Expression { UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span); - visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); + void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); } class LiteralTerm extends Expression { // TODO(terry): value and text fields can be made final once all CSS resources // are copied/symlink'd in the build tool and UriVisitor in // web_ui is removed. - var value; + dynamic value; String text; LiteralTerm(this.value, this.text, Span span) : super(span); LiteralTerm clone() => new LiteralTerm(value, text, span); - visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); + void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); } class NumberTerm extends LiteralTerm { NumberTerm(value, String t, Span span) : super(value, t, span); NumberTerm clone() => new NumberTerm(value, text, span); - visit(VisitorBase visitor) => visitor.visitNumberTerm(this); + void visit(VisitorBase visitor) => visitor.visitNumberTerm(this); } class UnitTerm extends LiteralTerm { @@ -926,7 +925,7 @@ class UnitTerm extends LiteralTerm { UnitTerm clone() => new UnitTerm(value, text, span, _unit); - visit(VisitorBase visitor) => visitor.visitUnitTerm(this); + void visit(VisitorBase visitor) => visitor.visitUnitTerm(this); String unitToString() => TokenKind.unitToString(_unit); @@ -944,25 +943,25 @@ class LengthTerm extends UnitTerm { this._unit == TokenKind.UNIT_LENGTH_PC); } LengthTerm clone() => new LengthTerm(value, text, span, _unit); - visit(VisitorBase visitor) => visitor.visitLengthTerm(this); + void visit(VisitorBase visitor) => visitor.visitLengthTerm(this); } class PercentageTerm extends LiteralTerm { PercentageTerm(value, String t, Span span) : super(value, t, span); PercentageTerm clone() => new PercentageTerm(value, text, span); - visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); + void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); } class EmTerm extends LiteralTerm { EmTerm(value, String t, Span span) : super(value, t, span); EmTerm clone() => new EmTerm(value, text, span); - visit(VisitorBase visitor) => visitor.visitEmTerm(this); + void visit(VisitorBase visitor) => visitor.visitEmTerm(this); } class ExTerm extends LiteralTerm { ExTerm(value, String t, Span span) : super(value, t, span); ExTerm clone() => new ExTerm(value, text, span); - visit(VisitorBase visitor) => visitor.visitExTerm(this); + void visit(VisitorBase visitor) => visitor.visitExTerm(this); } class AngleTerm extends UnitTerm { @@ -975,7 +974,7 @@ class AngleTerm extends UnitTerm { } AngleTerm clone() => new AngleTerm(value, text, span, unit); - visit(VisitorBase visitor) => visitor.visitAngleTerm(this); + void visit(VisitorBase visitor) => visitor.visitAngleTerm(this); } class TimeTerm extends UnitTerm { @@ -987,7 +986,7 @@ class TimeTerm extends UnitTerm { } TimeTerm clone() => new TimeTerm(value, text, span, unit); - visit(VisitorBase visitor) => visitor.visitTimeTerm(this); + void visit(VisitorBase visitor) => visitor.visitTimeTerm(this); } class FreqTerm extends UnitTerm { @@ -997,21 +996,21 @@ class FreqTerm extends UnitTerm { } FreqTerm clone() => new FreqTerm(value, text, span, unit); - visit(VisitorBase visitor) => visitor.visitFreqTerm(this); + void visit(VisitorBase visitor) => visitor.visitFreqTerm(this); } class FractionTerm extends LiteralTerm { FractionTerm(var value, String t, Span span) : super(value, t, span); FractionTerm clone() => new FractionTerm(value, text, span); - visit(VisitorBase visitor) => visitor.visitFractionTerm(this); + void visit(VisitorBase visitor) => visitor.visitFractionTerm(this); } class UriTerm extends LiteralTerm { UriTerm(String value, Span span) : super(value, value, span); UriTerm clone() => new UriTerm(value, span); - visit(VisitorBase visitor) => visitor.visitUriTerm(this); + void visit(VisitorBase visitor) => visitor.visitUriTerm(this); } class ResolutionTerm extends UnitTerm { @@ -1023,7 +1022,7 @@ class ResolutionTerm extends UnitTerm { } ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); - visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); + void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); } class ChTerm extends UnitTerm { @@ -1033,7 +1032,7 @@ class ChTerm extends UnitTerm { } ChTerm clone() => new ChTerm(value, text, span, unit); - visit(VisitorBase visitor) => visitor.visitChTerm(this); + void visit(VisitorBase visitor) => visitor.visitChTerm(this); } class RemTerm extends UnitTerm { @@ -1043,7 +1042,7 @@ class RemTerm extends UnitTerm { } RemTerm clone() => new RemTerm(value, text, span, unit); - visit(VisitorBase visitor) => visitor.visitRemTerm(this); + void visit(VisitorBase visitor) => visitor.visitRemTerm(this); } class ViewportTerm extends UnitTerm { @@ -1056,7 +1055,7 @@ class ViewportTerm extends UnitTerm { } ViewportTerm clone() => new ViewportTerm(value, text, span, unit); - visit(VisitorBase visitor) => visitor.visitViewportTerm(this); + void visit(VisitorBase visitor) => visitor.visitViewportTerm(this); } /** Type to signal a bad hex value for HexColorTerm.value. */ @@ -1066,7 +1065,7 @@ class HexColorTerm extends LiteralTerm { HexColorTerm(var value, String t, Span span) : super(value, t, span); HexColorTerm clone() => new HexColorTerm(value, text, span); - visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); + void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); } class FunctionTerm extends LiteralTerm { @@ -1076,7 +1075,7 @@ class FunctionTerm extends LiteralTerm { : super(value, t, span); FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span); - visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); + void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); } /** @@ -1087,7 +1086,7 @@ class FunctionTerm extends LiteralTerm { class IE8Term extends LiteralTerm { IE8Term(Span span) : super('\\9', '\\9', span); IE8Term clone() => new IE8Term(span); - visit(VisitorBase visitor) => visitor.visitIE8Term(this); + void visit(VisitorBase visitor) => visitor.visitIE8Term(this); } class GroupTerm extends Expression { @@ -1100,14 +1099,14 @@ class GroupTerm extends Expression { } GroupTerm clone() => new GroupTerm(span); - visit(VisitorBase visitor) => visitor.visitGroupTerm(this); + void visit(VisitorBase visitor) => visitor.visitGroupTerm(this); } class ItemTerm extends NumberTerm { ItemTerm(var value, String t, Span span) : super(value, t, span); ItemTerm clone() => new ItemTerm(value, text, span); - visit(VisitorBase visitor) => visitor.visitItemTerm(this); + void visit(VisitorBase visitor) => visitor.visitItemTerm(this); } class Expressions extends Expression { @@ -1126,7 +1125,7 @@ class Expressions extends Expression { } return clonedExprs; } - visit(VisitorBase visitor) => visitor.visitExpressions(this); + void visit(VisitorBase visitor) => visitor.visitExpressions(this); } class BinaryExpression extends Expression { @@ -1138,7 +1137,7 @@ class BinaryExpression extends Expression { BinaryExpression clone() => new BinaryExpression(op, x.clone(), y.clone(), span); - visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); + void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); } class UnaryExpression extends Expression { @@ -1148,7 +1147,7 @@ class UnaryExpression extends Expression { UnaryExpression(this.op, this.self, Span span): super(span); UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); - visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); + void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); } abstract class DartStyleExpression extends TreeNode { @@ -1183,14 +1182,14 @@ abstract class DartStyleExpression extends TreeNode { bool isSame(DartStyleExpression other) => this._styleType == other._styleType; - visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); + void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); } class FontExpression extends DartStyleExpression { Font font; // font-style font-variant font-weight font-size/line-height font-family - FontExpression(Span span, {var size, Listfamily, + FontExpression(Span span, {dynamic size, Listfamily, int weight, String style, String variant, LineHeight lineHeight}) : super(DartStyleExpression.fontStyle, span) { // TODO(terry): Only px/pt for now need to handle all possible units to @@ -1224,7 +1223,7 @@ class FontExpression extends DartStyleExpression { weight: font.weight, style: font.style, variant: font.variant, lineHeight: font.lineHeight); - visit(VisitorBase visitor) => visitor.visitFontExpression(this); + void visit(VisitorBase visitor) => visitor.visitFontExpression(this); } abstract class BoxExpression extends DartStyleExpression { @@ -1240,7 +1239,7 @@ abstract class BoxExpression extends DartStyleExpression { */ merged(BoxExpression newDartExpr); - visit(VisitorBase visitor) => visitor.visitBoxExpression(this); + void visit(VisitorBase visitor) => visitor.visitBoxExpression(this); String get formattedBoxEdge { if (box.top == box.left && box.top == box.bottom && @@ -1288,7 +1287,7 @@ class MarginExpression extends BoxExpression { new MarginExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); - visit(VisitorBase visitor) => visitor.visitMarginExpression(this); + void visit(VisitorBase visitor) => visitor.visitMarginExpression(this); } class BorderExpression extends BoxExpression { @@ -1324,7 +1323,7 @@ class BorderExpression extends BoxExpression { new BorderExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); - visit(VisitorBase visitor) => visitor.visitBorderExpression(this); + void visit(VisitorBase visitor) => visitor.visitBorderExpression(this); } class HeightExpression extends DartStyleExpression { diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 29b955dcd..e61a06c90 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -9,14 +9,14 @@ part of csslib.visitor; */ abstract class TreeNode { /** The source code this [TreeNode] represents. */ - Span span; + final Span span; - TreeNode(this.span) {} + TreeNode(this.span); TreeNode clone(); /** Classic double-dispatch visitor for implementing passes. */ - visit(VisitorBase visitor); + void visit(VisitorBase visitor); /** A multiline string showing the node and its children. */ String toDebugString() { @@ -36,7 +36,7 @@ abstract class Expression extends TreeNode { class TreeOutput { int depth = 0; final StringBuffer buf = new StringBuffer(); - var printer; + VisitorBase printer; void write(String s) { for (int i=0; i < depth; i++) { @@ -77,7 +77,7 @@ class TreeOutput { writeln('${label}: ${v}'); } - void writeList(String label, List list) { + void writeList(String label, List list) { write('${label}: '); if (list == null) { buf.write('null'); @@ -91,7 +91,7 @@ class TreeOutput { } } - void writeNodeList(String label, List list) { + void writeNodeList(String label, List list) { writeln('${label} ['); if (list != null) { depth += 1; diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 3dc2afd56..8c394766f 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -7,7 +7,7 @@ part of csslib.visitor; // TODO(terry): Enable class for debug only; when conditional imports enabled. /** Helper function to dump the CSS AST. */ -String treeToDebugString(styleSheet, [bool useSpan = false]) { +String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) { var to = new TreeOutput(); new _TreePrinter(to, useSpan)..visitTree(styleSheet); return to.toString(); @@ -15,11 +15,11 @@ String treeToDebugString(styleSheet, [bool useSpan = false]) { /** Tree dump for debug output of the CSS AST. */ class _TreePrinter extends Visitor { - var output; + final TreeOutput output; final bool useSpan; _TreePrinter(this.output, this.useSpan) { output.printer = this; } - void visitTree(tree) => visitStylesheet(tree); + void visitTree(StyleSheet tree) => visitStylesheet(tree); void heading(String heading, node) { if (useSpan) { @@ -66,7 +66,7 @@ class _TreePrinter extends Visitor { } void visitMediaQueries(MediaQuery query) { - output.headeing('MediaQueries'); + output.heading('MediaQueries'); output.writeValue('unary', query.unary); output.writeValue('media type', query.mediaType); output.writeNodeList('media expressions', query.expressions); @@ -111,7 +111,7 @@ class _TreePrinter extends Visitor { heading('KeyFrameDirective', node); output.depth++; output.writeValue('keyframe', node.keyFrameName); - output.writeValue('name', node._name); + output.writeValue('name', node.name); output.writeNodeList('blocks', node._blocks); output.depth--; } @@ -244,7 +244,7 @@ class _TreePrinter extends Visitor { heading('Selector', node); output.depth++; output.writeNodeList('simpleSelectorsSequences', - node._simpleSelectorSequences); + node.simpleSelectorSequences); output.depth--; } diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index d2301d79d..d85c341f7 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -4,7 +4,6 @@ library csslib.src.validate; -import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; import 'package:source_maps/span.dart' show Span; diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 91fa71402..3b20a4ec1 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -180,7 +180,7 @@ class Visitor implements VisitorBase { } void visitKeyFrameDirective(KeyFrameDirective node) { - visitIdentifier(node._name); + visitIdentifier(node.name); _visitNodeList(node._blocks); } @@ -258,11 +258,11 @@ class Visitor implements VisitorBase { } void visitSelector(Selector node) { - _visitNodeList(node._simpleSelectorSequences); + _visitNodeList(node.simpleSelectorSequences); } void visitSimpleSelectorSequence(SimpleSelectorSequence node) { - var selector = node._selector; + var selector = node.simpleSelector; if (selector is NamespaceSelector) { visitNamespaceSelector(selector); } else if (selector is ElementSelector) { diff --git a/pkgs/csslib/test/debug_test.dart b/pkgs/csslib/test/debug_test.dart new file mode 100644 index 000000000..6cfea56a4 --- /dev/null +++ b/pkgs/csslib/test/debug_test.dart @@ -0,0 +1,30 @@ +library debug; + +import 'package:unittest/unittest.dart'; +import 'testing.dart'; + +void main() { + test("excercise debug", () { + var style = parseCss(_input); + + var debugValue = style.toDebugString(); + expect(debugValue, isNotNull); + + var style2 = style.clone(); + + expect(style2.toDebugString(), debugValue); + }); +} + +const String _input = r''' +.foo { +background-color: #191919; +width: 10PX; +height: 22mM !important; +border-width: 20cm; +margin-width: 33%; +border-height: 30EM; +width: .6in; +length: 1.2in; +-web-stuff: -10Px; +}'''; diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 3d6912cd0..fa14ed3f4 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -6,8 +6,6 @@ library declaration_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -import 'package:csslib/parser.dart'; -import 'package:csslib/visitor.dart'; /** CSS compiler options no checks in in memory style sheet. */ diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 98acffc3c..935c6188a 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -6,8 +6,6 @@ library error_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -import 'package:csslib/parser.dart'; -import 'package:csslib/visitor.dart'; import 'package:csslib/src/messages.dart'; /** diff --git a/pkgs/csslib/test/run_all.dart b/pkgs/csslib/test/run_all.dart index f57ff3eee..36020cd36 100644 --- a/pkgs/csslib/test/run_all.dart +++ b/pkgs/csslib/test/run_all.dart @@ -8,27 +8,28 @@ */ library run_impl; -import 'dart:io'; import 'package:unittest/compact_vm_config.dart'; import 'testing.dart'; +import 'big_1_test.dart' as big_1_test; import 'compiler_test.dart' as compiler_test; import 'declaration_test.dart' as declaration_test; -import 'var_test.dart' as var_test; -import 'nested_test.dart' as nested_test; +import 'debug_test.dart' as debug_test; import 'error_test.dart' as error_test; +import 'extend_test.dart' as extend_test; +import 'mixin_test.dart' as mixin_test; +import 'nested_test.dart' as nested_test; import 'selector_test.dart' as selector_test; +import 'var_test.dart' as var_test; import 'visitor_test.dart' as visitor_test; -import 'mixin_test.dart' as mixin_test; -import 'extend_test.dart' as extend_test; -import 'big_1_test.dart' as big_1_test; -main(List arguments) { +void main(List arguments) { var pattern = new RegExp(arguments.length > 0 ? arguments[0] : '.'); useCompactVMConfiguration(); useMockMessages(); + if (pattern.hasMatch('debug_test.dart')) debug_test.main(); if (pattern.hasMatch('compiler_test.dart')) compiler_test.main(); if (pattern.hasMatch('declaration_test.dart')) declaration_test.main(); if (pattern.hasMatch('var_test.dart')) var_test.main(); diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index ad015bb57..f87136eea 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -7,7 +7,6 @@ library selector_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; import 'package:csslib/parser.dart'; -import 'package:csslib/visitor.dart'; void testSelectorSuccesses() { var errors = []; diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index f15805cff..168a4e59b 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -9,7 +9,7 @@ import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; import 'package:csslib/src/messages.dart'; -useMockMessages() { +void useMockMessages() { messages = new Messages(printHandler: (message) {}); } @@ -37,10 +37,10 @@ StyleSheet polyFillCompileCss(input, {List errors, List opts}) => compileCss(input, errors: errors, polyfill: true, opts: opts); /** CSS emitter walks the style sheet tree and emits readable CSS. */ -var _emitCss = new CssPrinter(); +final _emitCss = new CssPrinter(); /** Simple Visitor does nothing but walk tree. */ -var _cssVisitor = new Visitor(); +final _cssVisitor = new Visitor(); /** Pretty printer for CSS. */ String prettyPrint(StyleSheet ss) { @@ -65,5 +65,3 @@ void walkTree(StyleSheet ss) { } String dumpTree(StyleSheet ss) => treeToDebugString(ss); - - diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index 7fcde970b..451b687cd 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -5,7 +5,6 @@ library visitor_test; import 'package:unittest/unittest.dart'; -import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; import 'testing.dart'; From 14297dbb375467c1df5934c2756b991885ea6fd1 Mon Sep 17 00:00:00 2001 From: "kevmoo@j832.com" Date: Thu, 7 Nov 2013 18:35:43 +0000 Subject: [PATCH 013/245] pkg/csslib: fix analyzer issue R=terry@google.com Review URL: https://codereview.chromium.org//64993002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@30062 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/src/tree_printer.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 8c394766f..3d381bde4 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -172,7 +172,8 @@ class _TreePrinter extends Visitor { */ void visitIncludeDirective(IncludeDirective node) { heading('IncludeDirective ${node.name}', node); - output.writeNodeList('parameters', node.args); + var flattened = node.args.expand((e) => e).toList(); + output.writeNodeList('parameters', flattened); } void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { From 86f3802465ae534ab8686a8aa0f7de9ef92f8477 Mon Sep 17 00:00:00 2001 From: "kevmoo@j832.com" Date: Wed, 20 Nov 2013 19:15:39 +0000 Subject: [PATCH 014/245] pkg/csslib: fixed analysis error, more cleanup R=terry@google.com Review URL: https://codereview.chromium.org//60983003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@30480 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/parser.dart | 128 +++++++------- pkgs/csslib/lib/src/analyzer.dart | 11 +- pkgs/csslib/lib/src/css_printer.dart | 8 +- pkgs/csslib/lib/src/messages.dart | 2 +- pkgs/csslib/lib/src/tree.dart | 240 +++++++++++++------------- pkgs/csslib/lib/src/tree_base.dart | 14 -- pkgs/csslib/lib/src/tree_printer.dart | 8 +- pkgs/csslib/lib/visitor.dart | 8 +- pkgs/csslib/test/testing.dart | 8 +- 9 files changed, 210 insertions(+), 217 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 92f16524e..840b9f239 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -30,7 +30,7 @@ class ParserState extends TokenizerState { : super(tokenizer); } -void _createMessages({List errors, List options}) { +void _createMessages({List errors, List options}) { if (errors == null) errors = []; if (options == null) { @@ -45,8 +45,11 @@ bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. /** Parse and analyze the CSS file. */ -StyleSheet compile(var input, {List errors, List options, bool nested: true, - bool polyfill: false, List includes: null}) { +StyleSheet compile(var input, {List errors, List options, + bool nested: true, + bool polyfill: false, + List includes: null}) { + if (includes == null) { includes = []; } @@ -70,7 +73,9 @@ StyleSheet compile(var input, {List errors, List options, bool nested: true, } /** Analyze the CSS file. */ -void analyze(List styleSheets, {List errors, List options}) { +void analyze(List styleSheets, + {List errors, List options}) { + _createMessages(errors: errors, options: options); new Analyzer(styleSheets, messages).run(); } @@ -80,7 +85,7 @@ void analyze(List styleSheets, {List errors, List options}) { * or [List] of bytes and returns a [StyleSheet] AST. The optional * [errors] list will contain each error/warning as a [Message]. */ -StyleSheet parse(var input, {List errors, List options}) { +StyleSheet parse(var input, {List errors, List options}) { var source = _inputAsString(input); _createMessages(errors: errors, options: options); @@ -95,7 +100,7 @@ StyleSheet parse(var input, {List errors, List options}) { * or [List] of bytes and returns a [StyleSheet] AST. The optional * [errors] list will contain each error/warning as a [Message]. */ -StyleSheet selector(var input, {List errors}) { +StyleSheet selector(var input, {List errors}) { var source = _inputAsString(input); _createMessages(errors: errors); @@ -150,7 +155,7 @@ class Parser { /** A simple recursive descent parser for CSS. */ class _Parser { - Tokenizer tokenizer; + final Tokenizer tokenizer; /** Base url of CSS file. */ final String _baseUrl; @@ -1184,9 +1189,9 @@ class _Parser { /** * Return list of selectors */ - processSelector() { - List simpleSequences = []; - int start = _peekToken.start; + Selector processSelector() { + var simpleSequences = []; + var start = _peekToken.start; while (true) { // First item is never descendant make sure it's COMBINATOR_NONE. var selectorItem = simpleSelectorSequence(simpleSequences.length == 0); @@ -1344,12 +1349,12 @@ class _Parser { */ simpleSelectorTail() { // Check for HASH | class | attrib | pseudo | negation - int start = _peekToken.start; + var start = _peekToken.start; switch (_peek()) { case TokenKind.HASH: _eat(TokenKind.HASH); - bool hasWhiteSpace = false; + var hasWhiteSpace = false; if (_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) { _warning("Not a valid ID selector expected #id", _makeSpan(start)); hasWhiteSpace = true; @@ -1395,7 +1400,7 @@ class _Parser { // :pseudo-class ::pseudo-element // TODO(terry): '::' should be token. _eat(TokenKind.COLON); - bool pseudoElement = _maybeEat(TokenKind.COLON); + var pseudoElement = _maybeEat(TokenKind.COLON); // TODO(terry): If no identifier specified consider optimizing out the // : or :: and making this a normal selector. For now, @@ -1456,7 +1461,7 @@ class _Parser { * NUMBER {num} */ processSelectorExpression() { - int start = _peekToken.start; + var start = _peekToken.start; var expression = new SelectorExpression(_makeSpan(start)); @@ -1467,7 +1472,7 @@ class _Parser { // operator not identifier. tokenizer.selectorExpression = true; - bool keepParsing = true; + var keepParsing = true; while (keepParsing) { switch (_peek()) { case TokenKind.PLUS: @@ -1539,8 +1544,8 @@ class _Parser { // SUBSTRMATCH: '*=' // // - processAttribute() { - int start = _peekToken.start; + AttributeSelector processAttribute() { + var start = _peekToken.start; if (_maybeEat(TokenKind.LBRACK)) { var attrName = identifier(); @@ -1593,7 +1598,7 @@ class _Parser { // *IDENT - IE7 or below // _IDENT - IE6 property (automatically a valid ident) // - processDeclaration(List dartStyles) { + Declaration processDeclaration(List dartStyles) { Declaration decl; int start = _peekToken.start; @@ -1637,7 +1642,7 @@ class _Parser { var include = processInclude(span, eatSemiColon: false); decl = new IncludeMixinAtDeclaration(include, span); } else if (_peekToken.kind == TokenKind.DIRECTIVE_EXTEND) { - List simpleSequences = []; + var simpleSequences = []; _next(); var span = _makeSpan(start); @@ -1730,14 +1735,11 @@ class _Parser { 'normal' : FontWeight.normal }; - static _findStyle(String styleName) { - if (_stylesToDart.containsKey(styleName)) { - return _stylesToDart[styleName]; - } - } + static int _findStyle(String styleName) => _stylesToDart[styleName]; - _styleForDart(Identifier property, Expressions exprs, List dartStyles) { - int styleType = _findStyle(property.name.toLowerCase()); + DartStyleExpression _styleForDart(Identifier property, Expressions exprs, + List dartStyles) { + var styleType = _findStyle(property.name.toLowerCase()); if (styleType != null) { return buildDartStyleNode(styleType, exprs, dartStyles); } @@ -1754,7 +1756,9 @@ class _Parser { return fontExpr; } - buildDartStyleNode(int styleType, Expressions exprs, List dartStyles) { + DartStyleExpression buildDartStyleNode(int styleType, Expressions exprs, + List dartStyles) { + switch (styleType) { /* * Properties in order: @@ -1897,7 +1901,7 @@ class _Parser { // TODO(terry): Look at handling width of thin, thick, etc. any none numbers // to convert to a number. - processOneNumber(Expressions exprs, int part) { + DartStyleExpression processOneNumber(Expressions exprs, int part) { var value = marginValue(exprs.expressions[0]); if (value != null) { switch (part) { @@ -1947,7 +1951,7 @@ class _Parser { * * The values of the margins can be a unit or unitless or auto. */ - processFourNums(Expressions exprs) { + BoxEdge processFourNums(Expressions exprs) { num top; num right; num bottom; @@ -2000,16 +2004,16 @@ class _Parser { // operator: '/' | ',' // term: (see processTerm) // - processExpr([bool ieFilter = false]) { - int start = _peekToken.start; - Expressions expressions = new Expressions(_makeSpan(start)); + Expressions processExpr([bool ieFilter = false]) { + var start = _peekToken.start; + var expressions = new Expressions(_makeSpan(start)); - bool keepGoing = true; + var keepGoing = true; var expr; while (keepGoing && (expr = processTerm(ieFilter)) != null) { var op; - int opStart = _peekToken.start; + var opStart = _peekToken.start; switch (_peek()) { case TokenKind.SLASH: @@ -2061,7 +2065,7 @@ class _Parser { return expressions; } - static int MAX_UNICODE = int.parse('0x10FFFF'); + static final int MAX_UNICODE = int.parse('0x10FFFF'); // Term grammar: // @@ -2085,7 +2089,7 @@ class _Parser { // function: IDENT '(' expr ')' // processTerm([bool ieFilter = false]) { - int start = _peekToken.start; + var start = _peekToken.start; Token t; // token for term's value var value; // value of term (numeric values) @@ -2193,8 +2197,8 @@ class _Parser { } // Yes, process the color as an RGB value. - String rgbColor = TokenKind.decimalToHex( - TokenKind.colorValue(colorEntry), 6); + var rgbColor = + TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6); return _parseHex(rgbColor, _makeSpan(start)); case TokenKind.UNICODE_RANGE: var first; @@ -2248,8 +2252,8 @@ class _Parser { } /** Process all dimension units. */ - processDimension(Token t, var value, Span span) { - var term; + LiteralTerm processDimension(Token t, var value, Span span) { + LiteralTerm term; var unitType = this._peek(); switch (unitType) { @@ -2328,11 +2332,11 @@ class _Parser { return term; } - processQuotedString([bool urlString = false]) { - int start = _peekToken.start; + String processQuotedString([bool urlString = false]) { + var start = _peekToken.start; // URI term sucks up everything inside of quotes(' or ") or between parens - int stopToken = urlString ? TokenKind.RPAREN : -1; + var stopToken = urlString ? TokenKind.RPAREN : -1; switch (_peek()) { case TokenKind.SINGLE_QUOTE: stopToken = TokenKind.SINGLE_QUOTE; @@ -2358,13 +2362,13 @@ class _Parser { } // Gobble up everything until we hit our stop token. - int runningStart = _peekToken.start; + var runningStart = _peekToken.start; while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) { var tok = _next(); } // All characters between quotes is the string. - int end = _peekToken.end; + var end = _peekToken.end; var stringValue = (_peekToken.span as FileSpan).file.getText(start, end - 1); @@ -2386,7 +2390,7 @@ class _Parser { * then parse to the right paren ignoring everything in between. */ processIEFilter(int startAfterProgidColon) { - int parens = 0; + var parens = 0; while (_peek() != TokenKind.END_OF_FILE) { switch (_peek()) { @@ -2413,14 +2417,14 @@ class _Parser { // function: IDENT '(' expr ')' // processFunction(Identifier func) { - int start = _peekToken.start; + var start = _peekToken.start; - String name = func.name; + var name = func.name; switch (name) { case 'url': // URI term sucks up everything inside of quotes(' or ") or between parens - String urlParam = processQuotedString(true); + var urlParam = processQuotedString(true); // TODO(terry): Better error messge and checking for mismatched quotes. if (_peek() == TokenKind.END_OF_FILE) { @@ -2470,7 +2474,7 @@ class _Parser { return null; } - identifier() { + Identifier identifier() { var tok = _next(); if (!TokenKind.isIdentifier(tok.kind) && @@ -2486,7 +2490,7 @@ class _Parser { // TODO(terry): Move this to base <= 36 and into shared code. static int _hexDigit(int c) { - if(c >= 48/*0*/ && c <= 57/*9*/) { + if (c >= 48/*0*/ && c <= 57/*9*/) { return c - 48; } else if (c >= 97/*a*/ && c <= 102/*f*/) { return c - 87; @@ -2498,9 +2502,9 @@ class _Parser { } HexColorTerm _parseHex(String hexText, Span span) { - int hexValue = 0; + var hexValue = 0; - for (int i = 0; i < hexText.length; i++) { + for (var i = 0; i < hexText.length; i++) { var digit = _hexDigit(hexText.codeUnitAt(i)); if (digit < 0) { _warning('Bad hex number', span); @@ -2535,7 +2539,7 @@ class ExpressionsProcessor { ExpressionsProcessor(this._exprs); // TODO(terry): Only handles ##px unit. - processFontSize() { + FontExpression processFontSize() { /* font-size[/line-height] * * Possible size values: @@ -2553,7 +2557,7 @@ class ExpressionsProcessor { */ LengthTerm size; LineHeight lineHt; - bool nextIsLineHeight = false; + var nextIsLineHeight = false; for (; _index < _exprs.expressions.length; _index++) { var expr = _exprs.expressions[_index]; if (size == null && expr is LengthTerm) { @@ -2580,14 +2584,14 @@ class ExpressionsProcessor { return new FontExpression(_exprs.span, size: size, lineHeight: lineHt); } - processFontFamily() { - final List family = []; + FontExpression processFontFamily() { + var family = []; /* Possible family values: * font-family: arial, Times new roman ,Lucida Sans Unicode,Courier; * font-family: "Times New Roman", arial, Lucida Sans Unicode, Courier; */ - bool moreFamilies = false; + var moreFamilies = false; for (; _index < _exprs.expressions.length; _index++) { Expression expr = _exprs.expressions[_index]; @@ -2609,8 +2613,8 @@ class ExpressionsProcessor { return new FontExpression(_exprs.span, family: family); } - processFont() { - var family; + FontExpression processFont() { + List family; // Process all parts of the font expression. FontExpression fontSize; @@ -2645,8 +2649,8 @@ String _escapeString(String text, {bool single: false}) { StringBuffer result = null; for (int i = 0; i < text.length; i++) { - int code = text.codeUnitAt(i); - var replace = null; + var code = text.codeUnitAt(i); + String replace = null; switch (code) { case 34/*'"'*/: if (!single) replace = r'\"'; break; case 39/*"'"*/: if (single) replace = r"\'"; break; diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index cd0c6fbb3..e0ec078e7 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -573,7 +573,7 @@ int _findInclude(List list, var node) { * parameters. */ class CallMixin extends Visitor { - var mixinDef; + final MixinDefinition mixinDef; List _definedArgs; Expressions _currExpressions; int _currIndex = -1; @@ -595,7 +595,7 @@ class CallMixin extends Visitor { * Given a mixin's defined arguments return a cloned mixin defintion that has * replaced all defined arguments with user's supplied VarUsages. */ - transform(List callArgs) { + MixinDefinition transform(List callArgs) { // TODO(terry): Handle default arguments and varArgs. // Transform mixin with callArgs. var index = 0; @@ -620,7 +620,6 @@ class CallMixin extends Visitor { } var expressions = varUsages[varDef.definedName]; - var expressionsLength = expressions.length; expressions.forEach((k, v) { for (var usagesIndex in v) { k.expressions.replaceRange(usagesIndex, usagesIndex + 1, callArg); @@ -724,7 +723,7 @@ class DeclarationIncludes extends Visitor { bool _allIncludes(rulesets) => rulesets.every((rule) => rule is IncludeDirective || rule is NoOp); - CallMixin _createCallDeclMixin(mixinDef) { + CallMixin _createCallDeclMixin(MixinDefinition mixinDef) { callMap.putIfAbsent(mixinDef.name, () => callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs)); return callMap[mixinDef.name]; @@ -968,8 +967,8 @@ class AllExtends extends Visitor { * Changes any selector that matches @extend. */ class InheritExtends extends Visitor { - Messages _messages; - AllExtends _allExtends; + final Messages _messages; + final AllExtends _allExtends; InheritExtends(this._messages, this._allExtends); diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 73c298451..9a80ee1aa 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -104,7 +104,7 @@ class CssPrinter extends Visitor { emit(' '); var declsMargin = node._declsMargin; - int declsMarginLength = declsMargin.length; + var declsMarginLength = declsMargin.length; for (var i = 0; i < declsMarginLength; i++) { if (i > 0) emit(_newLine); emit('{$_newLine'); @@ -161,7 +161,7 @@ class CssPrinter extends Visitor { } void visitStyletDirective(StyletDirective node) { - emit('/* @stylet export as ${node._dartClassName} */\n'); + emit('/* @stylet export as ${node.dartClassName} */\n'); } void visitNamespaceDirective(NamespaceDirective node) { @@ -224,7 +224,7 @@ class CssPrinter extends Visitor { } void visitDeclarationGroup(DeclarationGroup node) { - var declarations = node._declarations; + var declarations = node.declarations; var declarationsLength = declarations.length; for (var i = 0; i < declarationsLength; i++) { if (i > 0) emit(_newLine); @@ -338,7 +338,7 @@ class CssPrinter extends Visitor { } void visitSelectorExpression(SelectorExpression node) { - var expressions = node._expressions; + var expressions = node.expressions; var expressionsLength = expressions.length; for (var i = 0; i < expressionsLength; i++) { // Add space seperator between terms without an operator. diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 829b419a4..24964add6 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -68,7 +68,7 @@ class Message { } } -typedef void PrintHandler(Object obj); +typedef void PrintHandler(Message obj); /** * This class tracks and prints information, warnings, and errors emitted by the diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 941eb570b..f3c71ebcc 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -23,19 +23,25 @@ class Identifier extends TreeNode { class Wildcard extends TreeNode { Wildcard(Span span): super(span); Wildcard clone() => new Wildcard(span); - visit(VisitorBase visitor) => visitor.visitWildcard(this); + void visit(VisitorBase visitor) => visitor.visitWildcard(this); + + String get name => '*'; } class ThisOperator extends TreeNode { ThisOperator(Span span): super(span); ThisOperator clone() => new ThisOperator(span); - visit(VisitorBase visitor) => visitor.visitThisOperator(this); + void visit(VisitorBase visitor) => visitor.visitThisOperator(this); + + String get name => '&'; } class Negation extends TreeNode { Negation(Span span): super(span); Negation clone() => new Negation(span); - visit(VisitorBase visitor) => visitor.visitNegation(this); + void visit(VisitorBase visitor) => visitor.visitNegation(this); + + String get name => 'not'; } // /* .... */ @@ -44,14 +50,14 @@ class CssComment extends TreeNode { CssComment(this.comment, Span span): super(span); CssComment clone() => new CssComment(comment, span); - visit(VisitorBase visitor) => visitor.visitCssComment(this); + void visit(VisitorBase visitor) => visitor.visitCssComment(this); } // CDO/CDC (Comment Definition Open ). class CommentDefinition extends CssComment { CommentDefinition(String comment, Span span): super(comment, span); CommentDefinition clone() => new CommentDefinition(comment, span); - visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); + void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); } class SelectorGroup extends TreeNode { @@ -110,32 +116,33 @@ class SimpleSelectorSequence extends TreeNode { new SimpleSelectorSequence(simpleSelector, span, combinator); void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); + + String toString() => simpleSelector.name; } /* All other selectors (element, #id, .class, attribute, pseudo, negation, * namespace, *) are derived from this selector. */ -class SimpleSelector extends TreeNode { - final _name; // Wildcard, ThisOperator, Identifier, others? +abstract class SimpleSelector extends TreeNode { + final _name; // Wildcard, ThisOperator, Identifier, Negation, others? SimpleSelector(this._name, Span span) : super(span); - // Name can be an Identifier or WildCard we'll return either the name or '*'. - String get name => isWildcard ? '*' : isThis ? '&' : _name.name; + String get name => _name.name; bool get isWildcard => _name is Wildcard; bool get isThis => _name is ThisOperator; - SimpleSelector clone() => new SimpleSelector(_name, span); - void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); } // element name class ElementSelector extends SimpleSelector { ElementSelector(name, Span span) : super(name, span); - visit(VisitorBase visitor) => visitor.visitElementSelector(this); + void visit(VisitorBase visitor) => visitor.visitElementSelector(this); + + ElementSelector clone() => new ElementSelector(_name, span); String toString() => name; } @@ -155,7 +162,7 @@ class NamespaceSelector extends SimpleSelector { NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span); - visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); + void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); String toString() => "$namespace|${nameAsSimpleSelector.name}"; } @@ -219,7 +226,7 @@ class AttributeSelector extends SimpleSelector { AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span); - visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); + void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); String toString() => "[$name${matchOperator()}${valueToString()}]"; } @@ -228,7 +235,7 @@ class AttributeSelector extends SimpleSelector { class IdSelector extends SimpleSelector { IdSelector(Identifier name, Span span) : super(name, span); IdSelector clone() => new IdSelector(_name, span); - visit(VisitorBase visitor) => visitor.visitIdSelector(this); + void visit(VisitorBase visitor) => visitor.visitIdSelector(this); String toString() => "#$_name"; } @@ -237,7 +244,7 @@ class IdSelector extends SimpleSelector { class ClassSelector extends SimpleSelector { ClassSelector(Identifier name, Span span) : super(name, span); ClassSelector clone() => new ClassSelector(_name, span); - visit(VisitorBase visitor) => visitor.visitClassSelector(this); + void visit(VisitorBase visitor) => visitor.visitClassSelector(this); String toString() => ".$_name"; } @@ -245,7 +252,9 @@ class ClassSelector extends SimpleSelector { // :pseudoClass class PseudoClassSelector extends SimpleSelector { PseudoClassSelector(Identifier name, Span span) : super(name, span); - visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); + void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); + + PseudoClassSelector clone() => new PseudoClassSelector(_name, span); String toString() => ":$name"; } @@ -253,59 +262,64 @@ class PseudoClassSelector extends SimpleSelector { // ::pseudoElement class PseudoElementSelector extends SimpleSelector { PseudoElementSelector(Identifier name, Span span) : super(name, span); - visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); + void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); + + PseudoElementSelector clone() => new PseudoElementSelector(_name, span); String toString() => "::$name"; } // :pseudoClassFunction(expression) class PseudoClassFunctionSelector extends PseudoClassSelector { - SelectorExpression expression; + final SelectorExpression expression; PseudoClassFunctionSelector(Identifier name, this.expression, Span span) : super(name, span); + PseudoClassFunctionSelector clone() => new PseudoClassFunctionSelector(_name, expression, span); - visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); + + void visit(VisitorBase visitor) => + visitor.visitPseudoClassFunctionSelector(this); } // ::pseudoElementFunction(expression) class PseudoElementFunctionSelector extends PseudoElementSelector { - SelectorExpression expression; + final SelectorExpression expression; PseudoElementFunctionSelector(Identifier name, this.expression, Span span) : super(name, span); + PseudoElementFunctionSelector clone() => new PseudoElementFunctionSelector(_name, expression, span); - visit(VisitorBase visitor) => + + void visit(VisitorBase visitor) => visitor.visitPseudoElementFunctionSelector(this); } class SelectorExpression extends TreeNode { - final List _expressions = []; + final List expressions = []; SelectorExpression(Span span): super(span); - add(Expression expression) { - _expressions.add(expression); + void add(Expression expression) { + expressions.add(expression); } - List get expressions => _expressions; - SelectorExpression clone() { var selectorExpr = new SelectorExpression(span); - for (var expr in _expressions) { + for (var expr in expressions) { selectorExpr.add(expr.clone()); } return selectorExpr; } - visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); + void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); } // :NOT(negation_arg) class NegationSelector extends SimpleSelector { - SimpleSelector negationArg; + final SimpleSelector negationArg; NegationSelector(this.negationArg, Span span) : super(new Negation(span), span); @@ -320,7 +334,7 @@ class NoOp extends TreeNode { NoOp clone() => new NoOp(); - visit(VisitorBase visitor) => visitor.visitNoOp(this); + void visit(VisitorBase visitor) => visitor.visitNoOp(this); } class StyleSheet extends TreeNode { @@ -349,7 +363,7 @@ class StyleSheet extends TreeNode { class TopLevelProduction extends TreeNode { TopLevelProduction(Span span) : super(span); TopLevelProduction clone() => new TopLevelProduction(span); - visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); + void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); } class RuleSet extends TopLevelProduction { @@ -367,7 +381,7 @@ class RuleSet extends TopLevelProduction { return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); } - visit(VisitorBase visitor) => visitor.visitRuleSet(this); + void visit(VisitorBase visitor) => visitor.visitRuleSet(this); } class Directive extends TreeNode { @@ -456,7 +470,7 @@ class MediaQuery extends TreeNode { } return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); } - visit(VisitorBase visitor) => visitor.visitMediaQuery(this); + void visit(VisitorBase visitor) => visitor.visitMediaQuery(this); } class MediaDirective extends Directive { @@ -585,24 +599,22 @@ class FontFaceDirective extends Directive { } class StyletDirective extends Directive { - final String _dartClassName; - final List _rulesets; + final String dartClassName; + final List rulesets; - StyletDirective(this._dartClassName, this._rulesets, Span span) : super(span); + StyletDirective(this.dartClassName, this.rulesets, Span span) : super(span); bool get isBuiltIn => false; bool get isExtension => true; - String get dartClassName => _dartClassName; - List get rulesets => _rulesets; - StyletDirective clone() { var cloneRulesets = []; - for (var ruleset in _rulesets) { + for (var ruleset in rulesets) { cloneRulesets.add(ruleset.clone()); } - return new StyletDirective(_dartClassName, cloneRulesets, span); + return new StyletDirective(dartClassName, cloneRulesets, span); } + void visit(VisitorBase visitor) => visitor.visitStyletDirective(this); } @@ -616,6 +628,7 @@ class NamespaceDirective extends Directive { NamespaceDirective(this._prefix, this._uri, Span span) : super(span); NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); + void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; @@ -629,6 +642,7 @@ class VarDefinitionDirective extends Directive { VarDefinitionDirective clone() => new VarDefinitionDirective(def.clone(), span); + void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); } @@ -647,6 +661,7 @@ class MixinDefinition extends Directive { } return new MixinDefinition(name, cloneDefinedArgs, varArgs, span); } + void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); } @@ -670,6 +685,7 @@ class MixinRulesetDirective extends MixinDefinition { return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets, span); } + void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); } @@ -679,6 +695,7 @@ class MixinDeclarationDirective extends MixinDefinition { MixinDeclarationDirective(String name, List args, bool varArgs, this.declarations, Span span) : super(name, args, varArgs, span); + MixinDeclarationDirective clone() { var clonedArgs = []; for (var arg in definedArgs) { @@ -687,6 +704,7 @@ class MixinDeclarationDirective extends MixinDefinition { return new MixinDeclarationDirective(name, clonedArgs, varArgs, declarations.clone(), span); } + void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); } @@ -721,7 +739,7 @@ class Declaration extends TreeNode { final Identifier _property; final Expression _expression; /** Style exposed to Dart. */ - dynamic _dart; + dynamic dartStyle; final bool important; /** @@ -734,21 +752,17 @@ class Declaration extends TreeNode { */ final bool isIE7; - Declaration(this._property, this._expression, this._dart, Span span, + Declaration(this._property, this._expression, this.dartStyle, Span span, {important: false, ie7: false}) : this.important = important, this.isIE7 = ie7, super(span); String get property => isIE7 ? '*${_property.name}' : _property.name; Expression get expression => _expression; - bool get hasDartStyle => _dart != null; - get dartStyle => _dart; - set dartStyle(dStyle) { - _dart = dStyle; - } + bool get hasDartStyle => dartStyle != null; Declaration clone() => - new Declaration(_property.clone(), _expression.clone(), _dart, span, + new Declaration(_property.clone(), _expression.clone(), dartStyle, span, important: important); void visit(VisitorBase visitor) => visitor.visitDeclaration(this); @@ -768,11 +782,10 @@ class VarDefinition extends Declaration { String get definedName => _property.name; - set dartStyle(dStyle) { } - VarDefinition clone() => new VarDefinition(_property.clone(), expression != null ? expression.clone() : null, span); + void visit(VisitorBase visitor) => visitor.visitVarDefinition(this); } @@ -797,16 +810,13 @@ class IncludeMixinAtDeclaration extends Declaration { } class ExtendDeclaration extends Declaration { - List selectors; + final List selectors; ExtendDeclaration(this.selectors, Span span) : super(null, null, null, span); ExtendDeclaration clone() { - List newSelector = []; - for (var selectorSeq in selectors) { - newSelector.add(selectorSeq.clone()); - } + var newSelector = selectors.map((s) => s.clone()).toList(); return new ExtendDeclaration(newSelector, span); } @@ -815,17 +825,12 @@ class ExtendDeclaration extends Declaration { class DeclarationGroup extends TreeNode { /** Can be either Declaration or RuleSet (if nested selector). */ - final List _declarations; - - DeclarationGroup(this._declarations, Span span) : super(span); + final List declarations; - List get declarations => _declarations; + DeclarationGroup(this.declarations, Span span) : super(span); DeclarationGroup clone() { - var clonedDecls = []; - for (var decl in _declarations) { - clonedDecls.add(decl.clone()); - } + var clonedDecls = declarations.map((d) => d.clone()).toList(); return new DeclarationGroup(clonedDecls, span); } @@ -917,17 +922,15 @@ class NumberTerm extends LiteralTerm { } class UnitTerm extends LiteralTerm { - final int _unit; - - UnitTerm(value, String t, Span span, this._unit) : super(value, t, span); + final int unit; - int get unit => _unit; + UnitTerm(value, String t, Span span, this.unit) : super(value, t, span); - UnitTerm clone() => new UnitTerm(value, text, span, _unit); + UnitTerm clone() => new UnitTerm(value, text, span, unit); void visit(VisitorBase visitor) => visitor.visitUnitTerm(this); - String unitToString() => TokenKind.unitToString(_unit); + String unitToString() => TokenKind.unitToString(unit); String toString() => '$text${unitToString()}'; } @@ -935,14 +938,14 @@ class UnitTerm extends LiteralTerm { class LengthTerm extends UnitTerm { LengthTerm(value, String t, Span span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { - assert(this._unit == TokenKind.UNIT_LENGTH_PX || - this._unit == TokenKind.UNIT_LENGTH_CM || - this._unit == TokenKind.UNIT_LENGTH_MM || - this._unit == TokenKind.UNIT_LENGTH_IN || - this._unit == TokenKind.UNIT_LENGTH_PT || - this._unit == TokenKind.UNIT_LENGTH_PC); + assert(this.unit == TokenKind.UNIT_LENGTH_PX || + this.unit == TokenKind.UNIT_LENGTH_CM || + this.unit == TokenKind.UNIT_LENGTH_MM || + this.unit == TokenKind.UNIT_LENGTH_IN || + this.unit == TokenKind.UNIT_LENGTH_PT || + this.unit == TokenKind.UNIT_LENGTH_PC); } - LengthTerm clone() => new LengthTerm(value, text, span, _unit); + LengthTerm clone() => new LengthTerm(value, text, span, unit); void visit(VisitorBase visitor) => visitor.visitLengthTerm(this); } @@ -967,10 +970,10 @@ class ExTerm extends LiteralTerm { class AngleTerm extends UnitTerm { AngleTerm(var value, String t, Span span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { - assert(this._unit == TokenKind.UNIT_ANGLE_DEG || - this._unit == TokenKind.UNIT_ANGLE_RAD || - this._unit == TokenKind.UNIT_ANGLE_GRAD || - this._unit == TokenKind.UNIT_ANGLE_TURN); + assert(this.unit == TokenKind.UNIT_ANGLE_DEG || + this.unit == TokenKind.UNIT_ANGLE_RAD || + this.unit == TokenKind.UNIT_ANGLE_GRAD || + this.unit == TokenKind.UNIT_ANGLE_TURN); } AngleTerm clone() => new AngleTerm(value, text, span, unit); @@ -980,9 +983,9 @@ class AngleTerm extends UnitTerm { class TimeTerm extends UnitTerm { TimeTerm(var value, String t, Span span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { - assert(this._unit == TokenKind.UNIT_ANGLE_DEG || - this._unit == TokenKind.UNIT_TIME_MS || - this._unit == TokenKind.UNIT_TIME_S); + assert(this.unit == TokenKind.UNIT_ANGLE_DEG || + this.unit == TokenKind.UNIT_TIME_MS || + this.unit == TokenKind.UNIT_TIME_S); } TimeTerm clone() => new TimeTerm(value, text, span, unit); @@ -992,7 +995,7 @@ class TimeTerm extends UnitTerm { class FreqTerm extends UnitTerm { FreqTerm(var value, String t, Span span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { - assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ); + assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); } FreqTerm clone() => new FreqTerm(value, text, span, unit); @@ -1016,9 +1019,9 @@ class UriTerm extends LiteralTerm { class ResolutionTerm extends UnitTerm { ResolutionTerm(var value, String t, Span span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { - assert(_unit == TokenKind.UNIT_RESOLUTION_DPI || - _unit == TokenKind.UNIT_RESOLUTION_DPCM || - _unit == TokenKind.UNIT_RESOLUTION_DPPX); + assert(unit == TokenKind.UNIT_RESOLUTION_DPI || + unit == TokenKind.UNIT_RESOLUTION_DPCM || + unit == TokenKind.UNIT_RESOLUTION_DPPX); } ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); @@ -1028,7 +1031,7 @@ class ResolutionTerm extends UnitTerm { class ChTerm extends UnitTerm { ChTerm(var value, String t, Span span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { - assert(_unit == TokenKind.UNIT_CH); + assert(unit == TokenKind.UNIT_CH); } ChTerm clone() => new ChTerm(value, text, span, unit); @@ -1038,7 +1041,7 @@ class ChTerm extends UnitTerm { class RemTerm extends UnitTerm { RemTerm(var value, String t, Span span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { - assert(_unit == TokenKind.UNIT_REM); + assert(unit == TokenKind.UNIT_REM); } RemTerm clone() => new RemTerm(value, text, span, unit); @@ -1048,10 +1051,10 @@ class RemTerm extends UnitTerm { class ViewportTerm extends UnitTerm { ViewportTerm(var value, String t, Span span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { - assert(_unit == TokenKind.UNIT_VIEWPORT_VW || - _unit == TokenKind.UNIT_VIEWPORT_VH || - _unit == TokenKind.UNIT_VIEWPORT_VMIN || - _unit == TokenKind.UNIT_VIEWPORT_VMAX); + assert(unit == TokenKind.UNIT_VIEWPORT_VW || + unit == TokenKind.UNIT_VIEWPORT_VH || + unit == TokenKind.UNIT_VIEWPORT_VMIN || + unit == TokenKind.UNIT_VIEWPORT_VMAX); } ViewportTerm clone() => new ViewportTerm(value, text, span, unit); @@ -1094,7 +1097,7 @@ class GroupTerm extends Expression { GroupTerm(Span span) : _terms = [], super(span); - add(LiteralTerm term) { + void add(LiteralTerm term) { _terms.add(term); } @@ -1114,7 +1117,7 @@ class Expressions extends Expression { Expressions(Span span): super(span); - add(Expression expression) { + void add(Expression expression) { expressions.add(expression); } @@ -1151,13 +1154,13 @@ class UnaryExpression extends Expression { } abstract class DartStyleExpression extends TreeNode { - static final int unknownType = 0; - static final int fontStyle = 1; - static final int marginStyle = 2; - static final int borderStyle = 3; - static final int paddingStyle = 4; - static final int heightStyle = 5; - static final int widthStyle = 6; + static const int unknownType = 0; + static const int fontStyle = 1; + static const int marginStyle = 2; + static const int borderStyle = 3; + static const int paddingStyle = 4; + static const int heightStyle = 5; + static const int widthStyle = 6; final int _styleType; int priority; @@ -1186,20 +1189,19 @@ abstract class DartStyleExpression extends TreeNode { } class FontExpression extends DartStyleExpression { - Font font; + final Font font; // font-style font-variant font-weight font-size/line-height font-family - FontExpression(Span span, {dynamic size, Listfamily, - int weight, String style, String variant, LineHeight lineHeight}) - : super(DartStyleExpression.fontStyle, span) { - // TODO(terry): Only px/pt for now need to handle all possible units to - // support calc expressions on units. - font = new Font(size : size is LengthTerm ? size.value : size, - family: family, weight: weight, style: style, variant: variant, - lineHeight: lineHeight); - } - - merged(FontExpression newFontExpr) { + // TODO(terry): Only px/pt for now need to handle all possible units to + // support calc expressions on units. + FontExpression(Span span, {dynamic size, List family, + int weight, String style, String variant, LineHeight lineHeight}) : + font = new Font(size : size is LengthTerm ? size.value : size, + family: family, weight: weight, style: style, variant: variant, + lineHeight: lineHeight), + super(DartStyleExpression.fontStyle, span); + + FontExpression merged(FontExpression newFontExpr) { if (this.isFont && newFontExpr.isFont) { return new FontExpression.merge(this, newFontExpr); } @@ -1341,7 +1343,7 @@ class HeightExpression extends DartStyleExpression { } HeightExpression clone() => new HeightExpression(span, height); - visit(VisitorBase visitor) => visitor.visitHeightExpression(this); + void visit(VisitorBase visitor) => visitor.visitHeightExpression(this); } class WidthExpression extends DartStyleExpression { @@ -1359,7 +1361,7 @@ class WidthExpression extends DartStyleExpression { } WidthExpression clone() => new WidthExpression(span, width); - visit(VisitorBase visitor) => visitor.visitWidthExpression(this); + void visit(VisitorBase visitor) => visitor.visitWidthExpression(this); } class PaddingExpression extends BoxExpression { @@ -1393,5 +1395,5 @@ class PaddingExpression extends BoxExpression { PaddingExpression clone() => new PaddingExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); - visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); + void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); } diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index e61a06c90..6dc27b18e 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -77,20 +77,6 @@ class TreeOutput { writeln('${label}: ${v}'); } - void writeList(String label, List list) { - write('${label}: '); - if (list == null) { - buf.write('null'); - buf.write('\n'); - } else { - for (var item in list) { - buf.write(item.toString()); - buf.write(', '); - } - buf.write('\n'); - } - } - void writeNodeList(String label, List list) { writeln('${label} ['); if (list != null) { diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 3d381bde4..3a8b74821 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -129,9 +129,9 @@ class _TreePrinter extends Visitor { void visitStyletDirective(StyletDirective node) { heading('StyletDirective', node); - output.writeValue('dartClassName', node._dartClassName); + output.writeValue('dartClassName', node.dartClassName); output.depth++; - output.writeNodeList('rulesets', node._rulesets); + output.writeNodeList('rulesets', node.rulesets); output.depth--; } @@ -200,7 +200,7 @@ class _TreePrinter extends Visitor { void visitDeclarationGroup(DeclarationGroup node) { heading('DeclarationGroup', node); output.depth++; - output.writeNodeList('declarations', node._declarations); + output.writeNodeList('declarations', node.declarations); output.depth--; } @@ -208,7 +208,7 @@ class _TreePrinter extends Visitor { heading('MarginGroup', node); output.depth++; output.writeValue('@directive', node.margin_sym); - output.writeNodeList('declarations', node._declarations); + output.writeNodeList('declarations', node.declarations); output.depth--; } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 3b20a4ec1..6c009ff01 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -111,7 +111,7 @@ abstract class VisitorBase { /** Base vistor class for the style sheet AST. */ class Visitor implements VisitorBase { /** Helper function to walk a list of nodes. */ - void _visitNodeList(list) { + void _visitNodeList(List list) { // Don't use iterable otherwise the list can't grow while using Visitor. // It certainly can't have items deleted before the index being iterated // but items could be added after the index. @@ -194,7 +194,7 @@ class Visitor implements VisitorBase { } void visitStyletDirective(StyletDirective node) { - _visitNodeList(node._rulesets); + _visitNodeList(node.rulesets); } void visitNamespaceDirective(NamespaceDirective node) { } @@ -230,7 +230,7 @@ class Visitor implements VisitorBase { } void visitDeclarationGroup(DeclarationGroup node) { - _visitNodeList(node._declarations); + _visitNodeList(node.declarations); } void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); @@ -329,7 +329,7 @@ class Visitor implements VisitorBase { visitSimpleSelector(node); void visitSelectorExpression(SelectorExpression node) { - _visitNodeList(node._expressions); + _visitNodeList(node.expressions); } void visitUnicodeRangeTerm(UnicodeRangeTerm node) { } diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 168a4e59b..002c45247 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -18,7 +18,8 @@ void useMockMessages() { * CSS will allow any property/value pairs regardless of validity; all of our * tests (by default) will ensure that the CSS is really valid. */ -StyleSheet parseCss(String cssInput, {List errors, List opts}) => +StyleSheet parseCss(String cssInput, {List errors, + List opts}) => parse(cssInput, errors: errors, options: opts == null ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts); @@ -27,13 +28,14 @@ StyleSheet parseCss(String cssInput, {List errors, List opts}) => * CSS will allow any property/value pairs regardless of validity; all of our * tests (by default) will ensure that the CSS is really valid. */ -StyleSheet compileCss(String cssInput, {List errors, List opts, +StyleSheet compileCss(String cssInput, {List errors, List opts, bool polyfill: false, List includes: null}) => compile(cssInput, errors: errors, options: opts == null ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts, polyfill: polyfill, includes: includes); -StyleSheet polyFillCompileCss(input, {List errors, List opts}) => +StyleSheet polyFillCompileCss(input, {List errors, + List opts}) => compileCss(input, errors: errors, polyfill: true, opts: opts); /** CSS emitter walks the style sheet tree and emits readable CSS. */ From 575c3e0f9643f7dbc401cbe5117cc2c58ae670c2 Mon Sep 17 00:00:00 2001 From: "nweiz@google.com" Date: Tue, 10 Dec 2013 00:24:01 +0000 Subject: [PATCH 015/245] Make pkg/path 1.0.0 and upgrade dependencies appropriately. All existing packages that use pkg/path (other than pkg/stack_trace, which has already been updated) are compatible with both the pre-1.0 and post-1.0 path API, so I've marked their version constraints as ">=0.9.0 <2.0.0". I've also incremented their patch versions and I intend to release new versions as soon as this CL lands. R=alanknight@google.com, efortuna@google.com, jmesserly@google.com, rnystrom@google.com, scheglov@google.com Review URL: https://codereview.chromium.org//110873002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@31005 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index a995672e4..cbc30371d 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,12 +1,12 @@ name: csslib -version: 0.9.0 +version: 0.9.1 author: "Web UI Team " description: A library for parsing CSS. homepage: https://www.dartlang.org dependencies: args: ">=0.9.0 <0.10.0" logging: ">=0.9.0 <0.10.0" - path: ">=0.9.0 <0.10.0" + path: ">=0.9.0 <2.0.0" source_maps: ">=0.9.0 <0.10.0" dev_dependencies: browser: ">=0.9.0 <0.10.0" From ab08b9985abaae7ec3a85f8939f5e08da0f60927 Mon Sep 17 00:00:00 2001 From: "sigmund@google.com" Date: Tue, 10 Dec 2013 17:50:10 +0000 Subject: [PATCH 016/245] Add license file to csslib so we can upload directly from the bleeding_edge directory. R=terry@google.com Review URL: https://codereview.chromium.org//111903003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@31030 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/LICENSE | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 pkgs/csslib/LICENSE diff --git a/pkgs/csslib/LICENSE b/pkgs/csslib/LICENSE new file mode 100644 index 000000000..ee9993031 --- /dev/null +++ b/pkgs/csslib/LICENSE @@ -0,0 +1,26 @@ +Copyright 2013, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 2580e72030839e1061c755d082f3e16b7f1e38f2 Mon Sep 17 00:00:00 2001 From: "jmesserly@google.com" Date: Wed, 11 Dec 2013 01:41:02 +0000 Subject: [PATCH 017/245] update pubspecs for pkg uploading R=sigmund@google.com Review URL: https://codereview.chromium.org//112283002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@31053 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index cbc30371d..8ec942130 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,6 +1,6 @@ name: csslib version: 0.9.1 -author: "Web UI Team " +author: "Polymer.dart Team " description: A library for parsing CSS. homepage: https://www.dartlang.org dependencies: @@ -12,4 +12,4 @@ dev_dependencies: browser: ">=0.9.0 <0.10.0" unittest: ">=0.9.0 <0.10.0" environment: - sdk: ">=0.8.10+6 <2.0.0" + sdk: ">=1.0.0 <2.0.0" From 144c6bb7176cee4a9a27b5203a6480f481b4cad6 Mon Sep 17 00:00:00 2001 From: "terry@google.com" Date: Tue, 7 Jan 2014 21:32:07 +0000 Subject: [PATCH 018/245] Fixed single quote escaping BUG= R=sigmund@google.com Review URL: https://codereview.chromium.org//126063003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@31578 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/parser.dart | 6 ++++++ pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/compiler_test.dart | 2 +- pkgs/csslib/test/declaration_test.dart | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 840b9f239..ba8cd1360 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1494,6 +1494,9 @@ class _Parser { value = double.parse(termToken.text); break; case TokenKind.SINGLE_QUOTE: + value = processQuotedString(false); + value = "'${_escapeString(value, single: true)}'"; + return new LiteralTerm(value, value, _makeSpan(start)); case TokenKind.DOUBLE_QUOTE: value = processQuotedString(false); value = '"${_escapeString(value)}"'; @@ -2129,6 +2132,9 @@ class _Parser { value = double.parse("${unary}${t.text}"); break; case TokenKind.SINGLE_QUOTE: + value = processQuotedString(false); + value = "'${_escapeString(value, single: true)}'"; + return new LiteralTerm(value, value, _makeSpan(start)); case TokenKind.DOUBLE_QUOTE: value = processQuotedString(false); value = '"${_escapeString(value)}"'; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 8ec942130..27622316e 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.9.1 +version: 0.9.2 author: "Polymer.dart Team " description: A library for parsing CSS. homepage: https://www.dartlang.org diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index f545a6d30..8d63f8b8d 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -591,7 +591,7 @@ div:nth-child(2n) { color : red; } expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), r''' html:lang(fr-ca) { - quotes: "\" " " \""; + quotes: '" ' ' "'; } zoom { } diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index fa14ed3f4..ce46f5d02 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -258,7 +258,7 @@ void testUnicode() { final String generated = r''' .toggle:after { - content: "✔"; + content: '✔'; line-height: 43px; font-size: 20px; color: #d9d9d9; From 0c1e8b1b6872e42f9cca21ab124f8fe9cdebad62 Mon Sep 17 00:00:00 2001 From: "kevmoo@google.com" Date: Sun, 19 Jan 2014 19:24:06 +0000 Subject: [PATCH 019/245] use proper notation for true, false, and null in doc comments BUG= https://code.google.com/p/dart/issues/detail?id=16193 R=lrn@google.com Review URL: https://codereview.chromium.org//140783013 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@31947 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/parser.dart | 2 +- pkgs/csslib/lib/src/analyzer.dart | 2 +- pkgs/csslib/lib/src/tokenkind.dart | 2 +- pkgs/csslib/pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index ba8cd1360..2539d94de 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1002,7 +1002,7 @@ class _Parser { * color: red; * } * - * Return [null] if no selector or [SelectorGroup] if a selector was parsed. + * Return [:null:] if no selector or [SelectorGroup] if a selector was parsed. */ SelectorGroup _nestedSelector() { Messages oldMessages = messages; diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index e0ec078e7..6758a2d66 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -175,7 +175,7 @@ class Analyzer { * expanded. */ class ExpandNestedSelectors extends Visitor { - /** Parent [RuleSet] if a nested rule otherwise [null]. */ + /** Parent [RuleSet] if a nested rule otherwise [:null:]. */ RuleSet _parentRuleSet; /** Top-most rule if nested rules. */ diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index b9d4309cd..091bdb7fe 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -583,7 +583,7 @@ class TokenKind { /** * Match color name, case insensitive match and return the associated color - * entry from _EXTENDED_COLOR_NAMES list, return [null] if not found. + * entry from _EXTENDED_COLOR_NAMES list, return [:null:] if not found. */ static Map matchColorName(String text) { var name = text.toLowerCase(); diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 27622316e..44dcebf19 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.9.2 +version: 0.9.2-dev+1 author: "Polymer.dart Team " description: A library for parsing CSS. homepage: https://www.dartlang.org From 9f9b6f84f0e6f0dadebde85464601845c40edcf5 Mon Sep 17 00:00:00 2001 From: "kevmoo@google.com" Date: Fri, 28 Mar 2014 19:28:33 +0000 Subject: [PATCH 020/245] pkg/csslib: fixed args dependency, drastically simplified pkg.status Prepped v0.9.2+1 R=terry@google.com Review URL: https://codereview.chromium.org//216893004 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@34516 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 44dcebf19..295ff3fb7 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,15 +1,15 @@ name: csslib -version: 0.9.2-dev+1 -author: "Polymer.dart Team " +version: 0.9.2+1 +author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org +environment: + sdk: '>=1.0.0 <2.0.0' dependencies: - args: ">=0.9.0 <0.10.0" - logging: ">=0.9.0 <0.10.0" - path: ">=0.9.0 <2.0.0" - source_maps: ">=0.9.0 <0.10.0" + args: '>=0.9.0 <0.11.0' + logging: '>=0.9.0 <0.10.0' + path: '>=0.9.0 <2.0.0' + source_maps: '>=0.9.0 <0.10.0' dev_dependencies: - browser: ">=0.9.0 <0.10.0" - unittest: ">=0.9.0 <0.10.0" -environment: - sdk: ">=1.0.0 <2.0.0" + browser: '>=0.9.0 <0.10.0' + unittest: '>=0.9.0 <0.10.0' From 63ea5755c9fbd28a6691a28adf0e137bd09bb267 Mon Sep 17 00:00:00 2001 From: "rnystrom@google.com" Date: Tue, 6 May 2014 23:25:59 +0000 Subject: [PATCH 021/245] Move allowTrailingOptions into ArgParser. R=brianwilkerson@google.com, jmesserly@google.com, nweiz@google.com Review URL: https://codereview.chromium.org//260963007 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@35837 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 295ff3fb7..81ddfd9b6 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,12 +1,12 @@ name: csslib -version: 0.9.2+1 +version: 0.9.3-dev author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org environment: sdk: '>=1.0.0 <2.0.0' dependencies: - args: '>=0.9.0 <0.11.0' + args: '>=0.9.0 <0.12.0' logging: '>=0.9.0 <0.10.0' path: '>=0.9.0 <2.0.0' source_maps: '>=0.9.0 <0.10.0' From bcdc56a34512bb5297b4cc431f29acbb48ccd36d Mon Sep 17 00:00:00 2001 From: "jmesserly@google.com" Date: Thu, 8 May 2014 21:41:05 +0000 Subject: [PATCH 022/245] [html5lib] implement querySelector/querySelectorAll BUG= https://code.google.com/p/dart/issues/detail?id=18508 * tests from https://github.com/w3c/web-platform-tests/tree/master/selectors-api, kept as close to original as I could. * src/query_selector.dart is most interesting file. It implements enough of selectors to pass the basic web platform tests. Ironically, it was the easiest part of this CL... * many fixes to csslib. Almost all of the selector tests were skipped (https://github.com/dart-lang/csslib-test-suite/blob/master/suite/selectors3/selectors3_test.dart) and there was a lot of things broken: unicode, escaping, incorrectly treating ident-tokens as units, probably more that I am forgetting :). Fixed as much as I could without doing major surgery. * a bunch of fixes to the htm5lib DOM to bring it closer in alignment with dom.spec.whatwg.org and dart:html. The driving force was to minimize the changes needed on the W3C tests. Note: haven't updated things that depend on html5lib like Polymer yet. R=sigmund@google.com Review URL: https://codereview.chromium.org//268623002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@35941 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/parser.dart | 79 +++++++--- pkgs/csslib/lib/src/token.dart | 13 ++ pkgs/csslib/lib/src/tokenizer.dart | 113 +++++++++----- pkgs/csslib/lib/src/tokenizer_base.dart | 63 ++++---- pkgs/csslib/lib/src/tokenkind.dart | 2 - pkgs/csslib/lib/src/tree.dart | 195 ++++++++++++------------ pkgs/csslib/lib/visitor.dart | 37 +---- pkgs/csslib/pubspec.yaml | 2 +- 8 files changed, 274 insertions(+), 230 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 2539d94de..272268b5c 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -30,6 +30,7 @@ class ParserState extends TokenizerState { : super(tokenizer); } +// TODO(jmesserly): this should not be global void _createMessages({List errors, List options}) { if (errors == null) errors = []; @@ -45,7 +46,7 @@ bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. /** Parse and analyze the CSS file. */ -StyleSheet compile(var input, {List errors, List options, +StyleSheet compile(input, {List errors, List options, bool nested: true, bool polyfill: false, List includes: null}) { @@ -85,13 +86,12 @@ void analyze(List styleSheets, * or [List] of bytes and returns a [StyleSheet] AST. The optional * [errors] list will contain each error/warning as a [Message]. */ -StyleSheet parse(var input, {List errors, List options}) { +StyleSheet parse(input, {List errors, List options}) { var source = _inputAsString(input); _createMessages(errors: errors, options: options); var file = new SourceFile.text(null, source); - return new _Parser(file, source).parse(); } @@ -100,17 +100,32 @@ StyleSheet parse(var input, {List errors, List options}) { * or [List] of bytes and returns a [StyleSheet] AST. The optional * [errors] list will contain each error/warning as a [Message]. */ -StyleSheet selector(var input, {List errors}) { +// TODO(jmesserly): should rename "parseSelector" and return Selector +StyleSheet selector(input, {List errors}) { var source = _inputAsString(input); _createMessages(errors: errors); var file = new SourceFile.text(null, source); + return (new _Parser(file, source) + ..tokenizer.inSelector = true) + .parseSelector(); +} + +SelectorGroup parseSelectorGroup(input, {List errors}) { + var source = _inputAsString(input); + + _createMessages(errors: errors); - return new _Parser(file, source).parseSelector(); + var file = new SourceFile.text(null, source); + return (new _Parser(file, source) + // TODO(jmesserly): this fix should be applied to the parser. It's tricky + // because by the time the flag is set one token has already been fetched. + ..tokenizer.inSelector = true) + .processSelectorGroup(); } -String _inputAsString(var input) { +String _inputAsString(input) { String source; if (input is String) { @@ -147,6 +162,7 @@ String _inputAsString(var input) { class Parser { final _Parser _parser; + // TODO(jmesserly): having file and text is redundant. Parser(SourceFile file, String text, {int start: 0, String baseUrl}) : _parser = new _Parser(file, text, start: start, baseUrl: baseUrl); @@ -1174,6 +1190,7 @@ class _Parser { SelectorGroup processSelectorGroup() { List selectors = []; int start = _peekToken.start; + do { Selector selector = processSelector(); if (selector != null) { @@ -1413,18 +1430,32 @@ class _Parser { } // Functional pseudo? - if (_maybeEat(TokenKind.LPAREN)) { + + if (_peekToken.kind == TokenKind.LPAREN) { + if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') { + _eat(TokenKind.LPAREN); + // Negation : ':NOT(' S* negation_arg S* ')' var negArg = simpleSelector(); _eat(TokenKind.RPAREN); return new NegationSelector(negArg, _makeSpan(start)); } else { + // Special parsing for expressions in pseudo functions. Minus is used + // as operator not identifier. + // TODO(jmesserly): we need to flip this before we eat the "(" as the + // next token will be fetched when we do that. I think we should try to + // refactor so we don't need this boolean; it seems fragile. + tokenizer.inSelectorExpression = true; + _eat(TokenKind.LPAREN); + // Handle function expression. var span = _makeSpan(start); var expr = processSelectorExpression(); + tokenizer.inSelectorExpression = false; + // Used during selector look-a-head if not a SelectorExpression is // bad. if (expr is! SelectorExpression) { @@ -1463,27 +1494,23 @@ class _Parser { processSelectorExpression() { var start = _peekToken.start; - var expression = new SelectorExpression(_makeSpan(start)); + var expressions = []; Token termToken; var value; - // Special parsing for expressions in pseudo functions. Minus is used as - // operator not identifier. - tokenizer.selectorExpression = true; - var keepParsing = true; while (keepParsing) { switch (_peek()) { case TokenKind.PLUS: start = _peekToken.start; termToken = _next(); - expression.add(new OperatorPlus(_makeSpan(start))); + expressions.add(new OperatorPlus(_makeSpan(start))); break; case TokenKind.MINUS: start = _peekToken.start; termToken = _next(); - expression.add(new OperatorMinus(_makeSpan(start))); + expressions.add(new OperatorMinus(_makeSpan(start))); break; case TokenKind.INTEGER: termToken = _next(); @@ -1517,15 +1544,13 @@ class _Parser { if (unitTerm == null) { unitTerm = new LiteralTerm(value, value.name, _makeSpan(start)); } - expression.add(unitTerm); + expressions.add(unitTerm); value = null; } } - tokenizer.selectorExpression = false; - - return expression; + return new SelectorExpression(expressions, _makeSpan(start)); } // Attribute grammar: @@ -2343,6 +2368,12 @@ class _Parser { // URI term sucks up everything inside of quotes(' or ") or between parens var stopToken = urlString ? TokenKind.RPAREN : -1; + + // Note: disable skipping whitespace tokens inside a string. + // TODO(jmesserly): the layering here feels wrong. + var skipWhitespace = tokenizer._skipWhitespace; + tokenizer._skipWhitespace = false; + switch (_peek()) { case TokenKind.SINGLE_QUOTE: stopToken = TokenKind.SINGLE_QUOTE; @@ -2369,20 +2400,20 @@ class _Parser { // Gobble up everything until we hit our stop token. var runningStart = _peekToken.start; + + var stringValue = new StringBuffer(); while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) { - var tok = _next(); + stringValue.write(_next().text); } - // All characters between quotes is the string. - var end = _peekToken.end; - var stringValue = (_peekToken.span as FileSpan).file.getText(start, - end - 1); + tokenizer._skipWhitespace = skipWhitespace; + // All characters between quotes is the string. if (stopToken != TokenKind.RPAREN) { _next(); // Skip the SINGLE_QUOTE or DOUBLE_QUOTE; } - return stringValue; + return stringValue.toString(); } // TODO(terry): Should probably understand IE's non-standard filter syntax to diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index cf9e376ee..7e70f88c0 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -51,3 +51,16 @@ class ErrorToken extends Token { String message; ErrorToken(int kind, Span span, this.message) : super(kind, span); } + +/** + * CSS ident-token. + * + * See and + * . + */ +class IdentifierToken extends Token { + final String text; + + IdentifierToken(this.text, int kind, Span span) + : super(kind, span); +} diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index e3cdfdca1..8d929abeb 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -41,7 +41,7 @@ class Tokenizer extends TokenizerBase { _startIndex = _index; ch = _nextChar(); - Token ident = this.finishIdentifier(ch); + Token ident = finishIdentifier(); // Is it a directive? int tokId = TokenKind.matchDirectives(_text, _startIndex, @@ -101,7 +101,7 @@ class Tokenizer extends TokenizerBase { if (maybeEatDigit()) return finishNumber(); return _finishToken(TokenKind.PLUS); case TokenChar.MINUS: - if (selectorExpression || unicodeRange) { + if (inSelectorExpression || unicodeRange) { // If parsing in pseudo function expression then minus is an operator // not part of identifier e.g., interval value range (e.g. U+400-4ff) // or minus operator in selector expression. @@ -109,7 +109,7 @@ class Tokenizer extends TokenizerBase { } else if (maybeEatDigit()) { return finishNumber(); } else if (TokenizerHelpers.isIdentifierStart(ch)) { - return this.finishIdentifier(ch); + return finishIdentifier(); } return _finishToken(TokenKind.MINUS); case TokenChar.GREATER: @@ -127,6 +127,9 @@ class Tokenizer extends TokenizerBase { case TokenChar.AMPERSAND: return _finishToken(TokenKind.AMPERSAND); case TokenChar.NAMESPACE: + if (_maybeEatChar(TokenChar.EQUALS)) { + return _finishToken(TokenKind.DASH_MATCH); // |= + } return _finishToken(TokenKind.NAMESPACE); case TokenChar.COLON: return _finishToken(TokenKind.COLON); @@ -162,11 +165,6 @@ class Tokenizer extends TokenizerBase { return _finishToken(TokenKind.LESS); case TokenChar.EQUALS: return _finishToken(TokenKind.EQUALS); - case TokenChar.OR: - if (_maybeEatChar(TokenChar.EQUALS)) { - return _finishToken(TokenKind.DASH_MATCH); // |= - } - return _finishToken(TokenKind.OR); case TokenChar.CARET: if (_maybeEatChar(TokenChar.EQUALS)) { return _finishToken(TokenKind.PREFIX_MATCH); // ^= @@ -178,11 +176,16 @@ class Tokenizer extends TokenizerBase { } return _finishToken(TokenKind.DOLLAR); case TokenChar.BANG: - Token tok = finishIdentifier(ch); + Token tok = finishIdentifier(); return (tok == null) ? _finishToken(TokenKind.BANG) : tok; - case TokenChar.BACKSLASH: - return _finishToken(TokenKind.BACKSLASH); default: + // TODO(jmesserly): this is used for IE8 detection; I'm not sure it's + // appropriate outside of a few specific places; certainly shouldn't + // be parsed in selectors. + if (!inSelector && ch == TokenChar.BACKSLASH) { + return _finishToken(TokenKind.BACKSLASH); + } + if (unicodeRange) { // Three types of unicode ranges: // - single code point (e.g. U+416) @@ -212,7 +215,7 @@ class Tokenizer extends TokenizerBase { } else if (varUsage(ch)) { return _finishToken(TokenKind.VAR_USAGE); } else if (TokenizerHelpers.isIdentifierStart(ch)) { - return finishIdentifier(ch); + return finishIdentifier(); } else if (TokenizerHelpers.isDigit(ch)) { return finishNumber(); } @@ -236,7 +239,12 @@ class Tokenizer extends TokenizerBase { int getIdentifierKind() { // Is the identifier a unit type? - int tokId = TokenKind.matchUnits(_text, _startIndex, _index - _startIndex); + int tokId = -1; + + // Don't match units in selectors or selector expressions. + if (!inSelectorExpression && !inSelector) { + tokId = TokenKind.matchUnits(_text, _startIndex, _index - _startIndex); + } if (tokId == -1) { tokId = (_text.substring(_startIndex, _index) == '!important') ? TokenKind.IMPORTANT : -1; @@ -245,31 +253,59 @@ class Tokenizer extends TokenizerBase { return tokId >= 0 ? tokId : TokenKind.IDENTIFIER; } - // Need to override so CSS version of isIdentifierPart is used. - Token finishIdentifier(int ch) { + Token finishIdentifier() { + // If we encounter an escape sequence, remember it so we can post-process + // to unescape. + bool hasEscapedChars = false; + var chars = []; + + // backup so we can start with the first character + int validateFrom = _index; + _index = _startIndex; while (_index < _text.length) { - // If parsing in pseudo function expression then minus is an operator - // not part of identifier. - var isIdentifier = selectorExpression - ? TokenizerHelpers.isIdentifierPartExpr(_text.codeUnitAt(_index)) - : TokenizerHelpers.isIdentifierPart(_text.codeUnitAt(_index)); - if (!isIdentifier) { - break; + int ch = _text.codeUnitAt(_index); + + // If the previous character was "\" we need to escape. T + // http://www.w3.org/TR/CSS21/syndata.html#characters + // if followed by hexadecimal digits, create the appropriate character. + // otherwise, include the character in the identifier and don't treat it + // specially. + if (ch == 92/*\*/) { + int startHex = ++_index; + eatHexDigits(startHex + 6); + if (_index != startHex) { + // Parse the hex digits and add that character. + chars.add(int.parse('0x' + _text.substring(startHex, _index))); + + if (_index == _text.length) break; + + // if we stopped the hex because of a whitespace char, skip it + ch = _text.codeUnitAt(_index); + if (_index - startHex != 6 && + (ch == TokenChar.SPACE || ch == TokenChar.TAB || + ch == TokenChar.RETURN || ch == TokenChar.NEWLINE)) { + _index++; + } + } else { + // not a digit, just add the next character literally + if (_index == _text.length) break; + chars.add(_text.codeUnitAt(_index++)); + } + } else if (_index < validateFrom || (inSelectorExpression + ? TokenizerHelpers.isIdentifierPartExpr(ch) + : TokenizerHelpers.isIdentifierPart(ch))) { + chars.add(ch); + _index++; } else { - _index += 1; + // Not an identifier or escaped character. + break; } } - int kind = getIdentifierKind(); - if (kind == TokenKind.IDENTIFIER) { - return _finishToken(TokenKind.IDENTIFIER); - } else { - return _finishToken(kind); - } - } - - Token finishImportant() { + var span = _file.span(_startIndex, _index); + var text = new String.fromCharCodes(chars); + return new IdentifierToken(text, getIdentifierKind(), span); } Token finishNumber() { @@ -299,12 +335,13 @@ class Tokenizer extends TokenizerBase { } Token finishHexNumber() { - eatHexDigits(); + eatHexDigits(_text.length); return _finishToken(TokenKind.HEX_INTEGER); } - void eatHexDigits() { - while (_index < _text.length) { + void eatHexDigits(int end) { + end = math.min(end, _text.length); + while (_index < end) { if (TokenizerHelpers.isHexDigit(_text.codeUnitAt(_index))) { _index += 1; } else { @@ -399,7 +436,11 @@ class TokenizerHelpers { /** Pseudo function expressions identifiers can't have a minus sign. */ static bool isIdentifierStartExpr(int c) { return ((c >= 97/*a*/ && c <= 122/*z*/) || (c >= 65/*A*/ && c <= 90/*Z*/) || - c == 95/*_*/); + // Note: Unicode 10646 chars U+00A0 or higher are allowed, see: + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + // http://www.w3.org/TR/CSS21/syndata.html#characters + // Also, escaped character should be allowed. + c == 95/*_*/ || c >= 0xA0 || c == 92/*\*/); } /** Pseudo function expressions identifiers can't have a minus sign. */ diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index f33a3629c..07dee485d 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -9,12 +9,14 @@ part of csslib.parser; class TokenizerState { final int index; final int startIndex; - final bool selectorExpression; + final bool inSelectorExpression; + final bool inSelector; TokenizerState(TokenizerBase base) : - this.index = base._index, - this.startIndex = base._startIndex, - this.selectorExpression = base.selectorExpression; + index = base._index, + startIndex = base._startIndex, + inSelectorExpression = base.inSelectorExpression, + inSelector = base.inSelector; } /** @@ -23,14 +25,32 @@ class TokenizerState { */ abstract class TokenizerBase { final SourceFile _file; - final bool _skipWhitespace; final String _text; + bool _skipWhitespace; + /** * Changes tokenization when in a pseudo function expression. If true then * minus signs are handled as operators instead of identifiers. */ - bool selectorExpression = false; + bool inSelectorExpression = false; + + /** + * Changes tokenization when in selectors. If true, it prevents identifiers + * from being treated as units. This would break things like ":lang(fr)" or + * the HTML (unknown) tag name "px", which is legal to use in a selector. + */ + // TODO(jmesserly): is this a problem elsewhere? "fr" for example will be + // processed as a "fraction" unit token, preventing it from working in + // places where an identifier is expected. This was breaking selectors like: + // :lang(fr) + // The assumption that "fr" always means fraction (and similar issue with + // other units) doesn't seem valid. We probably should defer this + // analysis until we reach places in the parser where units are expected. + // I'm not sure this is tokenizing as described in the specs: + // http://dev.w3.org/csswg/css-syntax/ + // http://dev.w3.org/csswg/selectors4/ + bool inSelector = false; int _index; int _startIndex; @@ -51,7 +71,8 @@ abstract class TokenizerBase { void restore(TokenizerState markedData) { _index = markedData.index; _startIndex = markedData.startIndex; - selectorExpression = markedData.selectorExpression; + inSelectorExpression = markedData.inSelectorExpression; + inSelector = markedData.inSelector; } int _nextChar() { @@ -125,19 +146,6 @@ abstract class TokenizerBase { return _finishToken(TokenKind.END_OF_FILE); } - Token finishSingleLineComment() { - while (true) { - int ch = _nextChar(); - if (ch == 0 || ch == TokenChar.NEWLINE || ch == TokenChar.RETURN) { - if (_skipWhitespace) { - return next(); - } else { - return _finishToken(TokenKind.COMMENT); - } - } - } - } - Token finishMultiLineComment() { int nesting = 1; do { @@ -426,20 +434,5 @@ abstract class TokenizerBase { return _finishToken(TokenKind.DOT); } } - - Token finishIdentifier(int ch) { - while (_index < _text.length) { - if (!TokenizerHelpers.isIdentifierPart(_text.codeUnitAt(_index++))) { - _index--; - break; - } - } - int kind = getIdentifierKind(); - if (kind == TokenKind.IDENTIFIER) { - return _finishToken(TokenKind.IDENTIFIER); - } else { - return _finishToken(kind); - } - } } diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index 091bdb7fe..67bce3371 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -39,7 +39,6 @@ class TokenKind { static const int DOUBLE_QUOTE = 26; // " static const int SLASH = 27; // / static const int EQUALS = 28; // = - static const int OR = 29; // | static const int CARET = 30; // ^ static const int DOLLAR = 31; // $ static const int LESS = 32; // < @@ -664,7 +663,6 @@ class TokenKind { case TokenKind.DOUBLE_QUOTE: return "\""; case TokenKind.SLASH: return "/"; case TokenKind.EQUALS: return '='; - case TokenKind.OR: return '|'; case TokenKind.CARET: return '^'; case TokenKind.DOLLAR: return '\$'; case TokenKind.LESS: return '<'; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index f3c71ebcc..c5275fdc2 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -15,7 +15,7 @@ class Identifier extends TreeNode { Identifier clone() => new Identifier(name, span); - void visit(VisitorBase visitor) => visitor.visitIdentifier(this); + visit(VisitorBase visitor) => visitor.visitIdentifier(this); String toString() => name; } @@ -23,7 +23,7 @@ class Identifier extends TreeNode { class Wildcard extends TreeNode { Wildcard(Span span): super(span); Wildcard clone() => new Wildcard(span); - void visit(VisitorBase visitor) => visitor.visitWildcard(this); + visit(VisitorBase visitor) => visitor.visitWildcard(this); String get name => '*'; } @@ -31,7 +31,7 @@ class Wildcard extends TreeNode { class ThisOperator extends TreeNode { ThisOperator(Span span): super(span); ThisOperator clone() => new ThisOperator(span); - void visit(VisitorBase visitor) => visitor.visitThisOperator(this); + visit(VisitorBase visitor) => visitor.visitThisOperator(this); String get name => '&'; } @@ -39,7 +39,7 @@ class ThisOperator extends TreeNode { class Negation extends TreeNode { Negation(Span span): super(span); Negation clone() => new Negation(span); - void visit(VisitorBase visitor) => visitor.visitNegation(this); + visit(VisitorBase visitor) => visitor.visitNegation(this); String get name => 'not'; } @@ -50,14 +50,14 @@ class CssComment extends TreeNode { CssComment(this.comment, Span span): super(span); CssComment clone() => new CssComment(comment, span); - void visit(VisitorBase visitor) => visitor.visitCssComment(this); + visit(VisitorBase visitor) => visitor.visitCssComment(this); } // CDO/CDC (Comment Definition Open ). class CommentDefinition extends CssComment { CommentDefinition(String comment, Span span): super(comment, span); CommentDefinition clone() => new CommentDefinition(comment, span); - void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); + visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); } class SelectorGroup extends TreeNode { @@ -67,7 +67,7 @@ class SelectorGroup extends TreeNode { SelectorGroup clone() => new SelectorGroup(selectors, span); - void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); + visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); } class Selector extends TreeNode { @@ -87,7 +87,7 @@ class Selector extends TreeNode { return new Selector(simpleSequences, span); } - void visit(VisitorBase visitor) => visitor.visitSelector(this); + visit(VisitorBase visitor) => visitor.visitSelector(this); } class SimpleSelectorSequence extends TreeNode { @@ -115,7 +115,7 @@ class SimpleSelectorSequence extends TreeNode { SimpleSelectorSequence clone() => new SimpleSelectorSequence(simpleSelector, span, combinator); - void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); + visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); String toString() => simpleSelector.name; } @@ -134,13 +134,13 @@ abstract class SimpleSelector extends TreeNode { bool get isThis => _name is ThisOperator; - void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); + visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); } // element name class ElementSelector extends SimpleSelector { ElementSelector(name, Span span) : super(name, span); - void visit(VisitorBase visitor) => visitor.visitElementSelector(this); + visit(VisitorBase visitor) => visitor.visitElementSelector(this); ElementSelector clone() => new ElementSelector(_name, span); @@ -162,7 +162,7 @@ class NamespaceSelector extends SimpleSelector { NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span); - void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); + visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); String toString() => "$namespace|${nameAsSimpleSelector.name}"; } @@ -175,6 +175,10 @@ class AttributeSelector extends SimpleSelector { AttributeSelector(Identifier name, this._op, this._value, Span span) : super(name, span); + int get operatorKind => _op; + + get value => _value; + String matchOperator() { switch (_op) { case TokenKind.EQUALS: @@ -226,7 +230,7 @@ class AttributeSelector extends SimpleSelector { AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span); - void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); + visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); String toString() => "[$name${matchOperator()}${valueToString()}]"; } @@ -235,7 +239,7 @@ class AttributeSelector extends SimpleSelector { class IdSelector extends SimpleSelector { IdSelector(Identifier name, Span span) : super(name, span); IdSelector clone() => new IdSelector(_name, span); - void visit(VisitorBase visitor) => visitor.visitIdSelector(this); + visit(VisitorBase visitor) => visitor.visitIdSelector(this); String toString() => "#$_name"; } @@ -244,7 +248,7 @@ class IdSelector extends SimpleSelector { class ClassSelector extends SimpleSelector { ClassSelector(Identifier name, Span span) : super(name, span); ClassSelector clone() => new ClassSelector(_name, span); - void visit(VisitorBase visitor) => visitor.visitClassSelector(this); + visit(VisitorBase visitor) => visitor.visitClassSelector(this); String toString() => ".$_name"; } @@ -252,7 +256,7 @@ class ClassSelector extends SimpleSelector { // :pseudoClass class PseudoClassSelector extends SimpleSelector { PseudoClassSelector(Identifier name, Span span) : super(name, span); - void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); + visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); PseudoClassSelector clone() => new PseudoClassSelector(_name, span); @@ -262,7 +266,7 @@ class PseudoClassSelector extends SimpleSelector { // ::pseudoElement class PseudoElementSelector extends SimpleSelector { PseudoElementSelector(Identifier name, Span span) : super(name, span); - void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); + visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); PseudoElementSelector clone() => new PseudoElementSelector(_name, span); @@ -279,7 +283,7 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { PseudoClassFunctionSelector clone() => new PseudoClassFunctionSelector(_name, expression, span); - void visit(VisitorBase visitor) => + visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); } @@ -293,28 +297,21 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { PseudoElementFunctionSelector clone() => new PseudoElementFunctionSelector(_name, expression, span); - void visit(VisitorBase visitor) => + visit(VisitorBase visitor) => visitor.visitPseudoElementFunctionSelector(this); } class SelectorExpression extends TreeNode { - final List expressions = []; + final List expressions; - SelectorExpression(Span span): super(span); - - void add(Expression expression) { - expressions.add(expression); - } + SelectorExpression(this.expressions, Span span): super(span); SelectorExpression clone() { - var selectorExpr = new SelectorExpression(span); - for (var expr in expressions) { - selectorExpr.add(expr.clone()); - } - return selectorExpr; + return new SelectorExpression( + expressions.map((e) => e.clone()).toList(), span); } - void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); + visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); } // :NOT(negation_arg) @@ -326,7 +323,7 @@ class NegationSelector extends SimpleSelector { NegationSelector clone() => new NegationSelector(negationArg, span); - void visit(VisitorBase visitor) => visitor.visitNegationSelector(this); + visit(VisitorBase visitor) => visitor.visitNegationSelector(this); } class NoOp extends TreeNode { @@ -334,7 +331,7 @@ class NoOp extends TreeNode { NoOp clone() => new NoOp(); - void visit(VisitorBase visitor) => visitor.visitNoOp(this); + visit(VisitorBase visitor) => visitor.visitNoOp(this); } class StyleSheet extends TreeNode { @@ -357,13 +354,13 @@ class StyleSheet extends TreeNode { return new StyleSheet(clonedTopLevels, span); } - void visit(VisitorBase visitor) => visitor.visitStyleSheet(this); + visit(VisitorBase visitor) => visitor.visitStyleSheet(this); } class TopLevelProduction extends TreeNode { TopLevelProduction(Span span) : super(span); TopLevelProduction clone() => new TopLevelProduction(span); - void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); + visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); } class RuleSet extends TopLevelProduction { @@ -381,7 +378,7 @@ class RuleSet extends TopLevelProduction { return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); } - void visit(VisitorBase visitor) => visitor.visitRuleSet(this); + visit(VisitorBase visitor) => visitor.visitRuleSet(this); } class Directive extends TreeNode { @@ -391,7 +388,7 @@ class Directive extends TreeNode { bool get isExtension => false; // SCSS extension? Directive clone() => new Directive(span); - void visit(VisitorBase visitor) => visitor.visitDirective(this); + visit(VisitorBase visitor) => visitor.visitDirective(this); } class ImportDirective extends Directive { @@ -411,7 +408,7 @@ class ImportDirective extends Directive { return new ImportDirective(import, cloneMediaQueries, span); } - void visit(VisitorBase visitor) => visitor.visitImportDirective(this); + visit(VisitorBase visitor) => visitor.visitImportDirective(this); } /** @@ -433,7 +430,7 @@ class MediaExpression extends TreeNode { return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span); } - void visit(VisitorBase visitor) => visitor.visitMediaExpression(this); + visit(VisitorBase visitor) => visitor.visitMediaExpression(this); } /** @@ -470,7 +467,7 @@ class MediaQuery extends TreeNode { } return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); } - void visit(VisitorBase visitor) => visitor.visitMediaQuery(this); + visit(VisitorBase visitor) => visitor.visitMediaQuery(this); } class MediaDirective extends Directive { @@ -491,7 +488,7 @@ class MediaDirective extends Directive { return new MediaDirective(cloneQueries, cloneRulesets, span); } - void visit(VisitorBase visitor) => visitor.visitMediaDirective(this); + visit(VisitorBase visitor) => visitor.visitMediaDirective(this); } class HostDirective extends Directive { @@ -507,7 +504,7 @@ class HostDirective extends Directive { return new HostDirective(cloneRulesets, span); } - void visit(VisitorBase visitor) => visitor.visitHostDirective(this); + visit(VisitorBase visitor) => visitor.visitHostDirective(this); } class PageDirective extends Directive { @@ -526,7 +523,7 @@ class PageDirective extends Directive { return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span); } - void visit(VisitorBase visitor) => visitor.visitPageDirective(this); + visit(VisitorBase visitor) => visitor.visitPageDirective(this); bool get hasIdent => _ident != null && _ident.length > 0; bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0; @@ -537,7 +534,7 @@ class CharsetDirective extends Directive { CharsetDirective(this.charEncoding, Span span) : super(span); CharsetDirective clone() => new CharsetDirective(charEncoding, span); - void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); + visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); } class KeyFrameDirective extends Directive { @@ -573,7 +570,7 @@ class KeyFrameDirective extends Directive { } return new KeyFrameDirective(_keyframeName, cloneBlocks, span); } - void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); + visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); } class KeyFrameBlock extends Expression { @@ -585,7 +582,7 @@ class KeyFrameBlock extends Expression { KeyFrameBlock clone() => new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); - void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); + visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); } class FontFaceDirective extends Directive { @@ -595,7 +592,7 @@ class FontFaceDirective extends Directive { FontFaceDirective clone() => new FontFaceDirective(_declarations.clone(), span); - void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); + visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); } class StyletDirective extends Directive { @@ -615,7 +612,7 @@ class StyletDirective extends Directive { return new StyletDirective(dartClassName, cloneRulesets, span); } - void visit(VisitorBase visitor) => visitor.visitStyletDirective(this); + visit(VisitorBase visitor) => visitor.visitStyletDirective(this); } class NamespaceDirective extends Directive { @@ -629,7 +626,7 @@ class NamespaceDirective extends Directive { NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); - void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); + visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; } @@ -643,7 +640,7 @@ class VarDefinitionDirective extends Directive { VarDefinitionDirective clone() => new VarDefinitionDirective(def.clone(), span); - void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); + visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); } class MixinDefinition extends Directive { @@ -662,7 +659,7 @@ class MixinDefinition extends Directive { return new MixinDefinition(name, cloneDefinedArgs, varArgs, span); } - void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); + visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); } /** Support a Sass @mixin. See http://sass-lang.com for description. */ @@ -686,7 +683,7 @@ class MixinRulesetDirective extends MixinDefinition { span); } - void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); + visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); } class MixinDeclarationDirective extends MixinDefinition { @@ -705,7 +702,7 @@ class MixinDeclarationDirective extends MixinDefinition { declarations.clone(), span); } - void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); + visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); } /** To support consuming a SASS mixin @include. */ @@ -725,14 +722,14 @@ class IncludeDirective extends Directive { return new IncludeDirective(name, cloneArgs, span); } - void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); + visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); } /** To support SASS @content. */ class ContentDirective extends Directive { ContentDirective(Span span) : super(span); - void visit(VisitorBase visitor) => visitor.visitContentDirective(this); + visit(VisitorBase visitor) => visitor.visitContentDirective(this); } class Declaration extends TreeNode { @@ -765,7 +762,7 @@ class Declaration extends TreeNode { new Declaration(_property.clone(), _expression.clone(), dartStyle, span, important: important); - void visit(VisitorBase visitor) => visitor.visitDeclaration(this); + visit(VisitorBase visitor) => visitor.visitDeclaration(this); } // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and @@ -786,7 +783,7 @@ class VarDefinition extends Declaration { new VarDefinition(_property.clone(), expression != null ? expression.clone() : null, span); - void visit(VisitorBase visitor) => visitor.visitVarDefinition(this); + visit(VisitorBase visitor) => visitor.visitVarDefinition(this); } /** @@ -805,7 +802,7 @@ class IncludeMixinAtDeclaration extends Declaration { IncludeMixinAtDeclaration clone() => new IncludeMixinAtDeclaration(include.clone(), span); - void visit(VisitorBase visitor) => + visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this); } @@ -820,7 +817,7 @@ class ExtendDeclaration extends Declaration { return new ExtendDeclaration(newSelector, span); } - void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); + visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); } class DeclarationGroup extends TreeNode { @@ -834,7 +831,7 @@ class DeclarationGroup extends TreeNode { return new DeclarationGroup(clonedDecls, span); } - void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); + visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); } class MarginGroup extends DeclarationGroup { @@ -844,7 +841,7 @@ class MarginGroup extends DeclarationGroup { : super(decls, span); MarginGroup clone() => new MarginGroup(margin_sym, super.clone() as dynamic, span); - void visit(VisitorBase visitor) => visitor.visitMarginGroup(this); + visit(VisitorBase visitor) => visitor.visitMarginGroup(this); } class VarUsage extends Expression { @@ -861,31 +858,31 @@ class VarUsage extends Expression { return new VarUsage(name, clonedValues, span); } - void visit(VisitorBase visitor) => visitor.visitVarUsage(this); + visit(VisitorBase visitor) => visitor.visitVarUsage(this); } class OperatorSlash extends Expression { OperatorSlash(Span span) : super(span); OperatorSlash clone() => new OperatorSlash(span); - void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); + visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); } class OperatorComma extends Expression { OperatorComma(Span span) : super(span); OperatorComma clone() => new OperatorComma(span); - void visit(VisitorBase visitor) => visitor.visitOperatorComma(this); + visit(VisitorBase visitor) => visitor.visitOperatorComma(this); } class OperatorPlus extends Expression { OperatorPlus(Span span) : super(span); OperatorPlus clone() => new OperatorPlus(span); - void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); + visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); } class OperatorMinus extends Expression { OperatorMinus(Span span) : super(span); OperatorMinus clone() => new OperatorMinus(span); - void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); + visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); } class UnicodeRangeTerm extends Expression { @@ -898,7 +895,7 @@ class UnicodeRangeTerm extends Expression { UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span); - void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); + visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); } class LiteralTerm extends Expression { @@ -912,13 +909,13 @@ class LiteralTerm extends Expression { LiteralTerm clone() => new LiteralTerm(value, text, span); - void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); + visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); } class NumberTerm extends LiteralTerm { NumberTerm(value, String t, Span span) : super(value, t, span); NumberTerm clone() => new NumberTerm(value, text, span); - void visit(VisitorBase visitor) => visitor.visitNumberTerm(this); + visit(VisitorBase visitor) => visitor.visitNumberTerm(this); } class UnitTerm extends LiteralTerm { @@ -928,7 +925,7 @@ class UnitTerm extends LiteralTerm { UnitTerm clone() => new UnitTerm(value, text, span, unit); - void visit(VisitorBase visitor) => visitor.visitUnitTerm(this); + visit(VisitorBase visitor) => visitor.visitUnitTerm(this); String unitToString() => TokenKind.unitToString(unit); @@ -946,25 +943,25 @@ class LengthTerm extends UnitTerm { this.unit == TokenKind.UNIT_LENGTH_PC); } LengthTerm clone() => new LengthTerm(value, text, span, unit); - void visit(VisitorBase visitor) => visitor.visitLengthTerm(this); + visit(VisitorBase visitor) => visitor.visitLengthTerm(this); } class PercentageTerm extends LiteralTerm { PercentageTerm(value, String t, Span span) : super(value, t, span); PercentageTerm clone() => new PercentageTerm(value, text, span); - void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); + visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); } class EmTerm extends LiteralTerm { EmTerm(value, String t, Span span) : super(value, t, span); EmTerm clone() => new EmTerm(value, text, span); - void visit(VisitorBase visitor) => visitor.visitEmTerm(this); + visit(VisitorBase visitor) => visitor.visitEmTerm(this); } class ExTerm extends LiteralTerm { ExTerm(value, String t, Span span) : super(value, t, span); ExTerm clone() => new ExTerm(value, text, span); - void visit(VisitorBase visitor) => visitor.visitExTerm(this); + visit(VisitorBase visitor) => visitor.visitExTerm(this); } class AngleTerm extends UnitTerm { @@ -977,7 +974,7 @@ class AngleTerm extends UnitTerm { } AngleTerm clone() => new AngleTerm(value, text, span, unit); - void visit(VisitorBase visitor) => visitor.visitAngleTerm(this); + visit(VisitorBase visitor) => visitor.visitAngleTerm(this); } class TimeTerm extends UnitTerm { @@ -989,7 +986,7 @@ class TimeTerm extends UnitTerm { } TimeTerm clone() => new TimeTerm(value, text, span, unit); - void visit(VisitorBase visitor) => visitor.visitTimeTerm(this); + visit(VisitorBase visitor) => visitor.visitTimeTerm(this); } class FreqTerm extends UnitTerm { @@ -999,21 +996,21 @@ class FreqTerm extends UnitTerm { } FreqTerm clone() => new FreqTerm(value, text, span, unit); - void visit(VisitorBase visitor) => visitor.visitFreqTerm(this); + visit(VisitorBase visitor) => visitor.visitFreqTerm(this); } class FractionTerm extends LiteralTerm { FractionTerm(var value, String t, Span span) : super(value, t, span); FractionTerm clone() => new FractionTerm(value, text, span); - void visit(VisitorBase visitor) => visitor.visitFractionTerm(this); + visit(VisitorBase visitor) => visitor.visitFractionTerm(this); } class UriTerm extends LiteralTerm { UriTerm(String value, Span span) : super(value, value, span); UriTerm clone() => new UriTerm(value, span); - void visit(VisitorBase visitor) => visitor.visitUriTerm(this); + visit(VisitorBase visitor) => visitor.visitUriTerm(this); } class ResolutionTerm extends UnitTerm { @@ -1025,7 +1022,7 @@ class ResolutionTerm extends UnitTerm { } ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); - void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); + visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); } class ChTerm extends UnitTerm { @@ -1035,7 +1032,7 @@ class ChTerm extends UnitTerm { } ChTerm clone() => new ChTerm(value, text, span, unit); - void visit(VisitorBase visitor) => visitor.visitChTerm(this); + visit(VisitorBase visitor) => visitor.visitChTerm(this); } class RemTerm extends UnitTerm { @@ -1045,7 +1042,7 @@ class RemTerm extends UnitTerm { } RemTerm clone() => new RemTerm(value, text, span, unit); - void visit(VisitorBase visitor) => visitor.visitRemTerm(this); + visit(VisitorBase visitor) => visitor.visitRemTerm(this); } class ViewportTerm extends UnitTerm { @@ -1058,7 +1055,7 @@ class ViewportTerm extends UnitTerm { } ViewportTerm clone() => new ViewportTerm(value, text, span, unit); - void visit(VisitorBase visitor) => visitor.visitViewportTerm(this); + visit(VisitorBase visitor) => visitor.visitViewportTerm(this); } /** Type to signal a bad hex value for HexColorTerm.value. */ @@ -1068,7 +1065,7 @@ class HexColorTerm extends LiteralTerm { HexColorTerm(var value, String t, Span span) : super(value, t, span); HexColorTerm clone() => new HexColorTerm(value, text, span); - void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); + visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); } class FunctionTerm extends LiteralTerm { @@ -1078,7 +1075,7 @@ class FunctionTerm extends LiteralTerm { : super(value, t, span); FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span); - void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); + visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); } /** @@ -1089,7 +1086,7 @@ class FunctionTerm extends LiteralTerm { class IE8Term extends LiteralTerm { IE8Term(Span span) : super('\\9', '\\9', span); IE8Term clone() => new IE8Term(span); - void visit(VisitorBase visitor) => visitor.visitIE8Term(this); + visit(VisitorBase visitor) => visitor.visitIE8Term(this); } class GroupTerm extends Expression { @@ -1102,14 +1099,14 @@ class GroupTerm extends Expression { } GroupTerm clone() => new GroupTerm(span); - void visit(VisitorBase visitor) => visitor.visitGroupTerm(this); + visit(VisitorBase visitor) => visitor.visitGroupTerm(this); } class ItemTerm extends NumberTerm { ItemTerm(var value, String t, Span span) : super(value, t, span); ItemTerm clone() => new ItemTerm(value, text, span); - void visit(VisitorBase visitor) => visitor.visitItemTerm(this); + visit(VisitorBase visitor) => visitor.visitItemTerm(this); } class Expressions extends Expression { @@ -1128,7 +1125,7 @@ class Expressions extends Expression { } return clonedExprs; } - void visit(VisitorBase visitor) => visitor.visitExpressions(this); + visit(VisitorBase visitor) => visitor.visitExpressions(this); } class BinaryExpression extends Expression { @@ -1140,7 +1137,7 @@ class BinaryExpression extends Expression { BinaryExpression clone() => new BinaryExpression(op, x.clone(), y.clone(), span); - void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); + visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); } class UnaryExpression extends Expression { @@ -1150,7 +1147,7 @@ class UnaryExpression extends Expression { UnaryExpression(this.op, this.self, Span span): super(span); UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); - void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); + visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); } abstract class DartStyleExpression extends TreeNode { @@ -1185,7 +1182,7 @@ abstract class DartStyleExpression extends TreeNode { bool isSame(DartStyleExpression other) => this._styleType == other._styleType; - void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); + visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); } class FontExpression extends DartStyleExpression { @@ -1225,7 +1222,7 @@ class FontExpression extends DartStyleExpression { weight: font.weight, style: font.style, variant: font.variant, lineHeight: font.lineHeight); - void visit(VisitorBase visitor) => visitor.visitFontExpression(this); + visit(VisitorBase visitor) => visitor.visitFontExpression(this); } abstract class BoxExpression extends DartStyleExpression { @@ -1241,7 +1238,7 @@ abstract class BoxExpression extends DartStyleExpression { */ merged(BoxExpression newDartExpr); - void visit(VisitorBase visitor) => visitor.visitBoxExpression(this); + visit(VisitorBase visitor) => visitor.visitBoxExpression(this); String get formattedBoxEdge { if (box.top == box.left && box.top == box.bottom && @@ -1289,7 +1286,7 @@ class MarginExpression extends BoxExpression { new MarginExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); - void visit(VisitorBase visitor) => visitor.visitMarginExpression(this); + visit(VisitorBase visitor) => visitor.visitMarginExpression(this); } class BorderExpression extends BoxExpression { @@ -1325,7 +1322,7 @@ class BorderExpression extends BoxExpression { new BorderExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); - void visit(VisitorBase visitor) => visitor.visitBorderExpression(this); + visit(VisitorBase visitor) => visitor.visitBorderExpression(this); } class HeightExpression extends DartStyleExpression { @@ -1343,7 +1340,7 @@ class HeightExpression extends DartStyleExpression { } HeightExpression clone() => new HeightExpression(span, height); - void visit(VisitorBase visitor) => visitor.visitHeightExpression(this); + visit(VisitorBase visitor) => visitor.visitHeightExpression(this); } class WidthExpression extends DartStyleExpression { @@ -1361,7 +1358,7 @@ class WidthExpression extends DartStyleExpression { } WidthExpression clone() => new WidthExpression(span, width); - void visit(VisitorBase visitor) => visitor.visitWidthExpression(this); + visit(VisitorBase visitor) => visitor.visitWidthExpression(this); } class PaddingExpression extends BoxExpression { @@ -1395,5 +1392,5 @@ class PaddingExpression extends BoxExpression { PaddingExpression clone() => new PaddingExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); - void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); + visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 6c009ff01..8174af923 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -262,45 +262,16 @@ class Visitor implements VisitorBase { } void visitSimpleSelectorSequence(SimpleSelectorSequence node) { - var selector = node.simpleSelector; - if (selector is NamespaceSelector) { - visitNamespaceSelector(selector); - } else if (selector is ElementSelector) { - visitElementSelector(selector); - } else if (selector is IdSelector) { - visitIdSelector(selector); - } else if (selector is ClassSelector) { - visitClassSelector(selector); - } else if (selector is PseudoClassFunctionSelector) { - visitPseudoClassFunctionSelector(selector); - } else if (selector is PseudoElementFunctionSelector) { - visitPseudoElementFunctionSelector(selector); - } else if (selector is PseudoClassSelector) { - visitPseudoClassSelector(selector); - } else if (selector is PseudoElementSelector) { - visitPseudoElementSelector(selector); - } else if (selector is NegationSelector) { - visitNegationSelector(selector); - } else if (selector is SelectorExpression) { - visitSelectorExpression(selector); - } else if (selector is AttributeSelector) { - visitAttributeSelector(selector); - } else { - visitSimpleSelector(selector); - } + node.simpleSelector.visit(this); } void visitSimpleSelector(SimpleSelector node) => node._name.visit(this); void visitNamespaceSelector(NamespaceSelector node) { - var namespace = node._namespace; - if (namespace is Identifier) { - visitIdentifier(namespace); - } else if (namespace is Wildcard) { - visitWildcard(namespace); + if (node._namespace != null) node._namespace.visit(this); + if (node.nameAsSimpleSelector != null) { + node.nameAsSimpleSelector.visit(this); } - - visitSimpleSelector(node.nameAsSimpleSelector); } void visitElementSelector(ElementSelector node) => visitSimpleSelector(node); diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 81ddfd9b6..66240e758 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.9.3-dev +version: 0.10.0 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org From efcc54403ac3ff43b3e0a6cae3607e559fdc4c65 Mon Sep 17 00:00:00 2001 From: "sigmund@google.com" Date: Mon, 12 May 2014 22:38:19 +0000 Subject: [PATCH 023/245] Fix status in bots. BUG= Review URL: https://codereview.chromium.org//281613003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@36083 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 66240e758..509771d32 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.10.0 +version: 0.10.0-dev author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org From 16e18482fee3868db23e68ec5f67555cd739782c Mon Sep 17 00:00:00 2001 From: "sigmund@google.com" Date: Fri, 23 May 2014 22:01:17 +0000 Subject: [PATCH 024/245] Update versions before releasing. R=jmesserly@google.com Review URL: https://codereview.chromium.org//297973003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@36590 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 509771d32..66240e758 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.10.0-dev +version: 0.10.0 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org From 1de1c22c3641d49347a04413b8beb252ec89be50 Mon Sep 17 00:00:00 2001 From: "nweiz@google.com" Date: Tue, 27 May 2014 23:01:24 +0000 Subject: [PATCH 025/245] Make source map location information more readable. This changes "file:1:2" to "line 1, column 2 of file" and ":1:2" to "line 1, column 2" in [SourceFile.getLocationMessage]. The more machine-readable colon-separated format doesn't make sense for a message intended for humans. Since [Location.formatString] seems more likely to be consumed by machines, its format was left as-is. This also prepares version 0.9.1 for release. This was previously submitted as r36603. That caused buildbot errors and was rolled back by r36615. This CL fixes the test errors in r36603. R=sigmund@google.com Review URL: https://codereview.chromium.org//304603003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@36717 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/src/messages.dart | 1 + pkgs/csslib/pubspec.yaml | 4 ++-- pkgs/csslib/test/error_test.dart | 29 +++++++++++++++-------------- pkgs/csslib/test/selector_test.dart | 9 +++++---- pkgs/csslib/test/var_test.dart | 14 +++++++------- 5 files changed, 30 insertions(+), 27 deletions(-) diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 24964add6..6c2ecbf6f 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -60,6 +60,7 @@ class Message { if (span == null) { output.write(message); } else { + output.write('on '); output.write(span.getLocationMessage(message, useColors: colors, color: levelColor)); } diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 66240e758..09d60e410 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.10.0 +version: 0.10.0+1 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org @@ -9,7 +9,7 @@ dependencies: args: '>=0.9.0 <0.12.0' logging: '>=0.9.0 <0.10.0' path: '>=0.9.0 <2.0.0' - source_maps: '>=0.9.0 <0.10.0' + source_maps: '>=0.9.1 <0.10.0' dev_dependencies: browser: '>=0.9.0 <0.10.0' unittest: '>=0.9.0 <0.10.0' diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 935c6188a..f48906cd8 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -21,7 +21,7 @@ void testUnsupportedFontWeights() { expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:24: Unknown property value bolder +error on line 1, column 24: Unknown property value bolder .foobar { font-weight: bolder; } ^^^^^^'''); expect(stylesheet != null, true); @@ -38,7 +38,7 @@ error :1:24: Unknown property value bolder expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:24: Unknown property value lighter +error on line 1, column 24: Unknown property value lighter .foobar { font-weight: lighter; } ^^^^^^^'''); expect(stylesheet != null, true); @@ -54,7 +54,7 @@ error :1:24: Unknown property value lighter expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:24: Unknown property value inherit +error on line 1, column 24: Unknown property value inherit .foobar { font-weight: inherit; } ^^^^^^^'''); expect(stylesheet != null, true); @@ -77,7 +77,7 @@ void testUnsupportedLineHeights() { expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:24: Unexpected value for line-height +error on line 1, column 24: Unexpected value for line-height .foobar { line-height: 120%; } ^^^'''); expect(stylesheet != null, true); @@ -93,7 +93,7 @@ error :1:24: Unexpected value for line-height expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:24: Unexpected unit for line-height +error on line 1, column 24: Unexpected unit for line-height .foobar { line-height: 20cm; } ^^'''); expect(stylesheet != null, true); @@ -109,7 +109,7 @@ error :1:24: Unexpected unit for line-height expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:24: Unknown property value inherit +error on line 1, column 24: Unknown property value inherit .foobar { line-height: inherit; } ^^^^^^^'''); expect(stylesheet != null, true); @@ -129,7 +129,7 @@ void testBadSelectors() { expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:1: Not a valid ID selector expected #id +error on line 1, column 1: Not a valid ID selector expected #id # foo { color: #ff00ff; } ^'''); expect(stylesheet != null, true); @@ -144,7 +144,7 @@ error :1:1: Not a valid ID selector expected #id expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:1: Not a valid class selector expected .className +error on line 1, column 1: Not a valid class selector expected .className . foo { color: #ff00ff; } ^'''); expect(stylesheet != null, true); @@ -164,7 +164,7 @@ void testBadHexValues() { expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:18: Bad hex number +error on line 1, column 18: Bad hex number .foobar { color: #AH787; } ^^^^^^'''); expect(stylesheet != null, true); @@ -179,7 +179,7 @@ error :1:18: Bad hex number expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:18: Unknown property value redder +error on line 1, column 18: Unknown property value redder .foobar { color: redder; } ^^^^^^'''); @@ -195,7 +195,7 @@ error :1:18: Unknown property value redder expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:18: Expected hex number +error on line 1, column 18: Expected hex number .foobar { color: # ffffff; } ^'''); @@ -211,7 +211,7 @@ error :1:18: Expected hex number expect(errors.isEmpty, false); expect(errors[0].toString(), r''' -error :1:18: Expected hex number +error on line 1, column 18: Expected hex number .foobar { color: # 123fff; } ^'''); @@ -238,7 +238,8 @@ void testBadUnicode() { expect(errors.isEmpty, false); expect(errors[0].toString(), - 'error :3:20: unicode first range can not be greater than last\n' + 'error on line 3, column 20: unicode first range can not be greater than ' + 'last\n' ' unicode-range: U+400-200;\n' ' ^^^^^^^'); @@ -252,7 +253,7 @@ void testBadUnicode() { expect(errors.isEmpty, false); expect(errors[0].toString(), - 'error :3:20: unicode range must be less than 10FFFF\n' + 'error on line 3, column 20: unicode range must be less than 10FFFF\n' ' unicode-range: U+12FFFF;\n' ' ^^^^^^'); } diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index f87136eea..3f764e70a 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -54,10 +54,11 @@ void testSelectorFailures() { // Test for invalid class name (can't start with number). var selectorAst = selector('.foobar .1a-story .xyzzy', errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' -error :1:9: name must start with a alpha character, but found a number -.foobar .1a-story .xyzzy - ^^'''); + expect(errors[0].toString(), + 'error on line 1, column 9: name must start with a alpha character, but ' + 'found a number\n' + '.foobar .1a-story .xyzzy\n' + ' ^^'); } main() { diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index d38569ac9..0ec285242 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -392,25 +392,25 @@ void undefinedVars() { }'''; var errorStrings = [ - 'error :5:14: Variable is not defined.\n' + 'error on line 5, column 14: Variable is not defined.\n' ' var-a: var(b);\n' ' ^^', - 'error :6:14: Variable is not defined.\n' + 'error on line 6, column 14: Variable is not defined.\n' ' var-b: var(c);\n' ' ^^', - 'error :9:16: Variable is not defined.\n' + 'error on line 9, column 16: Variable is not defined.\n' ' var-one: var(two);\n' ' ^^^^', - 'error :12:17: Variable is not defined.\n' + 'error on line 12, column 17: Variable is not defined.\n' ' var-four: var(five);\n' ' ^^^^^', - 'error :13:17: Variable is not defined.\n' + 'error on line 13, column 17: Variable is not defined.\n' ' var-five: var(six);\n' ' ^^^^', - 'error :16:18: Variable is not defined.\n' + 'error on line 16, column 18: Variable is not defined.\n' ' var-def-1: var(def-2);\n' ' ^^^^^^', - 'error :17:18: Variable is not defined.\n' + 'error on line 17, column 18: Variable is not defined.\n' ' var-def-2: var(def-3);\n' ' ^^^^^^', ]; From b52fdaed760c31e27d9ca3b0d03abcec6b06b532 Mon Sep 17 00:00:00 2001 From: "rnystrom@google.com" Date: Thu, 17 Jul 2014 21:35:45 +0000 Subject: [PATCH 026/245] Add .wasParsed() to ArgResults. BUG=https://code.google.com/p/dart/issues/detail?id=16227 R=alanknight@google.com, nweiz@google.com, sigmund@google.com Review URL: https://codereview.chromium.org//383913003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@38348 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 09d60e410..e1d0afe98 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://www.dartlang.org environment: sdk: '>=1.0.0 <2.0.0' dependencies: - args: '>=0.9.0 <0.12.0' + args: '>=0.9.0 <0.13.0' logging: '>=0.9.0 <0.10.0' path: '>=0.9.0 <2.0.0' source_maps: '>=0.9.1 <0.10.0' From 61897da3e0b79d798750f170b34082a25cf46e89 Mon Sep 17 00:00:00 2001 From: "nweiz@google.com" Date: Wed, 30 Jul 2014 00:13:19 +0000 Subject: [PATCH 027/245] Use source_span rather than source_maps in csslib. This will release csslib 0.11.0 and html5lib 0.11.0+2. BUG=19930 R=sigmund@google.com Review URL: https://codereview.chromium.org//426053003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@38716 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/CHANGELOG.md | 3 + pkgs/csslib/lib/css.dart | 4 +- pkgs/csslib/lib/parser.dart | 22 ++-- pkgs/csslib/lib/src/messages.dart | 17 ++- pkgs/csslib/lib/src/token.dart | 8 +- pkgs/csslib/lib/src/tree.dart | 200 +++++++++++++++-------------- pkgs/csslib/lib/src/tree_base.dart | 6 +- pkgs/csslib/lib/src/validate.dart | 15 +-- pkgs/csslib/lib/visitor.dart | 2 +- pkgs/csslib/pubspec.yaml | 4 +- 10 files changed, 143 insertions(+), 138 deletions(-) create mode 100644 pkgs/csslib/CHANGELOG.md diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md new file mode 100644 index 000000000..c466bd0f8 --- /dev/null +++ b/pkgs/csslib/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.11.0 + +* Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan` class. diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index 2d94e5c33..73400bc2a 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -7,7 +7,7 @@ library css; import 'dart:io'; import 'package:path/path.dart' as path; -import 'package:source_maps/span.dart' show SourceFile; +import 'package:source_span/source_span.dart'; import 'parser.dart'; import 'visitor.dart'; @@ -36,7 +36,7 @@ void _compile(String inputPath, bool verbose) { // Read the file. var filename = path.basename(inputPath); var contents = new File(inputPath).readAsStringSync(); - var file = new SourceFile.text(inputPath, contents); + var file = new SourceFile(contents, url: path.toUri(inputPath)); // Parse the CSS. var tree = _time('Parse $filename', diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 272268b5c..059b75c6b 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -6,7 +6,7 @@ library csslib.parser; import 'dart:math' as math; -import 'package:source_maps/span.dart' show SourceFile, Span, FileSpan; +import 'package:source_span/source_span.dart'; import "visitor.dart"; import 'src/messages.dart'; @@ -59,7 +59,7 @@ StyleSheet compile(input, {List errors, List options, _createMessages(errors: errors, options: options); - var file = new SourceFile.text(null, source); + var file = new SourceFile(source); var tree = new _Parser(file, source).parse(); @@ -91,7 +91,7 @@ StyleSheet parse(input, {List errors, List options}) { _createMessages(errors: errors, options: options); - var file = new SourceFile.text(null, source); + var file = new SourceFile(source); return new _Parser(file, source).parse(); } @@ -106,7 +106,7 @@ StyleSheet selector(input, {List errors}) { _createMessages(errors: errors); - var file = new SourceFile.text(null, source); + var file = new SourceFile(source); return (new _Parser(file, source) ..tokenizer.inSelector = true) .parseSelector(); @@ -117,7 +117,7 @@ SelectorGroup parseSelectorGroup(input, {List errors}) { _createMessages(errors: errors); - var file = new SourceFile.text(null, source); + var file = new SourceFile(source); return (new _Parser(file, source) // TODO(jmesserly): this fix should be applied to the parser. It's tricky // because by the time the flag is set one token has already been fetched. @@ -320,21 +320,21 @@ class _Parser { _error(message, tok.span); } - void _error(String message, Span location) { + void _error(String message, SourceSpan location) { if (location == null) { location = _peekToken.span; } messages.error(message, location); } - void _warning(String message, Span location) { + void _warning(String message, SourceSpan location) { if (location == null) { location = _peekToken.span; } messages.warning(message, location); } - Span _makeSpan(int start) { + SourceSpan _makeSpan(int start) { // TODO(terry): there are places where we are creating spans before we eat // the tokens, so using _previousToken.end is not always valid. var end = _previousToken != null && _previousToken.end >= start @@ -942,7 +942,7 @@ class _Parser { return tokId; } - IncludeDirective processInclude(Span span, {bool eatSemiColon: true}) { + IncludeDirective processInclude(SourceSpan span, {bool eatSemiColon: true}) { /* Stylet grammar: * * @include IDENT [(args,...)]; @@ -2283,7 +2283,7 @@ class _Parser { } /** Process all dimension units. */ - LiteralTerm processDimension(Token t, var value, Span span) { + LiteralTerm processDimension(Token t, var value, SourceSpan span) { LiteralTerm term; var unitType = this._peek(); @@ -2538,7 +2538,7 @@ class _Parser { } } - HexColorTerm _parseHex(String hexText, Span span) { + HexColorTerm _parseHex(String hexText, SourceSpan span) { var hexValue = 0; for (var i = 0; i < hexText.length; i++) { diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 6c2ecbf6f..92f8451b7 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -5,7 +5,7 @@ library csslib.src.messages; import 'package:logging/logging.dart' show Level; -import 'package:source_maps/span.dart' show Span; +import 'package:source_span/source_span.dart'; import 'options.dart'; @@ -43,16 +43,16 @@ final Map _ERROR_LABEL = (() { class Message { final Level level; final String message; - final Span span; + final SourceSpan span; final bool useColors; - Message(this.level, this.message, {Span span, bool useColors: false}) + Message(this.level, this.message, {SourceSpan span, bool useColors: false}) : this.span = span, this.useColors = useColors; String toString() { var output = new StringBuffer(); bool colors = useColors && _ERROR_COLORS.containsKey(level); - var levelColor = _ERROR_COLORS[level]; + var levelColor = colors ? _ERROR_COLORS[level] : null; if (colors) output.write(levelColor); output..write(_ERROR_LABEL[level])..write(' '); if (colors) output.write(NO_COLOR); @@ -61,8 +61,7 @@ class Message { output.write(message); } else { output.write('on '); - output.write(span.getLocationMessage(message, useColors: colors, - color: levelColor)); + output.write(span.message(message, color: levelColor)); } return output.toString(); @@ -87,7 +86,7 @@ class Messages { : options = options != null ? options : new PreprocessorOptions(); /** Report a compile-time CSS error. */ - void error(String message, Span span) { + void error(String message, SourceSpan span) { var msg = new Message(Level.SEVERE, message, span: span, useColors: options.useColors); @@ -97,7 +96,7 @@ class Messages { } /** Report a compile-time CSS warning. */ - void warning(String message, Span span) { + void warning(String message, SourceSpan span) { if (options.warningsAsErrors) { error(message, span); } else { @@ -109,7 +108,7 @@ class Messages { } /** Report and informational message about what the compiler is doing. */ - void info(String message, Span span) { + void info(String message, SourceSpan span) { var msg = new Message(Level.INFO, message, span: span, useColors: options.useColors); diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index 7e70f88c0..75ae6c5fc 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -12,7 +12,7 @@ class Token { final int kind; /** The location where this token was parsed from. */ - final Span span; + final SourceSpan span; /** The start offset of this token. */ int get start => span.start.offset; @@ -43,13 +43,13 @@ class Token { /** A token containing a parsed literal value. */ class LiteralToken extends Token { var value; - LiteralToken(int kind, Span span, this.value) : super(kind, span); + LiteralToken(int kind, SourceSpan span, this.value) : super(kind, span); } /** A token containing error information. */ class ErrorToken extends Token { String message; - ErrorToken(int kind, Span span, this.message) : super(kind, span); + ErrorToken(int kind, SourceSpan span, this.message) : super(kind, span); } /** @@ -61,6 +61,6 @@ class ErrorToken extends Token { class IdentifierToken extends Token { final String text; - IdentifierToken(this.text, int kind, Span span) + IdentifierToken(this.text, int kind, SourceSpan span) : super(kind, span); } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index c5275fdc2..53a5f9f05 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -11,7 +11,7 @@ part of csslib.visitor; class Identifier extends TreeNode { String name; - Identifier(this.name, Span span): super(span); + Identifier(this.name, SourceSpan span): super(span); Identifier clone() => new Identifier(name, span); @@ -21,7 +21,7 @@ class Identifier extends TreeNode { } class Wildcard extends TreeNode { - Wildcard(Span span): super(span); + Wildcard(SourceSpan span): super(span); Wildcard clone() => new Wildcard(span); visit(VisitorBase visitor) => visitor.visitWildcard(this); @@ -29,7 +29,7 @@ class Wildcard extends TreeNode { } class ThisOperator extends TreeNode { - ThisOperator(Span span): super(span); + ThisOperator(SourceSpan span): super(span); ThisOperator clone() => new ThisOperator(span); visit(VisitorBase visitor) => visitor.visitThisOperator(this); @@ -37,7 +37,7 @@ class ThisOperator extends TreeNode { } class Negation extends TreeNode { - Negation(Span span): super(span); + Negation(SourceSpan span): super(span); Negation clone() => new Negation(span); visit(VisitorBase visitor) => visitor.visitNegation(this); @@ -48,14 +48,14 @@ class Negation extends TreeNode { class CssComment extends TreeNode { final String comment; - CssComment(this.comment, Span span): super(span); + CssComment(this.comment, SourceSpan span): super(span); CssComment clone() => new CssComment(comment, span); visit(VisitorBase visitor) => visitor.visitCssComment(this); } // CDO/CDC (Comment Definition Open ). class CommentDefinition extends CssComment { - CommentDefinition(String comment, Span span): super(comment, span); + CommentDefinition(String comment, SourceSpan span): super(comment, span); CommentDefinition clone() => new CommentDefinition(comment, span); visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); } @@ -63,7 +63,7 @@ class CommentDefinition extends CssComment { class SelectorGroup extends TreeNode { final List selectors; - SelectorGroup(this.selectors, Span span): super(span); + SelectorGroup(this.selectors, SourceSpan span): super(span); SelectorGroup clone() => new SelectorGroup(selectors, span); @@ -73,7 +73,7 @@ class SelectorGroup extends TreeNode { class Selector extends TreeNode { final List simpleSelectorSequences; - Selector(this.simpleSelectorSequences, Span span) : super(span); + Selector(this.simpleSelectorSequences, SourceSpan span) : super(span); void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq); @@ -95,7 +95,7 @@ class SimpleSelectorSequence extends TreeNode { int combinator; final SimpleSelector simpleSelector; - SimpleSelectorSequence(this.simpleSelector, Span span, + SimpleSelectorSequence(this.simpleSelector, SourceSpan span, [int combinator = TokenKind.COMBINATOR_NONE]) : combinator = combinator, super(span); @@ -126,7 +126,7 @@ class SimpleSelectorSequence extends TreeNode { abstract class SimpleSelector extends TreeNode { final _name; // Wildcard, ThisOperator, Identifier, Negation, others? - SimpleSelector(this._name, Span span) : super(span); + SimpleSelector(this._name, SourceSpan span) : super(span); String get name => _name.name; @@ -139,7 +139,7 @@ abstract class SimpleSelector extends TreeNode { // element name class ElementSelector extends SimpleSelector { - ElementSelector(name, Span span) : super(name, span); + ElementSelector(name, SourceSpan span) : super(name, span); visit(VisitorBase visitor) => visitor.visitElementSelector(this); ElementSelector clone() => new ElementSelector(_name, span); @@ -151,7 +151,8 @@ class ElementSelector extends SimpleSelector { class NamespaceSelector extends SimpleSelector { final _namespace; // null, Wildcard or Identifier - NamespaceSelector(this._namespace, var name, Span span) : super(name, span); + NamespaceSelector(this._namespace, var name, SourceSpan span) + : super(name, span); String get namespace => _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name; @@ -173,7 +174,7 @@ class AttributeSelector extends SimpleSelector { final _value; AttributeSelector(Identifier name, this._op, this._value, - Span span) : super(name, span); + SourceSpan span) : super(name, span); int get operatorKind => _op; @@ -237,7 +238,7 @@ class AttributeSelector extends SimpleSelector { // #id class IdSelector extends SimpleSelector { - IdSelector(Identifier name, Span span) : super(name, span); + IdSelector(Identifier name, SourceSpan span) : super(name, span); IdSelector clone() => new IdSelector(_name, span); visit(VisitorBase visitor) => visitor.visitIdSelector(this); @@ -246,7 +247,7 @@ class IdSelector extends SimpleSelector { // .class class ClassSelector extends SimpleSelector { - ClassSelector(Identifier name, Span span) : super(name, span); + ClassSelector(Identifier name, SourceSpan span) : super(name, span); ClassSelector clone() => new ClassSelector(_name, span); visit(VisitorBase visitor) => visitor.visitClassSelector(this); @@ -255,7 +256,7 @@ class ClassSelector extends SimpleSelector { // :pseudoClass class PseudoClassSelector extends SimpleSelector { - PseudoClassSelector(Identifier name, Span span) : super(name, span); + PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span); visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); PseudoClassSelector clone() => new PseudoClassSelector(_name, span); @@ -265,7 +266,7 @@ class PseudoClassSelector extends SimpleSelector { // ::pseudoElement class PseudoElementSelector extends SimpleSelector { - PseudoElementSelector(Identifier name, Span span) : super(name, span); + PseudoElementSelector(Identifier name, SourceSpan span) : super(name, span); visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); PseudoElementSelector clone() => new PseudoElementSelector(_name, span); @@ -277,7 +278,7 @@ class PseudoElementSelector extends SimpleSelector { class PseudoClassFunctionSelector extends PseudoClassSelector { final SelectorExpression expression; - PseudoClassFunctionSelector(Identifier name, this.expression, Span span) + PseudoClassFunctionSelector(Identifier name, this.expression, SourceSpan span) : super(name, span); PseudoClassFunctionSelector clone() => @@ -291,7 +292,8 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { class PseudoElementFunctionSelector extends PseudoElementSelector { final SelectorExpression expression; - PseudoElementFunctionSelector(Identifier name, this.expression, Span span) + PseudoElementFunctionSelector(Identifier name, this.expression, + SourceSpan span) : super(name, span); PseudoElementFunctionSelector clone() => @@ -304,7 +306,7 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { class SelectorExpression extends TreeNode { final List expressions; - SelectorExpression(this.expressions, Span span): super(span); + SelectorExpression(this.expressions, SourceSpan span): super(span); SelectorExpression clone() { return new SelectorExpression( @@ -318,7 +320,7 @@ class SelectorExpression extends TreeNode { class NegationSelector extends SimpleSelector { final SimpleSelector negationArg; - NegationSelector(this.negationArg, Span span) + NegationSelector(this.negationArg, SourceSpan span) : super(new Negation(span), span); NegationSelector clone() => new NegationSelector(negationArg, span); @@ -340,14 +342,14 @@ class StyleSheet extends TreeNode { */ final List topLevels; - StyleSheet(this.topLevels, Span span) : super(span) { + StyleSheet(this.topLevels, SourceSpan span) : super(span) { for (final node in topLevels) { assert(node is TopLevelProduction || node is Directive); } } /** Selectors only in this tree. */ - StyleSheet.selector(this.topLevels, Span span) : super(span); + StyleSheet.selector(this.topLevels, SourceSpan span) : super(span); StyleSheet clone() { var clonedTopLevels = topLevels.map((e) => e.clone()).toList(); @@ -358,7 +360,7 @@ class StyleSheet extends TreeNode { } class TopLevelProduction extends TreeNode { - TopLevelProduction(Span span) : super(span); + TopLevelProduction(SourceSpan span) : super(span); TopLevelProduction clone() => new TopLevelProduction(span); visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); } @@ -367,7 +369,8 @@ class RuleSet extends TopLevelProduction { final SelectorGroup _selectorGroup; final DeclarationGroup _declarationGroup; - RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span); + RuleSet(this._selectorGroup, this._declarationGroup, SourceSpan span) + : super(span); SelectorGroup get selectorGroup => _selectorGroup; DeclarationGroup get declarationGroup => _declarationGroup; @@ -382,7 +385,7 @@ class RuleSet extends TopLevelProduction { } class Directive extends TreeNode { - Directive(Span span) : super(span); + Directive(SourceSpan span) : super(span); bool get isBuiltIn => true; // Known CSS directive? bool get isExtension => false; // SCSS extension? @@ -398,7 +401,8 @@ class ImportDirective extends Directive { /** Any media queries for this import. */ final List mediaQueries; - ImportDirective(this.import, this.mediaQueries, Span span) : super(span); + ImportDirective(this.import, this.mediaQueries, SourceSpan span) + : super(span); ImportDirective clone() { var cloneMediaQueries = []; @@ -420,7 +424,8 @@ class MediaExpression extends TreeNode { final Identifier _mediaFeature; final Expressions exprs; - MediaExpression(this.andOperator, this._mediaFeature, this.exprs, Span span) + MediaExpression(this.andOperator, this._mediaFeature, this.exprs, + SourceSpan span) : super(span); String get mediaFeature => _mediaFeature.name; @@ -450,7 +455,8 @@ class MediaQuery extends TreeNode { final Identifier _mediaType; final List expressions; - MediaQuery(this._mediaUnary, this._mediaType, this.expressions, Span span) + MediaQuery(this._mediaUnary, this._mediaType, this.expressions, + SourceSpan span) : super(span); bool get hasMediaType => _mediaType != null; @@ -474,7 +480,8 @@ class MediaDirective extends Directive { final List mediaQueries; final List rulesets; - MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span); + MediaDirective(this.mediaQueries, this.rulesets, SourceSpan span) + : super(span); MediaDirective clone() { var cloneQueries = []; @@ -494,7 +501,7 @@ class MediaDirective extends Directive { class HostDirective extends Directive { final List rulesets; - HostDirective(this.rulesets, Span span) : super(span); + HostDirective(this.rulesets, SourceSpan span) : super(span); HostDirective clone() { var cloneRulesets = []; @@ -513,7 +520,7 @@ class PageDirective extends Directive { final List _declsMargin; PageDirective(this._ident, this._pseudoPage, this._declsMargin, - Span span) : super(span); + SourceSpan span) : super(span); PageDirective clone() { var cloneDeclsMargin = []; @@ -532,7 +539,7 @@ class PageDirective extends Directive { class CharsetDirective extends Directive { final String charEncoding; - CharsetDirective(this.charEncoding, Span span) : super(span); + CharsetDirective(this.charEncoding, SourceSpan span) : super(span); CharsetDirective clone() => new CharsetDirective(charEncoding, span); visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); } @@ -545,7 +552,7 @@ class KeyFrameDirective extends Directive { final name; final List _blocks; - KeyFrameDirective(this._keyframeName, this.name, Span span) + KeyFrameDirective(this._keyframeName, this.name, SourceSpan span) : _blocks = [], super(span); add(KeyFrameBlock block) { @@ -577,7 +584,7 @@ class KeyFrameBlock extends Expression { final Expressions _blockSelectors; final DeclarationGroup _declarations; - KeyFrameBlock(this._blockSelectors, this._declarations, Span span) + KeyFrameBlock(this._blockSelectors, this._declarations, SourceSpan span) : super(span); KeyFrameBlock clone() => @@ -588,7 +595,7 @@ class KeyFrameBlock extends Expression { class FontFaceDirective extends Directive { final DeclarationGroup _declarations; - FontFaceDirective(this._declarations, Span span) : super(span); + FontFaceDirective(this._declarations, SourceSpan span) : super(span); FontFaceDirective clone() => new FontFaceDirective(_declarations.clone(), span); @@ -599,7 +606,8 @@ class StyletDirective extends Directive { final String dartClassName; final List rulesets; - StyletDirective(this.dartClassName, this.rulesets, Span span) : super(span); + StyletDirective(this.dartClassName, this.rulesets, SourceSpan span) + : super(span); bool get isBuiltIn => false; bool get isExtension => true; @@ -622,7 +630,7 @@ class NamespaceDirective extends Directive { /** URI associated with this namespace. */ final String _uri; - NamespaceDirective(this._prefix, this._uri, Span span) : super(span); + NamespaceDirective(this._prefix, this._uri, SourceSpan span) : super(span); NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); @@ -635,7 +643,7 @@ class NamespaceDirective extends Directive { class VarDefinitionDirective extends Directive { final VarDefinition def; - VarDefinitionDirective(this.def, Span span) : super(span); + VarDefinitionDirective(this.def, SourceSpan span) : super(span); VarDefinitionDirective clone() => new VarDefinitionDirective(def.clone(), span); @@ -648,7 +656,7 @@ class MixinDefinition extends Directive { final List definedArgs; final bool varArgs; - MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span) + MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span) : super(span); MixinDefinition clone() { @@ -667,7 +675,7 @@ class MixinRulesetDirective extends MixinDefinition { final List rulesets; MixinRulesetDirective(String name, List args, - bool varArgs, this.rulesets, Span span) : + bool varArgs, this.rulesets, SourceSpan span) : super(name, args, varArgs, span); MixinRulesetDirective clone() { @@ -690,7 +698,7 @@ class MixinDeclarationDirective extends MixinDefinition { final DeclarationGroup declarations; MixinDeclarationDirective(String name, List args, - bool varArgs, this.declarations, Span span) : + bool varArgs, this.declarations, SourceSpan span) : super(name, args, varArgs, span); MixinDeclarationDirective clone() { @@ -710,7 +718,7 @@ class IncludeDirective extends Directive { final String name; final List> args; - IncludeDirective(this.name, this.args, Span span) : super(span); + IncludeDirective(this.name, this.args, SourceSpan span) : super(span); IncludeDirective clone() { var cloneArgs = []; @@ -727,7 +735,7 @@ class IncludeDirective extends Directive { /** To support SASS @content. */ class ContentDirective extends Directive { - ContentDirective(Span span) : super(span); + ContentDirective(SourceSpan span) : super(span); visit(VisitorBase visitor) => visitor.visitContentDirective(this); } @@ -749,7 +757,7 @@ class Declaration extends TreeNode { */ final bool isIE7; - Declaration(this._property, this._expression, this.dartStyle, Span span, + Declaration(this._property, this._expression, this.dartStyle, SourceSpan span, {important: false, ie7: false}) : this.important = important, this.isIE7 = ie7, super(span); @@ -774,7 +782,7 @@ class Declaration extends TreeNode { class VarDefinition extends Declaration { bool badUsage = false; - VarDefinition(Identifier definedName, Expression expr, Span span) + VarDefinition(Identifier definedName, Expression expr, SourceSpan span) : super(definedName, expr, null, span); String get definedName => _property.name; @@ -796,7 +804,7 @@ class VarDefinition extends Declaration { class IncludeMixinAtDeclaration extends Declaration { final IncludeDirective include; - IncludeMixinAtDeclaration(this.include, Span span) + IncludeMixinAtDeclaration(this.include, SourceSpan span) : super(null, null, null, span); IncludeMixinAtDeclaration clone() => @@ -809,7 +817,7 @@ class IncludeMixinAtDeclaration extends Declaration { class ExtendDeclaration extends Declaration { final List selectors; - ExtendDeclaration(this.selectors, Span span) : + ExtendDeclaration(this.selectors, SourceSpan span) : super(null, null, null, span); ExtendDeclaration clone() { @@ -824,7 +832,7 @@ class DeclarationGroup extends TreeNode { /** Can be either Declaration or RuleSet (if nested selector). */ final List declarations; - DeclarationGroup(this.declarations, Span span) : super(span); + DeclarationGroup(this.declarations, SourceSpan span) : super(span); DeclarationGroup clone() { var clonedDecls = declarations.map((d) => d.clone()).toList(); @@ -837,7 +845,7 @@ class DeclarationGroup extends TreeNode { class MarginGroup extends DeclarationGroup { final int margin_sym; // TokenType for for @margin sym. - MarginGroup(this.margin_sym, List decls, Span span) + MarginGroup(this.margin_sym, List decls, SourceSpan span) : super(decls, span); MarginGroup clone() => new MarginGroup(margin_sym, super.clone() as dynamic, span); @@ -848,7 +856,7 @@ class VarUsage extends Expression { final String name; final List defaultValues; - VarUsage(this.name, this.defaultValues, Span span) : super(span); + VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span); VarUsage clone() { var clonedValues = []; @@ -862,25 +870,25 @@ class VarUsage extends Expression { } class OperatorSlash extends Expression { - OperatorSlash(Span span) : super(span); + OperatorSlash(SourceSpan span) : super(span); OperatorSlash clone() => new OperatorSlash(span); visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); } class OperatorComma extends Expression { - OperatorComma(Span span) : super(span); + OperatorComma(SourceSpan span) : super(span); OperatorComma clone() => new OperatorComma(span); visit(VisitorBase visitor) => visitor.visitOperatorComma(this); } class OperatorPlus extends Expression { - OperatorPlus(Span span) : super(span); + OperatorPlus(SourceSpan span) : super(span); OperatorPlus clone() => new OperatorPlus(span); visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); } class OperatorMinus extends Expression { - OperatorMinus(Span span) : super(span); + OperatorMinus(SourceSpan span) : super(span); OperatorMinus clone() => new OperatorMinus(span); visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); } @@ -889,7 +897,7 @@ class UnicodeRangeTerm extends Expression { final String first; final String second; - UnicodeRangeTerm(this.first, this.second, Span span) : super(span); + UnicodeRangeTerm(this.first, this.second, SourceSpan span) : super(span); bool get hasSecond => second != null; @@ -905,7 +913,7 @@ class LiteralTerm extends Expression { dynamic value; String text; - LiteralTerm(this.value, this.text, Span span) : super(span); + LiteralTerm(this.value, this.text, SourceSpan span) : super(span); LiteralTerm clone() => new LiteralTerm(value, text, span); @@ -913,7 +921,7 @@ class LiteralTerm extends Expression { } class NumberTerm extends LiteralTerm { - NumberTerm(value, String t, Span span) : super(value, t, span); + NumberTerm(value, String t, SourceSpan span) : super(value, t, span); NumberTerm clone() => new NumberTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitNumberTerm(this); } @@ -921,7 +929,7 @@ class NumberTerm extends LiteralTerm { class UnitTerm extends LiteralTerm { final int unit; - UnitTerm(value, String t, Span span, this.unit) : super(value, t, span); + UnitTerm(value, String t, SourceSpan span, this.unit) : super(value, t, span); UnitTerm clone() => new UnitTerm(value, text, span, unit); @@ -933,7 +941,7 @@ class UnitTerm extends LiteralTerm { } class LengthTerm extends UnitTerm { - LengthTerm(value, String t, Span span, + LengthTerm(value, String t, SourceSpan span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(this.unit == TokenKind.UNIT_LENGTH_PX || this.unit == TokenKind.UNIT_LENGTH_CM || @@ -947,25 +955,25 @@ class LengthTerm extends UnitTerm { } class PercentageTerm extends LiteralTerm { - PercentageTerm(value, String t, Span span) : super(value, t, span); + PercentageTerm(value, String t, SourceSpan span) : super(value, t, span); PercentageTerm clone() => new PercentageTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); } class EmTerm extends LiteralTerm { - EmTerm(value, String t, Span span) : super(value, t, span); + EmTerm(value, String t, SourceSpan span) : super(value, t, span); EmTerm clone() => new EmTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitEmTerm(this); } class ExTerm extends LiteralTerm { - ExTerm(value, String t, Span span) : super(value, t, span); + ExTerm(value, String t, SourceSpan span) : super(value, t, span); ExTerm clone() => new ExTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitExTerm(this); } class AngleTerm extends UnitTerm { - AngleTerm(var value, String t, Span span, + AngleTerm(var value, String t, SourceSpan span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(this.unit == TokenKind.UNIT_ANGLE_DEG || this.unit == TokenKind.UNIT_ANGLE_RAD || @@ -978,7 +986,7 @@ class AngleTerm extends UnitTerm { } class TimeTerm extends UnitTerm { - TimeTerm(var value, String t, Span span, + TimeTerm(var value, String t, SourceSpan span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(this.unit == TokenKind.UNIT_ANGLE_DEG || this.unit == TokenKind.UNIT_TIME_MS || @@ -990,7 +998,7 @@ class TimeTerm extends UnitTerm { } class FreqTerm extends UnitTerm { - FreqTerm(var value, String t, Span span, + FreqTerm(var value, String t, SourceSpan span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); } @@ -1000,21 +1008,21 @@ class FreqTerm extends UnitTerm { } class FractionTerm extends LiteralTerm { - FractionTerm(var value, String t, Span span) : super(value, t, span); + FractionTerm(var value, String t, SourceSpan span) : super(value, t, span); FractionTerm clone() => new FractionTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitFractionTerm(this); } class UriTerm extends LiteralTerm { - UriTerm(String value, Span span) : super(value, value, span); + UriTerm(String value, SourceSpan span) : super(value, value, span); UriTerm clone() => new UriTerm(value, span); visit(VisitorBase visitor) => visitor.visitUriTerm(this); } class ResolutionTerm extends UnitTerm { - ResolutionTerm(var value, String t, Span span, + ResolutionTerm(var value, String t, SourceSpan span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_RESOLUTION_DPI || unit == TokenKind.UNIT_RESOLUTION_DPCM || @@ -1026,7 +1034,7 @@ class ResolutionTerm extends UnitTerm { } class ChTerm extends UnitTerm { - ChTerm(var value, String t, Span span, + ChTerm(var value, String t, SourceSpan span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_CH); } @@ -1036,7 +1044,7 @@ class ChTerm extends UnitTerm { } class RemTerm extends UnitTerm { - RemTerm(var value, String t, Span span, + RemTerm(var value, String t, SourceSpan span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_REM); } @@ -1046,7 +1054,7 @@ class RemTerm extends UnitTerm { } class ViewportTerm extends UnitTerm { - ViewportTerm(var value, String t, Span span, + ViewportTerm(var value, String t, SourceSpan span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_VIEWPORT_VW || unit == TokenKind.UNIT_VIEWPORT_VH || @@ -1062,7 +1070,7 @@ class ViewportTerm extends UnitTerm { class BAD_HEX_VALUE { } class HexColorTerm extends LiteralTerm { - HexColorTerm(var value, String t, Span span) : super(value, t, span); + HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span); HexColorTerm clone() => new HexColorTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); @@ -1071,7 +1079,7 @@ class HexColorTerm extends LiteralTerm { class FunctionTerm extends LiteralTerm { final Expressions _params; - FunctionTerm(var value, String t, this._params, Span span) + FunctionTerm(var value, String t, this._params, SourceSpan span) : super(value, t, span); FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span); @@ -1084,7 +1092,7 @@ class FunctionTerm extends LiteralTerm { * browsers. */ class IE8Term extends LiteralTerm { - IE8Term(Span span) : super('\\9', '\\9', span); + IE8Term(SourceSpan span) : super('\\9', '\\9', span); IE8Term clone() => new IE8Term(span); visit(VisitorBase visitor) => visitor.visitIE8Term(this); } @@ -1092,7 +1100,7 @@ class IE8Term extends LiteralTerm { class GroupTerm extends Expression { final List _terms; - GroupTerm(Span span) : _terms = [], super(span); + GroupTerm(SourceSpan span) : _terms = [], super(span); void add(LiteralTerm term) { _terms.add(term); @@ -1103,7 +1111,7 @@ class GroupTerm extends Expression { } class ItemTerm extends NumberTerm { - ItemTerm(var value, String t, Span span) : super(value, t, span); + ItemTerm(var value, String t, SourceSpan span) : super(value, t, span); ItemTerm clone() => new ItemTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitItemTerm(this); @@ -1112,7 +1120,7 @@ class ItemTerm extends NumberTerm { class Expressions extends Expression { final List expressions = []; - Expressions(Span span): super(span); + Expressions(SourceSpan span): super(span); void add(Expression expression) { expressions.add(expression); @@ -1133,7 +1141,7 @@ class BinaryExpression extends Expression { final Expression x; final Expression y; - BinaryExpression(this.op, this.x, this.y, Span span): super(span); + BinaryExpression(this.op, this.x, this.y, SourceSpan span): super(span); BinaryExpression clone() => new BinaryExpression(op, x.clone(), y.clone(), span); @@ -1144,7 +1152,7 @@ class UnaryExpression extends Expression { final Token op; final Expression self; - UnaryExpression(this.op, this.self, Span span): super(span); + UnaryExpression(this.op, this.self, SourceSpan span): super(span); UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); @@ -1162,7 +1170,7 @@ abstract class DartStyleExpression extends TreeNode { final int _styleType; int priority; - DartStyleExpression(this._styleType, Span span) : super(span); + DartStyleExpression(this._styleType, SourceSpan span) : super(span); /* * Merges give 2 DartStyleExpression (or derived from DartStyleExpression, @@ -1191,7 +1199,7 @@ class FontExpression extends DartStyleExpression { // font-style font-variant font-weight font-size/line-height font-family // TODO(terry): Only px/pt for now need to handle all possible units to // support calc expressions on units. - FontExpression(Span span, {dynamic size, List family, + FontExpression(SourceSpan span, {dynamic size, List family, int weight, String style, String variant, LineHeight lineHeight}) : font = new Font(size : size is LengthTerm ? size.value : size, family: family, weight: weight, style: style, variant: variant, @@ -1213,7 +1221,7 @@ class FontExpression extends DartStyleExpression { return new FontExpression._merge(x, y, y.span); } - FontExpression._merge(FontExpression x, FontExpression y, Span span) + FontExpression._merge(FontExpression x, FontExpression y, SourceSpan span) : super(DartStyleExpression.fontStyle, span), font = new Font.merge(x.font, y.font); @@ -1228,7 +1236,7 @@ class FontExpression extends DartStyleExpression { abstract class BoxExpression extends DartStyleExpression { final BoxEdge box; - BoxExpression(int styleType, Span span, this.box) + BoxExpression(int styleType, SourceSpan span, this.box) : super(styleType, span); /* @@ -1257,11 +1265,11 @@ abstract class BoxExpression extends DartStyleExpression { class MarginExpression extends BoxExpression { // TODO(terry): Does auto for margin need to be exposed to Dart UI framework? /** Margin expression ripped apart. */ - MarginExpression(Span span, {num top, num right, num bottom, num left}) + MarginExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.marginStyle, span, new BoxEdge(left, top, right, bottom)); - MarginExpression.boxEdge(Span span, BoxEdge box) + MarginExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.marginStyle, span, box); merged(MarginExpression newMarginExpr) { @@ -1279,7 +1287,8 @@ class MarginExpression extends BoxExpression { return new MarginExpression._merge(x, y, y.span); } - MarginExpression._merge(MarginExpression x, MarginExpression y, Span span) + MarginExpression._merge(MarginExpression x, MarginExpression y, + SourceSpan span) : super(x._styleType, span, new BoxEdge.merge(x.box, y.box)); MarginExpression clone() => @@ -1291,11 +1300,11 @@ class MarginExpression extends BoxExpression { class BorderExpression extends BoxExpression { /** Border expression ripped apart. */ - BorderExpression(Span span, {num top, num right, num bottom, num left}) + BorderExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.borderStyle, span, new BoxEdge(left, top, right, bottom)); - BorderExpression.boxEdge(Span span, BoxEdge box) + BorderExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.borderStyle, span, box); merged(BorderExpression newBorderExpr) { @@ -1314,7 +1323,7 @@ class BorderExpression extends BoxExpression { } BorderExpression._merge(BorderExpression x, BorderExpression y, - Span span) + SourceSpan span) : super(DartStyleExpression.borderStyle, span, new BoxEdge.merge(x.box, y.box)); @@ -1328,7 +1337,7 @@ class BorderExpression extends BoxExpression { class HeightExpression extends DartStyleExpression { final height; - HeightExpression(Span span, this.height) + HeightExpression(SourceSpan span, this.height) : super(DartStyleExpression.heightStyle, span); merged(HeightExpression newHeightExpr) { @@ -1346,7 +1355,7 @@ class HeightExpression extends DartStyleExpression { class WidthExpression extends DartStyleExpression { final width; - WidthExpression(Span span, this.width) + WidthExpression(SourceSpan span, this.width) : super(DartStyleExpression.widthStyle, span); merged(WidthExpression newWidthExpr) { @@ -1363,11 +1372,11 @@ class WidthExpression extends DartStyleExpression { class PaddingExpression extends BoxExpression { /** Padding expression ripped apart. */ - PaddingExpression(Span span, {num top, num right, num bottom, num left}) + PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.paddingStyle, span, new BoxEdge(left, top, right, bottom)); - PaddingExpression.boxEdge(Span span, BoxEdge box) + PaddingExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.paddingStyle, span, box); merged(PaddingExpression newPaddingExpr) { @@ -1385,7 +1394,8 @@ class PaddingExpression extends BoxExpression { return new PaddingExpression._merge(x, y, y.span); } - PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span) + PaddingExpression._merge(PaddingExpression x, PaddingExpression y, + SourceSpan span) : super(DartStyleExpression.paddingStyle, span, new BoxEdge.merge(x.box, y.box)); diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 6dc27b18e..35aef13d1 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -9,7 +9,7 @@ part of csslib.visitor; */ abstract class TreeNode { /** The source code this [TreeNode] represents. */ - final Span span; + final SourceSpan span; TreeNode(this.span); @@ -29,7 +29,7 @@ abstract class TreeNode { /** The base type for expressions. */ abstract class Expression extends TreeNode { - Expression(Span span): super(span); + Expression(SourceSpan span): super(span); } /** Simple class to provide a textual dump of trees for debugging. */ @@ -53,7 +53,7 @@ class TreeOutput { void heading(String name, [span]) { write(name); if (span != null) { - buf.write(' (${span.getLocationMessage('')})'); + buf.write(' (${span.message('')})'); } buf.write('\n'); } diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index d85c341f7..bc3a6ad59 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -5,19 +5,12 @@ library csslib.src.validate; import 'package:csslib/visitor.dart'; -import 'package:source_maps/span.dart' show Span; +import 'package:source_span/source_span.dart'; /** Can be thrown on any Css runtime problem includes source location. */ -class CssSelectorException implements Exception { - final String _message; - final Span _span; - - CssSelectorException(this._message, [this._span]); - - String toString() { - var msg = _span == null ? _message : _span.getLocationMessage(_message); - return 'CssSelectorException: $msg'; - } +class CssSelectorException extends SourceSpanException { + CssSelectorException(String message, [SourceSpan span]) + : super(message, span); } List classes = []; diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 8174af923..aac7242e0 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -4,7 +4,7 @@ library csslib.visitor; -import 'package:source_maps/span.dart' show Span; +import 'package:source_span/source_span.dart'; import 'parser.dart'; part 'src/css_printer.dart'; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index e1d0afe98..3ef6ed4f5 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.10.0+1 +version: 0.11.0 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org @@ -9,7 +9,7 @@ dependencies: args: '>=0.9.0 <0.13.0' logging: '>=0.9.0 <0.10.0' path: '>=0.9.0 <2.0.0' - source_maps: '>=0.9.1 <0.10.0' + source_span: '>=1.0.0 <2.0.0' dev_dependencies: browser: '>=0.9.0 <0.10.0' unittest: '>=0.9.0 <0.10.0' From 222b18f11dad1f7ae9e135e30b21af4537256506 Mon Sep 17 00:00:00 2001 From: "nweiz@google.com" Date: Wed, 30 Jul 2014 21:30:35 +0000 Subject: [PATCH 028/245] Fix csslib test failures on IE10. This will release csslib 0.11.0+1. BUG=20274 R=sigmund@google.com Review URL: https://codereview.chromium.org//432513003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@38753 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/lib/src/token.dart | 2 +- pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/mixin_test.dart | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index c466bd0f8..642ed5962 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.11.0+1 + +* Fix a test that was failing on IE10. + ## 0.11.0 * Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan` class. diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index 75ae6c5fc..debd30145 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -28,7 +28,7 @@ class Token { /** Returns a pretty representation of this token for error messages. **/ String toString() { var kindText = TokenKind.kindToString(kind); - var actualText = text; + var actualText = text.trim(); if (kindText != actualText) { if (actualText.length > 10) { actualText = '${actualText.substring(0, 8)}...'; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 3ef6ed4f5..d3962cfd9 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.11.0 +version: 0.11.0+1 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 853dfc421..6d3b71e0a 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -617,7 +617,7 @@ foo { expect(error.span.start.line, 9); expect(error.span.end.offset, 83); error = errors[3]; - expect(error.message, 'expected {, but found end of file(\n)'); + expect(error.message, 'expected {, but found end of file()'); expect(error.span.start.line, 9); expect(error.span.end.offset, 86); error = errors[4]; From b4d1ac6647de8e7e7b8882cf910b35d5d2546a44 Mon Sep 17 00:00:00 2001 From: "nweiz@google.com" Date: Wed, 30 Jul 2014 23:42:03 +0000 Subject: [PATCH 029/245] Fix another csslib IE10 test failure. R=sigmund@google.com Review URL: https://codereview.chromium.org//428323003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@38763 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/declaration_test.dart | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 642ed5962..392de58dc 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.11.0+2 + +* Fix another test that was failing on IE10. + ## 0.11.0+1 * Fix a test that was failing on IE10. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index d3962cfd9..46c34cb27 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.11.0+1 +version: 0.11.0+2 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index ce46f5d02..857df4873 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -1012,7 +1012,7 @@ void testHangs() { expect(errorMessage.span, isNotNull); expect(errorMessage.span.start.line, 7); expect(errorMessage.span.start.column, 0); - expect(errorMessage.span.text, ''); + expect(errorMessage.span.text.trim(), ''); } main() { From 4b5569ee18b694cb10ef683bab390058c65a3e1f Mon Sep 17 00:00:00 2001 From: "nweiz@google.com" Date: Fri, 1 Aug 2014 20:52:15 +0000 Subject: [PATCH 030/245] Update my name in test data and comments. R=rnystrom@google.com BUG= Review URL: https://codereview.chromium.org//433753003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@38840 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/parser.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 059b75c6b..8fbf06e07 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1295,7 +1295,7 @@ class _Parser { * : '.' IDENT */ simpleSelector() { - // TODO(terry): Nathan makes a good point parsing of namespace and element + // TODO(terry): Natalie makes a good point parsing of namespace and element // are essentially the same (asterisk or identifier) other // than the error message for element. Should consolidate the // code. From 56c02971a51bc938d0d337e83661bab1221a7fda Mon Sep 17 00:00:00 2001 From: "srawlins@google.com" Date: Mon, 13 Oct 2014 18:00:33 +0000 Subject: [PATCH 031/245] I was looking at the typo in 19178, and then the TODO in hexToInt. int.parse gained its radix parameter in https://code.google.com/p/dart/issues/detail?id=2624 around Dart SDK v1.1, so I bumped it in the pubspec. Rewrite csslib's hexToInt BUG= https://code.google.com/p/dart/issues/detail?id=19178 R=terry@google.com Review URL: https://codereview.chromium.org//651823002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@41079 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/src/property.dart | 29 +---------------------------- pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 8dc4dcb41..777288a67 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -291,34 +291,7 @@ class Color implements _StyleProperty, ColorBase { } } - /** - * [hex] hexadecimal string to convert to scalar. - * returns hexadecimal number as an integer. - * throws BadNumberFormatException if [hex] isn't a valid hexadecimal number. - */ - // TODO(terry): Should be part of Dart standard library see bug - // - static int hexToInt(String hex) { - int val = 0; - - int len = hex.length; - for (int i = 0; i < len; i++) { - int hexDigit = hex.codeUnitAt(i); - if (hexDigit >= 48 && hexDigit <= 57) { - val += (hexDigit - 48) * (1 << (4 * (len - 1 - i))); - } else if (hexDigit >= 65 && hexDigit <= 70) { - // A..F - val += (hexDigit - 55) * (1 << (4 * (len - 1 - i))); - } else if (hexDigit >= 97 && hexDigit <= 102) { - // a..f - val += (hexDigit - 87) * (1 << (4 * (len - 1 - i))); - } else { - throw throw new FormatException("Bad hexadecimal value"); - } - } - - return val; - } + static int hexToInt(String hex) => int.parse(hex, radix: 16); static String convertToHexString(int r, int g, int b, [num a]) { String rHex = Color._numAs2DigitHex(Color._clamp(r, 0, 255)); diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 46c34cb27..1c18c708b 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -4,7 +4,7 @@ author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org environment: - sdk: '>=1.0.0 <2.0.0' + sdk: '>=1.1.0 <2.0.0' dependencies: args: '>=0.9.0 <0.13.0' logging: '>=0.9.0 <0.10.0' From 83255b5ef3f3c6873ee8bfb73658384bc590d9f4 Mon Sep 17 00:00:00 2001 From: "sra@google.com" Date: Fri, 24 Oct 2014 21:43:12 +0000 Subject: [PATCH 032/245] Initialize TokenizerBase int fields for better dart2js codegen. This change removes ~15k of needless receiver type checks from csslib due to inferred null values. BUG= R=terry@google.com Review URL: https://codereview.chromium.org//679773003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@41295 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/src/tokenizer_base.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index 07dee485d..5501e6c94 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -52,8 +52,8 @@ abstract class TokenizerBase { // http://dev.w3.org/csswg/selectors4/ bool inSelector = false; - int _index; - int _startIndex; + int _index = 0; + int _startIndex = 0; static const String _CDATA_START = ''; @@ -435,4 +435,3 @@ abstract class TokenizerBase { } } } - From f07efc9f162f1366e524de2b3612642bd303ed36 Mon Sep 17 00:00:00 2001 From: "sra@google.com" Date: Fri, 31 Oct 2014 01:29:06 +0000 Subject: [PATCH 033/245] Use a constant instead of int.parse("0x10ffff") BUG= R=terry@google.com Review URL: https://codereview.chromium.org//651513003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@41431 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/lib/parser.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 8fbf06e07..282fe591c 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2093,7 +2093,7 @@ class _Parser { return expressions; } - static final int MAX_UNICODE = int.parse('0x10FFFF'); + static const int MAX_UNICODE = 0x10FFFF; // Term grammar: // From d24b3fa8d87dda9b8c6e093ca7690eb440c4cb2b Mon Sep 17 00:00:00 2001 From: "nweiz@google.com" Date: Wed, 3 Dec 2014 00:21:09 +0000 Subject: [PATCH 034/245] Improve the speed and memory efficiency of csslib parsing. In particular, this avoids calling [FileSpan.start] and [FileSpan.end] where possible, since they lazily instantiate objects. R=sra@google.com Review URL: https://codereview.chromium.org//751453004 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@42080 260f80e4-7a28-3924-810f-c04153c831b5 --- pkgs/csslib/CHANGELOG.md | 4 ++ pkgs/csslib/lib/parser.dart | 104 ++++++++++++++++----------------- pkgs/csslib/lib/src/token.dart | 8 +-- pkgs/csslib/pubspec.yaml | 2 +- 4 files changed, 61 insertions(+), 57 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 392de58dc..7c044aae5 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.11.0+3 + +* Improve the speed and memory efficiency of parsing. + ## 0.11.0+2 * Fix another test that was failing on IE10. diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 282fe591c..606016694 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -196,7 +196,7 @@ class _Parser { StyleSheet parse() { List productions = []; - int start = _peekToken.start; + var start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) { // TODO(terry): Need to handle charset. var directive = processDirective(); @@ -222,7 +222,7 @@ class _Parser { StyleSheet parseSelector() { List productions = []; - int start = _peekToken.start; + var start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) { var selector = processSelector(); if (selector != null) { @@ -334,12 +334,14 @@ class _Parser { messages.warning(message, location); } - SourceSpan _makeSpan(int start) { + SourceSpan _makeSpan(FileSpan start) { // TODO(terry): there are places where we are creating spans before we eat - // the tokens, so using _previousToken.end is not always valid. - var end = _previousToken != null && _previousToken.end >= start - ? _previousToken.end : _peekToken.end; - return file.span(start, end); + // the tokens, so using _previousToken is not always valid. + // TODO(nweiz): use < rather than compareTo when SourceSpan supports it. + if (_previousToken == null || _previousToken.span.compareTo(start) < 0) { + return start; + } + return start.expand(_previousToken.span); } /////////////////////////////////////////////////////////////////// @@ -389,7 +391,7 @@ class _Parser { // Grammar: [ONLY | NOT]? S* media_type S* // [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]* - int start = _peekToken.start; + var start = _peekToken.span; // Is it a unary media operator? var op = _peekToken.text; @@ -408,7 +410,7 @@ class _Parser { } } _next(); - start = _peekToken.start; + start = _peekToken.span; } var type; @@ -441,14 +443,14 @@ class _Parser { } MediaExpression processMediaExpression([bool andOperator = false]) { - int start = _peekToken.start; + var start = _peekToken.span; // Grammar: '(' S* media_feature S* [ ':' S* expr ]? ')' S* if (_maybeEat(TokenKind.LPAREN)) { if (_peekIdentifier()) { var feature = identifier(); // Media feature. while (_maybeEat(TokenKind.COLON)) { - int startExpr = _peekToken.start; + var startExpr = _peekToken.span; var exprs = processExpr(); if (_maybeEat(TokenKind.RPAREN)) { return new MediaExpression(andOperator, feature, exprs, @@ -484,7 +486,7 @@ class _Parser { * content '@content' */ processDirective() { - int start = _peekToken.start; + var start = _peekToken.span; var tokId = processVariableOrDirective(); if (tokId is VarDefinitionDirective) return tokId; @@ -703,7 +705,7 @@ class _Parser { List productions = []; - start = _peekToken.start; + start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE)) { RuleSet ruleset = processRuleSet(); if (ruleset == null) { @@ -755,7 +757,7 @@ class _Parser { namespaceUri, _makeSpan(start)); case TokenKind.DIRECTIVE_MIXIN: - return processMixin(start); + return processMixin(); case TokenKind.DIRECTIVE_INCLUDE: return processInclude( _makeSpan(start)); @@ -778,7 +780,7 @@ class _Parser { * [ruleset | property | directive]* * '}' */ - MixinDefinition processMixin(int start) { + MixinDefinition processMixin() { _next(); var name = identifier(); @@ -793,7 +795,7 @@ class _Parser { if (varDef is VarDefinitionDirective || varDef is VarDefinition) { params.add(varDef); } else if (mustHaveParam) { - _warning("Expecting parameter", _makeSpan(_peekToken.start)); + _warning("Expecting parameter", _makeSpan(_peekToken.span)); keepGoing = false; } if (_maybeEat(TokenKind.COMMA)) { @@ -810,7 +812,7 @@ class _Parser { List declarations = []; var mixinDirective; - start = _peekToken.start; + var start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE)) { var directive = processDirective(); if (directive != null) { @@ -833,7 +835,7 @@ class _Parser { include.span)); } else { _warning("Error mixing of top-level vs declarations mixins", - _makeSpan(include)); + _makeSpan(include.span)); } }); declGroup.declarations.insertAll(0, newDecls); @@ -882,7 +884,7 @@ class _Parser { * return the token id of a directive or -1 if neither. */ processVariableOrDirective({bool mixinParameter: false}) { - int start = _peekToken.start; + var start = _peekToken.span; var tokId = _peek(); // Handle case for @ directive (where there's a whitespace between the @ @@ -1046,7 +1048,7 @@ class _Parser { } DeclarationGroup processDeclarations({bool checkBrace: true}) { - int start = _peekToken.start; + var start = _peekToken.span; if (checkBrace) _eat(TokenKind.LBRACE); @@ -1104,7 +1106,7 @@ class _Parser { List processMarginsDeclarations() { List groups = []; - int start = _peekToken.start; + var start = _peekToken.span; _eat(TokenKind.LBRACE); @@ -1189,7 +1191,7 @@ class _Parser { SelectorGroup processSelectorGroup() { List selectors = []; - int start = _peekToken.start; + var start = _peekToken.span; do { Selector selector = processSelector(); @@ -1208,7 +1210,7 @@ class _Parser { */ Selector processSelector() { var simpleSequences = []; - var start = _peekToken.start; + var start = _peekToken.span; while (true) { // First item is never descendant make sure it's COMBINATOR_NONE. var selectorItem = simpleSelectorSequence(simpleSequences.length == 0); @@ -1225,7 +1227,7 @@ class _Parser { } simpleSelectorSequence(bool forceCombinatorNone) { - var start = _peekToken.start; + var start = _peekToken.span; var combinatorType = TokenKind.COMBINATOR_NONE; var thisOperator = false; @@ -1301,12 +1303,12 @@ class _Parser { // code. // TODO(terry): Need to handle attribute namespace too. var first; - int start = _peekToken.start; + var start = _peekToken.span; switch (_peek()) { case TokenKind.ASTERISK: // Mark as universal namespace. var tok = _next(); - first = new Wildcard(_makeSpan(tok.start)); + first = new Wildcard(_makeSpan(tok.span)); break; case TokenKind.IDENTIFIER: first = identifier(); @@ -1329,7 +1331,7 @@ class _Parser { case TokenKind.ASTERISK: // Mark as universal element var tok = _next(); - element = new Wildcard(_makeSpan(tok.start)); + element = new Wildcard(_makeSpan(tok.span)); break; case TokenKind.IDENTIFIER: element = identifier(); @@ -1366,7 +1368,7 @@ class _Parser { */ simpleSelectorTail() { // Check for HASH | class | attrib | pseudo | negation - var start = _peekToken.start; + var start = _peekToken.span; switch (_peek()) { case TokenKind.HASH: _eat(TokenKind.HASH); @@ -1413,7 +1415,7 @@ class _Parser { } } - processPseudoSelector(int start) { + processPseudoSelector(FileSpan start) { // :pseudo-class ::pseudo-element // TODO(terry): '::' should be token. _eat(TokenKind.COLON); @@ -1492,7 +1494,7 @@ class _Parser { * NUMBER {num} */ processSelectorExpression() { - var start = _peekToken.start; + var start = _peekToken.span; var expressions = []; @@ -1503,12 +1505,12 @@ class _Parser { while (keepParsing) { switch (_peek()) { case TokenKind.PLUS: - start = _peekToken.start; + start = _peekToken.span; termToken = _next(); expressions.add(new OperatorPlus(_makeSpan(start))); break; case TokenKind.MINUS: - start = _peekToken.start; + start = _peekToken.span; termToken = _next(); expressions.add(new OperatorMinus(_makeSpan(start))); break; @@ -1573,7 +1575,7 @@ class _Parser { // // AttributeSelector processAttribute() { - var start = _peekToken.start; + var start = _peekToken.span; if (_maybeEat(TokenKind.LBRACK)) { var attrName = identifier(); @@ -1629,7 +1631,7 @@ class _Parser { Declaration processDeclaration(List dartStyles) { Declaration decl; - int start = _peekToken.start; + var start = _peekToken.span; // IE7 hack of * before property name if so the property is IE7 or below. var ie7 = _peekKind(TokenKind.ASTERISK); @@ -1681,7 +1683,7 @@ class _Parser { simpleSequences.add(selector); } if (_peekKind(TokenKind.COLON)) { - var pseudoSelector = processPseudoSelector(_peekToken.start); + var pseudoSelector = processPseudoSelector(_peekToken.span); if (pseudoSelector is PseudoElementSelector || pseudoSelector is PseudoClassSelector) { simpleSequences.add(pseudoSelector); @@ -2033,7 +2035,7 @@ class _Parser { // term: (see processTerm) // Expressions processExpr([bool ieFilter = false]) { - var start = _peekToken.start; + var start = _peekToken.span; var expressions = new Expressions(_makeSpan(start)); var keepGoing = true; @@ -2041,7 +2043,7 @@ class _Parser { while (keepGoing && (expr = processTerm(ieFilter)) != null) { var op; - var opStart = _peekToken.start; + var opStart = _peekToken.span; switch (_peek()) { case TokenKind.SLASH: @@ -2053,7 +2055,7 @@ class _Parser { case TokenKind.BACKSLASH: // Backslash outside of string; detected IE8 or older signaled by \9 at // end of an expression. - var ie8Start = _peekToken.start; + var ie8Start = _peekToken.span; _next(); if (_peekKind(TokenKind.INTEGER)) { @@ -2117,7 +2119,7 @@ class _Parser { // function: IDENT '(' expr ')' // processTerm([bool ieFilter = false]) { - var start = _peekToken.start; + var start = _peekToken.span; Token t; // token for term's value var value; // value of term (numeric values) @@ -2364,7 +2366,7 @@ class _Parser { } String processQuotedString([bool urlString = false]) { - var start = _peekToken.start; + var start = _peekToken.span; // URI term sucks up everything inside of quotes(' or ") or between parens var stopToken = urlString ? TokenKind.RPAREN : -1; @@ -2377,19 +2379,19 @@ class _Parser { switch (_peek()) { case TokenKind.SINGLE_QUOTE: stopToken = TokenKind.SINGLE_QUOTE; - start = _peekToken.start + 1; // Skip the quote might have whitespace. - _next(); // Skip the SINGLE_QUOTE. + _next(); // Skip the SINGLE_QUOTE. + start = _peekToken.span; break; case TokenKind.DOUBLE_QUOTE: stopToken = TokenKind.DOUBLE_QUOTE; - start = _peekToken.start + 1; // Skip the quote might have whitespace. - _next(); // Skip the DOUBLE_QUOTE. + _next(); // Skip the DOUBLE_QUOTE. + start = _peekToken.span; break; default: if (urlString) { if (_peek() == TokenKind.LPAREN) { _next(); // Skip the LPAREN. - start = _peekToken.start; + start = _peekToken.span; } stopToken = TokenKind.RPAREN; } else { @@ -2399,8 +2401,6 @@ class _Parser { } // Gobble up everything until we hit our stop token. - var runningStart = _peekToken.start; - var stringValue = new StringBuffer(); while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) { stringValue.write(_next().text); @@ -2426,7 +2426,7 @@ class _Parser { * We'll just parse everything after the 'progid:' look for the left paren * then parse to the right paren ignoring everything in between. */ - processIEFilter(int startAfterProgidColon) { + processIEFilter(FileSpan startAfterProgidColon) { var parens = 0; while (_peek() != TokenKind.END_OF_FILE) { @@ -2438,7 +2438,7 @@ class _Parser { case TokenKind.RPAREN: _eat(TokenKind.RPAREN); if (--parens == 0) { - var tok = tokenizer.makeIEFilter(startAfterProgidColon, + var tok = tokenizer.makeIEFilter(startAfterProgidColon.start.offset, _peekToken.start); return new LiteralTerm(tok.text, tok.text, tok.span); } @@ -2454,7 +2454,7 @@ class _Parser { // function: IDENT '(' expr ')' // processFunction(Identifier func) { - var start = _peekToken.start; + var start = _peekToken.span; var name = func.name; @@ -2519,10 +2519,10 @@ class _Parser { if (isChecked) { _warning('expected identifier, but found $tok', tok.span); } - return new Identifier("", _makeSpan(tok.start)); + return new Identifier("", _makeSpan(tok.span)); } - return new Identifier(tok.text, _makeSpan(tok.start)); + return new Identifier(tok.text, _makeSpan(tok.span)); } // TODO(terry): Move this to base <= 36 and into shared code. diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index debd30145..b78fbccc4 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -12,7 +12,7 @@ class Token { final int kind; /** The location where this token was parsed from. */ - final SourceSpan span; + final FileSpan span; /** The start offset of this token. */ int get start => span.start.offset; @@ -43,13 +43,13 @@ class Token { /** A token containing a parsed literal value. */ class LiteralToken extends Token { var value; - LiteralToken(int kind, SourceSpan span, this.value) : super(kind, span); + LiteralToken(int kind, FileSpan span, this.value) : super(kind, span); } /** A token containing error information. */ class ErrorToken extends Token { String message; - ErrorToken(int kind, SourceSpan span, this.message) : super(kind, span); + ErrorToken(int kind, FileSpan span, this.message) : super(kind, span); } /** @@ -61,6 +61,6 @@ class ErrorToken extends Token { class IdentifierToken extends Token { final String text; - IdentifierToken(this.text, int kind, SourceSpan span) + IdentifierToken(this.text, int kind, FileSpan span) : super(kind, span); } diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 1c18c708b..fdd238fb6 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.11.0+2 +version: 0.11.0+3 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://www.dartlang.org From 3be23bad68e133565bf2839846fd7f344a543c47 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Fri, 19 Dec 2014 13:30:00 -0800 Subject: [PATCH 035/245] Add gitignore, status, and codereview files. --- pkgs/csslib/.gitignore | 14 ++++++++++++++ pkgs/csslib/.status | 3 +++ pkgs/csslib/codereview.settings | 3 +++ 3 files changed, 20 insertions(+) create mode 100644 pkgs/csslib/.gitignore create mode 100644 pkgs/csslib/.status create mode 100644 pkgs/csslib/codereview.settings diff --git a/pkgs/csslib/.gitignore b/pkgs/csslib/.gitignore new file mode 100644 index 000000000..388eff0ba --- /dev/null +++ b/pkgs/csslib/.gitignore @@ -0,0 +1,14 @@ +# Don’t commit the following directories created by pub. +.buildlog +.pub/ +build/ +packages + +# Or the files created by dart2js. +*.dart.js +*.js_ +*.js.deps +*.js.map + +# Include when developing application packages. +pubspec.lock \ No newline at end of file diff --git a/pkgs/csslib/.status b/pkgs/csslib/.status new file mode 100644 index 000000000..e9f2b0049 --- /dev/null +++ b/pkgs/csslib/.status @@ -0,0 +1,3 @@ +# Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file +# for details. All rights reserved. Use of this source code is governed by a +# BSD-style license that can be found in the LICENSE file. diff --git a/pkgs/csslib/codereview.settings b/pkgs/csslib/codereview.settings new file mode 100644 index 000000000..904dba15a --- /dev/null +++ b/pkgs/csslib/codereview.settings @@ -0,0 +1,3 @@ +CODE_REVIEW_SERVER: http://codereview.chromium.org/ +VIEW_VC: https://github.com/dart-lang/csslib/commit/ +CC_LIST: reviews@dartlang.org \ No newline at end of file From b8259d9dcc357a5269392147ba39e13b5276b6cf Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Fri, 19 Dec 2014 13:30:11 -0800 Subject: [PATCH 036/245] Update the pubspec's homepage link. --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index fdd238fb6..462fde03c 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -2,7 +2,7 @@ name: csslib version: 0.11.0+3 author: Polymer.dart Team description: A library for parsing CSS. -homepage: https://www.dartlang.org +homepage: https://github.com/dart-lang/csslib environment: sdk: '>=1.1.0 <2.0.0' dependencies: From 5392493626b2dbf44c2f253a51894ff599531ab3 Mon Sep 17 00:00:00 2001 From: Jacob Richman Date: Mon, 2 Feb 2015 13:45:48 -0800 Subject: [PATCH 037/245] Cleanup some ambiguous and incorrect types and disable a case that in analyzer.dart that seems like it is broken. BUG= R=kevmoo@google.com Review URL: https://codereview.chromium.org//873313003 --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/lib/parser.dart | 4 ++-- pkgs/csslib/lib/src/analyzer.dart | 2 +- pkgs/csslib/lib/src/polyfill.dart | 4 ++-- pkgs/csslib/lib/src/property.dart | 10 ++++---- pkgs/csslib/lib/src/tree.dart | 39 ++++++++++++++----------------- pkgs/csslib/lib/visitor.dart | 2 +- pkgs/csslib/pubspec.yaml | 2 +- 8 files changed, 33 insertions(+), 34 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 7c044aae5..df9123c0b 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.11.0+4 + +* Cleanup some ambiguous and some incorrect type signatures. + ## 0.11.0+3 * Improve the speed and memory efficiency of parsing. diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 606016694..dce31b6b8 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -130,7 +130,7 @@ String _inputAsString(input) { if (input is String) { source = input; - } else if (input is List) { + } else if (input is List) { // TODO(terry): The parse function needs an "encoding" argument and will // default to whatever encoding CSS defaults to. // @@ -145,7 +145,7 @@ String _inputAsString(input) { // See encoding helpers at: package:html5lib/lib/src/char_encodings.dart // These helpers can decode in different formats given an encoding name // (mostly unicode, ascii, windows-1252 which is html5 default encoding). - source = new String.fromCharCodes(input); + source = new String.fromCharCodes(input as List); } else { // TODO(terry): Support RandomAccessFile using console. throw new ArgumentError("'source' must be a String or " diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 6758a2d66..da1a9fac5 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -595,7 +595,7 @@ class CallMixin extends Visitor { * Given a mixin's defined arguments return a cloned mixin defintion that has * replaced all defined arguments with user's supplied VarUsages. */ - MixinDefinition transform(List callArgs) { + MixinDefinition transform(List callArgs) { // TODO(terry): Handle default arguments and varArgs. // Transform mixin with callArgs. var index = 0; diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index ef3c7b97d..95749b9fe 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -144,7 +144,7 @@ class _VarDefAndUsage extends Visitor { } else if (node.defaultValues.any((e) => e is VarUsage)) { // Don't have a VarDefinition need to use default values resolve all // default values. - var terminalDefaults = []; + var terminalDefaults = []; for (var defaultValue in node.defaultValues) { terminalDefaults.addAll(resolveUsageTerminal(defaultValue)); } @@ -199,7 +199,7 @@ class _VarDefAndUsage extends Visitor { return result; } - _resolveVarUsage(List expressions, int index, + _resolveVarUsage(List expressions, int index, VarDefinition def) { var defExpressions = (def.expression as Expressions).expressions; expressions.replaceRange(index, index + 1, defExpressions); diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 777288a67..5219c2570 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -184,7 +184,7 @@ class Color implements _StyleProperty, ColorBase { int get argbValue => Color.hexToInt(_argb); - bool operator ==(Object other) => Color.equal(this, other); + bool operator ==(other) => Color.equal(this, other); String toHexArgbString() => _argb; @@ -198,7 +198,7 @@ class Color implements _StyleProperty, ColorBase { return new Color.hex("${newRgba.toHexArgbString()}"); } - static bool equal(ColorBase curr, Object other) { + static bool equal(ColorBase curr, other) { if (other is Color) { Color o = other; return o.toHexArgbString() == curr.toHexArgbString(); @@ -601,7 +601,7 @@ class Rgba implements _StyleProperty, ColorBase { return v1; } - bool operator ==(Object other) => Color.equal(this, other); + bool operator ==(other) => Color.equal(this, other); String get cssExpression { if (a == null) { @@ -763,7 +763,7 @@ class Hsla implements _StyleProperty, ColorBase { */ num get alpha => _a; - bool operator ==(Object other) => Color.equal(this, other); + bool operator ==(other) => Color.equal(this, other); String get cssExpression => (_a == null) ? "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)" : @@ -1099,7 +1099,7 @@ class Font implements _StyleProperty { return size.toInt() % family[0].hashCode; } - bool operator ==(Object other) { + bool operator ==(other) { if (other is! Font) return false; Font o = other; return o.size == size && o.family == family && o.weight == weight && diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 53a5f9f05..37d07414d 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -1206,11 +1206,10 @@ class FontExpression extends DartStyleExpression { lineHeight: lineHeight), super(DartStyleExpression.fontStyle, span); - FontExpression merged(FontExpression newFontExpr) { - if (this.isFont && newFontExpr.isFont) { + FontExpression merged(DartStyleExpression newFontExpr) { + if (newFontExpr is FontExpression && this.isFont && newFontExpr.isFont) { return new FontExpression.merge(this, newFontExpr); } - return null; } @@ -1222,8 +1221,8 @@ class FontExpression extends DartStyleExpression { } FontExpression._merge(FontExpression x, FontExpression y, SourceSpan span) - : super(DartStyleExpression.fontStyle, span), - font = new Font.merge(x.font, y.font); + : font = new Font.merge(x.font, y.font), + super(DartStyleExpression.fontStyle, span); FontExpression clone() => new FontExpression(span, size: font.size, family: font.family, @@ -1239,13 +1238,6 @@ abstract class BoxExpression extends DartStyleExpression { BoxExpression(int styleType, SourceSpan span, this.box) : super(styleType, span); - /* - * Merges give 2 DartStyleExpression (or derived from DartStyleExpression, - * e.g., FontExpression, etc.) will merge if the two expressions are of the - * same property name (implies same exact type e.g, FontExpression). - */ - merged(BoxExpression newDartExpr); - visit(VisitorBase visitor) => visitor.visitBoxExpression(this); String get formattedBoxEdge { @@ -1272,8 +1264,9 @@ class MarginExpression extends BoxExpression { MarginExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.marginStyle, span, box); - merged(MarginExpression newMarginExpr) { - if (this.isMargin && newMarginExpr.isMargin) { + merged(DartStyleExpression newMarginExpr) { + if (newMarginExpr is MarginExpression && this.isMargin && + newMarginExpr.isMargin) { return new MarginExpression.merge(this, newMarginExpr); } @@ -1307,8 +1300,8 @@ class BorderExpression extends BoxExpression { BorderExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.borderStyle, span, box); - merged(BorderExpression newBorderExpr) { - if (this.isBorder && newBorderExpr.isBorder) { + merged(DartStyleExpression newBorderExpr) { + if (newBorderExpr is BorderExpression && this.isBorder && newBorderExpr.isBorder) { return new BorderExpression.merge(this, newBorderExpr); } @@ -1340,8 +1333,8 @@ class HeightExpression extends DartStyleExpression { HeightExpression(SourceSpan span, this.height) : super(DartStyleExpression.heightStyle, span); - merged(HeightExpression newHeightExpr) { - if (this.isHeight && newHeightExpr.isHeight) { + merged(DartStyleExpression newHeightExpr) { + if (newHeightExpr is DartStyleExpression && this.isHeight && newHeightExpr.isHeight) { return newHeightExpr; } @@ -1358,8 +1351,9 @@ class WidthExpression extends DartStyleExpression { WidthExpression(SourceSpan span, this.width) : super(DartStyleExpression.widthStyle, span); - merged(WidthExpression newWidthExpr) { - if (this.isWidth && newWidthExpr.isWidth) { + merged(DartStyleExpression newWidthExpr) { + if (newWidthExpr is WidthExpression && this.isWidth && + newWidthExpr.isWidth) { return newWidthExpr; } @@ -1379,8 +1373,9 @@ class PaddingExpression extends BoxExpression { PaddingExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.paddingStyle, span, box); - merged(PaddingExpression newPaddingExpr) { - if (this.isPadding && newPaddingExpr.isPadding) { + merged(DartStyleExpression newPaddingExpr) { + if (newPaddingExpr is PaddingExpression && this.isPadding && + newPaddingExpr.isPadding) { return new PaddingExpression.merge(this, newPaddingExpr); } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index aac7242e0..154d235c0 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -40,7 +40,7 @@ abstract class VisitorBase { void visitRuleSet(RuleSet node); void visitDeclarationGroup(DeclarationGroup node); - void visitMarginGroup(DeclarationGroup node); + void visitMarginGroup(MarginGroup node); void visitDeclaration(Declaration node); void visitVarDefinition(VarDefinition node); void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node); diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 462fde03c..7bb631702 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.11.0+3 +version: 0.11.0+4 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From a03609eb4eb71049b303da036c6af437ff0dedc0 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 19 Mar 2015 13:23:04 -0700 Subject: [PATCH 038/245] formatting R=sigmund@google.com Review URL: https://codereview.chromium.org//998843003 --- pkgs/csslib/example/call_parser.dart | 29 +- pkgs/csslib/lib/css.dart | 16 +- pkgs/csslib/lib/parser.dart | 856 ++++++++++++------------ pkgs/csslib/lib/src/analyzer.dart | 84 +-- pkgs/csslib/lib/src/css_printer.dart | 1 - pkgs/csslib/lib/src/messages.dart | 28 +- pkgs/csslib/lib/src/options.dart | 61 +- pkgs/csslib/lib/src/polyfill.dart | 20 +- pkgs/csslib/lib/src/property.dart | 215 +++--- pkgs/csslib/lib/src/token.dart | 3 +- pkgs/csslib/lib/src/tokenizer.dart | 111 +-- pkgs/csslib/lib/src/tokenizer_base.dart | 44 +- pkgs/csslib/lib/src/tokenkind.dart | 799 +++++++++++----------- pkgs/csslib/lib/src/tree.dart | 290 ++++---- pkgs/csslib/lib/src/tree_base.dart | 4 +- pkgs/csslib/lib/src/tree_printer.dart | 10 +- pkgs/csslib/lib/src/validate.dart | 22 +- pkgs/csslib/lib/visitor.dart | 46 +- pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/big_1_test.dart | 2 +- pkgs/csslib/test/compiler_test.dart | 28 +- pkgs/csslib/test/declaration_test.dart | 55 +- pkgs/csslib/test/error_test.dart | 3 +- pkgs/csslib/test/extend_test.dart | 12 +- pkgs/csslib/test/mixin_test.dart | 1 - pkgs/csslib/test/nested_test.dart | 9 +- pkgs/csslib/test/selector_test.dart | 6 +- pkgs/csslib/test/testing.dart | 25 +- pkgs/csslib/test/var_test.dart | 71 +- pkgs/csslib/test/visitor_test.dart | 8 +- 30 files changed, 1482 insertions(+), 1379 deletions(-) diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index 627105719..3248f7fdf 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -9,9 +9,12 @@ import 'package:csslib/visitor.dart'; * CSS will allow any property/value pairs regardless of validity; all of our * tests (by default) will ensure that the CSS is really valid. */ -StyleSheet parseCss(String cssInput, {List errors, List opts}) => - css.parse(cssInput, errors: errors, options: opts == null ? - ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts); +StyleSheet parseCss(String cssInput, {List errors, List opts}) => css.parse( + cssInput, + errors: errors, + options: opts == null + ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] + : opts); // Pretty printer for CSS. var emitCss = new CssPrinter(); @@ -25,14 +28,14 @@ main() { print('1. Good CSS, parsed CSS emitted:'); print(' ============================='); var stylesheet = parseCss( - '@import "support/at-charset-019.css"; div { color: red; }' - 'button[type] { background-color: red; }' - '.foo { ' + '@import "support/at-charset-019.css"; div { color: red; }' + 'button[type] { background-color: red; }' + '.foo { ' 'color: red; left: 20px; top: 20px; width: 100px; height:200px' - '}' - '#div {' + '}' + '#div {' 'color : #00F578; border-color: #878787;' - '}', errors: errors); + '}', errors: errors); if (!errors.isEmpty) { print("Got ${errors.length} errors.\n"); @@ -46,10 +49,9 @@ main() { // Parse a stylesheet with errors print('2. Catch severe syntax errors:'); print(' ==========================='); - var stylesheetError = parseCss( - '.foo #%^&*asdf{ ' + var stylesheetError = parseCss('.foo #%^&*asdf{ ' 'color: red; left: 20px; top: 20px; width: 100px; height:200px' - '}', errors: errors); + '}', errors: errors); if (!errors.isEmpty) { print("Got ${errors.length} errors.\n"); @@ -63,7 +65,7 @@ main() { // Parse a stylesheet that warns (checks) problematic CSS. print('3. Detect CSS problem with checking on:'); print(' ==================================='); - stylesheetError = parseCss( '# div1 { color: red; }', errors: errors); + stylesheetError = parseCss('# div1 { color: red; }', errors: errors); if (!errors.isEmpty) { print("Detected ${errors.length} problem in checked mode.\n"); @@ -86,5 +88,4 @@ main() { } else { print(prettyPrint(selectorAst)); } - } diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index 73400bc2a..590e8351c 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -39,16 +39,16 @@ void _compile(String inputPath, bool verbose) { var file = new SourceFile(contents, url: path.toUri(inputPath)); // Parse the CSS. - var tree = _time('Parse $filename', - () => new Parser(file, contents).parse(), verbose); + var tree = _time( + 'Parse $filename', () => new Parser(file, contents).parse(), verbose); - _time('Analyzer $filename', - () => new Analyzer([tree], messages), verbose).run(); + _time('Analyzer $filename', () => new Analyzer([tree], messages), verbose) + .run(); // Emit the processed CSS. var emitter = new CssPrinter(); - _time('Codegen $filename', - () => emitter.visitTree(tree, pretty: true), verbose); + _time('Codegen $filename', () => emitter.visitTree(tree, pretty: true), + verbose); // Write the contents to a file. var outPath = path.join(path.dirname(inputPath), '_$filename'); @@ -76,6 +76,8 @@ void _printMessage(String message, int duration) { buf.write(' -- '); if (duration < 10) buf.write(' '); if (duration < 100) buf.write(' '); - buf..write(duration)..write(' ms'); + buf + ..write(duration) + ..write(' ms'); print(buf.toString()); } diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index dce31b6b8..e0aa3388e 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -20,7 +20,6 @@ part 'src/tokenizer_base.dart'; part 'src/tokenizer.dart'; part 'src/tokenkind.dart'; - /** Used for parser lookup ahead (used for nested selectors Less support). */ class ParserState extends TokenizerState { final Token peekToken; @@ -47,10 +46,7 @@ bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. /** Parse and analyze the CSS file. */ StyleSheet compile(input, {List errors, List options, - bool nested: true, - bool polyfill: false, - List includes: null}) { - + bool nested: true, bool polyfill: false, List includes: null}) { if (includes == null) { includes = []; } @@ -76,7 +72,6 @@ StyleSheet compile(input, {List errors, List options, /** Analyze the CSS file. */ void analyze(List styleSheets, {List errors, List options}) { - _createMessages(errors: errors, options: options); new Analyzer(styleSheets, messages).run(); } @@ -107,8 +102,7 @@ StyleSheet selector(input, {List errors}) { _createMessages(errors: errors); var file = new SourceFile(source); - return (new _Parser(file, source) - ..tokenizer.inSelector = true) + return (new _Parser(file, source)..tokenizer.inSelector = true) .parseSelector(); } @@ -119,10 +113,9 @@ SelectorGroup parseSelectorGroup(input, {List errors}) { var file = new SourceFile(source); return (new _Parser(file, source) - // TODO(jmesserly): this fix should be applied to the parser. It's tricky - // because by the time the flag is set one token has already been fetched. - ..tokenizer.inSelector = true) - .processSelectorGroup(); + // TODO(jmesserly): this fix should be applied to the parser. It's tricky + // because by the time the flag is set one token has already been fetched. + ..tokenizer.inSelector = true).processSelectorGroup(); } String _inputAsString(input) { @@ -163,8 +156,8 @@ class Parser { final _Parser _parser; // TODO(jmesserly): having file and text is redundant. - Parser(SourceFile file, String text, {int start: 0, String baseUrl}) : - _parser = new _Parser(file, text, start: start, baseUrl: baseUrl); + Parser(SourceFile file, String text, {int start: 0, String baseUrl}) + : _parser = new _Parser(file, text, start: start, baseUrl: baseUrl); StyleSheet parse() => _parser.parse(); } @@ -263,7 +256,7 @@ class _Parser { return _peekToken.kind; } - Token _next({unicodeRange : false}) { + Token _next({unicodeRange: false}) { _previousToken = _peekToken; _peekToken = tokenizer.next(unicodeRange: unicodeRange); return _previousToken; @@ -289,7 +282,7 @@ class _Parser { _previousToken = markedData.previousToken; } - bool _maybeEat(int kind, {unicodeRange : false}) { + bool _maybeEat(int kind, {unicodeRange: false}) { if (_peekToken.kind == kind) { _previousToken = _peekToken; _peekToken = tokenizer.next(unicodeRange: unicodeRange); @@ -299,7 +292,7 @@ class _Parser { } } - void _eat(int kind, {unicodeRange : false}) { + void _eat(int kind, {unicodeRange: false}) { if (!_maybeEat(kind, unicodeRange: unicodeRange)) { _errorExpected(TokenKind.kindToString(kind)); } @@ -399,8 +392,7 @@ class _Parser { var unaryOp = TokenKind.matchMediaOperator(op, 0, opLen); if (unaryOp != -1) { if (isChecked) { - if (startQuery && - unaryOp != TokenKind.MEDIA_OP_NOT || + if (startQuery && unaryOp != TokenKind.MEDIA_OP_NOT || unaryOp != TokenKind.MEDIA_OP_ONLY) { _warning("Only the unary operators NOT and ONLY allowed", _makeSpan(start)); @@ -448,13 +440,13 @@ class _Parser { // Grammar: '(' S* media_feature S* [ ':' S* expr ]? ')' S* if (_maybeEat(TokenKind.LPAREN)) { if (_peekIdentifier()) { - var feature = identifier(); // Media feature. + var feature = identifier(); // Media feature. while (_maybeEat(TokenKind.COLON)) { var startExpr = _peekToken.span; var exprs = processExpr(); if (_maybeEat(TokenKind.RPAREN)) { - return new MediaExpression(andOperator, feature, exprs, - _makeSpan(startExpr)); + return new MediaExpression( + andOperator, feature, exprs, _makeSpan(startExpr)); } else if (isChecked) { _warning("Missing parenthesis around media expression", _makeSpan(start)); @@ -589,10 +581,10 @@ class _Parser { // TODO(terry): Normalize pseudoPage to lowercase. if (isChecked && !(pseudoPage.name == 'left' || - pseudoPage.name == 'right' || - pseudoPage.name == 'first')) { - _warning("Pseudo page must be left, top or first", - pseudoPage.span); + pseudoPage.name == 'right' || + pseudoPage.name == 'first')) { + _warning( + "Pseudo page must be left, top or first", pseudoPage.span); return null; } } @@ -600,8 +592,8 @@ class _Parser { String pseudoName = pseudoPage is Identifier ? pseudoPage.name : ''; String ident = name is Identifier ? name.name : ''; - return new PageDirective(ident, pseudoName, - processMarginsDeclarations(), _makeSpan(start)); + return new PageDirective( + ident, pseudoName, processMarginsDeclarations(), _makeSpan(start)); case TokenKind.DIRECTIVE_CHARSET: // @charset S* STRING S* ';' @@ -640,7 +632,7 @@ class _Parser { if (tokId == TokenKind.DIRECTIVE_MS_KEYFRAMES && isChecked) { _warning('@-ms-keyframes should be @keyframes', _makeSpan(start)); } - // TODO(terry): End of workaround. + // TODO(terry): End of workaround. /* Key frames grammar: * @@ -676,9 +668,8 @@ class _Parser { selectors.add(term); } while (_maybeEat(TokenKind.COMMA)); - keyframe.add(new KeyFrameBlock(selectors, processDeclarations(), - _makeSpan(start))); - + keyframe.add(new KeyFrameBlock( + selectors, processDeclarations(), _makeSpan(start))); } while (!_maybeEat(TokenKind.RBRACE) && !isPrematureEndOfFile()); return keyframe; @@ -753,14 +744,14 @@ class _Parser { } } - return new NamespaceDirective(prefix != null ? prefix.name : '', - namespaceUri, _makeSpan(start)); + return new NamespaceDirective( + prefix != null ? prefix.name : '', namespaceUri, _makeSpan(start)); case TokenKind.DIRECTIVE_MIXIN: return processMixin(); case TokenKind.DIRECTIVE_INCLUDE: - return processInclude( _makeSpan(start)); + return processInclude(_makeSpan(start)); case TokenKind.DIRECTIVE_CONTENT: // TODO(terry): TBD @@ -823,16 +814,14 @@ class _Parser { var declGroup = processDeclarations(checkBrace: false); var decls = []; if (declGroup.declarations.any((decl) { - return decl is Declaration && - decl is! IncludeMixinAtDeclaration; + return decl is Declaration && decl is! IncludeMixinAtDeclaration; })) { var newDecls = []; productions.forEach((include) { // If declGroup has items that are declarations then we assume // this mixin is a declaration mixin not a top-level mixin. if (include is IncludeDirective) { - newDecls.add(new IncludeMixinAtDeclaration(include, - include.span)); + newDecls.add(new IncludeMixinAtDeclaration(include, include.span)); } else { _warning("Error mixing of top-level vs declarations mixins", _makeSpan(include.span)); @@ -845,33 +834,34 @@ class _Parser { // not a declaration group (anything else is a ruleset). Make it a // list of productions, not a declaration group. for (var decl in declGroup.declarations) { - productions.add(decl is IncludeMixinAtDeclaration ? - decl.include : decl); - }; + productions + .add(decl is IncludeMixinAtDeclaration ? decl.include : decl); + } + ; declGroup.declarations.clear(); } if (declGroup.declarations.isNotEmpty) { if (productions.isEmpty) { - mixinDirective = new MixinDeclarationDirective(name.name, params, - false, declGroup, _makeSpan(start)); + mixinDirective = new MixinDeclarationDirective( + name.name, params, false, declGroup, _makeSpan(start)); break; } else { for (var decl in declGroup.declarations) { - productions.add(decl is IncludeMixinAtDeclaration ? - decl.include : decl); + productions + .add(decl is IncludeMixinAtDeclaration ? decl.include : decl); } } } else { - mixinDirective = new MixinRulesetDirective(name.name, params, - false, productions, _makeSpan(start)); + mixinDirective = new MixinRulesetDirective( + name.name, params, false, productions, _makeSpan(start)); break; } } if (productions.isNotEmpty) { - mixinDirective = new MixinRulesetDirective(name.name, params, - false, productions, _makeSpan(start)); + mixinDirective = new MixinRulesetDirective( + name.name, params, false, productions, _makeSpan(start)); } _eat(TokenKind.RBRACE); @@ -994,8 +984,8 @@ class _Parser { selectorGroup = processSelectorGroup(); } if (selectorGroup != null) { - return new RuleSet(selectorGroup, processDeclarations(), - selectorGroup.span); + return new RuleSet( + selectorGroup, processDeclarations(), selectorGroup.span); } } @@ -1031,7 +1021,8 @@ class _Parser { // Look a head do we have a nested selector instead of a declaration? SelectorGroup selGroup = processSelectorGroup(); - var nestedSelector = selGroup != null && _peekKind(TokenKind.LBRACE) && + var nestedSelector = selGroup != null && + _peekKind(TokenKind.LBRACE) && messages.messages.isEmpty; if (!nestedSelector) { @@ -1053,7 +1044,7 @@ class _Parser { if (checkBrace) _eat(TokenKind.LBRACE); List decls = []; - List dartStyles = []; // List of latest styles exposed to Dart. + List dartStyles = []; // List of latest styles exposed to Dart. do { var selectorGroup = _nestedSelector(); @@ -1111,7 +1102,7 @@ class _Parser { _eat(TokenKind.LBRACE); List decls = []; - List dartStyles = []; // List of latest styles exposed to Dart. + List dartStyles = []; // List of latest styles exposed to Dart. do { switch (_peek()) { @@ -1142,8 +1133,8 @@ class _Parser { var declGroup = processDeclarations(); if (declGroup != null) { - groups.add(new MarginGroup(marginSym, declGroup.declarations, - _makeSpan(start))); + groups.add(new MarginGroup( + marginSym, declGroup.declarations, _makeSpan(start))); } break; default: @@ -1248,7 +1239,7 @@ class _Parser { _eat(TokenKind.AMPERSAND); thisOperator = true; break; - } + } // Check if WHITESPACE existed between tokens if so we're descendent. if (combinatorType == TokenKind.COMBINATOR_NONE && !forceCombinatorNone) { @@ -1259,19 +1250,20 @@ class _Parser { } var span = _makeSpan(start); - var simpleSel = thisOperator ? - new ElementSelector(new ThisOperator(span), span) : simpleSelector(); + var simpleSel = thisOperator + ? new ElementSelector(new ThisOperator(span), span) + : simpleSelector(); if (simpleSel == null && (combinatorType == TokenKind.COMBINATOR_PLUS || - combinatorType == TokenKind.COMBINATOR_GREATER || - combinatorType == TokenKind.COMBINATOR_TILDE)) { + combinatorType == TokenKind.COMBINATOR_GREATER || + combinatorType == TokenKind.COMBINATOR_TILDE)) { // For "+ &", "~ &" or "> &" a selector sequence with no name is needed // so that the & will have a combinator too. This is needed to // disambiguate selector expressions: // .foo&:hover combinator before & is NONE // .foo & combinator before & is DESCDENDANT // .foo > & combinator before & is GREATER - simpleSel = new ElementSelector(new Identifier("", span), span); + simpleSel = new ElementSelector(new Identifier("", span), span); } if (simpleSel != null) { return new SimpleSelectorSequence(simpleSel, span, combinatorType); @@ -1342,8 +1334,8 @@ class _Parser { break; } - return new NamespaceSelector(first, - new ElementSelector(element, element.span), _makeSpan(start)); + return new NamespaceSelector( + first, new ElementSelector(element, element.span), _makeSpan(start)); } else if (first != null) { return new ElementSelector(first, _makeSpan(start)); } else { @@ -1353,7 +1345,8 @@ class _Parser { } bool _anyWhiteSpaceBeforePeekToken(int kind) { - if (_previousToken != null && _peekToken != null && + if (_previousToken != null && + _peekToken != null && _previousToken.kind == kind) { // If end of previous token isn't same as the start of peek token then // there's something between these tokens probably whitespace. @@ -1434,7 +1427,6 @@ class _Parser { // Functional pseudo? if (_peekToken.kind == TokenKind.LPAREN) { - if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') { _eat(TokenKind.LPAREN); @@ -1466,9 +1458,9 @@ class _Parser { } _eat(TokenKind.RPAREN); - return (pseudoElement) ? - new PseudoElementFunctionSelector(pseudoName, expr, span) : - new PseudoClassFunctionSelector(pseudoName, expr, span); + return (pseudoElement) + ? new PseudoElementFunctionSelector(pseudoName, expr, span) + : new PseudoClassFunctionSelector(pseudoName, expr, span); } } @@ -1478,9 +1470,9 @@ class _Parser { // pseudo-class. However, CSS2.1 allows for : to specify old // pseudo-elements (:first-line, :first-letter, :before and :after) any // new pseudo-elements defined would require a ::. - return pseudoElement ? - new PseudoElementSelector(pseudoName, _makeSpan(start)) : - new PseudoClassSelector(pseudoName, _makeSpan(start)); + return pseudoElement + ? new PseudoElementSelector(pseudoName, _makeSpan(start)) + : new PseudoClassSelector(pseudoName, _makeSpan(start)); } /** @@ -1531,7 +1523,7 @@ class _Parser { value = '"${_escapeString(value)}"'; return new LiteralTerm(value, value, _makeSpan(start)); case TokenKind.IDENTIFIER: - value = identifier(); // Snarf up the ident we'll remap, maybe. + value = identifier(); // Snarf up the ident we'll remap, maybe. break; default: keepParsing = false; @@ -1582,17 +1574,17 @@ class _Parser { int op; switch (_peek()) { - case TokenKind.EQUALS: - case TokenKind.INCLUDES: // ~= - case TokenKind.DASH_MATCH: // |= - case TokenKind.PREFIX_MATCH: // ^= - case TokenKind.SUFFIX_MATCH: // $= - case TokenKind.SUBSTRING_MATCH: // *= - op = _peek(); - _next(); - break; - default: - op = TokenKind.NO_MATCH; + case TokenKind.EQUALS: + case TokenKind.INCLUDES: // ~= + case TokenKind.DASH_MATCH: // |= + case TokenKind.PREFIX_MATCH: // ^= + case TokenKind.SUFFIX_MATCH: // $= + case TokenKind.SUBSTRING_MATCH: // *= + op = _peek(); + _next(); + break; + default: + op = TokenKind.NO_MATCH; } var value; @@ -1654,8 +1646,9 @@ class _Parser { // Handle !important (prio) var importantPriority = _maybeEat(TokenKind.IMPORTANT); - decl = new Declaration(propertyIdent, exprs, dartComposite, - _makeSpan(start), important: importantPriority, ie7: ie7); + decl = new Declaration( + propertyIdent, exprs, dartComposite, _makeSpan(start), + important: importantPriority, ie7: ie7); } else if (_peekToken.kind == TokenKind.VAR_DEFINITION) { _next(); var definedName; @@ -1698,7 +1691,7 @@ class _Parser { } /** List of styles exposed to the Dart UI framework. */ - static const int _fontPartFont= 0; + static const int _fontPartFont = 0; static const int _fontPartVariant = 1; static const int _fontPartWeight = 2; static const int _fontPartSize = 3; @@ -1729,46 +1722,46 @@ class _Parser { static const int _paddingPartBottom = 28; static const Map _stylesToDart = const { - 'font': _fontPartFont, - 'font-family': _fontPartFamily, - 'font-size': _fontPartSize, - 'font-style': _fontPartStyle, - 'font-variant': _fontPartVariant, - 'font-weight': _fontPartWeight, - 'line-height': _lineHeightPart, - 'margin': _marginPartMargin, - 'margin-left': _marginPartLeft, - 'margin-right': _marginPartRight, - 'margin-top': _marginPartTop, - 'margin-bottom': _marginPartBottom, - 'border': _borderPartBorder, - 'border-left': _borderPartLeft, - 'border-right': _borderPartRight, - 'border-top': _borderPartTop, - 'border-bottom': _borderPartBottom, - 'border-width': _borderPartWidth, - 'border-left-width': _borderPartLeftWidth, - 'border-top-width': _borderPartTopWidth, - 'border-right-width': _borderPartRightWidth, - 'border-bottom-width': _borderPartBottomWidth, - 'height': _heightPart, - 'width': _widthPart, - 'padding': _paddingPartPadding, - 'padding-left': _paddingPartLeft, - 'padding-top': _paddingPartTop, - 'padding-right': _paddingPartRight, - 'padding-bottom': _paddingPartBottom + 'font': _fontPartFont, + 'font-family': _fontPartFamily, + 'font-size': _fontPartSize, + 'font-style': _fontPartStyle, + 'font-variant': _fontPartVariant, + 'font-weight': _fontPartWeight, + 'line-height': _lineHeightPart, + 'margin': _marginPartMargin, + 'margin-left': _marginPartLeft, + 'margin-right': _marginPartRight, + 'margin-top': _marginPartTop, + 'margin-bottom': _marginPartBottom, + 'border': _borderPartBorder, + 'border-left': _borderPartLeft, + 'border-right': _borderPartRight, + 'border-top': _borderPartTop, + 'border-bottom': _borderPartBottom, + 'border-width': _borderPartWidth, + 'border-left-width': _borderPartLeftWidth, + 'border-top-width': _borderPartTopWidth, + 'border-right-width': _borderPartRightWidth, + 'border-bottom-width': _borderPartBottomWidth, + 'height': _heightPart, + 'width': _widthPart, + 'padding': _paddingPartPadding, + 'padding-left': _paddingPartLeft, + 'padding-top': _paddingPartTop, + 'padding-right': _paddingPartRight, + 'padding-bottom': _paddingPartBottom }; static const Map _nameToFontWeight = const { - 'bold' : FontWeight.bold, - 'normal' : FontWeight.normal + 'bold': FontWeight.bold, + 'normal': FontWeight.normal }; static int _findStyle(String styleName) => _stylesToDart[styleName]; - DartStyleExpression _styleForDart(Identifier property, Expressions exprs, - List dartStyles) { + DartStyleExpression _styleForDart( + Identifier property, Expressions exprs, List dartStyles) { var styleType = _findStyle(property.name.toLowerCase()); if (styleType != null) { return buildDartStyleNode(styleType, exprs, dartStyles); @@ -1786,9 +1779,8 @@ class _Parser { return fontExpr; } - DartStyleExpression buildDartStyleNode(int styleType, Expressions exprs, - List dartStyles) { - + DartStyleExpression buildDartStyleNode( + int styleType, Expressions exprs, List dartStyles) { switch (styleType) { /* * Properties in order: @@ -1798,9 +1790,9 @@ class _Parser { * The font-size and font-family values are required. If other values are * missing; a default, if it exist, will be used. */ - case _fontPartFont: - var processor = new ExpressionsProcessor(exprs); - return _mergeFontStyles(processor.processFont(), dartStyles); + case _fontPartFont: + var processor = new ExpressionsProcessor(exprs); + return _mergeFontStyles(processor.processFont(), dartStyles); case _fontPartFamily: var processor = new ExpressionsProcessor(exprs); @@ -1844,8 +1836,7 @@ class _Parser { // https://github.com/dart-lang/csslib/issues/1 var expr = exprs.expressions[0]; if (expr is NumberTerm) { - var fontExpr = new FontExpression(expr.span, - weight: expr.value); + var fontExpr = new FontExpression(expr.span, weight: expr.value); return _mergeFontStyles(fontExpr, dartStyles); } else if (expr is LiteralTerm) { int weight = _nameToFontWeight[expr.value.toString()]; @@ -1864,7 +1855,7 @@ class _Parser { // TODO(terry): Need to handle other units and LiteralTerm normal // See https://github.com/dart-lang/csslib/issues/2. if (unitTerm.unit == TokenKind.UNIT_LENGTH_PX || - unitTerm.unit == TokenKind.UNIT_LENGTH_PT) { + unitTerm.unit == TokenKind.UNIT_LENGTH_PT) { var fontExpr = new FontExpression(expr.span, lineHeight: new LineHeight(expr.value, inPixels: true)); return _mergeFontStyles(fontExpr, dartStyles); @@ -1899,8 +1890,8 @@ class _Parser { } break; case _paddingPartPadding: - return new PaddingExpression.boxEdge(exprs.span, - processFourNums(exprs)); + return new PaddingExpression.boxEdge( + exprs.span, processFourNums(exprs)); case _marginPartLeft: case _marginPartTop: case _marginPartRight: @@ -2000,7 +1991,7 @@ class _Parser { bottom = top; right = marginValue(exprs.expressions[1]); left = right; - break; + break; case 3: top = marginValue(exprs.expressions[0]); right = marginValue(exprs.expressions[1]); @@ -2046,28 +2037,29 @@ class _Parser { var opStart = _peekToken.span; switch (_peek()) { - case TokenKind.SLASH: - op = new OperatorSlash(_makeSpan(opStart)); - break; - case TokenKind.COMMA: - op = new OperatorComma(_makeSpan(opStart)); - break; - case TokenKind.BACKSLASH: - // Backslash outside of string; detected IE8 or older signaled by \9 at - // end of an expression. - var ie8Start = _peekToken.span; + case TokenKind.SLASH: + op = new OperatorSlash(_makeSpan(opStart)); + break; + case TokenKind.COMMA: + op = new OperatorComma(_makeSpan(opStart)); + break; + case TokenKind.BACKSLASH: + // Backslash outside of string; detected IE8 or older signaled by \9 at + // end of an expression. + var ie8Start = _peekToken.span; - _next(); - if (_peekKind(TokenKind.INTEGER)) { - var numToken = _next(); - var value = int.parse(numToken.text); - if (value == 9) { - op = new IE8Term(_makeSpan(ie8Start)); - } else if (isChecked) { - _warning("\$value is not valid in an expression", _makeSpan(start)); + _next(); + if (_peekKind(TokenKind.INTEGER)) { + var numToken = _next(); + var value = int.parse(numToken.text); + if (value == 9) { + op = new IE8Term(_makeSpan(ie8Start)); + } else if (isChecked) { + _warning( + "\$value is not valid in an expression", _makeSpan(start)); + } } - } - break; + break; } if (expr != null) { @@ -2120,165 +2112,167 @@ class _Parser { // processTerm([bool ieFilter = false]) { var start = _peekToken.span; - Token t; // token for term's value - var value; // value of term (numeric values) + Token t; // token for term's value + var value; // value of term (numeric values) var unary = ""; switch (_peek()) { - case TokenKind.HASH: - this._eat(TokenKind.HASH); - if (!_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) { - String hexText; - if (_peekKind(TokenKind.INTEGER)) { - String hexText1 = _peekToken.text; - _next(); - if (_peekIdentifier()) { - hexText = '$hexText1${identifier().name}'; - } else { - hexText = hexText1; + case TokenKind.HASH: + this._eat(TokenKind.HASH); + if (!_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) { + String hexText; + if (_peekKind(TokenKind.INTEGER)) { + String hexText1 = _peekToken.text; + _next(); + if (_peekIdentifier()) { + hexText = '$hexText1${identifier().name}'; + } else { + hexText = hexText1; + } + } else if (_peekIdentifier()) { + hexText = identifier().name; + } + if (hexText != null) { + return _parseHex(hexText, _makeSpan(start)); } - } else if (_peekIdentifier()) { - hexText = identifier().name; } - if (hexText != null) { - return _parseHex(hexText, _makeSpan(start)); + + if (isChecked) { + _warning("Expected hex number", _makeSpan(start)); } - } + // Construct the bad hex value with a #number. + return _parseHex(" ${processTerm().text}", _makeSpan(start)); + case TokenKind.INTEGER: + t = _next(); + value = int.parse("${unary}${t.text}"); + break; + case TokenKind.DOUBLE: + t = _next(); + value = double.parse("${unary}${t.text}"); + break; + case TokenKind.SINGLE_QUOTE: + value = processQuotedString(false); + value = "'${_escapeString(value, single: true)}'"; + return new LiteralTerm(value, value, _makeSpan(start)); + case TokenKind.DOUBLE_QUOTE: + value = processQuotedString(false); + value = '"${_escapeString(value)}"'; + return new LiteralTerm(value, value, _makeSpan(start)); + case TokenKind.LPAREN: + _next(); - if (isChecked) { - _warning("Expected hex number", _makeSpan(start)); - } - // Construct the bad hex value with a #number. - return _parseHex(" ${processTerm().text}", _makeSpan(start)); - case TokenKind.INTEGER: - t = _next(); - value = int.parse("${unary}${t.text}"); - break; - case TokenKind.DOUBLE: - t = _next(); - value = double.parse("${unary}${t.text}"); - break; - case TokenKind.SINGLE_QUOTE: - value = processQuotedString(false); - value = "'${_escapeString(value, single: true)}'"; - return new LiteralTerm(value, value, _makeSpan(start)); - case TokenKind.DOUBLE_QUOTE: - value = processQuotedString(false); - value = '"${_escapeString(value)}"'; - return new LiteralTerm(value, value, _makeSpan(start)); - case TokenKind.LPAREN: - _next(); + GroupTerm group = new GroupTerm(_makeSpan(start)); + + var term; + do { + term = processTerm(); + if (term != null && term is LiteralTerm) { + group.add(term); + } + } while (term != null && + !_maybeEat(TokenKind.RPAREN) && + !isPrematureEndOfFile()); - GroupTerm group = new GroupTerm(_makeSpan(start)); + return group; + case TokenKind.LBRACK: + _next(); - var term; - do { - term = processTerm(); - if (term != null && term is LiteralTerm) { - group.add(term); + var term = processTerm(); + if (!(term is NumberTerm)) { + _error('Expecting a positive number', _makeSpan(start)); } - } while (term != null && !_maybeEat(TokenKind.RPAREN) && - !isPrematureEndOfFile()); - - return group; - case TokenKind.LBRACK: - _next(); - var term = processTerm(); - if (!(term is NumberTerm)) { - _error('Expecting a positive number', _makeSpan(start)); - } + _eat(TokenKind.RBRACK); - _eat(TokenKind.RBRACK); + return new ItemTerm(term.value, term.text, _makeSpan(start)); + case TokenKind.IDENTIFIER: + var nameValue = identifier(); // Snarf up the ident we'll remap, maybe. - return new ItemTerm(term.value, term.text, _makeSpan(start)); - case TokenKind.IDENTIFIER: - var nameValue = identifier(); // Snarf up the ident we'll remap, maybe. - - if (!ieFilter && _maybeEat(TokenKind.LPAREN)) { - // FUNCTION - return processFunction(nameValue); - } if (ieFilter) { - if (_maybeEat(TokenKind.COLON) && - nameValue.name.toLowerCase() == 'progid') { - // IE filter:progid: - return processIEFilter(start); - } else { - // Handle filter: where name is any filter e.g., alpha, chroma, - // Wave, blur, etc. - return processIEFilter(start); - } - } + if (!ieFilter && _maybeEat(TokenKind.LPAREN)) { + // FUNCTION + return processFunction(nameValue); + } + if (ieFilter) { + if (_maybeEat(TokenKind.COLON) && + nameValue.name.toLowerCase() == 'progid') { + // IE filter:progid: + return processIEFilter(start); + } else { + // Handle filter: where name is any filter e.g., alpha, chroma, + // Wave, blur, etc. + return processIEFilter(start); + } + } - // TODO(terry): Need to have a list of known identifiers today only - // 'from' is special. - if (nameValue.name == 'from') { - return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); - } + // TODO(terry): Need to have a list of known identifiers today only + // 'from' is special. + if (nameValue.name == 'from') { + return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); + } - // What kind of identifier is it, named color? - var colorEntry = TokenKind.matchColorName(nameValue.name); - if (colorEntry == null) { - if (isChecked) { - var propName = nameValue.name; - var errMsg = TokenKind.isPredefinedName(propName) ? - "Improper use of property value ${propName}" : - "Unknown property value ${propName}"; - _warning(errMsg, _makeSpan(start)); + // What kind of identifier is it, named color? + var colorEntry = TokenKind.matchColorName(nameValue.name); + if (colorEntry == null) { + if (isChecked) { + var propName = nameValue.name; + var errMsg = TokenKind.isPredefinedName(propName) + ? "Improper use of property value ${propName}" + : "Unknown property value ${propName}"; + _warning(errMsg, _makeSpan(start)); + } + return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); } - return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); - } - // Yes, process the color as an RGB value. - var rgbColor = - TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6); - return _parseHex(rgbColor, _makeSpan(start)); - case TokenKind.UNICODE_RANGE: - var first; - var second; - var firstNumber; - var secondNumber; - _eat(TokenKind.UNICODE_RANGE, unicodeRange: true); - if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { - first = _previousToken.text; - firstNumber = int.parse('0x$first'); - if (firstNumber > MAX_UNICODE) { - _error("unicode range must be less than 10FFFF", _makeSpan(start)); - } - if (_maybeEat(TokenKind.MINUS, unicodeRange: true)) { - if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { - second = _previousToken.text; - secondNumber = int.parse('0x$second'); - if (secondNumber > MAX_UNICODE) { - _error("unicode range must be less than 10FFFF", - _makeSpan(start)); - } - if (firstNumber > secondNumber) { - _error("unicode first range can not be greater than last", - _makeSpan(start)); + // Yes, process the color as an RGB value. + var rgbColor = + TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6); + return _parseHex(rgbColor, _makeSpan(start)); + case TokenKind.UNICODE_RANGE: + var first; + var second; + var firstNumber; + var secondNumber; + _eat(TokenKind.UNICODE_RANGE, unicodeRange: true); + if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { + first = _previousToken.text; + firstNumber = int.parse('0x$first'); + if (firstNumber > MAX_UNICODE) { + _error("unicode range must be less than 10FFFF", _makeSpan(start)); + } + if (_maybeEat(TokenKind.MINUS, unicodeRange: true)) { + if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { + second = _previousToken.text; + secondNumber = int.parse('0x$second'); + if (secondNumber > MAX_UNICODE) { + _error( + "unicode range must be less than 10FFFF", _makeSpan(start)); + } + if (firstNumber > secondNumber) { + _error("unicode first range can not be greater than last", + _makeSpan(start)); + } } } + } else if (_maybeEat(TokenKind.HEX_RANGE, unicodeRange: true)) { + first = _previousToken.text; } - } else if (_maybeEat(TokenKind.HEX_RANGE, unicodeRange: true)) { - first = _previousToken.text; - } - return new UnicodeRangeTerm(first, second, _makeSpan(start)); - case TokenKind.AT: - if (messages.options.lessSupport) { - _next(); + return new UnicodeRangeTerm(first, second, _makeSpan(start)); + case TokenKind.AT: + if (messages.options.lessSupport) { + _next(); - var expr = processExpr(); - if (isChecked && expr.expressions.length > 1) { - _error("only @name for Less syntax", _peekToken.span); - } + var expr = processExpr(); + if (isChecked && expr.expressions.length > 1) { + _error("only @name for Less syntax", _peekToken.span); + } - var param = expr.expressions[0]; - var varUsage = new VarUsage(param.text, [], _makeSpan(start)); - expr.expressions[0] = varUsage; - return expr.expressions; - } - break; + var param = expr.expressions[0]; + var varUsage = new VarUsage(param.text, [], _makeSpan(start)); + expr.expressions[0] = varUsage; + return expr.expressions; + } + break; } return processDimension(t, value, _makeSpan(start)); @@ -2290,76 +2284,76 @@ class _Parser { var unitType = this._peek(); switch (unitType) { - case TokenKind.UNIT_EM: - term = new EmTerm(value, t.text, span); - _next(); // Skip the unit - break; - case TokenKind.UNIT_EX: - term = new ExTerm(value, t.text, span); - _next(); // Skip the unit - break; - case TokenKind.UNIT_LENGTH_PX: - case TokenKind.UNIT_LENGTH_CM: - case TokenKind.UNIT_LENGTH_MM: - case TokenKind.UNIT_LENGTH_IN: - case TokenKind.UNIT_LENGTH_PT: - case TokenKind.UNIT_LENGTH_PC: - term = new LengthTerm(value, t.text, span, unitType); - _next(); // Skip the unit - break; - case TokenKind.UNIT_ANGLE_DEG: - case TokenKind.UNIT_ANGLE_RAD: - case TokenKind.UNIT_ANGLE_GRAD: - case TokenKind.UNIT_ANGLE_TURN: - term = new AngleTerm(value, t.text, span, unitType); - _next(); // Skip the unit - break; - case TokenKind.UNIT_TIME_MS: - case TokenKind.UNIT_TIME_S: - term = new TimeTerm(value, t.text, span, unitType); - _next(); // Skip the unit - break; - case TokenKind.UNIT_FREQ_HZ: - case TokenKind.UNIT_FREQ_KHZ: - term = new FreqTerm(value, t.text, span, unitType); - _next(); // Skip the unit - break; - case TokenKind.PERCENT: - term = new PercentageTerm(value, t.text, span); - _next(); // Skip the % - break; - case TokenKind.UNIT_FRACTION: - term = new FractionTerm(value, t.text, span); - _next(); // Skip the unit - break; - case TokenKind.UNIT_RESOLUTION_DPI: - case TokenKind.UNIT_RESOLUTION_DPCM: - case TokenKind.UNIT_RESOLUTION_DPPX: - term = new ResolutionTerm(value, t.text, span, unitType); - _next(); // Skip the unit - break; - case TokenKind.UNIT_CH: - term = new ChTerm(value, t.text, span, unitType); - _next(); // Skip the unit - break; - case TokenKind.UNIT_REM: - term = new RemTerm(value, t.text, span, unitType); - _next(); // Skip the unit - break; - case TokenKind.UNIT_VIEWPORT_VW: - case TokenKind.UNIT_VIEWPORT_VH: - case TokenKind.UNIT_VIEWPORT_VMIN: - case TokenKind.UNIT_VIEWPORT_VMAX: - term = new ViewportTerm(value, t.text, span, unitType); - _next(); // Skip the unit - break; - default: - if (value != null && t != null) { - term = (value is Identifier) - ? new LiteralTerm(value, value.name, span) - : new NumberTerm(value, t.text, span); - } - break; + case TokenKind.UNIT_EM: + term = new EmTerm(value, t.text, span); + _next(); // Skip the unit + break; + case TokenKind.UNIT_EX: + term = new ExTerm(value, t.text, span); + _next(); // Skip the unit + break; + case TokenKind.UNIT_LENGTH_PX: + case TokenKind.UNIT_LENGTH_CM: + case TokenKind.UNIT_LENGTH_MM: + case TokenKind.UNIT_LENGTH_IN: + case TokenKind.UNIT_LENGTH_PT: + case TokenKind.UNIT_LENGTH_PC: + term = new LengthTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_ANGLE_DEG: + case TokenKind.UNIT_ANGLE_RAD: + case TokenKind.UNIT_ANGLE_GRAD: + case TokenKind.UNIT_ANGLE_TURN: + term = new AngleTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_TIME_MS: + case TokenKind.UNIT_TIME_S: + term = new TimeTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_FREQ_HZ: + case TokenKind.UNIT_FREQ_KHZ: + term = new FreqTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.PERCENT: + term = new PercentageTerm(value, t.text, span); + _next(); // Skip the % + break; + case TokenKind.UNIT_FRACTION: + term = new FractionTerm(value, t.text, span); + _next(); // Skip the unit + break; + case TokenKind.UNIT_RESOLUTION_DPI: + case TokenKind.UNIT_RESOLUTION_DPCM: + case TokenKind.UNIT_RESOLUTION_DPPX: + term = new ResolutionTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_CH: + term = new ChTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_REM: + term = new RemTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + case TokenKind.UNIT_VIEWPORT_VW: + case TokenKind.UNIT_VIEWPORT_VH: + case TokenKind.UNIT_VIEWPORT_VMIN: + case TokenKind.UNIT_VIEWPORT_VMAX: + term = new ViewportTerm(value, t.text, span, unitType); + _next(); // Skip the unit + break; + default: + if (value != null && t != null) { + term = (value is Identifier) + ? new LiteralTerm(value, value.name, span) + : new NumberTerm(value, t.text, span); + } + break; } return term; @@ -2377,27 +2371,27 @@ class _Parser { tokenizer._skipWhitespace = false; switch (_peek()) { - case TokenKind.SINGLE_QUOTE: - stopToken = TokenKind.SINGLE_QUOTE; - _next(); // Skip the SINGLE_QUOTE. - start = _peekToken.span; - break; - case TokenKind.DOUBLE_QUOTE: - stopToken = TokenKind.DOUBLE_QUOTE; - _next(); // Skip the DOUBLE_QUOTE. - start = _peekToken.span; - break; - default: - if (urlString) { - if (_peek() == TokenKind.LPAREN) { - _next(); // Skip the LPAREN. - start = _peekToken.span; + case TokenKind.SINGLE_QUOTE: + stopToken = TokenKind.SINGLE_QUOTE; + _next(); // Skip the SINGLE_QUOTE. + start = _peekToken.span; + break; + case TokenKind.DOUBLE_QUOTE: + stopToken = TokenKind.DOUBLE_QUOTE; + _next(); // Skip the DOUBLE_QUOTE. + start = _peekToken.span; + break; + default: + if (urlString) { + if (_peek() == TokenKind.LPAREN) { + _next(); // Skip the LPAREN. + start = _peekToken.span; + } + stopToken = TokenKind.RPAREN; + } else { + _error('unexpected string', _makeSpan(start)); } - stopToken = TokenKind.RPAREN; - } else { - _error('unexpected string', _makeSpan(start)); - } - break; + break; } // Gobble up everything until we hit our stop token. @@ -2410,7 +2404,7 @@ class _Parser { // All characters between quotes is the string. if (stopToken != TokenKind.RPAREN) { - _next(); // Skip the SINGLE_QUOTE or DOUBLE_QUOTE; + _next(); // Skip the SINGLE_QUOTE or DOUBLE_QUOTE; } return stringValue.toString(); @@ -2438,8 +2432,8 @@ class _Parser { case TokenKind.RPAREN: _eat(TokenKind.RPAREN); if (--parens == 0) { - var tok = tokenizer.makeIEFilter(startAfterProgidColon.start.offset, - _peekToken.start); + var tok = tokenizer.makeIEFilter( + startAfterProgidColon.start.offset, _peekToken.start); return new LiteralTerm(tok.text, tok.text, tok.span); } break; @@ -2459,53 +2453,53 @@ class _Parser { var name = func.name; switch (name) { - case 'url': - // URI term sucks up everything inside of quotes(' or ") or between parens - var urlParam = processQuotedString(true); + case 'url': + // URI term sucks up everything inside of quotes(' or ") or between parens + var urlParam = processQuotedString(true); - // TODO(terry): Better error messge and checking for mismatched quotes. - if (_peek() == TokenKind.END_OF_FILE) { - _error("problem parsing URI", _peekToken.span); - } + // TODO(terry): Better error messge and checking for mismatched quotes. + if (_peek() == TokenKind.END_OF_FILE) { + _error("problem parsing URI", _peekToken.span); + } - if (_peek() == TokenKind.RPAREN) { - _next(); - } + if (_peek() == TokenKind.RPAREN) { + _next(); + } - return new UriTerm(urlParam, _makeSpan(start)); - case 'calc': - // TODO(terry): Implement expression handling... - break; - case 'var': - // TODO(terry): Consider handling var in IE specific filter/progid. This - // will require parsing entire IE specific syntax e.g., - // param = value or progid:com_id, etc. for example: - // - // var-blur: Blur(Add = 0, Direction = 225, Strength = 10); - // var-gradient: progid:DXImageTransform.Microsoft.gradient" - // (GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670'); - var expr = processExpr(); - if (!_maybeEat(TokenKind.RPAREN)) { - _error("problem parsing var expected ), ", _peekToken.span); - } - if (isChecked && - expr.expressions.where((e) => e is OperatorComma).length > 1) { - _error("too many parameters to var()", _peekToken.span); - } + return new UriTerm(urlParam, _makeSpan(start)); + case 'calc': + // TODO(terry): Implement expression handling... + break; + case 'var': + // TODO(terry): Consider handling var in IE specific filter/progid. This + // will require parsing entire IE specific syntax e.g., + // param = value or progid:com_id, etc. for example: + // + // var-blur: Blur(Add = 0, Direction = 225, Strength = 10); + // var-gradient: progid:DXImageTransform.Microsoft.gradient" + // (GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670'); + var expr = processExpr(); + if (!_maybeEat(TokenKind.RPAREN)) { + _error("problem parsing var expected ), ", _peekToken.span); + } + if (isChecked && + expr.expressions.where((e) => e is OperatorComma).length > 1) { + _error("too many parameters to var()", _peekToken.span); + } - var paramName = expr.expressions[0].text; + var paramName = expr.expressions[0].text; - // [0] - var name, [1] - OperatorComma, [2] - default value. - var defaultValues = expr.expressions.length >= 3 - ? expr.expressions.sublist(2) : []; - return new VarUsage(paramName, defaultValues, _makeSpan(start)); - default: - var expr = processExpr(); - if (!_maybeEat(TokenKind.RPAREN)) { - _error("problem parsing function expected ), ", _peekToken.span); - } + // [0] - var name, [1] - OperatorComma, [2] - default value. + var defaultValues = + expr.expressions.length >= 3 ? expr.expressions.sublist(2) : []; + return new VarUsage(paramName, defaultValues, _makeSpan(start)); + default: + var expr = processExpr(); + if (!_maybeEat(TokenKind.RPAREN)) { + _error("problem parsing function expected ), ", _peekToken.span); + } - return new FunctionTerm(name, name, expr, _makeSpan(start)); + return new FunctionTerm(name, name, expr, _makeSpan(start)); } return null; @@ -2527,11 +2521,11 @@ class _Parser { // TODO(terry): Move this to base <= 36 and into shared code. static int _hexDigit(int c) { - if (c >= 48/*0*/ && c <= 57/*9*/) { + if (c >= 48 /*0*/ && c <= 57 /*9*/) { return c - 48; - } else if (c >= 97/*a*/ && c <= 102/*f*/) { + } else if (c >= 97 /*a*/ && c <= 102 /*f*/) { return c - 87; - } else if (c >= 65/*A*/ && c <= 70/*F*/) { + } else if (c >= 65 /*A*/ && c <= 70 /*F*/) { return c - 55; } else { return -1; @@ -2541,7 +2535,7 @@ class _Parser { HexColorTerm _parseHex(String hexText, SourceSpan span) { var hexValue = 0; - for (var i = 0; i < hexText.length; i++) { + for (var i = 0; i < hexText.length; i++) { var digit = _hexDigit(hexText.codeUnitAt(i)); if (digit < 0) { _warning('Bad hex number', span); @@ -2689,8 +2683,12 @@ String _escapeString(String text, {bool single: false}) { var code = text.codeUnitAt(i); String replace = null; switch (code) { - case 34/*'"'*/: if (!single) replace = r'\"'; break; - case 39/*"'"*/: if (single) replace = r"\'"; break; + case 34 /*'"'*/ : + if (!single) replace = r'\"'; + break; + case 39 /*"'"*/ : + if (single) replace = r"\'"; + break; } if (replace != null && result == null) { diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index da1a9fac5..1341bc205 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -4,7 +4,6 @@ part of csslib.parser; - // TODO(terry): Add optimizing phase to remove duplicated selectors in the same // selector group (e.g., .btn, .btn { color: red; }). Also, look // at simplifying selectors expressions too (much harder). @@ -34,12 +33,12 @@ class Analyzer { // possibly combine in one walk. void run() { // Expand top-level @include. - _styleSheets.forEach((styleSheet) => - TopLevelIncludes.expand(_messages, _styleSheets)); + _styleSheets.forEach( + (styleSheet) => TopLevelIncludes.expand(_messages, _styleSheets)); // Expand @include in declarations. - _styleSheets.forEach((styleSheet) => - DeclarationIncludes.expand(_messages, _styleSheets)); + _styleSheets.forEach( + (styleSheet) => DeclarationIncludes.expand(_messages, _styleSheets)); // Remove all @mixin and @include _styleSheets.forEach((styleSheet) => MixinsAndIncludes.remove(styleSheet)); @@ -47,13 +46,13 @@ class Analyzer { // Expand any nested selectors using selector desendant combinator to // signal CSS inheritance notation. _styleSheets.forEach((styleSheet) => new ExpandNestedSelectors() - ..visitStyleSheet(styleSheet) - ..flatten(styleSheet)); + ..visitStyleSheet(styleSheet) + ..flatten(styleSheet)); // Expand any @extend. _styleSheets.forEach((styleSheet) { - var allExtends = new AllExtends()..visitStyleSheet(styleSheet); - new InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet); + var allExtends = new AllExtends()..visitStyleSheet(styleSheet); + new InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet); }); } } @@ -215,8 +214,8 @@ class ExpandNestedSelectors extends Visitor { _parentRuleSet = oldParent; // Remove nested rules; they're all flatten and in the _expandedRuleSets. - node.declarationGroup.declarations.removeWhere((declaration) => - declaration is RuleSet); + node.declarationGroup.declarations + .removeWhere((declaration) => declaration is RuleSet); _nestedSelectorGroup = oldNestedSelectorGroups; @@ -305,8 +304,8 @@ class ExpandNestedSelectors extends Visitor { var newSequences = []; var first = sequences.first; - newSequences.add(new SimpleSelectorSequence(first.simpleSelector, - first.span, TokenKind.COMBINATOR_DESCENDANT)); + newSequences.add(new SimpleSelectorSequence( + first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT)); newSequences.addAll(sequences.skip(1)); return newSequences; @@ -407,8 +406,8 @@ class _MediaRulesReplacer extends Visitor { * Look for the [ruleSet] inside of an @media directive; if found then replace * with the [newRules]. If [ruleSet] is found and replaced return true. */ - static bool replace(StyleSheet styleSheet, RuleSet ruleSet, - ListnewRules) { + static bool replace( + StyleSheet styleSheet, RuleSet ruleSet, List newRules) { var visitor = new _MediaRulesReplacer(ruleSet, newRules); visitor.visitStyleSheet(styleSheet); return visitor._foundAndReplaced; @@ -459,8 +458,8 @@ class TopLevelIncludes extends Visitor { if (map.containsKey(node.name)) { var mixinDef = map[node.name]; if (mixinDef is MixinRulesetDirective) { - _TopLevelIncludeReplacer.replace(_messages, _styleSheet, node, - mixinDef.rulesets); + _TopLevelIncludeReplacer.replace( + _messages, _styleSheet, node, mixinDef.rulesets); } else if (currDef is MixinRulesetDirective && _anyRulesets(currDef)) { // currDef is MixinRulesetDirective MixinRulesetDirective mixinRuleset = currDef; @@ -519,7 +518,7 @@ class _TopLevelIncludeReplacer extends Visitor { * with the [newRules]. If [ruleSet] is found and replaced return true. */ static bool replace(Messages messages, StyleSheet styleSheet, - IncludeDirective include, ListnewRules) { + IncludeDirective include, List newRules) { var visitor = new _TopLevelIncludeReplacer(messages, include, newRules); visitor.visitStyleSheet(styleSheet); return visitor._foundAndReplaced; @@ -555,13 +554,12 @@ class _TopLevelIncludeReplacer extends Visitor { * can be an include in a declaration or an include directive (top-level). */ int _findInclude(List list, var node) { - IncludeDirective matchNode = (node is IncludeMixinAtDeclaration) ? - node.include : node; + IncludeDirective matchNode = + (node is IncludeMixinAtDeclaration) ? node.include : node; var index = 0; for (var item in list) { - var includeNode = (item is IncludeMixinAtDeclaration) ? - item.include : item; + var includeNode = (item is IncludeMixinAtDeclaration) ? item.include : item; if (includeNode == matchNode) return index; index++; } @@ -724,8 +722,8 @@ class DeclarationIncludes extends Visitor { rulesets.every((rule) => rule is IncludeDirective || rule is NoOp); CallMixin _createCallDeclMixin(MixinDefinition mixinDef) { - callMap.putIfAbsent(mixinDef.name, () => - callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs)); + callMap.putIfAbsent(mixinDef.name, + () => callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs)); return callMap[mixinDef.name]; } @@ -750,8 +748,8 @@ class DeclarationIncludes extends Visitor { if (!_allIncludes(mixinDef.rulesets) && currDeclGroup != null) { var index = _findInclude(currDeclGroup.declarations, node); if (index != -1) { - currDeclGroup.declarations.replaceRange(index, index + 1, - [new NoOp()]); + currDeclGroup.declarations.replaceRange( + index, index + 1, [new NoOp()]); } _messages.warning( "Using top-level mixin ${node.include.name} as a declaration", @@ -763,22 +761,22 @@ class DeclarationIncludes extends Visitor { var rulesets = []; if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) { origRulesets.forEach((ruleset) { - rulesets.add(new IncludeMixinAtDeclaration(ruleset, - ruleset.span)); + rulesets + .add(new IncludeMixinAtDeclaration(ruleset, ruleset.span)); }); _IncludeReplacer.replace(_styleSheet, node, rulesets); } } } - if ( mixinDef.definedArgs.length > 0 && node.include.args.length > 0) { + if (mixinDef.definedArgs.length > 0 && node.include.args.length > 0) { var callMixin = _createCallDeclMixin(mixinDef); mixinDef = callMixin.transform(node.include.args); } if (mixinDef is MixinDeclarationDirective) { - _IncludeReplacer.replace(_styleSheet, node, - mixinDef.declarations.declarations); + _IncludeReplacer.replace( + _styleSheet, node, mixinDef.declarations.declarations); } } else { _messages.warning("Undefined mixin ${node.include.name}", node.span); @@ -792,11 +790,11 @@ class DeclarationIncludes extends Visitor { var mixinDef = map[node.name]; if (currDef is MixinDeclarationDirective && mixinDef is MixinDeclarationDirective) { - _IncludeReplacer.replace(_styleSheet, node, - mixinDef.declarations.declarations); + _IncludeReplacer.replace( + _styleSheet, node, mixinDef.declarations.declarations); } else if (currDef is MixinDeclarationDirective) { - var decls = (currDef as MixinDeclarationDirective) - .declarations.declarations; + var decls = + (currDef as MixinDeclarationDirective).declarations.declarations; var index = _findInclude(decls, node); if (index != -1) { decls.replaceRange(index, index + 1, [new NoOp()]); @@ -835,7 +833,7 @@ class DeclarationIncludes extends Visitor { varDefs[node.definedName] = node; } super.visitVarDefinition(node); - } + } void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); @@ -852,8 +850,8 @@ class _IncludeReplacer extends Visitor { * Look for the [ruleSet] inside of a @media directive; if found then replace * with the [newRules]. */ - static void replace(StyleSheet ss, var include, - List newDeclarations) { + static void replace( + StyleSheet ss, var include, List newDeclarations) { var visitor = new _IncludeReplacer(include, newDeclarations); visitor.visitStyleSheet(ss); } @@ -973,12 +971,14 @@ class InheritExtends extends Visitor { InheritExtends(this._messages, this._allExtends); void visitSelectorGroup(SelectorGroup node) { - for (var selectorsIndex = 0; selectorsIndex < node.selectors.length; + for (var selectorsIndex = 0; + selectorsIndex < node.selectors.length; selectorsIndex++) { var selectors = node.selectors[selectorsIndex]; var isLastNone = false; var selectorName = ""; - for (var index = 0; index < selectors.simpleSelectorSequences.length; + for (var index = 0; + index < selectors.simpleSelectorSequences.length; index++) { var simpleSeq = selectors.simpleSelectorSequences[index]; var namePart = simpleSeq.simpleSelector.toString(); @@ -1001,8 +1001,8 @@ class InheritExtends extends Visitor { newSelectors.simpleSelectorSequences[index].combinator; newSeq.simpleSelectorSequences[0].combinator = orgCombinator; - newSelectors.simpleSelectorSequences.replaceRange(index, - index + 1, newSeq.simpleSelectorSequences); + newSelectors.simpleSelectorSequences.replaceRange( + index, index + 1, newSeq.simpleSelectorSequences); node.selectors.add(newSelectors); } isLastNone = false; diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 9a80ee1aa..125b5aefb 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -272,7 +272,6 @@ class CssPrinter extends Visitor { } } - void visitSelectorGroup(SelectorGroup node) { var selectors = node.selectors; var selectorsLength = selectors.length; diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 92f8451b7..d8abcab1e 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -47,14 +47,17 @@ class Message { final bool useColors; Message(this.level, this.message, {SourceSpan span, bool useColors: false}) - : this.span = span, this.useColors = useColors; + : this.span = span, + this.useColors = useColors; String toString() { var output = new StringBuffer(); bool colors = useColors && _ERROR_COLORS.containsKey(level); var levelColor = colors ? _ERROR_COLORS[level] : null; if (colors) output.write(levelColor); - output..write(_ERROR_LABEL[level])..write(' '); + output + ..write(_ERROR_LABEL[level]) + ..write(' '); if (colors) output.write(NO_COLOR); if (span == null) { @@ -87,8 +90,8 @@ class Messages { /** Report a compile-time CSS error. */ void error(String message, SourceSpan span) { - var msg = new Message(Level.SEVERE, message, span: span, - useColors: options.useColors); + var msg = new Message(Level.SEVERE, message, + span: span, useColors: options.useColors); messages.add(msg); @@ -100,8 +103,8 @@ class Messages { if (options.warningsAsErrors) { error(message, span); } else { - var msg = new Message(Level.WARNING, message, span: span, - useColors: options.useColors); + var msg = new Message(Level.WARNING, message, + span: span, useColors: options.useColors); messages.add(msg); } @@ -109,8 +112,8 @@ class Messages { /** Report and informational message about what the compiler is doing. */ void info(String message, SourceSpan span) { - var msg = new Message(Level.INFO, message, span: span, - useColors: options.useColors); + var msg = new Message(Level.INFO, message, + span: span, useColors: options.useColors); messages.add(msg); @@ -120,8 +123,11 @@ class Messages { /** Merge [newMessages] to this message lsit. */ void mergeMessages(Messages newMessages) { messages.addAll(newMessages.messages); - newMessages.messages.where((message) => - message.level.value == Level.SEVERE || options.verbose) - .forEach((message) { printHandler(message); }); + newMessages.messages + .where( + (message) => message.level.value == Level.SEVERE || options.verbose) + .forEach((message) { + printHandler(message); + }); } } diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/options.dart index a344a39dc..0ebb5b413 100644 --- a/pkgs/csslib/lib/src/options.dart +++ b/pkgs/csslib/lib/src/options.dart @@ -44,38 +44,48 @@ class PreprocessorOptions { factory PreprocessorOptions() => parse(['']); PreprocessorOptions.fromArgs(ArgResults args) - : warningsAsErrors = args['warnings_as_errors'], - throwOnWarnings = args['throw_on_warnings'], - throwOnErrors = args['throw_on_errors'], - verbose = args['verbose'], - checked = args['checked'], - lessSupport = args['less'], - useColors = args['colors'], - polyfill = args['polyfill'], - inputFile = args.rest.length > 0 ? args.rest[0] : null; + : warningsAsErrors = args['warnings_as_errors'], + throwOnWarnings = args['throw_on_warnings'], + throwOnErrors = args['throw_on_errors'], + verbose = args['verbose'], + checked = args['checked'], + lessSupport = args['less'], + useColors = args['colors'], + polyfill = args['polyfill'], + inputFile = args.rest.length > 0 ? args.rest[0] : null; // tool.dart [options...] static PreprocessorOptions parse(List arguments) { var parser = new ArgParser() - ..addFlag('verbose', abbr: 'v', defaultsTo: false, negatable: false, + ..addFlag('verbose', + abbr: 'v', + defaultsTo: false, + negatable: false, help: 'Display detail info') - ..addFlag('checked', defaultsTo: false, negatable: false, + ..addFlag('checked', + defaultsTo: false, + negatable: false, help: 'Validate CSS values invalid value display a warning message') - ..addFlag('less', defaultsTo: true, negatable: true, + ..addFlag('less', + defaultsTo: true, + negatable: true, help: 'Supports subset of Less syntax') - ..addFlag('suppress_warnings', defaultsTo: true, - help: 'Warnings not displayed') - ..addFlag('warnings_as_errors', defaultsTo: false, - help: 'Warning handled as errors') - ..addFlag('throw_on_errors', defaultsTo: false, - help: 'Throw on errors encountered') - ..addFlag('throw_on_warnings', defaultsTo: false, - help: 'Throw on warnings encountered') - ..addFlag('colors', defaultsTo: true, - help: 'Display errors/warnings in colored text') - ..addFlag('polyfill', defaultsTo: false, - help: 'Generate polyfill for new CSS features') - ..addFlag('help', abbr: 'h', defaultsTo: false, negatable: false, + ..addFlag('suppress_warnings', + defaultsTo: true, help: 'Warnings not displayed') + ..addFlag('warnings_as_errors', + defaultsTo: false, help: 'Warning handled as errors') + ..addFlag('throw_on_errors', + defaultsTo: false, help: 'Throw on errors encountered') + ..addFlag('throw_on_warnings', + defaultsTo: false, help: 'Throw on warnings encountered') + ..addFlag('colors', + defaultsTo: true, help: 'Display errors/warnings in colored text') + ..addFlag('polyfill', + defaultsTo: false, help: 'Generate polyfill for new CSS features') + ..addFlag('help', + abbr: 'h', + defaultsTo: false, + negatable: false, help: 'Displays this help message'); try { @@ -96,5 +106,4 @@ class PreprocessorOptions { print('Usage: css [options...] input.css'); print(parser.getUsage()); } - } diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index 95749b9fe..bdd833031 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -41,15 +41,14 @@ class PolyFill { void processVarDefinitions(List includes) { for (var include in includes) { _allVarDefinitions = (new _VarDefinitionsIncludes(_allVarDefinitions) - ..visitTree(include)).varDefs; + ..visitTree(include)).varDefs; } } void processVars(StyleSheet styleSheet) { // Build list of all var definitions. - var mainStyleSheetVarDefs = - (new _VarDefAndUsage(this._messages, _allVarDefinitions) - ..visitTree(styleSheet)).varDefs; + var mainStyleSheetVarDefs = (new _VarDefAndUsage( + this._messages, _allVarDefinitions)..visitTree(styleSheet)).varDefs; // Resolve all definitions to a non-VarUsage (terminal expression). mainStyleSheetVarDefs.forEach((key, value) { @@ -75,7 +74,7 @@ class _VarDefinitionsIncludes extends Visitor { // Replace with latest variable definition. varDefs[node.definedName] = node; super.visitVarDefinition(node); - } + } void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); @@ -110,7 +109,7 @@ class _VarDefAndUsage extends Visitor { super.visitVarDefinition(node); currVarDefinition = null; - } + } void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); @@ -149,7 +148,7 @@ class _VarDefAndUsage extends Visitor { terminalDefaults.addAll(resolveUsageTerminal(defaultValue)); } expressions.replaceRange(index, index + 1, terminalDefaults); - } else if (node.defaultValues.isNotEmpty){ + } else if (node.defaultValues.isNotEmpty) { // No VarDefinition but default value is a terminal expression; use it. expressions.replaceRange(index, index + 1, node.defaultValues); } else { @@ -199,8 +198,7 @@ class _VarDefAndUsage extends Visitor { return result; } - _resolveVarUsage(List expressions, int index, - VarDefinition def) { + _resolveVarUsage(List expressions, int index, VarDefinition def) { var defExpressions = (def.expression as Expressions).expressions; expressions.replaceRange(index, index + 1, defExpressions); } @@ -224,8 +222,8 @@ class _RemoveVarDefinitions extends Visitor { } /** Find terminal definition (non VarUsage implies real CSS value). */ -VarDefinition _findTerminalVarDefinition(Map varDefs, - VarDefinition varDef) { +VarDefinition _findTerminalVarDefinition( + Map varDefs, VarDefinition varDef) { var expressions = varDef.expression as Expressions; for (var expr in expressions.expressions) { if (expr is VarUsage) { diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 5219c2570..7e12352fb 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -29,7 +29,6 @@ abstract class _StyleProperty { String get cssExpression; } - /** * Base interface for Color, HSL and RGB. */ @@ -47,7 +46,6 @@ abstract class ColorBase { int get argbValue; } - /** * General purpse Color class. Represent a color as an ARGB value that can be * converted to and from num, hex string, hsl, hsla, rgb, rgba and SVG pre- @@ -68,8 +66,7 @@ class Color implements _StyleProperty, ColorBase { * Color.gold, where ff is red intensity, d7 is green intensity, and 00 is * blue intensity. */ - Color(int rgb, [num alpha]) : - this._argb = Color._rgbToArgbString(rgb, alpha); + Color(int rgb, [num alpha]) : this._argb = Color._rgbToArgbString(rgb, alpha); /** * RGB takes three values. The [red], [green], and [blue] parameters are @@ -81,18 +78,16 @@ class Color implements _StyleProperty, ColorBase { * internally be mapped to an int between '0' and '255' like the other color * components. */ - Color.createRgba(int red, int green, int blue, [num alpha]) : - this._argb = Color.convertToHexString(Color._clamp(red, 0, 255), - Color._clamp(green, 0, 255), - Color._clamp(blue, 0, 255), + Color.createRgba(int red, int green, int blue, [num alpha]) + : this._argb = Color.convertToHexString(Color._clamp(red, 0, 255), + Color._clamp(green, 0, 255), Color._clamp(blue, 0, 255), alpha != null ? Color._clamp(alpha, 0, 1) : alpha); /** * Creates a new color from a CSS color string. For more information, see * . */ - Color.css(String color) : - this._argb = Color._convertCssToArgb(color); + Color.css(String color) : this._argb = Color._convertCssToArgb(color); // TODO(jmesserly): I found the use of percents a bit suprising. /** @@ -109,8 +104,8 @@ class Color implements _StyleProperty, ColorBase { * foreground). */ Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent, - [num alpha]) : - this._argb = new Hsla(Color._clamp(hueDegree, 0, 360) / 360, + [num alpha]) + : this._argb = new Hsla(Color._clamp(hueDegree, 0, 360) / 360, Color._clamp(saturationPercent, 0, 100) / 100, Color._clamp(lightnessPercent, 0, 100) / 100, alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString(); @@ -130,10 +125,9 @@ class Color implements _StyleProperty, ColorBase { * completely transparent foreground and 1 is a completely * opaque foreground. */ - Color.hslaRaw(num hue, num saturation, num lightness, [num alpha]) : - this._argb = new Hsla(Color._clamp(hue, 0, 1), - Color._clamp(saturation, 0, 1), - Color._clamp(lightness, 0, 1), + Color.hslaRaw(num hue, num saturation, num lightness, [num alpha]) + : this._argb = new Hsla(Color._clamp(hue, 0, 1), + Color._clamp(saturation, 0, 1), Color._clamp(lightness, 0, 1), alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString(); /** @@ -151,7 +145,7 @@ class Color implements _StyleProperty, ColorBase { // create the CSS from the normalized value. String get cssExpression { if (_argb.length == 6) { - return "#$_argb"; // RGB only, no alpha blending. + return "#$_argb"; // RGB only, no alpha blending. } else { num alpha = Color.hexToInt(_argb.substring(0, 2)); String a = (alpha / 255).toStringAsPrecision(2); @@ -246,7 +240,7 @@ class Color implements _StyleProperty, ColorBase { String color = value.trim().replaceAll("\\s", ""); if (color[0] == '#') { String v = color.substring(1); - Color.hexToInt(v); // Valid hexadecimal, throws if not. + Color.hexToInt(v); // Valid hexadecimal, throws if not. return v; } else if (color.length > 0 && color[color.length - 1] == ')') { int type; @@ -266,7 +260,7 @@ class Color implements _StyleProperty, ColorBase { throw new UnsupportedError('CSS property not implemented'); } - color = color.substring(0, color.length - 1); // Strip close paren. + color = color.substring(0, color.length - 1); // Strip close paren. var args = []; List params = color.split(","); @@ -281,8 +275,7 @@ class Color implements _StyleProperty, ColorBase { case _hslCss: return new Hsla(args[0], args[1], args[2]).toHexArgbString(); case _hslaCss: - return new Hsla(args[0], args[1], args[2], - args[3]).toHexArgbString(); + return new Hsla(args[0], args[1], args[2], args[3]).toHexArgbString(); default: // Type not defined UnsupportedOperationException should have thrown. assert(true); @@ -297,8 +290,9 @@ class Color implements _StyleProperty, ColorBase { String rHex = Color._numAs2DigitHex(Color._clamp(r, 0, 255)); String gHex = Color._numAs2DigitHex(Color._clamp(g, 0, 255)); String bHex = Color._numAs2DigitHex(Color._clamp(b, 0, 255)); - String aHex = (a != null) ? - Color._numAs2DigitHex((Color._clamp(a, 0, 1) * 255).round()) : ""; + String aHex = (a != null) + ? Color._numAs2DigitHex((Color._clamp(a, 0, 1) * 255).round()) + : ""; // TODO(terry) 15.toRadixString(16) return 'F' on Dartium not f as in JS. // bug: @@ -361,7 +355,7 @@ class Color implements _StyleProperty, ColorBase { Color._clamp(((1 - delta) * v + (delta * 255)).round(), 0, 255); // Predefined CSS colors see - static final Color transparent = const Color.hex("00ffffff"); // Alpha 0.0 + static final Color transparent = const Color.hex("00ffffff"); // Alpha 0.0 static final Color aliceBlue = const Color.hex("0f08ff"); static final Color antiqueWhite = const Color.hex("0faebd7"); static final Color aqua = const Color.hex("00ffff"); @@ -511,7 +505,6 @@ class Color implements _StyleProperty, ColorBase { static final Color yellowGreen = const Color.hex("9acd32"); } - /** * Rgba class for users that want to interact with a color as a RGBA value. */ @@ -523,22 +516,22 @@ class Rgba implements _StyleProperty, ColorBase { final int b; final num a; - Rgba(int red, int green, int blue, [num alpha]) : - this.r = Color._clamp(red, 0, 255), - this.g = Color._clamp(green, 0, 255), - this.b = Color._clamp(blue, 0, 255), - this.a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; + Rgba(int red, int green, int blue, [num alpha]) + : this.r = Color._clamp(red, 0, 255), + this.g = Color._clamp(green, 0, 255), + this.b = Color._clamp(blue, 0, 255), + this.a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; factory Rgba.fromString(String hexValue) => - new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; + new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; factory Rgba.fromColor(Color color) => color.rgba; factory Rgba.fromArgbValue(num value) { - return new Rgba(((value.toInt() & 0xff000000) >> 0x18), /* a */ - ((value.toInt() & 0xff0000) >> 0x10), /* r */ - ((value.toInt() & 0xff00) >> 8), /* g */ - ((value.toInt() & 0xff))); /* b */ + return new Rgba(((value.toInt() & 0xff000000) >> 0x18), /* a */ + ((value.toInt() & 0xff0000) >> 0x10), /* r */ + ((value.toInt() & 0xff00) >> 8), /* g */ + ((value.toInt() & 0xff))); /* b */ } factory Rgba.fromHsla(Hsla hsla) { @@ -569,9 +562,9 @@ class Rgba implements _StyleProperty, ColorBase { } num var1 = 2 * l - var2; - r = (255 * Rgba._hueToRGB(var1, var2, h + (1/3))).round().toInt(); + r = (255 * Rgba._hueToRGB(var1, var2, h + (1 / 3))).round().toInt(); g = (255 * Rgba._hueToRGB(var1, var2, h)).round().toInt(); - b = (255 * Rgba._hueToRGB(var1, var2, h - (1/3))).round().toInt(); + b = (255 * Rgba._hueToRGB(var1, var2, h - (1 / 3))).round().toInt(); } return new Rgba(r, g, b, a); @@ -632,7 +625,6 @@ class Rgba implements _StyleProperty, ColorBase { int get hashCode => toHexArgbString().hashCode; } - /** * Hsl class support to interact with a color as a hsl with hue, saturation, and * lightness with optional alpha blending. The hue is a ratio of 360 degrees @@ -640,10 +632,10 @@ class Rgba implements _StyleProperty, ColorBase { * (1 == 100%) and alpha is a 0..1 fraction. */ class Hsla implements _StyleProperty, ColorBase { - final num _h; // Value from 0..1 - final num _s; // Value from 0..1 - final num _l; // Value from 0..1 - final num _a; // Value from 0..1 + final num _h; // Value from 0..1 + final num _s; // Value from 0..1 + final num _l; // Value from 0..1 + final num _a; // Value from 0..1 /** * [hue] is a 0..1 fraction of 360 degrees (360 == 0). @@ -651,11 +643,11 @@ class Hsla implements _StyleProperty, ColorBase { * [lightness] is a 0..1 fraction (100% == 1). * [alpha] is a 0..1 fraction, alpha blending between 0..1, 1 == 100% opaque. */ - Hsla(num hue, num saturation, num lightness, [num alpha]) : - this._h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1), - this._s = Color._clamp(saturation, 0, 1), - this._l = Color._clamp(lightness, 0, 1), - this._a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; + Hsla(num hue, num saturation, num lightness, [num alpha]) + : this._h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1), + this._s = Color._clamp(saturation, 0, 1), + this._l = Color._clamp(lightness, 0, 1), + this._a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; factory Hsla.fromString(String hexValue) { Rgba rgba = new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; @@ -682,7 +674,7 @@ class Hsla implements _StyleProperty, ColorBase { } factory Hsla.fromRgba(Rgba rgba) => - _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a); + _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a); static Hsla _createFromRgba(num r, num g, num b, num a) { // Convert RGB to hsl. @@ -701,7 +693,7 @@ class Hsla implements _StyleProperty, ColorBase { num maxRgb = math.max(r, math.max(g, b)); l = (maxRgb + minRgb) / 2; if (l <= 0) { - return new Hsla(0, 0, l); // Black; + return new Hsla(0, 0, l); // Black; } num vm = maxRgb - minRgb; @@ -709,7 +701,7 @@ class Hsla implements _StyleProperty, ColorBase { if (s > 0) { s /= (l < 0.5) ? (maxRgb + minRgb) : (2 - maxRgb - minRgb); } else { - return new Hsla(0, 0, l); // White + return new Hsla(0, 0, l); // White } num r2, g2, b2; @@ -765,9 +757,9 @@ class Hsla implements _StyleProperty, ColorBase { bool operator ==(other) => Color.equal(this, other); - String get cssExpression => (_a == null) ? - "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)" : - "hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)"; + String get cssExpression => (_a == null) + ? "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)" + : "hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)"; String toHexArgbString() => new Rgba.fromHsla(this).toHexArgbString(); @@ -785,7 +777,6 @@ class Hsla implements _StyleProperty, ColorBase { int get hashCode => toHexArgbString().hashCode; } - /** X,Y position. */ class PointXY implements _StyleProperty { final num x, y; @@ -796,7 +787,6 @@ class PointXY implements _StyleProperty { } } - // TODO(terry): Implement style and color. /** * Supports border for measuring with layout. @@ -810,22 +800,25 @@ class Border implements _StyleProperty { const Border([this.top, this.left, this.bottom, this.right]); // TODO(terry): Consider using Size or width and height. - Border.uniform(num amount) : - top = amount, left = amount, bottom = amount, right = amount; + Border.uniform(num amount) + : top = amount, + left = amount, + bottom = amount, + right = amount; int get width => left + right; int get height => top + bottom; String get cssExpression { - return (top == left && bottom == right && top == right) ? "${left}px" : - "${top != null ? '$top' : '0'}px ${ + return (top == left && bottom == right && top == right) + ? "${left}px" + : "${top != null ? '$top' : '0'}px ${ right != null ? '$right' : '0'}px ${ bottom != null ? '$bottom' : '0'}px ${ left != null ? '$left' : '0'}px"; } } - /** Font style constants. */ class FontStyle { /** Font style [normal] default. */ @@ -842,7 +835,6 @@ class FontStyle { static const String oblique = "oblique"; } - /** Font variant constants. */ class FontVariant { /** Font style [normal] default. */ @@ -851,7 +843,6 @@ class FontVariant { static const String smallCaps = "small-caps"; } - /** Font weight constants values 100, 200, 300, 400, 500, 600, 700, 800, 900. */ class FontWeight { /** Font weight normal [default] */ @@ -870,7 +861,6 @@ class FontWeight { static const int wt900 = 900; } - /** Generic font family names. */ class FontGeneric { /** Generic family sans-serif font (w/o serifs). */ @@ -885,7 +875,6 @@ class FontGeneric { static const String fantasy = "fantasy"; } - /** * List of most common font families across different platforms. Use the * collection names in the Font class (e.g., Font.SANS_SERIF, Font.FONT_SERIF, @@ -945,7 +934,7 @@ class FontFamily { class LineHeight { final num height; final bool inPixels; - const LineHeight(this.height, {this.inPixels : true}); + const LineHeight(this.height, {this.inPixels: true}); } // TODO(terry): Support @font-face fule. @@ -954,31 +943,41 @@ class LineHeight { */ class Font implements _StyleProperty { /** Collection of most common sans-serif fonts in order. */ - static const List sansSerif = const [FontFamily.arial, - FontFamily.verdana, - FontFamily.geneva, - FontFamily.helvetica, - FontGeneric.sansSerif]; + static const List sansSerif = const [ + FontFamily.arial, + FontFamily.verdana, + FontFamily.geneva, + FontFamily.helvetica, + FontGeneric.sansSerif + ]; /** Collection of most common serif fonts in order. */ - static const List serif = const [FontFamily.georgia, - FontFamily.timesNewRoman, - FontFamily.times, - FontGeneric.serif]; + static const List serif = const [ + FontFamily.georgia, + FontFamily.timesNewRoman, + FontFamily.times, + FontGeneric.serif + ]; /** Collection of most common monospace fonts in order. */ - static const List monospace = const [FontFamily.courierNew, - FontFamily.courier, - FontGeneric.monospace]; + static const List monospace = const [ + FontFamily.courierNew, + FontFamily.courier, + FontGeneric.monospace + ]; /** Collection of most common cursive fonts in order. */ - static const List cursive = const [FontFamily.textile, - FontFamily.appleChancery, - FontFamily.zaphChancery, - FontGeneric.fantasy]; + static const List cursive = const [ + FontFamily.textile, + FontFamily.appleChancery, + FontFamily.zaphChancery, + FontGeneric.fantasy + ]; /** Collection of most common fantasy fonts in order. */ - static const List fantasy = const [FontFamily.comicSansMs, - FontFamily.impact, - FontFamily.webdings, - FontGeneric.fantasy]; + static const List fantasy = const [ + FontFamily.comicSansMs, + FontFamily.impact, + FontFamily.webdings, + FontGeneric.fantasy + ]; // TODO(terry): Should support the values xx-small, small, large, xx-large, // etc. (mapped to a pixel sized font)? @@ -1028,7 +1027,7 @@ class Font implements _StyleProperty { * pixels, if not specified it's 1.2 the font size. */ const Font({this.size, this.family, this.weight, this.style, this.variant, - this.lineHeight}); + this.lineHeight}); /** * Merge the two fonts and return the result. See [Style.merge] for @@ -1041,12 +1040,12 @@ class Font implements _StyleProperty { } Font._merge(Font a, Font b) - : size = _mergeVal(a.size, b.size), - family = _mergeVal(a.family, b.family), - weight = _mergeVal(a.weight, b.weight), - style = _mergeVal(a.style, b.style), - variant = _mergeVal(a.variant, b.variant), - lineHeight = _mergeVal(a.lineHeight, b.lineHeight); + : size = _mergeVal(a.size, b.size), + family = _mergeVal(a.family, b.family), + weight = _mergeVal(a.weight, b.weight), + style = _mergeVal(a.style, b.style), + variant = _mergeVal(a.variant, b.variant), + lineHeight = _mergeVal(a.lineHeight, b.lineHeight); /** * Shorthand CSS format for font is: @@ -1069,9 +1068,12 @@ class Font implements _StyleProperty { return '${size}px $_fontsAsString'; } - Font scale(num ratio) => - new Font(size: size * ratio, family: family, weight: weight, style: style, - variant: variant); + Font scale(num ratio) => new Font( + size: size * ratio, + family: family, + weight: weight, + style: style, + variant: variant); /** * The lineHeight, provides an indirect means to specify the leading. The @@ -1102,8 +1104,12 @@ class Font implements _StyleProperty { bool operator ==(other) { if (other is! Font) return false; Font o = other; - return o.size == size && o.family == family && o.weight == weight && - o.lineHeight == lineHeight && o.style == style && o.variant == variant; + return o.size == size && + o.family == family && + o.weight == weight && + o.lineHeight == lineHeight && + o.style == style && + o.variant == variant; } // TODO(terry): This is fragile should probably just iterate through the list @@ -1152,14 +1158,17 @@ class BoxEdge { * * . */ - const BoxEdge.clockwiseFromTop(this.top, this.right, this.bottom, this.left); + const BoxEdge.clockwiseFromTop(this.top, this.right, this.bottom, this.left); /** * This is a helper to creates a box edge with the same [left], [top] * [right], and [bottom] widths. */ const BoxEdge.uniform(num size) - : top = size, left = size, bottom = size, right = size; + : top = size, + left = size, + bottom = size, + right = size; /** * Takes a possibly null box edge, with possibly null metrics, and fills @@ -1202,10 +1211,10 @@ class BoxEdge { } BoxEdge._merge(BoxEdge x, BoxEdge y) - : left = _mergeVal(x.left, y.left), - top = _mergeVal(x.top, y.top), - right = _mergeVal(x.right, y.right), - bottom = _mergeVal(x.bottom, y.bottom); + : left = _mergeVal(x.left, y.left), + top = _mergeVal(x.top, y.top), + right = _mergeVal(x.right, y.right), + bottom = _mergeVal(x.bottom, y.bottom); /** * The total size of the horizontal edges. Equal to [left] + [right], where diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index b78fbccc4..e30484d58 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -61,6 +61,5 @@ class ErrorToken extends Token { class IdentifierToken extends Token { final String text; - IdentifierToken(this.text, int kind, FileSpan span) - : super(kind, span); + IdentifierToken(this.text, int kind, FileSpan span) : super(kind, span); } diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 8d929abeb..ed616d2d8 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -15,8 +15,7 @@ class Tokenizer extends TokenizerBase { /** CDATA keyword. */ final List CDATA_NAME = 'CDATA'.codeUnits; - Tokenizer(SourceFile file, String text, bool skipWhitespace, - [int index = 0]) + Tokenizer(SourceFile file, String text, bool skipWhitespace, [int index = 0]) : super(file, text, skipWhitespace, index); Token next({unicodeRange: false}) { @@ -44,12 +43,12 @@ class Tokenizer extends TokenizerBase { Token ident = finishIdentifier(); // Is it a directive? - int tokId = TokenKind.matchDirectives(_text, _startIndex, - _index - _startIndex); + int tokId = TokenKind.matchDirectives( + _text, _startIndex, _index - _startIndex); if (tokId == -1) { // No, is it a margin directive? - tokId = TokenKind.matchMarginDirectives(_text, _startIndex, - _index - _startIndex); + tokId = TokenKind.matchMarginDirectives( + _text, _startIndex, _index - _startIndex); } if (tokId != -1) { @@ -63,7 +62,7 @@ class Tokenizer extends TokenizerBase { } return _finishToken(TokenKind.AT); case TokenChar.DOT: - int start = _startIndex; // Start where the dot started. + int start = _startIndex; // Start where the dot started. if (maybeEatDigit()) { // looks like a number dot followed by digit(s). Token number = finishNumber(); @@ -116,19 +115,19 @@ class Tokenizer extends TokenizerBase { return _finishToken(TokenKind.GREATER); case TokenChar.TILDE: if (_maybeEatChar(TokenChar.EQUALS)) { - return _finishToken(TokenKind.INCLUDES); // ~= + return _finishToken(TokenKind.INCLUDES); // ~= } return _finishToken(TokenKind.TILDE); case TokenChar.ASTERISK: if (_maybeEatChar(TokenChar.EQUALS)) { - return _finishToken(TokenKind.SUBSTRING_MATCH); // *= + return _finishToken(TokenKind.SUBSTRING_MATCH); // *= } return _finishToken(TokenKind.ASTERISK); case TokenChar.AMPERSAND: return _finishToken(TokenKind.AMPERSAND); case TokenChar.NAMESPACE: if (_maybeEatChar(TokenChar.EQUALS)) { - return _finishToken(TokenKind.DASH_MATCH); // |= + return _finishToken(TokenKind.DASH_MATCH); // |= } return _finishToken(TokenKind.NAMESPACE); case TokenChar.COLON: @@ -146,7 +145,7 @@ class Tokenizer extends TokenizerBase { case TokenChar.SLASH: if (_maybeEatChar(TokenChar.ASTERISK)) return finishMultiLineComment(); return _finishToken(TokenKind.SLASH); - case TokenChar.LESS: // ). class CommentDefinition extends CssComment { - CommentDefinition(String comment, SourceSpan span): super(comment, span); + CommentDefinition(String comment, SourceSpan span) : super(comment, span); CommentDefinition clone() => new CommentDefinition(comment, span); visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); } @@ -63,7 +63,7 @@ class CommentDefinition extends CssComment { class SelectorGroup extends TreeNode { final List selectors; - SelectorGroup(this.selectors, SourceSpan span): super(span); + SelectorGroup(this.selectors, SourceSpan span) : super(span); SelectorGroup clone() => new SelectorGroup(selectors, span); @@ -80,9 +80,8 @@ class Selector extends TreeNode { int get length => simpleSelectorSequences.length; Selector clone() { - var simpleSequences = simpleSelectorSequences - .map((ss) => ss.clone()) - .toList(); + var simpleSequences = + simpleSelectorSequences.map((ss) => ss.clone()).toList(); return new Selector(simpleSequences, span); } @@ -97,7 +96,8 @@ class SimpleSelectorSequence extends TreeNode { SimpleSelectorSequence(this.simpleSelector, SourceSpan span, [int combinator = TokenKind.COMBINATOR_NONE]) - : combinator = combinator, super(span); + : combinator = combinator, + super(span); bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE; bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS; @@ -106,11 +106,11 @@ class SimpleSelectorSequence extends TreeNode { bool get isCombinatorDescendant => combinator == TokenKind.COMBINATOR_DESCENDANT; - String get _combinatorToString => - isCombinatorDescendant ? ' ' : - isCombinatorPlus ? ' + ' : - isCombinatorGreater ? ' > ' : - isCombinatorTilde ? ' ~ ' : ''; + String get _combinatorToString => isCombinatorDescendant + ? ' ' + : isCombinatorPlus + ? ' + ' + : isCombinatorGreater ? ' > ' : isCombinatorTilde ? ' ~ ' : ''; SimpleSelectorSequence clone() => new SimpleSelectorSequence(simpleSelector, span, combinator); @@ -149,7 +149,7 @@ class ElementSelector extends SimpleSelector { // namespace|element class NamespaceSelector extends SimpleSelector { - final _namespace; // null, Wildcard or Identifier + final _namespace; // null, Wildcard or Identifier NamespaceSelector(this._namespace, var name, SourceSpan span) : super(name, span); @@ -173,8 +173,8 @@ class AttributeSelector extends SimpleSelector { final int _op; final _value; - AttributeSelector(Identifier name, this._op, this._value, - SourceSpan span) : super(name, span); + AttributeSelector(Identifier name, this._op, this._value, SourceSpan span) + : super(name, span); int get operatorKind => _op; @@ -182,38 +182,38 @@ class AttributeSelector extends SimpleSelector { String matchOperator() { switch (_op) { - case TokenKind.EQUALS: - return '='; - case TokenKind.INCLUDES: - return '~='; - case TokenKind.DASH_MATCH: - return '|='; - case TokenKind.PREFIX_MATCH: - return '^='; - case TokenKind.SUFFIX_MATCH: - return '\$='; - case TokenKind.SUBSTRING_MATCH: - return '*='; - case TokenKind.NO_MATCH: - return ''; + case TokenKind.EQUALS: + return '='; + case TokenKind.INCLUDES: + return '~='; + case TokenKind.DASH_MATCH: + return '|='; + case TokenKind.PREFIX_MATCH: + return '^='; + case TokenKind.SUFFIX_MATCH: + return '\$='; + case TokenKind.SUBSTRING_MATCH: + return '*='; + case TokenKind.NO_MATCH: + return ''; } } // Return the TokenKind for operator used by visitAttributeSelector. String matchOperatorAsTokenString() { switch (_op) { - case TokenKind.EQUALS: - return 'EQUALS'; - case TokenKind.INCLUDES: - return 'INCLUDES'; - case TokenKind.DASH_MATCH: - return 'DASH_MATCH'; - case TokenKind.PREFIX_MATCH: - return 'PREFIX_MATCH'; - case TokenKind.SUFFIX_MATCH: - return 'SUFFIX_MATCH'; - case TokenKind.SUBSTRING_MATCH: - return 'SUBSTRING_MATCH'; + case TokenKind.EQUALS: + return 'EQUALS'; + case TokenKind.INCLUDES: + return 'INCLUDES'; + case TokenKind.DASH_MATCH: + return 'DASH_MATCH'; + case TokenKind.PREFIX_MATCH: + return 'PREFIX_MATCH'; + case TokenKind.SUFFIX_MATCH: + return 'SUFFIX_MATCH'; + case TokenKind.SUBSTRING_MATCH: + return 'SUBSTRING_MATCH'; } } @@ -284,16 +284,15 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { PseudoClassFunctionSelector clone() => new PseudoClassFunctionSelector(_name, expression, span); - visit(VisitorBase visitor) => - visitor.visitPseudoClassFunctionSelector(this); + visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); } // ::pseudoElementFunction(expression) class PseudoElementFunctionSelector extends PseudoElementSelector { final SelectorExpression expression; - PseudoElementFunctionSelector(Identifier name, this.expression, - SourceSpan span) + PseudoElementFunctionSelector( + Identifier name, this.expression, SourceSpan span) : super(name, span); PseudoElementFunctionSelector clone() => @@ -306,7 +305,7 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { class SelectorExpression extends TreeNode { final List expressions; - SelectorExpression(this.expressions, SourceSpan span): super(span); + SelectorExpression(this.expressions, SourceSpan span) : super(span); SelectorExpression clone() { return new SelectorExpression( @@ -387,8 +386,8 @@ class RuleSet extends TopLevelProduction { class Directive extends TreeNode { Directive(SourceSpan span) : super(span); - bool get isBuiltIn => true; // Known CSS directive? - bool get isExtension => false; // SCSS extension? + bool get isBuiltIn => true; // Known CSS directive? + bool get isExtension => false; // SCSS extension? Directive clone() => new Directive(span); visit(VisitorBase visitor) => visitor.visitDirective(this); @@ -424,8 +423,8 @@ class MediaExpression extends TreeNode { final Identifier _mediaFeature; final Expressions exprs; - MediaExpression(this.andOperator, this._mediaFeature, this.exprs, - SourceSpan span) + MediaExpression( + this.andOperator, this._mediaFeature, this.exprs, SourceSpan span) : super(span); String get mediaFeature => _mediaFeature.name; @@ -455,8 +454,8 @@ class MediaQuery extends TreeNode { final Identifier _mediaType; final List expressions; - MediaQuery(this._mediaUnary, this._mediaType, this.expressions, - SourceSpan span) + MediaQuery( + this._mediaUnary, this._mediaType, this.expressions, SourceSpan span) : super(span); bool get hasMediaType => _mediaType != null; @@ -519,8 +518,9 @@ class PageDirective extends Directive { final String _pseudoPage; final List _declsMargin; - PageDirective(this._ident, this._pseudoPage, this._declsMargin, - SourceSpan span) : super(span); + PageDirective( + this._ident, this._pseudoPage, this._declsMargin, SourceSpan span) + : super(span); PageDirective clone() { var cloneDeclsMargin = []; @@ -553,7 +553,8 @@ class KeyFrameDirective extends Directive { final List _blocks; KeyFrameDirective(this._keyframeName, this.name, SourceSpan span) - : _blocks = [], super(span); + : _blocks = [], + super(span); add(KeyFrameBlock block) { _blocks.add(block); @@ -564,9 +565,12 @@ class KeyFrameDirective extends Directive { case TokenKind.DIRECTIVE_KEYFRAMES: case TokenKind.DIRECTIVE_MS_KEYFRAMES: return '@keyframes'; - case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES: return '@-webkit-keyframes'; - case TokenKind.DIRECTIVE_MOZ_KEYFRAMES: return '@-moz-keyframes'; - case TokenKind.DIRECTIVE_O_KEYFRAMES: return '@-o-keyframes'; + case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES: + return '@-webkit-keyframes'; + case TokenKind.DIRECTIVE_MOZ_KEYFRAMES: + return '@-moz-keyframes'; + case TokenKind.DIRECTIVE_O_KEYFRAMES: + return '@-o-keyframes'; } } @@ -607,7 +611,7 @@ class StyletDirective extends Directive { final List rulesets; StyletDirective(this.dartClassName, this.rulesets, SourceSpan span) - : super(span); + : super(span); bool get isBuiltIn => false; bool get isExtension => true; @@ -675,8 +679,8 @@ class MixinRulesetDirective extends MixinDefinition { final List rulesets; MixinRulesetDirective(String name, List args, - bool varArgs, this.rulesets, SourceSpan span) : - super(name, args, varArgs, span); + bool varArgs, this.rulesets, SourceSpan span) + : super(name, args, varArgs, span); MixinRulesetDirective clone() { var clonedArgs = []; @@ -687,8 +691,8 @@ class MixinRulesetDirective extends MixinDefinition { for (var ruleset in rulesets) { clonedRulesets.add(ruleset.clone()); } - return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets, - span); + return new MixinRulesetDirective( + name, clonedArgs, varArgs, clonedRulesets, span); } visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); @@ -697,17 +701,17 @@ class MixinRulesetDirective extends MixinDefinition { class MixinDeclarationDirective extends MixinDefinition { final DeclarationGroup declarations; - MixinDeclarationDirective(String name, List args, - bool varArgs, this.declarations, SourceSpan span) : - super(name, args, varArgs, span); + MixinDeclarationDirective(String name, List args, + bool varArgs, this.declarations, SourceSpan span) + : super(name, args, varArgs, span); MixinDeclarationDirective clone() { var clonedArgs = []; for (var arg in definedArgs) { clonedArgs.add(arg.clone()); } - return new MixinDeclarationDirective(name, clonedArgs, varArgs, - declarations.clone(), span); + return new MixinDeclarationDirective( + name, clonedArgs, varArgs, declarations.clone(), span); } visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); @@ -758,16 +762,18 @@ class Declaration extends TreeNode { final bool isIE7; Declaration(this._property, this._expression, this.dartStyle, SourceSpan span, - {important: false, ie7: false}) - : this.important = important, this.isIE7 = ie7, super(span); + {important: false, ie7: false}) + : this.important = important, + this.isIE7 = ie7, + super(span); String get property => isIE7 ? '*${_property.name}' : _property.name; Expression get expression => _expression; bool get hasDartStyle => dartStyle != null; - Declaration clone() => - new Declaration(_property.clone(), _expression.clone(), dartStyle, span, + Declaration clone() => new Declaration( + _property.clone(), _expression.clone(), dartStyle, span, important: important); visit(VisitorBase visitor) => visitor.visitDeclaration(this); @@ -787,9 +793,8 @@ class VarDefinition extends Declaration { String get definedName => _property.name; - VarDefinition clone() => - new VarDefinition(_property.clone(), - expression != null ? expression.clone() : null, span); + VarDefinition clone() => new VarDefinition( + _property.clone(), expression != null ? expression.clone() : null, span); visit(VisitorBase visitor) => visitor.visitVarDefinition(this); } @@ -810,15 +815,14 @@ class IncludeMixinAtDeclaration extends Declaration { IncludeMixinAtDeclaration clone() => new IncludeMixinAtDeclaration(include.clone(), span); - visit(VisitorBase visitor) => - visitor.visitIncludeMixinAtDeclaration(this); + visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this); } class ExtendDeclaration extends Declaration { final List selectors; - ExtendDeclaration(this.selectors, SourceSpan span) : - super(null, null, null, span); + ExtendDeclaration(this.selectors, SourceSpan span) + : super(null, null, null, span); ExtendDeclaration clone() { var newSelector = selectors.map((s) => s.clone()).toList(); @@ -843,12 +847,12 @@ class DeclarationGroup extends TreeNode { } class MarginGroup extends DeclarationGroup { - final int margin_sym; // TokenType for for @margin sym. + final int margin_sym; // TokenType for for @margin sym. MarginGroup(this.margin_sym, List decls, SourceSpan span) : super(decls, span); MarginGroup clone() => - new MarginGroup(margin_sym, super.clone() as dynamic, span); + new MarginGroup(margin_sym, super.clone() as dynamic, span); visit(VisitorBase visitor) => visitor.visitMarginGroup(this); } @@ -942,7 +946,8 @@ class UnitTerm extends LiteralTerm { class LengthTerm extends UnitTerm { LengthTerm(value, String t, SourceSpan span, - [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + [int unit = TokenKind.UNIT_LENGTH_PX]) + : super(value, t, span, unit) { assert(this.unit == TokenKind.UNIT_LENGTH_PX || this.unit == TokenKind.UNIT_LENGTH_CM || this.unit == TokenKind.UNIT_LENGTH_MM || @@ -974,7 +979,8 @@ class ExTerm extends LiteralTerm { class AngleTerm extends UnitTerm { AngleTerm(var value, String t, SourceSpan span, - [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + [int unit = TokenKind.UNIT_LENGTH_PX]) + : super(value, t, span, unit) { assert(this.unit == TokenKind.UNIT_ANGLE_DEG || this.unit == TokenKind.UNIT_ANGLE_RAD || this.unit == TokenKind.UNIT_ANGLE_GRAD || @@ -987,7 +993,8 @@ class AngleTerm extends UnitTerm { class TimeTerm extends UnitTerm { TimeTerm(var value, String t, SourceSpan span, - [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + [int unit = TokenKind.UNIT_LENGTH_PX]) + : super(value, t, span, unit) { assert(this.unit == TokenKind.UNIT_ANGLE_DEG || this.unit == TokenKind.UNIT_TIME_MS || this.unit == TokenKind.UNIT_TIME_S); @@ -999,7 +1006,8 @@ class TimeTerm extends UnitTerm { class FreqTerm extends UnitTerm { FreqTerm(var value, String t, SourceSpan span, - [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + [int unit = TokenKind.UNIT_LENGTH_PX]) + : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); } @@ -1023,7 +1031,8 @@ class UriTerm extends LiteralTerm { class ResolutionTerm extends UnitTerm { ResolutionTerm(var value, String t, SourceSpan span, - [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + [int unit = TokenKind.UNIT_LENGTH_PX]) + : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_RESOLUTION_DPI || unit == TokenKind.UNIT_RESOLUTION_DPCM || unit == TokenKind.UNIT_RESOLUTION_DPPX); @@ -1035,7 +1044,8 @@ class ResolutionTerm extends UnitTerm { class ChTerm extends UnitTerm { ChTerm(var value, String t, SourceSpan span, - [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + [int unit = TokenKind.UNIT_LENGTH_PX]) + : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_CH); } @@ -1045,7 +1055,8 @@ class ChTerm extends UnitTerm { class RemTerm extends UnitTerm { RemTerm(var value, String t, SourceSpan span, - [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + [int unit = TokenKind.UNIT_LENGTH_PX]) + : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_REM); } @@ -1055,7 +1066,8 @@ class RemTerm extends UnitTerm { class ViewportTerm extends UnitTerm { ViewportTerm(var value, String t, SourceSpan span, - [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { + [int unit = TokenKind.UNIT_LENGTH_PX]) + : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_VIEWPORT_VW || unit == TokenKind.UNIT_VIEWPORT_VH || unit == TokenKind.UNIT_VIEWPORT_VMIN || @@ -1067,7 +1079,7 @@ class ViewportTerm extends UnitTerm { } /** Type to signal a bad hex value for HexColorTerm.value. */ -class BAD_HEX_VALUE { } +class BAD_HEX_VALUE {} class HexColorTerm extends LiteralTerm { HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span); @@ -1100,7 +1112,9 @@ class IE8Term extends LiteralTerm { class GroupTerm extends Expression { final List _terms; - GroupTerm(SourceSpan span) : _terms = [], super(span); + GroupTerm(SourceSpan span) + : _terms = [], + super(span); void add(LiteralTerm term) { _terms.add(term); @@ -1120,7 +1134,7 @@ class ItemTerm extends NumberTerm { class Expressions extends Expression { final List expressions = []; - Expressions(SourceSpan span): super(span); + Expressions(SourceSpan span) : super(span); void add(Expression expression) { expressions.add(expression); @@ -1141,7 +1155,7 @@ class BinaryExpression extends Expression { final Expression x; final Expression y; - BinaryExpression(this.op, this.x, this.y, SourceSpan span): super(span); + BinaryExpression(this.op, this.x, this.y, SourceSpan span) : super(span); BinaryExpression clone() => new BinaryExpression(op, x.clone(), y.clone(), span); @@ -1152,7 +1166,7 @@ class UnaryExpression extends Expression { final Token op; final Expression self; - UnaryExpression(this.op, this.self, SourceSpan span): super(span); + UnaryExpression(this.op, this.self, SourceSpan span) : super(span); UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); @@ -1200,10 +1214,14 @@ class FontExpression extends DartStyleExpression { // TODO(terry): Only px/pt for now need to handle all possible units to // support calc expressions on units. FontExpression(SourceSpan span, {dynamic size, List family, - int weight, String style, String variant, LineHeight lineHeight}) : - font = new Font(size : size is LengthTerm ? size.value : size, - family: family, weight: weight, style: style, variant: variant, - lineHeight: lineHeight), + int weight, String style, String variant, LineHeight lineHeight}) + : font = new Font( + size: size is LengthTerm ? size.value : size, + family: family, + weight: weight, + style: style, + variant: variant, + lineHeight: lineHeight), super(DartStyleExpression.fontStyle, span); FontExpression merged(DartStyleExpression newFontExpr) { @@ -1224,10 +1242,13 @@ class FontExpression extends DartStyleExpression { : font = new Font.merge(x.font, y.font), super(DartStyleExpression.fontStyle, span); - FontExpression clone() => - new FontExpression(span, size: font.size, family: font.family, - weight: font.weight, style: font.style, variant: font.variant, - lineHeight: font.lineHeight); + FontExpression clone() => new FontExpression(span, + size: font.size, + family: font.family, + weight: font.weight, + style: font.style, + variant: font.variant, + lineHeight: font.lineHeight); visit(VisitorBase visitor) => visitor.visitFontExpression(this); } @@ -1241,8 +1262,7 @@ abstract class BoxExpression extends DartStyleExpression { visit(VisitorBase visitor) => visitor.visitBoxExpression(this); String get formattedBoxEdge { - if (box.top == box.left && box.top == box.bottom && - box.top== box.right) { + if (box.top == box.left && box.top == box.bottom && box.top == box.right) { return '.uniform(${box.top})'; } else { var left = box.left == null ? 0 : box.left; @@ -1259,13 +1279,14 @@ class MarginExpression extends BoxExpression { /** Margin expression ripped apart. */ MarginExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.marginStyle, span, - new BoxEdge(left, top, right, bottom)); + new BoxEdge(left, top, right, bottom)); MarginExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.marginStyle, span, box); merged(DartStyleExpression newMarginExpr) { - if (newMarginExpr is MarginExpression && this.isMargin && + if (newMarginExpr is MarginExpression && + this.isMargin && newMarginExpr.isMargin) { return new MarginExpression.merge(this, newMarginExpr); } @@ -1280,13 +1301,12 @@ class MarginExpression extends BoxExpression { return new MarginExpression._merge(x, y, y.span); } - MarginExpression._merge(MarginExpression x, MarginExpression y, - SourceSpan span) + MarginExpression._merge( + MarginExpression x, MarginExpression y, SourceSpan span) : super(x._styleType, span, new BoxEdge.merge(x.box, y.box)); - MarginExpression clone() => - new MarginExpression(span, top: box.top, right: box.right, - bottom: box.bottom, left: box.left); + MarginExpression clone() => new MarginExpression(span, + top: box.top, right: box.right, bottom: box.bottom, left: box.left); visit(VisitorBase visitor) => visitor.visitMarginExpression(this); } @@ -1295,13 +1315,15 @@ class BorderExpression extends BoxExpression { /** Border expression ripped apart. */ BorderExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.borderStyle, span, - new BoxEdge(left, top, right, bottom)); + new BoxEdge(left, top, right, bottom)); BorderExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.borderStyle, span, box); merged(DartStyleExpression newBorderExpr) { - if (newBorderExpr is BorderExpression && this.isBorder && newBorderExpr.isBorder) { + if (newBorderExpr is BorderExpression && + this.isBorder && + newBorderExpr.isBorder) { return new BorderExpression.merge(this, newBorderExpr); } @@ -1315,14 +1337,13 @@ class BorderExpression extends BoxExpression { return new BorderExpression._merge(x, y, y.span); } - BorderExpression._merge(BorderExpression x, BorderExpression y, - SourceSpan span) + BorderExpression._merge( + BorderExpression x, BorderExpression y, SourceSpan span) : super(DartStyleExpression.borderStyle, span, - new BoxEdge.merge(x.box, y.box)); + new BoxEdge.merge(x.box, y.box)); - BorderExpression clone() => - new BorderExpression(span, top: box.top, right: box.right, - bottom: box.bottom, left: box.left); + BorderExpression clone() => new BorderExpression(span, + top: box.top, right: box.right, bottom: box.bottom, left: box.left); visit(VisitorBase visitor) => visitor.visitBorderExpression(this); } @@ -1334,7 +1355,9 @@ class HeightExpression extends DartStyleExpression { : super(DartStyleExpression.heightStyle, span); merged(DartStyleExpression newHeightExpr) { - if (newHeightExpr is DartStyleExpression && this.isHeight && newHeightExpr.isHeight) { + if (newHeightExpr is DartStyleExpression && + this.isHeight && + newHeightExpr.isHeight) { return newHeightExpr; } @@ -1352,7 +1375,8 @@ class WidthExpression extends DartStyleExpression { : super(DartStyleExpression.widthStyle, span); merged(DartStyleExpression newWidthExpr) { - if (newWidthExpr is WidthExpression && this.isWidth && + if (newWidthExpr is WidthExpression && + this.isWidth && newWidthExpr.isWidth) { return newWidthExpr; } @@ -1368,13 +1392,14 @@ class PaddingExpression extends BoxExpression { /** Padding expression ripped apart. */ PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.paddingStyle, span, - new BoxEdge(left, top, right, bottom)); + new BoxEdge(left, top, right, bottom)); PaddingExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.paddingStyle, span, box); merged(DartStyleExpression newPaddingExpr) { - if (newPaddingExpr is PaddingExpression && this.isPadding && + if (newPaddingExpr is PaddingExpression && + this.isPadding && newPaddingExpr.isPadding) { return new PaddingExpression.merge(this, newPaddingExpr); } @@ -1389,13 +1414,12 @@ class PaddingExpression extends BoxExpression { return new PaddingExpression._merge(x, y, y.span); } - PaddingExpression._merge(PaddingExpression x, PaddingExpression y, - SourceSpan span) + PaddingExpression._merge( + PaddingExpression x, PaddingExpression y, SourceSpan span) : super(DartStyleExpression.paddingStyle, span, - new BoxEdge.merge(x.box, y.box)); + new BoxEdge.merge(x.box, y.box)); - PaddingExpression clone() => - new PaddingExpression(span, top: box.top, right: box.right, - bottom: box.bottom, left: box.left); + PaddingExpression clone() => new PaddingExpression(span, + top: box.top, right: box.right, bottom: box.bottom, left: box.left); visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); } diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 35aef13d1..095b4932f 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -29,7 +29,7 @@ abstract class TreeNode { /** The base type for expressions. */ abstract class Expression extends TreeNode { - Expression(SourceSpan span): super(span); + Expression(SourceSpan span) : super(span); } /** Simple class to provide a textual dump of trees for debugging. */ @@ -39,7 +39,7 @@ class TreeOutput { VisitorBase printer; void write(String s) { - for (int i=0; i < depth; i++) { + for (int i = 0; i < depth; i++) { buf.write(' '); } buf.write(s); diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 3a8b74821..8cb4de818 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -17,7 +17,9 @@ String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) { class _TreePrinter extends Visitor { final TreeOutput output; final bool useSpan; - _TreePrinter(this.output, this.useSpan) { output.printer = this; } + _TreePrinter(this.output, this.useSpan) { + output.printer = this; + } void visitTree(StyleSheet tree) => visitStylesheet(tree); @@ -244,8 +246,8 @@ class _TreePrinter extends Visitor { void visitSelector(Selector node) { heading('Selector', node); output.depth++; - output.writeNodeList('simpleSelectorsSequences', - node.simpleSelectorSequences); + output.writeNodeList( + 'simpleSelectorsSequences', node.simpleSelectorSequences); output.depth--; } @@ -370,7 +372,7 @@ class _TreePrinter extends Visitor { output.depth++; output.writeValue('value', node.text); output.depth--; - } + } void visitHexColorTerm(HexColorTerm node) { heading('HexColorTerm', node); diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index bc3a6ad59..d45cd95ba 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -40,9 +40,9 @@ class Validate { // Perfect just one element id returns matches of -1. return -1; } else if (selector.isCombinatorDescendant()) { - String tooMany = selector.simpleSelector.toString(); - throw new CssSelectorException( - 'Use of Id selector must be singleton starting at $tooMany'); + String tooMany = selector.simpleSelector.toString(); + throw new CssSelectorException( + 'Use of Id selector must be singleton starting at $tooMany'); } else { String error = selector.simpleSelector.toString(); throw new CssSelectorException( @@ -53,9 +53,9 @@ class Validate { // Validate the @{css expression} only .class and #elementId are valid inside // of @{...}. static template(List selectors) { - var errorSelector; // signal which selector didn't match. - bool found = false; // signal if a selector is matched. - int matches = 0; // < 0 IdSelectors, > 0 ClassSelector + var errorSelector; // signal which selector didn't match. + bool found = false; // signal if a selector is matched. + int matches = 0; // < 0 IdSelectors, > 0 ClassSelector // At most one selector group (any number of simple selector sequences). assert(selectors.length <= 1); @@ -73,20 +73,19 @@ class Validate { for (final className in classes) { if (selector.simpleSelector.name == className) { matches = _classNameCheck(selector, matches); - found = true; // .class found. + found = true; // .class found. break; } for (final className2 in classes) { print(className2); } } - } else { // Don't check any class name that is prefixed with an underscore. // However, signal as found and bump up matches; it's a valid class // name. matches = _classNameCheck(selector, matches); - found = true; // ._class are always okay. + found = true; // ._class are always okay. } } else if (simpleSelector is IdSelector) { // Any element id starting with an underscore is a private element id @@ -95,7 +94,7 @@ class Validate { for (final id in ids) { if (simpleSelector.name == id) { matches = _elementIdCheck(selector, matches); - found = true; // #id found. + found = true; // #id found. break; } } @@ -103,7 +102,7 @@ class Validate { // Don't check any element ID that is prefixed with an underscore. // Signal as found and bump up matches; it's a valid element ID. matches = _elementIdCheck(selector, matches); - found = true; // #_id are always okay + found = true; // #_id are always okay } } else { String badSelector = simpleSelector.toString(); @@ -124,4 +123,3 @@ class Validate { selector.simpleSelectorSequences.length); } } - diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 154d235c0..fa0f8d2bb 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -126,15 +126,15 @@ class Visitor implements VisitorBase { _visitNodeList(ss.topLevels); } - void visitNoOp(NoOp node) { } + void visitNoOp(NoOp node) {} - void visitTopLevelProduction(TopLevelProduction node) { } + void visitTopLevelProduction(TopLevelProduction node) {} - void visitDirective(Directive node) { } + void visitDirective(Directive node) {} - void visitCssComment(CssComment node) { } + void visitCssComment(CssComment node) {} - void visitCommentDefinition(CommentDefinition node) { } + void visitCommentDefinition(CommentDefinition node) {} void visitMediaExpression(MediaExpression node) { visitExpressions(node.exprs); @@ -171,7 +171,7 @@ class Visitor implements VisitorBase { } } - void visitCharsetDirective(CharsetDirective node) { } + void visitCharsetDirective(CharsetDirective node) {} void visitImportDirective(ImportDirective node) { for (var mediaQuery in node.mediaQueries) { @@ -197,7 +197,7 @@ class Visitor implements VisitorBase { _visitNodeList(node.rulesets); } - void visitNamespaceDirective(NamespaceDirective node) { } + void visitNamespaceDirective(NamespaceDirective node) {} void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); @@ -207,7 +207,7 @@ class Visitor implements VisitorBase { _visitNodeList(node.rulesets); } - void visitMixinDefinition(MixinDefinition node) { } + void visitMixinDefinition(MixinDefinition node) {} void visitMixinDeclarationDirective(MixinDeclarationDirective node) { visitDeclarationGroup(node.declarations); @@ -303,15 +303,15 @@ class Visitor implements VisitorBase { _visitNodeList(node.expressions); } - void visitUnicodeRangeTerm(UnicodeRangeTerm node) { } + void visitUnicodeRangeTerm(UnicodeRangeTerm node) {} - void visitLiteralTerm(LiteralTerm node) { } + void visitLiteralTerm(LiteralTerm node) {} - void visitHexColorTerm(HexColorTerm node) { } + void visitHexColorTerm(HexColorTerm node) {} - void visitNumberTerm(NumberTerm node) { } + void visitNumberTerm(NumberTerm node) {} - void visitUnitTerm(UnitTerm node) { } + void visitUnitTerm(UnitTerm node) {} void visitLengthTerm(LengthTerm node) { visitUnitTerm(node); @@ -380,15 +380,15 @@ class Visitor implements VisitorBase { visitNumberTerm(node); } - void visitIE8Term(IE8Term node) { } + void visitIE8Term(IE8Term node) {} - void visitOperatorSlash(OperatorSlash node) { } + void visitOperatorSlash(OperatorSlash node) {} - void visitOperatorComma(OperatorComma node) { } + void visitOperatorComma(OperatorComma node) {} - void visitOperatorPlus(OperatorPlus node) { } + void visitOperatorPlus(OperatorPlus node) {} - void visitOperatorMinus(OperatorMinus node) { } + void visitOperatorMinus(OperatorMinus node) {} void visitVarUsage(VarUsage node) { _visitNodeList(node.defaultValues); @@ -408,15 +408,15 @@ class Visitor implements VisitorBase { throw UnimplementedError; } - void visitIdentifier(Identifier node) { } + void visitIdentifier(Identifier node) {} - void visitWildcard(Wildcard node) { } + void visitWildcard(Wildcard node) {} - void visitThisOperator(ThisOperator node) { } + void visitThisOperator(ThisOperator node) {} - void visitNegation(Negation node) { } + void visitNegation(Negation node) {} - void visitDartStyleExpression(DartStyleExpression node) { } + void visitDartStyleExpression(DartStyleExpression node) {} void visitFontExpression(FontExpression node) { // TODO(terry): TBD diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 7bb631702..b16843233 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.11.0+4 +version: 0.11.1-dev author: Polymer.dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart index 5210115b0..ed1c27131 100644 --- a/pkgs/csslib/test/big_1_test.dart +++ b/pkgs/csslib/test/big_1_test.dart @@ -7,7 +7,7 @@ library big_1_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -var options = ['--warnings_as_errors', '--no-colors', 'memory']; +var options = ['--warnings_as_errors', '--no-colors', 'memory']; compilePolyfillAndValidate(String input, String generated) { var errors = []; diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index 8d63f8b8d..a7cdf4a47 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -516,10 +516,10 @@ void testArrayOfChars() { var errors = []; var input = ''; + '}]]>'; var stylesheet = parse(UTF8.encode(input), errors: errors); @@ -584,8 +584,8 @@ p:nth-child(3n-3) { } div:nth-child(2n) { color : red; } '''; - var stylesheet = parseCss(input, errors: errors, - opts: ['--no-colors', 'memory']); + var stylesheet = + parseCss(input, errors: errors, opts: ['--no-colors', 'memory']); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -647,16 +647,16 @@ void testHost() { var errors = []; var input = '@host { ' ':scope {' - 'white-space: nowrap;' - 'overflow-style: marquee-line;' - 'overflow-x: marquee;' + 'white-space: nowrap;' + 'overflow-style: marquee-line;' + 'overflow-x: marquee;' '}' '* { color: red; }' '*:hover { font-weight: bold; }' ':nth-child(odd) { color: blue; }' - '}'; - var stylesheet = parseCss(input, errors: errors, - opts: ['--no-colors', 'memory']); + '}'; + var stylesheet = + parseCss(input, errors: errors, opts: ['--no-colors', 'memory']); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -684,10 +684,10 @@ void testEmitter() { var errors = []; var input = '.foo { ' 'color: red; left: 20px; top: 20px; width: 100px; height:200px' - '}' - '#div {' + '}' + '#div {' 'color : #00F578; border-color: #878787;' - '}'; + '}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 857df4873..0cf012c54 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -7,7 +7,6 @@ library declaration_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; - /** CSS compiler options no checks in in memory style sheet. */ List options = ['--no-colors', 'memory']; @@ -365,7 +364,7 @@ void testMediaQueries() { } }'''; generated = - '''@media handheld AND (min-width:20em), screen AND (min-width:20em) { + '''@media handheld AND (min-width:20em), screen AND (min-width:20em) { #id { color: #f00; } @@ -481,8 +480,7 @@ src: url(ideal-sans-serif.woff) format("woff"), url(basic-sans-serif.ttf) format("opentype"), local(Gentium Bold); }'''; - final String generated2 = - '@font-face {\n' + final String generated2 = '@font-face {\n' ' src: url("ideal-sans-serif.woff") ' 'format("woff"), url("basic-sans-serif.ttf") ' 'format("opentype"), local(Gentium Bold);\n}'; @@ -563,8 +561,7 @@ div[href^='test'] { } '''; - final String generated = - '@import "simple.css"; ' + final String generated = '@import "simple.css"; ' '@import "test.css" print; ' '@import "test.css" screen, print; ' '@import "http://google.com/maps/maps.css";\n' @@ -715,36 +712,32 @@ html|*:not(:link):not(:visited) { void testIE() { var errors = []; - final String input = -".test {\n" -" filter: progid:DXImageTransform.Microsoft.gradient" -"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" -"}"; - final String generated = -".test {\n" -" filter: progid:DXImageTransform.Microsoft.gradient" -"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" -"}"; - - var stylesheet = parseCss(input, errors: errors, opts: options); + final String input = ".test {\n" + " filter: progid:DXImageTransform.Microsoft.gradient" + "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" + "}"; + final String generated = ".test {\n" + " filter: progid:DXImageTransform.Microsoft.gradient" + "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" + "}"; + + var stylesheet = parseCss(input, errors: errors, opts: options); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); - final String input2 = -".test {\n" -" filter: progid:DXImageTransform.Microsoft.gradient" -"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" -" progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n" -"}"; - - final String generated2 = -".test {\n" -" filter: progid:DXImageTransform.Microsoft.gradient" -"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" -" progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n" -"}"; + final String input2 = ".test {\n" + " filter: progid:DXImageTransform.Microsoft.gradient" + "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" + " progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n" + "}"; + + final String generated2 = ".test {\n" + " filter: progid:DXImageTransform.Microsoft.gradient" + "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" + " progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n" + "}"; stylesheet = parseCss(input2, errors: errors..clear(), opts: options); diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index f48906cd8..363bf3d3b 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -223,7 +223,6 @@ error on line 1, column 18: Expected hex number .foobar { color: # 123 fff; }'''); - } void testBadUnicode() { @@ -239,7 +238,7 @@ void testBadUnicode() { expect(errors.isEmpty, false); expect(errors[0].toString(), 'error on line 3, column 20: unicode first range can not be greater than ' - 'last\n' + 'last\n' ' unicode-range: U+400-200;\n' ' ^^^^^^^'); diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index 7136c45cc..ed24b35e4 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -7,7 +7,7 @@ library extend_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -var options = ['--warnings_as_errors', '--no-colors', 'memory']; +var options = ['--warnings_as_errors', '--no-colors', 'memory']; compileAndValidate(String input, String generated) { var errors = []; @@ -215,13 +215,13 @@ input.second + label { color: blue; } ''', '.btn + .btn, ' - 'input.second + label + .btn, ' - '.btn + input.second + label, ' + 'input.second + label + .btn, ' + '.btn + input.second + label, ' 'input.second + label + input.second + label, ' 'input.second + label + input.second + label {\n' - ' margin-left: 5px;\n}\n' - 'input.second + label {\n' - ' color: #00f;\n}'); + ' margin-left: 5px;\n}\n' + 'input.second + label {\n' + ' color: #00f;\n}'); } main() { diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 6d3b71e0a..5e3272328 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -496,7 +496,6 @@ div { expect(prettyPrint(stylesheet), generated); } - void undefinedTopLevel() { final errors = []; final input = r''' diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index ef7cb46c4..c72666efd 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -159,9 +159,9 @@ html, body { color: #f00; } ''' -'html button span, body button span, html div span, body div span, ' -'html button a, body button a, html div a, body div a, html button ul, ' -r'''body button ul, html div ul, body div ul { + 'html button span, body button span, html div span, body div span, ' + 'html button a, body button a, html div a, body div a, html button ul, ' + r'''body button ul, html div ul, body div ul { height: 200; } html table, body table { @@ -215,8 +215,7 @@ div span { color: green; } div > span[attr="foo"] { color: yellow; } '''; - final generated = -r'''div span { + final generated = r'''div span { color: #008000; } #header { diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index 3f764e70a..43a5a358a 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -27,8 +27,8 @@ void testSelectorSuccesses() { expect(errors.isEmpty, true, reason: errors.toString()); expect('.foobar .a-story .xyzzy', compactOuptut(selectorAst)); - selectorAst = selector('.foobar .xyzzy .a-story .b-story', - errors: errors..clear()); + selectorAst = + selector('.foobar .xyzzy .a-story .b-story', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); expect('.foobar .xyzzy .a-story .b-story', compactOuptut(selectorAst)); @@ -56,7 +56,7 @@ void testSelectorFailures() { expect(errors.isEmpty, false); expect(errors[0].toString(), 'error on line 1, column 9: name must start with a alpha character, but ' - 'found a number\n' + 'found a number\n' '.foobar .1a-story .xyzzy\n' ' ^^'); } diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 002c45247..b9a6738f0 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -18,10 +18,12 @@ void useMockMessages() { * CSS will allow any property/value pairs regardless of validity; all of our * tests (by default) will ensure that the CSS is really valid. */ -StyleSheet parseCss(String cssInput, {List errors, - List opts}) => - parse(cssInput, errors: errors, options: opts == null ? - ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts); +StyleSheet parseCss(String cssInput, + {List errors, List opts}) => parse(cssInput, + errors: errors, + options: opts == null + ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] + : opts); /** * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, @@ -29,13 +31,16 @@ StyleSheet parseCss(String cssInput, {List errors, * tests (by default) will ensure that the CSS is really valid. */ StyleSheet compileCss(String cssInput, {List errors, List opts, - bool polyfill: false, List includes: null}) => - compile(cssInput, errors: errors, options: opts == null ? - ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts, - polyfill: polyfill, includes: includes); + bool polyfill: false, List includes: null}) => compile(cssInput, + errors: errors, + options: opts == null + ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] + : opts, + polyfill: polyfill, + includes: includes); -StyleSheet polyFillCompileCss(input, {List errors, - List opts}) => +StyleSheet polyFillCompileCss(input, + {List errors, List opts}) => compileCss(input, errors: errors, polyfill: true, opts: opts); /** CSS emitter walks the style sheet tree and emits readable CSS. */ diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 0ec285242..17349b880 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -393,27 +393,27 @@ void undefinedVars() { var errorStrings = [ 'error on line 5, column 14: Variable is not defined.\n' - ' var-a: var(b);\n' - ' ^^', + ' var-a: var(b);\n' + ' ^^', 'error on line 6, column 14: Variable is not defined.\n' - ' var-b: var(c);\n' - ' ^^', + ' var-b: var(c);\n' + ' ^^', 'error on line 9, column 16: Variable is not defined.\n' - ' var-one: var(two);\n' - ' ^^^^', + ' var-one: var(two);\n' + ' ^^^^', 'error on line 12, column 17: Variable is not defined.\n' - ' var-four: var(five);\n' - ' ^^^^^', + ' var-four: var(five);\n' + ' ^^^^^', 'error on line 13, column 17: Variable is not defined.\n' - ' var-five: var(six);\n' - ' ^^^^', + ' var-five: var(six);\n' + ' ^^^^', 'error on line 16, column 18: Variable is not defined.\n' - ' var-def-1: var(def-2);\n' - ' ^^^^^^', + ' var-def-1: var(def-2);\n' + ' ^^^^^^', 'error on line 17, column 18: Variable is not defined.\n' - ' var-def-2: var(def-3);\n' - ' ^^^^^^', - ]; + ' var-def-2: var(def-3);\n' + ' ^^^^^^', + ]; var generated = r''':root { var-color-background: #f00; @@ -445,8 +445,8 @@ void undefinedVars() { compileAndValidate(input, generated); - var stylesheet = polyFillCompileCss(input, errors: errors..clear(), - opts: options); + var stylesheet = + polyFillCompileCss(input, errors: errors..clear(), opts: options); expect(stylesheet != null, true); @@ -644,8 +644,8 @@ var-color-foreground: #00f; color: var(color-foreground); }'''; - var stylesheet = parseCss(input, errors: errors, - opts: ['--no-colors', 'memory']); + var stylesheet = + parseCss(input, errors: errors, opts: ['--no-colors', 'memory']); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -670,8 +670,8 @@ var-color-foreground: #00f; color: var(color-foreground); }'''; - stylesheet = parseCss(input, errors: errors..clear(), - opts: ['--no-colors', 'memory']); + stylesheet = + parseCss(input, errors: errors..clear(), opts: ['--no-colors', 'memory']); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -699,8 +699,8 @@ var-color-foreground: #00f; color: var(color-foreground); }'''; - var stylesheet = parseCss(input, errors: errors, - opts: ['--no-colors', 'memory']); + var stylesheet = + parseCss(input, errors: errors, opts: ['--no-colors', 'memory']); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -725,8 +725,8 @@ var-color-foreground: #00f; color: var(color-foreground); }'''; - stylesheet = parseCss(input, errors: errors..clear(), - opts: ['--no-colors', 'memory']); + stylesheet = + parseCss(input, errors: errors..clear(), opts: ['--no-colors', 'memory']); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -854,8 +854,8 @@ void includes() { border-color: var(a3); }'''; - var stylesheet2 = compileCss(file2Input, includes: [stylesheet1], - errors: errors..clear(), opts: options); + var stylesheet2 = compileCss(file2Input, + includes: [stylesheet1], errors: errors..clear(), opts: options); expect(stylesheet2 != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet2), generated2); @@ -870,8 +870,8 @@ void includes() { .test-1a { color: #000; }'''; - var styleSheet1Polyfill = compileCss(file1Input, errors: errors..clear(), - polyfill: true, opts: options); + var styleSheet1Polyfill = compileCss(file1Input, + errors: errors..clear(), polyfill: true, opts: options); expect(styleSheet1Polyfill != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(styleSheet1Polyfill), generatedPolyfill1); @@ -883,8 +883,11 @@ void includes() { background-color: #0b0; border-color: #fff; }'''; - var styleSheet2Polyfill = compileCss(file2Input, includes: [stylesheet1], - errors: errors..clear(), polyfill: true, opts: options); + var styleSheet2Polyfill = compileCss(file2Input, + includes: [stylesheet1], + errors: errors..clear(), + polyfill: true, + opts: options); expect(styleSheet2Polyfill != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(styleSheet2Polyfill), generatedPolyfill2); @@ -900,8 +903,10 @@ void includes() { border-color: #fff; }'''; var stylesheetPolyfill = compileCss(input, - includes: [stylesheet1, stylesheet2], errors: errors..clear(), - polyfill: true, opts: options); + includes: [stylesheet1, stylesheet2], + errors: errors..clear(), + polyfill: true, + opts: options); expect(stylesheetPolyfill != null, true); expect(errors.isEmpty, true, reason: errors.toString()); diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index 451b687cd..177774890 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -43,7 +43,7 @@ void testClassVisitors() { var clsVisits = new ClassVisitor(['foobar'])..visitTree(s); expect(clsVisits.matches, true); - in1= ''' + in1 = ''' .foobar1 { } .xyzzy .foo #my-div { color: red; } div.hello { font: arial; } @@ -54,8 +54,8 @@ void testClassVisitors() { expect(s != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - clsVisits = - new ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello'])..visitTree(s); + clsVisits = new ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello']) + ..visitTree(s); expect(clsVisits.matches, true); expect(prettyPrint(s), r''' @@ -80,7 +80,7 @@ class PolyfillEmitter extends CssPrinter { } String polyfillPrint(String prefix, StyleSheet ss) => - (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString(); + (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString(); void testPolyFill() { var errors = []; From ae8f1ccdc9e3a626a20877f2fb53eecca3ffaced Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 19 Mar 2015 13:28:55 -0700 Subject: [PATCH 039/245] remove unused vars and fields R=sigmund@google.com Review URL: https://codereview.chromium.org//1009053006 --- pkgs/csslib/lib/parser.dart | 7 +------ pkgs/csslib/lib/src/analyzer.dart | 2 -- pkgs/csslib/lib/src/property.dart | 1 + pkgs/csslib/lib/src/tokenizer.dart | 3 +-- pkgs/csslib/lib/src/tree_printer.dart | 2 -- pkgs/csslib/test/error_test.dart | 10 +++++----- pkgs/csslib/test/mixin_test.dart | 4 ---- pkgs/csslib/test/nested_test.dart | 2 -- pkgs/csslib/test/selector_test.dart | 2 +- 9 files changed, 9 insertions(+), 24 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index e0aa3388e..25c329ded 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -812,7 +812,6 @@ class _Parser { } var declGroup = processDeclarations(checkBrace: false); - var decls = []; if (declGroup.declarations.any((decl) { return decl is Declaration && decl is! IncludeMixinAtDeclaration; })) { @@ -881,7 +880,7 @@ class _Parser { // sign and the directive name. Technically, it's not valid grammar but // a number of CSS tests test for whitespace between @ and name. if (tokId == TokenKind.AT) { - Token tok = _next(); + _next(); tokId = _peek(); if (_peekIdentifier()) { // Is it a directive? @@ -1847,7 +1846,6 @@ class _Parser { } break; case _lineHeightPart: - num lineHeight; if (exprs.expressions.length == 1) { var expr = exprs.expressions[0]; if (expr is UnitTerm) { @@ -2645,13 +2643,10 @@ class ExpressionsProcessor { } FontExpression processFont() { - List family; - // Process all parts of the font expression. FontExpression fontSize; FontExpression fontFamily; for (; _index < _exprs.expressions.length; _index++) { - var expr = _exprs.expressions[_index]; // Order is font-size font-family if (fontSize == null) { fontSize = processFontSize(); diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 1341bc205..4fdd83361 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -596,7 +596,6 @@ class CallMixin extends Visitor { MixinDefinition transform(List callArgs) { // TODO(terry): Handle default arguments and varArgs. // Transform mixin with callArgs. - var index = 0; for (var index = 0; index < _definedArgs.length; index++) { var definedArg = _definedArgs[index]; VarDefinition varDef; @@ -908,7 +907,6 @@ class AllExtends extends Visitor { new Map>(); SelectorGroup _currSelectorGroup; - List _currDecls; int _currDeclIndex; List _extendsToRemove = []; diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 7e12352fb..5d6dc14d1 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -614,6 +614,7 @@ class Rgba implements _StyleProperty, ColorBase { value += (r << 0x10); value += (g << 0x08); value += b; + return value; } Color get color => new Color.createRgba(r, g, b, a); diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index ed616d2d8..f5c52104f 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -40,7 +40,7 @@ class Tokenizer extends TokenizerBase { _startIndex = _index; ch = _nextChar(); - Token ident = finishIdentifier(); + finishIdentifier(); // Is it a directive? int tokId = TokenKind.matchDirectives( @@ -260,7 +260,6 @@ class Tokenizer extends TokenizerBase { Token finishIdentifier() { // If we encounter an escape sequence, remember it so we can post-process // to unescape. - bool hasEscapedChars = false; var chars = []; // backup so we can start with the first character diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 8cb4de818..030a868bc 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -390,8 +390,6 @@ class _TreePrinter extends Visitor { } void visitUnitTerm(UnitTerm node) { - String unitValue; - output.depth++; output.writeValue('value', node.text); output.writeValue('unit', node.unitToString()); diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 363bf3d3b..71890cc89 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -233,7 +233,7 @@ void testBadUnicode() { unicode-range: U+400-200; }'''; - var stylesheet = parseCss(input, errors: errors); + parseCss(input, errors: errors); expect(errors.isEmpty, false); expect(errors[0].toString(), @@ -248,7 +248,7 @@ void testBadUnicode() { unicode-range: U+12FFFF; }'''; - stylesheet = parseCss(input2, errors: errors..clear()); + parseCss(input2, errors: errors..clear()); expect(errors.isEmpty, false); expect(errors[0].toString(), @@ -272,7 +272,7 @@ div { } '''; - var stylesheet = parseCss(input, errors: errors); + parseCss(input, errors: errors); expect(errors.length, 1); var errorMessage = messages.messages[0]; expect(errorMessage.message, contains('Bad hex number')); @@ -289,7 +289,7 @@ div { } } '''; - var stylesheet2 = parseCss(input2, errors: errors..clear()); + parseCss(input2, errors: errors..clear()); expect(errors.length, 4); errorMessage = messages.messages[0]; expect(errorMessage.message, contains(':, but found +')); @@ -326,7 +326,7 @@ div { color: #green; } '''; - var stylesheet3 = parseCss(input3, errors: errors..clear()); + parseCss(input3, errors: errors..clear()); expect(errors.length, 2); errorMessage = messages.messages[0]; expect(errorMessage.message, contains('Bad hex number')); diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 5e3272328..5c5a0fca2 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -458,10 +458,6 @@ void badTopInclude() { @include a; '''; - var generated = r'''span { - border: 2px dashed #f00; -}'''; - var stylesheet = compileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); expect(errors.length, 1, reason: errors.toString()); diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index c72666efd..2a46da7f9 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -195,7 +195,6 @@ span { } void simpleNest() { - final errors = []; final input = ''' div span { color: green; } #header { @@ -239,7 +238,6 @@ div > span[attr="foo"] { } void complexNest() { - final errors = []; final input = ''' @font-face { font-family: arial; } div { color: #f0f0f0; } diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index 43a5a358a..5d687e65e 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -52,7 +52,7 @@ void testSelectorFailures() { var errors = []; // Test for invalid class name (can't start with number). - var selectorAst = selector('.foobar .1a-story .xyzzy', errors: errors); + selector('.foobar .1a-story .xyzzy', errors: errors); expect(errors.isEmpty, false); expect(errors[0].toString(), 'error on line 1, column 9: name must start with a alpha character, but ' From 4d9c2bc793373112a4058919e5056a71934cdf30 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 3 Apr 2015 09:31:35 -0700 Subject: [PATCH 040/245] pkg/csslib: fixes for args R=jmesserly@google.com, rnystrom@google.com Review URL: https://codereview.chromium.org//1022963002 --- pkgs/csslib/CHANGELOG.md | 7 +++++ pkgs/csslib/example/call_parser.dart | 17 +++++++---- pkgs/csslib/lib/parser.dart | 16 ++++++----- pkgs/csslib/lib/src/messages.dart | 7 ++--- pkgs/csslib/lib/src/options.dart | 8 ++++-- pkgs/csslib/pubspec.yaml | 8 +++--- pkgs/csslib/test/big_1_test.dart | 2 -- pkgs/csslib/test/compiler_test.dart | 6 ++-- pkgs/csslib/test/declaration_test.dart | 40 ++++++++++++-------------- pkgs/csslib/test/extend_test.dart | 2 -- pkgs/csslib/test/mixin_test.dart | 2 -- pkgs/csslib/test/nested_test.dart | 4 +-- pkgs/csslib/test/testing.dart | 28 ++++++++++++++---- pkgs/csslib/test/var_test.dart | 14 +++------ pkgs/csslib/test/visitor_test.dart | 2 +- 15 files changed, 86 insertions(+), 77 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index df9123c0b..beac1eccc 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.12.0 + +* Top-level methods in `parser.dart` now take `PreprocessorOptions` instead of + `List`. + +* `PreprocessorOptions.inputFile` is now final. + ## 0.11.0+4 * Cleanup some ambiguous and some incorrect type signatures. diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index 3248f7fdf..7179a170f 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -4,17 +4,22 @@ import 'package:csslib/parser.dart' as css; import 'package:csslib/visitor.dart'; +const _default = const css.PreprocessorOptions( + useColors: false, + checked: true, + warningsAsErrors: true, + inputFile: 'memory'); + /** * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, * CSS will allow any property/value pairs regardless of validity; all of our * tests (by default) will ensure that the CSS is really valid. */ -StyleSheet parseCss(String cssInput, {List errors, List opts}) => css.parse( - cssInput, - errors: errors, - options: opts == null - ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] - : opts); +StyleSheet parseCss(String cssInput, + {List errors, css.PreprocessorOptions opts}) { + return css.parse(cssInput, + errors: errors, options: opts == null ? _default : opts); +} // Pretty printer for CSS. var emitCss = new CssPrinter(); diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 25c329ded..9d27e97ac 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -12,6 +12,8 @@ import "visitor.dart"; import 'src/messages.dart'; import 'src/options.dart'; +export 'src/options.dart'; + part 'src/analyzer.dart'; part 'src/polyfill.dart'; part 'src/property.dart'; @@ -30,14 +32,14 @@ class ParserState extends TokenizerState { } // TODO(jmesserly): this should not be global -void _createMessages({List errors, List options}) { +void _createMessages({List errors, PreprocessorOptions options}) { if (errors == null) errors = []; if (options == null) { - options = ['--no-colors', 'memory']; + options = new PreprocessorOptions(useColors: false, inputFile: 'memory'); } - var opt = PreprocessorOptions.parse(options); - messages = new Messages(options: opt, printHandler: errors.add); + + messages = new Messages(options: options, printHandler: errors.add); } /** CSS checked mode enabled. */ @@ -45,7 +47,7 @@ bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. /** Parse and analyze the CSS file. */ -StyleSheet compile(input, {List errors, List options, +StyleSheet compile(input, {List errors, PreprocessorOptions options, bool nested: true, bool polyfill: false, List includes: null}) { if (includes == null) { includes = []; @@ -71,7 +73,7 @@ StyleSheet compile(input, {List errors, List options, /** Analyze the CSS file. */ void analyze(List styleSheets, - {List errors, List options}) { + {List errors, PreprocessorOptions options}) { _createMessages(errors: errors, options: options); new Analyzer(styleSheets, messages).run(); } @@ -81,7 +83,7 @@ void analyze(List styleSheets, * or [List] of bytes and returns a [StyleSheet] AST. The optional * [errors] list will contain each error/warning as a [Message]. */ -StyleSheet parse(input, {List errors, List options}) { +StyleSheet parse(input, {List errors, PreprocessorOptions options}) { var source = _inputAsString(input); _createMessages(errors: errors, options: options); diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index d8abcab1e..595bf6c58 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -124,10 +124,7 @@ class Messages { void mergeMessages(Messages newMessages) { messages.addAll(newMessages.messages); newMessages.messages - .where( - (message) => message.level.value == Level.SEVERE || options.verbose) - .forEach((message) { - printHandler(message); - }); + .where((message) => message.level == Level.SEVERE || options.verbose) + .forEach(printHandler); } } diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/options.dart index 0ebb5b413..95e8a2fab 100644 --- a/pkgs/csslib/lib/src/options.dart +++ b/pkgs/csslib/lib/src/options.dart @@ -38,10 +38,12 @@ class PreprocessorOptions { final bool useColors; /** File to process by the compiler. */ - String inputFile; + final String inputFile; - // We could make this faster, if it ever matters. - factory PreprocessorOptions() => parse(['']); + const PreprocessorOptions({this.verbose: false, this.checked: false, + this.lessSupport: true, this.warningsAsErrors: false, + this.throwOnErrors: false, this.throwOnWarnings: false, + this.useColors: true, this.polyfill: false, this.inputFile}); PreprocessorOptions.fromArgs(ArgResults args) : warningsAsErrors = args['warnings_as_errors'], diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index b16843233..5ef264aa0 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,15 +1,15 @@ name: csslib -version: 0.11.1-dev +version: 0.12.0 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib environment: sdk: '>=1.1.0 <2.0.0' dependencies: - args: '>=0.9.0 <0.13.0' + args: '>=0.9.0 <0.14.0' logging: '>=0.9.0 <0.10.0' path: '>=0.9.0 <2.0.0' source_span: '>=1.0.0 <2.0.0' dev_dependencies: - browser: '>=0.9.0 <0.10.0' - unittest: '>=0.9.0 <0.10.0' + browser: '>=0.9.0 <0.11.0' + unittest: '>=0.9.0 <0.12.0' diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart index ed1c27131..5f38ba088 100644 --- a/pkgs/csslib/test/big_1_test.dart +++ b/pkgs/csslib/test/big_1_test.dart @@ -7,8 +7,6 @@ library big_1_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -var options = ['--warnings_as_errors', '--no-colors', 'memory']; - compilePolyfillAndValidate(String input, String generated) { var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index a7cdf4a47..5d5dcf509 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -584,8 +584,7 @@ p:nth-child(3n-3) { } div:nth-child(2n) { color : red; } '''; - var stylesheet = - parseCss(input, errors: errors, opts: ['--no-colors', 'memory']); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -655,8 +654,7 @@ void testHost() { '*:hover { font-weight: bold; }' ':nth-child(odd) { color: blue; }' '}'; - var stylesheet = - parseCss(input, errors: errors, opts: ['--no-colors', 'memory']); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 0cf012c54..f01b804d2 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -7,9 +7,6 @@ library declaration_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -/** CSS compiler options no checks in in memory style sheet. */ -List options = ['--no-colors', 'memory']; - void testSimpleTerms() { var errors = []; final String input = r''' @@ -236,7 +233,7 @@ void testUnits() { transform: rotatez(20turn); }'''; - var stylesheet = parseCss(input, errors: errors, opts: options); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -339,7 +336,7 @@ void testMediaQueries() { } }'''; - var stylesheet = parseCss(input, errors: errors, opts: options); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -384,7 +381,7 @@ void testMediaQueries() { } }'''; - stylesheet = parseCss(input, errors: errors..clear(), opts: options); + stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -401,7 +398,7 @@ void testMediaQueries() { 'AND (min-device-height:2000px), screen (another:100px) {\n' 'html {\n font-size: 10em;\n}\n}'; - stylesheet = parseCss(input, errors: errors..clear(), opts: options); + stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -418,7 +415,7 @@ void testMediaQueries() { '(min-device-height:2000px), screen (another:100px) {\n' 'html {\n font-size: 10em;\n}\n}'; - stylesheet = parseCss(input, errors: errors..clear(), opts: options); + stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -429,7 +426,7 @@ void testMediaQueries() { generated = '@import "test.css" ONLY screen, NOT print (min-device-width:4000px);'; - stylesheet = parseCss(input, errors: errors..clear(), opts: options); + stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -450,7 +447,7 @@ void testFontFace() { src: url("fonts/BBCBengali.ttf") format("opentype"); unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; }'''; - var stylesheet = parseCss(input, errors: errors, opts: options); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -468,7 +465,7 @@ void testFontFace() { src: url("http://example.com/fonts/Gentium.ttf"); }'''; - stylesheet = parseCss(input1, errors: errors..clear(), opts: options); + stylesheet = parseCss(input1, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -485,7 +482,7 @@ src: url(ideal-sans-serif.woff) format("woff"), 'format("woff"), url("basic-sans-serif.ttf") ' 'format("opentype"), local(Gentium Bold);\n}'; - stylesheet = parseCss(input2, errors: errors..clear(), opts: options); + stylesheet = parseCss(input2, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -504,7 +501,7 @@ src: url(ideal-sans-serif.woff) format("woff"), font-weight: bold; }'''; - stylesheet = parseCss(input3, errors: errors..clear(), opts: options); + stylesheet = parseCss(input3, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -521,7 +518,7 @@ src: url(ideal-sans-serif.woff) format("woff"), src: local(STIXGeneral), url("/stixfonts/STIXGeneral.otf"); unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; }'''; - stylesheet = parseCss(input4, errors: errors..clear(), opts: options); + stylesheet = parseCss(input4, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -703,7 +700,7 @@ html|*:not(:link):not(:visited) { color: #00f; }'''; - var stylesheet = parseCss(input, errors: errors, opts: options); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -721,7 +718,7 @@ void testIE() { "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" "}"; - var stylesheet = parseCss(input, errors: errors, opts: options); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -739,7 +736,7 @@ void testIE() { " progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n" "}"; - stylesheet = parseCss(input2, errors: errors..clear(), opts: options); + stylesheet = parseCss(input2, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -769,7 +766,7 @@ div { ' FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20, \n' ' Phase=220, Strength=10);\n}'; - stylesheet = parseCss(input3, errors: errors..clear(), opts: options); + stylesheet = parseCss(input3, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -946,19 +943,18 @@ input.search-query { } }'''; - var stylesheet = parseCss(input, errors: errors, opts: options); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } void testHangs() { - final optionErrors = ['--no-colors', '--warnings_as_errors', 'memory']; var errors = []; // Bad hexvalue had caused a hang in processTerm. final input = r'''#a { color: #ebebeburl(0/IE8+9+); }'''; - var stylesheet = parseCss(input, errors: errors, opts: optionErrors); + var stylesheet = parseCss(input, errors: errors, opts: options); expect(stylesheet != null, true); expect(errors.length, 3, reason: errors.toString()); @@ -994,7 +990,7 @@ void testHangs() { } '''; - stylesheet = parseCss(input2, errors: errors..clear(), opts: optionErrors); + stylesheet = parseCss(input2, errors: errors..clear(), opts: options); expect(stylesheet != null, true); diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index ed24b35e4..94d9e7be9 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -7,8 +7,6 @@ library extend_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -var options = ['--warnings_as_errors', '--no-colors', 'memory']; - compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 5c5a0fca2..937ed4427 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -7,8 +7,6 @@ library mixin_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -final options = ['--warnings_as_errors', '--no-colors', 'memory']; - compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index 2a46da7f9..db25679d1 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -7,11 +7,9 @@ library nested_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -List optionsCss = ['--no-colors', 'memory']; - compileAndValidate(String input, String generated) { var errors = []; - var stylesheet = compileCss(input, errors: errors, opts: optionsCss); + var stylesheet = compileCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index b9a6738f0..df65532ce 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -8,6 +8,21 @@ library testing; import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; import 'package:csslib/src/messages.dart'; +import 'package:csslib/src/options.dart'; + +export 'package:csslib/src/options.dart'; + +const simpleOptionsWithCheckedAndWarningsAsErrors = const PreprocessorOptions( + useColors: false, + checked: true, + warningsAsErrors: true, + inputFile: 'memory'); + +const simpleOptions = + const PreprocessorOptions(useColors: false, inputFile: 'memory'); + +const options = const PreprocessorOptions( + useColors: false, warningsAsErrors: true, inputFile: 'memory'); void useMockMessages() { messages = new Messages(printHandler: (message) {}); @@ -19,10 +34,10 @@ void useMockMessages() { * tests (by default) will ensure that the CSS is really valid. */ StyleSheet parseCss(String cssInput, - {List errors, List opts}) => parse(cssInput, + {List errors, PreprocessorOptions opts}) => parse(cssInput, errors: errors, options: opts == null - ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] + ? simpleOptionsWithCheckedAndWarningsAsErrors : opts); /** @@ -30,17 +45,18 @@ StyleSheet parseCss(String cssInput, * CSS will allow any property/value pairs regardless of validity; all of our * tests (by default) will ensure that the CSS is really valid. */ -StyleSheet compileCss(String cssInput, {List errors, List opts, - bool polyfill: false, List includes: null}) => compile(cssInput, +StyleSheet compileCss(String cssInput, {List errors, + PreprocessorOptions opts, bool polyfill: false, + List includes: null}) => compile(cssInput, errors: errors, options: opts == null - ? ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] + ? simpleOptionsWithCheckedAndWarningsAsErrors : opts, polyfill: polyfill, includes: includes); StyleSheet polyFillCompileCss(input, - {List errors, List opts}) => + {List errors, PreprocessorOptions opts}) => compileCss(input, errors: errors, polyfill: true, opts: opts); /** CSS emitter walks the style sheet tree and emits readable CSS. */ diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 17349b880..657459da0 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -7,8 +7,6 @@ library var_test; import 'package:unittest/unittest.dart'; import 'testing.dart'; -List options = ['--no-colors', '--warnings_as_errors', 'memory']; - compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); @@ -644,8 +642,7 @@ var-color-foreground: #00f; color: var(color-foreground); }'''; - var stylesheet = - parseCss(input, errors: errors, opts: ['--no-colors', 'memory']); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -670,8 +667,7 @@ var-color-foreground: #00f; color: var(color-foreground); }'''; - stylesheet = - parseCss(input, errors: errors..clear(), opts: ['--no-colors', 'memory']); + stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -699,8 +695,7 @@ var-color-foreground: #00f; color: var(color-foreground); }'''; - var stylesheet = - parseCss(input, errors: errors, opts: ['--no-colors', 'memory']); + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -725,8 +720,7 @@ var-color-foreground: #00f; color: var(color-foreground); }'''; - stylesheet = - parseCss(input, errors: errors..clear(), opts: ['--no-colors', 'memory']); + stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index 177774890..e7102de0c 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -49,7 +49,7 @@ void testClassVisitors() { div.hello { font: arial; } '''; - s = parseCss(in1, errors: errors..clear(), opts: ['--no-colors', 'memory']); + s = parseCss(in1, errors: errors..clear(), opts: simpleOptions); expect(s != null, true); expect(errors.isEmpty, true, reason: errors.toString()); From 3900962d7a67fe9ad37e533f47c08ace08c28e83 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 11 May 2015 12:35:25 -0700 Subject: [PATCH 041/245] use pkg/test and allow latest version of logging pkg R=jakemac@google.com Review URL: https://codereview.chromium.org//1131243005 --- pkgs/csslib/pubspec.yaml | 6 ++-- pkgs/csslib/test/big_1_test.dart | 2 +- pkgs/csslib/test/compiler_test.dart | 2 +- pkgs/csslib/test/debug_test.dart | 2 +- pkgs/csslib/test/declaration_test.dart | 13 ++++---- pkgs/csslib/test/error_test.dart | 5 +-- pkgs/csslib/test/extend_test.dart | 3 +- pkgs/csslib/test/mixin_test.dart | 3 +- pkgs/csslib/test/nested_test.dart | 11 ++++--- pkgs/csslib/test/run.sh | 39 ----------------------- pkgs/csslib/test/run_all.dart | 43 -------------------------- pkgs/csslib/test/selector_test.dart | 5 +-- pkgs/csslib/test/testing.dart | 4 --- pkgs/csslib/test/var_test.dart | 3 +- pkgs/csslib/test/visitor_test.dart | 3 +- 15 files changed, 33 insertions(+), 111 deletions(-) delete mode 100755 pkgs/csslib/test/run.sh delete mode 100644 pkgs/csslib/test/run_all.dart diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 5ef264aa0..7d3c6ddf7 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.12.0 +version: 0.12.1-dev author: Polymer.dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib @@ -7,9 +7,9 @@ environment: sdk: '>=1.1.0 <2.0.0' dependencies: args: '>=0.9.0 <0.14.0' - logging: '>=0.9.0 <0.10.0' + logging: '>=0.9.0 <0.12.0' path: '>=0.9.0 <2.0.0' source_span: '>=1.0.0 <2.0.0' dev_dependencies: browser: '>=0.9.0 <0.11.0' - unittest: '>=0.9.0 <0.12.0' + test: '>=0.12.0 <0.13.0' diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart index 5f38ba088..f92ea82ec 100644 --- a/pkgs/csslib/test/big_1_test.dart +++ b/pkgs/csslib/test/big_1_test.dart @@ -4,7 +4,7 @@ library big_1_test; -import 'package:unittest/unittest.dart'; +import 'package:test/test.dart'; import 'testing.dart'; compilePolyfillAndValidate(String input, String generated) { diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index 5d5dcf509..88b7a2d04 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -5,7 +5,7 @@ library compiler_test; import 'dart:convert'; -import 'package:unittest/unittest.dart'; +import 'package:test/test.dart'; import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; import 'testing.dart'; diff --git a/pkgs/csslib/test/debug_test.dart b/pkgs/csslib/test/debug_test.dart index 6cfea56a4..94898eb29 100644 --- a/pkgs/csslib/test/debug_test.dart +++ b/pkgs/csslib/test/debug_test.dart @@ -1,6 +1,6 @@ library debug; -import 'package:unittest/unittest.dart'; +import 'package:test/test.dart'; import 'testing.dart'; void main() { diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index f01b804d2..8326a03fa 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -4,7 +4,8 @@ library declaration_test; -import 'package:unittest/unittest.dart'; +import 'package:test/test.dart'; + import 'testing.dart'; void testSimpleTerms() { @@ -342,7 +343,7 @@ void testMediaQueries() { expect(prettyPrint(stylesheet), generated); input = ''' - @media handheld and (min-width: 20em), + @media handheld and (min-width: 20em), screen and (min-width: 20em) { #id { color: red; } .myclass { height: 20px; } @@ -751,8 +752,8 @@ div { Filter: FlipV; Filter: Gray; FILTER: Chroma(Color = #000000) Mask(Color=#00FF00); - Filter: Alpha(Opacity=100, FinishOpacity=0, Style=2, StartX=20, StartY=40, - FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20, + Filter: Alpha(Opacity=100, FinishOpacity=0, Style=2, StartX=20, StartY=40, + FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20, Phase=220, Strength=10); } '''; @@ -762,8 +763,8 @@ div { ' Filter: FlipV;\n Filter: Gray;\n' ' FILTER: Chroma(Color = #000000) Mask(Color=#00FF00);\n' ' Filter: Alpha(Opacity=100, FinishOpacity=0, Style=2, ' - 'StartX=20, StartY=40, \n' - ' FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20, \n' + 'StartX=20, StartY=40,\n' + ' FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20,\n' ' Phase=220, Strength=10);\n}'; stylesheet = parseCss(input3, errors: errors..clear(), opts: simpleOptions); diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 71890cc89..fc9ecf650 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -4,9 +4,10 @@ library error_test; -import 'package:unittest/unittest.dart'; -import 'testing.dart'; import 'package:csslib/src/messages.dart'; +import 'package:test/test.dart'; + +import 'testing.dart'; /** * Test for unsupported font-weights values of bolder, lighter and inherit. diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index 94d9e7be9..49c8a9c46 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -4,7 +4,8 @@ library extend_test; -import 'package:unittest/unittest.dart'; +import 'package:test/test.dart'; + import 'testing.dart'; compileAndValidate(String input, String generated) { diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 937ed4427..c94c9c018 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -4,7 +4,8 @@ library mixin_test; -import 'package:unittest/unittest.dart'; +import 'package:test/test.dart'; + import 'testing.dart'; compileAndValidate(String input, String generated) { diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index db25679d1..797ac5fe1 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -4,7 +4,8 @@ library nested_test; -import 'package:unittest/unittest.dart'; +import 'package:test/test.dart'; + import 'testing.dart'; compileAndValidate(String input, String generated) { @@ -413,7 +414,7 @@ void complexThis() { .textLink { color: fooL1; &:hover { color: barL1;} - } + } .picLink { background-image: url(/fooL1.jpg); &:hover { background-image: url(/barL1.jpg);} @@ -423,7 +424,7 @@ void complexThis() { background-image: url(/fooL2.jpg); &:hover { color: barL2; background-image: url(/barL2.jpg);} } - } + } }'''; final generated1 = r'''.light { @@ -456,11 +457,11 @@ void complexThis() { .light .leftCol & { color: fooL1; &:hover { color: barL1; } - } + } .light .rightCol & { color: fooL3; &:hover { color: barL3; } - } + } }'''; final generated2 = r''' diff --git a/pkgs/csslib/test/run.sh b/pkgs/csslib/test/run.sh deleted file mode 100755 index 7d2620904..000000000 --- a/pkgs/csslib/test/run.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file -# for details. All rights reserved. Use of this source code is governed by a -# BSD-style license that can be found in the LICENSE file. - -# Usage: call directly in the commandline as test/run.sh ensuring that you have -# 'dart' in your path. Filter tests by passing a pattern as an argument to this -# script. - -# TODO(sigmund): replace with a real test runner - -# bail on error -set -e - -# print commands executed by this script -# set -x - -DIR=$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd ) -DART_FLAGS="--checked" -TEST_PATTERN=$1 - -if [[ ($TEST_PATTERN == "") ]]; then - # Note: dart_analyzer needs to be run from the root directory for proper path - # canonicalization. - pushd $DIR/.. &>/dev/null - echo Analyzing compiler for warnings or type errors - dartanalyzer --fatal-warnings --fatal-type-errors bin/css.dart - popd &>/dev/null -fi - -pushd $DIR &>/dev/null -if [[ ($TEST_PATTERN == "canary") || ($TEST_PATTERN = "") ]]; then - dart $DART_FLAGS run_all.dart -else - dart $DART_FLAGS run_all.dart $TEST_PATTERN -fi -popd &>/dev/null - -echo All tests completed. diff --git a/pkgs/csslib/test/run_all.dart b/pkgs/csslib/test/run_all.dart deleted file mode 100644 index 36020cd36..000000000 --- a/pkgs/csslib/test/run_all.dart +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -/** - * This is a helper for run.sh. We try to run all of the Dart code in one - * instance of the Dart VM to reduce warm-up time. - */ -library run_impl; - -import 'package:unittest/compact_vm_config.dart'; -import 'testing.dart'; - -import 'big_1_test.dart' as big_1_test; -import 'compiler_test.dart' as compiler_test; -import 'declaration_test.dart' as declaration_test; -import 'debug_test.dart' as debug_test; -import 'error_test.dart' as error_test; -import 'extend_test.dart' as extend_test; -import 'mixin_test.dart' as mixin_test; -import 'nested_test.dart' as nested_test; -import 'selector_test.dart' as selector_test; -import 'var_test.dart' as var_test; -import 'visitor_test.dart' as visitor_test; - -void main(List arguments) { - var pattern = new RegExp(arguments.length > 0 ? arguments[0] : '.'); - - useCompactVMConfiguration(); - useMockMessages(); - - if (pattern.hasMatch('debug_test.dart')) debug_test.main(); - if (pattern.hasMatch('compiler_test.dart')) compiler_test.main(); - if (pattern.hasMatch('declaration_test.dart')) declaration_test.main(); - if (pattern.hasMatch('var_test.dart')) var_test.main(); - if (pattern.hasMatch('nested_test.dart')) nested_test.main(); - if (pattern.hasMatch('selector_test.dart')) selector_test.main(); - if (pattern.hasMatch('mixin_test.dart')) mixin_test.main(); - if (pattern.hasMatch('extend_test.dart')) extend_test.main(); - if (pattern.hasMatch('big_1_test.dart')) big_1_test.main(); - if (pattern.hasMatch('visitor_test.dart')) visitor_test.main(); - if (pattern.hasMatch('error_test.dart')) error_test.main(); -} diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index 5d687e65e..aefab164d 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -4,9 +4,10 @@ library selector_test; -import 'package:unittest/unittest.dart'; -import 'testing.dart'; import 'package:csslib/parser.dart'; +import 'package:test/test.dart'; + +import 'testing.dart'; void testSelectorSuccesses() { var errors = []; diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index df65532ce..de2aab190 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -24,10 +24,6 @@ const simpleOptions = const options = const PreprocessorOptions( useColors: false, warningsAsErrors: true, inputFile: 'memory'); -void useMockMessages() { - messages = new Messages(printHandler: (message) {}); -} - /** * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, * CSS will allow any property/value pairs regardless of validity; all of our diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 657459da0..39720234b 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -4,7 +4,8 @@ library var_test; -import 'package:unittest/unittest.dart'; +import 'package:test/test.dart'; + import 'testing.dart'; compileAndValidate(String input, String generated) { diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index e7102de0c..803b10614 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -4,8 +4,9 @@ library visitor_test; -import 'package:unittest/unittest.dart'; import 'package:csslib/visitor.dart'; +import 'package:test/test.dart'; + import 'testing.dart'; class ClassVisitor extends Visitor { From dbbf3b8659e46abc35dcc7ea05fffdd8f581373f Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 12 May 2015 10:45:58 -0700 Subject: [PATCH 042/245] Remove a number of unused members, prepare for release R=jakemac@google.com Review URL: https://codereview.chromium.org//1138823002 --- pkgs/csslib/CHANGELOG.md | 4 +++ pkgs/csslib/lib/parser.dart | 4 --- pkgs/csslib/lib/src/polyfill.dart | 2 +- pkgs/csslib/lib/src/tokenizer_base.dart | 19 -------------- pkgs/csslib/lib/src/tokenkind.dart | 34 ------------------------- pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/nested_test.dart | 8 ------ pkgs/csslib/test/var_test.dart | 2 -- 8 files changed, 6 insertions(+), 69 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index beac1eccc..b8c2a6d0f 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.12.0+1 + +* Allow the lastest version of `logging` package. + ## 0.12.0 * Top-level methods in `parser.dart` now take `PreprocessorOptions` instead of diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 9d27e97ac..1ca391cfe 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -300,10 +300,6 @@ class _Parser { } } - void _eatSemicolon() { - _eat(TokenKind.SEMICOLON); - } - void _errorExpected(String expected) { var tok = _next(); var message; diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index bdd833031..9b682ce4c 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -52,7 +52,7 @@ class PolyFill { // Resolve all definitions to a non-VarUsage (terminal expression). mainStyleSheetVarDefs.forEach((key, value) { - for (Expression expr in (value.expression as Expressions).expressions) { + for (var _ in (value.expression as Expressions).expressions) { mainStyleSheetVarDefs[key] = _findTerminalVarDefinition(_allVarDefinitions, value); } diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index 7999a8f86..8c52fb0ba 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -55,9 +55,6 @@ abstract class TokenizerBase { int _index = 0; int _startIndex = 0; - static const String _CDATA_START = ''; - TokenizerBase(this._file, this._text, this._skipWhitespace, [this._index = 0]); @@ -104,14 +101,6 @@ abstract class TokenizerBase { } } - String _tokenText() { - if (_index < _text.length) { - return _text.substring(_startIndex, _index); - } else { - return _text.substring(_startIndex, _text.length); - } - } - Token _finishToken(int kind) { return new Token(kind, _file.span(_startIndex, _index)); } @@ -306,14 +295,6 @@ abstract class TokenizerBase { } } - Token _finishOpenBrace() { - return _finishToken(TokenKind.LBRACE); - } - - Token _finishCloseBrace() { - return _finishToken(TokenKind.RBRACE); - } - Token finishString(int quote) { if (_maybeEatChar(quote)) { if (_maybeEatChar(quote)) { diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index 8e976bfef..617f06245 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -467,40 +467,6 @@ class TokenKind { // see http://www.w3schools.com/cssref/pr_list-style-type.asp // for list of possible values. - // List of valid CSS functions: - static const List> _FUNCTIONS = const [ - const {'name': 'counter', 'info': const {'params': 2, 'expr': false}}, - const {'name': 'attr', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'calc', 'info': const {'params': 1, 'expr': true}}, - const {'name': 'min', 'info': const {'params': 2, 'expr': true}}, - const {'name': 'max', 'info': const {'params': 2, 'expr': true}}, - - // 2D functions: - const {'name': 'translateX', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'translateY', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'translate', 'info': const {'params': 2, 'expr': false}}, - const {'name': 'rotate', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'scaleX', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'scaleY', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'scale', 'info': const {'params': 2, 'expr': false}}, - const {'name': 'skewX', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'skewY', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'skew', 'info': const {'params': 2, 'expr': false}}, - const {'name': 'matrix', 'info': const {'params': 6, 'expr': false}}, - - // 3D functions: - const {'name': 'matrix3d', 'info': const {'params': 16, 'expr': false}}, - const {'name': 'translate3d', 'info': const {'params': 3, 'expr': false}}, - const {'name': 'translateZ', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'scale3d', 'info': const {'params': 3, 'expr': false}}, - const {'name': 'scaleZ', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'rotate3d', 'info': const {'params': 3, 'expr': false}}, - const {'name': 'rotateX', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'rotateY', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'rotateZ', 'info': const {'params': 1, 'expr': false}}, - const {'name': 'perspective', 'info': const {'params': 1, 'expr': false}}, - ]; - /** * Check if name is a pre-defined CSS name. Used by error handler to report * if name is unknown or used improperly. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 7d3c6ddf7..01051d3e3 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.12.1-dev +version: 0.12.0+1 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index 797ac5fe1..1848ef13b 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -341,8 +341,6 @@ span { } void mediaNesting() { - var errors = []; - final input = r''' @media screen and (-webkit-min-device-pixel-ratio:0) { #toggle-all { @@ -372,7 +370,6 @@ void mediaNesting() { } void simpleThis() { - final errors = []; final input = '''#header { h1 { font-size: 26px; @@ -406,8 +403,6 @@ void simpleThis() { } void complexThis() { - var errors = []; - final input1 = r''' .light { .leftCol { @@ -484,8 +479,6 @@ void complexThis() { } variationsThis() { - var errors = []; - final input1 = r''' .textLink { a { @@ -597,7 +590,6 @@ light .leftCol .textLink a { } thisCombinator() { - var errors = []; var input = r''' .btn { color: red; diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 39720234b..d47fd785e 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -63,7 +63,6 @@ void simpleVar() { } void expressionsVar() { - final errors = []; final input = ''':root { var-color-background: red; var-color-foreground: blue; @@ -222,7 +221,6 @@ void expressionsVar() { } void defaultVar() { - final errors = []; final input = ''' :root { var-color-background: red; From 7bbb983a1010729adda6f9581d66dfeeb67f7fc2 Mon Sep 17 00:00:00 2001 From: Winston Ewert Date: Fri, 10 Jul 2015 14:12:51 -0700 Subject: [PATCH 043/245] Fixes a bug in the CSS string escape handling. The CSS parser would interpret escapes in identifiers in strings. This caused the strings to be incorrectly parsed. This renames _skipWhitespace to be _inString (as it is only used in string parsing) and extends it to disable the escape handling in identifiers. --- pkgs/csslib/lib/parser.dart | 6 +++--- pkgs/csslib/lib/src/tokenizer.dart | 6 +++--- pkgs/csslib/lib/src/tokenizer_base.dart | 10 +++++----- pkgs/csslib/test/compiler_test.dart | 14 ++++++++++++++ 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 1ca391cfe..86926938d 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2363,8 +2363,8 @@ class _Parser { // Note: disable skipping whitespace tokens inside a string. // TODO(jmesserly): the layering here feels wrong. - var skipWhitespace = tokenizer._skipWhitespace; - tokenizer._skipWhitespace = false; + var inString = tokenizer._inString; + tokenizer._inString = false; switch (_peek()) { case TokenKind.SINGLE_QUOTE: @@ -2396,7 +2396,7 @@ class _Parser { stringValue.write(_next().text); } - tokenizer._skipWhitespace = skipWhitespace; + tokenizer._inString = inString; // All characters between quotes is the string. if (stopToken != TokenKind.RPAREN) { diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index f5c52104f..d423104ba 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -273,7 +273,7 @@ class Tokenizer extends TokenizerBase { // if followed by hexadecimal digits, create the appropriate character. // otherwise, include the character in the identifier and don't treat it // specially. - if (ch == 92 /*\*/) { + if (ch == 92 /*\*/ && _inString) { int startHex = ++_index; eatHexDigits(startHex + 6); if (_index != startHex) { @@ -395,7 +395,7 @@ class Tokenizer extends TokenizerBase { return _finishToken(TokenKind.INCOMPLETE_COMMENT); } else if (ch == 42 /*'*'*/) { if (_maybeEatChar(47 /*'/'*/)) { - if (_skipWhitespace) { + if (_inString) { return next(); } else { return _finishToken(TokenKind.COMMENT); @@ -405,7 +405,7 @@ class Tokenizer extends TokenizerBase { /* Check if close part of Comment Definition --> (CDC). */ if (_maybeEatChar(TokenChar.MINUS)) { if (_maybeEatChar(TokenChar.GREATER)) { - if (_skipWhitespace) { + if (_inString) { return next(); } else { return _finishToken(TokenKind.HTML_COMMENT); diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index 8c52fb0ba..663c987d1 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -27,7 +27,7 @@ abstract class TokenizerBase { final SourceFile _file; final String _text; - bool _skipWhitespace; + bool _inString; /** * Changes tokenization when in a pseudo function expression. If true then @@ -55,7 +55,7 @@ abstract class TokenizerBase { int _index = 0; int _startIndex = 0; - TokenizerBase(this._file, this._text, this._skipWhitespace, + TokenizerBase(this._file, this._text, this._inString, [this._index = 0]); Token next(); @@ -119,12 +119,12 @@ abstract class TokenizerBase { ch == TokenChar.RETURN) { // do nothing } else if (ch == TokenChar.NEWLINE) { - if (!_skipWhitespace) { + if (!_inString) { return _finishToken(TokenKind.WHITESPACE); // note the newline? } } else { _index--; - if (_skipWhitespace) { + if (_inString) { return next(); } else { return _finishToken(TokenKind.WHITESPACE); @@ -151,7 +151,7 @@ abstract class TokenizerBase { } } while (nesting > 0); - if (_skipWhitespace) { + if (_inString) { return next(); } else { return _finishToken(TokenKind.COMMENT); diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index 88b7a2d04..df5a44aaa 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -677,6 +677,19 @@ void testHost() { }'''); } +void testStringEscape() { + var errors = []; + var input = r'''a { foo: '{"text" : "a\\\""}' }'''; + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + expect(prettyPrint(stylesheet), r''' +a { + foo: '{"text" : "a\\\""}'; +}'''); +} + // TODO(terry): Move to emitter_test.dart when real emitter exist. void testEmitter() { var errors = []; @@ -721,6 +734,7 @@ main() { test('Attributes', testAttribute); test('Negation', testNegation); test('@host', testHost); + test('stringEscape', testStringEscape); test('Parse List as input', testArrayOfChars); test('Simple Emitter', testEmitter); } From e1d099164944c16d2ee38bcb2f19789c25f5a4b7 Mon Sep 17 00:00:00 2001 From: Winston Ewert Date: Fri, 10 Jul 2015 14:23:30 -0700 Subject: [PATCH 044/245] Updated changelog and version --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index b8c2a6d0f..4d14f0b9c 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.12.1 + + * Fix to handling of escapes in strings. + ## 0.12.0+1 * Allow the lastest version of `logging` package. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 01051d3e3..70923da8e 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.12.0+1 +version: 0.12.1 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 57ad1f7633bb23cba484edf53dcfde78016675e4 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 27 Aug 2015 12:16:34 -0700 Subject: [PATCH 045/245] use pkg/test config for bots ignore .packages file R=sigmund@google.com Review URL: https://codereview.chromium.org//1318113002 . --- pkgs/csslib/.gitignore | 4 ++-- pkgs/csslib/.status | 3 --- pkgs/csslib/.test_config | 3 +++ pkgs/csslib/pubspec.yaml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 pkgs/csslib/.status create mode 100644 pkgs/csslib/.test_config diff --git a/pkgs/csslib/.gitignore b/pkgs/csslib/.gitignore index 388eff0ba..a6867f25e 100644 --- a/pkgs/csslib/.gitignore +++ b/pkgs/csslib/.gitignore @@ -1,8 +1,8 @@ # Don’t commit the following directories created by pub. -.buildlog .pub/ build/ packages +.packages # Or the files created by dart2js. *.dart.js @@ -11,4 +11,4 @@ packages *.js.map # Include when developing application packages. -pubspec.lock \ No newline at end of file +pubspec.lock diff --git a/pkgs/csslib/.status b/pkgs/csslib/.status deleted file mode 100644 index e9f2b0049..000000000 --- a/pkgs/csslib/.status +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file -# for details. All rights reserved. Use of this source code is governed by a -# BSD-style license that can be found in the LICENSE file. diff --git a/pkgs/csslib/.test_config b/pkgs/csslib/.test_config new file mode 100644 index 000000000..412fc5c5c --- /dev/null +++ b/pkgs/csslib/.test_config @@ -0,0 +1,3 @@ +{ + "test_package": true +} \ No newline at end of file diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 70923da8e..ab709a919 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.12.1 +version: 0.12.2-dev author: Polymer.dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 2afeb7db082f23e1840bf24dcce5322cb5ef1973 Mon Sep 17 00:00:00 2001 From: John Messerly Date: Mon, 21 Sep 2015 13:10:27 -0700 Subject: [PATCH 046/245] Update README.md --- pkgs/csslib/README.md | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/pkgs/csslib/README.md b/pkgs/csslib/README.md index e64fd9bc6..e18d737c8 100644 --- a/pkgs/csslib/README.md +++ b/pkgs/csslib/README.md @@ -1,20 +1,12 @@ csslib in Pure Dart =================== -This is a pure [Dart][dart] [CSS parser][cssparse]. Since it's 100% -Dart you can use it safely from a script or server side app. +This is a CSS parser written entirely in [Dart][dart]. +It can be used in the client/server/command line. -Installation ------------- - -Add this to your `pubspec.yaml` (or create it): -```yaml -dependencies: - csslib: any -``` -Then run the [Pub Package Manager][pub] (comes with the Dart SDK): - - pub install +This package is installed with [Pub][pub], see: +[install instructions](https://pub.dartlang.org/packages/csslib#installing) +for this package. Usage ----- @@ -34,21 +26,6 @@ main() { You can pass a String or list of bytes to `parse`. -Updating --------- - -You can upgrade the library with: - - pub update - -Disclaimer: the APIs are not finished. Updating may break your code. If that -happens, you can check the -[commit log](https://github.com/dart-lang/csslib/commits/master), to figure -out what the change was. - -If you want to avoid breakage, you can also put the version constraint in your -`pubspec.yaml` in place of the word `any`. - Running Tests ------------- From aa3562c5807cf6ebbc3aac66a150499fd8af6877 Mon Sep 17 00:00:00 2001 From: John Messerly Date: Mon, 21 Sep 2015 15:15:52 -0700 Subject: [PATCH 047/245] fix strong mode errors, and a bunch of analyzer messages --- pkgs/csslib/lib/parser.dart | 15 +- pkgs/csslib/lib/src/analyzer.dart | 11 +- pkgs/csslib/lib/src/polyfill.dart | 7 +- pkgs/csslib/lib/src/property.dart | 4 +- pkgs/csslib/lib/src/tokenkind.dart | 6 +- pkgs/csslib/lib/src/tree.dart | 5 +- pkgs/csslib/lib/src/validate.dart | 1 - pkgs/csslib/lib/visitor.dart | 382 ++++++++++++++--------------- 8 files changed, 218 insertions(+), 213 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 86926938d..a715a9ab1 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -64,7 +64,7 @@ StyleSheet compile(input, {List errors, PreprocessorOptions options, analyze([tree], errors: errors, options: options); if (polyfill) { - var processCss = new PolyFill(messages, true); + var processCss = new PolyFill(messages); processCss.process(tree, includes: includes); } @@ -430,6 +430,7 @@ class _Parser { if (unaryOp != -1 || type != null || exprs.length > 0) { return new MediaQuery(unaryOp, type, exprs, _makeSpan(start)); } + return null; } MediaExpression processMediaExpression([bool andOperator = false]) { @@ -453,9 +454,9 @@ class _Parser { } } else if (isChecked) { _warning("Missing media feature in media expression", _makeSpan(start)); - return null; } } + return null; } /** @@ -798,7 +799,6 @@ class _Parser { _eat(TokenKind.LBRACE); List productions = []; - List declarations = []; var mixinDirective; var start = _peekToken.span; @@ -984,6 +984,7 @@ class _Parser { return new RuleSet( selectorGroup, processDeclarations(), selectorGroup.span); } + return null; } /** @@ -1191,6 +1192,7 @@ class _Parser { if (selectors.length > 0) { return new SelectorGroup(selectors, _makeSpan(start)); } + return null; } /** @@ -1602,6 +1604,7 @@ class _Parser { return new AttributeSelector(attrName, op, value, _makeSpan(start)); } + return null; } // Declaration grammar: @@ -1763,6 +1766,7 @@ class _Parser { if (styleType != null) { return buildDartStyleNode(styleType, exprs, dartStyles); } + return null; } FontExpression _mergeFontStyles(FontExpression fontExpr, List dartStyles) { @@ -1910,10 +1914,8 @@ class _Parser { return processOneNumber(exprs, styleType); } break; - default: - // Don't handle it. - return null; } + return null; } // TODO(terry): Look at handling width of thin, thick, etc. any none numbers @@ -1956,6 +1958,7 @@ class _Parser { return new PaddingExpression(exprs.span, bottom: value); } } + return null; } /** diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 4fdd83361..fc27ceb09 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -463,8 +463,8 @@ class TopLevelIncludes extends Visitor { } else if (currDef is MixinRulesetDirective && _anyRulesets(currDef)) { // currDef is MixinRulesetDirective MixinRulesetDirective mixinRuleset = currDef; - int index = mixinRuleset.rulesets.indexOf(node as dynamic); - mixinRuleset.rulesets.replaceRange(index, index + 1, [new NoOp()]); + int index = mixinRuleset.rulesets.indexOf(node); + mixinRuleset.rulesets.removeAt(index); _messages.warning( 'Using declaration mixin ${node.name} as top-level mixin', node.span); @@ -472,13 +472,12 @@ class TopLevelIncludes extends Visitor { } else { if (currDef is MixinRulesetDirective) { MixinRulesetDirective rulesetDirect = currDef as MixinRulesetDirective; - var index = 0; - rulesetDirect.rulesets.forEach((entry) { + rulesetDirect.rulesets.removeWhere((entry) { if (entry == node) { - rulesetDirect.rulesets.replaceRange(index, index + 1, [new NoOp()]); _messages.warning('Undefined mixin ${node.name}', node.span); + return true; } - index++; + return false; }); } } diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index 9b682ce4c..b18abd162 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -10,7 +10,6 @@ part of csslib.parser; */ class PolyFill { final Messages _messages; - final bool _warningsAsErrors; Map _allVarDefinitions = new Map(); @@ -21,7 +20,7 @@ class PolyFill { * CSS pseudo-elements 'name::custom-element' is mapped to the manged name * associated with the pseudo-element key. */ - PolyFill(this._messages, this._warningsAsErrors); + PolyFill(this._messages); /** * Run the analyzer on every file that is a style sheet or any component that @@ -227,7 +226,7 @@ VarDefinition _findTerminalVarDefinition( var expressions = varDef.expression as Expressions; for (var expr in expressions.expressions) { if (expr is VarUsage) { - var usageName = (expr as VarUsage).name; + var usageName = expr.name; var foundDef = varDefs[usageName]; // If foundDef is unknown check if defaultValues; if it exist then resolve @@ -236,7 +235,7 @@ VarDefinition _findTerminalVarDefinition( // We're either a VarUsage or terminal definition if in varDefs; // either way replace VarUsage with it's default value because the // VarDefinition isn't found. - var defaultValues = (expr as VarUsage).defaultValues; + var defaultValues = expr.defaultValues; var replaceExprs = expressions.expressions; assert(replaceExprs.length == 1); replaceExprs.replaceRange(0, 1, defaultValues); diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 5d6dc14d1..c2cf776af 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -278,10 +278,11 @@ class Color implements _StyleProperty, ColorBase { return new Hsla(args[0], args[1], args[2], args[3]).toHexArgbString(); default: // Type not defined UnsupportedOperationException should have thrown. - assert(true); + assert(false); break; } } + return null; } static int hexToInt(String hex) => int.parse(hex, radix: 16); @@ -785,6 +786,7 @@ class PointXY implements _StyleProperty { String get cssExpression { // TODO(terry): TBD + return null; } } diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index 617f06245..27ccb4b53 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -192,7 +192,7 @@ class TokenKind { static const int PSEUDO_CLASS_NAME = 705; // :pseudoClass static const int NEGATION = 706; // NOT - static const List> _DIRECTIVES = const [ + static const List> _DIRECTIVES = const [ const {'type': TokenKind.DIRECTIVE_IMPORT, 'value': 'import'}, const {'type': TokenKind.DIRECTIVE_MEDIA, 'value': 'media'}, const {'type': TokenKind.DIRECTIVE_PAGE, 'value': 'page'}, @@ -218,13 +218,13 @@ class TokenKind { const {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'}, ]; - static const List> MEDIA_OPERATORS = const [ + static const List> MEDIA_OPERATORS = const [ const {'type': TokenKind.MEDIA_OP_ONLY, 'value': 'only'}, const {'type': TokenKind.MEDIA_OP_NOT, 'value': 'not'}, const {'type': TokenKind.MEDIA_OP_AND, 'value': 'and'}, ]; - static const List> MARGIN_DIRECTIVES = const [ + static const List> MARGIN_DIRECTIVES = const [ const { 'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFTCORNER, 'value': 'top-left-corner' diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 5dad435b4..75e962900 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -197,6 +197,7 @@ class AttributeSelector extends SimpleSelector { case TokenKind.NO_MATCH: return ''; } + return null; } // Return the TokenKind for operator used by visitAttributeSelector. @@ -215,6 +216,7 @@ class AttributeSelector extends SimpleSelector { case TokenKind.SUBSTRING_MATCH: return 'SUBSTRING_MATCH'; } + return null; } String valueToString() { @@ -572,6 +574,7 @@ class KeyFrameDirective extends Directive { case TokenKind.DIRECTIVE_O_KEYFRAMES: return '@-o-keyframes'; } + return null; } KeyFrameDirective clone() { @@ -676,7 +679,7 @@ class MixinDefinition extends Directive { /** Support a Sass @mixin. See http://sass-lang.com for description. */ class MixinRulesetDirective extends MixinDefinition { - final List rulesets; + final List rulesets; MixinRulesetDirective(String name, List args, bool varArgs, this.rulesets, SourceSpan span) diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index d45cd95ba..e716e66b9 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -53,7 +53,6 @@ class Validate { // Validate the @{css expression} only .class and #elementId are valid inside // of @{...}. static template(List selectors) { - var errorSelector; // signal which selector didn't match. bool found = false; // signal if a selector is matched. int matches = 0; // < 0 IdSelectors, > 0 ClassSelector diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index fa0f8d2bb..593e43a55 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -13,99 +13,99 @@ part 'src/tree_base.dart'; part 'src/tree_printer.dart'; abstract class VisitorBase { - void visitCssComment(CssComment node); - void visitCommentDefinition(CommentDefinition node); - void visitStyleSheet(StyleSheet node); - void visitNoOp(NoOp node); - void visitTopLevelProduction(TopLevelProduction node); - void visitDirective(Directive node); - void visitMediaExpression(MediaExpression node); - void visitMediaQuery(MediaQuery node); - void visitMediaDirective(MediaDirective node); - void visitHostDirective(HostDirective node); - void visitPageDirective(PageDirective node); - void visitCharsetDirective(CharsetDirective node); - void visitImportDirective(ImportDirective node); - void visitKeyFrameDirective(KeyFrameDirective node); - void visitKeyFrameBlock(KeyFrameBlock node); - void visitFontFaceDirective(FontFaceDirective node); - void visitStyletDirective(StyletDirective node); - void visitNamespaceDirective(NamespaceDirective node); - void visitVarDefinitionDirective(VarDefinitionDirective node); - void visitMixinDefinition(MixinDefinition node); - void visitMixinRulesetDirective(MixinRulesetDirective node); - void visitMixinDeclarationDirective(MixinDeclarationDirective node); - void visitIncludeDirective(IncludeDirective node); - void visitContentDirective(ContentDirective node); - - void visitRuleSet(RuleSet node); - void visitDeclarationGroup(DeclarationGroup node); - void visitMarginGroup(MarginGroup node); - void visitDeclaration(Declaration node); - void visitVarDefinition(VarDefinition node); - void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node); - void visitExtendDeclaration(ExtendDeclaration node); - void visitSelectorGroup(SelectorGroup node); - void visitSelector(Selector node); - void visitSimpleSelectorSequence(SimpleSelectorSequence node); - void visitSimpleSelector(SimpleSelector node); - void visitElementSelector(ElementSelector node); - void visitNamespaceSelector(NamespaceSelector node); - void visitAttributeSelector(AttributeSelector node); - void visitIdSelector(IdSelector node); - void visitClassSelector(ClassSelector node); - void visitPseudoClassSelector(PseudoClassSelector node); - void visitPseudoElementSelector(PseudoElementSelector node); - void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node); - void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node); - void visitNegationSelector(NegationSelector node); - void visitSelectorExpression(SelectorExpression node); - - void visitUnicodeRangeTerm(UnicodeRangeTerm node); - void visitLiteralTerm(LiteralTerm node); - void visitHexColorTerm(HexColorTerm node); - void visitNumberTerm(NumberTerm node); - void visitUnitTerm(UnitTerm node); - void visitLengthTerm(LengthTerm node); - void visitPercentageTerm(PercentageTerm node); - void visitEmTerm(EmTerm node); - void visitExTerm(ExTerm node); - void visitAngleTerm(AngleTerm node); - void visitTimeTerm(TimeTerm node); - void visitFreqTerm(FreqTerm node); - void visitFractionTerm(FractionTerm node); - void visitUriTerm(UriTerm node); - void visitResolutionTerm(ResolutionTerm node); - void visitChTerm(ChTerm node); - void visitRemTerm(RemTerm node); - void visitViewportTerm(ViewportTerm node); - void visitFunctionTerm(FunctionTerm node); - void visitGroupTerm(GroupTerm node); - void visitItemTerm(ItemTerm node); - void visitIE8Term(IE8Term node); - void visitOperatorSlash(OperatorSlash node); - void visitOperatorComma(OperatorComma node); - void visitOperatorPlus(OperatorPlus node); - void visitOperatorMinus(OperatorMinus node); - void visitVarUsage(VarUsage node); - - void visitExpressions(Expressions node); - void visitBinaryExpression(BinaryExpression node); - void visitUnaryExpression(UnaryExpression node); - - void visitIdentifier(Identifier node); - void visitWildcard(Wildcard node); - void visitThisOperator(ThisOperator node); - void visitNegation(Negation node); - - void visitDartStyleExpression(DartStyleExpression node); - void visitFontExpression(FontExpression node); - void visitBoxExpression(BoxExpression node); - void visitMarginExpression(MarginExpression node); - void visitBorderExpression(BorderExpression node); - void visitHeightExpression(HeightExpression node); - void visitPaddingExpression(PaddingExpression node); - void visitWidthExpression(WidthExpression node); + visitCssComment(CssComment node); + visitCommentDefinition(CommentDefinition node); + visitStyleSheet(StyleSheet node); + visitNoOp(NoOp node); + visitTopLevelProduction(TopLevelProduction node); + visitDirective(Directive node); + visitMediaExpression(MediaExpression node); + visitMediaQuery(MediaQuery node); + visitMediaDirective(MediaDirective node); + visitHostDirective(HostDirective node); + visitPageDirective(PageDirective node); + visitCharsetDirective(CharsetDirective node); + visitImportDirective(ImportDirective node); + visitKeyFrameDirective(KeyFrameDirective node); + visitKeyFrameBlock(KeyFrameBlock node); + visitFontFaceDirective(FontFaceDirective node); + visitStyletDirective(StyletDirective node); + visitNamespaceDirective(NamespaceDirective node); + visitVarDefinitionDirective(VarDefinitionDirective node); + visitMixinDefinition(MixinDefinition node); + visitMixinRulesetDirective(MixinRulesetDirective node); + visitMixinDeclarationDirective(MixinDeclarationDirective node); + visitIncludeDirective(IncludeDirective node); + visitContentDirective(ContentDirective node); + + visitRuleSet(RuleSet node); + visitDeclarationGroup(DeclarationGroup node); + visitMarginGroup(MarginGroup node); + visitDeclaration(Declaration node); + visitVarDefinition(VarDefinition node); + visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node); + visitExtendDeclaration(ExtendDeclaration node); + visitSelectorGroup(SelectorGroup node); + visitSelector(Selector node); + visitSimpleSelectorSequence(SimpleSelectorSequence node); + visitSimpleSelector(SimpleSelector node); + visitElementSelector(ElementSelector node); + visitNamespaceSelector(NamespaceSelector node); + visitAttributeSelector(AttributeSelector node); + visitIdSelector(IdSelector node); + visitClassSelector(ClassSelector node); + visitPseudoClassSelector(PseudoClassSelector node); + visitPseudoElementSelector(PseudoElementSelector node); + visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node); + visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node); + visitNegationSelector(NegationSelector node); + visitSelectorExpression(SelectorExpression node); + + visitUnicodeRangeTerm(UnicodeRangeTerm node); + visitLiteralTerm(LiteralTerm node); + visitHexColorTerm(HexColorTerm node); + visitNumberTerm(NumberTerm node); + visitUnitTerm(UnitTerm node); + visitLengthTerm(LengthTerm node); + visitPercentageTerm(PercentageTerm node); + visitEmTerm(EmTerm node); + visitExTerm(ExTerm node); + visitAngleTerm(AngleTerm node); + visitTimeTerm(TimeTerm node); + visitFreqTerm(FreqTerm node); + visitFractionTerm(FractionTerm node); + visitUriTerm(UriTerm node); + visitResolutionTerm(ResolutionTerm node); + visitChTerm(ChTerm node); + visitRemTerm(RemTerm node); + visitViewportTerm(ViewportTerm node); + visitFunctionTerm(FunctionTerm node); + visitGroupTerm(GroupTerm node); + visitItemTerm(ItemTerm node); + visitIE8Term(IE8Term node); + visitOperatorSlash(OperatorSlash node); + visitOperatorComma(OperatorComma node); + visitOperatorPlus(OperatorPlus node); + visitOperatorMinus(OperatorMinus node); + visitVarUsage(VarUsage node); + + visitExpressions(Expressions node); + visitBinaryExpression(BinaryExpression node); + visitUnaryExpression(UnaryExpression node); + + visitIdentifier(Identifier node); + visitWildcard(Wildcard node); + visitThisOperator(ThisOperator node); + visitNegation(Negation node); + + visitDartStyleExpression(DartStyleExpression node); + visitFontExpression(FontExpression node); + visitBoxExpression(BoxExpression node); + visitMarginExpression(MarginExpression node); + visitBorderExpression(BorderExpression node); + visitHeightExpression(HeightExpression node); + visitPaddingExpression(PaddingExpression node); + visitWidthExpression(WidthExpression node); } /** Base vistor class for the style sheet AST. */ @@ -120,33 +120,33 @@ class Visitor implements VisitorBase { } } - void visitTree(StyleSheet tree) => visitStyleSheet(tree); + visitTree(StyleSheet tree) => visitStyleSheet(tree); - void visitStyleSheet(StyleSheet ss) { + visitStyleSheet(StyleSheet ss) { _visitNodeList(ss.topLevels); } - void visitNoOp(NoOp node) {} + visitNoOp(NoOp node) {} - void visitTopLevelProduction(TopLevelProduction node) {} + visitTopLevelProduction(TopLevelProduction node) {} - void visitDirective(Directive node) {} + visitDirective(Directive node) {} - void visitCssComment(CssComment node) {} + visitCssComment(CssComment node) {} - void visitCommentDefinition(CommentDefinition node) {} + visitCommentDefinition(CommentDefinition node) {} - void visitMediaExpression(MediaExpression node) { + visitMediaExpression(MediaExpression node) { visitExpressions(node.exprs); } - void visitMediaQuery(MediaQuery node) { + visitMediaQuery(MediaQuery node) { for (var mediaExpr in node.expressions) { visitMediaExpression(mediaExpr); } } - void visitMediaDirective(MediaDirective node) { + visitMediaDirective(MediaDirective node) { for (var mediaQuery in node.mediaQueries) { visitMediaQuery(mediaQuery); } @@ -155,13 +155,13 @@ class Visitor implements VisitorBase { } } - void visitHostDirective(HostDirective node) { + visitHostDirective(HostDirective node) { for (var ruleset in node.rulesets) { visitRuleSet(ruleset); } } - void visitPageDirective(PageDirective node) { + visitPageDirective(PageDirective node) { for (var declGroup in node._declsMargin) { if (declGroup is MarginGroup) { visitMarginGroup(declGroup); @@ -171,285 +171,285 @@ class Visitor implements VisitorBase { } } - void visitCharsetDirective(CharsetDirective node) {} + visitCharsetDirective(CharsetDirective node) {} - void visitImportDirective(ImportDirective node) { + visitImportDirective(ImportDirective node) { for (var mediaQuery in node.mediaQueries) { visitMediaQuery(mediaQuery); } } - void visitKeyFrameDirective(KeyFrameDirective node) { + visitKeyFrameDirective(KeyFrameDirective node) { visitIdentifier(node.name); _visitNodeList(node._blocks); } - void visitKeyFrameBlock(KeyFrameBlock node) { + visitKeyFrameBlock(KeyFrameBlock node) { visitExpressions(node._blockSelectors); visitDeclarationGroup(node._declarations); } - void visitFontFaceDirective(FontFaceDirective node) { + visitFontFaceDirective(FontFaceDirective node) { visitDeclarationGroup(node._declarations); } - void visitStyletDirective(StyletDirective node) { + visitStyletDirective(StyletDirective node) { _visitNodeList(node.rulesets); } - void visitNamespaceDirective(NamespaceDirective node) {} + visitNamespaceDirective(NamespaceDirective node) {} - void visitVarDefinitionDirective(VarDefinitionDirective node) { + visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); } - void visitMixinRulesetDirective(MixinRulesetDirective node) { + visitMixinRulesetDirective(MixinRulesetDirective node) { _visitNodeList(node.rulesets); } - void visitMixinDefinition(MixinDefinition node) {} + visitMixinDefinition(MixinDefinition node) {} - void visitMixinDeclarationDirective(MixinDeclarationDirective node) { + visitMixinDeclarationDirective(MixinDeclarationDirective node) { visitDeclarationGroup(node.declarations); } - void visitIncludeDirective(IncludeDirective node) { + visitIncludeDirective(IncludeDirective node) { for (var index = 0; index < node.args.length; index++) { var param = node.args[index]; _visitNodeList(param); } } - void visitContentDirective(ContentDirective node) { + visitContentDirective(ContentDirective node) { // TODO(terry): TBD } - void visitRuleSet(RuleSet node) { + visitRuleSet(RuleSet node) { visitSelectorGroup(node._selectorGroup); visitDeclarationGroup(node._declarationGroup); } - void visitDeclarationGroup(DeclarationGroup node) { + visitDeclarationGroup(DeclarationGroup node) { _visitNodeList(node.declarations); } - void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); + visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); - void visitDeclaration(Declaration node) { + visitDeclaration(Declaration node) { visitIdentifier(node._property); if (node._expression != null) node._expression.visit(this); } - void visitVarDefinition(VarDefinition node) { + visitVarDefinition(VarDefinition node) { visitIdentifier(node._property); if (node._expression != null) node._expression.visit(this); } - void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { + visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { visitIncludeDirective(node.include); } - void visitExtendDeclaration(ExtendDeclaration node) { + visitExtendDeclaration(ExtendDeclaration node) { _visitNodeList(node.selectors); } - void visitSelectorGroup(SelectorGroup node) { + visitSelectorGroup(SelectorGroup node) { _visitNodeList(node.selectors); } - void visitSelector(Selector node) { + visitSelector(Selector node) { _visitNodeList(node.simpleSelectorSequences); } - void visitSimpleSelectorSequence(SimpleSelectorSequence node) { + visitSimpleSelectorSequence(SimpleSelectorSequence node) { node.simpleSelector.visit(this); } - void visitSimpleSelector(SimpleSelector node) => node._name.visit(this); + visitSimpleSelector(SimpleSelector node) => node._name.visit(this); - void visitNamespaceSelector(NamespaceSelector node) { + visitNamespaceSelector(NamespaceSelector node) { if (node._namespace != null) node._namespace.visit(this); if (node.nameAsSimpleSelector != null) { node.nameAsSimpleSelector.visit(this); } } - void visitElementSelector(ElementSelector node) => visitSimpleSelector(node); + visitElementSelector(ElementSelector node) => visitSimpleSelector(node); - void visitAttributeSelector(AttributeSelector node) { + visitAttributeSelector(AttributeSelector node) { visitSimpleSelector(node); } - void visitIdSelector(IdSelector node) => visitSimpleSelector(node); + visitIdSelector(IdSelector node) => visitSimpleSelector(node); - void visitClassSelector(ClassSelector node) => visitSimpleSelector(node); + visitClassSelector(ClassSelector node) => visitSimpleSelector(node); - void visitPseudoClassSelector(PseudoClassSelector node) => + visitPseudoClassSelector(PseudoClassSelector node) => visitSimpleSelector(node); - void visitPseudoElementSelector(PseudoElementSelector node) => + visitPseudoElementSelector(PseudoElementSelector node) => visitSimpleSelector(node); - void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) => + visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) => visitSimpleSelector(node); - void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) => + visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) => visitSimpleSelector(node); - void visitNegationSelector(NegationSelector node) => + visitNegationSelector(NegationSelector node) => visitSimpleSelector(node); - void visitSelectorExpression(SelectorExpression node) { + visitSelectorExpression(SelectorExpression node) { _visitNodeList(node.expressions); } - void visitUnicodeRangeTerm(UnicodeRangeTerm node) {} + visitUnicodeRangeTerm(UnicodeRangeTerm node) {} - void visitLiteralTerm(LiteralTerm node) {} + visitLiteralTerm(LiteralTerm node) {} - void visitHexColorTerm(HexColorTerm node) {} + visitHexColorTerm(HexColorTerm node) {} - void visitNumberTerm(NumberTerm node) {} + visitNumberTerm(NumberTerm node) {} - void visitUnitTerm(UnitTerm node) {} + visitUnitTerm(UnitTerm node) {} - void visitLengthTerm(LengthTerm node) { + visitLengthTerm(LengthTerm node) { visitUnitTerm(node); } - void visitPercentageTerm(PercentageTerm node) { + visitPercentageTerm(PercentageTerm node) { visitLiteralTerm(node); } - void visitEmTerm(EmTerm node) { + visitEmTerm(EmTerm node) { visitLiteralTerm(node); } - void visitExTerm(ExTerm node) { + visitExTerm(ExTerm node) { visitLiteralTerm(node); } - void visitAngleTerm(AngleTerm node) { + visitAngleTerm(AngleTerm node) { visitUnitTerm(node); } - void visitTimeTerm(TimeTerm node) { + visitTimeTerm(TimeTerm node) { visitUnitTerm(node); } - void visitFreqTerm(FreqTerm node) { + visitFreqTerm(FreqTerm node) { visitUnitTerm(node); } - void visitFractionTerm(FractionTerm node) { + visitFractionTerm(FractionTerm node) { visitLiteralTerm(node); } - void visitUriTerm(UriTerm node) { + visitUriTerm(UriTerm node) { visitLiteralTerm(node); } - void visitResolutionTerm(ResolutionTerm node) { + visitResolutionTerm(ResolutionTerm node) { visitUnitTerm(node); } - void visitChTerm(ChTerm node) { + visitChTerm(ChTerm node) { visitUnitTerm(node); } - void visitRemTerm(RemTerm node) { + visitRemTerm(RemTerm node) { visitUnitTerm(node); } - void visitViewportTerm(ViewportTerm node) { + visitViewportTerm(ViewportTerm node) { visitUnitTerm(node); } - void visitFunctionTerm(FunctionTerm node) { + visitFunctionTerm(FunctionTerm node) { visitLiteralTerm(node); visitExpressions(node._params); } - void visitGroupTerm(GroupTerm node) { + visitGroupTerm(GroupTerm node) { for (var term in node._terms) { term.visit(this); } } - void visitItemTerm(ItemTerm node) { + visitItemTerm(ItemTerm node) { visitNumberTerm(node); } - void visitIE8Term(IE8Term node) {} + visitIE8Term(IE8Term node) {} - void visitOperatorSlash(OperatorSlash node) {} + visitOperatorSlash(OperatorSlash node) {} - void visitOperatorComma(OperatorComma node) {} + visitOperatorComma(OperatorComma node) {} - void visitOperatorPlus(OperatorPlus node) {} + visitOperatorPlus(OperatorPlus node) {} - void visitOperatorMinus(OperatorMinus node) {} + visitOperatorMinus(OperatorMinus node) {} - void visitVarUsage(VarUsage node) { + visitVarUsage(VarUsage node) { _visitNodeList(node.defaultValues); } - void visitExpressions(Expressions node) { + visitExpressions(Expressions node) { _visitNodeList(node.expressions); } - void visitBinaryExpression(BinaryExpression node) { + visitBinaryExpression(BinaryExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw new UnimplementedError(); } - void visitUnaryExpression(UnaryExpression node) { + visitUnaryExpression(UnaryExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw new UnimplementedError(); } - void visitIdentifier(Identifier node) {} + visitIdentifier(Identifier node) {} - void visitWildcard(Wildcard node) {} + visitWildcard(Wildcard node) {} - void visitThisOperator(ThisOperator node) {} + visitThisOperator(ThisOperator node) {} - void visitNegation(Negation node) {} + visitNegation(Negation node) {} - void visitDartStyleExpression(DartStyleExpression node) {} + visitDartStyleExpression(DartStyleExpression node) {} - void visitFontExpression(FontExpression node) { + visitFontExpression(FontExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw new UnimplementedError(); } - void visitBoxExpression(BoxExpression node) { + visitBoxExpression(BoxExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw new UnimplementedError(); } - void visitMarginExpression(MarginExpression node) { + visitMarginExpression(MarginExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw new UnimplementedError(); } - void visitBorderExpression(BorderExpression node) { + visitBorderExpression(BorderExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw new UnimplementedError(); } - void visitHeightExpression(HeightExpression node) { + visitHeightExpression(HeightExpression node) { // TODO(terry): TB - throw UnimplementedError; + throw new UnimplementedError(); } - void visitPaddingExpression(PaddingExpression node) { + visitPaddingExpression(PaddingExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw new UnimplementedError(); } - void visitWidthExpression(WidthExpression node) { + visitWidthExpression(WidthExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw new UnimplementedError(); } } From ed3558febb6fd19c60e42fcf6cd7d078cea4fdd8 Mon Sep 17 00:00:00 2001 From: John Messerly Date: Mon, 21 Sep 2015 15:28:10 -0700 Subject: [PATCH 048/245] Update README.md --- pkgs/csslib/README.md | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/pkgs/csslib/README.md b/pkgs/csslib/README.md index e18d737c8..1610d3b84 100644 --- a/pkgs/csslib/README.md +++ b/pkgs/csslib/README.md @@ -1,7 +1,7 @@ -csslib in Pure Dart -=================== +CSS parser library for Dart +========================== -This is a CSS parser written entirely in [Dart][dart]. +This is a [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) parser written entirely in [Dart][dart]. It can be used in the client/server/command line. This package is installed with [Pub][pub], see: @@ -29,30 +29,15 @@ You can pass a String or list of bytes to `parse`. Running Tests ------------- -All tests (both canary and suite) should be passing. Canary are quick test -verifies that basic CSS is working. The suite tests are a comprehensive set of -~11,000 tests. - -```bash -export DART_SDK=path/to/dart/sdk - -# Make sure dependencies are installed -pub install - -# Run command both canary and the suite tests -test/run.sh -``` - - Run only the canary test: - +Basic tests can be found in this repository: ```bash - test/run.sh canary +pub run test ``` - Run only the suite tests: - +The full CSS test suite can be found in https://github.com/dart-lang/csslib-test-suite ```bash - test/run.sh suite +cd ../csslib-test-suite +./run.sh ``` [dart]: http://www.dartlang.org/ From caa46d53f3b6943f83fe234eea3fdd90fd6f11be Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Wed, 30 Sep 2015 13:44:53 -0700 Subject: [PATCH 049/245] test for broken expression spans --- pkgs/csslib/test/declaration_test.dart | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 8326a03fa..3b48f5f5f 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -1005,6 +1005,16 @@ void testHangs() { expect(errorMessage.span.text.trim(), ''); } +void testExpressionSpans() { + final input = r'''.foo { width: 50px; }'''; + var stylesheet = parseCss(input); + var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; + // This passes + expect(decl.span.text, 'width: 50px'); + // This currently fails + expect(decl.expression.span.text, '50px'); +} + main() { test('Simple Terms', testSimpleTerms); test('Declarations', testDeclarations); @@ -1021,4 +1031,6 @@ main() { test('IE stuff', testIE); test('IE declaration syntax', testIEDeclaration); test('Hanging bugs', testHangs); + test('Expression spans', testExpressionSpans, + skip: 'expression spans are broken'); } From 6a9239a3a3357c9d5cc99bd548483eafd73783af Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Wed, 14 Oct 2015 13:45:24 -0700 Subject: [PATCH 050/245] chore: test showing a bug in calc() declarations --- pkgs/csslib/test/declaration_test.dart | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 3b48f5f5f..a1b9a29c6 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -1015,6 +1015,14 @@ void testExpressionSpans() { expect(decl.expression.span.text, '50px'); } +void testDeclarationSpanWithCalc() { + final input = r'''.foo { height: calc(100% - 55px); }'''; + var stylesheet = parseCss(input); + var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; + // This fails, with span being "height: calc(" + expect(decl.span.text, 'height: calc(100% - 55px);'); +} + main() { test('Simple Terms', testSimpleTerms); test('Declarations', testDeclarations); @@ -1031,6 +1039,8 @@ main() { test('IE stuff', testIE); test('IE declaration syntax', testIEDeclaration); test('Hanging bugs', testHangs); - test('Expression spans', testExpressionSpans, - skip: 'expression spans are broken'); + test('Expression spans', testExpressionSpans, + skip: 'expression spans are broken'); + test('Declaration span containing calc()', testDeclarationSpanWithCalc, + skip: 'calc() declarations are broken'); } From 91594e4fbccc6d4c4f77add0fae7f9ad41856c77 Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Wed, 14 Oct 2015 13:50:24 -0700 Subject: [PATCH 051/245] chore: link from skipped tests to github issues --- pkgs/csslib/test/declaration_test.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index a1b9a29c6..702921d47 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -1040,7 +1040,9 @@ main() { test('IE declaration syntax', testIEDeclaration); test('Hanging bugs', testHangs); test('Expression spans', testExpressionSpans, - skip: 'expression spans are broken'); + skip: 'expression spans are broken' + ' (https://github.com/dart-lang/csslib/issues/15)'); test('Declaration span containing calc()', testDeclarationSpanWithCalc, - skip: 'calc() declarations are broken'); + skip: 'calc() declarations are broken' + ' (https://github.com/dart-lang/csslib/issues/17)'); } From fc3e886ed2dabf17d1039a41b3a592b87a80f627 Mon Sep 17 00:00:00 2001 From: "Terry L. Lucas" Date: Fri, 16 Oct 2015 11:42:45 -0700 Subject: [PATCH 052/245] Add partial support for calc The expression is not fully parsed into the AST. closes https://github.com/dart-lang/csslib/issues/17 R=kevmoo@google.com, yjbanov@google.com, kevinmoo@google.com Review URL: https://codereview.chromium.org//1407333002 . --- pkgs/csslib/CHANGELOG.md | 5 ++ pkgs/csslib/lib/parser.dart | 63 ++++++++++++++++++++++++-- pkgs/csslib/lib/src/css_printer.dart | 6 +++ pkgs/csslib/lib/src/tree.dart | 15 ++++++ pkgs/csslib/lib/src/tree_printer.dart | 7 +++ pkgs/csslib/lib/visitor.dart | 6 +++ pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/declaration_test.dart | 54 +++++++++++++++++++--- 8 files changed, 148 insertions(+), 10 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 4d14f0b9c..b4ee9e15f 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.12.2 + + * Fix to handle calc functions however, the expressions are treated as a + LiteralTerm and not fully parsed into the AST. + ## 0.12.1 * Fix to handling of escapes in strings. diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index a715a9ab1..b3a22d675 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2188,6 +2188,8 @@ class _Parser { var nameValue = identifier(); // Snarf up the ident we'll remap, maybe. if (!ieFilter && _maybeEat(TokenKind.LPAREN)) { + var calc = processCalc(nameValue); + if (calc != null) return calc; // FUNCTION return processFunction(nameValue); } @@ -2442,6 +2444,64 @@ class _Parser { } } + // TODO(terry): Hack to gobble up the calc expression as a string looking + // for the matching RPAREN the expression is not parsed into the + // AST. + // + // grammar should be: + // + // = calc( ) + // = [ [ '+' | '-' ] ]* + // = [ '*' | '/' ]* + // = | | | ( ) + // + String processCalcExpression() { + var inString = tokenizer._inString; + tokenizer._inString = false; + + // Gobble up everything until we hit our stop token. + var stringValue = new StringBuffer(); + var left = 1; + var matchingParens = false; + while (_peek() != TokenKind.END_OF_FILE && !matchingParens) { + var token = _peek(); + if (token == TokenKind.LPAREN) + left++; + else if (token == TokenKind.RPAREN) + left--; + + matchingParens = left == 0; + if (!matchingParens) stringValue.write(_next().text); + } + + if (!matchingParens) { + _error("problem parsing function expected ), ", _peekToken.span); + } + + tokenizer._inString = inString; + + return stringValue.toString(); + } + + CalcTerm processCalc(Identifier func) { + var start = _peekToken.span; + + var name = func.name; + if (name == 'calc') { + // TODO(terry): Implement expression parsing properly. + String expression = processCalcExpression(); + var calcExpr = new LiteralTerm(expression, expression, _makeSpan(start)); + + if (!_maybeEat(TokenKind.RPAREN)) { + _error("problem parsing function expected ), ", _peekToken.span); + } + + return new CalcTerm(name, name, calcExpr, _makeSpan(start)); + } + + return null; + } + // Function grammar: // // function: IDENT '(' expr ')' @@ -2466,9 +2526,6 @@ class _Parser { } return new UriTerm(urlParam, _makeSpan(start)); - case 'calc': - // TODO(terry): Implement expression handling... - break; case 'var': // TODO(terry): Consider handling var in IE specific filter/progid. This // will require parsing entire IE specific syntax e.g., diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 125b5aefb..a62ca4775 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -38,6 +38,12 @@ class CssPrinter extends Visitor { // flag for obfuscation. bool get _isTesting => !prettyPrint; + void visitCalcTerm(CalcTerm node) { + emit('${node.text}('); + node.expr.visit(this); + emit(')'); + } + void visitCssComment(CssComment node) { emit('/* ${node.comment} */'); } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 75e962900..ba8370e96 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -44,6 +44,21 @@ class Negation extends TreeNode { String get name => 'not'; } +// calc(...) +// TODO(terry): Hack to handle calc however the expressions should be fully +// parsed and in the AST. +class CalcTerm extends LiteralTerm { + final LiteralTerm expr; + + CalcTerm(var value, String t, this.expr, SourceSpan span) + : super(value, t, span); + + CalcTerm clone() => new CalcTerm(value, text, expr.clone(), span); + visit(VisitorBase visitor) => visitor.visitCalcTerm(this); + + String toString() => "$text($expr)"; +} + // /* .... */ class CssComment extends TreeNode { final String comment; diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 030a868bc..9b0a6c255 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -46,6 +46,13 @@ class _TreePrinter extends Visitor { heading('Directive', node); } + void visitCalcTerm(CalcTerm node) { + heading('CalcTerm', node); + output.depth++; + super.visitCalcTerm(node); + output.depth--; + } + void visitCssComment(CssComment node) { heading('Comment', node); output.depth++; diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 593e43a55..b6babbdf5 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -13,6 +13,7 @@ part 'src/tree_base.dart'; part 'src/tree_printer.dart'; abstract class VisitorBase { + visitCalcTerm(CalcTerm node); visitCssComment(CssComment node); visitCommentDefinition(CommentDefinition node); visitStyleSheet(StyleSheet node); @@ -132,6 +133,11 @@ class Visitor implements VisitorBase { visitDirective(Directive node) {} + visitCalcTerm(CalcTerm node) { + visitLiteralTerm(node); + visitLiteralTerm(node.expr); + } + visitCssComment(CssComment node) {} visitCommentDefinition(CommentDefinition node) {} diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index ab709a919..96f403ea8 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.12.2-dev +version: 0.12.2 author: Polymer.dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 702921d47..de589d7c9 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -1015,12 +1015,50 @@ void testExpressionSpans() { expect(decl.expression.span.text, '50px'); } -void testDeclarationSpanWithCalc() { +void simpleCalc() { final input = r'''.foo { height: calc(100% - 55px); }'''; var stylesheet = parseCss(input); var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; - // This fails, with span being "height: calc(" - expect(decl.span.text, 'height: calc(100% - 55px);'); + expect(decl.span.text, 'height: calc(100% - 55px)'); +} + +void complexCalc() { + final input = r'''.foo { left: calc((100%/3 - 2) * 1em - 2 * 1px); }'''; + var stylesheet = parseCss(input); + var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; + expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)'); +} + +void twoCalcs() { + final input = r'''.foo { margin: calc(1rem - 2px) calc(1rem - 1px); }'''; + var stylesheet = parseCss(input); + var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; + expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)'); +} + +void selectorWithCalcs() { + var errors = []; + final String input = r''' +.foo { + width: calc(1em + 5 * 2em); + height: calc(1px + 2%) !important; + border: 5px calc(1pt + 2cm) 6px calc(1em + 1in + 2px) red; + border: calc(5px + 1em) 0px 1px calc(10 + 20 + 1px); + margin: 25px calc(50px + (100% / (3 - 1em) - 20%)) calc(10px + 10 * 20) calc(100% - 10px); +}'''; + final String generated = r''' +.foo { + width: calc(1em + 5 * 2em); + height: calc(1px + 2%) !important; + border: 5px calc(1pt + 2cm) 6px calc(1em + 1in + 2px) #f00; + border: calc(5px + 1em) 0px 1px calc(10 + 20 + 1px); + margin: 25px calc(50px + (100% / (3 - 1em) - 20%)) calc(10px + 10 * 20) calc(100% - 10px); +}'''; + + var stylesheet = parseCss(input, errors: errors); + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); } main() { @@ -1042,7 +1080,11 @@ main() { test('Expression spans', testExpressionSpans, skip: 'expression spans are broken' ' (https://github.com/dart-lang/csslib/issues/15)'); - test('Declaration span containing calc()', testDeclarationSpanWithCalc, - skip: 'calc() declarations are broken' - ' (https://github.com/dart-lang/csslib/issues/17)'); + group('calc function', () { + test('simple calc', simpleCalc); + test('single complex', complexCalc); + test('two calc terms for same declaration', twoCalcs); + test('selector with many calc declarations', selectorWithCalcs); + }); } + From 62471b7d406a999832af93ff261c4bd3b65e8450 Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Wed, 20 Apr 2016 17:07:17 -0700 Subject: [PATCH 053/245] Fix all strong mode errors and warnings. This is almost all: - Adding type annotations to empty lists that are later filled. Many of these could be simplified by using .map(...).toList() to create the list instead, but I wanted to minimize my changes. - Adding type arguments to some List annotations. I did find one thing that I believe was a bug where a list was being inadvertently flattened. Strong mode caught that. R=terry@google.com Review URL: https://codereview.chromium.org//1832993003 . --- pkgs/csslib/.analysis_options | 2 + pkgs/csslib/CHANGELOG.md | 8 ++ pkgs/csslib/example/call_parser.dart | 5 +- pkgs/csslib/lib/parser.dart | 29 +++--- pkgs/csslib/lib/src/analyzer.dart | 24 ++--- pkgs/csslib/lib/src/polyfill.dart | 2 +- pkgs/csslib/lib/src/property.dart | 2 +- pkgs/csslib/lib/src/tokenizer.dart | 2 +- pkgs/csslib/lib/src/tree.dart | 46 +++++----- pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/big_1_test.dart | 3 +- pkgs/csslib/test/compiler_test.dart | 121 +++++++++++++------------ pkgs/csslib/test/declaration_test.dart | 59 +++++++----- pkgs/csslib/test/error_test.dart | 12 +-- pkgs/csslib/test/extend_test.dart | 3 +- pkgs/csslib/test/mixin_test.dart | 17 ++-- pkgs/csslib/test/nested_test.dart | 3 +- pkgs/csslib/test/selector_test.dart | 5 +- pkgs/csslib/test/var_test.dart | 13 +-- pkgs/csslib/test/visitor_test.dart | 5 +- 20 files changed, 200 insertions(+), 163 deletions(-) create mode 100644 pkgs/csslib/.analysis_options diff --git a/pkgs/csslib/.analysis_options b/pkgs/csslib/.analysis_options new file mode 100644 index 000000000..a10d4c5a0 --- /dev/null +++ b/pkgs/csslib/.analysis_options @@ -0,0 +1,2 @@ +analyzer: + strong-mode: true diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index b4ee9e15f..7133be032 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.13.0 + + * **BREAKING** Fix all [strong mode][] errors and warnings. + This involved adding more precise on some public APIs, which + is why it may break users. + +[strong mode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md + ## 0.12.2 * Fix to handle calc functions however, the expressions are treated as a diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index 7179a170f..3ae588932 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -2,6 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a import 'package:csslib/parser.dart' as css; +import 'package:csslib/src/messages.dart'; import 'package:csslib/visitor.dart'; const _default = const css.PreprocessorOptions( @@ -16,7 +17,7 @@ const _default = const css.PreprocessorOptions( * tests (by default) will ensure that the CSS is really valid. */ StyleSheet parseCss(String cssInput, - {List errors, css.PreprocessorOptions opts}) { + {List errors, css.PreprocessorOptions opts}) { return css.parse(cssInput, errors: errors, options: opts == null ? _default : opts); } @@ -27,7 +28,7 @@ String prettyPrint(StyleSheet ss) => (emitCss..visitTree(ss, pretty: true)).toString(); main() { - var errors = []; + var errors = []; // Parse a simple stylesheet. print('1. Good CSS, parsed CSS emitted:'); diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index b3a22d675..12c9d217b 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -356,7 +356,7 @@ class _Parser { * : IDENT */ List processMediaQueryList() { - var mediaQueries = []; + var mediaQueries = []; bool firstTime = true; var mediaQuery; @@ -409,7 +409,7 @@ class _Parser { if (_peekIdentifier()) type = identifier(); } - var exprs = []; + var exprs = []; if (unaryOp == -1 || unaryOp == TokenKind.MEDIA_OP_AND) { var andOp = false; @@ -775,7 +775,7 @@ class _Parser { var name = identifier(); - List params = []; + var params = []; // Any parameters? if (_maybeEat(TokenKind.LPAREN)) { var mustHaveParam = false; @@ -813,7 +813,7 @@ class _Parser { if (declGroup.declarations.any((decl) { return decl is Declaration && decl is! IncludeMixinAtDeclaration; })) { - var newDecls = []; + var newDecls = []; productions.forEach((include) { // If declGroup has items that are declarations then we assume // this mixin is a declaration mixin not a top-level mixin. @@ -943,7 +943,7 @@ class _Parser { name = identifier(); } - var params = []; + var params = >[]; // Any parameters? Parameters can be multiple terms per argument e.g., // 3px solid yellow, green is two parameters: @@ -951,7 +951,7 @@ class _Parser { // 2. green // the first has 3 terms and the second has 1 term. if (_maybeEat(TokenKind.LPAREN)) { - var terms = []; + var terms = []; var expr; var keepGoing = true; while (keepGoing && (expr = processTerm()) != null) { @@ -1041,8 +1041,8 @@ class _Parser { if (checkBrace) _eat(TokenKind.LBRACE); - List decls = []; - List dartStyles = []; // List of latest styles exposed to Dart. + var decls = []; + var dartStyles = []; // List of latest styles exposed to Dart. do { var selectorGroup = _nestedSelector(); @@ -1093,7 +1093,7 @@ class _Parser { } List processMarginsDeclarations() { - List groups = []; + var groups = []; var start = _peekToken.span; @@ -1487,7 +1487,7 @@ class _Parser { processSelectorExpression() { var start = _peekToken.span; - var expressions = []; + var expressions = []; Token termToken; var value; @@ -2269,7 +2269,8 @@ class _Parser { } var param = expr.expressions[0]; - var varUsage = new VarUsage(param.text, [], _makeSpan(start)); + var varUsage = new VarUsage( + (param as LiteralTerm).text, [], _makeSpan(start)); expr.expressions[0] = varUsage; return expr.expressions; } @@ -2543,11 +2544,11 @@ class _Parser { _error("too many parameters to var()", _peekToken.span); } - var paramName = expr.expressions[0].text; + var paramName = (expr.expressions[0] as LiteralTerm).text; // [0] - var name, [1] - OperatorComma, [2] - default value. - var defaultValues = - expr.expressions.length >= 3 ? expr.expressions.sublist(2) : []; + var defaultValues = expr.expressions.length >= 3 + ? expr.expressions.sublist(2) : []; return new VarUsage(paramName, defaultValues, _makeSpan(start)); default: var expr = processExpr(); diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index fc27ceb09..4d3e3c86f 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -243,7 +243,7 @@ class ExpandNestedSelectors extends Visitor { var selectors = node.selectorGroup.selectors; // Create a merged set of previous parent selectors and current selectors. - var newSelectors = []; + var newSelectors = []; for (Selector selector in selectors) { for (Selector nestedSelector in nestedSelectors) { var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences, @@ -267,7 +267,7 @@ class ExpandNestedSelectors extends Visitor { // the parent selector is pre-pended to the current selector. var hasThis = current.any((s) => s.simpleSelector.isThis); - var newSequence = []; + var newSequence = []; if (!hasThis) { // If no & in the sector group then prefix with the parent selector. @@ -302,7 +302,7 @@ class ExpandNestedSelectors extends Visitor { List sequences) { if (sequences.isEmpty) return sequences; - var newSequences = []; + var newSequences = []; var first = sequences.first; newSequences.add(new SimpleSelectorSequence( first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT)); @@ -592,7 +592,7 @@ class CallMixin extends Visitor { * Given a mixin's defined arguments return a cloned mixin defintion that has * replaced all defined arguments with user's supplied VarUsages. */ - MixinDefinition transform(List callArgs) { + MixinDefinition transform(List> callArgs) { // TODO(terry): Handle default arguments and varArgs. // Transform mixin with callArgs. for (var index = 0; index < _definedArgs.length; index++) { @@ -628,11 +628,11 @@ class CallMixin extends Visitor { } /** Rip apart var def with multiple parameters. */ - List> _varDefsAsCallArgs(var callArg) { - var defArgs = []; + List> _varDefsAsCallArgs(var callArg) { + var defArgs = >[]; if (callArg is List && callArg[0] is VarUsage) { var varDef = varDefs[callArg[0].name]; - var expressions = varDef.expression.expressions; + var expressions = (varDef.expression as Expressions).expressions; assert(expressions.length > 1); for (var expr in expressions) { if (expr is! OperatorComma) { @@ -756,11 +756,11 @@ class DeclarationIncludes extends Visitor { // We're a list of @include(s) inside of a mixin ruleset - convert // to a list of IncludeMixinAtDeclaration(s). var origRulesets = mixinDef.rulesets; - var rulesets = []; + var rulesets = []; if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) { origRulesets.forEach((ruleset) { - rulesets - .add(new IncludeMixinAtDeclaration(ruleset, ruleset.span)); + rulesets.add(new IncludeMixinAtDeclaration( + ruleset as IncludeDirective, ruleset.span)); }); _IncludeReplacer.replace(_styleSheet, node, rulesets); } @@ -841,7 +841,7 @@ class DeclarationIncludes extends Visitor { /** @include as a top-level with ruleset(s). */ class _IncludeReplacer extends Visitor { final _include; - final List _newDeclarations; + final List _newDeclarations; bool _foundAndReplaced = false; /** @@ -849,7 +849,7 @@ class _IncludeReplacer extends Visitor { * with the [newRules]. */ static void replace( - StyleSheet ss, var include, List newDeclarations) { + StyleSheet ss, var include, List newDeclarations) { var visitor = new _IncludeReplacer(include, newDeclarations); visitor.visitStyleSheet(ss); } diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index b18abd162..69f9e6d15 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -170,7 +170,7 @@ class _VarDefAndUsage extends Visitor { } List resolveUsageTerminal(VarUsage usage) { - var result = []; + var result = []; var varDef = _knownVarDefs[usage.name]; var expressions; diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index c2cf776af..b4beaee8d 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -1232,4 +1232,4 @@ class BoxEdge { num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0); } -_mergeVal(x, y) => y != null ? y : x; +/*=T*/ _mergeVal/**/(/*=T*/ x, /*=T*/ y) => y != null ? y : x; diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index d423104ba..bc00fee48 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -260,7 +260,7 @@ class Tokenizer extends TokenizerBase { Token finishIdentifier() { // If we encounter an escape sequence, remember it so we can post-process // to unescape. - var chars = []; + var chars = []; // backup so we can start with the first character int validateFrom = _index; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index ba8370e96..ded846dfc 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -421,7 +421,7 @@ class ImportDirective extends Directive { : super(span); ImportDirective clone() { - var cloneMediaQueries = []; + var cloneMediaQueries = []; for (var mediaQuery in mediaQueries) { cloneMediaQueries.add(mediaQuery.clone()); } @@ -483,7 +483,7 @@ class MediaQuery extends TreeNode { TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); MediaQuery clone() { - var cloneExpressions = []; + var cloneExpressions = []; for (var expr in expressions) { cloneExpressions.add(expr.clone()); } @@ -500,11 +500,11 @@ class MediaDirective extends Directive { : super(span); MediaDirective clone() { - var cloneQueries = []; + var cloneQueries = []; for (var mediaQuery in mediaQueries) { cloneQueries.add(mediaQuery.clone()); } - var cloneRulesets = []; + var cloneRulesets = []; for (var ruleset in rulesets) { cloneRulesets.add(ruleset.clone()); } @@ -520,7 +520,7 @@ class HostDirective extends Directive { HostDirective(this.rulesets, SourceSpan span) : super(span); HostDirective clone() { - var cloneRulesets = []; + var cloneRulesets = []; for (var ruleset in rulesets) { cloneRulesets.add(ruleset.clone()); } @@ -540,7 +540,7 @@ class PageDirective extends Directive { : super(span); PageDirective clone() { - var cloneDeclsMargin = []; + var cloneDeclsMargin = []; for (var declMargin in _declsMargin) { cloneDeclsMargin.add(declMargin.clone()); } @@ -635,7 +635,7 @@ class StyletDirective extends Directive { bool get isExtension => true; StyletDirective clone() { - var cloneRulesets = []; + var cloneRulesets = []; for (var ruleset in rulesets) { cloneRulesets.add(ruleset.clone()); } @@ -675,14 +675,14 @@ class VarDefinitionDirective extends Directive { class MixinDefinition extends Directive { final String name; - final List definedArgs; + final List definedArgs; final bool varArgs; MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span) : super(span); MixinDefinition clone() { - var cloneDefinedArgs = []; + var cloneDefinedArgs = []; for (var definedArg in definedArgs) { cloneDefinedArgs.add(definedArg.clone()); } @@ -694,18 +694,18 @@ class MixinDefinition extends Directive { /** Support a Sass @mixin. See http://sass-lang.com for description. */ class MixinRulesetDirective extends MixinDefinition { - final List rulesets; + final List rulesets; - MixinRulesetDirective(String name, List args, + MixinRulesetDirective(String name, List args, bool varArgs, this.rulesets, SourceSpan span) : super(name, args, varArgs, span); MixinRulesetDirective clone() { - var clonedArgs = []; + var clonedArgs = []; for (var arg in definedArgs) { clonedArgs.add(arg.clone()); } - var clonedRulesets = []; + var clonedRulesets = []; for (var ruleset in rulesets) { clonedRulesets.add(ruleset.clone()); } @@ -719,12 +719,12 @@ class MixinRulesetDirective extends MixinDefinition { class MixinDeclarationDirective extends MixinDefinition { final DeclarationGroup declarations; - MixinDeclarationDirective(String name, List args, + MixinDeclarationDirective(String name, List args, bool varArgs, this.declarations, SourceSpan span) : super(name, args, varArgs, span); MixinDeclarationDirective clone() { - var clonedArgs = []; + var clonedArgs = []; for (var arg in definedArgs) { clonedArgs.add(arg.clone()); } @@ -738,16 +738,14 @@ class MixinDeclarationDirective extends MixinDefinition { /** To support consuming a SASS mixin @include. */ class IncludeDirective extends Directive { final String name; - final List> args; + final List> args; IncludeDirective(this.name, this.args, SourceSpan span) : super(span); IncludeDirective clone() { - var cloneArgs = []; + var cloneArgs = >[]; for (var arg in args) { - for (var term in arg) { - cloneArgs.add(term.clone()); - } + cloneArgs.add(arg.map((term) => term.clone()).toList()); } return new IncludeDirective(name, cloneArgs, span); } @@ -852,7 +850,7 @@ class ExtendDeclaration extends Declaration { class DeclarationGroup extends TreeNode { /** Can be either Declaration or RuleSet (if nested selector). */ - final List declarations; + final List declarations; DeclarationGroup(this.declarations, SourceSpan span) : super(span); @@ -867,10 +865,10 @@ class DeclarationGroup extends TreeNode { class MarginGroup extends DeclarationGroup { final int margin_sym; // TokenType for for @margin sym. - MarginGroup(this.margin_sym, List decls, SourceSpan span) + MarginGroup(this.margin_sym, List decls, SourceSpan span) : super(decls, span); MarginGroup clone() => - new MarginGroup(margin_sym, super.clone() as dynamic, span); + new MarginGroup(margin_sym, super.clone().declarations, span); visit(VisitorBase visitor) => visitor.visitMarginGroup(this); } @@ -881,7 +879,7 @@ class VarUsage extends Expression { VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span); VarUsage clone() { - var clonedValues = []; + var clonedValues = []; for (var expr in defaultValues) { clonedValues.add(expr.clone()); } diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 96f403ea8..8a9507e03 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.12.2 +version: 0.13.0-dev author: Polymer.dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart index f92ea82ec..9a6a584c0 100644 --- a/pkgs/csslib/test/big_1_test.dart +++ b/pkgs/csslib/test/big_1_test.dart @@ -4,11 +4,12 @@ library big_1_test; +import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; import 'testing.dart'; compilePolyfillAndValidate(String input, String generated) { - var errors = []; + var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index df5a44aaa..5faabe27f 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -7,11 +7,12 @@ library compiler_test; import 'dart:convert'; import 'package:test/test.dart'; import 'package:csslib/parser.dart'; +import 'package:csslib/src/messages.dart'; import 'package:csslib/visitor.dart'; import 'testing.dart'; void testClass() { - var errors = []; + var errors = []; var input = ".foobar {}"; var stylesheet = parseCss(input, errors: errors); @@ -24,7 +25,7 @@ void testClass() { expect(stylesheet.topLevels[0] is RuleSet, true); - var ruleset = stylesheet.topLevels[0]; + var ruleset = stylesheet.topLevels[0] as RuleSet; expect(ruleset.selectorGroup.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); @@ -37,7 +38,7 @@ void testClass() { } void testClass2() { - var errors = []; + var errors = []; var input = ".foobar .bar .no-story {}"; var stylesheet = parseCss(input, errors: errors); @@ -49,7 +50,7 @@ void testClass2() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - var ruleset = stylesheet.topLevels[0]; + var ruleset = stylesheet.topLevels[0] as RuleSet; expect(ruleset.selectorGroup.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); @@ -73,7 +74,7 @@ void testClass2() { } void testId() { - var errors = []; + var errors = []; var input = "#elemId {}"; var stylesheet = parseCss(input, errors: errors); @@ -85,7 +86,7 @@ void testId() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - var ruleset = stylesheet.topLevels[0]; + var ruleset = stylesheet.topLevels[0] as RuleSet; expect(ruleset.selectorGroup.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); @@ -99,7 +100,7 @@ void testId() { } void testElement() { - var errors = []; + var errors = []; var input = "div {}"; var stylesheet = parseCss(input, errors: errors); @@ -111,7 +112,7 @@ void testElement() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - var ruleset = stylesheet.topLevels[0]; + var ruleset = stylesheet.topLevels[0] as RuleSet; expect(ruleset.selectorGroup.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); @@ -160,7 +161,7 @@ void testElement() { } void testNamespace() { - var errors = []; + var errors = []; var input = "ns1|div {}"; var stylesheet = parseCss(input, errors: errors); @@ -172,15 +173,15 @@ void testNamespace() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - var ruleset = stylesheet.topLevels[0]; + var ruleset = stylesheet.topLevels[0] as RuleSet; expect(ruleset.selectorGroup.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 1); - var simpSelector = simpleSeqs[0].simpleSelector; - expect(simpSelector is NamespaceSelector, true); + expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true); + var simpSelector = simpleSeqs[0].simpleSelector as NamespaceSelector; expect(simpleSeqs[0].isCombinatorNone, true); expect(simpSelector.isNamespaceWildcard, false); expect(simpSelector.namespace, "ns1"); @@ -191,7 +192,7 @@ void testNamespace() { } void testNamespace2() { - var errors = []; + var errors = []; var input = "ns1|div div ns2|span .foobar {}"; var stylesheet = parseCss(input, errors: errors); @@ -203,7 +204,7 @@ void testNamespace2() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - var ruleset = stylesheet.topLevels[0]; + var ruleset = stylesheet.topLevels[0] as RuleSet; expect(ruleset.selectorGroup.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); @@ -211,8 +212,8 @@ void testNamespace2() { expect(simpleSeqs.length, 4); - var simpSelector0 = simpleSeqs[0].simpleSelector; - expect(simpSelector0 is NamespaceSelector, true); + expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true); + var simpSelector0 = simpleSeqs[0].simpleSelector as NamespaceSelector; expect(simpleSeqs[0].isCombinatorNone, true); expect(simpSelector0.namespace, "ns1"); var elementSelector0 = simpSelector0.nameAsSimpleSelector; @@ -225,8 +226,8 @@ void testNamespace2() { expect(simpleSeqs[1].isCombinatorDescendant, true); expect(simpSelector1.name, "div"); - var simpSelector2 = simpleSeqs[2].simpleSelector; - expect(simpSelector2 is NamespaceSelector, true); + expect(simpleSeqs[2].simpleSelector is NamespaceSelector, true); + var simpSelector2 = simpleSeqs[2].simpleSelector as NamespaceSelector; expect(simpleSeqs[2].isCombinatorDescendant, true); expect(simpSelector2.namespace, "ns2"); var elementSelector2 = simpSelector2.nameAsSimpleSelector; @@ -241,7 +242,7 @@ void testNamespace2() { } void testSelectorGroups() { - var errors = []; + var errors = []; var input = "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}"; var stylesheet = parseCss(input, errors: errors); @@ -254,7 +255,7 @@ void testSelectorGroups() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - var ruleset = stylesheet.topLevels[0]; + var ruleset = stylesheet.topLevels[0] as RuleSet; expect(ruleset.selectorGroup.selectors.length, 5); expect(ruleset.declarationGroup.declarations.length, 0); @@ -301,8 +302,8 @@ void testSelectorGroups() { expect(groupSelector4.simpleSelectorSequences.length, 4); var selector40 = groupSelector4.simpleSelectorSequences[0]; - var simpleSelector40 = selector40.simpleSelector; - expect(simpleSelector40 is NamespaceSelector, true); + expect(selector40.simpleSelector is NamespaceSelector, true); + var simpleSelector40 = selector40.simpleSelector as NamespaceSelector; expect(selector40.isCombinatorNone, true); expect(simpleSelector40.namespace, "ns1"); var elementSelector = simpleSelector40.nameAsSimpleSelector; @@ -329,7 +330,7 @@ void testSelectorGroups() { } void testCombinator() { - var errors = []; + var errors = []; var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}"; var stylesheet = parseCss(input, errors: errors); @@ -341,7 +342,7 @@ void testCombinator() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - var ruleset = stylesheet.topLevels[0]; + var ruleset = stylesheet.topLevels[0] as RuleSet; expect(ruleset.selectorGroup.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); @@ -368,8 +369,8 @@ void testCombinator() { expect(simpleSelector2.name, "no-story"); var selector3 = simpleSeqs[3]; - var simpleSelector3 = selector3.simpleSelector; - expect(simpleSelector3 is NamespaceSelector, true); + expect(selector3.simpleSelector is NamespaceSelector, true); + var simpleSelector3 = selector3.simpleSelector as NamespaceSelector; expect(selector3.isCombinatorTilde, true); expect(simpleSelector3.namespace, "myNs"); var elementSelector = simpleSelector3.nameAsSimpleSelector; @@ -385,7 +386,7 @@ void testCombinator() { } void testWildcard() { - var errors = []; + var errors = []; var input = "* {}"; var stylesheet = parseCss(input, errors: errors); @@ -397,7 +398,7 @@ void testWildcard() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - var ruleset = stylesheet.topLevels[0]; + var ruleset = stylesheet.topLevels[0] as RuleSet; expect(ruleset.selectorGroup.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); @@ -429,12 +430,14 @@ void testWildcard() { expect(simpleSeqs.length, 2); - var selector0 = simpleSeqs[0]; - var simpleSelector0 = selector0.simpleSelector; - expect(simpleSelector0 is ElementSelector, true); - expect(selector0.isCombinatorNone, true); - expect(simpleSelector0.isWildcard, true); - expect(simpleSelector0.name, "*"); + { + var selector0 = simpleSeqs[0]; + var simpleSelector0 = selector0.simpleSelector; + expect(simpleSelector0 is ElementSelector, true); + expect(selector0.isCombinatorNone, true); + expect(simpleSelector0.isWildcard, true); + expect(simpleSelector0.name, "*"); + } var selector1 = simpleSeqs[1]; var simpleSelector1 = selector1.simpleSelector; @@ -461,15 +464,17 @@ void testWildcard() { expect(simpleSeqs.length, 2); - selector0 = simpleSeqs[0]; - simpleSelector0 = selector0.simpleSelector; - expect(simpleSelector0 is NamespaceSelector, true); - expect(selector0.isCombinatorNone, true); - expect(simpleSelector0.isNamespaceWildcard, false); - var elementSelector = simpleSelector0.nameAsSimpleSelector; - expect("myNs", simpleSelector0.namespace); - expect(elementSelector.isWildcard, true); - expect("*", elementSelector.name); + { + var selector0 = simpleSeqs[0]; + expect(selector0.simpleSelector is NamespaceSelector, true); + var simpleSelector0 = selector0.simpleSelector as NamespaceSelector; + expect(selector0.isCombinatorNone, true); + expect(simpleSelector0.isNamespaceWildcard, false); + var elementSelector = simpleSelector0.nameAsSimpleSelector; + expect("myNs", simpleSelector0.namespace); + expect(elementSelector.isWildcard, true); + expect("*", elementSelector.name); + } selector1 = simpleSeqs[1]; simpleSelector1 = selector1.simpleSelector; @@ -494,15 +499,17 @@ void testWildcard() { expect(simpleSeqs.length, 2); - selector0 = simpleSeqs[0]; - simpleSelector0 = selector0.simpleSelector; - expect(simpleSelector0 is NamespaceSelector, true); - expect(selector0.isCombinatorNone, true); - expect(simpleSelector0.isNamespaceWildcard, true); - expect("*", simpleSelector0.namespace); - elementSelector = simpleSelector0.nameAsSimpleSelector; - expect(elementSelector.isWildcard, true); - expect("*", elementSelector.name); + { + var selector0 = simpleSeqs[0]; + expect(selector0.simpleSelector is NamespaceSelector, true); + var simpleSelector0 = selector0.simpleSelector as NamespaceSelector; + expect(selector0.isCombinatorNone, true); + expect(simpleSelector0.isNamespaceWildcard, true); + expect("*", simpleSelector0.namespace); + var elementSelector = simpleSelector0.nameAsSimpleSelector; + expect(elementSelector.isWildcard, true); + expect("*", elementSelector.name); + } selector1 = simpleSeqs[1]; simpleSelector1 = selector1.simpleSelector; @@ -513,7 +520,7 @@ void testWildcard() { /** Test List as input to parser. */ void testArrayOfChars() { - var errors = []; + var errors = []; var input = '[]; final input = r''' html:lang(fr-ca) { quotes: '" ' ' "' } @@ -643,7 +650,7 @@ void testNegation() { } void testHost() { - var errors = []; + var errors = []; var input = '@host { ' ':scope {' 'white-space: nowrap;' @@ -678,7 +685,7 @@ void testHost() { } void testStringEscape() { - var errors = []; + var errors = []; var input = r'''a { foo: '{"text" : "a\\\""}' }'''; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); @@ -692,7 +699,7 @@ a { // TODO(terry): Move to emitter_test.dart when real emitter exist. void testEmitter() { - var errors = []; + var errors = []; var input = '.foo { ' 'color: red; left: 20px; top: 20px; width: 100px; height:200px' '}' diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index de589d7c9..a55352296 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -4,12 +4,14 @@ library declaration_test; +import 'package:csslib/src/messages.dart'; +import 'package:csslib/visitor.dart'; import 'package:test/test.dart'; import 'testing.dart'; void testSimpleTerms() { - var errors = []; + var errors = []; final String input = r''' @ import url("test.css"); .foo { @@ -64,7 +66,7 @@ void testSimpleTerms() { * no quotes. Hex values with # and letters, and functions (rgba, url, etc.) */ void testDeclarations() { - var errors = []; + var errors = []; final String input = r''' .more { color: white; @@ -102,7 +104,7 @@ void testDeclarations() { } void testIdentifiers() { - var errors = []; + var errors = []; final String input = r''' #da { height: 100px; @@ -129,7 +131,7 @@ void testIdentifiers() { } void testComposites() { - var errors = []; + var errors = []; final String input = r''' .xyzzy { border: 10px 80px 90px 100px; @@ -158,7 +160,7 @@ void testComposites() { } void testUnits() { - var errors = []; + var errors = []; final String input = r''' #id-1 { transition: color 0.4s; @@ -242,7 +244,7 @@ void testUnits() { } void testUnicode() { - var errors = []; + var errors = []; final String input = r''' .toggle:after { content: '✔'; @@ -270,7 +272,7 @@ void testUnicode() { } void testNewerCss() { - var errors = []; + var errors = []; final String input = r''' @media screen,print { .foobar_screen { @@ -317,7 +319,7 @@ void testNewerCss() { } void testMediaQueries() { - var errors = []; + var errors = []; String input = ''' @media screen and (-webkit-min-device-pixel-ratio:0) { .todo-item .toggle { @@ -435,7 +437,7 @@ void testMediaQueries() { } void testFontFace() { - var errors = []; + var errors = []; final String input = ''' @font-face { @@ -527,7 +529,7 @@ src: url(ideal-sans-serif.woff) format("woff"), } void testCssFile() { - var errors = []; + var errors = []; final String input = r''' @import 'simple.css' @import "test.css" print @@ -591,7 +593,7 @@ div[href^='test'] { } void testCompactEmitter() { - var errors = []; + var errors = []; // Check !import compactly emitted. final String input = r''' @@ -619,7 +621,7 @@ div { } void testNotSelectors() { - var errors = []; + var errors = []; final String input = r''' .details:not(.open-details) x-element, @@ -709,7 +711,7 @@ html|*:not(:link):not(:visited) { } void testIE() { - var errors = []; + var errors = []; final String input = ".test {\n" " filter: progid:DXImageTransform.Microsoft.gradient" "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" @@ -785,7 +787,7 @@ div { * background: red\9; */ void testIEDeclaration() { - var errors = []; + var errors = []; final input = ''' .testIE-6 { @@ -951,7 +953,7 @@ input.search-query { } void testHangs() { - var errors = []; + var errors = []; // Bad hexvalue had caused a hang in processTerm. final input = r'''#a { color: #ebebeburl(0/IE8+9+); }'''; @@ -1008,36 +1010,48 @@ void testHangs() { void testExpressionSpans() { final input = r'''.foo { width: 50px; }'''; var stylesheet = parseCss(input); - var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; + var decl = (stylesheet.topLevels.single as RuleSet) + .declarationGroup + .declarations + .single; // This passes expect(decl.span.text, 'width: 50px'); // This currently fails - expect(decl.expression.span.text, '50px'); + expect((decl as Declaration).expression.span.text, '50px'); } void simpleCalc() { final input = r'''.foo { height: calc(100% - 55px); }'''; var stylesheet = parseCss(input); - var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; + var decl = (stylesheet.topLevels.single as RuleSet) + .declarationGroup + .declarations + .single; expect(decl.span.text, 'height: calc(100% - 55px)'); } void complexCalc() { final input = r'''.foo { left: calc((100%/3 - 2) * 1em - 2 * 1px); }'''; var stylesheet = parseCss(input); - var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; + var decl = (stylesheet.topLevels.single as RuleSet) + .declarationGroup + .declarations + .single; expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)'); } void twoCalcs() { final input = r'''.foo { margin: calc(1rem - 2px) calc(1rem - 1px); }'''; var stylesheet = parseCss(input); - var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; + var decl = (stylesheet.topLevels.single as RuleSet) + .declarationGroup + .declarations + .single; expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)'); } void selectorWithCalcs() { - var errors = []; + var errors = []; final String input = r''' .foo { width: calc(1em + 5 * 2em); @@ -1079,7 +1093,7 @@ main() { test('Hanging bugs', testHangs); test('Expression spans', testExpressionSpans, skip: 'expression spans are broken' - ' (https://github.com/dart-lang/csslib/issues/15)'); + ' (https://github.com/dart-lang/csslib/issues/15)'); group('calc function', () { test('simple calc', simpleCalc); test('single complex', complexCalc); @@ -1087,4 +1101,3 @@ main() { test('selector with many calc declarations', selectorWithCalcs); }); } - diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index fc9ecf650..9815b1b7c 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -13,7 +13,7 @@ import 'testing.dart'; * Test for unsupported font-weights values of bolder, lighter and inherit. */ void testUnsupportedFontWeights() { - var errors = []; + var errors = []; // TODO(terry): Need to support bolder. // font-weight value bolder. @@ -70,7 +70,7 @@ error on line 1, column 24: Unknown property value inherit * inherit. */ void testUnsupportedLineHeights() { - var errors = []; + var errors = []; // line-height value in percentge unit. var input = ".foobar { line-height: 120%; }"; @@ -122,7 +122,7 @@ error on line 1, column 24: Unknown property value inherit /** Test for bad selectors. */ void testBadSelectors() { - var errors = []; + var errors = []; // Invalid id selector. var input = "# foo { color: #ff00ff; }"; @@ -157,7 +157,7 @@ error on line 1, column 1: Not a valid class selector expected .className /** Test for bad hex values. */ void testBadHexValues() { - var errors = []; + var errors = []; // Invalid hex value. var input = ".foobar { color: #AH787; }"; @@ -227,7 +227,7 @@ error on line 1, column 18: Expected hex number } void testBadUnicode() { - var errors = []; + var errors = []; final String input = ''' @font-face { src: url(fonts/BBCBengali.ttf) format("opentype"); @@ -259,7 +259,7 @@ void testBadUnicode() { } void testBadNesting() { - var errors = []; + var errors = []; // Test for bad declaration in a nested rule. final String input = ''' diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index 49c8a9c46..afec062ce 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -4,12 +4,13 @@ library extend_test; +import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; import 'testing.dart'; compileAndValidate(String input, String generated) { - var errors = []; + var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index c94c9c018..71dcc50b6 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -4,12 +4,13 @@ library mixin_test; +import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; import 'testing.dart'; compileAndValidate(String input, String generated) { - var errors = []; + var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -17,7 +18,7 @@ compileAndValidate(String input, String generated) { } compilePolyfillAndValidate(String input, String generated) { - var errors = []; + var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -413,7 +414,7 @@ void mixinManyArgs() { } void badDeclarationInclude() { - final errors = []; + final errors = []; final input = r''' @mixin a { #foo-id { @@ -441,7 +442,7 @@ void badDeclarationInclude() { } void badTopInclude() { - final errors = []; + final errors = []; final input = r''' @mixin b { color: red; @@ -467,7 +468,7 @@ void badTopInclude() { } void emptyMixin() { - final errors = []; + final errors = []; final input = r''' @mixin a { } @@ -492,7 +493,7 @@ div { } void undefinedTopLevel() { - final errors = []; + final errors = []; final input = r''' @mixin a { @include b; @@ -520,7 +521,7 @@ void undefinedTopLevel() { } void undefinedDeclaration() { - final errors = []; + final errors = []; final input = r''' @mixin a { @include b; @@ -578,7 +579,7 @@ foo { color: #f00; }'''); - var errors = []; + var errors = []; var input = r''' @mixin a { foo { color: red } diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index 1848ef13b..a5cadaba0 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -4,12 +4,13 @@ library nested_test; +import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; import 'testing.dart'; compileAndValidate(String input, String generated) { - var errors = []; + var errors = []; var stylesheet = compileCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index aefab164d..6249d3117 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -5,12 +5,13 @@ library selector_test; import 'package:csslib/parser.dart'; +import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; import 'testing.dart'; void testSelectorSuccesses() { - var errors = []; + var errors = []; var selectorAst = selector('#div .foo', errors: errors); expect(errors.isEmpty, true, reason: errors.toString()); expect('#div .foo', compactOuptut(selectorAst)); @@ -50,7 +51,7 @@ void testSelectorSuccesses() { // TODO(terry): Move this failure case to a failure_test.dart when the analyzer // and validator exit then they'll be a bunch more checks. void testSelectorFailures() { - var errors = []; + var errors = []; // Test for invalid class name (can't start with number). selector('.foobar .1a-story .xyzzy', errors: errors); diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index d47fd785e..c75de562b 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -4,12 +4,13 @@ library var_test; +import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; import 'testing.dart'; compileAndValidate(String input, String generated) { - var errors = []; + var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -17,7 +18,7 @@ compileAndValidate(String input, String generated) { } compilePolyfillAndValidate(String input, String generated) { - var errors = []; + var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); @@ -340,7 +341,7 @@ div { } void undefinedVars() { - final errors = []; + final errors = []; final input = ''':root { var-color-background: red; var-color-foreground: blue; @@ -622,7 +623,7 @@ parserVar() { } testVar() { - final errors = []; + final errors = []; final input = ''' @color-background: red; @color-foreground: blue; @@ -676,7 +677,7 @@ var-color-foreground: #00f; } testLess() { - final errors = []; + final errors = []; final input = ''' @color-background: red; @color-foreground: blue; @@ -772,7 +773,7 @@ void testIndirects() { } void includes() { - var errors = []; + var errors = []; var file1Input = r''' :root { var-redef: #0f0; diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index 803b10614..02784c404 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -4,6 +4,7 @@ library visitor_test; +import 'package:csslib/src/messages.dart'; import 'package:csslib/visitor.dart'; import 'package:test/test.dart'; @@ -33,7 +34,7 @@ class ClassVisitor extends Visitor { } void testClassVisitors() { - var errors = []; + var errors = []; var in1 = '.foobar { }'; var s = parseCss(in1, errors: errors); @@ -84,7 +85,7 @@ String polyfillPrint(String prefix, StyleSheet ss) => (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString(); void testPolyFill() { - var errors = []; + var errors = []; final input = r''' .foobar { } div.xyzzy { } From 470e9bb8b18b231728c7e676de3398b0dde2bb41 Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Thu, 21 Apr 2016 09:29:14 -0700 Subject: [PATCH 054/245] Bump version to publish 0.13.0. R=terry@google.com Review URL: https://codereview.chromium.org//1912463002 . --- pkgs/csslib/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 8a9507e03..06690f57d 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,6 +1,6 @@ name: csslib -version: 0.13.0-dev -author: Polymer.dart Team +version: 0.13.0 +author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib environment: From 073ca568631d534d752a6b4a0f765ddf770beb6a Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Thu, 21 Apr 2016 11:18:48 -0700 Subject: [PATCH 055/245] Fix two checked mode bugs introduced by 0.13.0. Covariant generics :( R=terry@google.com Review URL: https://codereview.chromium.org//1899133010 . --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/lib/parser.dart | 2 +- pkgs/csslib/lib/src/tree.dart | 2 +- pkgs/csslib/pubspec.yaml | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 7133be032..6eaa03c8e 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.13.1 + +* Fix two checked mode bugs introduced in 0.13.0. + ## 0.13.0 * **BREAKING** Fix all [strong mode][] errors and warnings. diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 12c9d217b..3a48929a4 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -775,7 +775,7 @@ class _Parser { var name = identifier(); - var params = []; + var params = []; // Any parameters? if (_maybeEat(TokenKind.LPAREN)) { var mustHaveParam = false; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index ded846dfc..c18790344 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -696,7 +696,7 @@ class MixinDefinition extends Directive { class MixinRulesetDirective extends MixinDefinition { final List rulesets; - MixinRulesetDirective(String name, List args, + MixinRulesetDirective(String name, List args, bool varArgs, this.rulesets, SourceSpan span) : super(name, args, varArgs, span); diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 06690f57d..10cb940f7 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.0 +version: 0.13.1 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 939bbf249ea76698cfd5f74f8f7207e81b6b4f77 Mon Sep 17 00:00:00 2001 From: Sigmund Cherem Date: Wed, 11 May 2016 16:07:54 -0700 Subject: [PATCH 056/245] Make TreeNode.visit return dynamic. Subclasses of TreeNode already do `visit(visitor) => visitor.visitSomething(this)`, this just exposes it at the root of the tree hierarchy. This is needed for package:html, where we have code that would do the equivalent of `x = node.visit(myVisitor)`. R=rnystrom@google.com Review URL: https://codereview.chromium.org//1969953002 . --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/lib/src/tree_base.dart | 2 +- pkgs/csslib/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 6eaa03c8e..c2f409ab7 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.13.2 + +* Relax type of TreeNode.visit, to allow returning values from visitors. + ## 0.13.1 * Fix two checked mode bugs introduced in 0.13.0. diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 095b4932f..51207e136 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -16,7 +16,7 @@ abstract class TreeNode { TreeNode clone(); /** Classic double-dispatch visitor for implementing passes. */ - void visit(VisitorBase visitor); + visit(VisitorBase visitor); /** A multiline string showing the node and its children. */ String toDebugString() { diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 10cb940f7..c6f4d4f13 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.1 +version: 0.13.2 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From f3880bc0d2aeb70f00c8d38491b844a425cb5554 Mon Sep 17 00:00:00 2001 From: Jacob MacDonald Date: Mon, 17 Oct 2016 12:23:43 -0700 Subject: [PATCH 057/245] fix new strong mode error --- pkgs/csslib/lib/css.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index 590e8351c..65d386dd4 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -39,7 +39,7 @@ void _compile(String inputPath, bool verbose) { var file = new SourceFile(contents, url: path.toUri(inputPath)); // Parse the CSS. - var tree = _time( + StyleSheet tree = _time( 'Parse $filename', () => new Parser(file, contents).parse(), verbose); _time('Analyzer $filename', () => new Analyzer([tree], messages), verbose) From 83a2b349b1f1bde8c5f6f3626bc00a619ae4922a Mon Sep 17 00:00:00 2001 From: Jacob MacDonald Date: Mon, 17 Oct 2016 12:24:20 -0700 Subject: [PATCH 058/245] update pubspec/changelog for 0.13.2+1 --- pkgs/csslib/CHANGELOG.md | 6 +++++- pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index c2f409ab7..15e2911a3 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.13.2+1 + +* Fix new strong mode error. + ## 0.13.2 * Relax type of TreeNode.visit, to allow returning values from visitors. @@ -11,7 +15,7 @@ * **BREAKING** Fix all [strong mode][] errors and warnings. This involved adding more precise on some public APIs, which is why it may break users. - + [strong mode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md ## 0.12.2 diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index c6f4d4f13..3b13c661d 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.2 +version: 0.13.2+1 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 87771b057d7a88184c40a3d3ac0540e9504d6681 Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Thu, 17 Nov 2016 10:29:22 -0800 Subject: [PATCH 059/245] Fix warnings. Some dead code, missing returns, and an unused private field. --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/lib/parser.dart | 22 ++++++++-------------- pkgs/csslib/lib/src/tokenizer.dart | 1 - pkgs/csslib/pubspec.yaml | 2 +- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 15e2911a3..8567408a8 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.13.2+2 + +* Fix static warnings. + ## 0.13.2+1 * Fix new strong mode error. diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 3a48929a4..d1a5af113 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -158,8 +158,9 @@ class Parser { final _Parser _parser; // TODO(jmesserly): having file and text is redundant. + // TODO(rnystrom): baseUrl isn't used. Remove from API. Parser(SourceFile file, String text, {int start: 0, String baseUrl}) - : _parser = new _Parser(file, text, start: start, baseUrl: baseUrl); + : _parser = new _Parser(file, text, start: start); StyleSheet parse() => _parser.parse(); } @@ -168,9 +169,6 @@ class Parser { class _Parser { final Tokenizer tokenizer; - /** Base url of CSS file. */ - final String _baseUrl; - /** * File containing the source being parsed, used to report errors with * source-span locations. @@ -180,9 +178,8 @@ class _Parser { Token _previousToken; Token _peekToken; - _Parser(SourceFile file, String text, {int start: 0, String baseUrl}) + _Parser(SourceFile file, String text, {int start: 0}) : this.file = file, - _baseUrl = baseUrl, tokenizer = new Tokenizer(file, text, true, start) { _peekToken = tokenizer.next(); } @@ -1203,7 +1200,7 @@ class _Parser { var start = _peekToken.span; while (true) { // First item is never descendant make sure it's COMBINATOR_NONE. - var selectorItem = simpleSelectorSequence(simpleSequences.length == 0); + var selectorItem = simpleSelectorSequence(simpleSequences.isEmpty); if (selectorItem != null) { simpleSequences.add(selectorItem); } else { @@ -1211,9 +1208,9 @@ class _Parser { } } - if (simpleSequences.length > 0) { - return new Selector(simpleSequences, _makeSpan(start)); - } + if (simpleSequences.isEmpty) return null; + + return new Selector(simpleSequences, _makeSpan(start)); } simpleSelectorSequence(bool forceCombinatorNone) { @@ -2509,7 +2506,6 @@ class _Parser { // processFunction(Identifier func) { var start = _peekToken.span; - var name = func.name; switch (name) { @@ -2517,7 +2513,7 @@ class _Parser { // URI term sucks up everything inside of quotes(' or ") or between parens var urlParam = processQuotedString(true); - // TODO(terry): Better error messge and checking for mismatched quotes. + // TODO(terry): Better error message and checking for mismatched quotes. if (_peek() == TokenKind.END_OF_FILE) { _error("problem parsing URI", _peekToken.span); } @@ -2558,8 +2554,6 @@ class _Parser { return new FunctionTerm(name, name, expr, _makeSpan(start)); } - - return null; } Identifier identifier() { diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index bc00fee48..a972590d7 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -414,7 +414,6 @@ class Tokenizer extends TokenizerBase { } } } - return _errorToken(); } } diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 3b13c661d..422849e8e 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.2+1 +version: 0.13.2+2 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 41ff10fef3b2a32b5433268963328e8ce6664f2d Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 20 Jan 2017 10:48:43 -0800 Subject: [PATCH 060/245] Format Dart files with dartfmt dartfmt: https://github.com/dart-lang/dart_style --- pkgs/csslib/example/call_parser.dart | 9 +- pkgs/csslib/lib/css.dart | 4 +- pkgs/csslib/lib/parser.dart | 25 +++-- pkgs/csslib/lib/src/analyzer.dart | 5 +- pkgs/csslib/lib/src/messages.dart | 4 +- pkgs/csslib/lib/src/options.dart | 14 ++- pkgs/csslib/lib/src/polyfill.dart | 9 +- pkgs/csslib/lib/src/property.dart | 44 ++++++--- pkgs/csslib/lib/src/tokenizer.dart | 4 +- pkgs/csslib/lib/src/tokenizer_base.dart | 3 +- pkgs/csslib/lib/src/tree.dart | 48 ++++++---- pkgs/csslib/lib/src/tree_base.dart | 15 ++- pkgs/csslib/lib/visitor.dart | 3 +- pkgs/csslib/test/compiler_test.dart | 20 +++- pkgs/csslib/test/error_test.dart | 102 ++++++++++++++------ pkgs/csslib/test/extend_test.dart | 61 ++++++++---- pkgs/csslib/test/mixin_test.dart | 119 +++++++++++++++++------- pkgs/csslib/test/selector_test.dart | 3 +- pkgs/csslib/test/testing.dart | 22 +++-- pkgs/csslib/test/var_test.dart | 83 +++++++++++------ pkgs/csslib/test/visitor_test.dart | 4 +- 21 files changed, 405 insertions(+), 196 deletions(-) diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index 3ae588932..c77cf03e2 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -41,7 +41,8 @@ main() { '}' '#div {' 'color : #00F578; border-color: #878787;' - '}', errors: errors); + '}', + errors: errors); if (!errors.isEmpty) { print("Got ${errors.length} errors.\n"); @@ -55,9 +56,11 @@ main() { // Parse a stylesheet with errors print('2. Catch severe syntax errors:'); print(' ==========================='); - var stylesheetError = parseCss('.foo #%^&*asdf{ ' + var stylesheetError = parseCss( + '.foo #%^&*asdf{ ' 'color: red; left: 20px; top: 20px; width: 100px; height:200px' - '}', errors: errors); + '}', + errors: errors); if (!errors.isEmpty) { print("Got ${errors.length} errors.\n"); diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index 65d386dd4..a6539cfbb 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -76,8 +76,6 @@ void _printMessage(String message, int duration) { buf.write(' -- '); if (duration < 10) buf.write(' '); if (duration < 100) buf.write(' '); - buf - ..write(duration) - ..write(' ms'); + buf..write(duration)..write(' ms'); print(buf.toString()); } diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index d1a5af113..66e5abce6 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -47,8 +47,12 @@ bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. /** Parse and analyze the CSS file. */ -StyleSheet compile(input, {List errors, PreprocessorOptions options, - bool nested: true, bool polyfill: false, List includes: null}) { +StyleSheet compile(input, + {List errors, + PreprocessorOptions options, + bool nested: true, + bool polyfill: false, + List includes: null}) { if (includes == null) { includes = []; } @@ -115,9 +119,10 @@ SelectorGroup parseSelectorGroup(input, {List errors}) { var file = new SourceFile(source); return (new _Parser(file, source) - // TODO(jmesserly): this fix should be applied to the parser. It's tricky - // because by the time the flag is set one token has already been fetched. - ..tokenizer.inSelector = true).processSelectorGroup(); + // TODO(jmesserly): this fix should be applied to the parser. It's tricky + // because by the time the flag is set one token has already been fetched. + ..tokenizer.inSelector = true) + .processSelectorGroup(); } String _inputAsString(input) { @@ -2266,8 +2271,8 @@ class _Parser { } var param = expr.expressions[0]; - var varUsage = new VarUsage( - (param as LiteralTerm).text, [], _makeSpan(start)); + var varUsage = + new VarUsage((param as LiteralTerm).text, [], _makeSpan(start)); expr.expressions[0] = varUsage; return expr.expressions; } @@ -2465,8 +2470,7 @@ class _Parser { var token = _peek(); if (token == TokenKind.LPAREN) left++; - else if (token == TokenKind.RPAREN) - left--; + else if (token == TokenKind.RPAREN) left--; matchingParens = left == 0; if (!matchingParens) stringValue.write(_next().text); @@ -2544,7 +2548,8 @@ class _Parser { // [0] - var name, [1] - OperatorComma, [2] - default value. var defaultValues = expr.expressions.length >= 3 - ? expr.expressions.sublist(2) : []; + ? expr.expressions.sublist(2) + : []; return new VarUsage(paramName, defaultValues, _makeSpan(start)); default: var expr = processExpr(); diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 4d3e3c86f..7c7372cf2 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -262,7 +262,6 @@ class ExpandNestedSelectors extends Visitor { List _mergeNestedSelector( List parent, List current) { - // If any & operator then the parent selector will be substituted otherwise // the parent selector is pre-pended to the current selector. var hasThis = current.any((s) => s.simpleSelector.isThis); @@ -746,8 +745,8 @@ class DeclarationIncludes extends Visitor { if (!_allIncludes(mixinDef.rulesets) && currDeclGroup != null) { var index = _findInclude(currDeclGroup.declarations, node); if (index != -1) { - currDeclGroup.declarations.replaceRange( - index, index + 1, [new NoOp()]); + currDeclGroup.declarations + .replaceRange(index, index + 1, [new NoOp()]); } _messages.warning( "Using top-level mixin ${node.include.name} as a declaration", diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 595bf6c58..420c24350 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -55,9 +55,7 @@ class Message { bool colors = useColors && _ERROR_COLORS.containsKey(level); var levelColor = colors ? _ERROR_COLORS[level] : null; if (colors) output.write(levelColor); - output - ..write(_ERROR_LABEL[level]) - ..write(' '); + output..write(_ERROR_LABEL[level])..write(' '); if (colors) output.write(NO_COLOR); if (span == null) { diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/options.dart index 95e8a2fab..c80370b45 100644 --- a/pkgs/csslib/lib/src/options.dart +++ b/pkgs/csslib/lib/src/options.dart @@ -40,10 +40,16 @@ class PreprocessorOptions { /** File to process by the compiler. */ final String inputFile; - const PreprocessorOptions({this.verbose: false, this.checked: false, - this.lessSupport: true, this.warningsAsErrors: false, - this.throwOnErrors: false, this.throwOnWarnings: false, - this.useColors: true, this.polyfill: false, this.inputFile}); + const PreprocessorOptions( + {this.verbose: false, + this.checked: false, + this.lessSupport: true, + this.warningsAsErrors: false, + this.throwOnErrors: false, + this.throwOnWarnings: false, + this.useColors: true, + this.polyfill: false, + this.inputFile}); PreprocessorOptions.fromArgs(ArgResults args) : warningsAsErrors = args['warnings_as_errors'], diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index 69f9e6d15..9bdcbe232 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -40,14 +40,17 @@ class PolyFill { void processVarDefinitions(List includes) { for (var include in includes) { _allVarDefinitions = (new _VarDefinitionsIncludes(_allVarDefinitions) - ..visitTree(include)).varDefs; + ..visitTree(include)) + .varDefs; } } void processVars(StyleSheet styleSheet) { // Build list of all var definitions. - var mainStyleSheetVarDefs = (new _VarDefAndUsage( - this._messages, _allVarDefinitions)..visitTree(styleSheet)).varDefs; + var mainStyleSheetVarDefs = + (new _VarDefAndUsage(this._messages, _allVarDefinitions) + ..visitTree(styleSheet)) + .varDefs; // Resolve all definitions to a non-VarUsage (terminal expression). mainStyleSheetVarDefs.forEach((key, value) { diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index b4beaee8d..2cc39faaa 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -79,9 +79,11 @@ class Color implements _StyleProperty, ColorBase { * components. */ Color.createRgba(int red, int green, int blue, [num alpha]) - : this._argb = Color.convertToHexString(Color._clamp(red, 0, 255), - Color._clamp(green, 0, 255), Color._clamp(blue, 0, 255), - alpha != null ? Color._clamp(alpha, 0, 1) : alpha); + : this._argb = Color.convertToHexString( + Color._clamp(red, 0, 255), + Color._clamp(green, 0, 255), + Color._clamp(blue, 0, 255), + alpha != null ? Color._clamp(alpha, 0, 1) : alpha); /** * Creates a new color from a CSS color string. For more information, see @@ -105,10 +107,12 @@ class Color implements _StyleProperty, ColorBase { */ Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent, [num alpha]) - : this._argb = new Hsla(Color._clamp(hueDegree, 0, 360) / 360, - Color._clamp(saturationPercent, 0, 100) / 100, - Color._clamp(lightnessPercent, 0, 100) / 100, - alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString(); + : this._argb = new Hsla( + Color._clamp(hueDegree, 0, 360) / 360, + Color._clamp(saturationPercent, 0, 100) / 100, + Color._clamp(lightnessPercent, 0, 100) / 100, + alpha != null ? Color._clamp(alpha, 0, 1) : alpha) + .toHexArgbString(); /** * The hslaRaw takes three values. The [hue] degree on the color wheel; '0' @@ -126,9 +130,12 @@ class Color implements _StyleProperty, ColorBase { * opaque foreground. */ Color.hslaRaw(num hue, num saturation, num lightness, [num alpha]) - : this._argb = new Hsla(Color._clamp(hue, 0, 1), - Color._clamp(saturation, 0, 1), Color._clamp(lightness, 0, 1), - alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString(); + : this._argb = new Hsla( + Color._clamp(hue, 0, 1), + Color._clamp(saturation, 0, 1), + Color._clamp(lightness, 0, 1), + alpha != null ? Color._clamp(alpha, 0, 1) : alpha) + .toHexArgbString(); /** * Generate a real constant for pre-defined colors (no leading #). @@ -529,9 +536,13 @@ class Rgba implements _StyleProperty, ColorBase { factory Rgba.fromColor(Color color) => color.rgba; factory Rgba.fromArgbValue(num value) { - return new Rgba(((value.toInt() & 0xff000000) >> 0x18), /* a */ - ((value.toInt() & 0xff0000) >> 0x10), /* r */ - ((value.toInt() & 0xff00) >> 8), /* g */ + return new Rgba( + ((value.toInt() & 0xff000000) >> 0x18), + /* a */ + ((value.toInt() & 0xff0000) >> 0x10), + /* r */ + ((value.toInt() & 0xff00) >> 8), + /* g */ ((value.toInt() & 0xff))); /* b */ } @@ -1029,7 +1040,12 @@ class Font implements _StyleProperty { * [FontVariant], and [lineHeight] extra space (leading) around the font in * pixels, if not specified it's 1.2 the font size. */ - const Font({this.size, this.family, this.weight, this.style, this.variant, + const Font( + {this.size, + this.family, + this.weight, + this.style, + this.variant, this.lineHeight}); /** diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index a972590d7..063ac3459 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -445,7 +445,9 @@ class TokenizerHelpers { // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier // http://www.w3.org/TR/CSS21/syndata.html#characters // Also, escaped character should be allowed. - c == 95 /*_*/ || c >= 0xA0 || c == 92 /*\*/); + c == 95 /*_*/ || + c >= 0xA0 || + c == 92 /*\*/); } /** Pseudo function expressions identifiers can't have a minus sign. */ diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index 663c987d1..ccdd7be71 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -55,8 +55,7 @@ abstract class TokenizerBase { int _index = 0; int _startIndex = 0; - TokenizerBase(this._file, this._text, this._inString, - [this._index = 0]); + TokenizerBase(this._file, this._text, this._inString, [this._index = 0]); Token next(); int getIdentifierKind(); diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index c18790344..a6a64fc32 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -489,6 +489,7 @@ class MediaQuery extends TreeNode { } return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); } + visit(VisitorBase visitor) => visitor.visitMediaQuery(this); } @@ -599,6 +600,7 @@ class KeyFrameDirective extends Directive { } return new KeyFrameDirective(_keyframeName, cloneBlocks, span); } + visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); } @@ -696,8 +698,8 @@ class MixinDefinition extends Directive { class MixinRulesetDirective extends MixinDefinition { final List rulesets; - MixinRulesetDirective(String name, List args, - bool varArgs, this.rulesets, SourceSpan span) + MixinRulesetDirective(String name, List args, bool varArgs, + this.rulesets, SourceSpan span) : super(name, args, varArgs, span); MixinRulesetDirective clone() { @@ -719,8 +721,8 @@ class MixinRulesetDirective extends MixinDefinition { class MixinDeclarationDirective extends MixinDefinition { final DeclarationGroup declarations; - MixinDeclarationDirective(String name, List args, - bool varArgs, this.declarations, SourceSpan span) + MixinDeclarationDirective(String name, List args, bool varArgs, + this.declarations, SourceSpan span) : super(name, args, varArgs, span); MixinDeclarationDirective clone() { @@ -788,9 +790,9 @@ class Declaration extends TreeNode { bool get hasDartStyle => dartStyle != null; - Declaration clone() => new Declaration( - _property.clone(), _expression.clone(), dartStyle, span, - important: important); + Declaration clone() => + new Declaration(_property.clone(), _expression.clone(), dartStyle, span, + important: important); visit(VisitorBase visitor) => visitor.visitDeclaration(this); } @@ -1163,6 +1165,7 @@ class Expressions extends Expression { } return clonedExprs; } + visit(VisitorBase visitor) => visitor.visitExpressions(this); } @@ -1229,15 +1232,20 @@ class FontExpression extends DartStyleExpression { // font-style font-variant font-weight font-size/line-height font-family // TODO(terry): Only px/pt for now need to handle all possible units to // support calc expressions on units. - FontExpression(SourceSpan span, {dynamic size, List family, - int weight, String style, String variant, LineHeight lineHeight}) + FontExpression(SourceSpan span, + {dynamic size, + List family, + int weight, + String style, + String variant, + LineHeight lineHeight}) : font = new Font( - size: size is LengthTerm ? size.value : size, - family: family, - weight: weight, - style: style, - variant: variant, - lineHeight: lineHeight), + size: size is LengthTerm ? size.value : size, + family: family, + weight: weight, + style: style, + variant: variant, + lineHeight: lineHeight), super(DartStyleExpression.fontStyle, span); FontExpression merged(DartStyleExpression newFontExpr) { @@ -1295,7 +1303,7 @@ class MarginExpression extends BoxExpression { /** Margin expression ripped apart. */ MarginExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.marginStyle, span, - new BoxEdge(left, top, right, bottom)); + new BoxEdge(left, top, right, bottom)); MarginExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.marginStyle, span, box); @@ -1331,7 +1339,7 @@ class BorderExpression extends BoxExpression { /** Border expression ripped apart. */ BorderExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.borderStyle, span, - new BoxEdge(left, top, right, bottom)); + new BoxEdge(left, top, right, bottom)); BorderExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.borderStyle, span, box); @@ -1356,7 +1364,7 @@ class BorderExpression extends BoxExpression { BorderExpression._merge( BorderExpression x, BorderExpression y, SourceSpan span) : super(DartStyleExpression.borderStyle, span, - new BoxEdge.merge(x.box, y.box)); + new BoxEdge.merge(x.box, y.box)); BorderExpression clone() => new BorderExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); @@ -1408,7 +1416,7 @@ class PaddingExpression extends BoxExpression { /** Padding expression ripped apart. */ PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.paddingStyle, span, - new BoxEdge(left, top, right, bottom)); + new BoxEdge(left, top, right, bottom)); PaddingExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.paddingStyle, span, box); @@ -1433,7 +1441,7 @@ class PaddingExpression extends BoxExpression { PaddingExpression._merge( PaddingExpression x, PaddingExpression y, SourceSpan span) : super(DartStyleExpression.paddingStyle, span, - new BoxEdge.merge(x.box, y.box)); + new BoxEdge.merge(x.box, y.box)); PaddingExpression clone() => new PaddingExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 51207e136..3ead0bf08 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -59,16 +59,21 @@ class TreeOutput { } String toValue(value) { - if (value == null) return 'null'; - else if (value is Identifier) return value.name; - else return value.toString(); + if (value == null) + return 'null'; + else if (value is Identifier) + return value.name; + else + return value.toString(); } void writeNode(String label, TreeNode node) { write('${label}: '); depth += 1; - if (node != null) node.visit(printer); - else writeln('null'); + if (node != null) + node.visit(printer); + else + writeln('null'); depth -= 1; } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index b6babbdf5..11234935a 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -302,8 +302,7 @@ class Visitor implements VisitorBase { visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) => visitSimpleSelector(node); - visitNegationSelector(NegationSelector node) => - visitSimpleSelector(node); + visitNegationSelector(NegationSelector node) => visitSimpleSelector(node); visitSelectorExpression(SelectorExpression node) { _visitNodeList(node.expressions); diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index 5faabe27f..e64af7faa 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -533,7 +533,9 @@ void testArrayOfChars() { expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foo { color: #f00; left: 20px; @@ -595,7 +597,9 @@ div:nth-child(2n) { color : red; } expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' html:lang(fr-ca) { quotes: '" ' ' "'; } @@ -665,7 +669,9 @@ void testHost() { expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' @host { :scope { white-space: nowrap; @@ -691,7 +697,9 @@ void testStringEscape() { expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' a { foo: '{"text" : "a\\\""}'; }'''); @@ -713,7 +721,9 @@ void testEmitter() { walkTree(stylesheet); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foo { color: #f00; left: 20px; diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 9815b1b7c..1060d8355 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -21,13 +21,17 @@ void testUnsupportedFontWeights() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 24: Unknown property value bolder .foobar { font-weight: bolder; } ^^^^^^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { font-weight: bolder; }'''); @@ -38,12 +42,16 @@ error on line 1, column 24: Unknown property value bolder stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 24: Unknown property value lighter .foobar { font-weight: lighter; } ^^^^^^^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { font-weight: lighter; }'''); @@ -54,12 +62,16 @@ error on line 1, column 24: Unknown property value lighter stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 24: Unknown property value inherit .foobar { font-weight: inherit; } ^^^^^^^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { font-weight: inherit; }'''); @@ -77,12 +89,16 @@ void testUnsupportedLineHeights() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 24: Unexpected value for line-height .foobar { line-height: 120%; } ^^^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { line-height: 120%; }'''); @@ -93,12 +109,16 @@ error on line 1, column 24: Unexpected value for line-height stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 24: Unexpected unit for line-height .foobar { line-height: 20cm; } ^^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { line-height: 20cm; }'''); @@ -109,12 +129,16 @@ error on line 1, column 24: Unexpected unit for line-height stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 24: Unknown property value inherit .foobar { line-height: inherit; } ^^^^^^^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { line-height: inherit; }'''); @@ -129,12 +153,16 @@ void testBadSelectors() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 1: Not a valid ID selector expected #id # foo { color: #ff00ff; } ^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' # foo { color: #f0f; }'''); @@ -144,12 +172,16 @@ error on line 1, column 1: Not a valid ID selector expected #id stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 1: Not a valid class selector expected .className . foo { color: #ff00ff; } ^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' . foo { color: #f0f; }'''); @@ -164,12 +196,16 @@ void testBadHexValues() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 18: Bad hex number .foobar { color: #AH787; } ^^^^^^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { color: #AH787; }'''); @@ -179,13 +215,17 @@ error on line 1, column 18: Bad hex number stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 18: Unknown property value redder .foobar { color: redder; } ^^^^^^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { color: redder; }'''); @@ -195,13 +235,17 @@ error on line 1, column 18: Unknown property value redder stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 18: Expected hex number .foobar { color: # ffffff; } ^'''); expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { color: # ffffff; }'''); @@ -211,7 +255,9 @@ error on line 1, column 18: Expected hex number stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect( + errors[0].toString(), + r''' error on line 1, column 18: Expected hex number .foobar { color: # 123fff; } ^'''); @@ -220,7 +266,9 @@ error on line 1, column 18: Expected hex number // Formating is off with an extra space. However, the entire value is bad // and isn't processed anyway. - expect(prettyPrint(stylesheet), r''' + expect( + prettyPrint(stylesheet), + r''' .foobar { color: # 123 fff; }'''); @@ -237,7 +285,8 @@ void testBadUnicode() { parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), + expect( + errors[0].toString(), 'error on line 3, column 20: unicode first range can not be greater than ' 'last\n' ' unicode-range: U+400-200;\n' @@ -252,7 +301,8 @@ void testBadUnicode() { parseCss(input2, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), + expect( + errors[0].toString(), 'error on line 3, column 20: unicode range must be less than 10FFFF\n' ' unicode-range: U+12FFFF;\n' ' ^^^^^^'); diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index afec062ce..184a8b467 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -18,7 +18,8 @@ compileAndValidate(String input, String generated) { } void simpleExtend() { - compileAndValidate(r''' + compileAndValidate( + r''' .error { border: 1px red; background-color: #fdd; @@ -27,7 +28,9 @@ void simpleExtend() { @extend .error; border-width: 3px; } -''', r'''.error, .seriousError { +''', + r''' +.error, .seriousError { border: 1px #f00; background-color: #fdd; } @@ -37,7 +40,8 @@ void simpleExtend() { } void complexSelectors() { - compileAndValidate(r''' + compileAndValidate( + r''' .error { border: 1px #f00; background-color: #fdd; @@ -49,7 +53,9 @@ void complexSelectors() { @extend .error; border-width: 3px; } -''', r'''.error, .seriousError { +''', + r''' +.error, .seriousError { border: 1px #f00; background-color: #fdd; } @@ -60,14 +66,17 @@ void complexSelectors() { border-width: 3px; }'''); - compileAndValidate(r''' + compileAndValidate( + r''' a:hover { text-decoration: underline; } .hoverlink { @extend a:hover; } -''', r'''a:hover, .hoverlink { +''', + r''' +a:hover, .hoverlink { text-decoration: underline; } .hoverlink { @@ -75,7 +84,8 @@ a:hover { } void multipleExtends() { - compileAndValidate(r''' + compileAndValidate( + r''' .error { border: 1px #f00; background-color: #fdd; @@ -89,7 +99,9 @@ void multipleExtends() { @extend .attention; border-width: 3px; } -''', r'''.error, .seriousError { +''', + r''' +.error, .seriousError { border: 1px #f00; background-color: #fdd; } @@ -103,7 +115,8 @@ void multipleExtends() { } void chaining() { - compileAndValidate(r''' + compileAndValidate( + r''' .error { border: 1px #f00; background-color: #fdd; @@ -120,7 +133,9 @@ void chaining() { left: 10%; right: 10%; } -''', r'''.error, .seriousError, .criticalError { +''', + r''' +.error, .seriousError, .criticalError { border: 1px #f00; background-color: #fdd; } @@ -137,7 +152,8 @@ void chaining() { } void nestedSelectors() { - compileAndValidate(r''' + compileAndValidate( + r''' a { color: blue; &:hover { @@ -148,7 +164,9 @@ a { #fake-links .link { @extend a; } -''', r'''a, #fake-links .link { +''', + r''' +a, #fake-links .link { color: #00f; } a:hover, #fake-links .link:hover { @@ -159,7 +177,8 @@ a:hover, #fake-links .link:hover { } void nestedMulty() { - compileAndValidate(r''' + compileAndValidate( + r''' .btn { display: inline-block; } @@ -171,7 +190,9 @@ input[type="checkbox"].toggle-button { @extend .btn; } } -''', r'''.btn, input[type="checkbox"].toggle-button label { +''', + r''' +.btn, input[type="checkbox"].toggle-button label { display: inline-block; } input[type="checkbox"].toggle-button { @@ -182,14 +203,16 @@ input[type="checkbox"].toggle-button label { } void nWayExtends() { - compileAndValidate(r''' + compileAndValidate( + r''' .btn > .btn { margin-left: 5px; } input.second + label { @extend .btn; } -''', '.btn > .btn, ' +''', + '.btn > .btn, ' 'input.second + label > .btn, ' '.btn > input.second + label, ' 'input.second + label > input.second + label, ' @@ -206,7 +229,8 @@ input.second + label { // input.second + label { // color: blue; // } - compileAndValidate(r''' + compileAndValidate( + r''' .btn + .btn { margin-left: 5px; } @@ -214,7 +238,8 @@ input.second + label { @extend .btn; color: blue; } -''', '.btn + .btn, ' +''', + '.btn + .btn, ' 'input.second + label + .btn, ' '.btn + input.second + label, ' 'input.second + label + input.second + label, ' diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 71dcc50b6..375054cef 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -26,7 +26,8 @@ compilePolyfillAndValidate(String input, String generated) { } void topLevelMixin() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin silly-links { a { color: blue; @@ -35,14 +36,17 @@ void topLevelMixin() { } @include silly-links; -''', r'''a { +''', + r''' +a { color: #00f; background-color: #f00; }'''); } void topLevelMixinTwoIncludes() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin a { a { color: blue; @@ -57,7 +61,9 @@ void topLevelMixinTwoIncludes() { } @include a; @include b; -''', r'''a { +''', + r''' +a { color: #00f; background-color: #f00; } @@ -69,7 +75,8 @@ span { /** Tests top-level mixins that includes another mixin. */ void topLevelMixinMultiRulesets() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin a { a { color: blue; @@ -91,7 +98,9 @@ void topLevelMixinMultiRulesets() { } @include a; @include c; -''', r'''a { +''', + r''' +a { color: #00f; background-color: #f00; } @@ -106,7 +115,8 @@ span { } void topLevelMixinDeeplyNestedRulesets() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin a { a { color: blue; @@ -146,7 +156,9 @@ void topLevelMixinDeeplyNestedRulesets() { @include d; } @include c; -''', r'''a { +''', + r''' +a { color: #00f; background-color: #f00; } @@ -171,7 +183,8 @@ a:hover { /** Tests selector groups and other combinators. */ void topLevelMixinSelectors() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin a { a, b { color: blue; @@ -184,7 +197,9 @@ void topLevelMixinSelectors() { } @include a; -''', r'''a, b { +''', + r''' +a, b { color: #00f; background-color: #f00; } @@ -195,20 +210,24 @@ div > span { } void declSimpleMixin() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin div-border { border: 2px dashed red; } div { @include div-border; } -''', r'''div { +''', + r''' +div { border: 2px dashed #f00; }'''); } void declMixinTwoIncludes() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin div-border { border: 2px dashed red; } @@ -219,14 +238,17 @@ div { @include div-border; @include div-color; } -''', r'''div { +''', + r''' +div { border: 2px dashed #f00; color: #00f; }'''); } void declMixinNestedIncludes() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin div-border { border: 2px dashed red; } @@ -245,7 +267,9 @@ div { @include div-border; @include div-color; } -''', r'''div { +''', + r''' +div { border: 2px dashed #f00; padding: .5em; color: #00f; @@ -254,7 +278,8 @@ div { } void declMixinDeeperNestedIncludes() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin div-border { border: 2px dashed red; } @@ -272,7 +297,9 @@ div { @include div-border; @include div-color; } -''', r'''div { +''', + r''' +div { border: 2px dashed #f00; padding: .5em; margin: 5px; @@ -280,7 +307,8 @@ div { } void mixinArg() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin div-border-1 { border: 2px dashed red; } @@ -309,7 +337,9 @@ div-3 { div-4 { @include div-border-2; } -''', r'''div-1 { +''', + r''' +div-1 { margin-left: 10px; margin-right: 100px; border: 2px dashed #f00; @@ -328,7 +358,8 @@ div-4 { } void mixinArgs() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin box-shadow(@shadows...) { -moz-box-shadow: @shadows; -webkit-box-shadow: @shadows; @@ -337,7 +368,8 @@ void mixinArgs() { .shadows { @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999); -}''', r''' +}''', + r''' .shadowed { -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; @@ -347,7 +379,8 @@ void mixinArgs() { } void mixinManyArgs() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin border(@border-values) { border: @border-values } @@ -355,12 +388,14 @@ void mixinManyArgs() { .primary { @include border(3px solid green); } -''', r''' +''', + r''' .primary { border: 3px solid #008000; }'''); - compileAndValidate(r''' + compileAndValidate( + r''' @mixin setup(@border-color, @border-style, @border-size, @color) { border: @border-size @border-style @border-color; color: @color; @@ -369,14 +404,16 @@ void mixinManyArgs() { .primary { @include setup(red, solid, 5px, blue); } -''', r''' +''', + r''' .primary { border: 5px solid #f00; color: #00f; }'''); // Test passing a declaration that is multiple parameters. - compileAndValidate(r''' + compileAndValidate( + r''' @mixin colors(@text, @background, @border) { color: @text; background-color: @background; @@ -387,7 +424,9 @@ void mixinManyArgs() { .primary { @include colors(@values); } -''', r'''var-values: #f00, #0f0, #00f; +''', + r''' +var-values: #f00, #0f0, #00f; .primary { color: #f00; @@ -395,7 +434,8 @@ void mixinManyArgs() { border-color: #00f; }'''); - compilePolyfillAndValidate(r''' + compilePolyfillAndValidate( + r''' @mixin colors(@text, @background, @border) { color: @text; background-color: @background; @@ -406,7 +446,9 @@ void mixinManyArgs() { .primary { @include colors(@values); } -''', r'''.primary { +''', + r''' +.primary { color: #f00; background-color: #0f0; border-color: #00f; @@ -481,7 +523,8 @@ div { } '''; - var generated = r'''div { + var generated = r''' +div { border: 2px dashed #f00; }'''; @@ -547,7 +590,8 @@ div { } void includeGrammar() { - compileAndValidate(r''' + compileAndValidate( + r''' @mixin a { foo { color: red } } @@ -558,14 +602,17 @@ void includeGrammar() { } @include b; -''', r'''foo { +''', + r''' +foo { color: #f00; } foo { color: #f00; }'''); - compileAndValidate(r''' + compileAndValidate( + r''' @mixin a { color: red } @@ -574,7 +621,9 @@ foo { @include a; @include a } -''', r'''foo { +''', + r''' +foo { color: #f00; color: #f00; }'''); diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index 6249d3117..dff44154f 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -56,7 +56,8 @@ void testSelectorFailures() { // Test for invalid class name (can't start with number). selector('.foobar .1a-story .xyzzy', errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), + expect( + errors[0].toString(), 'error on line 1, column 9: name must start with a alpha character, but ' 'found a number\n' '.foobar .1a-story .xyzzy\n' diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index de2aab190..68075767f 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -30,24 +30,26 @@ const options = const PreprocessorOptions( * tests (by default) will ensure that the CSS is really valid. */ StyleSheet parseCss(String cssInput, - {List errors, PreprocessorOptions opts}) => parse(cssInput, + {List errors, PreprocessorOptions opts}) => + parse(cssInput, errors: errors, - options: opts == null - ? simpleOptionsWithCheckedAndWarningsAsErrors - : opts); + options: + opts == null ? simpleOptionsWithCheckedAndWarningsAsErrors : opts); /** * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, * CSS will allow any property/value pairs regardless of validity; all of our * tests (by default) will ensure that the CSS is really valid. */ -StyleSheet compileCss(String cssInput, {List errors, - PreprocessorOptions opts, bool polyfill: false, - List includes: null}) => compile(cssInput, +StyleSheet compileCss(String cssInput, + {List errors, + PreprocessorOptions opts, + bool polyfill: false, + List includes: null}) => + compile(cssInput, errors: errors, - options: opts == null - ? simpleOptionsWithCheckedAndWarningsAsErrors - : opts, + options: + opts == null ? simpleOptionsWithCheckedAndWarningsAsErrors : opts, polyfill: polyfill, includes: includes); diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index c75de562b..3c53169b1 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -26,7 +26,8 @@ compilePolyfillAndValidate(String input, String generated) { } void simpleVar() { - final input = ''':root { + final input = ''' +:root { var-color-background: red; var-color-foreground: blue; @@ -40,7 +41,8 @@ void simpleVar() { } '''; - final generated = ''':root { + final generated = ''' +:root { var-color-background: #f00; var-color-foreground: #00f; var-c: #0f0; @@ -52,7 +54,8 @@ void simpleVar() { background: var(color-background); }'''; - final generatedPolyfill = ''':root { + final generatedPolyfill = ''' +:root { } .testIt { color: #00f; @@ -64,7 +67,8 @@ void simpleVar() { } void expressionsVar() { - final input = ''':root { + final input = ''' +:root { var-color-background: red; var-color-foreground: blue; @@ -129,7 +133,8 @@ void expressionsVar() { } '''; - final generated = ''':root { + final generated = ''' +:root { var-color-background: #f00; var-color-foreground: #00f; var-c: #0f0; @@ -186,7 +191,8 @@ void expressionsVar() { compileAndValidate(input, generated); - var generatedPolyfill = r''':root { + var generatedPolyfill = r''' +:root { } .testIt { color: #00f; @@ -272,7 +278,8 @@ div { } '''; - final generated = ''':root { + final generated = ''' +:root { var-color-background: #f00; var-color-foreground: #00f; var-a: var(b, #0a0); @@ -310,7 +317,8 @@ div { compileAndValidate(input, generated); - var generatedPolyfill = r''':root { + var generatedPolyfill = r''' +:root { } .test { background-color: #ffa500; @@ -342,7 +350,8 @@ div { void undefinedVars() { final errors = []; - final input = ''':root { + final input = ''' +:root { var-color-background: red; var-color-foreground: blue; @@ -375,7 +384,8 @@ void undefinedVars() { } '''; - final generatedPolyfill = ''':root { + final generatedPolyfill = ''' +:root { } .testIt { color: #00f; @@ -413,7 +423,8 @@ void undefinedVars() { ' ^^^^^^', ]; - var generated = r''':root { + var generated = r''' +:root { var-color-background: #f00; var-color-foreground: #00f; var-a: var(b); @@ -451,7 +462,8 @@ void undefinedVars() { expect(errors.length, errorStrings.length, reason: errors.toString()); testBitMap = 0; - outer: for (var error in errors) { + outer: + for (var error in errors) { var errorString = error.toString(); for (int i = 0; i < errorStrings.length; i++) { if (errorString == errorStrings[i]) { @@ -466,7 +478,8 @@ void undefinedVars() { } parserVar() { - final input = ''':root { + final input = ''' +:root { var-color-background: red; var-color-foreground: blue; @@ -531,7 +544,8 @@ parserVar() { } '''; - final generated = ''':root { + final generated = ''' +:root { var-color-background: #f00; var-color-foreground: #00f; var-c: #0f0; @@ -588,7 +602,8 @@ parserVar() { compileAndValidate(input, generated); - var generatedPolyfill = r''':root { + var generatedPolyfill = r''' +:root { } .testIt { color: #00f; @@ -659,7 +674,8 @@ var-color-foreground: #00f; color: @color-foreground; } '''; - final generated2 = '''var-color-background: #f00; + final generated2 = ''' +var-color-background: #f00; var-color-foreground: #00f; .test { @@ -687,7 +703,8 @@ testLess() { color: var(color-foreground); } '''; - final generated = '''var-color-background: #f00; + final generated = ''' +var-color-background: #f00; var-color-foreground: #00f; .test { @@ -712,7 +729,8 @@ var-color-foreground: #00f; color: @color-foreground; } '''; - final generated2 = '''var-color-background: #f00; + final generated2 = ''' +var-color-background: #f00; var-color-foreground: #00f; .test { @@ -730,20 +748,24 @@ var-color-foreground: #00f; } void polyfill() { - compilePolyfillAndValidate(r''' + compilePolyfillAndValidate( + r''' @color-background: red; @color-foreground: blue; .test { background-color: @color-background; color: @color-foreground; -}''', r'''.test { +}''', + r''' +.test { background-color: #f00; color: #00f; }'''); } void testIndirects() { - compilePolyfillAndValidate(''' + compilePolyfillAndValidate( + ''' :root { var-redef: #0f0; @@ -760,7 +782,9 @@ void testIndirects() { } .test-1 { color: @redef; -}''', r''':root { +}''', + r''' +:root { } .test { background-color: #fff; @@ -817,7 +841,8 @@ void includes() { } '''; - var generated1 = r''':root { + var generated1 = r''' +:root { var-redef: #0f0; var-a1: #fff; var-a2: var(a1); @@ -838,7 +863,8 @@ void includes() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet1), generated1); - var generated2 = r''':root { + var generated2 = r''' +:root { var-redef: #0b0; var-b3: var(a3); } @@ -854,7 +880,8 @@ void includes() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet2), generated2); - var generatedPolyfill1 = r''':root { + var generatedPolyfill1 = r''' +:root { } .test-1 { background-color: #fff; @@ -870,7 +897,8 @@ void includes() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(styleSheet1Polyfill), generatedPolyfill1); - var generatedPolyfill2 = r''':root { + var generatedPolyfill2 = r''' +:root { } .test-2 { color: #fff; @@ -889,7 +917,8 @@ void includes() { // Make sure includes didn't change. expect(prettyPrint(stylesheet1), generated1); - var generatedPolyfill = r''':root { + var generatedPolyfill = r''' +:root { } .test-main { color: #fff; diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index 02784c404..16071c7d0 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -60,7 +60,9 @@ void testClassVisitors() { ..visitTree(s); expect(clsVisits.matches, true); - expect(prettyPrint(s), r''' + expect( + prettyPrint(s), + r''' .foobar1 { } .xyzzy .foo #my-div { From 2cd493f900c94a7c3321f5e6e655899b348ab6d0 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 20 Jan 2017 12:33:49 -0800 Subject: [PATCH 061/245] Moves comments to appropriate lines --- pkgs/csslib/lib/src/property.dart | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 2cc39faaa..a2cf97ca1 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -537,13 +537,10 @@ class Rgba implements _StyleProperty, ColorBase { factory Rgba.fromArgbValue(num value) { return new Rgba( - ((value.toInt() & 0xff000000) >> 0x18), - /* a */ - ((value.toInt() & 0xff0000) >> 0x10), - /* r */ - ((value.toInt() & 0xff00) >> 8), - /* g */ - ((value.toInt() & 0xff))); /* b */ + ((value.toInt() & 0xff000000) >> 0x18), // a + ((value.toInt() & 0xff0000) >> 0x10), // r + ((value.toInt() & 0xff00) >> 8), // g + ((value.toInt() & 0xff))); // b } factory Rgba.fromHsla(Hsla hsla) { From 19f462e36a59b56e9b4fc2ba58f210af106ed54c Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 20 Jan 2017 14:25:46 -0800 Subject: [PATCH 062/245] Adds support for identifier IE filters Supports parsing identifier IE filters such as FlipH. --- pkgs/csslib/lib/parser.dart | 9 ++++++++- pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/declaration_test.dart | 11 +++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 66e5abce6..7dfe18415 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2425,8 +2425,15 @@ class _Parser { * then parse to the right paren ignoring everything in between. */ processIEFilter(FileSpan startAfterProgidColon) { - var parens = 0; + // Support non-functional filters (i.e. filter: FlipH) + var kind = _peek(); + if (kind == TokenKind.SEMICOLON || kind == TokenKind.RBRACE) { + var tok = tokenizer.makeIEFilter( + startAfterProgidColon.start.offset, _peekToken.start); + return new LiteralTerm(tok.text, tok.text, tok.span); + } + var parens = 0; while (_peek() != TokenKind.END_OF_FILE) { switch (_peek()) { case TokenKind.LPAREN: diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 422849e8e..f1cac20c9 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.2+2 +version: 0.13.3 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index a55352296..c92d68a16 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -774,6 +774,17 @@ div { expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated3); + + final input4 = ''' +div { + filter: FlipH; +}'''; + + stylesheet = parseCss(input4, errors: errors..clear(), opts: simpleOptions); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), input4); } /** From 5db05554d886cf862228fcc6c6523db41ee945b4 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Mon, 23 Jan 2017 14:15:24 -0800 Subject: [PATCH 063/245] Exports `Message` from parser.dart. The parser API depended on `Message` which made it necessary to import src/messages.dart to use parser.dart. --- pkgs/csslib/example/call_parser.dart | 5 ++--- pkgs/csslib/lib/css.dart | 3 +-- pkgs/csslib/lib/parser.dart | 3 ++- pkgs/csslib/pubspec.yaml | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index c77cf03e2..9a993ea6f 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -2,7 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a import 'package:csslib/parser.dart' as css; -import 'package:csslib/src/messages.dart'; import 'package:csslib/visitor.dart'; const _default = const css.PreprocessorOptions( @@ -17,7 +16,7 @@ const _default = const css.PreprocessorOptions( * tests (by default) will ensure that the CSS is really valid. */ StyleSheet parseCss(String cssInput, - {List errors, css.PreprocessorOptions opts}) { + {List errors, css.PreprocessorOptions opts}) { return css.parse(cssInput, errors: errors, options: opts == null ? _default : opts); } @@ -28,7 +27,7 @@ String prettyPrint(StyleSheet ss) => (emitCss..visitTree(ss, pretty: true)).toString(); main() { - var errors = []; + var errors = []; // Parse a simple stylesheet. print('1. Good CSS, parsed CSS emitted:'); diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index a6539cfbb..c41735478 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -10,9 +10,8 @@ import 'package:path/path.dart' as path; import 'package:source_span/source_span.dart'; import 'parser.dart'; +import 'src/messages.dart' show Messages; import 'visitor.dart'; -import 'src/messages.dart'; -import 'src/options.dart'; void main(List arguments) { // TODO(jmesserly): fix this to return a proper exit code diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 66e5abce6..a268c5513 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -8,10 +8,11 @@ import 'dart:math' as math; import 'package:source_span/source_span.dart'; -import "visitor.dart"; +import 'visitor.dart'; import 'src/messages.dart'; import 'src/options.dart'; +export 'src/messages.dart' show Message; export 'src/options.dart'; part 'src/analyzer.dart'; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 422849e8e..f1cac20c9 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.2+2 +version: 0.13.3 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From e78d8ccd1d2d6b60aba49778895493d447071326 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 20 Jan 2017 11:30:54 -0800 Subject: [PATCH 064/245] Fix @page output CssPrinter now emits correct CSS when @page body includes both declarations and page-margin boxes. --- pkgs/csslib/lib/src/css_printer.dart | 6 ++---- pkgs/csslib/test/declaration_test.dart | 7 +++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index a62ca4775..035bc4640 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -107,16 +107,14 @@ class CssPrinter extends Visitor { emit(node._ident); emit(node.hasPseudoPage ? ':${node._pseudoPage}' : ''); } - emit(' '); var declsMargin = node._declsMargin; var declsMarginLength = declsMargin.length; + emit(' {$_newLine'); for (var i = 0; i < declsMarginLength; i++) { - if (i > 0) emit(_newLine); - emit('{$_newLine'); declsMargin[i].visit(this); - emit('}'); } + emit('}'); } /** @charset "charset encoding" */ diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index a55352296..ba123448f 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -287,6 +287,7 @@ void testNewerCss() { width: 10px; } @page bar : left { @top-left { margin: 8px; } } +@page { @top-left { margin: 8px; } width: 10px; } @charset "ISO-8859-1"; @charset 'ASCII';'''; @@ -308,6 +309,12 @@ void testNewerCss() { margin: 8px; } } +@page { +@top-left { + margin: 8px; +} + width: 10px; +} @charset "ISO-8859-1"; @charset "ASCII";'''; From 3516164e913bb09e32e7465954475c855d7628d7 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 25 Jan 2017 09:52:47 -0800 Subject: [PATCH 065/245] Updates version --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index f1cac20c9..0e2e7daa9 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.3 +version: 0.13.4 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 9dcc1d95bf5d42106d99fee1d85e06509f0d9e65 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 20 Jan 2017 15:33:58 -0800 Subject: [PATCH 066/245] Adds support for shadow host selectors Adds support for :host() and :host-context(). --- pkgs/csslib/lib/parser.dart | 23 ++++++++++++++++++++++- pkgs/csslib/lib/src/css_printer.dart | 2 +- pkgs/csslib/lib/src/tree.dart | 12 ++++++++---- pkgs/csslib/lib/src/tree_printer.dart | 2 +- pkgs/csslib/test/selector_test.dart | 12 ++++++++++++ 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index a268c5513..a1a982386 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1219,6 +1219,20 @@ class _Parser { return new Selector(simpleSequences, _makeSpan(start)); } + /// Same as [processSelector] but reports an error for each combinator. + /// + /// This is a quick fix for parsing until the parser + /// supports Selector Level 4 grammar: + /// https://drafts.csswg.org/selectors-4/#typedef-compound-selector + Selector processCompoundSelector() { + return processSelector() + ..simpleSelectorSequences.forEach((sequence) { + if (!sequence.isCombinatorNone) { + _error('compound selector can not contain combinator', sequence.span); + } + }); + } + simpleSelectorSequence(bool forceCombinatorNone) { var start = _peekToken.span; var combinatorType = TokenKind.COMBINATOR_NONE; @@ -1429,7 +1443,8 @@ class _Parser { // Functional pseudo? if (_peekToken.kind == TokenKind.LPAREN) { - if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') { + var name = pseudoName.name.toLowerCase(); + if (!pseudoElement && name == 'not') { _eat(TokenKind.LPAREN); // Negation : ':NOT(' S* negation_arg S* ')' @@ -1437,6 +1452,12 @@ class _Parser { _eat(TokenKind.RPAREN); return new NegationSelector(negArg, _makeSpan(start)); + } else if (!pseudoElement && (name == 'host' || name == 'host-context')) { + _eat(TokenKind.LPAREN); + var selector = processCompoundSelector(); + _eat(TokenKind.RPAREN); + var span = _makeSpan(start); + return new PseudoClassFunctionSelector(pseudoName, selector, span); } else { // Special parsing for expressions in pseudo functions. Minus is used // as operator not identifier. diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 035bc4640..d3b62d07f 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -324,7 +324,7 @@ class CssPrinter extends Visitor { void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { emit(":${node.name}("); - node.expression.visit(this); + node.argument.visit(this); emit(')'); } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index a6a64fc32..63c7301c6 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -291,15 +291,19 @@ class PseudoElementSelector extends SimpleSelector { String toString() => "::$name"; } -// :pseudoClassFunction(expression) +// :pseudoClassFunction(argument) class PseudoClassFunctionSelector extends PseudoClassSelector { - final SelectorExpression expression; + final TreeNode _argument; // Selector, SelectorExpression - PseudoClassFunctionSelector(Identifier name, this.expression, SourceSpan span) + PseudoClassFunctionSelector(Identifier name, this._argument, SourceSpan span) : super(name, span); PseudoClassFunctionSelector clone() => - new PseudoClassFunctionSelector(_name, expression, span); + new PseudoClassFunctionSelector(_name, _argument, span); + + TreeNode get argument => _argument; + Selector get selector => _argument as Selector; + SelectorExpression get expression => _argument as SelectorExpression; visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); } diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 9b0a6c255..97c6accd2 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -338,7 +338,7 @@ class _TreePrinter extends Visitor { void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { heading('Pseudo Class Function Selector', node); output.depth++; - visitSelectorExpression(node.expression); + node.argument.visit(this); super.visitPseudoClassFunctionSelector(node); output.depth--; } diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index dff44154f..87fb60ab1 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -46,6 +46,18 @@ void testSelectorSuccesses() { selectorAst = selector('#_privateId', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); expect('#_privateId', compactOuptut(selectorAst)); + + selectorAst = selector(':host', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(compactOuptut(selectorAst), ':host'); + + selectorAst = selector(':host(.foo)', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(compactOuptut(selectorAst), ':host(.foo)'); + + selectorAst = selector(':host-context(.foo)', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(compactOuptut(selectorAst), ':host-context(.foo)'); } // TODO(terry): Move this failure case to a failure_test.dart when the analyzer From 90e75c2f303ff4a32e964a9d887129883f2ae8d0 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 25 Jan 2017 10:10:36 -0800 Subject: [PATCH 067/245] Update version --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 0e2e7daa9..81c97a85c 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.4 +version: 0.13.5 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 8ce1ce0bf859360d28c041acd8c3e943f4d1d82f Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 20 Jan 2017 12:15:50 -0800 Subject: [PATCH 068/245] Adds support for shadow piercing combinators Fixes dart-lang/csslib#23 --- pkgs/csslib/lib/parser.dart | 19 ++++++++++++++++++- pkgs/csslib/lib/src/tokenkind.dart | 3 ++- pkgs/csslib/lib/src/tree.dart | 24 ++++++++++++++++++------ pkgs/csslib/lib/src/tree_printer.dart | 2 ++ pkgs/csslib/test/selector_test.dart | 8 ++++++++ 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 6b05c853f..9b1b9ceec 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1244,13 +1244,30 @@ class _Parser { combinatorType = TokenKind.COMBINATOR_PLUS; break; case TokenKind.GREATER: + // Parse > or >>> _eat(TokenKind.GREATER); - combinatorType = TokenKind.COMBINATOR_GREATER; + if (_maybeEat(TokenKind.GREATER)) { + _eat(TokenKind.GREATER); + combinatorType = TokenKind.COMBINATOR_DEEP; + } else { + combinatorType = TokenKind.COMBINATOR_GREATER; + } break; case TokenKind.TILDE: _eat(TokenKind.TILDE); combinatorType = TokenKind.COMBINATOR_TILDE; break; + case TokenKind.SLASH: + // Parse /deep/ + _eat(TokenKind.SLASH); + var ate = _maybeEat(TokenKind.IDENTIFIER); + var tok = ate ? _previousToken : _peekToken; + if (!(ate && tok.text == 'deep')) { + _error('expected deep, but found ${tok.text}', tok.span); + } + _eat(TokenKind.SLASH); + combinatorType = TokenKind.COMBINATOR_DEEP; + break; case TokenKind.AMPERSAND: _eat(TokenKind.AMPERSAND); thisOperator = true; diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index 27ccb4b53..2ad648ae1 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -100,8 +100,9 @@ class TokenKind { static const int COMBINATOR_PLUS = 515; // + combinator static const int COMBINATOR_GREATER = 516; // > combinator static const int COMBINATOR_TILDE = 517; // ~ combinator + static const int COMBINATOR_DEEP = 518; // /deep/ or >>> combinator - static const int UNARY_OP_NONE = 518; // No unary operator present. + static const int UNARY_OP_NONE = 519; // No unary operator present. // Attribute match types: static const int INCLUDES = 530; // '~=' diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 63c7301c6..a103679b0 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -120,12 +120,24 @@ class SimpleSelectorSequence extends TreeNode { bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE; bool get isCombinatorDescendant => combinator == TokenKind.COMBINATOR_DESCENDANT; - - String get _combinatorToString => isCombinatorDescendant - ? ' ' - : isCombinatorPlus - ? ' + ' - : isCombinatorGreater ? ' > ' : isCombinatorTilde ? ' ~ ' : ''; + bool get isCombinatorDeep => combinator == TokenKind.COMBINATOR_DEEP; + + String get _combinatorToString { + switch (combinator) { + case TokenKind.COMBINATOR_DEEP: + return ' /deep/ '; + case TokenKind.COMBINATOR_DESCENDANT: + return ' '; + case TokenKind.COMBINATOR_GREATER: + return ' > '; + case TokenKind.COMBINATOR_PLUS: + return ' + '; + case TokenKind.COMBINATOR_TILDE: + return ' ~ '; + default: + return ''; + } + } SimpleSelectorSequence clone() => new SimpleSelectorSequence(simpleSelector, span, combinator); diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 97c6accd2..94ca19326 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -271,6 +271,8 @@ class _TreePrinter extends Visitor { output.writeValue('combinator', ">"); } else if (node.isCombinatorTilde) { output.writeValue('combinator', "~"); + } else if (node.isCombinatorDeep) { + output.writeValue('combinator', '/deep/'); } else { output.writeValue('combinator', "ERROR UNKNOWN"); } diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index 87fb60ab1..eb2bef8f0 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -58,6 +58,14 @@ void testSelectorSuccesses() { selectorAst = selector(':host-context(.foo)', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); expect(compactOuptut(selectorAst), ':host-context(.foo)'); + + selectorAst = selector('.a /deep/ .b', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(compactOuptut(selectorAst), '.a /deep/ .b'); + + selectorAst = selector('.x >>> .y', errors: errors..clear()); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(compactOuptut(selectorAst), '.x /deep/ .y'); } // TODO(terry): Move this failure case to a failure_test.dart when the analyzer From f263469048b316dbd444b0078190f3135e649494 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 25 Jan 2017 11:20:30 -0800 Subject: [PATCH 069/245] Swaps >>> and /deep/ as deep combinator and alias The latest spec at this time has removed /deep/ altogether and promoted >>> from an alias for /deep/: https://drafts.csswg.org/css-scoping-1/#deep-combinator /deep/ will remain as an alias for backwards compatibility. --- pkgs/csslib/lib/src/tree.dart | 2 +- pkgs/csslib/lib/src/tree_printer.dart | 2 +- pkgs/csslib/test/selector_test.dart | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index a103679b0..cb410ecad 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -125,7 +125,7 @@ class SimpleSelectorSequence extends TreeNode { String get _combinatorToString { switch (combinator) { case TokenKind.COMBINATOR_DEEP: - return ' /deep/ '; + return ' >>> '; case TokenKind.COMBINATOR_DESCENDANT: return ' '; case TokenKind.COMBINATOR_GREATER: diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 94ca19326..cbe035309 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -272,7 +272,7 @@ class _TreePrinter extends Visitor { } else if (node.isCombinatorTilde) { output.writeValue('combinator', "~"); } else if (node.isCombinatorDeep) { - output.writeValue('combinator', '/deep/'); + output.writeValue('combinator', '>>>'); } else { output.writeValue('combinator', "ERROR UNKNOWN"); } diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index eb2bef8f0..a1212236a 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -61,11 +61,11 @@ void testSelectorSuccesses() { selectorAst = selector('.a /deep/ .b', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(selectorAst), '.a /deep/ .b'); + expect(compactOuptut(selectorAst), '.a >>> .b'); selectorAst = selector('.x >>> .y', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(selectorAst), '.x /deep/ .y'); + expect(compactOuptut(selectorAst), '.x >>> .y'); } // TODO(terry): Move this failure case to a failure_test.dart when the analyzer From f20a1e19a22986badd414d62cf25bb9d3facd754 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 25 Jan 2017 14:22:53 -0800 Subject: [PATCH 070/245] '>>>' and '/deep/' no longer share a token This allows csslib to preserve the original combinator choice when printing an AST. --- pkgs/csslib/lib/parser.dart | 2 +- pkgs/csslib/lib/src/tokenkind.dart | 5 +++-- pkgs/csslib/lib/src/tree.dart | 6 +++++- pkgs/csslib/lib/src/tree_printer.dart | 4 +++- pkgs/csslib/test/selector_test.dart | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 9b1b9ceec..fa5cce888 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1248,7 +1248,7 @@ class _Parser { _eat(TokenKind.GREATER); if (_maybeEat(TokenKind.GREATER)) { _eat(TokenKind.GREATER); - combinatorType = TokenKind.COMBINATOR_DEEP; + combinatorType = TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT; } else { combinatorType = TokenKind.COMBINATOR_GREATER; } diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index 2ad648ae1..85e6d4008 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -100,9 +100,10 @@ class TokenKind { static const int COMBINATOR_PLUS = 515; // + combinator static const int COMBINATOR_GREATER = 516; // > combinator static const int COMBINATOR_TILDE = 517; // ~ combinator - static const int COMBINATOR_DEEP = 518; // /deep/ or >>> combinator + static const int COMBINATOR_SHADOW_PIERCING_DESCENDANT = 518; // >>> + static const int COMBINATOR_DEEP = 519; // /deep/ (aliases >>>) - static const int UNARY_OP_NONE = 519; // No unary operator present. + static const int UNARY_OP_NONE = 520; // No unary operator present. // Attribute match types: static const int INCLUDES = 530; // '~=' diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index cb410ecad..9b6e46232 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -121,11 +121,15 @@ class SimpleSelectorSequence extends TreeNode { bool get isCombinatorDescendant => combinator == TokenKind.COMBINATOR_DESCENDANT; bool get isCombinatorDeep => combinator == TokenKind.COMBINATOR_DEEP; + bool get isCombinatorShadowPiercingDescendant => + combinator == TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT; String get _combinatorToString { switch (combinator) { - case TokenKind.COMBINATOR_DEEP: + case TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT: return ' >>> '; + case TokenKind.COMBINATOR_DEEP: + return ' /deep/ '; case TokenKind.COMBINATOR_DESCENDANT: return ' '; case TokenKind.COMBINATOR_GREATER: diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index cbe035309..ac4512c01 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -271,8 +271,10 @@ class _TreePrinter extends Visitor { output.writeValue('combinator', ">"); } else if (node.isCombinatorTilde) { output.writeValue('combinator', "~"); - } else if (node.isCombinatorDeep) { + } else if (node.isCombinatorShadowPiercingDescendant) { output.writeValue('combinator', '>>>'); + } else if (node.isCombinatorDeep) { + output.writeValue('combinator', '/deep/'); } else { output.writeValue('combinator', "ERROR UNKNOWN"); } diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index a1212236a..66e208075 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -61,7 +61,7 @@ void testSelectorSuccesses() { selectorAst = selector('.a /deep/ .b', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(selectorAst), '.a >>> .b'); + expect(compactOuptut(selectorAst), '.a /deep/ .b'); selectorAst = selector('.x >>> .y', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); From 464c1494806b5eb614a64ffb5fc570ddfd52a550 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 25 Jan 2017 14:49:42 -0800 Subject: [PATCH 071/245] Updates version and documents changes Consolidates subsequent commit version increases into one release. --- pkgs/csslib/CHANGELOG.md | 11 +++++++++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 8567408a8..906ad3f89 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 0.13.3 + +* Adds support for shadow host selectors `:host()` and `:host-context()`. +* Adds support for shadow-piercing descendant combinator `>>>` and its alias + `/deep/` for backwards compatibility. +* Adds support for non-functional IE filter properties (i.e. `filter: FlipH`) +* Fixes emitted CSS for '@page' directive when body includes declarations and + page-margin boxes. +* Exports `Message` from `parser.dart` so its no longer necessary to import + `src/messages.dart` to use the parser API. + ## 0.13.2+2 * Fix static warnings. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 8ed29b650..f1cac20c9 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.6 +version: 0.13.3 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From acb3b1ea8276117ea731451ff27b6f160cfe4425 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 25 Jan 2017 16:00:03 -0800 Subject: [PATCH 072/245] Fixes typos --- pkgs/csslib/CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 906ad3f89..e4e524cbe 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -3,10 +3,10 @@ * Adds support for shadow host selectors `:host()` and `:host-context()`. * Adds support for shadow-piercing descendant combinator `>>>` and its alias `/deep/` for backwards compatibility. -* Adds support for non-functional IE filter properties (i.e. `filter: FlipH`) -* Fixes emitted CSS for '@page' directive when body includes declarations and +* Adds support for non-functional IE filter properties (i.e. `filter: FlipH`). +* Fixes emitted CSS for `@page` directive when body includes declarations and page-margin boxes. -* Exports `Message` from `parser.dart` so its no longer necessary to import +* Exports `Message` from `parser.dart` so it's no longer necessary to import `src/messages.dart` to use the parser API. ## 0.13.2+2 From ad404e22f43ed57fc43cf9b7160a2085d9fa65f2 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 25 Jan 2017 17:22:03 -0800 Subject: [PATCH 073/245] Fixes analyzer error --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/lib/css.dart | 2 +- pkgs/csslib/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index e4e524cbe..c09603576 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.13.3+1 + +* Fixes analyzer error. + ## 0.13.3 * Adds support for shadow host selectors `:host()` and `:host-context()`. diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index c41735478..e7ef53443 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -10,7 +10,7 @@ import 'package:path/path.dart' as path; import 'package:source_span/source_span.dart'; import 'parser.dart'; -import 'src/messages.dart' show Messages; +import 'src/messages.dart'; import 'visitor.dart'; void main(List arguments) { diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index f1cac20c9..816ee6a5b 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.3 +version: 0.13.3+1 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 8ca885bddb8490725655977230d763381095ff54 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Thu, 9 Feb 2017 15:10:39 -0800 Subject: [PATCH 074/245] Handles CSS2.1 pseudo element syntax In CSS2.1, pseudo-elements were defined with a single ':' like pseudo-classes. This change now handles this syntax and will properly parse them as pseudo- elements instead of pseudo-classes. Accepted pseudo-elements: :after :before :first-letter :first-line To not break backwards compatibility with older browsers, this syntax is preserved when emitting parsed styles. --- pkgs/csslib/lib/parser.dart | 24 ++++++++++++++---------- pkgs/csslib/lib/src/tree.dart | 9 +++++++-- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index fa5cce888..205011f32 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -171,6 +171,14 @@ class Parser { StyleSheet parse() => _parser.parse(); } +// CSS2.1 pseudo-elements which were defined with a single ':'. +final _legacyPseudoElements = new Set.from(const [ + 'after', + 'before', + 'first-letter', + 'first-line', +]); + /** A simple recursive descent parser for CSS. */ class _Parser { final Tokenizer tokenizer; @@ -1456,11 +1464,10 @@ class _Parser { } else { return null; } + var name = pseudoName.name.toLowerCase(); // Functional pseudo? - if (_peekToken.kind == TokenKind.LPAREN) { - var name = pseudoName.name.toLowerCase(); if (!pseudoElement && name == 'not') { _eat(TokenKind.LPAREN); @@ -1504,14 +1511,11 @@ class _Parser { } } - // TODO(terry): Need to handle specific pseudo class/element name and - // backward compatible names that are : as well as :: as well as - // parameters. Current, spec uses :: for pseudo-element and : for - // pseudo-class. However, CSS2.1 allows for : to specify old - // pseudo-elements (:first-line, :first-letter, :before and :after) any - // new pseudo-elements defined would require a ::. - return pseudoElement - ? new PseudoElementSelector(pseudoName, _makeSpan(start)) + // Treat CSS2.1 pseudo-elements defined with pseudo class syntax as pseudo- + // elements for backwards compatibility. + return pseudoElement || _legacyPseudoElements.contains(name) + ? new PseudoElementSelector(pseudoName, _makeSpan(start), + isLegacy: !pseudoElement) : new PseudoClassSelector(pseudoName, _makeSpan(start)); } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 9b6e46232..c3709d29b 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -299,12 +299,17 @@ class PseudoClassSelector extends SimpleSelector { // ::pseudoElement class PseudoElementSelector extends SimpleSelector { - PseudoElementSelector(Identifier name, SourceSpan span) : super(name, span); + // If true, this is a CSS2.1 pseudo-element with only a single ':'. + final bool isLegacy; + + PseudoElementSelector(Identifier name, SourceSpan span, + {this.isLegacy: false}) + : super(name, span); visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); PseudoElementSelector clone() => new PseudoElementSelector(_name, span); - String toString() => "::$name"; + String toString() => "${isLegacy ? ':' : '::'}$name"; } // :pseudoClassFunction(argument) From 8ab25c739e862a9041db0550881cf41b2b81dab9 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Thu, 23 Feb 2017 14:16:07 -0800 Subject: [PATCH 075/245] Adds support for signed decimals with leading '.' For example, '-.5' is now correctly recognized as a negative number. --- pkgs/csslib/lib/src/tokenizer.dart | 4 ++-- pkgs/csslib/lib/src/tokenizer_base.dart | 17 ++++++++++++++--- pkgs/csslib/test/declaration_test.dart | 8 ++++---- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 063ac3459..a14e86684 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -97,7 +97,7 @@ class Tokenizer extends TokenizerBase { case TokenChar.HASH: return _finishToken(TokenKind.HASH); case TokenChar.PLUS: - if (maybeEatDigit()) return finishNumber(); + if (_nextCharsAreNumber(ch)) return finishNumber(); return _finishToken(TokenKind.PLUS); case TokenChar.MINUS: if (inSelectorExpression || unicodeRange) { @@ -105,7 +105,7 @@ class Tokenizer extends TokenizerBase { // not part of identifier e.g., interval value range (e.g. U+400-4ff) // or minus operator in selector expression. return _finishToken(TokenKind.MINUS); - } else if (maybeEatDigit()) { + } else if (_nextCharsAreNumber(ch)) { return finishNumber(); } else if (TokenizerHelpers.isIdentifierStart(ch)) { return finishIdentifier(); diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index ccdd7be71..c2a448fd8 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -79,9 +79,9 @@ abstract class TokenizerBase { } } - int _peekChar() { - if (_index < _text.length) { - return _text.codeUnitAt(_index); + int _peekChar([int offset = 0]) { + if (_index + offset < _text.length) { + return _text.codeUnitAt(_index + offset); } else { return 0; } @@ -100,6 +100,17 @@ abstract class TokenizerBase { } } + bool _nextCharsAreNumber(int first) { + if (TokenizerHelpers.isDigit(first)) return true; + var second = _peekChar(); + if (first == TokenChar.DOT) return TokenizerHelpers.isDigit(second); + if (first == TokenChar.PLUS || first == TokenChar.MINUS) { + return TokenizerHelpers.isDigit(second) || + (second == TokenChar.DOT && TokenizerHelpers.isDigit(_peekChar(1))); + } + return false; + } + Token _finishToken(int kind) { return new Token(kind, _file.span(_startIndex, _index)); } diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 007916d48..19b5ea4b8 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -170,8 +170,8 @@ void testUnits() { right: 300px; bottom: 400cm; border-width: 2.5mm; - margin-top: .5in; - margin-left: 5pc; + margin-top: -.5in; + margin-left: +5pc; margin-right: 5ex; margin-bottom: 5ch; font-size: 10pt; @@ -208,8 +208,8 @@ void testUnits() { right: 300px; bottom: 400cm; border-width: 2.5mm; - margin-top: .5in; - margin-left: 5pc; + margin-top: -.5in; + margin-left: +5pc; margin-right: 5ex; margin-bottom: 5ch; font-size: 10pt; From 98849970a206cef6ce0baad546819cc5cfb58f89 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Thu, 23 Feb 2017 17:09:37 -0800 Subject: [PATCH 076/245] Fixes parsing hex number when identifier follows If an identifier followed a hex number, it would be treated as part of the hex number. For example, `dart-lang/csslib#000 url(...)` would be parsed as `dart-lang/csslib#000url` which would be labeled as a bad hex value. Now the parser correctly recognizes whitespace following a hex number to prevent this issue. --- pkgs/csslib/lib/parser.dart | 3 ++- pkgs/csslib/test/declaration_test.dart | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 205011f32..168c9daea 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2168,7 +2168,8 @@ class _Parser { if (_peekKind(TokenKind.INTEGER)) { String hexText1 = _peekToken.text; _next(); - if (_peekIdentifier()) { + // Append identifier only if there's no delimiting whitespace. + if (_peekIdentifier() && _previousToken.end == _peekToken.start) { hexText = '$hexText1${identifier().name}'; } else { hexText = hexText1; diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 007916d48..64528198c 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -566,6 +566,10 @@ div[href^='test'] { .test-background { background: url(http://www.foo.com/bar.png); } + +.test-background-with-multiple-properties { + background: #000 url(http://www.foo.com/bar.png); +} '''; final String generated = '@import "simple.css"; ' @@ -591,6 +595,9 @@ div[href^='test'] { '}\n' '.test-background {\n' ' background: url("http://www.foo.com/bar.png");\n' + '}\n' + '.test-background-with-multiple-properties {\n' + ' background: #000 url("http://www.foo.com/bar.png");\n' '}'; var stylesheet = parseCss(input, errors: errors); From bfc7ad9a1de2fee74a129fb7b8218291519d4f06 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Thu, 23 Feb 2017 18:10:03 -0800 Subject: [PATCH 077/245] Fixes parsing string with unicode-range sequences Strings with character sequences that resemble `unicode-range` property values, `U+0-10FFFF`, would be missing the `U+` sequence in the parsed output. This is because the tokenizer doesn't tokenize strings as their own tokens, and midway through a string it was trying to emit a unicode range token. We now check to see if we're currently parsing a string before interpreting `U+` as the beginning of a unicode range. --- pkgs/csslib/lib/src/tokenizer.dart | 7 ++++++- pkgs/csslib/test/declaration_test.dart | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 063ac3459..2999ddb8c 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -202,8 +202,13 @@ class Tokenizer extends TokenizerBase { } else { return _errorToken(); } - } else if ((ch == UNICODE_U || ch == UNICODE_LOWER_U) && + } else if (_inString && + (ch == UNICODE_U || ch == UNICODE_LOWER_U) && (_peekChar() == UNICODE_PLUS)) { + // `_inString` is misleading. We actually DON'T want to enter this + // block while tokenizing a string, but the parser sets this value to + // false while it IS consuming tokens within a string. + // // Unicode range: U+uNumber[-U+uNumber] // uNumber = 0..10FFFF _nextChar(); // Skip + diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 007916d48..f82896c95 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -16,6 +16,7 @@ void testSimpleTerms() { @ import url("test.css"); .foo { background-color: #191919; + content: "u+0041"; width: 10PX; height: 22mM !important; border-width: 20cm; @@ -29,6 +30,7 @@ void testSimpleTerms() { @import "test.css"; .foo { background-color: #191919; + content: "u+0041"; width: 10px; height: 22mm !important; border-width: 20cm; From 4b17eec36100252619838953e13f9e12f9fbdc67 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Tue, 7 Mar 2017 14:03:59 -0800 Subject: [PATCH 078/245] Updates version and changelog. --- pkgs/csslib/CHANGELOG.md | 7 +++++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index c09603576..d123fab32 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.13.4 + +* Parses CSS 2.1 pseudo-classes as pseudo-classes instead of pseudo-elements. +* Supports signed decimal numbers with no integer part. +* Fixes parsing hexadecimal numbers when followed by an identifier. +* Fixes parsing strings which contain unicode-range character sequences. + ## 0.13.3+1 * Fixes analyzer error. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 816ee6a5b..0e2e7daa9 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.3+1 +version: 0.13.4 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From ebc007be04bebf3ffc4d0b12dc80ce2c85bbd414 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Tue, 7 Mar 2017 14:09:03 -0800 Subject: [PATCH 079/245] Corrects changelog. --- pkgs/csslib/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index d123fab32..7c5222d71 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.13.4 -* Parses CSS 2.1 pseudo-classes as pseudo-classes instead of pseudo-elements. +* Parses CSS 2.1 pseudo-elements as pseudo-elements instead of pseudo-classes. * Supports signed decimal numbers with no integer part. * Fixes parsing hexadecimal numbers when followed by an identifier. * Fixes parsing strings which contain unicode-range character sequences. From 0ee5793fc04353f117a3aa80ed9258a0b22e2a3a Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 5 Apr 2017 17:42:43 -0700 Subject: [PATCH 080/245] Adds support for `@-moz-document`. Also fixes emitted CSS formatting for `@media` and `@host`. --- pkgs/csslib/lib/parser.dart | 72 +++++++++++++++++++++++++- pkgs/csslib/lib/src/css_printer.dart | 24 +++++++-- pkgs/csslib/lib/src/tokenkind.dart | 2 + pkgs/csslib/lib/src/tree.dart | 14 +++++ pkgs/csslib/lib/src/tree_printer.dart | 9 ++++ pkgs/csslib/lib/visitor.dart | 6 +++ pkgs/csslib/test/declaration_test.dart | 50 +++++++++++++++++- 7 files changed, 168 insertions(+), 9 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 168c9daea..2bdaad168 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -485,7 +485,11 @@ class _Parser { * mixin: '@mixin name [(args,...)] '{' declarations/ruleset '}' * include: '@include name [(@arg,@arg1)] * '@include name [(@arg...)] - * content '@content' + * content: '@content' + * -moz-document: '@-moz-document' [ | url-prefix() | + * domain() | regexp([]; + do { + var function; + + // Consume function token: IDENT '(' + var ident = identifier(); + _eat(TokenKind.LPAREN); + + // Consume function arguments. + if (ident.name == 'url-prefix' || ident.name == 'domain') { + // @-moz-document allows the 'url-prefix' and 'domain' functions to + // omit quotations around their argument, contrary to the standard + // in which they must be strings. To support this we consume a + // string with optional quotation marks, then reapply quotation + // marks so they're present in the emitted CSS. + var argumentStart = _peekToken.span; + var value = processQuotedString(true); + // Don't quote the argument if it's empty. '@-moz-document url-prefix()' + // is a common pattern used for browser detection. + var argument = value.isNotEmpty ? '"$value"' : ''; + var argumentSpan = _makeSpan(argumentStart); + + _eat(TokenKind.RPAREN); + + var arguments = new Expressions(_makeSpan(argumentSpan)) + ..add(new LiteralTerm(argument, argument, argumentSpan)); + function = new FunctionTerm( + ident.name, ident.name, arguments, _makeSpan(ident.span)); + } else { + function = processFunction(ident); + } + + functions.add(function); + } while (_maybeEat(TokenKind.COMMA)); + + _eat(TokenKind.LBRACE); + var groupRuleBody = processGroupRuleBody(); + _eat(TokenKind.RBRACE); + return new DocumentDirective( + functions, groupRuleBody, _makeSpan(start)); + } + RuleSet processRuleSet([SelectorGroup selectorGroup]) { if (selectorGroup == null) { selectorGroup = processSelectorGroup(); @@ -998,6 +1048,24 @@ class _Parser { return null; } + List processGroupRuleBody() { + var nodes = []; + while (!(_peekKind(TokenKind.RBRACE) || _peekKind(TokenKind.END_OF_FILE))) { + var directive = processDirective(); + if (directive != null) { + nodes.add(directive); + continue; + } + var ruleSet = processRuleSet(); + if (ruleSet != null) { + nodes.add(ruleSet); + continue; + } + break; + } + return nodes; + } + /** * Look ahead to see if what should be a declaration is really a selector. * If it's a selector than it's a nested selector. This support's Less' diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index d3b62d07f..2ae6b66cc 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -77,22 +77,36 @@ class CssPrinter extends Visitor { } } + void visitDocumentDirective(DocumentDirective node) { + emit('$_newLine@-moz-document '); + node.functions.first.visit(this); + for (var function in node.functions.skip(1)) { + emit(',$_sp'); + function.visit(this); + } + emit('$_sp{'); + for (var ruleSet in node.groupRuleBody) { + ruleSet.visit(this); + } + emit('$_newLine}'); + } + void visitMediaDirective(MediaDirective node) { - emit(' @media'); + emit('$_newLine@media'); emitMediaQueries(node.mediaQueries); - emit(' {'); + emit('$_sp{'); for (var ruleset in node.rulesets) { ruleset.visit(this); } - emit('$_newLine\}'); + emit('$_newLine}'); } void visitHostDirective(HostDirective node) { - emit('\n@host {'); + emit('$_newLine@host$_sp{'); for (var ruleset in node.rulesets) { ruleset.visit(this); } - emit('$_newLine\}'); + emit('$_newLine}'); } /** diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index 85e6d4008..f6a6c8c19 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -161,6 +161,7 @@ class TokenKind { static const int DIRECTIVE_INCLUDE = 655; static const int DIRECTIVE_CONTENT = 656; static const int DIRECTIVE_EXTEND = 657; + static const int DIRECTIVE_MOZ_DOCUMENT = 658; // Media query operators static const int MEDIA_OP_ONLY = 665; // Unary. @@ -218,6 +219,7 @@ class TokenKind { const {'type': TokenKind.DIRECTIVE_INCLUDE, 'value': 'include'}, const {'type': TokenKind.DIRECTIVE_CONTENT, 'value': 'content'}, const {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'}, + const {'type': TokenKind.DIRECTIVE_MOZ_DOCUMENT, 'value': '-moz-document'}, ]; static const List> MEDIA_OPERATORS = const [ diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index c3709d29b..632180735 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -435,6 +435,20 @@ class Directive extends TreeNode { visit(VisitorBase visitor) => visitor.visitDirective(this); } +class DocumentDirective extends Directive { + final List functions; + final List groupRuleBody; + + DocumentDirective(this.functions, this.groupRuleBody, SourceSpan span) + : super(span); + + DocumentDirective clone() { + return new DocumentDirective(this.functions, this.groupRuleBody, span); + } + + visit(VisitorBase visitor) => visitor.visitDocumentDirective(this); +} + class ImportDirective extends Directive { /** import name specified. */ final String import; diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index ac4512c01..97403dc9d 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -90,6 +90,15 @@ class _TreePrinter extends Visitor { output.depth--; } + void visitDocumentDirective(DocumentDirective node) { + heading('DocumentDirective', node); + output.depth++; + output.writeNodeList('functions', node.functions); + output.writeNodeList('group rule body', node.groupRuleBody); + super.visitDocumentDirective(node); + output.depth--; + } + void visitPageDirective(PageDirective node) { heading('PageDirective', node); output.depth++; diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 11234935a..016f20ec3 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -20,6 +20,7 @@ abstract class VisitorBase { visitNoOp(NoOp node); visitTopLevelProduction(TopLevelProduction node); visitDirective(Directive node); + visitDocumentDirective(DocumentDirective node); visitMediaExpression(MediaExpression node); visitMediaQuery(MediaQuery node); visitMediaDirective(MediaDirective node); @@ -152,6 +153,11 @@ class Visitor implements VisitorBase { } } + visitDocumentDirective(DocumentDirective node) { + _visitNodeList(node.functions); + _visitNodeList(node.groupRuleBody); + } + visitMediaDirective(MediaDirective node) { for (var mediaQuery in node.mediaQueries) { visitMediaQuery(mediaQuery); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 96600d840..0e7cf0765 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -380,11 +380,13 @@ void testMediaQueries() { .myclass { height: 20px; } -} @media print AND (min-resolution:300dpi) { +} +@media print AND (min-resolution:300dpi) { #anotherId { color: #fff; } -} @media print AND (min-resolution:280dpcm) { +} +@media print AND (min-resolution:280dpcm) { #finalId { color: #aaa; } @@ -445,6 +447,49 @@ void testMediaQueries() { expect(prettyPrint(stylesheet), generated); } +void testMozDocument() { + var errors = []; + // Test empty url-prefix, commonly used for browser detection. + var css = '@-moz-document url-prefix() {}'; + var expected = '@-moz-document url-prefix() {\n}'; + var styleSheet = parseCss(css, errors: errors); + expect(styleSheet, isNotNull); + expect(errors, isEmpty); + expect(prettyPrint(styleSheet), expected); + + // Test url-prefix with unquoted parameter + css = '@-moz-document url-prefix(http://www.w3.org/Style/) {}'; + expected = '@-moz-document url-prefix("http://www.w3.org/Style/") {\n}'; + styleSheet = parseCss(css, errors: errors); + expect(styleSheet, isNotNull); + expect(errors, isEmpty); + expect(prettyPrint(styleSheet), expected); + + // Test domain with unquoted parameter + css = '@-moz-document domain(google.com) {}'; + expected = '@-moz-document domain("google.com") {\n}'; + styleSheet = parseCss(css, errors: errors); + expect(styleSheet, isNotNull); + expect(errors, isEmpty); + expect(prettyPrint(styleSheet), expected); + + // Test all document functions combined. + css = '@-moz-document ' + + 'url(http://www.w3.org/), ' + + "url-prefix('http://www.w3.org/Style/'), " + + 'domain("google.com"), ' + + 'regexp("https:.*") {} '; + expected = '@-moz-document ' + + 'url("http://www.w3.org/"), ' + + 'url-prefix("http://www.w3.org/Style/"), ' + + 'domain("google.com"), ' + + 'regexp("https:.*") {\n}'; + styleSheet = parseCss(css, errors: errors); + expect(styleSheet, isNotNull); + expect(errors, isEmpty); + expect(prettyPrint(styleSheet), expected); +} + void testFontFace() { var errors = []; @@ -1111,6 +1156,7 @@ main() { test('Unicode', testUnicode); test('Newer CSS', testNewerCss); test('Media Queries', testMediaQueries); + test('Document', testMozDocument); test('Font-Face', testFontFace); test('CSS file', testCssFile); test('Compact Emitter', testCompactEmitter); From f3b6b6449eeffd6cc2c6711cc4427a95d7d9b224 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Thu, 6 Apr 2017 14:07:05 -0700 Subject: [PATCH 081/245] Adds group rule body to @-moz-document tests. --- pkgs/csslib/test/declaration_test.dart | 43 +++++++++++++++++++++----- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 0e7cf0765..c301c633b 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -450,24 +450,51 @@ void testMediaQueries() { void testMozDocument() { var errors = []; // Test empty url-prefix, commonly used for browser detection. - var css = '@-moz-document url-prefix() {}'; - var expected = '@-moz-document url-prefix() {\n}'; + var css = ''' +@-moz-document url-prefix() { + div { + color: #000; + } +}'''; + var expected = '''@-moz-document url-prefix() { +div { + color: #000; +} +}'''; var styleSheet = parseCss(css, errors: errors); expect(styleSheet, isNotNull); expect(errors, isEmpty); expect(prettyPrint(styleSheet), expected); // Test url-prefix with unquoted parameter - css = '@-moz-document url-prefix(http://www.w3.org/Style/) {}'; - expected = '@-moz-document url-prefix("http://www.w3.org/Style/") {\n}'; + css = ''' +@-moz-document url-prefix(http://www.w3.org/Style/) { + div { + color: #000; + } +}'''; + expected = '''@-moz-document url-prefix("http://www.w3.org/Style/") { +div { + color: #000; +} +}'''; styleSheet = parseCss(css, errors: errors); expect(styleSheet, isNotNull); expect(errors, isEmpty); expect(prettyPrint(styleSheet), expected); // Test domain with unquoted parameter - css = '@-moz-document domain(google.com) {}'; - expected = '@-moz-document domain("google.com") {\n}'; + css = ''' +@-moz-document domain(google.com) { + div { + color: #000; + } +}'''; + expected = '''@-moz-document domain("google.com") { +div { + color: #000; +} +}'''; styleSheet = parseCss(css, errors: errors); expect(styleSheet, isNotNull); expect(errors, isEmpty); @@ -478,12 +505,12 @@ void testMozDocument() { 'url(http://www.w3.org/), ' + "url-prefix('http://www.w3.org/Style/'), " + 'domain("google.com"), ' + - 'regexp("https:.*") {} '; + 'regexp("https:.*") { div { color: #000; } }'; expected = '@-moz-document ' + 'url("http://www.w3.org/"), ' + 'url-prefix("http://www.w3.org/Style/"), ' + 'domain("google.com"), ' + - 'regexp("https:.*") {\n}'; + 'regexp("https:.*") {\ndiv {\n color: #000;\n}\n}'; styleSheet = parseCss(css, errors: errors); expect(styleSheet, isNotNull); expect(errors, isEmpty); From 06f41675f0b9c06d51544fbbcc6e888f76113222 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 12 Apr 2017 10:46:26 -0700 Subject: [PATCH 082/245] Adds support for `@supports`. (dart-lang/csslib#41) Fixes dart-lang/angular2dart-lang/csslib#330. --- pkgs/csslib/lib/parser.dart | 97 ++++++++++++++++++++++++-- pkgs/csslib/lib/src/css_printer.dart | 46 ++++++++++-- pkgs/csslib/lib/src/tokenkind.dart | 2 + pkgs/csslib/lib/src/tree.dart | 93 +++++++++++++++++++++++- pkgs/csslib/lib/src/tree_printer.dart | 37 +++++++++- pkgs/csslib/lib/visitor.dart | 26 +++++++ pkgs/csslib/test/declaration_test.dart | 89 ++++++++++++++++++++++- 7 files changed, 376 insertions(+), 14 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 2bdaad168..4c65a2996 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -23,6 +23,12 @@ part 'src/tokenizer_base.dart'; part 'src/tokenizer.dart'; part 'src/tokenkind.dart'; +enum ClauseType { + none, + conjunction, + disjunction, +} + /** Used for parser lookup ahead (used for nested selectors Less support). */ class ParserState extends TokenizerState { final Token peekToken; @@ -490,6 +496,7 @@ class _Parser { * domain() | regexp([]; do { var function; @@ -1033,8 +1042,84 @@ class _Parser { _eat(TokenKind.LBRACE); var groupRuleBody = processGroupRuleBody(); _eat(TokenKind.RBRACE); - return new DocumentDirective( - functions, groupRuleBody, _makeSpan(start)); + return new DocumentDirective(functions, groupRuleBody, _makeSpan(start)); + } + + SupportsDirective processSupportsDirective() { + var start = _peekToken.span; + _next(); // '@supports' + var condition = processSupportsCondition(); + _eat(TokenKind.LBRACE); + var groupRuleBody = processGroupRuleBody(); + _eat(TokenKind.RBRACE); + return new SupportsDirective(condition, groupRuleBody, _makeSpan(start)); + } + + SupportsCondition processSupportsCondition() { + if (_peekKind(TokenKind.IDENTIFIER)) { + return processSupportsNegation(); + } + + var start = _peekToken.span; + var conditions = []; + var clauseType = ClauseType.none; + + while (true) { + conditions.add(processSupportsConditionInParens()); + + var type; + var text = _peekToken.text.toLowerCase(); + + if (text == 'and') { + type = ClauseType.conjunction; + } else if (text == 'or') { + type = ClauseType.disjunction; + } else { + break; // Done parsing clause. + } + + if (clauseType == ClauseType.none) { + clauseType = type; // First operand and operator of clause. + } else if (clauseType != type) { + _error("Operators can't be mixed without a layer of parentheses", + _peekToken.span); + break; + } + + _next(); // Consume operator. + } + + if (clauseType == ClauseType.conjunction) { + return new SupportsConjunction(conditions, _makeSpan(start)); + } else if (clauseType == ClauseType.disjunction) { + return new SupportsDisjunction(conditions, _makeSpan(start)); + } else { + return conditions.first; + } + } + + SupportsNegation processSupportsNegation() { + var start = _peekToken.span; + var text = _peekToken.text.toLowerCase(); + if (text != 'not') return null; + _next(); // 'not' + var condition = processSupportsConditionInParens(); + return new SupportsNegation(condition, _makeSpan(start)); + } + + SupportsConditionInParens processSupportsConditionInParens() { + var start = _peekToken.span; + _eat(TokenKind.LPAREN); + // Try to parse a condition. + var condition = processSupportsCondition(); + if (condition != null) { + _eat(TokenKind.RPAREN); + return new SupportsConditionInParens.nested(condition, _makeSpan(start)); + } + // Otherwise, parse a declaration. + var declaration = processDeclaration([]); + _eat(TokenKind.RPAREN); + return new SupportsConditionInParens(declaration, _makeSpan(start)); } RuleSet processRuleSet([SelectorGroup selectorGroup]) { diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 2ae6b66cc..0304fd71c 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -91,6 +91,43 @@ class CssPrinter extends Visitor { emit('$_newLine}'); } + void visitSupportsDirective(SupportsDirective node) { + emit('$_newLine@supports '); + node.condition.visit(this); + emit('$_sp{'); + for (var rule in node.groupRuleBody) { + rule.visit(this); + } + emit('$_newLine}'); + } + + void visitSupportsConditionInParens(SupportsConditionInParens node) { + emit('('); + node.condition.visit(this); + emit(')'); + } + + void visitSupportsNegation(SupportsNegation node) { + emit('not$_sp'); + node.condition.visit(this); + } + + void visitSupportsConjunction(SupportsConjunction node) { + node.conditions.first.visit(this); + for (var condition in node.conditions.skip(1)) { + emit('${_sp}and$_sp'); + condition.visit(this); + } + } + + void visitSupportsDisjunction(SupportsDisjunction node) { + node.conditions.first.visit(this); + for (var condition in node.conditions.skip(1)) { + emit('${_sp}or$_sp'); + condition.visit(this); + } + } + void visitMediaDirective(MediaDirective node) { emit('$_newLine@media'); emitMediaQueries(node.mediaQueries); @@ -265,12 +302,11 @@ class CssPrinter extends Visitor { } void visitDeclaration(Declaration node) { - String importantAsString() => node.important ? '$_sp!important' : ''; - - emit("${node.property}: "); + emit('${node.property}:$_sp'); node._expression.visit(this); - - emit("${importantAsString()}"); + if (node.important) { + emit('$_sp!important'); + } } void visitVarDefinition(VarDefinition node) { diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index f6a6c8c19..48696abb8 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -162,6 +162,7 @@ class TokenKind { static const int DIRECTIVE_CONTENT = 656; static const int DIRECTIVE_EXTEND = 657; static const int DIRECTIVE_MOZ_DOCUMENT = 658; + static const int DIRECTIVE_SUPPORTS = 659; // Media query operators static const int MEDIA_OP_ONLY = 665; // Unary. @@ -220,6 +221,7 @@ class TokenKind { const {'type': TokenKind.DIRECTIVE_CONTENT, 'value': 'content'}, const {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'}, const {'type': TokenKind.DIRECTIVE_MOZ_DOCUMENT, 'value': '-moz-document'}, + const {'type': TokenKind.DIRECTIVE_SUPPORTS, 'value': 'supports'}, ]; static const List> MEDIA_OPERATORS = const [ diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 632180735..d6b9dbfb2 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -443,12 +443,103 @@ class DocumentDirective extends Directive { : super(span); DocumentDirective clone() { - return new DocumentDirective(this.functions, this.groupRuleBody, span); + var clonedFunctions = []; + for (var function in functions) { + clonedFunctions.add(function.clone()); + } + var clonedGroupRuleBody = []; + for (var rule in groupRuleBody) { + clonedGroupRuleBody.add(rule.clone()); + } + return new DocumentDirective(clonedFunctions, clonedGroupRuleBody, span); } visit(VisitorBase visitor) => visitor.visitDocumentDirective(this); } +class SupportsDirective extends Directive { + final SupportsCondition condition; + final List groupRuleBody; + + SupportsDirective(this.condition, this.groupRuleBody, SourceSpan span) + : super(span); + + SupportsDirective clone() { + var clonedCondition = condition.clone(); + var clonedGroupRuleBody = []; + for (var rule in groupRuleBody) { + clonedGroupRuleBody.add(rule.clone()); + } + return new SupportsDirective(clonedCondition, clonedGroupRuleBody, span); + } + + visit(VisitorBase visitor) => visitor.visitSupportsDirective(this); +} + +abstract class SupportsCondition extends TreeNode { + SupportsCondition(SourceSpan span) : super(span); +} + +class SupportsConditionInParens extends SupportsCondition { + /// A [Declaration] or nested [SupportsCondition]. + final TreeNode condition; + + SupportsConditionInParens(Declaration declaration, SourceSpan span) + : condition = declaration, + super(span); + + SupportsConditionInParens.nested(SupportsCondition condition, SourceSpan span) + : condition = condition, + super(span); + + SupportsConditionInParens clone() => + new SupportsConditionInParens(condition.clone(), span); + + visit(VisitorBase visitor) => visitor.visitSupportsConditionInParens(this); +} + +class SupportsNegation extends SupportsCondition { + final SupportsConditionInParens condition; + + SupportsNegation(this.condition, SourceSpan span) : super(span); + + SupportsNegation clone() => new SupportsNegation(condition.clone(), span); + + visit(VisitorBase visitor) => visitor.visitSupportsNegation(this); +} + +class SupportsConjunction extends SupportsCondition { + final List conditions; + + SupportsConjunction(this.conditions, SourceSpan span) : super(span); + + SupportsConjunction clone() { + var clonedConditions = []; + for (var condition in conditions) { + clonedConditions.add(condition.clone()); + } + return new SupportsConjunction(clonedConditions, span); + } + + visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this); +} + +class SupportsDisjunction extends SupportsCondition { + final List conditions; + + SupportsDisjunction(this.conditions, SourceSpan span) : super(span); + + SupportsDisjunction clone() { + var clonedConditions = []; + for (var condition in conditions) { + clonedConditions.add(condition.clone()); + } + return new SupportsDisjunction(clonedConditions, span); + } + + visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this); +} + class ImportDirective extends Directive { /** import name specified. */ final String import; diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 97403dc9d..7ae67e48d 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -95,7 +95,42 @@ class _TreePrinter extends Visitor { output.depth++; output.writeNodeList('functions', node.functions); output.writeNodeList('group rule body', node.groupRuleBody); - super.visitDocumentDirective(node); + output.depth--; + } + + void visitSupportsDirective(SupportsDirective node) { + heading('SupportsDirective', node); + output.depth++; + output.writeNode('condition', node.condition); + output.writeNodeList('group rule body', node.groupRuleBody); + output.depth--; + } + + void visitSupportsConditionInParens(SupportsConditionInParens node) { + heading('SupportsConditionInParens', node); + output.depth++; + output.writeNode('condition', node.condition); + output.depth--; + } + + void visitSupportsNegation(SupportsNegation node) { + heading('SupportsNegation', node); + output.depth++; + output.writeNode('condition', node.condition); + output.depth--; + } + + void visitSupportsConjunction(SupportsConjunction node) { + heading('SupportsConjunction', node); + output.depth++; + output.writeNodeList('conditions', node.conditions); + output.depth--; + } + + void visitSupportsDisjunction(SupportsDisjunction node) { + heading('SupportsDisjunction', node); + output.depth++; + output.writeNodeList('conditions', node.conditions); output.depth--; } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 016f20ec3..ad94033fa 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -21,6 +21,11 @@ abstract class VisitorBase { visitTopLevelProduction(TopLevelProduction node); visitDirective(Directive node); visitDocumentDirective(DocumentDirective node); + visitSupportsDirective(SupportsDirective node); + visitSupportsConditionInParens(SupportsConditionInParens node); + visitSupportsNegation(SupportsNegation node); + visitSupportsConjunction(SupportsConjunction node); + visitSupportsDisjunction(SupportsDisjunction node); visitMediaExpression(MediaExpression node); visitMediaQuery(MediaQuery node); visitMediaDirective(MediaDirective node); @@ -158,6 +163,27 @@ class Visitor implements VisitorBase { _visitNodeList(node.groupRuleBody); } + visitSupportsDirective(SupportsDirective node) { + node.condition.visit(this); + _visitNodeList(node.groupRuleBody); + } + + visitSupportsConditionInParens(SupportsConditionInParens node) { + node.condition.visit(this); + } + + visitSupportsNegation(SupportsNegation node) { + node.condition.visit(this); + } + + visitSupportsConjunction(SupportsConjunction node) { + _visitNodeList(node.conditions); + } + + visitSupportsDisjunction(SupportsDisjunction node) { + _visitNodeList(node.conditions); + } + visitMediaDirective(MediaDirective node) { for (var mediaQuery in node.mediaQueries) { visitMediaQuery(mediaQuery); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index c301c633b..a9a51cb22 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -10,6 +10,14 @@ import 'package:test/test.dart'; import 'testing.dart'; +void expectCss(String css, String expected) { + var errors = []; + var styleSheet = parseCss(css, errors: errors, opts: simpleOptions); + expect(styleSheet, isNotNull); + expect(errors, isEmpty); + expect(prettyPrint(styleSheet), expected); +} + void testSimpleTerms() { var errors = []; final String input = r''' @@ -517,6 +525,84 @@ div { expect(prettyPrint(styleSheet), expected); } +void testSupports() { + // Test single declaration condition. + var css = ''' +@supports (-webkit-appearance: none) { + div { + -webkit-appearance: none; + } +}'''; + var expected = '''@supports (-webkit-appearance: none) { +div { + -webkit-appearance: none; +} +}'''; + expectCss(css, expected); + + // Test negation. + css = ''' +@supports not ( display: flex ) { + body { width: 100%; } +}'''; + expected = '''@supports not (display: flex) { +body { + width: 100%; +} +}'''; + expectCss(css, expected); + + // Test clause with multiple conditions. + css = ''' +@supports (box-shadow: 0 0 2px black inset) or + (-moz-box-shadow: 0 0 2px black inset) or + (-webkit-box-shadow: 0 0 2px black inset) or + (-o-box-shadow: 0 0 2px black inset) { + .box { + box-shadow: 0 0 2px black inset; + } +}'''; + expected = '@supports (box-shadow: 0 0 2px #000 inset) or ' + + '(-moz-box-shadow: 0 0 2px #000 inset) or ' + + '(-webkit-box-shadow: 0 0 2px #000 inset) or ' + + '(-o-box-shadow: 0 0 2px #000 inset) {\n' + + '.box {\n' + + ' box-shadow: 0 0 2px #000 inset;\n' + + '}\n' + + '}'; + expectCss(css, expected); + + // Test conjunction and disjunction together. + css = ''' +@supports ((transition-property: color) or (animation-name: foo)) and + (transform: rotate(10deg)) { + div { + transition-property: color; + transform: rotate(10deg); + } +}'''; + + expected = '@supports ' + + '((transition-property: color) or (animation-name: foo)) and ' + + '(transform: rotate(10deg)) {\n' + + 'div {\n' + + ' transition-property: color;\n' + + ' transform: rotate(10deg);\n' + + '}\n' + + '}'; + expectCss(css, expected); + + // Test that operators can't be mixed without parentheses. + css = '@supports (a: 1) and (b: 2) or (c: 3) {}'; + var errors = []; + var styleSheet = parseCss(css, errors: errors, opts: simpleOptions); + expect(styleSheet, isNotNull); + expect(errors, isNotEmpty); + expect(errors.first.message, + "Operators can't be mixed without a layer of parentheses"); + expect(errors.first.span.text, 'or'); +} + void testFontFace() { var errors = []; @@ -689,7 +775,7 @@ div { color: green !important; } '''; - final String generated = "div { color: green!important; }"; + final String generated = "div { color:green!important; }"; var stylesheet = parseCss(input, errors: errors); @@ -1184,6 +1270,7 @@ main() { test('Newer CSS', testNewerCss); test('Media Queries', testMediaQueries); test('Document', testMozDocument); + test('Supports', testSupports); test('Font-Face', testFontFace); test('CSS file', testCssFile); test('Compact Emitter', testCompactEmitter); From cfc15eb2fb39943719d4d588082c5f89f62b8caf Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 12 Apr 2017 10:57:10 -0700 Subject: [PATCH 083/245] Updates version and changelog. --- pkgs/csslib/CHANGELOG.md | 5 +++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 7c5222d71..c6caa1cb4 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.13.5 + +* Adds supports for `@document`. +* Adds supports for `@supports`. + ## 0.13.4 * Parses CSS 2.1 pseudo-elements as pseudo-elements instead of pseudo-classes. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 0e2e7daa9..81c97a85c 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.4 +version: 0.13.5 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 5248484ac1badc56e7d860b4f8932e73991a8578 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 12 Apr 2017 11:00:09 -0700 Subject: [PATCH 084/245] Updates changelog to reflect vendor specific rule. --- pkgs/csslib/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index c6caa1cb4..3d83b2b32 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.13.5 -* Adds supports for `@document`. -* Adds supports for `@supports`. +* Adds support for `@-moz-document`. +* Adds support for `@supports`. ## 0.13.4 From 8b5eae375b1fcbe53f76f6a93c5a62c09314b2cf Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 5 May 2017 16:03:55 -0700 Subject: [PATCH 085/245] Adds support for @viewport Fixes dart-lang/csslib#42. --- pkgs/csslib/lib/parser.dart | 10 +++++++++ pkgs/csslib/lib/src/css_printer.dart | 6 +++++ pkgs/csslib/lib/src/tokenkind.dart | 4 ++++ pkgs/csslib/lib/src/tree.dart | 13 +++++++++++ pkgs/csslib/lib/src/tree_printer.dart | 7 ++++++ pkgs/csslib/lib/visitor.dart | 5 +++++ pkgs/csslib/test/declaration_test.dart | 31 ++++++++++++++++++++++++++ 7 files changed, 76 insertions(+) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 4c65a2996..35f9133fe 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -781,6 +781,9 @@ class _Parser { return processDocumentDirective(); case TokenKind.DIRECTIVE_SUPPORTS: return processSupportsDirective(); + case TokenKind.DIRECTIVE_VIEWPORT: + case TokenKind.DIRECTIVE_MS_VIEWPORT: + return processViewportDirective(); } return null; } @@ -1122,6 +1125,13 @@ class _Parser { return new SupportsConditionInParens(declaration, _makeSpan(start)); } + ViewportDirective processViewportDirective() { + var start = _peekToken.span; + var name = _next().text; + var declarations = processDeclarations(); + return new ViewportDirective(name, declarations, _makeSpan(start)); + } + RuleSet processRuleSet([SelectorGroup selectorGroup]) { if (selectorGroup == null) { selectorGroup = processSelectorGroup(); diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 0304fd71c..79bcaed1d 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -128,6 +128,12 @@ class CssPrinter extends Visitor { } } + void visitViewportDirective(ViewportDirective node) { + emit('@${node.name}$_sp{$_newLine'); + node.declarations.visit(this); + emit('}'); + } + void visitMediaDirective(MediaDirective node) { emit('$_newLine@media'); emitMediaQueries(node.mediaQueries); diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index 48696abb8..14cf3c9ad 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -163,6 +163,8 @@ class TokenKind { static const int DIRECTIVE_EXTEND = 657; static const int DIRECTIVE_MOZ_DOCUMENT = 658; static const int DIRECTIVE_SUPPORTS = 659; + static const int DIRECTIVE_VIEWPORT = 660; + static const int DIRECTIVE_MS_VIEWPORT = 661; // Media query operators static const int MEDIA_OP_ONLY = 665; // Unary. @@ -222,6 +224,8 @@ class TokenKind { const {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'}, const {'type': TokenKind.DIRECTIVE_MOZ_DOCUMENT, 'value': '-moz-document'}, const {'type': TokenKind.DIRECTIVE_SUPPORTS, 'value': 'supports'}, + const {'type': TokenKind.DIRECTIVE_VIEWPORT, 'value': 'viewport'}, + const {'type': TokenKind.DIRECTIVE_MS_VIEWPORT, 'value': '-ms-viewport'}, ]; static const List> MEDIA_OPERATORS = const [ diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index d6b9dbfb2..509e708fb 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -540,6 +540,19 @@ class SupportsDisjunction extends SupportsCondition { visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this); } +class ViewportDirective extends Directive { + final String name; + final DeclarationGroup declarations; + + ViewportDirective(this.name, this.declarations, SourceSpan span) + : super(span); + + ViewportDirective clone() => + new ViewportDirective(name, declarations.clone(), span); + + visit(VisitorBase visitor) => visitor.visitViewportDirective(this); +} + class ImportDirective extends Directive { /** import name specified. */ final String import; diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 7ae67e48d..ba35dec47 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -134,6 +134,13 @@ class _TreePrinter extends Visitor { output.depth--; } + void visitViewportDirective(ViewportDirective node) { + heading('ViewportDirective', node); + output.depth++; + super.visitViewportDirective(node); + output.depth--; + } + void visitPageDirective(PageDirective node) { heading('PageDirective', node); output.depth++; diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index ad94033fa..eff9e7b6c 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -26,6 +26,7 @@ abstract class VisitorBase { visitSupportsNegation(SupportsNegation node); visitSupportsConjunction(SupportsConjunction node); visitSupportsDisjunction(SupportsDisjunction node); + visitViewportDirective(ViewportDirective node); visitMediaExpression(MediaExpression node); visitMediaQuery(MediaQuery node); visitMediaDirective(MediaDirective node); @@ -184,6 +185,10 @@ class Visitor implements VisitorBase { _visitNodeList(node.conditions); } + visitViewportDirective(ViewportDirective node) { + node.declarations.visit(this); + } + visitMediaDirective(MediaDirective node) { for (var mediaQuery in node.mediaQueries) { visitMediaQuery(mediaQuery); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index a9a51cb22..9236b1278 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -603,6 +603,36 @@ body { expect(errors.first.span.text, 'or'); } +void testViewport() { + // No declarations. + var css = '@viewport {\n}'; + expectCss(css, css); + + // All declarations. + css = ''' +@viewport { + min-width: auto; + max-width: 800px; + width: 400px; + min-height: 50%; + max-height: 200px; + height: 100px 200px; + zoom: auto; + min-zoom: 0.75; + max-zoom: 40%; + user-zoom: fixed; + orientation: landscape; +}'''; + expectCss(css, css); + + // Vendor specific. + css = ''' +@-ms-viewport { + width: device-width; +}'''; + expectCss(css, css); +} + void testFontFace() { var errors = []; @@ -1271,6 +1301,7 @@ main() { test('Media Queries', testMediaQueries); test('Document', testMozDocument); test('Supports', testSupports); + test('Viewport', testViewport); test('Font-Face', testFontFace); test('CSS file', testCssFile); test('Compact Emitter', testCompactEmitter); From 819f874bc1036f42263b417c9d9daa69c0e3d87d Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Mon, 8 May 2017 11:24:37 -0700 Subject: [PATCH 086/245] Fixes @media and invalid test cases (dart-lang/csslib#47) * Fixes @media and invalid test cases The parser now supports media queries with expressionless media features (no trailing `: `). For example: @media all and (transform-3d) {} Also adds missing AND operators to test cases which had expressions immediately following the media type. Fixes dart-lang/csslib#44. * Adds more tests and fixes query list parsing Changing how media queries are parsed introduced a regression where parsing a malformed media query list would consume tokens past the initial point of failure. --- pkgs/csslib/lib/parser.dart | 73 +++++++++++--------------- pkgs/csslib/lib/src/css_printer.dart | 11 ++-- pkgs/csslib/test/declaration_test.dart | 32 +++++++---- 3 files changed, 61 insertions(+), 55 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 35f9133fe..098079fb8 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -375,27 +375,19 @@ class _Parser { List processMediaQueryList() { var mediaQueries = []; - bool firstTime = true; - var mediaQuery; do { - mediaQuery = processMediaQuery(firstTime == true); + var mediaQuery = processMediaQuery(); if (mediaQuery != null) { mediaQueries.add(mediaQuery); - firstTime = false; - continue; + } else { + break; } - - // Any more more media types separated by comma. - if (!_maybeEat(TokenKind.COMMA)) break; - - // Yep more media types start again. - firstTime = true; - } while ((!firstTime && mediaQuery != null) || firstTime); + } while (_maybeEat(TokenKind.COMMA)); return mediaQueries; } - MediaQuery processMediaQuery([bool startQuery = true]) { + MediaQuery processMediaQuery() { // Grammar: [ONLY | NOT]? S* media_type S* // [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]* @@ -407,41 +399,39 @@ class _Parser { var unaryOp = TokenKind.matchMediaOperator(op, 0, opLen); if (unaryOp != -1) { if (isChecked) { - if (startQuery && unaryOp != TokenKind.MEDIA_OP_NOT || + if (unaryOp != TokenKind.MEDIA_OP_NOT || unaryOp != TokenKind.MEDIA_OP_ONLY) { _warning("Only the unary operators NOT and ONLY allowed", _makeSpan(start)); } - if (!startQuery && unaryOp != TokenKind.MEDIA_OP_AND) { - _warning("Only the binary AND operator allowed", _makeSpan(start)); - } } _next(); start = _peekToken.span; } var type; - if (startQuery && unaryOp != TokenKind.MEDIA_OP_AND) { - // Get the media type. - if (_peekIdentifier()) type = identifier(); - } + // Get the media type. + if (_peekIdentifier()) type = identifier(); var exprs = []; - if (unaryOp == -1 || unaryOp == TokenKind.MEDIA_OP_AND) { - var andOp = false; - while (true) { - var expr = processMediaExpression(andOp); - if (expr == null) break; - - exprs.add(expr); + while (true) { + // Parse AND if query has a media_type or previous expression. + var andOp = exprs.isNotEmpty || type != null; + if (andOp) { op = _peekToken.text; opLen = op.length; - andOp = TokenKind.matchMediaOperator(op, 0, opLen) == - TokenKind.MEDIA_OP_AND; - if (!andOp) break; + if (TokenKind.matchMediaOperator(op, 0, opLen) != + TokenKind.MEDIA_OP_AND) { + break; + } _next(); } + + var expr = processMediaExpression(andOp); + if (expr == null) break; + + exprs.add(expr); } if (unaryOp != -1 || type != null || exprs.length > 0) { @@ -457,17 +447,16 @@ class _Parser { if (_maybeEat(TokenKind.LPAREN)) { if (_peekIdentifier()) { var feature = identifier(); // Media feature. - while (_maybeEat(TokenKind.COLON)) { - var startExpr = _peekToken.span; - var exprs = processExpr(); - if (_maybeEat(TokenKind.RPAREN)) { - return new MediaExpression( - andOperator, feature, exprs, _makeSpan(startExpr)); - } else if (isChecked) { - _warning("Missing parenthesis around media expression", - _makeSpan(start)); - return null; - } + var exprs = _maybeEat(TokenKind.COLON) + ? processExpr() + : new Expressions(_makeSpan(_peekToken.span)); + if (_maybeEat(TokenKind.RPAREN)) { + return new MediaExpression( + andOperator, feature, exprs, _makeSpan(start)); + } else if (isChecked) { + _warning( + "Missing parenthesis around media expression", _makeSpan(start)); + return null; } } else if (isChecked) { _warning("Missing media feature in media expression", _makeSpan(start)); diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 79bcaed1d..ac26acb2b 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -54,8 +54,11 @@ class CssPrinter extends Visitor { void visitMediaExpression(MediaExpression node) { emit(node.andOperator ? ' AND ' : ' '); - emit('(${node.mediaFeature}:'); - visitExpressions(node.exprs); + emit('(${node.mediaFeature}'); + if (node.exprs.expressions.isNotEmpty) { + emit(':'); + visitExpressions(node.exprs); + } emit(')'); } @@ -68,11 +71,11 @@ class CssPrinter extends Visitor { } } - void emitMediaQueries(queries) { + void emitMediaQueries(List queries) { var queriesLen = queries.length; for (var i = 0; i < queriesLen; i++) { var query = queries[i]; - if (query.hasMediaType && i > 0) emit(','); + if (i > 0) emit(','); visitMediaQuery(query); } } diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 9236b1278..1cec21ee1 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -411,13 +411,13 @@ void testMediaQueries() { input = ''' @media only screen and (min-device-width: 4000px) and - (min-device-height: 2000px), screen (another: 100px) { + (min-device-height: 2000px), screen AND (another: 100px) { html { font-size: 10em; } }'''; generated = '@media ONLY screen AND (min-device-width:4000px) ' - 'AND (min-device-height:2000px), screen (another:100px) {\n' + 'AND (min-device-height:2000px), screen AND (another:100px) {\n' 'html {\n font-size: 10em;\n}\n}'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -427,14 +427,14 @@ void testMediaQueries() { expect(prettyPrint(stylesheet), generated); input = ''' -@media screen,print (min-device-width: 4000px) and - (min-device-height: 2000px), screen (another: 100px) { +@media screen,print AND (min-device-width: 4000px) and + (min-device-height: 2000px), screen AND (another: 100px) { html { font-size: 10em; } }'''; - generated = '@media screen, print (min-device-width:4000px) AND ' - '(min-device-height:2000px), screen (another:100px) {\n' + generated = '@media screen, print AND (min-device-width:4000px) AND ' + '(min-device-height:2000px), screen AND (another:100px) {\n' 'html {\n font-size: 10em;\n}\n}'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -444,15 +444,29 @@ void testMediaQueries() { expect(prettyPrint(stylesheet), generated); input = ''' -@import "test.css" ONLY screen, NOT print (min-device-width: 4000px);'''; - generated = - '@import "test.css" ONLY screen, NOT print (min-device-width:4000px);'; +@import "test.css" ONLY screen, NOT print AND (min-device-width: 4000px);'''; + generated = '@import "test.css" ONLY screen, ' + 'NOT print AND (min-device-width:4000px);'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); + + var css = '@media (min-device-width:400px) {\n}'; + expectCss(css, css); + + css = '@media all AND (tranform-3d), (-webkit-transform-3d) {\n}'; + expectCss(css, css); + + // Test that AND operator is required between media type and expressions. + css = '@media screen (min-device-width:400px'; + stylesheet = parseCss(css, errors: errors..clear(), opts: simpleOptions); + expect(errors, isNotEmpty); + expect( + errors.first.message, contains('expected { after media before ruleset')); + expect(errors.first.span.text, '('); } void testMozDocument() { From 78421c798a4596d66097ac3c46a3418d31114228 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Mon, 8 May 2017 13:46:39 -0700 Subject: [PATCH 087/245] Prevents exception for invalid dimension terms While running outside of checked mode, parsing an invalid term expression followed by a known dimension unit like width: Infinity%; caused the following exception to be thrown: The getter 'text' was called on null. Receiver: null Instead the parser now discards the invalid term, likely resulting in a useful error message indicating the source of failure such as error on ...: expected }, but found % width: Infinity%; ^ Fixes dart-lang/csslib#43. --- pkgs/csslib/lib/parser.dart | 2 +- pkgs/csslib/test/declaration_test.dart | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 4c65a2996..9903b4c44 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2476,7 +2476,7 @@ class _Parser { break; } - return processDimension(t, value, _makeSpan(start)); + return t != null ? processDimension(t, value, _makeSpan(start)) : null; } /** Process all dimension units. */ diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index a9a51cb22..05e504dd7 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -69,6 +69,17 @@ void testSimpleTerms() { expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); + + // Regression test to ensure invalid percentages don't throw an exception and + // instead print a useful error message when not in checked mode. + var css = ''' +.foo { + width: Infinity%; +}'''; + stylesheet = parseCss(css, errors: errors..clear(), opts: simpleOptions); + expect(errors, isNotEmpty); + expect(errors.first.message, 'expected }, but found %'); + expect(errors.first.span.text, '%'); } /** From a4b30b9acce996ce3a1e583bb58c63067fcb1c85 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Mon, 8 May 2017 14:19:30 -0700 Subject: [PATCH 088/245] Adds support for vendor-prefixed calc() Fixes dart-lang/csslib#45. --- pkgs/csslib/lib/parser.dart | 2 +- pkgs/csslib/test/declaration_test.dart | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 4c65a2996..54f3f4db9 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2693,7 +2693,7 @@ class _Parser { var start = _peekToken.span; var name = func.name; - if (name == 'calc') { + if (name == 'calc' || name == '-webkit-calc' || name == '-moz-calc') { // TODO(terry): Implement expression parsing properly. String expression = processCalcExpression(); var calcExpr = new LiteralTerm(expression, expression, _makeSpan(start)); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index a9a51cb22..199322b13 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -1260,6 +1260,20 @@ void selectorWithCalcs() { expect(prettyPrint(stylesheet), generated); } +void vendorPrefixedCalc() { + var css = ''' +.foo { + width: -webkit-calc((100% - 15px*1) / 1); +}'''; + expectCss(css, css); + + css = ''' +.foo { + width: -moz-calc((100% - 15px*1) / 1); +}'''; + expectCss(css, css); +} + main() { test('Simple Terms', testSimpleTerms); test('Declarations', testDeclarations); @@ -1286,5 +1300,6 @@ main() { test('single complex', complexCalc); test('two calc terms for same declaration', twoCalcs); test('selector with many calc declarations', selectorWithCalcs); + test('vendor prefixed calc', vendorPrefixedCalc); }); } From 8e9e0a3afdcab9905fdf8ae2a218b2da08d1ab55 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 12 May 2017 14:07:45 -0700 Subject: [PATCH 089/245] Updates version and changelog --- pkgs/csslib/CHANGELOG.md | 9 +++++++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 3d83b2b32..e23bdf8f1 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,12 @@ +## 0.13.6 + +* Adds support for `@viewport`. +* Adds support for `-webkit-calc()` and `-moz-calc()`. +* Adds support for querying media features without specifying an expression. For + example: `@media (transform-3d) { ... }`. +* Prevents exception being thrown for invalid dimension terms, and instead + issues an error. + ## 0.13.5 * Adds support for `@-moz-document`. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 81c97a85c..8ed29b650 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.5 +version: 0.13.6 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From c7033bcba3673d90591c9a9e72a47417afa89741 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 17 May 2017 12:00:22 -0700 Subject: [PATCH 090/245] Supports mixing /* */ and comments (dart-lang/csslib#53) The tokenizer had no context of which kind of comment it was processing and would terminate upon seeing any comment ending. Fixes failing test added in dart-lang/csslib#51. --- pkgs/csslib/lib/src/tokenizer.dart | 29 +++++++++++++++++--------- pkgs/csslib/test/declaration_test.dart | 11 ++++++++++ 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index d7677f9f2..0b0661a86 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -149,7 +149,7 @@ class Tokenizer extends TokenizerBase { if (_maybeEatChar(TokenChar.BANG)) { if (_maybeEatChar(TokenChar.MINUS) && _maybeEatChar(TokenChar.MINUS)) { - return finishMultiLineComment(); + return finishHtmlComment(); } else if (_maybeEatChar(TokenChar.LBRACK) && _maybeEatChar(CDATA_NAME[0]) && _maybeEatChar(CDATA_NAME[1]) && @@ -393,19 +393,11 @@ class Tokenizer extends TokenizerBase { return _finishToken(TokenKind.HEX_RANGE); } - Token finishMultiLineComment() { + Token finishHtmlComment() { while (true) { int ch = _nextChar(); if (ch == 0) { return _finishToken(TokenKind.INCOMPLETE_COMMENT); - } else if (ch == 42 /*'*'*/) { - if (_maybeEatChar(47 /*'/'*/)) { - if (_inString) { - return next(); - } else { - return _finishToken(TokenKind.COMMENT); - } - } } else if (ch == TokenChar.MINUS) { /* Check if close part of Comment Definition --> (CDC). */ if (_maybeEatChar(TokenChar.MINUS)) { @@ -420,6 +412,23 @@ class Tokenizer extends TokenizerBase { } } } + + Token finishMultiLineComment() { + while (true) { + int ch = _nextChar(); + if (ch == 0) { + return _finishToken(TokenKind.INCOMPLETE_COMMENT); + } else if (ch == 42 /*'*'*/) { + if (_maybeEatChar(47 /*'/'*/)) { + if (_inString) { + return next(); + } else { + return _finishToken(TokenKind.COMMENT); + } + } + } + } + } } /** Static helper methods. */ diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index af6fdefcf..782c33c86 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -1260,6 +1260,16 @@ void testExpressionSpans() { expect((decl as Declaration).expression.span.text, '50px'); } +void testComments() { + final css = '''/* This comment has a nested HTML comment... +* +* +*
+* +*/'''; + expectCss(css, ''); +} + void simpleCalc() { final input = r'''.foo { height: calc(100% - 55px); }'''; var stylesheet = parseCss(input); @@ -1351,6 +1361,7 @@ main() { test('Expression spans', testExpressionSpans, skip: 'expression spans are broken' ' (https://github.com/dart-lang/csslib/issues/15)'); + test('Comments', testComments); group('calc function', () { test('simple calc', simpleCalc); test('single complex', complexCalc); From ef93b934a9689552d4e1f817fad40b67af4250e7 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 17 May 2017 12:00:43 -0700 Subject: [PATCH 091/245] Supports at-rules nested within at-rules (dart-lang/csslib#52) * Supports at-rules nested within at-rules Fixes dart-lang/csslib#50. * Rename `processRuleSet()` to `processRule()` --- pkgs/csslib/lib/parser.dart | 60 ++++++++++++-------------- pkgs/csslib/lib/src/analyzer.dart | 4 +- pkgs/csslib/lib/src/css_printer.dart | 4 +- pkgs/csslib/lib/src/tree.dart | 36 ++++++++-------- pkgs/csslib/lib/src/tree_printer.dart | 4 +- pkgs/csslib/lib/visitor.dart | 14 ++---- pkgs/csslib/test/declaration_test.dart | 24 +++++++++++ 7 files changed, 79 insertions(+), 67 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index cd4f6c00b..6688507d5 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -211,17 +211,11 @@ class _Parser { var start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) { // TODO(terry): Need to handle charset. - var directive = processDirective(); - if (directive != null) { - productions.add(directive); - _maybeEat(TokenKind.SEMICOLON); + final rule = processRule(); + if (rule != null) { + productions.add(rule); } else { - RuleSet ruleset = processRuleSet(); - if (ruleset != null) { - productions.add(ruleset); - } else { - break; - } + break; } } @@ -523,12 +517,12 @@ class _Parser { // Any medias? var media = processMediaQueryList(); - List rulesets = []; + List rules = []; if (_maybeEat(TokenKind.LBRACE)) { while (!_maybeEat(TokenKind.END_OF_FILE)) { - RuleSet ruleset = processRuleSet(); - if (ruleset == null) break; - rulesets.add(ruleset); + final rule = processRule(); + if (rule == null) break; + rules.add(rule); } if (!_maybeEat(TokenKind.RBRACE)) { @@ -537,17 +531,17 @@ class _Parser { } else { _error('expected { after media before ruleset', _peekToken.span); } - return new MediaDirective(media, rulesets, _makeSpan(start)); + return new MediaDirective(media, rules, _makeSpan(start)); case TokenKind.DIRECTIVE_HOST: _next(); - List rulesets = []; + List rules = []; if (_maybeEat(TokenKind.LBRACE)) { while (!_maybeEat(TokenKind.END_OF_FILE)) { - RuleSet ruleset = processRuleSet(); - if (ruleset == null) break; - rulesets.add(ruleset); + final rule = processRule(); + if (rule == null) break; + rules.add(rule); } if (!_maybeEat(TokenKind.RBRACE)) { @@ -556,7 +550,7 @@ class _Parser { } else { _error('expected { after host before ruleset', _peekToken.span); } - return new HostDirective(rulesets, _makeSpan(start)); + return new HostDirective(rules, _makeSpan(start)); case TokenKind.DIRECTIVE_PAGE: /* @@ -708,11 +702,11 @@ class _Parser { start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE)) { - RuleSet ruleset = processRuleSet(); - if (ruleset == null) { + final rule = processRule(); + if (rule == null) { break; } - productions.add(ruleset); + productions.add(rule); } _eat(TokenKind.RBRACE); @@ -1121,8 +1115,13 @@ class _Parser { return new ViewportDirective(name, declarations, _makeSpan(start)); } - RuleSet processRuleSet([SelectorGroup selectorGroup]) { + TreeNode processRule([SelectorGroup selectorGroup]) { if (selectorGroup == null) { + final directive = processDirective(); + if (directive != null) { + _maybeEat(TokenKind.SEMICOLON); + return directive; + } selectorGroup = processSelectorGroup(); } if (selectorGroup != null) { @@ -1135,14 +1134,9 @@ class _Parser { List processGroupRuleBody() { var nodes = []; while (!(_peekKind(TokenKind.RBRACE) || _peekKind(TokenKind.END_OF_FILE))) { - var directive = processDirective(); - if (directive != null) { - nodes.add(directive); - continue; - } - var ruleSet = processRuleSet(); - if (ruleSet != null) { - nodes.add(ruleSet); + var rule = processRule(); + if (rule != null) { + nodes.add(rule); continue; } break; @@ -1211,7 +1205,7 @@ class _Parser { var selectorGroup = _nestedSelector(); while (selectorGroup != null) { // Nested selector so process as a ruleset. - var ruleset = processRuleSet(selectorGroup); + var ruleset = processRule(selectorGroup); decls.add(ruleset); selectorGroup = _nestedSelector(); } diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 7c7372cf2..6c6ba6d61 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -415,9 +415,9 @@ class _MediaRulesReplacer extends Visitor { _MediaRulesReplacer(this._ruleSet, this._newRules); visitMediaDirective(MediaDirective node) { - var index = node.rulesets.indexOf(_ruleSet); + var index = node.rules.indexOf(_ruleSet); if (index != -1) { - node.rulesets.insertAll(index + 1, _newRules); + node.rules.insertAll(index + 1, _newRules); _foundAndReplaced = true; } } diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index ac26acb2b..91c28612d 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -141,7 +141,7 @@ class CssPrinter extends Visitor { emit('$_newLine@media'); emitMediaQueries(node.mediaQueries); emit('$_sp{'); - for (var ruleset in node.rulesets) { + for (var ruleset in node.rules) { ruleset.visit(this); } emit('$_newLine}'); @@ -149,7 +149,7 @@ class CssPrinter extends Visitor { void visitHostDirective(HostDirective node) { emit('$_newLine@host$_sp{'); - for (var ruleset in node.rulesets) { + for (var ruleset in node.rules) { ruleset.visit(this); } emit('$_newLine}'); diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 509e708fb..7e684734b 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -638,9 +638,9 @@ class MediaQuery extends TreeNode { class MediaDirective extends Directive { final List mediaQueries; - final List rulesets; + final List rules; - MediaDirective(this.mediaQueries, this.rulesets, SourceSpan span) + MediaDirective(this.mediaQueries, this.rules, SourceSpan span) : super(span); MediaDirective clone() { @@ -648,27 +648,27 @@ class MediaDirective extends Directive { for (var mediaQuery in mediaQueries) { cloneQueries.add(mediaQuery.clone()); } - var cloneRulesets = []; - for (var ruleset in rulesets) { - cloneRulesets.add(ruleset.clone()); + var cloneRules = []; + for (var rule in rules) { + cloneRules.add(rule.clone()); } - return new MediaDirective(cloneQueries, cloneRulesets, span); + return new MediaDirective(cloneQueries, cloneRules, span); } visit(VisitorBase visitor) => visitor.visitMediaDirective(this); } class HostDirective extends Directive { - final List rulesets; + final List rules; - HostDirective(this.rulesets, SourceSpan span) : super(span); + HostDirective(this.rules, SourceSpan span) : super(span); HostDirective clone() { - var cloneRulesets = []; - for (var ruleset in rulesets) { - cloneRulesets.add(ruleset.clone()); + var cloneRules = []; + for (var rule in rules) { + cloneRules.add(rule.clone()); } - return new HostDirective(cloneRulesets, span); + return new HostDirective(cloneRules, span); } visit(VisitorBase visitor) => visitor.visitHostDirective(this); @@ -771,20 +771,20 @@ class FontFaceDirective extends Directive { class StyletDirective extends Directive { final String dartClassName; - final List rulesets; + final List rules; - StyletDirective(this.dartClassName, this.rulesets, SourceSpan span) + StyletDirective(this.dartClassName, this.rules, SourceSpan span) : super(span); bool get isBuiltIn => false; bool get isExtension => true; StyletDirective clone() { - var cloneRulesets = []; - for (var ruleset in rulesets) { - cloneRulesets.add(ruleset.clone()); + var cloneRules = []; + for (var rule in rules) { + cloneRules.add(rule.clone()); } - return new StyletDirective(dartClassName, cloneRulesets, span); + return new StyletDirective(dartClassName, cloneRules, span); } visit(VisitorBase visitor) => visitor.visitStyletDirective(this); diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index ba35dec47..4f196c03a 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -85,7 +85,7 @@ class _TreePrinter extends Visitor { heading('MediaDirective', node); output.depth++; output.writeNodeList('media queries', node.mediaQueries); - output.writeNodeList('rule sets', node.rulesets); + output.writeNodeList('rule sets', node.rules); super.visitMediaDirective(node); output.depth--; } @@ -191,7 +191,7 @@ class _TreePrinter extends Visitor { heading('StyletDirective', node); output.writeValue('dartClassName', node.dartClassName); output.depth++; - output.writeNodeList('rulesets', node.rulesets); + output.writeNodeList('rulesets', node.rules); output.depth--; } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index eff9e7b6c..6e3af1833 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -190,18 +190,12 @@ class Visitor implements VisitorBase { } visitMediaDirective(MediaDirective node) { - for (var mediaQuery in node.mediaQueries) { - visitMediaQuery(mediaQuery); - } - for (var ruleset in node.rulesets) { - visitRuleSet(ruleset); - } + _visitNodeList(node.mediaQueries); + _visitNodeList(node.rules); } visitHostDirective(HostDirective node) { - for (var ruleset in node.rulesets) { - visitRuleSet(ruleset); - } + _visitNodeList(node.rules); } visitPageDirective(PageDirective node) { @@ -237,7 +231,7 @@ class Visitor implements VisitorBase { } visitStyletDirective(StyletDirective node) { - _visitNodeList(node.rulesets); + _visitNodeList(node.rules); } visitNamespaceDirective(NamespaceDirective node) {} diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 782c33c86..ab1f70df0 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -478,6 +478,30 @@ void testMediaQueries() { expect( errors.first.message, contains('expected { after media before ruleset')); expect(errors.first.span.text, '('); + + // Test nested at-rules. + input = ''' +@media (min-width: 840px) { + .cell { + width: calc(33% - 16px); + } + @supports (display: grid) { + .cell { + grid-column-end: span 4; + } + } +}'''; + generated = '''@media (min-width:840px) { +.cell { + width: calc(33% - 16px); +} +@supports (display: grid) { +.cell { + grid-column-end: span 4; +} +} +}'''; + expectCss(input, generated); } void testMozDocument() { From b65e1e06567b70c63bd842989546c041f82e8368 Mon Sep 17 00:00:00 2001 From: Jarrett Tierney Date: Thu, 18 May 2017 10:19:58 -0700 Subject: [PATCH 092/245] Added a samples test to test csslib on common css frameworks (dart-lang/csslib#51) * Added a samples test to test csslib on common css frameworks * Cleaning up the test and having crawl the files * Removed unnecessary cast * Formatting test file * Switching the script folder detection to mirrors --- pkgs/csslib/test/examples/base.css | 2057 +++++ pkgs/csslib/test/examples/boilerplate.css | 282 + pkgs/csslib/test/examples/bootstrap.css | 9320 +++++++++++++++++++++ pkgs/csslib/test/examples/bulma.css | 7128 ++++++++++++++++ pkgs/csslib/test/examples/foundation.css | 4398 ++++++++++ pkgs/csslib/test/examples/materialize.css | 8952 ++++++++++++++++++++ pkgs/csslib/test/examples/mdc-card.css | 412 + pkgs/csslib/test/examples/mdc-layout.css | 434 + pkgs/csslib/test/examples/pure.css | 1507 ++++ pkgs/csslib/test/examples/skeleton.css | 418 + pkgs/csslib/test/samples_test.dart | 32 + 11 files changed, 34940 insertions(+) create mode 100644 pkgs/csslib/test/examples/base.css create mode 100644 pkgs/csslib/test/examples/boilerplate.css create mode 100644 pkgs/csslib/test/examples/bootstrap.css create mode 100644 pkgs/csslib/test/examples/bulma.css create mode 100644 pkgs/csslib/test/examples/foundation.css create mode 100644 pkgs/csslib/test/examples/materialize.css create mode 100644 pkgs/csslib/test/examples/mdc-card.css create mode 100644 pkgs/csslib/test/examples/mdc-layout.css create mode 100644 pkgs/csslib/test/examples/pure.css create mode 100644 pkgs/csslib/test/examples/skeleton.css create mode 100644 pkgs/csslib/test/samples_test.dart diff --git a/pkgs/csslib/test/examples/base.css b/pkgs/csslib/test/examples/base.css new file mode 100644 index 000000000..d2f27937b --- /dev/null +++ b/pkgs/csslib/test/examples/base.css @@ -0,0 +1,2057 @@ +/* ========================================================================== + +// Base Stylesheet - http://getbase.org +// Author: Matthew Hartman - http://www.matthewhartman.com.au/ +// Version: 3.3.0 - Last Updated: May 14, 2017 + +========================================================================== */ +*, *:before, *:after { + box-sizing: border-box; } + +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; } + +html, button, input, select, textarea { + font-family: inherit; } + +article, aside, details, figcaption, figure, footer, header, main, menu, nav, section, summary { + display: block; } + +body, form, fieldset, legend, input, select, textarea, button { + margin: 0; } + +audio:not([controls]) { + display: none; + height: 0; } + +audio, canvas, progress, video { + display: inline-block; } + +progress { + vertical-align: baseline; } + +[hidden], template { + display: none; } + +img { + border-style: none; } + +svg:not(:root) { + overflow: hidden; } + +body { + font-family: sans-serif; + font-size: 16px; + font-size: 1rem; + line-height: 22px; + line-height: 1.375rem; + color: #000; + font-weight: 400; + background: #fff; } + +p { + margin: 0 0 20px 0; } + +a { + color: #000; + text-decoration: underline; + background-color: transparent; + -webkit-text-decoration-skip: objects; } + a:active, a:hover { + color: #000; + outline-width: 0; + text-decoration: none; } + +h1, h2, h3, h4, h5, h6 { + font-family: sans-serif; + margin: 0; } + +h1, .fs-1 { + font-size: 32px; + font-size: 2rem; + line-height: 38px; + line-height: 2.375rem; } + +h2, .fs-2 { + font-size: 26px; + font-size: 1.625rem; + line-height: 32px; + line-height: 2rem; } + +h3, .fs-3 { + font-size: 22px; + font-size: 1.375rem; + line-height: 28px; + line-height: 1.75rem; } + +h4, .fs-4 { + font-size: 18px; + font-size: 1.125rem; + line-height: 24px; + line-height: 1.5rem; } + +h5, .fs-5 { + font-size: 16px; + font-size: 1rem; + line-height: 22px; + line-height: 1.375rem; } + +h6, .fs-6 { + font-size: 14px; + font-size: 0.875rem; + line-height: 20px; + line-height: 1.25rem; } + +h1 { + margin-bottom: .5em; + color: #000; + font-weight: 700; } + +h2 { + margin-bottom: .2em; + color: #000; + font-weight: 700; } + +h3 { + margin-bottom: .2em; + color: #000; + font-weight: 700; } + +h4 { + margin-bottom: .2em; + color: #000; + font-weight: 700; } + +h5 { + margin-bottom: .1em; + color: #000; + font-weight: 700; } + +h6 { + margin-bottom: .1em; + color: #000; + font-weight: 700; } + +b, strong, .strong { + font-weight: 700; } + +em, .em { + font-style: italic; } + +abbr[title], .abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; } + +dfn { + font-style: italic; } + +small, .small { + font-size: 13px; + font-size: 0.8125rem; + line-height: 16px; + line-height: 1rem; } + +mark, .mark { + background-color: #ff0; + color: #000; } + +sub, .sub, sup, .sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sub, .sub { + bottom: -0.25em; } + +sup, .sup { + top: -0.5em; } + +del, .del { + text-decoration: line-through; } + +figure { + margin: 1em 40px; } + +hr, .hr { + box-sizing: content-box; + height: 1px; + background: #eee; + border: 0; + margin-top: 20px; + margin-bottom: 20px; } + +ul, ol { + margin: 20px 0; + padding: 0 0 0 40px; } + +dl:before, dl:after { + content: " "; + display: table; } + +dl:after { + clear: both; } + +dl dt { + float: left; + width: 25%; + display: block; + font-weight: 400; } + +dl dd { + overflow: hidden; + display: block; } + +blockquote, +.blockquote { + font-family: sans-serif; + font-weight: 400; + font-style: italic; + margin: 20px 0; } + blockquote p, + .blockquote p { + font-size: 22px; + font-size: 1.375rem; + line-height: 28px; + line-height: 1.75rem; + margin-bottom: 20px; } + blockquote cite, + .blockquote cite { + font-size: 13px; + font-size: 0.8125rem; + line-height: 19px; + line-height: 1.1875rem; + font-weight: 700; + font-style: normal; } + +caption { + font-size: inherit; + line-height: normal; + font-weight: 700; + text-align: left; + padding: 10px; + border-bottom: 1px solid #d7d7d7; } + +table { + font-size: 14px; + font-size: 0.875rem; + border-collapse: collapse; + border-spacing: 0; + width: 100%; + margin: 0; + text-align: left; } + table thead td, + table thead th, + table tbody td, + table tbody th, + table tfoot td, + table tfoot th { + color: #585858; + padding: 10px; + border-bottom: 1px solid #e9e9e9; } + +code, kbd, pre, samp { + font-size: 13px; + font-size: 0.8125rem; + line-height: 18px; + line-height: 1.125rem; + word-wrap: break-word; + font-family: monospace, monospace; + color: #000; + background-color: transparent; + font-weight: normal; + padding: 0; + white-space: pre-wrap; } + +pre { + padding: 10px; + overflow: auto; + border: 1px solid #d7d7d7; } + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; } + +label, +button, +input, +optgroup, +select, +textarea { + color: #000; + font: inherit; + margin: 0; } + +[type="text"], +[type="email"], +[type="password"], +[type="tel"], +[type="number"], +[type="date"] { + height: 36px; + padding: 10px; + background-color: #fff; + border: 1px solid #ccc; + -webkit-appearance: none; + -moz-appearance: textfield; + border-radius: 0; } + [type="text"]:focus, + [type="email"]:focus, + [type="password"]:focus, + [type="tel"]:focus, + [type="number"]:focus, + [type="date"]:focus { + background-color: #fff; + border-color: #f7c723; + outline: 0; } + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; } + +[type="date"]::-webkit-inner-spin-button { + display: none; + -webkit-appearance: none; } + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + padding: 0; } + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; } + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; } + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +textarea { + padding: 10px; + background-color: #fff; + border: 1px solid #ccc; + overflow: auto; + border-radius: 0; } + textarea:focus { + background-color: #fff; + border-color: #f7c723; + outline: 0; } + +select { + text-transform: none; + height: 36px; + padding: 0 10px; + background-color: #fff; + border: 1px solid #ccc; } + select:focus { + background-color: #fff; + border-color: #f7c723; + outline: 0; } + +optgroup { + font-weight: 700; } + +button { + border-radius: 0; + overflow: visible; + text-transform: none; + cursor: pointer; } + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; + border-radius: 0; } + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; } + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; } + +button[disabled], +html input[disabled] { + cursor: not-allowed; } + +input::-webkit-input-placeholder { + color: #999; } + +input:-moz-placeholder { + color: #999; } + +input::-moz-placeholder { + color: #999; } + +input:-ms-input-placeholder { + color: #999; } + +.button { + cursor: pointer; + border: 1px solid #d7d7d7; + background-color: #f3f3f3; + line-height: normal; + padding: 10px 20px; + text-decoration: none; + color: #363636; + display: inline-block; + transition: all 0.3s; } + .button:hover, .button:active { + text-decoration: none; } + .button:hover { + background: #f9f9f9; } + +.button-link { + color: #000; + text-decoration: underline; + border: 0; + background: transparent; + padding: 0; } + .button-link:hover { + text-decoration: none; } + .button-link:active { + outline: 0; } + +.clear:before, .clear:after { + content: " "; + display: table; } + +.clear:after { + clear: both; } + +.row:before, .row:after { + content: ""; + display: table; } + +.row:after { + clear: both; } + +.row { + position: relative; + margin-left: -15px; + margin-right: -15px; } + +@media only screen and (min-width: 740px) { + .row-m { + position: relative; + margin-left: -15px; + margin-right: -15px; } + .row-m:before, .row-m:after { + content: ""; + display: table; } + .row-m:after { + clear: both; } + .clear-m:before, .clear-m:after { + content: ""; + display: table; } + .clear-m:after { + clear: both; } } + +@media only screen and (min-width: 980px) { + .row-l { + position: relative; + margin-left: -15px; + margin-right: -15px; } + .row-l:before, .row-l:after { + content: ""; + display: table; } + .row-l:after { + clear: both; } + .clear-l:before, .clear-l:after { + content: ""; + display: table; } + .clear-l:after { + clear: both; } } + +@media only screen and (min-width: 1140px) { + .row-xl { + position: relative; + margin-left: -15px; + margin-right: -15px; } + .row-xl:before, .row-xl:after { + content: ""; + display: table; } + .row-xl:after { + clear: both; } + .clear-xl:before, .clear-xl:after { + content: ""; + display: table; } + .clear-xl:after { + clear: both; } } + +.container, .container-full { + padding-left: 15px; + padding-right: 15px; + margin-left: auto; + margin-right: auto; } + +@media only screen and (min-width: 740px) { + .container { + width: 720px; } + .container-m, .container-full-m { + padding-left: 15px; + padding-right: 15px; + margin-left: auto; + margin-right: auto; } + .container-m { + width: 720px; } + .container-full-m { + width: auto; } } + +@media only screen and (min-width: 980px) { + .container { + width: 960px; } + .container-l, .container-full-l { + padding-left: 15px; + padding-right: 15px; + margin-left: auto; + margin-right: auto; } + .container-l { + width: 960px; } + .container-full-l { + width: auto; } } + +@media only screen and (min-width: 1140px) { + .container { + width: 1120px; } + .container-xl, .container-full-xl { + padding-left: 15px; + padding-right: 15px; + margin-left: auto; + margin-right: auto; } + .container-xl { + width: 1120px; } + .container-full-xl { + width: auto; } } + +.col-1, +.col-2, +.col-3, +.col-4, +.col-5, +.col-6, +.col-7, +.col-8, +.col-9, +.col-10, +.col-11, +.col-12, +.col-1-2, +.col-1-3, +.col-2-3, +.col-1-4, +.col-3-4, +.col-1-5, +.col-2-5, +.col-3-5, +.col-4-5 { + padding-left: 15px; + padding-right: 15px; + position: relative; + float: left; } + +.col-1 { + width: 8.33333%; } + +.col-2 { + width: 16.66667%; } + +.col-3 { + width: 25%; } + +.col-4 { + width: 33.33333%; } + +.col-5 { + width: 41.66667%; } + +.col-6 { + width: 50%; } + +.col-7 { + width: 58.33333%; } + +.col-8 { + width: 66.66667%; } + +.col-9 { + width: 75%; } + +.col-10 { + width: 83.33333%; } + +.col-11 { + width: 91.66667%; } + +.col-12 { + width: 100%; } + +.col-1-2 { + width: 50%; } + +.col-1-3 { + width: 33.33333%; } + +.col-2-3 { + width: 66.66667%; } + +.col-1-4 { + width: 25%; } + +.col-3-4 { + width: 75%; } + +.col-1-5 { + width: 20%; } + +.col-2-5 { + width: 40%; } + +.col-3-5 { + width: 60%; } + +.col-4-5 { + width: 80%; } + +.col-full { + width: 100%; } + +@media only screen and (min-width: 740px) { + .col-1-m, + .col-2-m, + .col-3-m, + .col-4-m, + .col-5-m, + .col-6-m, + .col-7-m, + .col-8-m, + .col-9-m, + .col-10-m, + .col-11-m, + .col-12-m, + .col-1-2-m, + .col-1-3-m, + .col-2-3-m, + .col-1-4-m, + .col-3-4-m, + .col-1-5-m, + .col-2-5-m, + .col-3-5-m, + .col-4-5-m { + padding-left: 15px; + padding-right: 15px; + position: relative; + float: -91.66667%; } + .col-1-m { + width: 8.33333%; } + .col-2-m { + width: 16.66667%; } + .col-3-m { + width: 25%; } + .col-4-m { + width: 33.33333%; } + .col-5-m { + width: 41.66667%; } + .col-6-m { + width: 50%; } + .col-7-m { + width: 58.33333%; } + .col-8-m { + width: 66.66667%; } + .col-9-m { + width: 75%; } + .col-10-m { + width: 83.33333%; } + .col-11-m { + width: 91.66667%; } + .col-12-m { + width: 100%; } + .col-1-2-m { + width: 50%; } + .col-1-3-m { + width: 33.33333%; } + .col-2-3-m { + width: 66.66667%; } + .col-1-4-m { + width: 25%; } + .col-3-4-m { + width: 75%; } + .col-1-5-m { + width: 20%; } + .col-2-5-m { + width: 40%; } + .col-3-5-m { + width: 60%; } + .col-4-5-m { + width: 80%; } + .col-full-m { + width: 100%; } } + +@media only screen and (min-width: 980px) { + .col-1-l, + .col-2-l, + .col-3-l, + .col-4-l, + .col-5-l, + .col-6-l, + .col-7-l, + .col-8-l, + .col-9-l, + .col-10-l, + .col-11-l, + .col-12-l, + .col-1-2-l, + .col-1-3-l, + .col-2-3-l, + .col-1-4-l, + .col-3-4-l, + .col-1-5-l, + .col-2-5-l, + .col-3-5-l, + .col-4-5-l { + padding-left: 15px; + padding-right: 15px; + position: relative; + float: -91.66667%; } + .col-1-l { + width: 8.33333%; } + .col-2-l { + width: 16.66667%; } + .col-3-l { + width: 25%; } + .col-4-l { + width: 33.33333%; } + .col-5-l { + width: 41.66667%; } + .col-6-l { + width: 50%; } + .col-7-l { + width: 58.33333%; } + .col-8-l { + width: 66.66667%; } + .col-9-l { + width: 75%; } + .col-10-l { + width: 83.33333%; } + .col-11-l { + width: 91.66667%; } + .col-12-l { + width: 100%; } + .col-1-2-l { + width: 50%; } + .col-1-3-l { + width: 33.33333%; } + .col-2-3-l { + width: 66.66667%; } + .col-1-4-l { + width: 25%; } + .col-3-4-l { + width: 75%; } + .col-1-5-l { + width: 20%; } + .col-2-5-l { + width: 40%; } + .col-3-5-l { + width: 60%; } + .col-4-5-l { + width: 80%; } + .col-full-l { + width: 100%; } } + +@media only screen and (min-width: 1140px) { + .col-1-xl, + .col-2-xl, + .col-3-xl, + .col-4-xl, + .col-5-xl, + .col-6-xl, + .col-7-xl, + .col-8-xl, + .col-9-xl, + .col-10-xl, + .col-11-xl, + .col-12-xl, + .col-1-2-xl, + .col-1-3-xl, + .col-2-3-xl, + .col-1-4-xl, + .col-3-4-xl, + .col-1-5-xl, + .col-2-5-xl, + .col-3-5-xl, + .col-4-5-xl { + padding-left: 15px; + padding-right: 15px; + position: relative; + float: -91.66667%; } + .col-1-xl { + width: 8.33333%; } + .col-2-xl { + width: 16.66667%; } + .col-3-xl { + width: 25%; } + .col-4-xl { + width: 33.33333%; } + .col-5-xl { + width: 41.66667%; } + .col-6-xl { + width: 50%; } + .col-7-xl { + width: 58.33333%; } + .col-8-xl { + width: 66.66667%; } + .col-9-xl { + width: 75%; } + .col-10-xl { + width: 83.33333%; } + .col-11-xl { + width: 91.66667%; } + .col-12-xl { + width: 100%; } + .col-1-2-xl { + width: 50%; } + .col-1-3-xl { + width: 33.33333%; } + .col-2-3-xl { + width: 66.66667%; } + .col-1-4-xl { + width: 25%; } + .col-3-4-xl { + width: 75%; } + .col-1-5-xl { + width: 20%; } + .col-2-5-xl { + width: 40%; } + .col-3-5-xl { + width: 60%; } + .col-4-5-xl { + width: 80%; } + .col-full-xl { + width: 100%; } } + +@-webkit-keyframes fadeIn { + 0% { + opacity: 0; } + 100% { + opacity: 1; } } + +@keyframes fadeIn { + 0% { + opacity: 0; } + 100% { + opacity: 1; } } + +.fade-in { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; } + +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +@keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +.fade-in-down { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; } + +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +.fade-in-down-big { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; } + +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-30px, 0, 0); + transform: translate3d(-30px, 0, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +@keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-30px, 0, 0); + transform: translate3d(-30px, 0, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +.fade-in-left { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; } + +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +.fade-in-left-big { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; } + +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(30px, 0, 0); + transform: translate3d(30px, 0, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +@keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(30px, 0, 0); + transform: translate3d(30px, 0, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +.fade-in-right { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; } + +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +.fade-in-right-big { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; } + +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 30px, 0); + transform: translate3d(0, 30px, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +@keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 30px, 0); + transform: translate3d(0, 30px, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +.fade-in-up { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; } + +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +@keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); } + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; } } + +.fade-in-up-big { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; } + +@media print { + *, + *:before, + *:after { + background: transparent; + color: #000; + box-shadow: none; + text-shadow: none; } + a, a:visited { + text-decoration: underline; } + a[href]:after { + content: " (" attr(href) ")"; } + a[href^="#"]:after, a[href^="javascript:"]:after { + content: ""; } + pre, blockquote { + page-break-inside: avoid; } + thead { + display: table-header-group; } + tr { + page-break-inside: avoid; } + img { + page-break-inside: avoid; + max-width: 100%; } + p, h2, h3 { + orphans: 3; + widows: 3; } + h2, h3 { + page-break-after: avoid; } + abbr[title]:after { + content: " (" attr(title) ")"; } } + +.no-margin { + margin: 0; } + +.no-padding { + padding: 0; } + +.no-float { + float: none; } + +.no-background { + background: transparent; } + +.no-border { + border: 0; } + +.no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: default; } + +.font-100 { + font-weight: 100; } + +.font-200 { + font-weight: 200; } + +.font-300 { + font-weight: 300; } + +.font-400 { + font-weight: 400; } + +.font-500 { + font-weight: 500; } + +.font-600 { + font-weight: 600; } + +.font-700 { + font-weight: 700; } + +.font-800 { + font-weight: 800; } + +.font-900 { + font-weight: 900; } + +.font-normal { + font-style: normal; } + +.font-italic { + font-style: italic; } + +.uppercase { + text-transform: uppercase; } + +.lowercase { + text-transform: lowercase; } + +.capitalize { + text-transform: capitalize; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +.relative { + position: relative; } + +.absolute { + position: absolute; } + +.static { + position: static; } + +.fixed { + position: fixed; } + +.none { + display: none; } + +.block { + display: block; } + +.inline-block { + display: inline-block; } + +.inline { + display: inline; } + +.flex { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + +.flex-row { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + +.flex-column { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + +.flex-space-around { + -ms-flex-pack: distribute; + justify-content: space-around; } + +.flex-space-between { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + +.flex-start { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + +.flex-center { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + +.flex-end { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; } + +.flex-wrap { + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + +.flex-nowrap { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + +.left { + float: left; } + +.right { + float: right; } + +.center { + float: none; + margin-left: auto; + margin-right: auto; } + +.pad-top-5 { + padding-top: 5px; } + +.pad-top-10 { + padding-top: 10px; } + +.pad-top-15 { + padding-top: 15px; } + +.pad-top-20 { + padding-top: 20px; } + +.pad-top-25 { + padding-top: 25px; } + +.pad-top-30 { + padding-top: 30px; } + +.pad-top-35 { + padding-top: 35px; } + +.pad-top-40 { + padding-top: 40px; } + +.pad-top-45 { + padding-top: 45px; } + +.pad-top-50 { + padding-top: 50px; } + +.pad-top-55 { + padding-top: 55px; } + +.pad-top-60 { + padding-top: 60px; } + +.pad-bottom-5 { + padding-bottom: 5px; } + +.pad-bottom-10 { + padding-bottom: 10px; } + +.pad-bottom-15 { + padding-bottom: 15px; } + +.pad-bottom-20 { + padding-bottom: 20px; } + +.pad-bottom-25 { + padding-bottom: 25px; } + +.pad-bottom-30 { + padding-bottom: 30px; } + +.pad-bottom-35 { + padding-bottom: 35px; } + +.pad-bottom-40 { + padding-bottom: 40px; } + +.pad-bottom-45 { + padding-bottom: 45px; } + +.pad-bottom-50 { + padding-bottom: 50px; } + +.pad-bottom-55 { + padding-bottom: 55px; } + +.pad-bottom-60 { + padding-bottom: 60px; } + +.pad-5 { + padding: 5px; } + +.pad-10 { + padding: 10px; } + +.pad-15 { + padding: 15px; } + +.pad-20 { + padding: 20px; } + +.pad-25 { + padding: 25px; } + +.pad-30 { + padding: 30px; } + +.pad-35 { + padding: 35px; } + +.pad-40 { + padding: 40px; } + +.pad-45 { + padding: 45px; } + +.pad-50 { + padding: 50px; } + +.pad-55 { + padding: 55px; } + +.pad-60 { + padding: 60px; } + +.sr { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.list-unstyled { + list-style: none; + margin: 0; + padding: 0; } + .list-unstyled li { + margin: 0; + padding: 0; } + +.list-inline { + list-style: none; + margin: 0; + padding: 0; } + .list-inline li { + margin: 0; + padding: 0; + display: inline-block; } + +.img-fluid { + max-width: 100%; } + +.field { + width: 100%; } + +.form-group { + overflow: hidden; } + .form-group label { + display: inline-block; + padding-top: 8px; } + +.disabled, [disabled] { + pointer-events: none; + cursor: not-allowed; + opacity: .5; } + +.checkbox, +.radio { + display: inline-block; + position: relative; } + .checkbox label, + .radio label { + padding-left: 20px; + padding-top: 0; + display: inline-block; } + .checkbox input[type="checkbox"], + .checkbox input[type="radio"], + .radio input[type="checkbox"], + .radio input[type="radio"] { + position: absolute; + top: 4px; + left: 0; } + +.select { + position: relative; + display: block; } + .select:before { + content: ""; + border: 6px solid transparent; + border-top-color: #676767; + top: 50%; + right: 10px; + margin-top: -3px; + pointer-events: none; + position: absolute; } + .select select { + -webkit-appearance: none; + -moz-appearance: none; + height: 36px; + width: 100%; + padding: 0 10px; + line-height: normal; + border: 1px solid #ccc; + background: #fff; + display: block; } + .select select::-ms-expand { + display: none; } + .select select:focus { + border-color: #f7c723; } + .select select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #000; + border-color: #f7c723; } + +.animation { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; } + +.animation-infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; } + +@media only screen and (min-width: 740px) { + .no-float-m { + float: none; } + .no-padding-m { + padding: 0; } + .no-margin-m { + margin: 0; } + .relative-m { + position: relative; } + .absolute-m { + position: absolute; } + .static-m { + position: static; } + .fixed-m { + position: fixed; } + .none-m { + display: none; } + .block-m { + display: block; } + .inline-block-m { + display: inline-block; } + .inline-m { + display: inline; } + .flex-m { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + .flex-row-m { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .flex-column-m { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + .flex-space-around-m { + -ms-flex-pack: distribute; + justify-content: space-around; } + .flex-space-between-m { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + .flex-start-m { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + .flex-center-m { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + .flex-end-m { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; } + .flex-wrap-m { + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .flex-nowrap-m { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .left-m { + float: left; } + .right-m { + float: right; } + .center-m { + float: none; + margin-left: auto; + margin-right: auto; } + .text-left-m { + text-align: left; } + .text-right-m { + text-align: right; } + .text-center-m { + text-align: center; } + .text-justify-m { + text-align: justify; } + .no-col-m { + width: auto; + float: none; } + .no-push-m, .no-pull-m { + left: 0; } + .pad-top-0-m { + padding-top: 0; } + .pad-top-5-m { + padding-top: 5px; } + .pad-top-10-m { + padding-top: 10px; } + .pad-top-15-m { + padding-top: 15px; } + .pad-top-20-m { + padding-top: 20px; } + .pad-top-25-m { + padding-top: 25px; } + .pad-top-30-m { + padding-top: 30px; } + .pad-top-35-m { + padding-top: 35px; } + .pad-top-40-m { + padding-top: 40px; } + .pad-top-45-m { + padding-top: 45px; } + .pad-top-50-m { + padding-top: 50px; } + .pad-top-55-m { + padding-top: 55px; } + .pad-top-60-m { + padding-top: 60px; } + .pad-bottom-0-m { + padding-bottom: 0; } + .pad-bottom-5-m { + padding-bottom: 5px; } + .pad-bottom-10-m { + padding-bottom: 10px; } + .pad-bottom-15-m { + padding-bottom: 15px; } + .pad-bottom-20-m { + padding-bottom: 20px; } + .pad-bottom-25-m { + padding-bottom: 25px; } + .pad-bottom-30-m { + padding-bottom: 30px; } + .pad-bottom-35-m { + padding-bottom: 35px; } + .pad-bottom-40-m { + padding-bottom: 40px; } + .pad-bottom-45-m { + padding-bottom: 45px; } + .pad-bottom-50-m { + padding-bottom: 50px; } + .pad-bottom-55-m { + padding-bottom: 55px; } + .pad-bottom-60-m { + padding-bottom: 60px; } + .pad-0-m { + padding: 0; } + .pad-5-m { + padding: 5px; } + .pad-10-m { + padding: 10px; } + .pad-15-m { + padding: 15px; } + .pad-20-m { + padding: 20px; } + .pad-25-m { + padding: 25px; } + .pad-30-m { + padding: 30px; } + .pad-35-m { + padding: 35px; } + .pad-40-m { + padding: 40px; } + .pad-45-m { + padding: 45px; } + .pad-50-m { + padding: 50px; } + .pad-55-m { + padding: 55px; } + .pad-60-m { + padding: 60px; } } + +@media only screen and (min-width: 980px) { + .no-float-l { + float: none; } + .no-padding-l { + padding: 0; } + .no-margin-l { + margin: 0; } + .relative-l { + position: relative; } + .absolute-l { + position: absolute; } + .static-l { + position: static; } + .fixed-l { + position: fixed; } + .none-l { + display: none; } + .block-l { + display: block; } + .inline-block-l { + display: inline-block; } + .inline-l { + display: inline; } + .flex-l { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + .flex-row-l { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .flex-column-l { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + .flex-space-around-l { + -ms-flex-pack: distribute; + justify-content: space-around; } + .flex-space-between-l { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + .flex-start-l { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + .flex-center-l { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + .flex-end-l { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; } + .flex-wrap-l { + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .flex-nowrap-l { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .left-l { + float: left; } + .right-l { + float: right; } + .center-l { + float: none; + margin-left: auto; + margin-right: auto; } + .text-left-l { + text-align: left; } + .text-right-l { + text-align: right; } + .text-center-l { + text-align: center; } + .text-justify-l { + text-align: justify; } + .no-col-l { + width: auto; + float: none; } + .no-push-l, .no-pull-l { + left: 0; } + .pad-top-0-l { + padding-top: 0; } + .pad-top-5-l { + padding-top: 5px; } + .pad-top-10-l { + padding-top: 10px; } + .pad-top-15-l { + padding-top: 15px; } + .pad-top-20-l { + padding-top: 20px; } + .pad-top-25-l { + padding-top: 25px; } + .pad-top-30-l { + padding-top: 30px; } + .pad-top-35-l { + padding-top: 35px; } + .pad-top-40-l { + padding-top: 40px; } + .pad-top-45-l { + padding-top: 45px; } + .pad-top-50-l { + padding-top: 50px; } + .pad-top-55-l { + padding-top: 55px; } + .pad-top-60-l { + padding-top: 60px; } + .pad-bottom-0-l { + padding-bottom: 0; } + .pad-bottom-5-l { + padding-bottom: 5px; } + .pad-bottom-10-l { + padding-bottom: 10px; } + .pad-bottom-15-l { + padding-bottom: 15px; } + .pad-bottom-20-l { + padding-bottom: 20px; } + .pad-bottom-25-l { + padding-bottom: 25px; } + .pad-bottom-30-l { + padding-bottom: 30px; } + .pad-bottom-35-l { + padding-bottom: 35px; } + .pad-bottom-40-l { + padding-bottom: 40px; } + .pad-bottom-45-l { + padding-bottom: 45px; } + .pad-bottom-50-l { + padding-bottom: 50px; } + .pad-bottom-55-l { + padding-bottom: 55px; } + .pad-bottom-60-l { + padding-bottom: 60px; } + .pad-0-l { + padding: 0; } + .pad-5-l { + padding: 5px; } + .pad-10-l { + padding: 10px; } + .pad-15-l { + padding: 15px; } + .pad-20-l { + padding: 20px; } + .pad-25-l { + padding: 25px; } + .pad-30-l { + padding: 30px; } + .pad-35-l { + padding: 35px; } + .pad-40-l { + padding: 40px; } + .pad-45-l { + padding: 45px; } + .pad-50-l { + padding: 50px; } + .pad-55-l { + padding: 55px; } + .pad-60-l { + padding: 60px; } } + +@media only screen and (min-width: 1140px) { + .no-float-xl { + float: none; } + .no-padding-xl { + padding: 0; } + .no-margin-xl { + margin: 0; } + .relative-xl { + position: relative; } + .absolute-xl { + position: absolute; } + .static-xl { + position: static; } + .fixed-xl { + position: fixed; } + .none-xl { + display: none; } + .block-xl { + display: block; } + .inline-block-xl { + display: inline-block; } + .inline-xl { + display: inline; } + .flex-xl { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + .flex-row-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .flex-column-xl { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + .flex-space-around-xl { + -ms-flex-pack: distribute; + justify-content: space-around; } + .flex-space-between-xl { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + .flex-start-xl { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + .flex-center-xl { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + .flex-end-xl { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; } + .flex-wrap-xl { + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .flex-nowrap-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .left-xl { + float: left; } + .right-xl { + float: right; } + .center-xl { + float: none; + margin-left: auto; + margin-right: auto; } + .text-left-xl { + text-align: left; } + .text-right-xl { + text-align: right; } + .text-center-xl { + text-align: center; } + .text-justify-xl { + text-align: justify; } + .no-col-xl { + width: auto; + float: none; } + .no-push-xl, .no-pull-xl { + left: 0; } + .pad-top-0-xl { + padding-top: 0; } + .pad-top-5-xl { + padding-top: 5px; } + .pad-top-10-xl { + padding-top: 10px; } + .pad-top-15-xl { + padding-top: 15px; } + .pad-top-20-xl { + padding-top: 20px; } + .pad-top-25-xl { + padding-top: 25px; } + .pad-top-30-xl { + padding-top: 30px; } + .pad-top-35-xl { + padding-top: 35px; } + .pad-top-40-xl { + padding-top: 40px; } + .pad-top-45-xl { + padding-top: 45px; } + .pad-top-50-xl { + padding-top: 50px; } + .pad-top-55-xl { + padding-top: 55px; } + .pad-top-60-xl { + padding-top: 60px; } + .pad-bottom-0-xl { + padding-bottom: 0; } + .pad-bottom-5-xl { + padding-bottom: 5px; } + .pad-bottom-10-xl { + padding-bottom: 10px; } + .pad-bottom-15-xl { + padding-bottom: 15px; } + .pad-bottom-20-xl { + padding-bottom: 20px; } + .pad-bottom-25-xl { + padding-bottom: 25px; } + .pad-bottom-30-xl { + padding-bottom: 30px; } + .pad-bottom-35-xl { + padding-bottom: 35px; } + .pad-bottom-40-xl { + padding-bottom: 40px; } + .pad-bottom-45-xl { + padding-bottom: 45px; } + .pad-bottom-50-xl { + padding-bottom: 50px; } + .pad-bottom-55-xl { + padding-bottom: 55px; } + .pad-bottom-60-xl { + padding-bottom: 60px; } + .pad-0-xl { + padding: 0; } + .pad-5-xl { + padding: 5px; } + .pad-10-xl { + padding: 10px; } + .pad-15-xl { + padding: 15px; } + .pad-20-xl { + padding: 20px; } + .pad-25-xl { + padding: 25px; } + .pad-30-xl { + padding: 30px; } + .pad-35-xl { + padding: 35px; } + .pad-40-xl { + padding: 40px; } + .pad-45-xl { + padding: 45px; } + .pad-50-xl { + padding: 50px; } + .pad-55-xl { + padding: 55px; } + .pad-60-xl { + padding: 60px; } } + +@media print { + .no-float-print { + float: none; } + .no-padding-print { + padding: 0; } + .no-margin-print { + margin: 0; } + .none-print { + display: none; } + .block-print { + display: block; } + .inline-block-print { + display: inline-block; } + .inline-print { + display: inline; } + .text-left-print { + text-align: left; } + .text-right-print { + text-align: right; } + .text-center-print { + text-align: center; } + .text-justify-print { + text-align: justify; } + .no-col-print { + width: auto; + float: none; } + .no-push-print, .no-pull-print { + left: 0; } + .pad-top-0-print { + padding-top: 0; } + .pad-top-5-print { + padding-top: 5px; } + .pad-top-10-print { + padding-top: 10px; } + .pad-top-15-print { + padding-top: 15px; } + .pad-top-20-print { + padding-top: 20px; } + .pad-top-25-print { + padding-top: 25px; } + .pad-top-30-print { + padding-top: 30px; } + .pad-top-35-print { + padding-top: 35px; } + .pad-top-40-print { + padding-top: 40px; } + .pad-top-45-print { + padding-top: 45px; } + .pad-top-50-print { + padding-top: 50px; } + .pad-top-55-print { + padding-top: 55px; } + .pad-top-60-print { + padding-top: 60px; } + .pad-bottom-0-print { + padding-bottom: 0; } + .pad-bottom-5-print { + padding-bottom: 5px; } + .pad-bottom-10-print { + padding-bottom: 10px; } + .pad-bottom-15-print { + padding-bottom: 15px; } + .pad-bottom-20-print { + padding-bottom: 20px; } + .pad-bottom-25-print { + padding-bottom: 25px; } + .pad-bottom-30-print { + padding-bottom: 30px; } + .pad-bottom-35-print { + padding-bottom: 35px; } + .pad-bottom-40-print { + padding-bottom: 40px; } + .pad-bottom-45-print { + padding-bottom: 45px; } + .pad-bottom-50-print { + padding-bottom: 50px; } + .pad-bottom-55-print { + padding-bottom: 55px; } + .pad-bottom-60-print { + padding-bottom: 60px; } + .pad-0-print { + padding: 0; } + .pad-5-print { + padding: 5px; } + .pad-10-print { + padding: 10px; } + .pad-15-print { + padding: 15px; } + .pad-20-print { + padding: 20px; } + .pad-25-print { + padding: 25px; } + .pad-30-print { + padding: 30px; } + .pad-35-print { + padding: 35px; } + .pad-40-print { + padding: 40px; } + .pad-45-print { + padding: 45px; } + .pad-50-print { + padding: 50px; } + .pad-55-print { + padding: 55px; } + .pad-60-print { + padding: 60px; } } + +/*# sourceMappingURL=styles.css.map */ diff --git a/pkgs/csslib/test/examples/boilerplate.css b/pkgs/csslib/test/examples/boilerplate.css new file mode 100644 index 000000000..ebd0ebd00 --- /dev/null +++ b/pkgs/csslib/test/examples/boilerplate.css @@ -0,0 +1,282 @@ +/*! HTML5 Boilerplate v5.3.0 | MIT License | https://html5boilerplate.com/ */ + +/* + * What follows is the result of much research on cross-browser styling. + * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, + * Kroc Camen, and the H5BP dev community and team. + */ + +/* ========================================================================== + Base styles: opinionated defaults + ========================================================================== */ + +html { + color: #222; + font-size: 1em; + line-height: 1.4; +} + +/* + * Remove text-shadow in selection highlight: + * https://twitter.com/miketaylr/status/12228805301 + * + * These selection rule sets have to be separate. + * Customize the background color to match your design. + */ + +::-moz-selection { + background: #b3d4fc; + text-shadow: none; +} + +::selection { + background: #b3d4fc; + text-shadow: none; +} + +/* + * A better looking default horizontal rule + */ + +hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; +} + +/* + * Remove the gap between audio, canvas, iframes, + * images, videos and the bottom of their containers: + * https://github.com/h5bp/html5-boilerplate/issues/440 + */ + +audio, +canvas, +iframe, +img, +svg, +video { + vertical-align: middle; +} + +/* + * Remove default fieldset styles. + */ + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +/* + * Allow only vertical resizing of textareas. + */ + +textarea { + resize: vertical; +} + +/* ========================================================================== + Browser Upgrade Prompt + ========================================================================== */ + +.browserupgrade { + margin: 0.2em 0; + background: #ccc; + color: #000; + padding: 0.2em 0; +} + +/* ========================================================================== + Author's custom styles + ========================================================================== */ + + + + + + + + + + + + + + + + + +/* ========================================================================== + Helper classes + ========================================================================== */ + +/* + * Hide visually and from screen readers + */ + +.hidden { + display: none !important; +} + +/* + * Hide only visually, but have it available for screen readers: + * http://snook.ca/archives/html_and_css/hiding-content-for-accessibility + */ + +.visuallyhidden { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +/* + * Extends the .visuallyhidden class to allow the element + * to be focusable when navigated to via the keyboard: + * https://www.drupal.org/node/897638 + */ + +.visuallyhidden.focusable:active, +.visuallyhidden.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} + +/* + * Hide visually and from screen readers, but maintain layout + */ + +.invisible { + visibility: hidden; +} + +/* + * Clearfix: contain floats + * + * For modern browsers + * 1. The space content is one way to avoid an Opera bug when the + * `contenteditable` attribute is included anywhere else in the document. + * Otherwise it causes space to appear at the top and bottom of elements + * that receive the `clearfix` class. + * 2. The use of `table` rather than `block` is only necessary if using + * `:before` to contain the top-margins of child elements. + */ + +.clearfix:before, +.clearfix:after { + content: " "; /* 1 */ + display: table; /* 2 */ +} + +.clearfix:after { + clear: both; +} + +/* ========================================================================== + EXAMPLE Media Queries for Responsive Design. + These examples override the primary ('mobile first') styles. + Modify as content requires. + ========================================================================== */ + +@media only screen and (min-width: 35em) { + /* Style adjustments for viewports that meet the condition */ +} + +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 1.25dppx), + (min-resolution: 120dpi) { + /* Style adjustments for high resolution devices */ +} + +/* ========================================================================== + Print styles. + Inlined to avoid the additional HTTP request: + http://www.phpied.com/delay-loading-your-print-css/ + ========================================================================== */ + +@media print { + *, + *:before, + *:after, + *:first-letter, + *:first-line { + background: transparent !important; + color: #000 !important; /* Black prints faster: + http://www.sanbeiji.com/archives/953 */ + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + /* + * Don't show links that are fragment identifiers, + * or use the `javascript:` pseudo protocol + */ + + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + /* + * Printing Tables: + * http://css-discuss.incutio.com/wiki/Printing_Tables + */ + + thead { + display: table-header-group; + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } +} diff --git a/pkgs/csslib/test/examples/bootstrap.css b/pkgs/csslib/test/examples/bootstrap.css new file mode 100644 index 000000000..1038ebcb3 --- /dev/null +++ b/pkgs/csslib/test/examples/bootstrap.css @@ -0,0 +1,9320 @@ +/*! + * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + line-height: 1.15; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +figcaption, +figure, +main { + display: block; +} + +figure { + margin: 1em 40px; +} + +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible; +} + +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +a:active, +a:hover { + outline-width: 0; +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} + +b, +strong { + font-weight: inherit; +} + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +dfn { + font-style: italic; +} + +mark { + background-color: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +audio, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +img { + border-style: none; +} + +svg:not(:root) { + overflow: hidden; +} + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +progress { + display: inline-block; + vertical-align: baseline; +} + +textarea { + overflow: auto; +} + +[type="checkbox"], +[type="radio"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +details, +menu { + display: block; +} + +summary { + display: list-item; +} + +canvas { + display: inline-block; +} + +template { + display: none; +} + +[hidden] { + display: none; +} + +@media print { + *, + *::before, + *::after, + p::first-letter, + div::first-letter, + blockquote::first-letter, + li::first-letter, + p::first-line, + div::first-line, + blockquote::first-line, + li::first-line { + text-shadow: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + abbr[title]::after { + content: " (" attr(title) ")"; + } + pre { + white-space: pre-wrap !important; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .badge { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} + +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +*, +*::before, +*::after { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +@-ms-viewport { + width: device-width; +} + +html { + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: transparent; +} + +body { + font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 1rem; + font-weight: normal; + line-height: 1.5; + color: #292b2c; + background-color: #fff; +} + +[tabindex="-1"]:focus { + outline: none !important; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: .5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: bold; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +a { + color: #0275d8; + text-decoration: none; +} + +a:focus, a:hover { + color: #014c8c; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; +} + +[role="button"] { + cursor: pointer; +} + +a, +area, +button, +[role="button"], +input, +label, +select, +summary, +textarea { + -ms-touch-action: manipulation; + touch-action: manipulation; +} + +table { + border-collapse: collapse; + background-color: transparent; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #636c72; + text-align: left; + caption-side: bottom; +} + +th { + text-align: left; +} + +label { + display: inline-block; + margin-bottom: .5rem; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +textarea { + line-height: inherit; +} + +input[type="radio"]:disabled, +input[type="checkbox"]:disabled { + cursor: not-allowed; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; +} + +input[type="search"] { + -webkit-appearance: none; +} + +output { + display: inline-block; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.1; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.1; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.1; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.1; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: normal; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} + +.list-inline-item:not(:last-child) { + margin-right: 5px; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + padding: 0.5rem 1rem; + margin-bottom: 1rem; + font-size: 1.25rem; + border-left: 0.25rem solid #eceeef; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #636c72; +} + +.blockquote-footer::before { + content: "\2014 \00A0"; +} + +.blockquote-reverse { + padding-right: 1rem; + padding-left: 0; + text-align: right; + border-right: 0.25rem solid #eceeef; + border-left: 0; +} + +.blockquote-reverse .blockquote-footer::before { + content: ""; +} + +.blockquote-reverse .blockquote-footer::after { + content: "\00A0 \2014"; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 0.25rem; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #636c72; +} + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +code { + padding: 0.2rem 0.4rem; + font-size: 90%; + color: #bd4147; + background-color: #f7f7f9; + border-radius: 0.25rem; +} + +a > code { + padding: 0; + color: inherit; + background-color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 90%; + color: #fff; + background-color: #292b2c; + border-radius: 0.2rem; +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + font-size: 90%; + color: #292b2c; +} + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + background-color: transparent; + border-radius: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + position: relative; + margin-left: auto; + margin-right: auto; + padding-right: 15px; + padding-left: 15px; +} + +@media (min-width: 576px) { + .container { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 768px) { + .container { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 992px) { + .container { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 1200px) { + .container { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 576px) { + .container { + width: 540px; + max-width: 100%; + } +} + +@media (min-width: 768px) { + .container { + width: 720px; + max-width: 100%; + } +} + +@media (min-width: 992px) { + .container { + width: 960px; + max-width: 100%; + } +} + +@media (min-width: 1200px) { + .container { + width: 1140px; + max-width: 100%; + } +} + +.container-fluid { + position: relative; + margin-left: auto; + margin-right: auto; + padding-right: 15px; + padding-left: 15px; +} + +@media (min-width: 576px) { + .container-fluid { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 768px) { + .container-fluid { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 992px) { + .container-fluid { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 1200px) { + .container-fluid { + padding-right: 15px; + padding-left: 15px; + } +} + +.row { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +@media (min-width: 576px) { + .row { + margin-right: -15px; + margin-left: -15px; + } +} + +@media (min-width: 768px) { + .row { + margin-right: -15px; + margin-left: -15px; + } +} + +@media (min-width: 992px) { + .row { + margin-right: -15px; + margin-left: -15px; + } +} + +@media (min-width: 1200px) { + .row { + margin-right: -15px; + margin-left: -15px; + } +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} + +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { + position: relative; + width: 100%; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} + +@media (min-width: 576px) { + .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 768px) { + .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 992px) { + .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { + padding-right: 15px; + padding-left: 15px; + } +} + +@media (min-width: 1200px) { + .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { + padding-right: 15px; + padding-left: 15px; + } +} + +.col { + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; +} + +.col-1 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 8.333333%; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; +} + +.col-2 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 16.666667%; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-3 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 25%; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 33.333333%; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.col-5 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 41.666667%; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; +} + +.col-6 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 50%; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 58.333333%; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; +} + +.col-8 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 66.666667%; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; +} + +.col-9 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 75%; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 83.333333%; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; +} + +.col-11 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 91.666667%; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; +} + +.col-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.pull-0 { + right: auto; +} + +.pull-1 { + right: 8.333333%; +} + +.pull-2 { + right: 16.666667%; +} + +.pull-3 { + right: 25%; +} + +.pull-4 { + right: 33.333333%; +} + +.pull-5 { + right: 41.666667%; +} + +.pull-6 { + right: 50%; +} + +.pull-7 { + right: 58.333333%; +} + +.pull-8 { + right: 66.666667%; +} + +.pull-9 { + right: 75%; +} + +.pull-10 { + right: 83.333333%; +} + +.pull-11 { + right: 91.666667%; +} + +.pull-12 { + right: 100%; +} + +.push-0 { + left: auto; +} + +.push-1 { + left: 8.333333%; +} + +.push-2 { + left: 16.666667%; +} + +.push-3 { + left: 25%; +} + +.push-4 { + left: 33.333333%; +} + +.push-5 { + left: 41.666667%; +} + +.push-6 { + left: 50%; +} + +.push-7 { + left: 58.333333%; +} + +.push-8 { + left: 66.666667%; +} + +.push-9 { + left: 75%; +} + +.push-10 { + left: 83.333333%; +} + +.push-11 { + left: 91.666667%; +} + +.push-12 { + left: 100%; +} + +.offset-1 { + margin-left: 8.333333%; +} + +.offset-2 { + margin-left: 16.666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.333333%; +} + +.offset-5 { + margin-left: 41.666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.333333%; +} + +.offset-8 { + margin-left: 66.666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.333333%; +} + +.offset-11 { + margin-left: 91.666667%; +} + +@media (min-width: 576px) { + .col-sm { + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-sm-auto { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 8.333333%; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 16.666667%; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 25%; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 33.333333%; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 41.666667%; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 50%; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 58.333333%; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 66.666667%; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 75%; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 83.333333%; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 91.666667%; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-sm-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .pull-sm-0 { + right: auto; + } + .pull-sm-1 { + right: 8.333333%; + } + .pull-sm-2 { + right: 16.666667%; + } + .pull-sm-3 { + right: 25%; + } + .pull-sm-4 { + right: 33.333333%; + } + .pull-sm-5 { + right: 41.666667%; + } + .pull-sm-6 { + right: 50%; + } + .pull-sm-7 { + right: 58.333333%; + } + .pull-sm-8 { + right: 66.666667%; + } + .pull-sm-9 { + right: 75%; + } + .pull-sm-10 { + right: 83.333333%; + } + .pull-sm-11 { + right: 91.666667%; + } + .pull-sm-12 { + right: 100%; + } + .push-sm-0 { + left: auto; + } + .push-sm-1 { + left: 8.333333%; + } + .push-sm-2 { + left: 16.666667%; + } + .push-sm-3 { + left: 25%; + } + .push-sm-4 { + left: 33.333333%; + } + .push-sm-5 { + left: 41.666667%; + } + .push-sm-6 { + left: 50%; + } + .push-sm-7 { + left: 58.333333%; + } + .push-sm-8 { + left: 66.666667%; + } + .push-sm-9 { + left: 75%; + } + .push-sm-10 { + left: 83.333333%; + } + .push-sm-11 { + left: 91.666667%; + } + .push-sm-12 { + left: 100%; + } + .offset-sm-0 { + margin-left: 0%; + } + .offset-sm-1 { + margin-left: 8.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 768px) { + .col-md { + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-md-auto { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 8.333333%; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-md-2 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 16.666667%; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-3 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 25%; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 33.333333%; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-md-5 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 41.666667%; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-md-6 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 50%; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 58.333333%; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-md-8 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 66.666667%; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-md-9 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 75%; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 83.333333%; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-md-11 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 91.666667%; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-md-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .pull-md-0 { + right: auto; + } + .pull-md-1 { + right: 8.333333%; + } + .pull-md-2 { + right: 16.666667%; + } + .pull-md-3 { + right: 25%; + } + .pull-md-4 { + right: 33.333333%; + } + .pull-md-5 { + right: 41.666667%; + } + .pull-md-6 { + right: 50%; + } + .pull-md-7 { + right: 58.333333%; + } + .pull-md-8 { + right: 66.666667%; + } + .pull-md-9 { + right: 75%; + } + .pull-md-10 { + right: 83.333333%; + } + .pull-md-11 { + right: 91.666667%; + } + .pull-md-12 { + right: 100%; + } + .push-md-0 { + left: auto; + } + .push-md-1 { + left: 8.333333%; + } + .push-md-2 { + left: 16.666667%; + } + .push-md-3 { + left: 25%; + } + .push-md-4 { + left: 33.333333%; + } + .push-md-5 { + left: 41.666667%; + } + .push-md-6 { + left: 50%; + } + .push-md-7 { + left: 58.333333%; + } + .push-md-8 { + left: 66.666667%; + } + .push-md-9 { + left: 75%; + } + .push-md-10 { + left: 83.333333%; + } + .push-md-11 { + left: 91.666667%; + } + .push-md-12 { + left: 100%; + } + .offset-md-0 { + margin-left: 0%; + } + .offset-md-1 { + margin-left: 8.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 992px) { + .col-lg { + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-lg-auto { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 8.333333%; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-lg-2 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 16.666667%; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-3 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 25%; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 33.333333%; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-lg-5 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 41.666667%; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-lg-6 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 50%; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 58.333333%; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-lg-8 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 66.666667%; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-lg-9 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 75%; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 83.333333%; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-lg-11 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 91.666667%; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-lg-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .pull-lg-0 { + right: auto; + } + .pull-lg-1 { + right: 8.333333%; + } + .pull-lg-2 { + right: 16.666667%; + } + .pull-lg-3 { + right: 25%; + } + .pull-lg-4 { + right: 33.333333%; + } + .pull-lg-5 { + right: 41.666667%; + } + .pull-lg-6 { + right: 50%; + } + .pull-lg-7 { + right: 58.333333%; + } + .pull-lg-8 { + right: 66.666667%; + } + .pull-lg-9 { + right: 75%; + } + .pull-lg-10 { + right: 83.333333%; + } + .pull-lg-11 { + right: 91.666667%; + } + .pull-lg-12 { + right: 100%; + } + .push-lg-0 { + left: auto; + } + .push-lg-1 { + left: 8.333333%; + } + .push-lg-2 { + left: 16.666667%; + } + .push-lg-3 { + left: 25%; + } + .push-lg-4 { + left: 33.333333%; + } + .push-lg-5 { + left: 41.666667%; + } + .push-lg-6 { + left: 50%; + } + .push-lg-7 { + left: 58.333333%; + } + .push-lg-8 { + left: 66.666667%; + } + .push-lg-9 { + left: 75%; + } + .push-lg-10 { + left: 83.333333%; + } + .push-lg-11 { + left: 91.666667%; + } + .push-lg-12 { + left: 100%; + } + .offset-lg-0 { + margin-left: 0%; + } + .offset-lg-1 { + margin-left: 8.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 1200px) { + .col-xl { + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-xl-auto { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 8.333333%; + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-xl-2 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 16.666667%; + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-3 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 25%; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 33.333333%; + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-xl-5 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 41.666667%; + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-xl-6 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 50%; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 58.333333%; + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-xl-8 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 66.666667%; + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-xl-9 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 75%; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 83.333333%; + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-xl-11 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 91.666667%; + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-xl-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .pull-xl-0 { + right: auto; + } + .pull-xl-1 { + right: 8.333333%; + } + .pull-xl-2 { + right: 16.666667%; + } + .pull-xl-3 { + right: 25%; + } + .pull-xl-4 { + right: 33.333333%; + } + .pull-xl-5 { + right: 41.666667%; + } + .pull-xl-6 { + right: 50%; + } + .pull-xl-7 { + right: 58.333333%; + } + .pull-xl-8 { + right: 66.666667%; + } + .pull-xl-9 { + right: 75%; + } + .pull-xl-10 { + right: 83.333333%; + } + .pull-xl-11 { + right: 91.666667%; + } + .pull-xl-12 { + right: 100%; + } + .push-xl-0 { + left: auto; + } + .push-xl-1 { + left: 8.333333%; + } + .push-xl-2 { + left: 16.666667%; + } + .push-xl-3 { + left: 25%; + } + .push-xl-4 { + left: 33.333333%; + } + .push-xl-5 { + left: 41.666667%; + } + .push-xl-6 { + left: 50%; + } + .push-xl-7 { + left: 58.333333%; + } + .push-xl-8 { + left: 66.666667%; + } + .push-xl-9 { + left: 75%; + } + .push-xl-10 { + left: 83.333333%; + } + .push-xl-11 { + left: 91.666667%; + } + .push-xl-12 { + left: 100%; + } + .offset-xl-0 { + margin-left: 0%; + } + .offset-xl-1 { + margin-left: 8.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; +} + +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #eceeef; +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #eceeef; +} + +.table tbody + tbody { + border-top: 2px solid #eceeef; +} + +.table .table { + background-color: #fff; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #eceeef; +} + +.table-bordered th, +.table-bordered td { + border: 1px solid #eceeef; +} + +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #dff0d8; +} + +.table-hover .table-success:hover { + background-color: #d0e9c6; +} + +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #d0e9c6; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #d9edf7; +} + +.table-hover .table-info:hover { + background-color: #c4e3f3; +} + +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #c4e3f3; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #fcf8e3; +} + +.table-hover .table-warning:hover { + background-color: #faf2cc; +} + +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #faf2cc; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f2dede; +} + +.table-hover .table-danger:hover { + background-color: #ebcccc; +} + +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #ebcccc; +} + +.thead-inverse th { + color: #fff; + background-color: #292b2c; +} + +.thead-default th { + color: #464a4c; + background-color: #eceeef; +} + +.table-inverse { + color: #fff; + background-color: #292b2c; +} + +.table-inverse th, +.table-inverse td, +.table-inverse thead th { + border-color: #fff; +} + +.table-inverse.table-bordered { + border: 0; +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -ms-overflow-style: -ms-autohiding-scrollbar; +} + +.table-responsive.table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + padding: 0.5rem 0.75rem; + font-size: 1rem; + line-height: 1.25; + color: #464a4c; + background-color: #fff; + background-image: none; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; + -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} + +.form-control:focus { + color: #464a4c; + background-color: #fff; + border-color: #5cb3fd; + outline: none; +} + +.form-control::-webkit-input-placeholder { + color: #636c72; + opacity: 1; +} + +.form-control::-moz-placeholder { + color: #636c72; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #636c72; + opacity: 1; +} + +.form-control::placeholder { + color: #636c72; + opacity: 1; +} + +.form-control:disabled, .form-control[readonly] { + background-color: #eceeef; + opacity: 1; +} + +.form-control:disabled { + cursor: not-allowed; +} + +select.form-control:not([size]):not([multiple]) { + height: calc(2.25rem + 2px); +} + +select.form-control:focus::-ms-value { + color: #464a4c; + background-color: #fff; +} + +.form-control-file, +.form-control-range { + display: block; +} + +.col-form-label { + padding-top: calc(0.5rem - 1px * 2); + padding-bottom: calc(0.5rem - 1px * 2); + margin-bottom: 0; +} + +.col-form-label-lg { + padding-top: calc(0.75rem - 1px * 2); + padding-bottom: calc(0.75rem - 1px * 2); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.25rem - 1px * 2); + padding-bottom: calc(0.25rem - 1px * 2); + font-size: 0.875rem; +} + +.col-form-legend { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + margin-bottom: 0; + font-size: 1rem; +} + +.form-control-static { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + margin-bottom: 0; + line-height: 1.25; + border: solid transparent; + border-width: 1px 0; +} + +.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control, +.input-group-sm > .form-control-static.input-group-addon, +.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control, +.input-group-lg > .form-control-static.input-group-addon, +.input-group-lg > .input-group-btn > .form-control-static.btn { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm, .input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]), +.input-group-sm > select.input-group-addon:not([size]):not([multiple]), +.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) { + height: 1.8125rem; +} + +.form-control-lg, .input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]), +.input-group-lg > select.input-group-addon:not([size]):not([multiple]), +.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) { + height: 3.166667rem; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-check { + position: relative; + display: block; + margin-bottom: 0.5rem; +} + +.form-check.disabled .form-check-label { + color: #636c72; + cursor: not-allowed; +} + +.form-check-label { + padding-left: 1.25rem; + margin-bottom: 0; + cursor: pointer; +} + +.form-check-input { + position: absolute; + margin-top: 0.25rem; + margin-left: -1.25rem; +} + +.form-check-input:only-child { + position: static; +} + +.form-check-inline { + display: inline-block; +} + +.form-check-inline .form-check-label { + vertical-align: middle; +} + +.form-check-inline + .form-check-inline { + margin-left: 0.75rem; +} + +.form-control-feedback { + margin-top: 0.25rem; +} + +.form-control-success, +.form-control-warning, +.form-control-danger { + padding-right: 2.25rem; + background-repeat: no-repeat; + background-position: center right 0.5625rem; + -webkit-background-size: 1.125rem 1.125rem; + background-size: 1.125rem 1.125rem; +} + +.has-success .form-control-feedback, +.has-success .form-control-label, +.has-success .col-form-label, +.has-success .form-check-label, +.has-success .custom-control { + color: #5cb85c; +} + +.has-success .form-control { + border-color: #5cb85c; +} + +.has-success .input-group-addon { + color: #5cb85c; + border-color: #5cb85c; + background-color: #eaf6ea; +} + +.has-success .form-control-success { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E"); +} + +.has-warning .form-control-feedback, +.has-warning .form-control-label, +.has-warning .col-form-label, +.has-warning .form-check-label, +.has-warning .custom-control { + color: #f0ad4e; +} + +.has-warning .form-control { + border-color: #f0ad4e; +} + +.has-warning .input-group-addon { + color: #f0ad4e; + border-color: #f0ad4e; + background-color: white; +} + +.has-warning .form-control-warning { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E"); +} + +.has-danger .form-control-feedback, +.has-danger .form-control-label, +.has-danger .col-form-label, +.has-danger .form-check-label, +.has-danger .custom-control { + color: #d9534f; +} + +.has-danger .form-control { + border-color: #d9534f; +} + +.has-danger .input-group-addon { + color: #d9534f; + border-color: #d9534f; + background-color: #fdf7f7; +} + +.has-danger .form-control-danger { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E"); +} + +.form-inline { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; +} + +.form-inline .form-check { + width: 100%; +} + +@media (min-width: 576px) { + .form-inline label { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + width: auto; + } + .form-inline .form-control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-check { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + width: auto; + margin-top: 0; + margin-bottom: 0; + } + .form-inline .form-check-label { + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0; + } + .form-inline .custom-control-indicator { + position: static; + display: inline-block; + margin-right: 0.25rem; + vertical-align: text-bottom; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} + +.btn { + display: inline-block; + font-weight: normal; + line-height: 1.25; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border: 1px solid transparent; + padding: 0.5rem 1rem; + font-size: 1rem; + border-radius: 0.25rem; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.btn:focus, .btn:hover { + text-decoration: none; +} + +.btn:focus, .btn.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25); + box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25); +} + +.btn.disabled, .btn:disabled { + cursor: not-allowed; + opacity: .65; +} + +.btn:active, .btn.active { + background-image: none; +} + +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} + +.btn-primary { + color: #fff; + background-color: #0275d8; + border-color: #0275d8; +} + +.btn-primary:hover { + color: #fff; + background-color: #025aa5; + border-color: #01549b; +} + +.btn-primary:focus, .btn-primary.focus { + -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5); + box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + background-color: #0275d8; + border-color: #0275d8; +} + +.btn-primary:active, .btn-primary.active, +.show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #025aa5; + background-image: none; + border-color: #01549b; +} + +.btn-secondary { + color: #292b2c; + background-color: #fff; + border-color: #ccc; +} + +.btn-secondary:hover { + color: #292b2c; + background-color: #e6e6e6; + border-color: #adadad; +} + +.btn-secondary:focus, .btn-secondary.focus { + -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5); + box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + background-color: #fff; + border-color: #ccc; +} + +.btn-secondary:active, .btn-secondary.active, +.show > .btn-secondary.dropdown-toggle { + color: #292b2c; + background-color: #e6e6e6; + background-image: none; + border-color: #adadad; +} + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #5bc0de; +} + +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #2aabd2; +} + +.btn-info:focus, .btn-info.focus { + -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5); + box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + background-color: #5bc0de; + border-color: #5bc0de; +} + +.btn-info:active, .btn-info.active, +.show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #31b0d5; + background-image: none; + border-color: #2aabd2; +} + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #5cb85c; +} + +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #419641; +} + +.btn-success:focus, .btn-success.focus { + -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5); + box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + background-color: #5cb85c; + border-color: #5cb85c; +} + +.btn-success:active, .btn-success.active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #449d44; + background-image: none; + border-color: #419641; +} + +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #f0ad4e; +} + +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #eb9316; +} + +.btn-warning:focus, .btn-warning.focus { + -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5); + box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + background-color: #f0ad4e; + border-color: #f0ad4e; +} + +.btn-warning:active, .btn-warning.active, +.show > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #ec971f; + background-image: none; + border-color: #eb9316; +} + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d9534f; +} + +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #c12e2a; +} + +.btn-danger:focus, .btn-danger.focus { + -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5); + box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + background-color: #d9534f; + border-color: #d9534f; +} + +.btn-danger:active, .btn-danger.active, +.show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #c9302c; + background-image: none; + border-color: #c12e2a; +} + +.btn-outline-primary { + color: #0275d8; + background-image: none; + background-color: transparent; + border-color: #0275d8; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #0275d8; + border-color: #0275d8; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5); + box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #0275d8; + background-color: transparent; +} + +.btn-outline-primary:active, .btn-outline-primary.active, +.show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #0275d8; + border-color: #0275d8; +} + +.btn-outline-secondary { + color: #ccc; + background-image: none; + background-color: transparent; + border-color: #ccc; +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #ccc; + border-color: #ccc; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5); + box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #ccc; + background-color: transparent; +} + +.btn-outline-secondary:active, .btn-outline-secondary.active, +.show > .btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #ccc; + border-color: #ccc; +} + +.btn-outline-info { + color: #5bc0de; + background-image: none; + background-color: transparent; + border-color: #5bc0de; +} + +.btn-outline-info:hover { + color: #fff; + background-color: #5bc0de; + border-color: #5bc0de; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5); + box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #5bc0de; + background-color: transparent; +} + +.btn-outline-info:active, .btn-outline-info.active, +.show > .btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #5bc0de; + border-color: #5bc0de; +} + +.btn-outline-success { + color: #5cb85c; + background-image: none; + background-color: transparent; + border-color: #5cb85c; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #5cb85c; + border-color: #5cb85c; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5); + box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #5cb85c; + background-color: transparent; +} + +.btn-outline-success:active, .btn-outline-success.active, +.show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #5cb85c; + border-color: #5cb85c; +} + +.btn-outline-warning { + color: #f0ad4e; + background-image: none; + background-color: transparent; + border-color: #f0ad4e; +} + +.btn-outline-warning:hover { + color: #fff; + background-color: #f0ad4e; + border-color: #f0ad4e; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5); + box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #f0ad4e; + background-color: transparent; +} + +.btn-outline-warning:active, .btn-outline-warning.active, +.show > .btn-outline-warning.dropdown-toggle { + color: #fff; + background-color: #f0ad4e; + border-color: #f0ad4e; +} + +.btn-outline-danger { + color: #d9534f; + background-image: none; + background-color: transparent; + border-color: #d9534f; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #d9534f; + border-color: #d9534f; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5); + box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #d9534f; + background-color: transparent; +} + +.btn-outline-danger:active, .btn-outline-danger.active, +.show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #d9534f; + border-color: #d9534f; +} + +.btn-link { + font-weight: normal; + color: #0275d8; + border-radius: 0; +} + +.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled { + background-color: transparent; +} + +.btn-link, .btn-link:focus, .btn-link:active { + border-color: transparent; +} + +.btn-link:hover { + border-color: transparent; +} + +.btn-link:focus, .btn-link:hover { + color: #014c8c; + text-decoration: underline; + background-color: transparent; +} + +.btn-link:disabled { + color: #636c72; +} + +.btn-link:disabled:focus, .btn-link:disabled:hover { + text-decoration: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.show { + opacity: 1; +} + +.collapse { + display: none; +} + +.collapse.show { + display: block; +} + +tr.collapse.show { + display: table-row; +} + +tbody.collapse.show { + display: table-row-group; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.3em; + vertical-align: middle; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-left: 0.3em solid transparent; +} + +.dropdown-toggle:focus { + outline: 0; +} + +.dropup .dropdown-toggle::after { + border-top: 0; + border-bottom: 0.3em solid; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #292b2c; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropdown-divider { + height: 1px; + margin: 0.5rem 0; + overflow: hidden; + background-color: #eceeef; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 3px 1.5rem; + clear: both; + font-weight: normal; + color: #292b2c; + text-align: inherit; + white-space: nowrap; + background: none; + border: 0; +} + +.dropdown-item:focus, .dropdown-item:hover { + color: #1d1e1f; + text-decoration: none; + background-color: #f7f7f9; +} + +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #0275d8; +} + +.dropdown-item.disabled, .dropdown-item:disabled { + color: #636c72; + cursor: not-allowed; + background-color: transparent; +} + +.show > .dropdown-menu { + display: block; +} + +.show > a { + outline: 0; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +.dropdown-menu-left { + right: auto; + left: 0; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #636c72; + white-space: nowrap; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 0.125rem; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + -webkit-box-flex: 0; + -webkit-flex: 0 1 auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 2; +} + +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 2; +} + +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group, +.btn-group-vertical .btn + .btn, +.btn-group-vertical .btn + .btn-group, +.btn-group-vertical .btn-group + .btn, +.btn-group-vertical .btn-group + .btn-group { + margin-left: -1px; +} + +.btn-toolbar { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; +} + +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group > .btn-group { + float: left; +} + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn + .dropdown-toggle-split::after { + margin-left: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 1.125rem; + padding-left: 1.125rem; +} + +.btn-group-vertical { + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: start; + -webkit-align-items: flex-start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; +} + +.btn-group-vertical .btn, +.btn-group-vertical .btn-group { + width: 100%; +} + +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 100%; +} + +.input-group .form-control { + position: relative; + z-index: 2; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; +} + +.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover { + z-index: 3; +} + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; +} + +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.input-group-addon, +.input-group-btn { + white-space: nowrap; + vertical-align: middle; +} + +.input-group-addon { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: normal; + line-height: 1.25; + color: #464a4c; + text-align: center; + background-color: #eceeef; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.input-group-addon.form-control-sm, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .input-group-addon.btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.input-group-addon.form-control-lg, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .input-group-addon.btn { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} + +.input-group .form-control:not(:last-child), +.input-group-addon:not(:last-child), +.input-group-btn:not(:last-child) > .btn, +.input-group-btn:not(:last-child) > .btn-group > .btn, +.input-group-btn:not(:last-child) > .dropdown-toggle, +.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.input-group-addon:not(:last-child) { + border-right: 0; +} + +.input-group .form-control:not(:first-child), +.input-group-addon:not(:first-child), +.input-group-btn:not(:first-child) > .btn, +.input-group-btn:not(:first-child) > .btn-group > .btn, +.input-group-btn:not(:first-child) > .dropdown-toggle, +.input-group-btn:not(:last-child) > .btn:not(:first-child), +.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.form-control + .input-group-addon:not(:first-child) { + border-left: 0; +} + +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} + +.input-group-btn > .btn { + position: relative; + -webkit-box-flex: 1; + -webkit-flex: 1 1 0%; + -ms-flex: 1 1 0%; + flex: 1 1 0%; +} + +.input-group-btn > .btn + .btn { + margin-left: -1px; +} + +.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover { + z-index: 3; +} + +.input-group-btn:not(:last-child) > .btn, +.input-group-btn:not(:last-child) > .btn-group { + margin-right: -1px; +} + +.input-group-btn:not(:first-child) > .btn, +.input-group-btn:not(:first-child) > .btn-group { + z-index: 2; + margin-left: -1px; +} + +.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover, +.input-group-btn:not(:first-child) > .btn-group:focus, +.input-group-btn:not(:first-child) > .btn-group:active, +.input-group-btn:not(:first-child) > .btn-group:hover { + z-index: 3; +} + +.custom-control { + position: relative; + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + min-height: 1.5rem; + padding-left: 1.5rem; + margin-right: 1rem; + cursor: pointer; +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; +} + +.custom-control-input:checked ~ .custom-control-indicator { + color: #fff; + background-color: #0275d8; +} + +.custom-control-input:focus ~ .custom-control-indicator { + -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8; +} + +.custom-control-input:active ~ .custom-control-indicator { + color: #fff; + background-color: #8fcafe; +} + +.custom-control-input:disabled ~ .custom-control-indicator { + cursor: not-allowed; + background-color: #eceeef; +} + +.custom-control-input:disabled ~ .custom-control-description { + color: #636c72; + cursor: not-allowed; +} + +.custom-control-indicator { + position: absolute; + top: 0.25rem; + left: 0; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #ddd; + background-repeat: no-repeat; + background-position: center center; + -webkit-background-size: 50% 50%; + background-size: 50% 50%; +} + +.custom-checkbox .custom-control-indicator { + border-radius: 0.25rem; +} + +.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"); +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator { + background-color: #0275d8; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E"); +} + +.custom-radio .custom-control-indicator { + border-radius: 50%; +} + +.custom-radio .custom-control-input:checked ~ .custom-control-indicator { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E"); +} + +.custom-controls-stacked { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; +} + +.custom-controls-stacked .custom-control { + margin-bottom: 0.25rem; +} + +.custom-controls-stacked .custom-control + .custom-control { + margin-left: 0; +} + +.custom-select { + display: inline-block; + max-width: 100%; + height: calc(2.25rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + line-height: 1.25; + color: #464a4c; + vertical-align: middle; + background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; + -webkit-background-size: 8px 10px; + background-size: 8px 10px; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; + -moz-appearance: none; + -webkit-appearance: none; +} + +.custom-select:focus { + border-color: #5cb3fd; + outline: none; +} + +.custom-select:focus::-ms-value { + color: #464a4c; + background-color: #fff; +} + +.custom-select:disabled { + color: #636c72; + cursor: not-allowed; + background-color: #eceeef; +} + +.custom-select::-ms-expand { + opacity: 0; +} + +.custom-select-sm { + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 75%; +} + +.custom-file { + position: relative; + display: inline-block; + max-width: 100%; + height: 2.5rem; + margin-bottom: 0; + cursor: pointer; +} + +.custom-file-input { + min-width: 14rem; + max-width: 100%; + height: 2.5rem; + margin: 0; + filter: alpha(opacity=0); + opacity: 0; +} + +.custom-file-control { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 5; + height: 2.5rem; + padding: 0.5rem 1rem; + line-height: 1.5; + color: #464a4c; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.custom-file-control:lang(en)::after { + content: "Choose file..."; +} + +.custom-file-control::before { + position: absolute; + top: -1px; + right: -1px; + bottom: -1px; + z-index: 6; + display: block; + height: 2.5rem; + padding: 0.5rem 1rem; + line-height: 1.5; + color: #464a4c; + background-color: #eceeef; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0 0.25rem 0.25rem 0; +} + +.custom-file-control:lang(en)::before { + content: "Browse"; +} + +.nav { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5em 1em; +} + +.nav-link:focus, .nav-link:hover { + text-decoration: none; +} + +.nav-link.disabled { + color: #636c72; + cursor: not-allowed; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs .nav-item { + margin-bottom: -1px; +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-right-radius: 0.25rem; + border-top-left-radius: 0.25rem; +} + +.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { + border-color: #eceeef #eceeef #ddd; +} + +.nav-tabs .nav-link.disabled { + color: #636c72; + background-color: transparent; + border-color: transparent; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #464a4c; + background-color: #fff; + border-color: #ddd #ddd #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} + +.nav-pills .nav-link.active, +.nav-pills .nav-item.show .nav-link { + color: #fff; + cursor: default; + background-color: #0275d8; +} + +.nav-fill .nav-item { + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + -webkit-box-flex: 1; + -webkit-flex: 1 1 100%; + -ms-flex: 1 1 100%; + flex: 1 1 100%; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + padding: 0.5rem 1rem; +} + +.navbar-brand { + display: inline-block; + padding-top: .25rem; + padding-bottom: .25rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} + +.navbar-brand:focus, .navbar-brand:hover { + text-decoration: none; +} + +.navbar-nav { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} + +.navbar-text { + display: inline-block; + padding-top: .425rem; + padding-bottom: .425rem; +} + +.navbar-toggler { + -webkit-align-self: flex-start; + -ms-flex-item-align: start; + align-self: flex-start; + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.navbar-toggler:focus, .navbar-toggler:hover { + text-decoration: none; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + -webkit-background-size: 100% 100%; + background-size: 100% 100%; +} + +.navbar-toggler-left { + position: absolute; + left: 1rem; +} + +.navbar-toggler-right { + position: absolute; + right: 1rem; +} + +@media (max-width: 575px) { + .navbar-toggleable .navbar-nav .dropdown-menu { + position: static; + float: none; + } + .navbar-toggleable > .container { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 576px) { + .navbar-toggleable { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + } + .navbar-toggleable .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-toggleable .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem; + } + .navbar-toggleable > .container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + } + .navbar-toggleable .navbar-collapse { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; + width: 100%; + } + .navbar-toggleable .navbar-toggler { + display: none; + } +} + +@media (max-width: 767px) { + .navbar-toggleable-sm .navbar-nav .dropdown-menu { + position: static; + float: none; + } + .navbar-toggleable-sm > .container { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 768px) { + .navbar-toggleable-sm { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + } + .navbar-toggleable-sm .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-toggleable-sm .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem; + } + .navbar-toggleable-sm > .container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + } + .navbar-toggleable-sm .navbar-collapse { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; + width: 100%; + } + .navbar-toggleable-sm .navbar-toggler { + display: none; + } +} + +@media (max-width: 991px) { + .navbar-toggleable-md .navbar-nav .dropdown-menu { + position: static; + float: none; + } + .navbar-toggleable-md > .container { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 992px) { + .navbar-toggleable-md { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + } + .navbar-toggleable-md .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-toggleable-md .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem; + } + .navbar-toggleable-md > .container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + } + .navbar-toggleable-md .navbar-collapse { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; + width: 100%; + } + .navbar-toggleable-md .navbar-toggler { + display: none; + } +} + +@media (max-width: 1199px) { + .navbar-toggleable-lg .navbar-nav .dropdown-menu { + position: static; + float: none; + } + .navbar-toggleable-lg > .container { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 1200px) { + .navbar-toggleable-lg { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + } + .navbar-toggleable-lg .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-toggleable-lg .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem; + } + .navbar-toggleable-lg > .container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + } + .navbar-toggleable-lg .navbar-collapse { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; + width: 100%; + } + .navbar-toggleable-lg .navbar-toggler { + display: none; + } +} + +.navbar-toggleable-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; +} + +.navbar-toggleable-xl .navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-toggleable-xl > .container { + padding-right: 0; + padding-left: 0; +} + +.navbar-toggleable-xl .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; +} + +.navbar-toggleable-xl .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem; +} + +.navbar-toggleable-xl > .container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; +} + +.navbar-toggleable-xl .navbar-collapse { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; + width: 100%; +} + +.navbar-toggleable-xl .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand, +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover, +.navbar-light .navbar-toggler:focus, +.navbar-light .navbar-toggler:hover { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .open > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.open, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-toggler { + color: white; +} + +.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-toggler:focus, +.navbar-inverse .navbar-toggler:hover { + color: white; +} + +.navbar-inverse .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .nav-link:hover { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-inverse .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-inverse .navbar-nav .open > .nav-link, +.navbar-inverse .navbar-nav .active > .nav-link, +.navbar-inverse .navbar-nav .nav-link.open, +.navbar-inverse .navbar-nav .nav-link.active { + color: white; +} + +.navbar-inverse .navbar-toggler { + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-inverse .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"); +} + +.navbar-inverse .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +.card { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} + +.card-block { + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card > .list-group:first-child .list-group-item:first-child { + border-top-right-radius: 0.25rem; + border-top-left-radius: 0.25rem; +} + +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: #f7f7f9; + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: #f7f7f9; + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-primary { + background-color: #0275d8; + border-color: #0275d8; +} + +.card-primary .card-header, +.card-primary .card-footer { + background-color: transparent; +} + +.card-success { + background-color: #5cb85c; + border-color: #5cb85c; +} + +.card-success .card-header, +.card-success .card-footer { + background-color: transparent; +} + +.card-info { + background-color: #5bc0de; + border-color: #5bc0de; +} + +.card-info .card-header, +.card-info .card-footer { + background-color: transparent; +} + +.card-warning { + background-color: #f0ad4e; + border-color: #f0ad4e; +} + +.card-warning .card-header, +.card-warning .card-footer { + background-color: transparent; +} + +.card-danger { + background-color: #d9534f; + border-color: #d9534f; +} + +.card-danger .card-header, +.card-danger .card-footer { + background-color: transparent; +} + +.card-outline-primary { + background-color: transparent; + border-color: #0275d8; +} + +.card-outline-secondary { + background-color: transparent; + border-color: #ccc; +} + +.card-outline-info { + background-color: transparent; + border-color: #5bc0de; +} + +.card-outline-success { + background-color: transparent; + border-color: #5cb85c; +} + +.card-outline-warning { + background-color: transparent; + border-color: #f0ad4e; +} + +.card-outline-danger { + background-color: transparent; + border-color: #d9534f; +} + +.card-inverse { + color: rgba(255, 255, 255, 0.65); +} + +.card-inverse .card-header, +.card-inverse .card-footer { + background-color: transparent; + border-color: rgba(255, 255, 255, 0.2); +} + +.card-inverse .card-header, +.card-inverse .card-footer, +.card-inverse .card-title, +.card-inverse .card-blockquote { + color: #fff; +} + +.card-inverse .card-link, +.card-inverse .card-text, +.card-inverse .card-subtitle, +.card-inverse .card-blockquote .blockquote-footer { + color: rgba(255, 255, 255, 0.65); +} + +.card-inverse .card-link:focus, .card-inverse .card-link:hover { + color: #fff; +} + +.card-blockquote { + padding: 0; + margin-bottom: 0; + border-left: 0; +} + +.card-img { + border-radius: calc(0.25rem - 1px); +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img-top { + border-top-right-radius: calc(0.25rem - 1px); + border-top-left-radius: calc(0.25rem - 1px); +} + +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +@media (min-width: 576px) { + .card-deck { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-deck .card { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1 0 0%; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + } + .card-deck .card:not(:first-child) { + margin-left: 15px; + } + .card-deck .card:not(:last-child) { + margin-right: 15px; + } +} + +@media (min-width: 576px) { + .card-group { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-group .card { + -webkit-box-flex: 1; + -webkit-flex: 1 0 0%; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .card-group .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group .card:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + .card-group .card:first-child .card-img-top { + border-top-right-radius: 0; + } + .card-group .card:first-child .card-img-bottom { + border-bottom-right-radius: 0; + } + .card-group .card:last-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + .card-group .card:last-child .card-img-top { + border-top-left-radius: 0; + } + .card-group .card:last-child .card-img-bottom { + border-bottom-left-radius: 0; + } + .card-group .card:not(:first-child):not(:last-child) { + border-radius: 0; + } + .card-group .card:not(:first-child):not(:last-child) .card-img-top, + .card-group .card:not(:first-child):not(:last-child) .card-img-bottom { + border-radius: 0; + } +} + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + } + .card-columns .card { + display: inline-block; + width: 100%; + margin-bottom: 0.75rem; + } +} + +.breadcrumb { + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #eceeef; + border-radius: 0.25rem; +} + +.breadcrumb::after { + display: block; + content: ""; + clear: both; +} + +.breadcrumb-item { + float: left; +} + +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + padding-left: 0.5rem; + color: #636c72; + content: "/"; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} + +.breadcrumb-item.active { + color: #636c72; +} + +.pagination { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-item:first-child .page-link { + margin-left: 0; + border-bottom-left-radius: 0.25rem; + border-top-left-radius: 0.25rem; +} + +.page-item:last-child .page-link { + border-bottom-right-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.page-item.active .page-link { + z-index: 2; + color: #fff; + background-color: #0275d8; + border-color: #0275d8; +} + +.page-item.disabled .page-link { + color: #636c72; + pointer-events: none; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #0275d8; + background-color: #fff; + border: 1px solid #ddd; +} + +.page-link:focus, .page-link:hover { + color: #014c8c; + text-decoration: none; + background-color: #eceeef; + border-color: #ddd; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; +} + +.pagination-lg .page-item:first-child .page-link { + border-bottom-left-radius: 0.3rem; + border-top-left-radius: 0.3rem; +} + +.pagination-lg .page-item:last-child .page-link { + border-bottom-right-radius: 0.3rem; + border-top-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; +} + +.pagination-sm .page-item:first-child .page-link { + border-bottom-left-radius: 0.2rem; + border-top-left-radius: 0.2rem; +} + +.pagination-sm .page-item:last-child .page-link { + border-bottom-right-radius: 0.2rem; + border-top-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +a.badge:focus, a.badge:hover { + color: #fff; + text-decoration: none; + cursor: pointer; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-default { + background-color: #636c72; +} + +.badge-default[href]:focus, .badge-default[href]:hover { + background-color: #4b5257; +} + +.badge-primary { + background-color: #0275d8; +} + +.badge-primary[href]:focus, .badge-primary[href]:hover { + background-color: #025aa5; +} + +.badge-success { + background-color: #5cb85c; +} + +.badge-success[href]:focus, .badge-success[href]:hover { + background-color: #449d44; +} + +.badge-info { + background-color: #5bc0de; +} + +.badge-info[href]:focus, .badge-info[href]:hover { + background-color: #31b0d5; +} + +.badge-warning { + background-color: #f0ad4e; +} + +.badge-warning[href]:focus, .badge-warning[href]:hover { + background-color: #ec971f; +} + +.badge-danger { + background-color: #d9534f; +} + +.badge-danger[href]:focus, .badge-danger[href]:hover { + background-color: #c9302c; +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #eceeef; + border-radius: 0.3rem; +} + +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-hr { + border-top-color: #d0d5d8; +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: bold; +} + +.alert-dismissible .close { + position: relative; + top: -0.75rem; + right: -1.25rem; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-success { + background-color: #dff0d8; + border-color: #d0e9c6; + color: #3c763d; +} + +.alert-success hr { + border-top-color: #c1e2b3; +} + +.alert-success .alert-link { + color: #2b542c; +} + +.alert-info { + background-color: #d9edf7; + border-color: #bcdff1; + color: #31708f; +} + +.alert-info hr { + border-top-color: #a6d5ec; +} + +.alert-info .alert-link { + color: #245269; +} + +.alert-warning { + background-color: #fcf8e3; + border-color: #faf2cc; + color: #8a6d3b; +} + +.alert-warning hr { + border-top-color: #f7ecb5; +} + +.alert-warning .alert-link { + color: #66512c; +} + +.alert-danger { + background-color: #f2dede; + border-color: #ebcccc; + color: #a94442; +} + +.alert-danger hr { + border-top-color: #e4b9b9; +} + +.alert-danger .alert-link { + color: #843534; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +.progress { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + overflow: hidden; + font-size: 0.75rem; + line-height: 1rem; + text-align: center; + background-color: #eceeef; + border-radius: 0.25rem; +} + +.progress-bar { + height: 1rem; + color: #fff; + background-color: #0275d8; +} + +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 1rem 1rem; + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + -o-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite; +} + +.media { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -webkit-align-items: flex-start; + -ms-flex-align: start; + align-items: flex-start; +} + +.media-body { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0%; + -ms-flex: 1 1 0%; + flex: 1 1 0%; +} + +.list-group { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #464a4c; + text-align: inherit; +} + +.list-group-item-action .list-group-item-heading { + color: #292b2c; +} + +.list-group-item-action:focus, .list-group-item-action:hover { + color: #464a4c; + text-decoration: none; + background-color: #f7f7f9; +} + +.list-group-item-action:active { + color: #292b2c; + background-color: #eceeef; +} + +.list-group-item { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} + +.list-group-item:first-child { + border-top-right-radius: 0.25rem; + border-top-left-radius: 0.25rem; +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.list-group-item:focus, .list-group-item:hover { + text-decoration: none; +} + +.list-group-item.disabled, .list-group-item:disabled { + color: #636c72; + cursor: not-allowed; + background-color: #fff; +} + +.list-group-item.disabled .list-group-item-heading, .list-group-item:disabled .list-group-item-heading { + color: inherit; +} + +.list-group-item.disabled .list-group-item-text, .list-group-item:disabled .list-group-item-text { + color: #636c72; +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #0275d8; + border-color: #0275d8; +} + +.list-group-item.active .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small { + color: inherit; +} + +.list-group-item.active .list-group-item-text { + color: #daeeff; +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} + +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; +} + +.list-group-flush:last-child .list-group-item:last-child { + border-bottom: 0; +} + +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} + +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} + +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} + +a.list-group-item-success:focus, a.list-group-item-success:hover, +button.list-group-item-success:focus, +button.list-group-item-success:hover { + color: #3c763d; + background-color: #d0e9c6; +} + +a.list-group-item-success.active, +button.list-group-item-success.active { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} + +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} + +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} + +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} + +a.list-group-item-info:focus, a.list-group-item-info:hover, +button.list-group-item-info:focus, +button.list-group-item-info:hover { + color: #31708f; + background-color: #c4e3f3; +} + +a.list-group-item-info.active, +button.list-group-item-info.active { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} + +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} + +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} + +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} + +a.list-group-item-warning:focus, a.list-group-item-warning:hover, +button.list-group-item-warning:focus, +button.list-group-item-warning:hover { + color: #8a6d3b; + background-color: #faf2cc; +} + +a.list-group-item-warning.active, +button.list-group-item-warning.active { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} + +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} + +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} + +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} + +a.list-group-item-danger:focus, a.list-group-item-danger:hover, +button.list-group-item-danger:focus, +button.list-group-item-danger:hover { + color: #a94442; + background-color: #ebcccc; +} + +a.list-group-item-danger.active, +button.list-group-item-danger.active { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} + +.embed-responsive::before { + display: block; + content: ""; +} + +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.857143%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-4by3::before { + padding-top: 75%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; +} + +.close:focus, .close:hover { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: .75; +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + outline: 0; +} + +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform 0.3s ease-out; + transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out; + -webkit-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} + +.modal.show .modal-dialog { + -webkit-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} + +.modal-content { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 15px; + border-bottom: 1px solid #eceeef; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 15px; +} + +.modal-footer { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 15px; + border-top: 1px solid #eceeef; +} + +.modal-footer > :not(:first-child) { + margin-left: .25rem; +} + +.modal-footer > :not(:last-child) { + margin-right: .25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 30px auto; + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg { + max-width: 800px; + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} + +.tooltip.show { + opacity: 0.9; +} + +.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before { + bottom: 0; + left: 50%; + margin-left: -5px; + content: ""; + border-width: 5px 5px 0; + border-top-color: #000; +} + +.tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before { + top: 50%; + left: 0; + margin-top: -5px; + content: ""; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} + +.tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before { + top: 0; + left: 50%; + margin-left: -5px; + content: ""; + border-width: 0 5px 5px; + border-bottom-color: #000; +} + +.tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before { + top: 50%; + right: 0; + margin-top: -5px; + content: ""; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.tooltip-inner::before { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + padding: 1px; + font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} + +.popover.popover-top, .popover.bs-tether-element-attached-bottom { + margin-top: -10px; +} + +.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after { + left: 50%; + border-bottom-width: 0; +} + +.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before { + bottom: -11px; + margin-left: -11px; + border-top-color: rgba(0, 0, 0, 0.25); +} + +.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after { + bottom: -10px; + margin-left: -10px; + border-top-color: #fff; +} + +.popover.popover-right, .popover.bs-tether-element-attached-left { + margin-left: 10px; +} + +.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after { + top: 50%; + border-left-width: 0; +} + +.popover.popover-right::before, .popover.bs-tether-element-attached-left::before { + left: -11px; + margin-top: -11px; + border-right-color: rgba(0, 0, 0, 0.25); +} + +.popover.popover-right::after, .popover.bs-tether-element-attached-left::after { + left: -10px; + margin-top: -10px; + border-right-color: #fff; +} + +.popover.popover-bottom, .popover.bs-tether-element-attached-top { + margin-top: 10px; +} + +.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after { + left: 50%; + border-top-width: 0; +} + +.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before { + top: -11px; + margin-left: -11px; + border-bottom-color: rgba(0, 0, 0, 0.25); +} + +.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after { + top: -10px; + margin-left: -10px; + border-bottom-color: #f7f7f7; +} + +.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 20px; + margin-left: -10px; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.popover.popover-left, .popover.bs-tether-element-attached-right { + margin-left: -10px; +} + +.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after { + top: 50%; + border-right-width: 0; +} + +.popover.popover-left::before, .popover.bs-tether-element-attached-right::before { + right: -11px; + margin-top: -11px; + border-left-color: rgba(0, 0, 0, 0.25); +} + +.popover.popover-left::after, .popover.bs-tether-element-attached-right::after { + right: -10px; + margin-top: -10px; + border-left-color: #fff; +} + +.popover-title { + padding: 8px 14px; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-right-radius: calc(0.3rem - 1px); + border-top-left-radius: calc(0.3rem - 1px); +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover::before, +.popover::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover::before { + content: ""; + border-width: 11px; +} + +.popover::after { + content: ""; + border-width: 10px; +} + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-item { + position: relative; + display: none; + width: 100%; +} + +@media (-webkit-transform-3d) { + .carousel-item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + transition: -webkit-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } +} + +@supports ((-webkit-transform: translate3d(0, 0, 0)) or (transform: translate3d(0, 0, 0))) { + .carousel-item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + transition: -webkit-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.carousel-item-next, +.carousel-item-prev { + position: absolute; + top: 0; +} + +@media (-webkit-transform-3d) { + .carousel-item-next.carousel-item-left, + .carousel-item-prev.carousel-item-right { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + .carousel-item-next, + .active.carousel-item-right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-item-prev, + .active.carousel-item-left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@supports ((-webkit-transform: translate3d(0, 0, 0)) or (transform: translate3d(0, 0, 0))) { + .carousel-item-next.carousel-item-left, + .carousel-item-prev.carousel-item-right { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + .carousel-item-next, + .active.carousel-item-right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-item-prev, + .active.carousel-item-left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; +} + +.carousel-control-prev:focus, .carousel-control-prev:hover, +.carousel-control-next:focus, +.carousel-control-next:hover { + color: #fff; + text-decoration: none; + outline: 0; + opacity: .9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: transparent no-repeat center center; + -webkit-background-size: 100% 100%; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 10px; + left: 0; + z-index: 15; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} + +.carousel-indicators li { + position: relative; + -webkit-box-flex: 1; + -webkit-flex: 1 0 auto; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + max-width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: rgba(255, 255, 255, 0.5); +} + +.carousel-indicators li::before { + position: absolute; + top: -10px; + left: 0; + display: inline-block; + width: 100%; + height: 10px; + content: ""; +} + +.carousel-indicators li::after { + position: absolute; + bottom: -10px; + left: 0; + display: inline-block; + width: 100%; + height: 10px; + content: ""; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-faded { + background-color: #f7f7f7; +} + +.bg-primary { + background-color: #0275d8 !important; +} + +a.bg-primary:focus, a.bg-primary:hover { + background-color: #025aa5 !important; +} + +.bg-success { + background-color: #5cb85c !important; +} + +a.bg-success:focus, a.bg-success:hover { + background-color: #449d44 !important; +} + +.bg-info { + background-color: #5bc0de !important; +} + +a.bg-info:focus, a.bg-info:hover { + background-color: #31b0d5 !important; +} + +.bg-warning { + background-color: #f0ad4e !important; +} + +a.bg-warning:focus, a.bg-warning:hover { + background-color: #ec971f !important; +} + +.bg-danger { + background-color: #d9534f !important; +} + +a.bg-danger:focus, a.bg-danger:hover { + background-color: #c9302c !important; +} + +.bg-inverse { + background-color: #292b2c !important; +} + +a.bg-inverse:focus, a.bg-inverse:hover { + background-color: #101112 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-top { + border-top-right-radius: 0.25rem; + border-top-left-radius: 0.25rem; +} + +.rounded-right { + border-bottom-right-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.rounded-left { + border-bottom-left-radius: 0.25rem; + border-top-left-radius: 0.25rem; +} + +.rounded-circle { + border-radius: 50%; +} + +.rounded-0 { + border-radius: 0; +} + +.clearfix::after { + display: block; + content: ""; + clear: both; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; +} + +.d-inline-flex { + display: -webkit-inline-box !important; + display: -webkit-inline-flex !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-sm-inline-flex { + display: -webkit-inline-box !important; + display: -webkit-inline-flex !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-md-inline-flex { + display: -webkit-inline-box !important; + display: -webkit-inline-flex !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-lg-inline-flex { + display: -webkit-inline-box !important; + display: -webkit-inline-flex !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: -webkit-box !important; + display: -webkit-flex !important; + display: -ms-flexbox !important; + display: flex !important; + } + .d-xl-inline-flex { + display: -webkit-inline-box !important; + display: -webkit-inline-flex !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +.flex-first { + -webkit-box-ordinal-group: 0; + -webkit-order: -1; + -ms-flex-order: -1; + order: -1; +} + +.flex-last { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; +} + +.flex-unordered { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; +} + +.flex-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: row !important; + -ms-flex-direction: row !important; + flex-direction: row !important; +} + +.flex-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: column !important; + -ms-flex-direction: column !important; + flex-direction: column !important; +} + +.flex-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: row-reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: column-reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} + +.flex-wrap { + -webkit-flex-wrap: wrap !important; + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} + +.flex-nowrap { + -webkit-flex-wrap: nowrap !important; + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + -webkit-flex-wrap: wrap-reverse !important; + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} + +.justify-content-start { + -webkit-box-pack: start !important; + -webkit-justify-content: flex-start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} + +.justify-content-end { + -webkit-box-pack: end !important; + -webkit-justify-content: flex-end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} + +.justify-content-center { + -webkit-box-pack: center !important; + -webkit-justify-content: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; +} + +.justify-content-between { + -webkit-box-pack: justify !important; + -webkit-justify-content: space-between !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} + +.justify-content-around { + -webkit-justify-content: space-around !important; + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} + +.align-items-start { + -webkit-box-align: start !important; + -webkit-align-items: flex-start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; +} + +.align-items-end { + -webkit-box-align: end !important; + -webkit-align-items: flex-end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; +} + +.align-items-center { + -webkit-box-align: center !important; + -webkit-align-items: center !important; + -ms-flex-align: center !important; + align-items: center !important; +} + +.align-items-baseline { + -webkit-box-align: baseline !important; + -webkit-align-items: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; +} + +.align-items-stretch { + -webkit-box-align: stretch !important; + -webkit-align-items: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; +} + +.align-content-start { + -webkit-align-content: flex-start !important; + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} + +.align-content-end { + -webkit-align-content: flex-end !important; + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} + +.align-content-center { + -webkit-align-content: center !important; + -ms-flex-line-pack: center !important; + align-content: center !important; +} + +.align-content-between { + -webkit-align-content: space-between !important; + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} + +.align-content-around { + -webkit-align-content: space-around !important; + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} + +.align-content-stretch { + -webkit-align-content: stretch !important; + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} + +.align-self-auto { + -webkit-align-self: auto !important; + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; +} + +.align-self-start { + -webkit-align-self: flex-start !important; + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} + +.align-self-end { + -webkit-align-self: flex-end !important; + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} + +.align-self-center { + -webkit-align-self: center !important; + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; +} + +.align-self-baseline { + -webkit-align-self: baseline !important; + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} + +.align-self-stretch { + -webkit-align-self: stretch !important; + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-first { + -webkit-box-ordinal-group: 0; + -webkit-order: -1; + -ms-flex-order: -1; + order: -1; + } + .flex-sm-last { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + .flex-sm-unordered { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + } + .flex-sm-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: row !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-sm-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: column !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-sm-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: row-reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: column-reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-sm-wrap { + -webkit-flex-wrap: wrap !important; + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + -webkit-flex-wrap: nowrap !important; + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + -webkit-flex-wrap: wrap-reverse !important; + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .justify-content-sm-start { + -webkit-box-pack: start !important; + -webkit-justify-content: flex-start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-sm-end { + -webkit-box-pack: end !important; + -webkit-justify-content: flex-end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-sm-center { + -webkit-box-pack: center !important; + -webkit-justify-content: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-sm-between { + -webkit-box-pack: justify !important; + -webkit-justify-content: space-between !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-sm-around { + -webkit-justify-content: space-around !important; + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-sm-start { + -webkit-box-align: start !important; + -webkit-align-items: flex-start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-sm-end { + -webkit-box-align: end !important; + -webkit-align-items: flex-end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-sm-center { + -webkit-box-align: center !important; + -webkit-align-items: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-sm-baseline { + -webkit-box-align: baseline !important; + -webkit-align-items: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-sm-stretch { + -webkit-box-align: stretch !important; + -webkit-align-items: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-sm-start { + -webkit-align-content: flex-start !important; + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-sm-end { + -webkit-align-content: flex-end !important; + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-sm-center { + -webkit-align-content: center !important; + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-sm-between { + -webkit-align-content: space-between !important; + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-sm-around { + -webkit-align-content: space-around !important; + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-sm-stretch { + -webkit-align-content: stretch !important; + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-sm-auto { + -webkit-align-self: auto !important; + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; + } + .align-self-sm-start { + -webkit-align-self: flex-start !important; + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-sm-end { + -webkit-align-self: flex-end !important; + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-sm-center { + -webkit-align-self: center !important; + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; + } + .align-self-sm-baseline { + -webkit-align-self: baseline !important; + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-sm-stretch { + -webkit-align-self: stretch !important; + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 768px) { + .flex-md-first { + -webkit-box-ordinal-group: 0; + -webkit-order: -1; + -ms-flex-order: -1; + order: -1; + } + .flex-md-last { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + .flex-md-unordered { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + } + .flex-md-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: row !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-md-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: column !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-md-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: row-reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: column-reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-md-wrap { + -webkit-flex-wrap: wrap !important; + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-md-nowrap { + -webkit-flex-wrap: nowrap !important; + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + -webkit-flex-wrap: wrap-reverse !important; + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .justify-content-md-start { + -webkit-box-pack: start !important; + -webkit-justify-content: flex-start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-md-end { + -webkit-box-pack: end !important; + -webkit-justify-content: flex-end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-md-center { + -webkit-box-pack: center !important; + -webkit-justify-content: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-md-between { + -webkit-box-pack: justify !important; + -webkit-justify-content: space-between !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-md-around { + -webkit-justify-content: space-around !important; + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-md-start { + -webkit-box-align: start !important; + -webkit-align-items: flex-start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-md-end { + -webkit-box-align: end !important; + -webkit-align-items: flex-end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-md-center { + -webkit-box-align: center !important; + -webkit-align-items: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-md-baseline { + -webkit-box-align: baseline !important; + -webkit-align-items: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-md-stretch { + -webkit-box-align: stretch !important; + -webkit-align-items: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-md-start { + -webkit-align-content: flex-start !important; + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-md-end { + -webkit-align-content: flex-end !important; + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-md-center { + -webkit-align-content: center !important; + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-md-between { + -webkit-align-content: space-between !important; + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-md-around { + -webkit-align-content: space-around !important; + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-md-stretch { + -webkit-align-content: stretch !important; + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-md-auto { + -webkit-align-self: auto !important; + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; + } + .align-self-md-start { + -webkit-align-self: flex-start !important; + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-md-end { + -webkit-align-self: flex-end !important; + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-md-center { + -webkit-align-self: center !important; + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; + } + .align-self-md-baseline { + -webkit-align-self: baseline !important; + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-md-stretch { + -webkit-align-self: stretch !important; + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 992px) { + .flex-lg-first { + -webkit-box-ordinal-group: 0; + -webkit-order: -1; + -ms-flex-order: -1; + order: -1; + } + .flex-lg-last { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + .flex-lg-unordered { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + } + .flex-lg-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: row !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-lg-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: column !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-lg-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: row-reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: column-reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-lg-wrap { + -webkit-flex-wrap: wrap !important; + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + -webkit-flex-wrap: nowrap !important; + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + -webkit-flex-wrap: wrap-reverse !important; + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .justify-content-lg-start { + -webkit-box-pack: start !important; + -webkit-justify-content: flex-start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-lg-end { + -webkit-box-pack: end !important; + -webkit-justify-content: flex-end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-lg-center { + -webkit-box-pack: center !important; + -webkit-justify-content: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-lg-between { + -webkit-box-pack: justify !important; + -webkit-justify-content: space-between !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-lg-around { + -webkit-justify-content: space-around !important; + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-lg-start { + -webkit-box-align: start !important; + -webkit-align-items: flex-start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-lg-end { + -webkit-box-align: end !important; + -webkit-align-items: flex-end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-lg-center { + -webkit-box-align: center !important; + -webkit-align-items: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-lg-baseline { + -webkit-box-align: baseline !important; + -webkit-align-items: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-lg-stretch { + -webkit-box-align: stretch !important; + -webkit-align-items: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-lg-start { + -webkit-align-content: flex-start !important; + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-lg-end { + -webkit-align-content: flex-end !important; + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-lg-center { + -webkit-align-content: center !important; + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-lg-between { + -webkit-align-content: space-between !important; + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-lg-around { + -webkit-align-content: space-around !important; + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-lg-stretch { + -webkit-align-content: stretch !important; + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-lg-auto { + -webkit-align-self: auto !important; + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; + } + .align-self-lg-start { + -webkit-align-self: flex-start !important; + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-lg-end { + -webkit-align-self: flex-end !important; + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-lg-center { + -webkit-align-self: center !important; + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; + } + .align-self-lg-baseline { + -webkit-align-self: baseline !important; + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-lg-stretch { + -webkit-align-self: stretch !important; + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 1200px) { + .flex-xl-first { + -webkit-box-ordinal-group: 0; + -webkit-order: -1; + -ms-flex-order: -1; + order: -1; + } + .flex-xl-last { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + .flex-xl-unordered { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + } + .flex-xl-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: row !important; + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xl-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -webkit-flex-direction: column !important; + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xl-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: row-reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -webkit-flex-direction: column-reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xl-wrap { + -webkit-flex-wrap: wrap !important; + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + -webkit-flex-wrap: nowrap !important; + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + -webkit-flex-wrap: wrap-reverse !important; + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .justify-content-xl-start { + -webkit-box-pack: start !important; + -webkit-justify-content: flex-start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xl-end { + -webkit-box-pack: end !important; + -webkit-justify-content: flex-end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xl-center { + -webkit-box-pack: center !important; + -webkit-justify-content: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xl-between { + -webkit-box-pack: justify !important; + -webkit-justify-content: space-between !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xl-around { + -webkit-justify-content: space-around !important; + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-xl-start { + -webkit-box-align: start !important; + -webkit-align-items: flex-start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xl-end { + -webkit-box-align: end !important; + -webkit-align-items: flex-end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xl-center { + -webkit-box-align: center !important; + -webkit-align-items: center !important; + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xl-baseline { + -webkit-box-align: baseline !important; + -webkit-align-items: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xl-stretch { + -webkit-box-align: stretch !important; + -webkit-align-items: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xl-start { + -webkit-align-content: flex-start !important; + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xl-end { + -webkit-align-content: flex-end !important; + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xl-center { + -webkit-align-content: center !important; + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xl-between { + -webkit-align-content: space-between !important; + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xl-around { + -webkit-align-content: space-around !important; + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xl-stretch { + -webkit-align-content: stretch !important; + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xl-auto { + -webkit-align-self: auto !important; + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; + } + .align-self-xl-start { + -webkit-align-self: flex-start !important; + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xl-end { + -webkit-align-self: flex-end !important; + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xl-center { + -webkit-align-self: center !important; + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; + } + .align-self-xl-baseline { + -webkit-align-self: baseline !important; + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xl-stretch { + -webkit-align-self: stretch !important; + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; + } +} + +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + .float-sm-right { + float: right !important; + } + .float-sm-none { + float: none !important; + } +} + +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + .float-md-right { + float: right !important; + } + .float-md-none { + float: none !important; + } +} + +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + .float-lg-right { + float: right !important; + } + .float-lg-none { + float: none !important; + } +} + +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + .float-xl-right { + float: right !important; + } + .float-xl-none { + float: none !important; + } +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1030; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.m-0 { + margin: 0 0 !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mr-0 { + margin-right: 0 !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.ml-0 { + margin-left: 0 !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.m-1 { + margin: 0.25rem 0.25rem !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mr-1 { + margin-right: 0.25rem !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1 { + margin-left: 0.25rem !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem 0.5rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mr-2 { + margin-right: 0.5rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2 { + margin-left: 0.5rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.m-3 { + margin: 1rem 1rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mr-3 { + margin-right: 1rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.ml-3 { + margin-left: 1rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.m-4 { + margin: 1.5rem 1.5rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mr-4 { + margin-right: 1.5rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4 { + margin-left: 1.5rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.m-5 { + margin: 3rem 3rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mr-5 { + margin-right: 3rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.ml-5 { + margin-left: 3rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.p-0 { + padding: 0 0 !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pr-0 { + padding-right: 0 !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pl-0 { + padding-left: 0 !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.p-1 { + padding: 0.25rem 0.25rem !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pr-1 { + padding-right: 0.25rem !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1 { + padding-left: 0.25rem !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem 0.5rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pr-2 { + padding-right: 0.5rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2 { + padding-left: 0.5rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.p-3 { + padding: 1rem 1rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pr-3 { + padding-right: 1rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pl-3 { + padding-left: 1rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.p-4 { + padding: 1.5rem 1.5rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pr-4 { + padding-right: 1.5rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4 { + padding-left: 1.5rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.p-5 { + padding: 3rem 3rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pr-5 { + padding-right: 3rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.pl-5 { + padding-left: 3rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.mr-auto { + margin-right: auto !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ml-auto { + margin-left: auto !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 0 !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0 { + margin-left: 0 !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .m-sm-1 { + margin: 0.25rem 0.25rem !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1 { + margin-left: 0.25rem !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem 0.5rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2 { + margin-left: 0.5rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem 1rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mr-sm-3 { + margin-right: 1rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .ml-sm-3 { + margin-left: 1rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem 1.5rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mr-sm-4 { + margin-right: 1.5rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .ml-sm-4 { + margin-left: 1.5rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem 3rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mr-sm-5 { + margin-right: 3rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .ml-sm-5 { + margin-left: 3rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .p-sm-0 { + padding: 0 0 !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0 { + padding-left: 0 !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-sm-1 { + padding: 0.25rem 0.25rem !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1 { + padding-left: 0.25rem !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem 0.5rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2 { + padding-left: 0.5rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem 1rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pr-sm-3 { + padding-right: 1rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pl-sm-3 { + padding-left: 1rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem 1.5rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pr-sm-4 { + padding-right: 1.5rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pl-sm-4 { + padding-left: 1.5rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem 3rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pr-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .pl-sm-5 { + padding-left: 3rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .mr-sm-auto { + margin-right: auto !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-auto { + margin-left: auto !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 0 !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mr-md-0 { + margin-right: 0 !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0 { + margin-left: 0 !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .m-md-1 { + margin: 0.25rem 0.25rem !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1 { + margin-left: 0.25rem !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem 0.5rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2 { + margin-left: 0.5rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .m-md-3 { + margin: 1rem 1rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mr-md-3 { + margin-right: 1rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .ml-md-3 { + margin-left: 1rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .m-md-4 { + margin: 1.5rem 1.5rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mr-md-4 { + margin-right: 1.5rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .ml-md-4 { + margin-left: 1.5rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .m-md-5 { + margin: 3rem 3rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mr-md-5 { + margin-right: 3rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .ml-md-5 { + margin-left: 3rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .p-md-0 { + padding: 0 0 !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pr-md-0 { + padding-right: 0 !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0 { + padding-left: 0 !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-md-1 { + padding: 0.25rem 0.25rem !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1 { + padding-left: 0.25rem !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem 0.5rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2 { + padding-left: 0.5rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-md-3 { + padding: 1rem 1rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pr-md-3 { + padding-right: 1rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pl-md-3 { + padding-left: 1rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-md-4 { + padding: 1.5rem 1.5rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pr-md-4 { + padding-right: 1.5rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pl-md-4 { + padding-left: 1.5rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-md-5 { + padding: 3rem 3rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pr-md-5 { + padding-right: 3rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .pl-md-5 { + padding-left: 3rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .mr-md-auto { + margin-right: auto !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ml-md-auto { + margin-left: auto !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 0 !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0 { + margin-left: 0 !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .m-lg-1 { + margin: 0.25rem 0.25rem !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1 { + margin-left: 0.25rem !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem 0.5rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2 { + margin-left: 0.5rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem 1rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mr-lg-3 { + margin-right: 1rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .ml-lg-3 { + margin-left: 1rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem 1.5rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mr-lg-4 { + margin-right: 1.5rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .ml-lg-4 { + margin-left: 1.5rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem 3rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mr-lg-5 { + margin-right: 3rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .ml-lg-5 { + margin-left: 3rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .p-lg-0 { + padding: 0 0 !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0 { + padding-left: 0 !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-lg-1 { + padding: 0.25rem 0.25rem !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1 { + padding-left: 0.25rem !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem 0.5rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2 { + padding-left: 0.5rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem 1rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pr-lg-3 { + padding-right: 1rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pl-lg-3 { + padding-left: 1rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem 1.5rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pr-lg-4 { + padding-right: 1.5rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pl-lg-4 { + padding-left: 1.5rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem 3rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pr-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .pl-lg-5 { + padding-left: 3rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .mr-lg-auto { + margin-right: auto !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-auto { + margin-left: auto !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 0 !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0 { + margin-left: 0 !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .m-xl-1 { + margin: 0.25rem 0.25rem !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1 { + margin-left: 0.25rem !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem 0.5rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2 { + margin-left: 0.5rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem 1rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mr-xl-3 { + margin-right: 1rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .ml-xl-3 { + margin-left: 1rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem 1.5rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mr-xl-4 { + margin-right: 1.5rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .ml-xl-4 { + margin-left: 1.5rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem 3rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mr-xl-5 { + margin-right: 3rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .ml-xl-5 { + margin-left: 3rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .p-xl-0 { + padding: 0 0 !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0 { + padding-left: 0 !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .p-xl-1 { + padding: 0.25rem 0.25rem !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1 { + padding-left: 0.25rem !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem 0.5rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2 { + padding-left: 0.5rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem 1rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pr-xl-3 { + padding-right: 1rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pl-xl-3 { + padding-left: 1rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem 1.5rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pr-xl-4 { + padding-right: 1.5rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pl-xl-4 { + padding-left: 1.5rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem 3rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pr-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .pl-xl-5 { + padding-left: 3rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .mr-xl-auto { + margin-right: auto !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-auto { + margin-left: auto !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } +} + +.text-justify { + text-align: justify !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + .text-sm-right { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} + +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + .text-md-right { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} + +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + .text-lg-right { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} + +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + .text-xl-right { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-normal { + font-weight: normal; +} + +.font-weight-bold { + font-weight: bold; +} + +.font-italic { + font-style: italic; +} + +.text-white { + color: #fff !important; +} + +.text-muted { + color: #636c72 !important; +} + +a.text-muted:focus, a.text-muted:hover { + color: #4b5257 !important; +} + +.text-primary { + color: #0275d8 !important; +} + +a.text-primary:focus, a.text-primary:hover { + color: #025aa5 !important; +} + +.text-success { + color: #5cb85c !important; +} + +a.text-success:focus, a.text-success:hover { + color: #449d44 !important; +} + +.text-info { + color: #5bc0de !important; +} + +a.text-info:focus, a.text-info:hover { + color: #31b0d5 !important; +} + +.text-warning { + color: #f0ad4e !important; +} + +a.text-warning:focus, a.text-warning:hover { + color: #ec971f !important; +} + +.text-danger { + color: #d9534f !important; +} + +a.text-danger:focus, a.text-danger:hover { + color: #c9302c !important; +} + +.text-gray-dark { + color: #292b2c !important; +} + +a.text-gray-dark:focus, a.text-gray-dark:hover { + color: #101112 !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.invisible { + visibility: hidden !important; +} + +.hidden-xs-up { + display: none !important; +} + +@media (max-width: 575px) { + .hidden-xs-down { + display: none !important; + } +} + +@media (min-width: 576px) { + .hidden-sm-up { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-sm-down { + display: none !important; + } +} + +@media (min-width: 768px) { + .hidden-md-up { + display: none !important; + } +} + +@media (max-width: 991px) { + .hidden-md-down { + display: none !important; + } +} + +@media (min-width: 992px) { + .hidden-lg-up { + display: none !important; + } +} + +@media (max-width: 1199px) { + .hidden-lg-down { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-xl-up { + display: none !important; + } +} + +.hidden-xl-down { + display: none !important; +} + +.visible-print-block { + display: none !important; +} + +@media print { + .visible-print-block { + display: block !important; + } +} + +.visible-print-inline { + display: none !important; +} + +@media print { + .visible-print-inline { + display: inline !important; + } +} + +.visible-print-inline-block { + display: none !important; +} + +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} + +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/pkgs/csslib/test/examples/bulma.css b/pkgs/csslib/test/examples/bulma.css new file mode 100644 index 000000000..32b9f3e14 --- /dev/null +++ b/pkgs/csslib/test/examples/bulma.css @@ -0,0 +1,7128 @@ +/*! bulma.io v0.4.1 | MIT License | github.com/jgthms/bulma */ +@-webkit-keyframes spinAround { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes spinAround { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +/*! minireset.css v0.0.2 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; +} + +ul { + list-style: none; +} + +button, +input, +select, +textarea { + margin: 0; +} + +html { + box-sizing: border-box; +} + +* { + box-sizing: inherit; +} + +*:before, *:after { + box-sizing: inherit; +} + +img, +embed, +object, +audio, +video { + height: auto; + max-width: 100%; +} + +iframe { + border: 0; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; + text-align: left; +} + +html { + background-color: #fff; + font-size: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: hidden; + overflow-y: scroll; + text-rendering: optimizeLegibility; +} + +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; +} + +body, +button, +input, +select, +textarea { + font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif; +} + +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: monospace; +} + +body { + color: #4a4a4a; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; +} + +a { + color: #00d1b2; + cursor: pointer; + text-decoration: none; + -webkit-transition: none 86ms ease-out; + transition: none 86ms ease-out; +} + +a:hover { + color: #363636; +} + +code { + background-color: whitesmoke; + color: #ff3860; + font-size: 0.8em; + font-weight: normal; + padding: 0.25em 0.5em 0.25em; +} + +hr { + background-color: #dbdbdb; + border: none; + display: block; + height: 1px; + margin: 1.5rem 0; +} + +img { + max-width: 100%; +} + +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; +} + +small { + font-size: 0.8em; +} + +span { + font-style: inherit; + font-weight: inherit; +} + +strong { + color: #363636; + font-weight: 700; +} + +pre { + background-color: whitesmoke; + color: #4a4a4a; + font-size: 0.8em; + white-space: pre; + word-wrap: normal; +} + +pre code { + -webkit-overflow-scrolling: touch; + background: none; + color: inherit; + display: block; + font-size: 1em; + overflow-x: auto; + padding: 1.25rem 1.5rem; +} + +table { + width: 100%; +} + +table td, +table th { + text-align: left; + vertical-align: top; +} + +table th { + color: #363636; +} + +.is-block { + display: block; +} + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; + } +} + +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 999px) { + .is-block-tablet-only { + display: block !important; + } +} + +@media screen and (max-width: 999px) { + .is-block-touch { + display: block !important; + } +} + +@media screen and (min-width: 1000px) { + .is-block-desktop { + display: block !important; + } +} + +@media screen and (min-width: 1000px) and (max-width: 1191px) { + .is-block-desktop-only { + display: block !important; + } +} + +@media screen and (min-width: 1192px) { + .is-block-widescreen { + display: block !important; + } +} + +.is-flex { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 999px) { + .is-flex-tablet-only { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (max-width: 999px) { + .is-flex-touch { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 1000px) { + .is-flex-desktop { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 1000px) and (max-width: 1191px) { + .is-flex-desktop-only { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 1192px) { + .is-flex-widescreen { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +.is-inline { + display: inline; +} + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; + } +} + +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 999px) { + .is-inline-tablet-only { + display: inline !important; + } +} + +@media screen and (max-width: 999px) { + .is-inline-touch { + display: inline !important; + } +} + +@media screen and (min-width: 1000px) { + .is-inline-desktop { + display: inline !important; + } +} + +@media screen and (min-width: 1000px) and (max-width: 1191px) { + .is-inline-desktop-only { + display: inline !important; + } +} + +@media screen and (min-width: 1192px) { + .is-inline-widescreen { + display: inline !important; + } +} + +.is-inline-block { + display: inline-block; +} + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; + } +} + +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 999px) { + .is-inline-block-tablet-only { + display: inline-block !important; + } +} + +@media screen and (max-width: 999px) { + .is-inline-block-touch { + display: inline-block !important; + } +} + +@media screen and (min-width: 1000px) { + .is-inline-block-desktop { + display: inline-block !important; + } +} + +@media screen and (min-width: 1000px) and (max-width: 1191px) { + .is-inline-block-desktop-only { + display: inline-block !important; + } +} + +@media screen and (min-width: 1192px) { + .is-inline-block-widescreen { + display: inline-block !important; + } +} + +.is-inline-flex { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; +} + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 999px) { + .is-inline-flex-tablet-only { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (max-width: 999px) { + .is-inline-flex-touch { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 1000px) { + .is-inline-flex-desktop { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 1000px) and (max-width: 1191px) { + .is-inline-flex-desktop-only { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 1192px) { + .is-inline-flex-widescreen { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +.is-clearfix:after { + clear: both; + content: " "; + display: table; +} + +.is-pulled-left { + float: left; +} + +.is-pulled-right { + float: right; +} + +.is-clipped { + overflow: hidden !important; +} + +.is-overlay { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.has-text-centered { + text-align: center; +} + +.has-text-left { + text-align: left; +} + +.has-text-right { + text-align: right; +} + +.has-text-white { + color: white; +} + +a.has-text-white:hover, a.has-text-white:focus { + color: #e6e6e6; +} + +.has-text-black { + color: #0a0a0a; +} + +a.has-text-black:hover, a.has-text-black:focus { + color: black; +} + +.has-text-light { + color: whitesmoke; +} + +a.has-text-light:hover, a.has-text-light:focus { + color: #dbdbdb; +} + +.has-text-dark { + color: #363636; +} + +a.has-text-dark:hover, a.has-text-dark:focus { + color: #1c1c1c; +} + +.has-text-primary { + color: #00d1b2; +} + +a.has-text-primary:hover, a.has-text-primary:focus { + color: #009e86; +} + +.has-text-info { + color: #3273dc; +} + +a.has-text-info:hover, a.has-text-info:focus { + color: #205bbc; +} + +.has-text-success { + color: #23d160; +} + +a.has-text-success:hover, a.has-text-success:focus { + color: #1ca64c; +} + +.has-text-warning { + color: #ffdd57; +} + +a.has-text-warning:hover, a.has-text-warning:focus { + color: #ffd324; +} + +.has-text-danger { + color: #ff3860; +} + +a.has-text-danger:hover, a.has-text-danger:focus { + color: #ff0537; +} + +.is-hidden { + display: none !important; +} + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; + } +} + +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 999px) { + .is-hidden-tablet-only { + display: none !important; + } +} + +@media screen and (max-width: 999px) { + .is-hidden-touch { + display: none !important; + } +} + +@media screen and (min-width: 1000px) { + .is-hidden-desktop { + display: none !important; + } +} + +@media screen and (min-width: 1000px) and (max-width: 1191px) { + .is-hidden-desktop-only { + display: none !important; + } +} + +@media screen and (min-width: 1192px) { + .is-hidden-widescreen { + display: none !important; + } +} + +.is-marginless { + margin: 0 !important; +} + +.is-paddingless { + padding: 0 !important; +} + +.is-unselectable { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.box { + background-color: white; + border-radius: 5px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + padding: 1.25rem; +} + +.box:not(:last-child) { + margin-bottom: 1.5rem; +} + +a.box:hover, a.box:focus { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #00d1b2; +} + +a.box:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #00d1b2; +} + +.button { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + border-radius: 3px; + box-shadow: none; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: white; + border-color: #dbdbdb; + color: #363636; + cursor: pointer; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; + text-align: center; + white-space: nowrap; +} + +.button:focus, .button.is-focused, .button:active, .button.is-active { + outline: none; +} + +.button[disabled] { + cursor: not-allowed; +} + +.button strong { + color: inherit; +} + +.button .icon, .button .icon.is-small, .button .icon.is-medium, .button .icon.is-large { + height: 1.5em; + width: 1.5em; +} + +.button .icon:first-child:not(:last-child) { + margin-left: calc(-0.375em - 1px); + margin-right: 0.1875em; +} + +.button .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: calc(-0.375em - 1px); +} + +.button .icon:first-child:last-child { + margin-left: calc(-0.375em - 1px); + margin-right: calc(-0.375em - 1px); +} + +.button:hover, .button.is-hovered { + border-color: #b5b5b5; + color: #363636; +} + +.button:focus, .button.is-focused { + border-color: #00d1b2; + box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25); + color: #363636; +} + +.button:active, .button.is-active { + border-color: #4a4a4a; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: #363636; +} + +.button.is-link { + background-color: transparent; + border-color: transparent; + color: #4a4a4a; + text-decoration: underline; +} + +.button.is-link:hover, .button.is-link.is-hovered, .button.is-link:focus, .button.is-link.is-focused, .button.is-link:active, .button.is-link.is-active { + background-color: whitesmoke; + color: #363636; +} + +.button.is-link[disabled] { + background-color: transparent; + border-color: transparent; + box-shadow: none; +} + +.button.is-white { + background-color: white; + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white:hover, .button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white:focus, .button.is-white.is-focused { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; +} + +.button.is-white:active, .button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: #0a0a0a; +} + +.button.is-white[disabled] { + background-color: white; + border-color: transparent; + box-shadow: none; +} + +.button.is-white.is-inverted { + background-color: #0a0a0a; + color: white; +} + +.button.is-white.is-inverted:hover { + background-color: black; +} + +.button.is-white.is-inverted[disabled] { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: white; +} + +.button.is-white.is-loading:after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} + +.button.is-white.is-outlined { + background-color: transparent; + border-color: white; + color: white; +} + +.button.is-white.is-outlined:hover, .button.is-white.is-outlined:focus { + background-color: white; + border-color: white; + color: #0a0a0a; +} + +.button.is-white.is-outlined.is-loading:after { + border-color: transparent transparent white white !important; +} + +.button.is-white.is-outlined[disabled] { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; +} + +.button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} + +.button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined:focus { + background-color: #0a0a0a; + color: white; +} + +.button.is-white.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; +} + +.button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: white; +} + +.button.is-black:hover, .button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; +} + +.button.is-black:focus, .button.is-black.is-focused { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; +} + +.button.is-black:active, .button.is-black.is-active { + background-color: black; + border-color: transparent; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: white; +} + +.button.is-black[disabled] { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; +} + +.button.is-black.is-inverted { + background-color: white; + color: #0a0a0a; +} + +.button.is-black.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-black.is-inverted[disabled] { + background-color: white; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; +} + +.button.is-black.is-loading:after { + border-color: transparent transparent white white !important; +} + +.button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} + +.button.is-black.is-outlined:hover, .button.is-black.is-outlined:focus { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; +} + +.button.is-black.is-outlined.is-loading:after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} + +.button.is-black.is-outlined[disabled] { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; +} + +.button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; +} + +.button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined:focus { + background-color: white; + color: #0a0a0a; +} + +.button.is-black.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; +} + +.button.is-light { + background-color: whitesmoke; + border-color: transparent; + color: #363636; +} + +.button.is-light:hover, .button.is-light.is-hovered { + background-color: #eeeeee; + border-color: transparent; + color: #363636; +} + +.button.is-light:focus, .button.is-light.is-focused { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); + color: #363636; +} + +.button.is-light:active, .button.is-light.is-active { + background-color: #e8e8e8; + border-color: transparent; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: #363636; +} + +.button.is-light[disabled] { + background-color: whitesmoke; + border-color: transparent; + box-shadow: none; +} + +.button.is-light.is-inverted { + background-color: #363636; + color: whitesmoke; +} + +.button.is-light.is-inverted:hover { + background-color: #292929; +} + +.button.is-light.is-inverted[disabled] { + background-color: #363636; + border-color: transparent; + box-shadow: none; + color: whitesmoke; +} + +.button.is-light.is-loading:after { + border-color: transparent transparent #363636 #363636 !important; +} + +.button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; +} + +.button.is-light.is-outlined:hover, .button.is-light.is-outlined:focus { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; +} + +.button.is-light.is-outlined.is-loading:after { + border-color: transparent transparent whitesmoke whitesmoke !important; +} + +.button.is-light.is-outlined[disabled] { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; +} + +.button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} + +.button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined:focus { + background-color: #363636; + color: whitesmoke; +} + +.button.is-light.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} + +.button.is-dark { + background-color: #363636; + border-color: transparent; + color: whitesmoke; +} + +.button.is-dark:hover, .button.is-dark.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: whitesmoke; +} + +.button.is-dark:focus, .button.is-dark.is-focused { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); + color: whitesmoke; +} + +.button.is-dark:active, .button.is-dark.is-active { + background-color: #292929; + border-color: transparent; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: whitesmoke; +} + +.button.is-dark[disabled] { + background-color: #363636; + border-color: transparent; + box-shadow: none; +} + +.button.is-dark.is-inverted { + background-color: whitesmoke; + color: #363636; +} + +.button.is-dark.is-inverted:hover { + background-color: #e8e8e8; +} + +.button.is-dark.is-inverted[disabled] { + background-color: whitesmoke; + border-color: transparent; + box-shadow: none; + color: #363636; +} + +.button.is-dark.is-loading:after { + border-color: transparent transparent whitesmoke whitesmoke !important; +} + +.button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} + +.button.is-dark.is-outlined:hover, .button.is-dark.is-outlined:focus { + background-color: #363636; + border-color: #363636; + color: whitesmoke; +} + +.button.is-dark.is-outlined.is-loading:after { + border-color: transparent transparent #363636 #363636 !important; +} + +.button.is-dark.is-outlined[disabled] { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} + +.button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; +} + +.button.is-dark.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined:focus { + background-color: whitesmoke; + color: #363636; +} + +.button.is-dark.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; +} + +.button.is-primary { + background-color: #00d1b2; + border-color: transparent; + color: #fff; +} + +.button.is-primary:hover, .button.is-primary.is-hovered { + background-color: #00c4a7; + border-color: transparent; + color: #fff; +} + +.button.is-primary:focus, .button.is-primary.is-focused { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25); + color: #fff; +} + +.button.is-primary:active, .button.is-primary.is-active { + background-color: #00b89c; + border-color: transparent; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: #fff; +} + +.button.is-primary[disabled] { + background-color: #00d1b2; + border-color: transparent; + box-shadow: none; +} + +.button.is-primary.is-inverted { + background-color: #fff; + color: #00d1b2; +} + +.button.is-primary.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-primary.is-inverted[disabled] { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #00d1b2; +} + +.button.is-primary.is-loading:after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-primary.is-outlined { + background-color: transparent; + border-color: #00d1b2; + color: #00d1b2; +} + +.button.is-primary.is-outlined:hover, .button.is-primary.is-outlined:focus { + background-color: #00d1b2; + border-color: #00d1b2; + color: #fff; +} + +.button.is-primary.is-outlined.is-loading:after { + border-color: transparent transparent #00d1b2 #00d1b2 !important; +} + +.button.is-primary.is-outlined[disabled] { + background-color: transparent; + border-color: #00d1b2; + box-shadow: none; + color: #00d1b2; +} + +.button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-primary.is-inverted.is-outlined:hover, .button.is-primary.is-inverted.is-outlined:focus { + background-color: #fff; + color: #00d1b2; +} + +.button.is-primary.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-info { + background-color: #3273dc; + border-color: transparent; + color: #fff; +} + +.button.is-info:hover, .button.is-info.is-hovered { + background-color: #276cda; + border-color: transparent; + color: #fff; +} + +.button.is-info:focus, .button.is-info.is-focused { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(50, 115, 220, 0.25); + color: #fff; +} + +.button.is-info:active, .button.is-info.is-active { + background-color: #2366d1; + border-color: transparent; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: #fff; +} + +.button.is-info[disabled] { + background-color: #3273dc; + border-color: transparent; + box-shadow: none; +} + +.button.is-info.is-inverted { + background-color: #fff; + color: #3273dc; +} + +.button.is-info.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-info.is-inverted[disabled] { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #3273dc; +} + +.button.is-info.is-loading:after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-info.is-outlined { + background-color: transparent; + border-color: #3273dc; + color: #3273dc; +} + +.button.is-info.is-outlined:hover, .button.is-info.is-outlined:focus { + background-color: #3273dc; + border-color: #3273dc; + color: #fff; +} + +.button.is-info.is-outlined.is-loading:after { + border-color: transparent transparent #3273dc #3273dc !important; +} + +.button.is-info.is-outlined[disabled] { + background-color: transparent; + border-color: #3273dc; + box-shadow: none; + color: #3273dc; +} + +.button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined:focus { + background-color: #fff; + color: #3273dc; +} + +.button.is-info.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-success { + background-color: #23d160; + border-color: transparent; + color: #fff; +} + +.button.is-success:hover, .button.is-success.is-hovered { + background-color: #22c65b; + border-color: transparent; + color: #fff; +} + +.button.is-success:focus, .button.is-success.is-focused { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(35, 209, 96, 0.25); + color: #fff; +} + +.button.is-success:active, .button.is-success.is-active { + background-color: #20bc56; + border-color: transparent; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: #fff; +} + +.button.is-success[disabled] { + background-color: #23d160; + border-color: transparent; + box-shadow: none; +} + +.button.is-success.is-inverted { + background-color: #fff; + color: #23d160; +} + +.button.is-success.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-success.is-inverted[disabled] { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #23d160; +} + +.button.is-success.is-loading:after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-success.is-outlined { + background-color: transparent; + border-color: #23d160; + color: #23d160; +} + +.button.is-success.is-outlined:hover, .button.is-success.is-outlined:focus { + background-color: #23d160; + border-color: #23d160; + color: #fff; +} + +.button.is-success.is-outlined.is-loading:after { + border-color: transparent transparent #23d160 #23d160 !important; +} + +.button.is-success.is-outlined[disabled] { + background-color: transparent; + border-color: #23d160; + box-shadow: none; + color: #23d160; +} + +.button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined:focus { + background-color: #fff; + color: #23d160; +} + +.button.is-success.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-warning { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning:hover, .button.is-warning.is-hovered { + background-color: #ffdb4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning:focus, .button.is-warning.is-focused { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning:active, .button.is-warning.is-active { + background-color: #ffd83d; + border-color: transparent; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning[disabled] { + background-color: #ffdd57; + border-color: transparent; + box-shadow: none; +} + +.button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; +} + +.button.is-warning.is-inverted:hover { + background-color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning.is-inverted[disabled] { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #ffdd57; +} + +.button.is-warning.is-loading:after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; +} + +.button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + color: #ffdd57; +} + +.button.is-warning.is-outlined:hover, .button.is-warning.is-outlined:focus { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning.is-outlined.is-loading:after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; +} + +.button.is-warning.is-outlined[disabled] { + background-color: transparent; + border-color: #ffdd57; + box-shadow: none; + color: #ffdd57; +} + +.button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined:focus { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; +} + +.button.is-warning.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-danger { + background-color: #ff3860; + border-color: transparent; + color: #fff; +} + +.button.is-danger:hover, .button.is-danger.is-hovered { + background-color: #ff2b56; + border-color: transparent; + color: #fff; +} + +.button.is-danger:focus, .button.is-danger.is-focused { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 56, 96, 0.25); + color: #fff; +} + +.button.is-danger:active, .button.is-danger.is-active { + background-color: #ff1f4b; + border-color: transparent; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + color: #fff; +} + +.button.is-danger[disabled] { + background-color: #ff3860; + border-color: transparent; + box-shadow: none; +} + +.button.is-danger.is-inverted { + background-color: #fff; + color: #ff3860; +} + +.button.is-danger.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-danger.is-inverted[disabled] { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #ff3860; +} + +.button.is-danger.is-loading:after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-danger.is-outlined { + background-color: transparent; + border-color: #ff3860; + color: #ff3860; +} + +.button.is-danger.is-outlined:hover, .button.is-danger.is-outlined:focus { + background-color: #ff3860; + border-color: #ff3860; + color: #fff; +} + +.button.is-danger.is-outlined.is-loading:after { + border-color: transparent transparent #ff3860 #ff3860 !important; +} + +.button.is-danger.is-outlined[disabled] { + background-color: transparent; + border-color: #ff3860; + box-shadow: none; + color: #ff3860; +} + +.button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined:focus { + background-color: #fff; + color: #ff3860; +} + +.button.is-danger.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-small { + border-radius: 2px; + font-size: 0.75rem; +} + +.button.is-medium { + font-size: 1.25rem; +} + +.button.is-large { + font-size: 1.5rem; +} + +.button[disabled] { + background-color: white; + border-color: #dbdbdb; + box-shadow: none; + opacity: 0.5; +} + +.button.is-fullwidth { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + width: 100%; +} + +.button.is-loading { + color: transparent !important; + pointer-events: none; +} + +.button.is-loading:after { + -webkit-animation: spinAround 500ms infinite linear; + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; +} + +button.button, +input[type="submit"].button { + line-height: 1; + padding-bottom: 0.4em; + padding-top: 0.35em; +} + +.content { + color: #4a4a4a; +} + +.content:not(:last-child) { + margin-bottom: 1.5rem; +} + +.content li + li { + margin-top: 0.25em; +} + +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; +} + +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #363636; + font-weight: 400; + line-height: 1.125; +} + +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; +} + +.content h1:not(:first-child) { + margin-top: 1em; +} + +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; +} + +.content h2:not(:first-child) { + margin-top: 1.1428em; +} + +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; +} + +.content h3:not(:first-child) { + margin-top: 1.3333em; +} + +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; +} + +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; +} + +.content h6 { + font-size: 1em; + margin-bottom: 1em; +} + +.content blockquote { + background-color: whitesmoke; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; +} + +.content ol { + list-style: decimal outside; + margin-left: 2em; + margin-right: 2em; + margin-top: 1em; +} + +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-right: 2em; + margin-top: 1em; +} + +.content ul ul { + list-style-type: circle; + margin-top: 0.5em; +} + +.content ul ul ul { + list-style-type: square; +} + +.content dd { + margin-left: 2em; +} + +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 1.25em 1.5em; + white-space: pre; + word-wrap: normal; +} + +.content table { + width: 100%; +} + +.content table td, +.content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} + +.content table th { + color: #363636; + text-align: left; +} + +.content table tr:hover { + background-color: whitesmoke; +} + +.content table thead td, +.content table thead th { + border-width: 0 0 2px; + color: #363636; +} + +.content table tfoot td, +.content table tfoot th { + border-width: 2px 0 0; + color: #363636; +} + +.content table tbody tr:last-child td, +.content table tbody tr:last-child th { + border-bottom-width: 0; +} + +.content.is-small { + font-size: 0.75rem; +} + +.content.is-medium { + font-size: 1.25rem; +} + +.content.is-large { + font-size: 1.5rem; +} + +.input, +.textarea { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + border-radius: 3px; + box-shadow: none; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; + background-color: white; + border-color: #dbdbdb; + color: #363636; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + max-width: 100%; + width: 100%; +} + +.input:focus, .input.is-focused, .input:active, .input.is-active, +.textarea:focus, +.textarea.is-focused, +.textarea:active, +.textarea.is-active { + outline: none; +} + +.input[disabled], +.textarea[disabled] { + cursor: not-allowed; +} + +.input:hover, .input.is-hovered, +.textarea:hover, +.textarea.is-hovered { + border-color: #b5b5b5; +} + +.input:focus, .input.is-focused, .input:active, .input.is-active, +.textarea:focus, +.textarea.is-focused, +.textarea:active, +.textarea.is-active { + border-color: #00d1b2; +} + +.input[disabled], +.textarea[disabled] { + background-color: whitesmoke; + border-color: whitesmoke; + box-shadow: none; + color: #7a7a7a; +} + +.input[disabled]::-moz-placeholder, +.textarea[disabled]::-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.input[disabled]::-webkit-input-placeholder, +.textarea[disabled]::-webkit-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.input[disabled]:-moz-placeholder, +.textarea[disabled]:-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.input[disabled]:-ms-input-placeholder, +.textarea[disabled]:-ms-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.input[type="search"], +.textarea[type="search"] { + border-radius: 290486px; +} + +.input.is-white, +.textarea.is-white { + border-color: white; +} + +.input.is-black, +.textarea.is-black { + border-color: #0a0a0a; +} + +.input.is-light, +.textarea.is-light { + border-color: whitesmoke; +} + +.input.is-dark, +.textarea.is-dark { + border-color: #363636; +} + +.input.is-primary, +.textarea.is-primary { + border-color: #00d1b2; +} + +.input.is-info, +.textarea.is-info { + border-color: #3273dc; +} + +.input.is-success, +.textarea.is-success { + border-color: #23d160; +} + +.input.is-warning, +.textarea.is-warning { + border-color: #ffdd57; +} + +.input.is-danger, +.textarea.is-danger { + border-color: #ff3860; +} + +.input.is-small, +.textarea.is-small { + border-radius: 2px; + font-size: 0.75rem; +} + +.input.is-medium, +.textarea.is-medium { + font-size: 1.25rem; +} + +.input.is-large, +.textarea.is-large { + font-size: 1.5rem; +} + +.input.is-fullwidth, +.textarea.is-fullwidth { + display: block; + width: 100%; +} + +.input.is-inline, +.textarea.is-inline { + display: inline; + width: auto; +} + +.textarea { + display: block; + max-height: 600px; + max-width: 100%; + min-height: 120px; + min-width: 100%; + padding: 0.625em; + resize: vertical; +} + +.checkbox, +.radio { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; +} + +.checkbox input, +.radio input { + cursor: pointer; +} + +.checkbox:hover, +.radio:hover { + color: #363636; +} + +.checkbox[disabled], +.radio[disabled] { + color: #7a7a7a; + cursor: not-allowed; +} + +.radio + .radio { + margin-left: 0.5em; +} + +.select { + display: inline-block; + height: 2.25em; + position: relative; + vertical-align: top; +} + +.select:after { + border: 1px solid #00d1b2; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.5em; + pointer-events: none; + position: absolute; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + width: 0.5em; + margin-top: -0.375em; + right: 1.125em; + top: 50%; + z-index: 4; +} + +.select select { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + border-radius: 3px; + box-shadow: none; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; + background-color: white; + border-color: #dbdbdb; + color: #363636; + cursor: pointer; + display: block; + font-size: 1em; + outline: none; + padding-right: 2.5em; +} + +.select select:focus, .select select.is-focused, .select select:active, .select select.is-active { + outline: none; +} + +.select select[disabled] { + cursor: not-allowed; +} + +.select select:hover, .select select.is-hovered { + border-color: #b5b5b5; +} + +.select select:focus, .select select.is-focused, .select select:active, .select select.is-active { + border-color: #00d1b2; +} + +.select select[disabled] { + background-color: whitesmoke; + border-color: whitesmoke; + box-shadow: none; + color: #7a7a7a; +} + +.select select[disabled]::-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select[disabled]::-webkit-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select[disabled]:-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select[disabled]:-ms-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select:hover { + border-color: #b5b5b5; +} + +.select select::-ms-expand { + display: none; +} + +.select select[disabled]:hover { + border-color: whitesmoke; +} + +.select:hover:after { + border-color: #363636; +} + +.select.is-white select { + border-color: white; +} + +.select.is-black select { + border-color: #0a0a0a; +} + +.select.is-light select { + border-color: whitesmoke; +} + +.select.is-dark select { + border-color: #363636; +} + +.select.is-primary select { + border-color: #00d1b2; +} + +.select.is-info select { + border-color: #3273dc; +} + +.select.is-success select { + border-color: #23d160; +} + +.select.is-warning select { + border-color: #ffdd57; +} + +.select.is-danger select { + border-color: #ff3860; +} + +.select.is-small { + border-radius: 2px; + font-size: 0.75rem; +} + +.select.is-medium { + font-size: 1.25rem; +} + +.select.is-large { + font-size: 1.5rem; +} + +.select.is-disabled:after { + border-color: #7a7a7a; +} + +.select.is-fullwidth { + width: 100%; +} + +.select.is-fullwidth select { + width: 100%; +} + +.select.is-loading:after { + -webkit-animation: spinAround 500ms infinite linear; + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + -webkit-transform: none; + transform: none; +} + +.label { + color: #363636; + display: block; + font-size: 1rem; + font-weight: 700; +} + +.label:not(:last-child) { + margin-bottom: 0.5em; +} + +.label.is-small { + font-size: 0.75rem; +} + +.label.is-medium { + font-size: 1.25rem; +} + +.label.is-large { + font-size: 1.5rem; +} + +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; +} + +.help.is-white { + color: white; +} + +.help.is-black { + color: #0a0a0a; +} + +.help.is-light { + color: whitesmoke; +} + +.help.is-dark { + color: #363636; +} + +.help.is-primary { + color: #00d1b2; +} + +.help.is-info { + color: #3273dc; +} + +.help.is-success { + color: #23d160; +} + +.help.is-warning { + color: #ffdd57; +} + +.help.is-danger { + color: #ff3860; +} + +.field:not(:last-child) { + margin-bottom: 0.75rem; +} + +.field.has-addons { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.field.has-addons .control { + margin-right: -1px; +} + +.field.has-addons .control:first-child .button, +.field.has-addons .control:first-child .input, +.field.has-addons .control:first-child .select select { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.field.has-addons .control:last-child .button, +.field.has-addons .control:last-child .input, +.field.has-addons .control:last-child .select select { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} + +.field.has-addons .control .button, +.field.has-addons .control .input, +.field.has-addons .control .select select { + border-radius: 0; +} + +.field.has-addons .control .button:hover, .field.has-addons .control .button.is-hovered, +.field.has-addons .control .input:hover, +.field.has-addons .control .input.is-hovered, +.field.has-addons .control .select select:hover, +.field.has-addons .control .select select.is-hovered { + z-index: 2; +} + +.field.has-addons .control .button:focus, .field.has-addons .control .button.is-focused, .field.has-addons .control .button:active, .field.has-addons .control .button.is-active, +.field.has-addons .control .input:focus, +.field.has-addons .control .input.is-focused, +.field.has-addons .control .input:active, +.field.has-addons .control .input.is-active, +.field.has-addons .control .select select:focus, +.field.has-addons .control .select select.is-focused, +.field.has-addons .control .select select:active, +.field.has-addons .control .select select.is-active { + z-index: 3; +} + +.field.has-addons .control .button:focus:hover, .field.has-addons .control .button.is-focused:hover, .field.has-addons .control .button:active:hover, .field.has-addons .control .button.is-active:hover, +.field.has-addons .control .input:focus:hover, +.field.has-addons .control .input.is-focused:hover, +.field.has-addons .control .input:active:hover, +.field.has-addons .control .input.is-active:hover, +.field.has-addons .control .select select:focus:hover, +.field.has-addons .control .select select.is-focused:hover, +.field.has-addons .control .select select:active:hover, +.field.has-addons .control .select select.is-active:hover { + z-index: 4; +} + +.field.has-addons .control.is-expanded { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.field.has-addons.has-addons-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.field.has-addons.has-addons-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.field.has-addons.has-addons-fullwidth .control { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.field.is-grouped { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.field.is-grouped > .control { + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} + +.field.is-grouped > .control.is-expanded { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; +} + +.field.is-grouped.is-grouped-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.field.is-grouped.is-grouped-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +@media screen and (min-width: 769px), print { + .field.is-horizontal { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +.field-label .label { + font-size: inherit; +} + +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; + } +} + +@media screen and (min-width: 769px), print { + .field-label { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; + } + .field-label.is-small { + font-size: 0.75rem; + padding-top: 0.375em; + } + .field-label.is-normal { + padding-top: 0.375em; + } + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; + } + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; + } +} + +@media screen and (min-width: 769px), print { + .field-body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 5; + -ms-flex-positive: 5; + flex-grow: 5; + -ms-flex-negative: 1; + flex-shrink: 1; + } + .field-body .field { + -ms-flex-negative: 1; + flex-shrink: 1; + } + .field-body .field:not(.is-narrow) { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + } + .field-body .field:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; + } +} + +.control { + font-size: 1rem; + position: relative; + text-align: left; +} + +.control.has-icon .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; +} + +.control.has-icon .input:focus + .icon { + color: #7a7a7a; +} + +.control.has-icon .input.is-small + .icon { + font-size: 0.75rem; +} + +.control.has-icon .input.is-medium + .icon { + font-size: 1.25rem; +} + +.control.has-icon .input.is-large + .icon { + font-size: 1.5rem; +} + +.control.has-icon:not(.has-icon-right) .icon { + left: 0; +} + +.control.has-icon:not(.has-icon-right) .input { + padding-left: 2.25em; +} + +.control.has-icon.has-icon-right .icon { + right: 0; +} + +.control.has-icon.has-icon-right .input { + padding-right: 2.25em; +} + +.control.has-icons-left .input:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon { + color: #7a7a7a; +} + +.control.has-icons-left .input.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon { + font-size: 0.75rem; +} + +.control.has-icons-left .input.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon { + font-size: 1.25rem; +} + +.control.has-icons-left .input.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon { + font-size: 1.5rem; +} + +.control.has-icons-left .icon, .control.has-icons-right .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; +} + +.control.has-icons-left .input { + padding-left: 2.25em; +} + +.control.has-icons-left .icon.is-left { + left: 0; +} + +.control.has-icons-right .input { + padding-right: 2.25em; +} + +.control.has-icons-right .icon.is-right { + right: 0; +} + +.control.is-loading:after { + -webkit-animation: spinAround 500ms infinite linear; + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; + position: absolute !important; + right: 0.625em; + top: 0.625em; +} + +.icon { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + height: 1.5rem; + width: 1.5rem; +} + +.icon .fa { + font-size: 21px; +} + +.icon.is-small { + height: 1rem; + width: 1rem; +} + +.icon.is-small .fa { + font-size: 14px; +} + +.icon.is-medium { + height: 2rem; + width: 2rem; +} + +.icon.is-medium .fa { + font-size: 28px; +} + +.icon.is-large { + height: 3rem; + width: 3rem; +} + +.icon.is-large .fa { + font-size: 42px; +} + +.image { + display: block; + position: relative; +} + +.image img { + display: block; + height: auto; + width: 100%; +} + +.image.is-square img, .image.is-1by1 img, .image.is-4by3 img, .image.is-3by2 img, .image.is-16by9 img, .image.is-2by1 img { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + height: 100%; + width: 100%; +} + +.image.is-square, .image.is-1by1 { + padding-top: 100%; +} + +.image.is-4by3 { + padding-top: 75%; +} + +.image.is-3by2 { + padding-top: 66.6666%; +} + +.image.is-16by9 { + padding-top: 56.25%; +} + +.image.is-2by1 { + padding-top: 50%; +} + +.image.is-16x16 { + height: 16px; + width: 16px; +} + +.image.is-24x24 { + height: 24px; + width: 24px; +} + +.image.is-32x32 { + height: 32px; + width: 32px; +} + +.image.is-48x48 { + height: 48px; + width: 48px; +} + +.image.is-64x64 { + height: 64px; + width: 64px; +} + +.image.is-96x96 { + height: 96px; + width: 96px; +} + +.image.is-128x128 { + height: 128px; + width: 128px; +} + +.notification { + background-color: whitesmoke; + border-radius: 3px; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; +} + +.notification:not(:last-child) { + margin-bottom: 1.5rem; +} + +.notification a:not(.button) { + color: currentColor; + text-decoration: underline; +} + +.notification code, +.notification pre { + background: white; +} + +.notification pre code { + background: transparent; +} + +.notification > .delete { + position: absolute; + right: 0.5em; + top: 0.5em; +} + +.notification .title, +.notification .subtitle, +.notification .content { + color: inherit; +} + +.notification.is-white { + background-color: white; + color: #0a0a0a; +} + +.notification.is-black { + background-color: #0a0a0a; + color: white; +} + +.notification.is-light { + background-color: whitesmoke; + color: #363636; +} + +.notification.is-dark { + background-color: #363636; + color: whitesmoke; +} + +.notification.is-primary { + background-color: #00d1b2; + color: #fff; +} + +.notification.is-info { + background-color: #3273dc; + color: #fff; +} + +.notification.is-success { + background-color: #23d160; + color: #fff; +} + +.notification.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.notification.is-danger { + background-color: #ff3860; + color: #fff; +} + +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; +} + +.progress:not(:last-child) { + margin-bottom: 1.5rem; +} + +.progress::-webkit-progress-bar { + background-color: #dbdbdb; +} + +.progress::-webkit-progress-value { + background-color: #4a4a4a; +} + +.progress::-moz-progress-bar { + background-color: #4a4a4a; +} + +.progress.is-white::-webkit-progress-value { + background-color: white; +} + +.progress.is-white::-moz-progress-bar { + background-color: white; +} + +.progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; +} + +.progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; +} + +.progress.is-light::-webkit-progress-value { + background-color: whitesmoke; +} + +.progress.is-light::-moz-progress-bar { + background-color: whitesmoke; +} + +.progress.is-dark::-webkit-progress-value { + background-color: #363636; +} + +.progress.is-dark::-moz-progress-bar { + background-color: #363636; +} + +.progress.is-primary::-webkit-progress-value { + background-color: #00d1b2; +} + +.progress.is-primary::-moz-progress-bar { + background-color: #00d1b2; +} + +.progress.is-info::-webkit-progress-value { + background-color: #3273dc; +} + +.progress.is-info::-moz-progress-bar { + background-color: #3273dc; +} + +.progress.is-success::-webkit-progress-value { + background-color: #23d160; +} + +.progress.is-success::-moz-progress-bar { + background-color: #23d160; +} + +.progress.is-warning::-webkit-progress-value { + background-color: #ffdd57; +} + +.progress.is-warning::-moz-progress-bar { + background-color: #ffdd57; +} + +.progress.is-danger::-webkit-progress-value { + background-color: #ff3860; +} + +.progress.is-danger::-moz-progress-bar { + background-color: #ff3860; +} + +.progress.is-small { + height: 0.75rem; +} + +.progress.is-medium { + height: 1.25rem; +} + +.progress.is-large { + height: 1.5rem; +} + +.table { + background-color: white; + color: #363636; + margin-bottom: 1.5rem; + width: 100%; +} + +.table td, +.table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} + +.table td.is-narrow, +.table th.is-narrow { + white-space: nowrap; + width: 1%; +} + +.table th { + color: #363636; + text-align: left; +} + +.table tr:hover { + background-color: #fafafa; +} + +.table tr.is-selected { + background-color: #00d1b2; + color: #fff; +} + +.table tr.is-selected a, +.table tr.is-selected strong { + color: currentColor; +} + +.table tr.is-selected td, +.table tr.is-selected th { + border-color: #fff; + color: currentColor; +} + +.table thead td, +.table thead th { + border-width: 0 0 2px; + color: #7a7a7a; +} + +.table tfoot td, +.table tfoot th { + border-width: 2px 0 0; + color: #7a7a7a; +} + +.table tbody tr:last-child td, +.table tbody tr:last-child th { + border-bottom-width: 0; +} + +.table.is-bordered td, +.table.is-bordered th { + border-width: 1px; +} + +.table.is-bordered tr:last-child td, +.table.is-bordered tr:last-child th { + border-bottom-width: 1px; +} + +.table.is-narrow td, +.table.is-narrow th { + padding: 0.25em 0.5em; +} + +.table.is-striped tbody tr:nth-child(even) { + background-color: #fafafa; +} + +.table.is-striped tbody tr:nth-child(even):hover { + background-color: whitesmoke; +} + +.tag { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: whitesmoke; + border-radius: 290486px; + color: #4a4a4a; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + line-height: 1.5; + padding-left: 0.875em; + padding-right: 0.875em; + white-space: nowrap; +} + +.tag .delete { + margin-left: 0.25em; + margin-right: -0.375em; +} + +.tag.is-white { + background-color: white; + color: #0a0a0a; +} + +.tag.is-black { + background-color: #0a0a0a; + color: white; +} + +.tag.is-light { + background-color: whitesmoke; + color: #363636; +} + +.tag.is-dark { + background-color: #363636; + color: whitesmoke; +} + +.tag.is-primary { + background-color: #00d1b2; + color: #fff; +} + +.tag.is-info { + background-color: #3273dc; + color: #fff; +} + +.tag.is-success { + background-color: #23d160; + color: #fff; +} + +.tag.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.tag.is-danger { + background-color: #ff3860; + color: #fff; +} + +.tag.is-medium { + font-size: 1rem; +} + +.tag.is-large { + font-size: 1.25rem; +} + +.title, +.subtitle { + word-break: break-word; +} + +.title:not(:last-child), +.subtitle:not(:last-child) { + margin-bottom: 1.5rem; +} + +.title em, +.title span, +.subtitle em, +.subtitle span { + font-weight: 300; +} + +.title strong, +.subtitle strong { + font-weight: 500; +} + +.title .tag, +.subtitle .tag { + vertical-align: middle; +} + +.title { + color: #363636; + font-size: 2rem; + font-weight: 300; + line-height: 1.125; +} + +.title strong { + color: inherit; +} + +.title + .highlight { + margin-top: -0.75rem; +} + +.title:not(.is-spaced) + .subtitle { + margin-top: -1.5rem; +} + +.title.is-1 { + font-size: 3rem; +} + +.title.is-2 { + font-size: 2.5rem; +} + +.title.is-3 { + font-size: 2rem; +} + +.title.is-4 { + font-size: 1.5rem; +} + +.title.is-5 { + font-size: 1.25rem; +} + +.title.is-6 { + font-size: 1rem; +} + +.subtitle { + color: #4a4a4a; + font-size: 1.25rem; + font-weight: 300; + line-height: 1.25; +} + +.subtitle strong { + color: #363636; +} + +.subtitle:not(.is-spaced) + .title { + margin-top: -1.5rem; +} + +.subtitle.is-1 { + font-size: 3rem; +} + +.subtitle.is-2 { + font-size: 2.5rem; +} + +.subtitle.is-3 { + font-size: 2rem; +} + +.subtitle.is-4 { + font-size: 1.5rem; +} + +.subtitle.is-5 { + font-size: 1.25rem; +} + +.subtitle.is-6 { + font-size: 1rem; +} + +.block:not(:last-child) { + margin-bottom: 1.5rem; +} + +.container { + position: relative; +} + +@media screen and (min-width: 1000px) { + .container { + margin: 0 auto; + max-width: 960px; + width: 960px; + } + .container.is-fluid { + margin: 0 20px; + max-width: none; + width: auto; + } +} + +@media screen and (min-width: 1192px) { + .container { + max-width: 1152px; + width: 1152px; + } +} + +@media screen and (min-width: 1384px) { + .container { + max-width: 1344px; + width: 1344px; + } +} + +.delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + display: inline-block; + font-size: 1rem; + height: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; +} + +.delete:before, .delete:after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform: translateX(-50%) translateY(-50%) rotate(45deg); + -webkit-transform-origin: center center; + transform-origin: center center; +} + +.delete:before { + height: 2px; + width: 50%; +} + +.delete:after { + height: 50%; + width: 2px; +} + +.delete:hover, .delete:focus { + background-color: rgba(10, 10, 10, 0.3); +} + +.delete:active { + background-color: rgba(10, 10, 10, 0.4); +} + +.delete.is-small { + height: 16px; + width: 16px; +} + +.delete.is-medium { + height: 24px; + width: 24px; +} + +.delete.is-large { + height: 32px; + width: 32px; +} + +.fa { + font-size: 21px; + text-align: center; + vertical-align: top; +} + +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; +} + +.highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; +} + +.highlight:not(:last-child) { + margin-bottom: 1.5rem; +} + +.highlight pre { + overflow: auto; + max-width: 100%; +} + +.loader { + -webkit-animation: spinAround 500ms infinite linear; + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; +} + +.number { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: whitesmoke; + border-radius: 290486px; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; +} + +.card-header { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.card-header-title { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #363636; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem; +} + +.card-header-icon { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + cursor: pointer; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0.75rem; +} + +.card-image { + display: block; + position: relative; +} + +.card-content { + padding: 1.5rem; +} + +.card-footer { + border-top: 1px solid #dbdbdb; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.card-footer-item { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0.75rem; +} + +.card-footer-item:not(:last-child) { + border-right: 1px solid #dbdbdb; +} + +.card { + background-color: white; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #4a4a4a; + max-width: 100%; + position: relative; +} + +.card .media:not(:last-child) { + margin-bottom: 0.75rem; +} + +.level-item { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-preferred-size: auto; + flex-basis: auto; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.level-item .title, +.level-item .subtitle { + margin-bottom: 0; +} + +@media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; + } +} + +.level-left, +.level-right { + -ms-flex-preferred-size: auto; + flex-basis: auto; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.level-left .level-item:not(:last-child), +.level-right .level-item:not(:last-child) { + margin-right: 0.75rem; +} + +.level-left .level-item.is-flexible, +.level-right .level-item.is-flexible { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.level-left { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +@media screen and (max-width: 768px) { + .level-left + .level-right { + margin-top: 1.5rem; + } +} + +@media screen and (min-width: 769px), print { + .level-left { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +.level-right { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +@media screen and (min-width: 769px), print { + .level-right { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +.level { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.level:not(:last-child) { + margin-bottom: 1.5rem; +} + +.level code { + border-radius: 3px; +} + +.level img { + display: inline-block; + vertical-align: top; +} + +.level.is-mobile { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.level.is-mobile .level-left, +.level.is-mobile .level-right { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.level.is-mobile .level-left + .level-right { + margin-top: 0; +} + +.level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; +} + +.level.is-mobile .level-item:not(.is-narrow) { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +@media screen and (min-width: 769px), print { + .level { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .level > .level-item:not(.is-narrow) { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + } +} + +.media-left, +.media-right { + -ms-flex-preferred-size: auto; + flex-basis: auto; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.media-left { + margin-right: 1rem; +} + +.media-right { + margin-left: 1rem; +} + +.media-content { + -ms-flex-preferred-size: auto; + flex-basis: auto; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + text-align: left; +} + +.media { + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + text-align: left; +} + +.media .content:not(:last-child) { + margin-bottom: 0.75rem; +} + +.media .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding-top: 0.75rem; +} + +.media .media .content:not(:last-child), +.media .media .control:not(:last-child) { + margin-bottom: 0.5rem; +} + +.media .media .media { + padding-top: 0.5rem; +} + +.media .media .media + .media { + margin-top: 0.5rem; +} + +.media + .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + margin-top: 1rem; + padding-top: 1rem; +} + +.media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; +} + +.menu { + font-size: 1rem; +} + +.menu-list { + line-height: 1.25; +} + +.menu-list a { + border-radius: 2px; + color: #4a4a4a; + display: block; + padding: 0.5em 0.75em; +} + +.menu-list a:hover { + background-color: whitesmoke; + color: #00d1b2; +} + +.menu-list a.is-active { + background-color: #00d1b2; + color: #fff; +} + +.menu-list li ul { + border-left: 1px solid #dbdbdb; + margin: 0.75em; + padding-left: 0.75em; +} + +.menu-label { + color: #7a7a7a; + font-size: 0.8em; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.menu-label:not(:first-child) { + margin-top: 1em; +} + +.menu-label:not(:last-child) { + margin-bottom: 1em; +} + +.message { + background-color: whitesmoke; + border-radius: 3px; + font-size: 1rem; +} + +.message:not(:last-child) { + margin-bottom: 1.5rem; +} + +.message.is-white { + background-color: white; +} + +.message.is-white .message-header { + background-color: white; + color: #0a0a0a; +} + +.message.is-white .message-body { + border-color: white; + color: #4d4d4d; +} + +.message.is-black { + background-color: #fafafa; +} + +.message.is-black .message-header { + background-color: #0a0a0a; + color: white; +} + +.message.is-black .message-body { + border-color: #0a0a0a; + color: #090909; +} + +.message.is-light { + background-color: #fafafa; +} + +.message.is-light .message-header { + background-color: whitesmoke; + color: #363636; +} + +.message.is-light .message-body { + border-color: whitesmoke; + color: #505050; +} + +.message.is-dark { + background-color: #fafafa; +} + +.message.is-dark .message-header { + background-color: #363636; + color: whitesmoke; +} + +.message.is-dark .message-body { + border-color: #363636; + color: #2a2a2a; +} + +.message.is-primary { + background-color: #f5fffd; +} + +.message.is-primary .message-header { + background-color: #00d1b2; + color: #fff; +} + +.message.is-primary .message-body { + border-color: #00d1b2; + color: #021310; +} + +.message.is-info { + background-color: #f6f9fe; +} + +.message.is-info .message-header { + background-color: #3273dc; + color: #fff; +} + +.message.is-info .message-body { + border-color: #3273dc; + color: #22509a; +} + +.message.is-success { + background-color: #f6fef9; +} + +.message.is-success .message-header { + background-color: #23d160; + color: #fff; +} + +.message.is-success .message-body { + border-color: #23d160; + color: #0e301a; +} + +.message.is-warning { + background-color: #fffdf5; +} + +.message.is-warning .message-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.message.is-warning .message-body { + border-color: #ffdd57; + color: #3b3108; +} + +.message.is-danger { + background-color: #fff5f7; +} + +.message.is-danger .message-header { + background-color: #ff3860; + color: #fff; +} + +.message.is-danger .message-body { + border-color: #ff3860; + color: #cd0930; +} + +.message-header { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: #4a4a4a; + border-radius: 3px 3px 0 0; + color: #fff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + line-height: 1.25; + padding: 0.5em 0.75em; + position: relative; +} + +.message-header a, +.message-header strong { + color: inherit; +} + +.message-header a { + text-decoration: underline; +} + +.message-header .delete { + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + margin-left: 0.75em; +} + +.message-header + .message-body { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top: none; +} + +.message-body { + border: 1px solid #dbdbdb; + border-radius: 3px; + color: #4a4a4a; + padding: 1em 1.25em; +} + +.message-body a, +.message-body strong { + color: inherit; +} + +.message-body a { + text-decoration: underline; +} + +.message-body code, +.message-body pre { + background: white; +} + +.message-body pre code { + background: transparent; +} + +.modal-background { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + background-color: rgba(10, 10, 10, 0.86); +} + +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; +} + +@media screen and (min-width: 769px), print { + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; + } +} + +.modal-close { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + display: inline-block; + font-size: 1rem; + height: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; +} + +.modal-close:before, .modal-close:after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform: translateX(-50%) translateY(-50%) rotate(45deg); + -webkit-transform-origin: center center; + transform-origin: center center; +} + +.modal-close:before { + height: 2px; + width: 50%; +} + +.modal-close:after { + height: 50%; + width: 2px; +} + +.modal-close:hover, .modal-close:focus { + background-color: rgba(10, 10, 10, 0.3); +} + +.modal-close:active { + background-color: rgba(10, 10, 10, 0.4); +} + +.modal-close.is-small { + height: 16px; + width: 16px; +} + +.modal-close.is-medium { + height: 24px; + width: 24px; +} + +.modal-close.is-large { + height: 32px; + width: 32px; +} + +.modal-card { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; +} + +.modal-card-head, +.modal-card-foot { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: whitesmoke; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + padding: 20px; + position: relative; +} + +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.modal-card-title { + color: #363636; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; +} + +.modal-card-foot { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-top: 1px solid #dbdbdb; +} + +.modal-card-foot .button:not(:last-child) { + margin-right: 10px; +} + +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; +} + +.modal { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: none; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 20; +} + +.modal.is-active { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.nav-toggle { + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; +} + +.nav-toggle span { + background-color: #4a4a4a; + display: block; + height: 1px; + left: 50%; + margin-left: -7px; + position: absolute; + top: 50%; + -webkit-transition: none 86ms ease-out; + transition: none 86ms ease-out; + -webkit-transition-property: background, left, opacity, -webkit-transform; + transition-property: background, left, opacity, -webkit-transform; + transition-property: background, left, opacity, transform; + transition-property: background, left, opacity, transform, -webkit-transform; + width: 15px; +} + +.nav-toggle span:nth-child(1) { + margin-top: -6px; +} + +.nav-toggle span:nth-child(2) { + margin-top: -1px; +} + +.nav-toggle span:nth-child(3) { + margin-top: 4px; +} + +.nav-toggle:hover { + background-color: whitesmoke; +} + +.nav-toggle.is-active span { + background-color: #00d1b2; +} + +.nav-toggle.is-active span:nth-child(1) { + margin-left: -5px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-transform-origin: left top; + transform-origin: left top; +} + +.nav-toggle.is-active span:nth-child(2) { + opacity: 0; +} + +.nav-toggle.is-active span:nth-child(3) { + margin-left: -5px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: left bottom; + transform-origin: left bottom; +} + +@media screen and (min-width: 769px), print { + .nav-toggle { + display: none; + } +} + +.nav-item { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + font-size: 1rem; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + line-height: 1.5; + padding: 0.5rem 0.75rem; +} + +.nav-item a { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.nav-item img { + max-height: 1.75rem; +} + +.nav-item .tag:first-child:not(:last-child) { + margin-right: 0.5rem; +} + +.nav-item .tag:last-child:not(:first-child) { + margin-left: 0.5rem; +} + +@media screen and (max-width: 768px) { + .nav-item { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + } +} + +.nav-item a, +a.nav-item { + color: #7a7a7a; +} + +.nav-item a:hover, +a.nav-item:hover { + color: #363636; +} + +.nav-item a.is-active, +a.nav-item.is-active { + color: #363636; +} + +.nav-item a.is-tab, +a.nav-item.is-tab { + border-bottom: 1px solid transparent; + border-top: 1px solid transparent; + padding-bottom: calc(0.75rem - 1px); + padding-left: 1rem; + padding-right: 1rem; + padding-top: calc(0.75rem - 1px); +} + +.nav-item a.is-tab:hover, +a.nav-item.is-tab:hover { + border-bottom-color: #00d1b2; + border-top-color: transparent; +} + +.nav-item a.is-tab.is-active, +a.nav-item.is-tab.is-active { + border-bottom: 3px solid #00d1b2; + color: #00d1b2; + padding-bottom: calc(0.75rem - 3px); +} + +@media screen and (min-width: 1000px) { + .nav-item a.is-brand, + a.nav-item.is-brand { + padding-left: 0; + } +} + +.nav-left, +.nav-right { + -webkit-overflow-scrolling: touch; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + max-width: 100%; + overflow: auto; +} + +@media screen and (min-width: 1192px) { + .nav-left, + .nav-right { + -ms-flex-preferred-size: 0; + flex-basis: 0; + } +} + +.nav-left { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + white-space: nowrap; +} + +.nav-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.nav-center { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-left: auto; + margin-right: auto; +} + +@media screen and (max-width: 768px) { + .nav-menu.nav-right { + background-color: white; + box-shadow: 0 4px 7px rgba(10, 10, 10, 0.1); + left: 0; + display: none; + right: 0; + top: 100%; + position: absolute; + } + .nav-menu.nav-right .nav-item { + border-top: 1px solid rgba(219, 219, 219, 0.5); + padding: 0.75rem; + } + .nav-menu.nav-right.is-active { + display: block; + } +} + +.nav { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + background-color: white; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 3.25rem; + position: relative; + text-align: center; + z-index: 10; +} + +.nav > .container { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + min-height: 3.25rem; + width: 100%; +} + +.nav.has-shadow { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1); +} + +.pagination { + font-size: 1rem; + margin: -0.25rem; +} + +.pagination.is-small { + font-size: 0.75rem; +} + +.pagination.is-medium { + font-size: 1.25rem; +} + +.pagination.is-large { + font-size: 1.5rem; +} + +.pagination, +.pagination-list { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; +} + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + border-radius: 3px; + box-shadow: none; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + font-size: 1em; + padding-left: 0.5em; + padding-right: 0.5em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin: 0.25rem; + text-align: center; +} + +.pagination-previous:focus, .pagination-previous.is-focused, .pagination-previous:active, .pagination-previous.is-active, +.pagination-next:focus, +.pagination-next.is-focused, +.pagination-next:active, +.pagination-next.is-active, +.pagination-link:focus, +.pagination-link.is-focused, +.pagination-link:active, +.pagination-link.is-active, +.pagination-ellipsis:focus, +.pagination-ellipsis.is-focused, +.pagination-ellipsis:active, +.pagination-ellipsis.is-active { + outline: none; +} + +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled], +.pagination-ellipsis[disabled] { + cursor: not-allowed; +} + +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + min-width: 2.25em; +} + +.pagination-previous:hover, +.pagination-next:hover, +.pagination-link:hover { + border-color: #b5b5b5; + color: #363636; +} + +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus { + border-color: #00d1b2; +} + +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); +} + +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled] { + background-color: #dbdbdb; + border-color: #dbdbdb; + box-shadow: none; + color: #7a7a7a; + opacity: 0.5; +} + +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} + +.pagination-link.is-current { + background-color: #00d1b2; + border-color: #00d1b2; + color: #fff; +} + +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; +} + +.pagination-list { + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +@media screen and (max-width: 768px) { + .pagination { + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } + .pagination-previous, + .pagination-next { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + } + .pagination-list li { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + } +} + +@media screen and (min-width: 769px), print { + .pagination-list { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .pagination-previous { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .pagination-next { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + .pagination { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + } + .pagination.is-centered .pagination-previous { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .pagination.is-centered .pagination-list { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .pagination.is-centered .pagination-next { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + .pagination.is-right .pagination-previous { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .pagination.is-right .pagination-next { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .pagination.is-right .pagination-list { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } +} + +.panel { + font-size: 1rem; +} + +.panel:not(:last-child) { + margin-bottom: 1.5rem; +} + +.panel-heading, +.panel-tabs, +.panel-block { + border-bottom: 1px solid #dbdbdb; + border-left: 1px solid #dbdbdb; + border-right: 1px solid #dbdbdb; +} + +.panel-heading:first-child, +.panel-tabs:first-child, +.panel-block:first-child { + border-top: 1px solid #dbdbdb; +} + +.panel-heading { + background-color: whitesmoke; + border-radius: 3px 3px 0 0; + color: #363636; + font-size: 1.25em; + font-weight: 300; + line-height: 1.25; + padding: 0.5em 0.75em; +} + +.panel-tabs { + -webkit-box-align: end; + -ms-flex-align: end; + align-items: flex-end; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 0.875em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; +} + +.panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; +} + +.panel-list a { + color: #4a4a4a; +} + +.panel-list a:hover { + color: #00d1b2; +} + +.panel-block { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #363636; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + padding: 0.5em 0.75em; +} + +.panel-block input[type="checkbox"] { + margin-right: 0.75em; +} + +.panel-block > .control { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + width: 100%; +} + +.panel-block.is-wrapped { + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.panel-block.is-active { + border-left-color: #00d1b2; + color: #363636; +} + +.panel-block.is-active .panel-icon { + color: #00d1b2; +} + +a.panel-block, +label.panel-block { + cursor: pointer; +} + +a.panel-block:hover, +label.panel-block:hover { + background-color: whitesmoke; +} + +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #7a7a7a; + margin-right: 0.75em; +} + +.panel-icon .fa { + font-size: inherit; + line-height: inherit; +} + +.tabs { + -webkit-overflow-scrolling: touch; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 1rem; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; +} + +.tabs:not(:last-child) { + margin-bottom: 1.5rem; +} + +.tabs a { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-bottom: 1px solid #dbdbdb; + color: #4a4a4a; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; +} + +.tabs a:hover { + border-bottom-color: #363636; + color: #363636; +} + +.tabs li { + display: block; +} + +.tabs li.is-active a { + border-bottom-color: #00d1b2; + color: #00d1b2; +} + +.tabs ul { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-bottom: 1px solid #dbdbdb; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.tabs ul.is-left { + padding-right: 0.75em; +} + +.tabs ul.is-center { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; +} + +.tabs ul.is-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + padding-left: 0.75em; +} + +.tabs .icon:first-child { + margin-right: 0.5em; +} + +.tabs .icon:last-child { + margin-left: 0.5em; +} + +.tabs.is-centered ul { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.tabs.is-right ul { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 3px 3px 0 0; +} + +.tabs.is-boxed a:hover { + background-color: whitesmoke; + border-bottom-color: #dbdbdb; +} + +.tabs.is-boxed li.is-active a { + background-color: white; + border-color: #dbdbdb; + border-bottom-color: transparent !important; +} + +.tabs.is-fullwidth li { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.tabs.is-toggle a { + border: 1px solid #dbdbdb; + margin-bottom: 0; + position: relative; +} + +.tabs.is-toggle a:hover { + background-color: whitesmoke; + border-color: #b5b5b5; + z-index: 2; +} + +.tabs.is-toggle li + li { + margin-left: -1px; +} + +.tabs.is-toggle li:first-child a { + border-radius: 3px 0 0 3px; +} + +.tabs.is-toggle li:last-child a { + border-radius: 0 3px 3px 0; +} + +.tabs.is-toggle li.is-active a { + background-color: #00d1b2; + border-color: #00d1b2; + color: #fff; + z-index: 1; +} + +.tabs.is-toggle ul { + border-bottom: none; +} + +.tabs.is-small { + font-size: 0.75rem; +} + +.tabs.is-medium { + font-size: 1.25rem; +} + +.tabs.is-large { + font-size: 1.5rem; +} + +.column { + display: block; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + padding: 0.75rem; +} + +.columns.is-mobile > .column.is-narrow { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; +} + +.columns.is-mobile > .column.is-full { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; +} + +.columns.is-mobile > .column.is-three-quarters { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; +} + +.columns.is-mobile > .column.is-two-thirds { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; +} + +.columns.is-mobile > .column.is-half { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; +} + +.columns.is-mobile > .column.is-one-third { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; +} + +.columns.is-mobile > .column.is-one-quarter { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; +} + +.columns.is-mobile > .column.is-offset-three-quarters { + margin-left: 75%; +} + +.columns.is-mobile > .column.is-offset-two-thirds { + margin-left: 66.6666%; +} + +.columns.is-mobile > .column.is-offset-half { + margin-left: 50%; +} + +.columns.is-mobile > .column.is-offset-one-third { + margin-left: 33.3333%; +} + +.columns.is-mobile > .column.is-offset-one-quarter { + margin-left: 25%; +} + +.columns.is-mobile > .column.is-1 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; +} + +.columns.is-mobile > .column.is-offset-1 { + margin-left: 8.33333%; +} + +.columns.is-mobile > .column.is-2 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; +} + +.columns.is-mobile > .column.is-offset-2 { + margin-left: 16.66667%; +} + +.columns.is-mobile > .column.is-3 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; +} + +.columns.is-mobile > .column.is-offset-3 { + margin-left: 25%; +} + +.columns.is-mobile > .column.is-4 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; +} + +.columns.is-mobile > .column.is-offset-4 { + margin-left: 33.33333%; +} + +.columns.is-mobile > .column.is-5 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; +} + +.columns.is-mobile > .column.is-offset-5 { + margin-left: 41.66667%; +} + +.columns.is-mobile > .column.is-6 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; +} + +.columns.is-mobile > .column.is-offset-6 { + margin-left: 50%; +} + +.columns.is-mobile > .column.is-7 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; +} + +.columns.is-mobile > .column.is-offset-7 { + margin-left: 58.33333%; +} + +.columns.is-mobile > .column.is-8 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; +} + +.columns.is-mobile > .column.is-offset-8 { + margin-left: 66.66667%; +} + +.columns.is-mobile > .column.is-9 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; +} + +.columns.is-mobile > .column.is-offset-9 { + margin-left: 75%; +} + +.columns.is-mobile > .column.is-10 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; +} + +.columns.is-mobile > .column.is-offset-10 { + margin-left: 83.33333%; +} + +.columns.is-mobile > .column.is-11 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; +} + +.columns.is-mobile > .column.is-offset-11 { + margin-left: 91.66667%; +} + +.columns.is-mobile > .column.is-12 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; +} + +.columns.is-mobile > .column.is-offset-12 { + margin-left: 100%; +} + +@media screen and (max-width: 768px) { + .column.is-narrow-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-three-quarters-mobile { + margin-left: 75%; + } + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; + } + .column.is-offset-half-mobile { + margin-left: 50%; + } + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-mobile { + margin-left: 25%; + } + .column.is-1-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1-mobile { + margin-left: 8.33333%; + } + .column.is-2-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2-mobile { + margin-left: 16.66667%; + } + .column.is-3-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3-mobile { + margin-left: 25%; + } + .column.is-4-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4-mobile { + margin-left: 33.33333%; + } + .column.is-5-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5-mobile { + margin-left: 41.66667%; + } + .column.is-6-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6-mobile { + margin-left: 50%; + } + .column.is-7-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7-mobile { + margin-left: 58.33333%; + } + .column.is-8-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8-mobile { + margin-left: 66.66667%; + } + .column.is-9-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9-mobile { + margin-left: 75%; + } + .column.is-10-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10-mobile { + margin-left: 83.33333%; + } + .column.is-11-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11-mobile { + margin-left: 91.66667%; + } + .column.is-12-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12-mobile { + margin-left: 100%; + } +} + +@media screen and (min-width: 769px), print { + .column.is-narrow, .column.is-narrow-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full, .column.is-full-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters, .column.is-three-quarters-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds, .column.is-two-thirds-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half, .column.is-half-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third, .column.is-one-third-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter, .column.is-one-quarter-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { + margin-left: 75%; + } + .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; + } + .column.is-offset-half, .column.is-offset-half-tablet { + margin-left: 50%; + } + .column.is-offset-one-third, .column.is-offset-one-third-tablet { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { + margin-left: 25%; + } + .column.is-1, .column.is-1-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1, .column.is-offset-1-tablet { + margin-left: 8.33333%; + } + .column.is-2, .column.is-2-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2, .column.is-offset-2-tablet { + margin-left: 16.66667%; + } + .column.is-3, .column.is-3-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3, .column.is-offset-3-tablet { + margin-left: 25%; + } + .column.is-4, .column.is-4-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4, .column.is-offset-4-tablet { + margin-left: 33.33333%; + } + .column.is-5, .column.is-5-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5, .column.is-offset-5-tablet { + margin-left: 41.66667%; + } + .column.is-6, .column.is-6-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6, .column.is-offset-6-tablet { + margin-left: 50%; + } + .column.is-7, .column.is-7-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7, .column.is-offset-7-tablet { + margin-left: 58.33333%; + } + .column.is-8, .column.is-8-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8, .column.is-offset-8-tablet { + margin-left: 66.66667%; + } + .column.is-9, .column.is-9-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9, .column.is-offset-9-tablet { + margin-left: 75%; + } + .column.is-10, .column.is-10-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10, .column.is-offset-10-tablet { + margin-left: 83.33333%; + } + .column.is-11, .column.is-11-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11, .column.is-offset-11-tablet { + margin-left: 91.66667%; + } + .column.is-12, .column.is-12-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12, .column.is-offset-12-tablet { + margin-left: 100%; + } +} + +@media screen and (min-width: 1000px) { + .column.is-narrow-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-three-quarters-desktop { + margin-left: 75%; + } + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; + } + .column.is-offset-half-desktop { + margin-left: 50%; + } + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-desktop { + margin-left: 25%; + } + .column.is-1-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1-desktop { + margin-left: 8.33333%; + } + .column.is-2-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2-desktop { + margin-left: 16.66667%; + } + .column.is-3-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3-desktop { + margin-left: 25%; + } + .column.is-4-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4-desktop { + margin-left: 33.33333%; + } + .column.is-5-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5-desktop { + margin-left: 41.66667%; + } + .column.is-6-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6-desktop { + margin-left: 50%; + } + .column.is-7-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7-desktop { + margin-left: 58.33333%; + } + .column.is-8-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8-desktop { + margin-left: 66.66667%; + } + .column.is-9-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9-desktop { + margin-left: 75%; + } + .column.is-10-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10-desktop { + margin-left: 83.33333%; + } + .column.is-11-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11-desktop { + margin-left: 91.66667%; + } + .column.is-12-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12-desktop { + margin-left: 100%; + } +} + +@media screen and (min-width: 1192px) { + .column.is-narrow-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; + } + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; + } + .column.is-offset-half-widescreen { + margin-left: 50%; + } + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; + } + .column.is-1-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1-widescreen { + margin-left: 8.33333%; + } + .column.is-2-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2-widescreen { + margin-left: 16.66667%; + } + .column.is-3-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3-widescreen { + margin-left: 25%; + } + .column.is-4-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4-widescreen { + margin-left: 33.33333%; + } + .column.is-5-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5-widescreen { + margin-left: 41.66667%; + } + .column.is-6-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6-widescreen { + margin-left: 50%; + } + .column.is-7-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7-widescreen { + margin-left: 58.33333%; + } + .column.is-8-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8-widescreen { + margin-left: 66.66667%; + } + .column.is-9-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9-widescreen { + margin-left: 75%; + } + .column.is-10-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10-widescreen { + margin-left: 83.33333%; + } + .column.is-11-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11-widescreen { + margin-left: 91.66667%; + } + .column.is-12-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12-widescreen { + margin-left: 100%; + } +} + +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} + +.columns:last-child { + margin-bottom: -0.75rem; +} + +.columns:not(:last-child) { + margin-bottom: 0.75rem; +} + +.columns.is-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; +} + +.columns.is-gapless:last-child { + margin-bottom: 0; +} + +.columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; +} + +.columns.is-gapless > .column { + margin: 0; + padding: 0; +} + +@media screen and (min-width: 769px), print { + .columns.is-grid { + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } + .columns.is-grid > .column { + max-width: 33.3333%; + padding: 0.75rem; + width: 33.3333%; + } + .columns.is-grid > .column + .column { + margin-left: 0; + } +} + +.columns.is-mobile { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.columns.is-multiline { + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.columns.is-vcentered { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +@media screen and (min-width: 769px), print { + .columns:not(.is-desktop) { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +@media screen and (min-width: 1000px) { + .columns.is-desktop { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +.tile { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: block; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + min-height: -webkit-min-content; + min-height: -moz-min-content; + min-height: min-content; +} + +.tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} + +.tile.is-ancestor:last-child { + margin-bottom: -0.75rem; +} + +.tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; +} + +.tile.is-child { + margin: 0 !important; +} + +.tile.is-parent { + padding: 0.75rem; +} + +.tile.is-vertical { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; +} + +@media screen and (min-width: 769px), print { + .tile:not(.is-child) { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .tile.is-1 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .tile.is-2 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .tile.is-3 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .tile.is-4 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .tile.is-5 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .tile.is-6 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .tile.is-7 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .tile.is-8 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .tile.is-9 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .tile.is-10 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .tile.is-11 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .tile.is-12 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } +} + +.hero-video { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + overflow: hidden; +} + +.hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + -webkit-transform: translate3d(-50%, -50%, 0); + transform: translate3d(-50%, -50%, 0); +} + +.hero-video.is-transparent { + opacity: 0.3; +} + +@media screen and (max-width: 768px) { + .hero-video { + display: none; + } +} + +.hero-buttons { + margin-top: 1.5rem; +} + +@media screen and (max-width: 768px) { + .hero-buttons .button { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; + } +} + +@media screen and (min-width: 769px), print { + .hero-buttons { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + } + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; + } +} + +.hero-head, +.hero-foot { + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.hero-body { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + padding: 3rem 1.5rem; +} + +@media screen and (min-width: 1192px) { + .hero-body { + padding-left: 0; + padding-right: 0; + } +} + +.hero { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + background-color: white; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.hero .nav { + background: none; + box-shadow: 0 1px 0 rgba(219, 219, 219, 0.3); +} + +.hero .tabs ul { + border-bottom: none; +} + +.hero.is-white { + background-color: white; + color: #0a0a0a; +} + +.hero.is-white a:not(.button), +.hero.is-white strong { + color: inherit; +} + +.hero.is-white .title { + color: #0a0a0a; +} + +.hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); +} + +.hero.is-white .subtitle a:not(.button), +.hero.is-white .subtitle strong { + color: #0a0a0a; +} + +.hero.is-white .nav { + box-shadow: 0 1px 0 rgba(10, 10, 10, 0.2); +} + +@media screen and (max-width: 768px) { + .hero.is-white .nav-menu { + background-color: white; + } +} + +.hero.is-white a.nav-item, +.hero.is-white .nav-item a:not(.button) { + color: rgba(10, 10, 10, 0.7); +} + +.hero.is-white a.nav-item:hover, .hero.is-white a.nav-item.is-active, +.hero.is-white .nav-item a:not(.button):hover, +.hero.is-white .nav-item a:not(.button).is-active { + color: #0a0a0a; +} + +.hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; +} + +.hero.is-white .tabs a:hover { + opacity: 1; +} + +.hero.is-white .tabs li.is-active a { + opacity: 1; +} + +.hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { + color: #0a0a0a; +} + +.hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; +} + +.hero.is-white.is-bold { + background-image: -webkit-linear-gradient(309deg, #e6e6e6 0%, white 71%, white 100%); + background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-white.is-bold .nav-menu { + background-image: -webkit-linear-gradient(309deg, #e6e6e6 0%, white 71%, white 100%); + background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); + } +} + +@media screen and (max-width: 768px) { + .hero.is-white .nav-toggle span { + background-color: #0a0a0a; + } + .hero.is-white .nav-toggle:hover { + background-color: rgba(10, 10, 10, 0.1); + } + .hero.is-white .nav-toggle.is-active span { + background-color: #0a0a0a; + } + .hero.is-white .nav-menu .nav-item { + border-top-color: rgba(10, 10, 10, 0.2); + } +} + +.hero.is-black { + background-color: #0a0a0a; + color: white; +} + +.hero.is-black a:not(.button), +.hero.is-black strong { + color: inherit; +} + +.hero.is-black .title { + color: white; +} + +.hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-black .subtitle a:not(.button), +.hero.is-black .subtitle strong { + color: white; +} + +.hero.is-black .nav { + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); +} + +@media screen and (max-width: 768px) { + .hero.is-black .nav-menu { + background-color: #0a0a0a; + } +} + +.hero.is-black a.nav-item, +.hero.is-black .nav-item a:not(.button) { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-black a.nav-item:hover, .hero.is-black a.nav-item.is-active, +.hero.is-black .nav-item a:not(.button):hover, +.hero.is-black .nav-item a:not(.button).is-active { + color: white; +} + +.hero.is-black .tabs a { + color: white; + opacity: 0.9; +} + +.hero.is-black .tabs a:hover { + opacity: 1; +} + +.hero.is-black .tabs li.is-active a { + opacity: 1; +} + +.hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { + color: white; +} + +.hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; +} + +.hero.is-black.is-bold { + background-image: -webkit-linear-gradient(309deg, black 0%, #0a0a0a 71%, #181616 100%); + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-black.is-bold .nav-menu { + background-image: -webkit-linear-gradient(309deg, black 0%, #0a0a0a 71%, #181616 100%); + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); + } +} + +@media screen and (max-width: 768px) { + .hero.is-black .nav-toggle span { + background-color: white; + } + .hero.is-black .nav-toggle:hover { + background-color: rgba(10, 10, 10, 0.1); + } + .hero.is-black .nav-toggle.is-active span { + background-color: white; + } + .hero.is-black .nav-menu .nav-item { + border-top-color: rgba(255, 255, 255, 0.2); + } +} + +.hero.is-light { + background-color: whitesmoke; + color: #363636; +} + +.hero.is-light a:not(.button), +.hero.is-light strong { + color: inherit; +} + +.hero.is-light .title { + color: #363636; +} + +.hero.is-light .subtitle { + color: rgba(54, 54, 54, 0.9); +} + +.hero.is-light .subtitle a:not(.button), +.hero.is-light .subtitle strong { + color: #363636; +} + +.hero.is-light .nav { + box-shadow: 0 1px 0 rgba(54, 54, 54, 0.2); +} + +@media screen and (max-width: 768px) { + .hero.is-light .nav-menu { + background-color: whitesmoke; + } +} + +.hero.is-light a.nav-item, +.hero.is-light .nav-item a:not(.button) { + color: rgba(54, 54, 54, 0.7); +} + +.hero.is-light a.nav-item:hover, .hero.is-light a.nav-item.is-active, +.hero.is-light .nav-item a:not(.button):hover, +.hero.is-light .nav-item a:not(.button).is-active { + color: #363636; +} + +.hero.is-light .tabs a { + color: #363636; + opacity: 0.9; +} + +.hero.is-light .tabs a:hover { + opacity: 1; +} + +.hero.is-light .tabs li.is-active a { + opacity: 1; +} + +.hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { + color: #363636; +} + +.hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: #363636; + border-color: #363636; + color: whitesmoke; +} + +.hero.is-light.is-bold { + background-image: -webkit-linear-gradient(309deg, #dfd8d8 0%, whitesmoke 71%, white 100%); + background-image: linear-gradient(141deg, #dfd8d8 0%, whitesmoke 71%, white 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-light.is-bold .nav-menu { + background-image: -webkit-linear-gradient(309deg, #dfd8d8 0%, whitesmoke 71%, white 100%); + background-image: linear-gradient(141deg, #dfd8d8 0%, whitesmoke 71%, white 100%); + } +} + +@media screen and (max-width: 768px) { + .hero.is-light .nav-toggle span { + background-color: #363636; + } + .hero.is-light .nav-toggle:hover { + background-color: rgba(10, 10, 10, 0.1); + } + .hero.is-light .nav-toggle.is-active span { + background-color: #363636; + } + .hero.is-light .nav-menu .nav-item { + border-top-color: rgba(54, 54, 54, 0.2); + } +} + +.hero.is-dark { + background-color: #363636; + color: whitesmoke; +} + +.hero.is-dark a:not(.button), +.hero.is-dark strong { + color: inherit; +} + +.hero.is-dark .title { + color: whitesmoke; +} + +.hero.is-dark .subtitle { + color: rgba(245, 245, 245, 0.9); +} + +.hero.is-dark .subtitle a:not(.button), +.hero.is-dark .subtitle strong { + color: whitesmoke; +} + +.hero.is-dark .nav { + box-shadow: 0 1px 0 rgba(245, 245, 245, 0.2); +} + +@media screen and (max-width: 768px) { + .hero.is-dark .nav-menu { + background-color: #363636; + } +} + +.hero.is-dark a.nav-item, +.hero.is-dark .nav-item a:not(.button) { + color: rgba(245, 245, 245, 0.7); +} + +.hero.is-dark a.nav-item:hover, .hero.is-dark a.nav-item.is-active, +.hero.is-dark .nav-item a:not(.button):hover, +.hero.is-dark .nav-item a:not(.button).is-active { + color: whitesmoke; +} + +.hero.is-dark .tabs a { + color: whitesmoke; + opacity: 0.9; +} + +.hero.is-dark .tabs a:hover { + opacity: 1; +} + +.hero.is-dark .tabs li.is-active a { + opacity: 1; +} + +.hero.is-dark .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a { + color: whitesmoke; +} + +.hero.is-dark .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-dark .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; +} + +.hero.is-dark.is-bold { + background-image: -webkit-linear-gradient(309deg, #1f1919 0%, #363636 71%, #463f3f 100%); + background-image: linear-gradient(141deg, #1f1919 0%, #363636 71%, #463f3f 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-dark.is-bold .nav-menu { + background-image: -webkit-linear-gradient(309deg, #1f1919 0%, #363636 71%, #463f3f 100%); + background-image: linear-gradient(141deg, #1f1919 0%, #363636 71%, #463f3f 100%); + } +} + +@media screen and (max-width: 768px) { + .hero.is-dark .nav-toggle span { + background-color: whitesmoke; + } + .hero.is-dark .nav-toggle:hover { + background-color: rgba(10, 10, 10, 0.1); + } + .hero.is-dark .nav-toggle.is-active span { + background-color: whitesmoke; + } + .hero.is-dark .nav-menu .nav-item { + border-top-color: rgba(245, 245, 245, 0.2); + } +} + +.hero.is-primary { + background-color: #00d1b2; + color: #fff; +} + +.hero.is-primary a:not(.button), +.hero.is-primary strong { + color: inherit; +} + +.hero.is-primary .title { + color: #fff; +} + +.hero.is-primary .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-primary .subtitle a:not(.button), +.hero.is-primary .subtitle strong { + color: #fff; +} + +.hero.is-primary .nav { + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); +} + +@media screen and (max-width: 768px) { + .hero.is-primary .nav-menu { + background-color: #00d1b2; + } +} + +.hero.is-primary a.nav-item, +.hero.is-primary .nav-item a:not(.button) { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-primary a.nav-item:hover, .hero.is-primary a.nav-item.is-active, +.hero.is-primary .nav-item a:not(.button):hover, +.hero.is-primary .nav-item a:not(.button).is-active { + color: #fff; +} + +.hero.is-primary .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-primary .tabs a:hover { + opacity: 1; +} + +.hero.is-primary .tabs li.is-active a { + opacity: 1; +} + +.hero.is-primary .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a { + color: #fff; +} + +.hero.is-primary .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-primary .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #00d1b2; +} + +.hero.is-primary.is-bold { + background-image: -webkit-linear-gradient(309deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); + background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-primary.is-bold .nav-menu { + background-image: -webkit-linear-gradient(309deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); + background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); + } +} + +@media screen and (max-width: 768px) { + .hero.is-primary .nav-toggle span { + background-color: #fff; + } + .hero.is-primary .nav-toggle:hover { + background-color: rgba(10, 10, 10, 0.1); + } + .hero.is-primary .nav-toggle.is-active span { + background-color: #fff; + } + .hero.is-primary .nav-menu .nav-item { + border-top-color: rgba(255, 255, 255, 0.2); + } +} + +.hero.is-info { + background-color: #3273dc; + color: #fff; +} + +.hero.is-info a:not(.button), +.hero.is-info strong { + color: inherit; +} + +.hero.is-info .title { + color: #fff; +} + +.hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-info .subtitle a:not(.button), +.hero.is-info .subtitle strong { + color: #fff; +} + +.hero.is-info .nav { + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); +} + +@media screen and (max-width: 768px) { + .hero.is-info .nav-menu { + background-color: #3273dc; + } +} + +.hero.is-info a.nav-item, +.hero.is-info .nav-item a:not(.button) { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-info a.nav-item:hover, .hero.is-info a.nav-item.is-active, +.hero.is-info .nav-item a:not(.button):hover, +.hero.is-info .nav-item a:not(.button).is-active { + color: #fff; +} + +.hero.is-info .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-info .tabs a:hover { + opacity: 1; +} + +.hero.is-info .tabs li.is-active a { + opacity: 1; +} + +.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { + color: #fff; +} + +.hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #3273dc; +} + +.hero.is-info.is-bold { + background-image: -webkit-linear-gradient(309deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); + background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-info.is-bold .nav-menu { + background-image: -webkit-linear-gradient(309deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); + background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); + } +} + +@media screen and (max-width: 768px) { + .hero.is-info .nav-toggle span { + background-color: #fff; + } + .hero.is-info .nav-toggle:hover { + background-color: rgba(10, 10, 10, 0.1); + } + .hero.is-info .nav-toggle.is-active span { + background-color: #fff; + } + .hero.is-info .nav-menu .nav-item { + border-top-color: rgba(255, 255, 255, 0.2); + } +} + +.hero.is-success { + background-color: #23d160; + color: #fff; +} + +.hero.is-success a:not(.button), +.hero.is-success strong { + color: inherit; +} + +.hero.is-success .title { + color: #fff; +} + +.hero.is-success .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-success .subtitle a:not(.button), +.hero.is-success .subtitle strong { + color: #fff; +} + +.hero.is-success .nav { + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); +} + +@media screen and (max-width: 768px) { + .hero.is-success .nav-menu { + background-color: #23d160; + } +} + +.hero.is-success a.nav-item, +.hero.is-success .nav-item a:not(.button) { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-success a.nav-item:hover, .hero.is-success a.nav-item.is-active, +.hero.is-success .nav-item a:not(.button):hover, +.hero.is-success .nav-item a:not(.button).is-active { + color: #fff; +} + +.hero.is-success .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-success .tabs a:hover { + opacity: 1; +} + +.hero.is-success .tabs li.is-active a { + opacity: 1; +} + +.hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { + color: #fff; +} + +.hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #23d160; +} + +.hero.is-success.is-bold { + background-image: -webkit-linear-gradient(309deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); + background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-success.is-bold .nav-menu { + background-image: -webkit-linear-gradient(309deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); + background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); + } +} + +@media screen and (max-width: 768px) { + .hero.is-success .nav-toggle span { + background-color: #fff; + } + .hero.is-success .nav-toggle:hover { + background-color: rgba(10, 10, 10, 0.1); + } + .hero.is-success .nav-toggle.is-active span { + background-color: #fff; + } + .hero.is-success .nav-menu .nav-item { + border-top-color: rgba(255, 255, 255, 0.2); + } +} + +.hero.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning a:not(.button), +.hero.is-warning strong { + color: inherit; +} + +.hero.is-warning .title { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .subtitle { + color: rgba(0, 0, 0, 0.9); +} + +.hero.is-warning .subtitle a:not(.button), +.hero.is-warning .subtitle strong { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .nav { + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); +} + +@media screen and (max-width: 768px) { + .hero.is-warning .nav-menu { + background-color: #ffdd57; + } +} + +.hero.is-warning a.nav-item, +.hero.is-warning .nav-item a:not(.button) { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning a.nav-item:hover, .hero.is-warning a.nav-item.is-active, +.hero.is-warning .nav-item a:not(.button):hover, +.hero.is-warning .nav-item a:not(.button).is-active { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; +} + +.hero.is-warning .tabs a:hover { + opacity: 1; +} + +.hero.is-warning .tabs li.is-active a { + opacity: 1; +} + +.hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; +} + +.hero.is-warning.is-bold { + background-image: -webkit-linear-gradient(309deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); + background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-warning.is-bold .nav-menu { + background-image: -webkit-linear-gradient(309deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); + background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); + } +} + +@media screen and (max-width: 768px) { + .hero.is-warning .nav-toggle span { + background-color: rgba(0, 0, 0, 0.7); + } + .hero.is-warning .nav-toggle:hover { + background-color: rgba(10, 10, 10, 0.1); + } + .hero.is-warning .nav-toggle.is-active span { + background-color: rgba(0, 0, 0, 0.7); + } + .hero.is-warning .nav-menu .nav-item { + border-top-color: rgba(0, 0, 0, 0.2); + } +} + +.hero.is-danger { + background-color: #ff3860; + color: #fff; +} + +.hero.is-danger a:not(.button), +.hero.is-danger strong { + color: inherit; +} + +.hero.is-danger .title { + color: #fff; +} + +.hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-danger .subtitle a:not(.button), +.hero.is-danger .subtitle strong { + color: #fff; +} + +.hero.is-danger .nav { + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); +} + +@media screen and (max-width: 768px) { + .hero.is-danger .nav-menu { + background-color: #ff3860; + } +} + +.hero.is-danger a.nav-item, +.hero.is-danger .nav-item a:not(.button) { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-danger a.nav-item:hover, .hero.is-danger a.nav-item.is-active, +.hero.is-danger .nav-item a:not(.button):hover, +.hero.is-danger .nav-item a:not(.button).is-active { + color: #fff; +} + +.hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-danger .tabs a:hover { + opacity: 1; +} + +.hero.is-danger .tabs li.is-active a { + opacity: 1; +} + +.hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { + color: #fff; +} + +.hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ff3860; +} + +.hero.is-danger.is-bold { + background-image: -webkit-linear-gradient(309deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); + background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-danger.is-bold .nav-menu { + background-image: -webkit-linear-gradient(309deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); + background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); + } +} + +@media screen and (max-width: 768px) { + .hero.is-danger .nav-toggle span { + background-color: #fff; + } + .hero.is-danger .nav-toggle:hover { + background-color: rgba(10, 10, 10, 0.1); + } + .hero.is-danger .nav-toggle.is-active span { + background-color: #fff; + } + .hero.is-danger .nav-menu .nav-item { + border-top-color: rgba(255, 255, 255, 0.2); + } +} + +@media screen and (min-width: 769px), print { + .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; + } +} + +@media screen and (min-width: 769px), print { + .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; + } +} + +.hero.is-fullheight { + min-height: 100vh; +} + +.hero.is-fullheight .hero-body { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.hero.is-fullheight .hero-body > .container { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; +} + +.section { + background-color: white; + padding: 3rem 1.5rem; +} + +@media screen and (min-width: 1000px) { + .section.is-medium { + padding: 9rem 1.5rem; + } + .section.is-large { + padding: 18rem 1.5rem; + } +} + +.footer { + background-color: whitesmoke; + padding: 3rem 1.5rem 6rem; +} +/*# sourceMappingURL=bulma.css.map */ \ No newline at end of file diff --git a/pkgs/csslib/test/examples/foundation.css b/pkgs/csslib/test/examples/foundation.css new file mode 100644 index 000000000..dd9aabd0d --- /dev/null +++ b/pkgs/csslib/test/examples/foundation.css @@ -0,0 +1,4398 @@ +@charset "UTF-8"; +/** + * Foundation for Sites by ZURB + * Version 6.3.1 + * foundation.zurb.com + * Licensed under MIT Open Source + */ +/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ +/* Document + ========================================================================== */ +/** + * 1. Change the default font family in all browsers (opinionated). + * 2. Correct the line height in all browsers. + * 3. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ +html { + font-family: sans-serif; + /* 1 */ + line-height: 1.15; + /* 2 */ + -ms-text-size-adjust: 100%; + /* 3 */ + -webkit-text-size-adjust: 100%; + /* 3 */ } + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers (opinionated). + */ +body { + margin: 0; } + +/** + * Add the correct display in IE 9-. + */ +article, +aside, +footer, +header, +nav, +section { + display: block; } + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; } + +/* Grouping content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +figcaption, +figure { + display: block; } + +/** + * Add the correct margin in IE 8. + */ +figure { + margin: 1em 40px; } + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ } + +/** + * Add the correct display in IE. + */ +main { + display: block; } + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ } + +/* Links + ========================================================================== */ +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ +a { + background-color: transparent; + /* 1 */ + -webkit-text-decoration-skip: objects; + /* 2 */ } + +/** + * Remove the outline on focused links when they are also active or hovered + * in all browsers (opinionated). + */ +a:active, +a:hover { + outline-width: 0; } + +/* Text-level semantics + ========================================================================== */ +/** + * 1. Remove the bottom border in Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + /* 1 */ + text-decoration: underline; + /* 2 */ + text-decoration: underline dotted; + /* 2 */ } + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ +b, +strong { + font-weight: inherit; } + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; } + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ } + +/** + * Add the correct font style in Android 4.3-. + */ +dfn { + font-style: italic; } + +/** + * Add the correct background and color in IE 9-. + */ +mark { + background-color: #ff0; + color: #000; } + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; } + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sub { + bottom: -0.25em; } + +sup { + top: -0.5em; } + +/* Embedded content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +audio, +video { + display: inline-block; } + +/** + * Add the correct display in iOS 4-7. + */ +audio:not([controls]) { + display: none; + height: 0; } + +/** + * Remove the border on images inside links in IE 10-. + */ +img { + border-style: none; } + +/** + * Hide the overflow in IE. + */ +svg:not(:root) { + overflow: hidden; } + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ } + +/** + * Show the overflow in IE. + */ +button { + overflow: visible; } + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; } + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; + /* 2 */ } + +button, +[type="button"], +[type="reset"], +[type="submit"] { + /** + * Remove the inner border and padding in Firefox. + */ + /** + * Restore the focus styles unset by the previous rule. + */ } + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; } + button:-moz-focusring, + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; } + +/** + * Show the overflow in Edge. + */ +input { + overflow: visible; } + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ } + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; } + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ + /** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ } + [type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ } + +/** + * Change the border, margin, and padding in all browsers (opinionated). + */ +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; + /* 1 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + color: inherit; + /* 2 */ + white-space: normal; + /* 1 */ } + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ } + +/** + * Remove the default vertical scrollbar in IE. + */ +textarea { + overflow: auto; } + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in Edge, IE, and Firefox. + */ +details { + display: block; } + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; } + +/* + * Add the correct display in IE 9-. + */ +menu { + display: block; } + +/* Scripting + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +canvas { + display: inline-block; } + +/** + * Add the correct display in IE. + */ +template { + display: none; } + +/* Hidden + ========================================================================== */ +/** + * Add the correct display in IE 10-. + */ +[hidden] { + display: none; } + +.foundation-mq { + font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; } + +html { + box-sizing: border-box; + font-size: 100%; } + +*, +*::before, +*::after { + box-sizing: inherit; } + +body { + margin: 0; + padding: 0; + background: #fefefe; + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-weight: normal; + line-height: 1.5; + color: #0a0a0a; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +img { + display: inline-block; + vertical-align: middle; + max-width: 100%; + height: auto; + -ms-interpolation-mode: bicubic; } + +textarea { + height: auto; + min-height: 50px; + border-radius: 0; } + +select { + box-sizing: border-box; + width: 100%; + border-radius: 0; } + +.map_canvas img, +.map_canvas embed, +.map_canvas object, +.mqa-display img, +.mqa-display embed, +.mqa-display object { + max-width: none !important; } + +button { + padding: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 0; + border-radius: 0; + background: transparent; + line-height: 1; } + [data-whatinput='mouse'] button { + outline: 0; } + +pre { + overflow: auto; } + +.is-visible { + display: block !important; } + +.is-hidden { + display: none !important; } + +.row { + max-width: 75rem; + margin-right: auto; + margin-left: auto; } + .row::before, .row::after { + display: table; + content: ' '; } + .row::after { + clear: both; } + .row.collapse > .column, .row.collapse > .columns { + padding-right: 0; + padding-left: 0; } + .row .row { + margin-right: -0.625rem; + margin-left: -0.625rem; } + @media print, screen and (min-width: 40em) { + .row .row { + margin-right: -0.9375rem; + margin-left: -0.9375rem; } } + @media print, screen and (min-width: 64em) { + .row .row { + margin-right: -0.9375rem; + margin-left: -0.9375rem; } } + .row .row.collapse { + margin-right: 0; + margin-left: 0; } + .row.expanded { + max-width: none; } + .row.expanded .row { + margin-right: auto; + margin-left: auto; } + .row:not(.expanded) .row { + max-width: none; } + .row.gutter-small > .column, .row.gutter-small > .columns { + padding-right: 0.625rem; + padding-left: 0.625rem; } + .row.gutter-medium > .column, .row.gutter-medium > .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } + +.column, .columns { + width: 100%; + float: left; + padding-right: 0.625rem; + padding-left: 0.625rem; } + @media print, screen and (min-width: 40em) { + .column, .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } } + .column:last-child:not(:first-child), .columns:last-child:not(:first-child) { + float: right; } + .column.end:last-child:last-child, .end.columns:last-child:last-child { + float: left; } + +.column.row.row, .row.row.columns { + float: none; } + +.row .column.row.row, .row .row.row.columns { + margin-right: 0; + margin-left: 0; + padding-right: 0; + padding-left: 0; } + +.small-1 { + width: 8.33333%; } + +.small-push-1 { + position: relative; + left: 8.33333%; } + +.small-pull-1 { + position: relative; + left: -8.33333%; } + +.small-offset-0 { + margin-left: 0%; } + +.small-2 { + width: 16.66667%; } + +.small-push-2 { + position: relative; + left: 16.66667%; } + +.small-pull-2 { + position: relative; + left: -16.66667%; } + +.small-offset-1 { + margin-left: 8.33333%; } + +.small-3 { + width: 25%; } + +.small-push-3 { + position: relative; + left: 25%; } + +.small-pull-3 { + position: relative; + left: -25%; } + +.small-offset-2 { + margin-left: 16.66667%; } + +.small-4 { + width: 33.33333%; } + +.small-push-4 { + position: relative; + left: 33.33333%; } + +.small-pull-4 { + position: relative; + left: -33.33333%; } + +.small-offset-3 { + margin-left: 25%; } + +.small-5 { + width: 41.66667%; } + +.small-push-5 { + position: relative; + left: 41.66667%; } + +.small-pull-5 { + position: relative; + left: -41.66667%; } + +.small-offset-4 { + margin-left: 33.33333%; } + +.small-6 { + width: 50%; } + +.small-push-6 { + position: relative; + left: 50%; } + +.small-pull-6 { + position: relative; + left: -50%; } + +.small-offset-5 { + margin-left: 41.66667%; } + +.small-7 { + width: 58.33333%; } + +.small-push-7 { + position: relative; + left: 58.33333%; } + +.small-pull-7 { + position: relative; + left: -58.33333%; } + +.small-offset-6 { + margin-left: 50%; } + +.small-8 { + width: 66.66667%; } + +.small-push-8 { + position: relative; + left: 66.66667%; } + +.small-pull-8 { + position: relative; + left: -66.66667%; } + +.small-offset-7 { + margin-left: 58.33333%; } + +.small-9 { + width: 75%; } + +.small-push-9 { + position: relative; + left: 75%; } + +.small-pull-9 { + position: relative; + left: -75%; } + +.small-offset-8 { + margin-left: 66.66667%; } + +.small-10 { + width: 83.33333%; } + +.small-push-10 { + position: relative; + left: 83.33333%; } + +.small-pull-10 { + position: relative; + left: -83.33333%; } + +.small-offset-9 { + margin-left: 75%; } + +.small-11 { + width: 91.66667%; } + +.small-push-11 { + position: relative; + left: 91.66667%; } + +.small-pull-11 { + position: relative; + left: -91.66667%; } + +.small-offset-10 { + margin-left: 83.33333%; } + +.small-12 { + width: 100%; } + +.small-offset-11 { + margin-left: 91.66667%; } + +.small-up-1 > .column, .small-up-1 > .columns { + float: left; + width: 100%; } + .small-up-1 > .column:nth-of-type(1n), .small-up-1 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-1 > .column:nth-of-type(1n+1), .small-up-1 > .columns:nth-of-type(1n+1) { + clear: both; } + .small-up-1 > .column:last-child, .small-up-1 > .columns:last-child { + float: left; } + +.small-up-2 > .column, .small-up-2 > .columns { + float: left; + width: 50%; } + .small-up-2 > .column:nth-of-type(1n), .small-up-2 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-2 > .column:nth-of-type(2n+1), .small-up-2 > .columns:nth-of-type(2n+1) { + clear: both; } + .small-up-2 > .column:last-child, .small-up-2 > .columns:last-child { + float: left; } + +.small-up-3 > .column, .small-up-3 > .columns { + float: left; + width: 33.33333%; } + .small-up-3 > .column:nth-of-type(1n), .small-up-3 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-3 > .column:nth-of-type(3n+1), .small-up-3 > .columns:nth-of-type(3n+1) { + clear: both; } + .small-up-3 > .column:last-child, .small-up-3 > .columns:last-child { + float: left; } + +.small-up-4 > .column, .small-up-4 > .columns { + float: left; + width: 25%; } + .small-up-4 > .column:nth-of-type(1n), .small-up-4 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-4 > .column:nth-of-type(4n+1), .small-up-4 > .columns:nth-of-type(4n+1) { + clear: both; } + .small-up-4 > .column:last-child, .small-up-4 > .columns:last-child { + float: left; } + +.small-up-5 > .column, .small-up-5 > .columns { + float: left; + width: 20%; } + .small-up-5 > .column:nth-of-type(1n), .small-up-5 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-5 > .column:nth-of-type(5n+1), .small-up-5 > .columns:nth-of-type(5n+1) { + clear: both; } + .small-up-5 > .column:last-child, .small-up-5 > .columns:last-child { + float: left; } + +.small-up-6 > .column, .small-up-6 > .columns { + float: left; + width: 16.66667%; } + .small-up-6 > .column:nth-of-type(1n), .small-up-6 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-6 > .column:nth-of-type(6n+1), .small-up-6 > .columns:nth-of-type(6n+1) { + clear: both; } + .small-up-6 > .column:last-child, .small-up-6 > .columns:last-child { + float: left; } + +.small-up-7 > .column, .small-up-7 > .columns { + float: left; + width: 14.28571%; } + .small-up-7 > .column:nth-of-type(1n), .small-up-7 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-7 > .column:nth-of-type(7n+1), .small-up-7 > .columns:nth-of-type(7n+1) { + clear: both; } + .small-up-7 > .column:last-child, .small-up-7 > .columns:last-child { + float: left; } + +.small-up-8 > .column, .small-up-8 > .columns { + float: left; + width: 12.5%; } + .small-up-8 > .column:nth-of-type(1n), .small-up-8 > .columns:nth-of-type(1n) { + clear: none; } + .small-up-8 > .column:nth-of-type(8n+1), .small-up-8 > .columns:nth-of-type(8n+1) { + clear: both; } + .small-up-8 > .column:last-child, .small-up-8 > .columns:last-child { + float: left; } + +.small-collapse > .column, .small-collapse > .columns { + padding-right: 0; + padding-left: 0; } + +.small-collapse .row { + margin-right: 0; + margin-left: 0; } + +.expanded.row .small-collapse.row { + margin-right: 0; + margin-left: 0; } + +.small-uncollapse > .column, .small-uncollapse > .columns { + padding-right: 0.625rem; + padding-left: 0.625rem; } + +.small-centered { + margin-right: auto; + margin-left: auto; } + .small-centered, .small-centered:last-child:not(:first-child) { + float: none; + clear: both; } + +.small-uncentered, +.small-push-0, +.small-pull-0 { + position: static; + float: left; + margin-right: 0; + margin-left: 0; } + +@media print, screen and (min-width: 40em) { + .medium-1 { + width: 8.33333%; } + .medium-push-1 { + position: relative; + left: 8.33333%; } + .medium-pull-1 { + position: relative; + left: -8.33333%; } + .medium-offset-0 { + margin-left: 0%; } + .medium-2 { + width: 16.66667%; } + .medium-push-2 { + position: relative; + left: 16.66667%; } + .medium-pull-2 { + position: relative; + left: -16.66667%; } + .medium-offset-1 { + margin-left: 8.33333%; } + .medium-3 { + width: 25%; } + .medium-push-3 { + position: relative; + left: 25%; } + .medium-pull-3 { + position: relative; + left: -25%; } + .medium-offset-2 { + margin-left: 16.66667%; } + .medium-4 { + width: 33.33333%; } + .medium-push-4 { + position: relative; + left: 33.33333%; } + .medium-pull-4 { + position: relative; + left: -33.33333%; } + .medium-offset-3 { + margin-left: 25%; } + .medium-5 { + width: 41.66667%; } + .medium-push-5 { + position: relative; + left: 41.66667%; } + .medium-pull-5 { + position: relative; + left: -41.66667%; } + .medium-offset-4 { + margin-left: 33.33333%; } + .medium-6 { + width: 50%; } + .medium-push-6 { + position: relative; + left: 50%; } + .medium-pull-6 { + position: relative; + left: -50%; } + .medium-offset-5 { + margin-left: 41.66667%; } + .medium-7 { + width: 58.33333%; } + .medium-push-7 { + position: relative; + left: 58.33333%; } + .medium-pull-7 { + position: relative; + left: -58.33333%; } + .medium-offset-6 { + margin-left: 50%; } + .medium-8 { + width: 66.66667%; } + .medium-push-8 { + position: relative; + left: 66.66667%; } + .medium-pull-8 { + position: relative; + left: -66.66667%; } + .medium-offset-7 { + margin-left: 58.33333%; } + .medium-9 { + width: 75%; } + .medium-push-9 { + position: relative; + left: 75%; } + .medium-pull-9 { + position: relative; + left: -75%; } + .medium-offset-8 { + margin-left: 66.66667%; } + .medium-10 { + width: 83.33333%; } + .medium-push-10 { + position: relative; + left: 83.33333%; } + .medium-pull-10 { + position: relative; + left: -83.33333%; } + .medium-offset-9 { + margin-left: 75%; } + .medium-11 { + width: 91.66667%; } + .medium-push-11 { + position: relative; + left: 91.66667%; } + .medium-pull-11 { + position: relative; + left: -91.66667%; } + .medium-offset-10 { + margin-left: 83.33333%; } + .medium-12 { + width: 100%; } + .medium-offset-11 { + margin-left: 91.66667%; } + .medium-up-1 > .column, .medium-up-1 > .columns { + float: left; + width: 100%; } + .medium-up-1 > .column:nth-of-type(1n), .medium-up-1 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-1 > .column:nth-of-type(1n+1), .medium-up-1 > .columns:nth-of-type(1n+1) { + clear: both; } + .medium-up-1 > .column:last-child, .medium-up-1 > .columns:last-child { + float: left; } + .medium-up-2 > .column, .medium-up-2 > .columns { + float: left; + width: 50%; } + .medium-up-2 > .column:nth-of-type(1n), .medium-up-2 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-2 > .column:nth-of-type(2n+1), .medium-up-2 > .columns:nth-of-type(2n+1) { + clear: both; } + .medium-up-2 > .column:last-child, .medium-up-2 > .columns:last-child { + float: left; } + .medium-up-3 > .column, .medium-up-3 > .columns { + float: left; + width: 33.33333%; } + .medium-up-3 > .column:nth-of-type(1n), .medium-up-3 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-3 > .column:nth-of-type(3n+1), .medium-up-3 > .columns:nth-of-type(3n+1) { + clear: both; } + .medium-up-3 > .column:last-child, .medium-up-3 > .columns:last-child { + float: left; } + .medium-up-4 > .column, .medium-up-4 > .columns { + float: left; + width: 25%; } + .medium-up-4 > .column:nth-of-type(1n), .medium-up-4 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-4 > .column:nth-of-type(4n+1), .medium-up-4 > .columns:nth-of-type(4n+1) { + clear: both; } + .medium-up-4 > .column:last-child, .medium-up-4 > .columns:last-child { + float: left; } + .medium-up-5 > .column, .medium-up-5 > .columns { + float: left; + width: 20%; } + .medium-up-5 > .column:nth-of-type(1n), .medium-up-5 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-5 > .column:nth-of-type(5n+1), .medium-up-5 > .columns:nth-of-type(5n+1) { + clear: both; } + .medium-up-5 > .column:last-child, .medium-up-5 > .columns:last-child { + float: left; } + .medium-up-6 > .column, .medium-up-6 > .columns { + float: left; + width: 16.66667%; } + .medium-up-6 > .column:nth-of-type(1n), .medium-up-6 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-6 > .column:nth-of-type(6n+1), .medium-up-6 > .columns:nth-of-type(6n+1) { + clear: both; } + .medium-up-6 > .column:last-child, .medium-up-6 > .columns:last-child { + float: left; } + .medium-up-7 > .column, .medium-up-7 > .columns { + float: left; + width: 14.28571%; } + .medium-up-7 > .column:nth-of-type(1n), .medium-up-7 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-7 > .column:nth-of-type(7n+1), .medium-up-7 > .columns:nth-of-type(7n+1) { + clear: both; } + .medium-up-7 > .column:last-child, .medium-up-7 > .columns:last-child { + float: left; } + .medium-up-8 > .column, .medium-up-8 > .columns { + float: left; + width: 12.5%; } + .medium-up-8 > .column:nth-of-type(1n), .medium-up-8 > .columns:nth-of-type(1n) { + clear: none; } + .medium-up-8 > .column:nth-of-type(8n+1), .medium-up-8 > .columns:nth-of-type(8n+1) { + clear: both; } + .medium-up-8 > .column:last-child, .medium-up-8 > .columns:last-child { + float: left; } + .medium-collapse > .column, .medium-collapse > .columns { + padding-right: 0; + padding-left: 0; } + .medium-collapse .row { + margin-right: 0; + margin-left: 0; } + .expanded.row .medium-collapse.row { + margin-right: 0; + margin-left: 0; } + .medium-uncollapse > .column, .medium-uncollapse > .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } + .medium-centered { + margin-right: auto; + margin-left: auto; } + .medium-centered, .medium-centered:last-child:not(:first-child) { + float: none; + clear: both; } + .medium-uncentered, + .medium-push-0, + .medium-pull-0 { + position: static; + float: left; + margin-right: 0; + margin-left: 0; } } + +@media print, screen and (min-width: 64em) { + .large-1 { + width: 8.33333%; } + .large-push-1 { + position: relative; + left: 8.33333%; } + .large-pull-1 { + position: relative; + left: -8.33333%; } + .large-offset-0 { + margin-left: 0%; } + .large-2 { + width: 16.66667%; } + .large-push-2 { + position: relative; + left: 16.66667%; } + .large-pull-2 { + position: relative; + left: -16.66667%; } + .large-offset-1 { + margin-left: 8.33333%; } + .large-3 { + width: 25%; } + .large-push-3 { + position: relative; + left: 25%; } + .large-pull-3 { + position: relative; + left: -25%; } + .large-offset-2 { + margin-left: 16.66667%; } + .large-4 { + width: 33.33333%; } + .large-push-4 { + position: relative; + left: 33.33333%; } + .large-pull-4 { + position: relative; + left: -33.33333%; } + .large-offset-3 { + margin-left: 25%; } + .large-5 { + width: 41.66667%; } + .large-push-5 { + position: relative; + left: 41.66667%; } + .large-pull-5 { + position: relative; + left: -41.66667%; } + .large-offset-4 { + margin-left: 33.33333%; } + .large-6 { + width: 50%; } + .large-push-6 { + position: relative; + left: 50%; } + .large-pull-6 { + position: relative; + left: -50%; } + .large-offset-5 { + margin-left: 41.66667%; } + .large-7 { + width: 58.33333%; } + .large-push-7 { + position: relative; + left: 58.33333%; } + .large-pull-7 { + position: relative; + left: -58.33333%; } + .large-offset-6 { + margin-left: 50%; } + .large-8 { + width: 66.66667%; } + .large-push-8 { + position: relative; + left: 66.66667%; } + .large-pull-8 { + position: relative; + left: -66.66667%; } + .large-offset-7 { + margin-left: 58.33333%; } + .large-9 { + width: 75%; } + .large-push-9 { + position: relative; + left: 75%; } + .large-pull-9 { + position: relative; + left: -75%; } + .large-offset-8 { + margin-left: 66.66667%; } + .large-10 { + width: 83.33333%; } + .large-push-10 { + position: relative; + left: 83.33333%; } + .large-pull-10 { + position: relative; + left: -83.33333%; } + .large-offset-9 { + margin-left: 75%; } + .large-11 { + width: 91.66667%; } + .large-push-11 { + position: relative; + left: 91.66667%; } + .large-pull-11 { + position: relative; + left: -91.66667%; } + .large-offset-10 { + margin-left: 83.33333%; } + .large-12 { + width: 100%; } + .large-offset-11 { + margin-left: 91.66667%; } + .large-up-1 > .column, .large-up-1 > .columns { + float: left; + width: 100%; } + .large-up-1 > .column:nth-of-type(1n), .large-up-1 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-1 > .column:nth-of-type(1n+1), .large-up-1 > .columns:nth-of-type(1n+1) { + clear: both; } + .large-up-1 > .column:last-child, .large-up-1 > .columns:last-child { + float: left; } + .large-up-2 > .column, .large-up-2 > .columns { + float: left; + width: 50%; } + .large-up-2 > .column:nth-of-type(1n), .large-up-2 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-2 > .column:nth-of-type(2n+1), .large-up-2 > .columns:nth-of-type(2n+1) { + clear: both; } + .large-up-2 > .column:last-child, .large-up-2 > .columns:last-child { + float: left; } + .large-up-3 > .column, .large-up-3 > .columns { + float: left; + width: 33.33333%; } + .large-up-3 > .column:nth-of-type(1n), .large-up-3 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-3 > .column:nth-of-type(3n+1), .large-up-3 > .columns:nth-of-type(3n+1) { + clear: both; } + .large-up-3 > .column:last-child, .large-up-3 > .columns:last-child { + float: left; } + .large-up-4 > .column, .large-up-4 > .columns { + float: left; + width: 25%; } + .large-up-4 > .column:nth-of-type(1n), .large-up-4 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-4 > .column:nth-of-type(4n+1), .large-up-4 > .columns:nth-of-type(4n+1) { + clear: both; } + .large-up-4 > .column:last-child, .large-up-4 > .columns:last-child { + float: left; } + .large-up-5 > .column, .large-up-5 > .columns { + float: left; + width: 20%; } + .large-up-5 > .column:nth-of-type(1n), .large-up-5 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-5 > .column:nth-of-type(5n+1), .large-up-5 > .columns:nth-of-type(5n+1) { + clear: both; } + .large-up-5 > .column:last-child, .large-up-5 > .columns:last-child { + float: left; } + .large-up-6 > .column, .large-up-6 > .columns { + float: left; + width: 16.66667%; } + .large-up-6 > .column:nth-of-type(1n), .large-up-6 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-6 > .column:nth-of-type(6n+1), .large-up-6 > .columns:nth-of-type(6n+1) { + clear: both; } + .large-up-6 > .column:last-child, .large-up-6 > .columns:last-child { + float: left; } + .large-up-7 > .column, .large-up-7 > .columns { + float: left; + width: 14.28571%; } + .large-up-7 > .column:nth-of-type(1n), .large-up-7 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-7 > .column:nth-of-type(7n+1), .large-up-7 > .columns:nth-of-type(7n+1) { + clear: both; } + .large-up-7 > .column:last-child, .large-up-7 > .columns:last-child { + float: left; } + .large-up-8 > .column, .large-up-8 > .columns { + float: left; + width: 12.5%; } + .large-up-8 > .column:nth-of-type(1n), .large-up-8 > .columns:nth-of-type(1n) { + clear: none; } + .large-up-8 > .column:nth-of-type(8n+1), .large-up-8 > .columns:nth-of-type(8n+1) { + clear: both; } + .large-up-8 > .column:last-child, .large-up-8 > .columns:last-child { + float: left; } + .large-collapse > .column, .large-collapse > .columns { + padding-right: 0; + padding-left: 0; } + .large-collapse .row { + margin-right: 0; + margin-left: 0; } + .expanded.row .large-collapse.row { + margin-right: 0; + margin-left: 0; } + .large-uncollapse > .column, .large-uncollapse > .columns { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } + .large-centered { + margin-right: auto; + margin-left: auto; } + .large-centered, .large-centered:last-child:not(:first-child) { + float: none; + clear: both; } + .large-uncentered, + .large-push-0, + .large-pull-0 { + position: static; + float: left; + margin-right: 0; + margin-left: 0; } } + +.column-block { + margin-bottom: 1.25rem; } + .column-block > :last-child { + margin-bottom: 0; } + @media print, screen and (min-width: 40em) { + .column-block { + margin-bottom: 1.875rem; } + .column-block > :last-child { + margin-bottom: 0; } } + +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +form, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; } + +p { + margin-bottom: 1rem; + font-size: inherit; + line-height: 1.6; + text-rendering: optimizeLegibility; } + +em, +i { + font-style: italic; + line-height: inherit; } + +strong, +b { + font-weight: bold; + line-height: inherit; } + +small { + font-size: 80%; + line-height: inherit; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-style: normal; + font-weight: normal; + color: inherit; + text-rendering: optimizeLegibility; } + h1 small, + h2 small, + h3 small, + h4 small, + h5 small, + h6 small { + line-height: 0; + color: #cacaca; } + +h1 { + font-size: 1.5rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h2 { + font-size: 1.25rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h3 { + font-size: 1.1875rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h4 { + font-size: 1.125rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h5 { + font-size: 1.0625rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h6 { + font-size: 1rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +@media print, screen and (min-width: 40em) { + h1 { + font-size: 3rem; } + h2 { + font-size: 2.5rem; } + h3 { + font-size: 1.9375rem; } + h4 { + font-size: 1.5625rem; } + h5 { + font-size: 1.25rem; } + h6 { + font-size: 1rem; } } + +a { + line-height: inherit; + color: #1779ba; + text-decoration: none; + cursor: pointer; } + a:hover, a:focus { + color: #1468a0; } + a img { + border: 0; } + +hr { + clear: both; + max-width: 75rem; + height: 0; + margin: 1.25rem auto; + border-top: 0; + border-right: 0; + border-bottom: 1px solid #cacaca; + border-left: 0; } + +ul, +ol, +dl { + margin-bottom: 1rem; + list-style-position: outside; + line-height: 1.6; } + +li { + font-size: inherit; } + +ul { + margin-left: 1.25rem; + list-style-type: disc; } + +ol { + margin-left: 1.25rem; } + +ul ul, ol ul, ul ol, ol ol { + margin-left: 1.25rem; + margin-bottom: 0; } + +dl { + margin-bottom: 1rem; } + dl dt { + margin-bottom: 0.3rem; + font-weight: bold; } + +blockquote { + margin: 0 0 1rem; + padding: 0.5625rem 1.25rem 0 1.1875rem; + border-left: 1px solid #cacaca; } + blockquote, blockquote p { + line-height: 1.6; + color: #8a8a8a; } + +cite { + display: block; + font-size: 0.8125rem; + color: #8a8a8a; } + cite:before { + content: "— "; } + +abbr { + border-bottom: 1px dotted #0a0a0a; + color: #0a0a0a; + cursor: help; } + +figure { + margin: 0; } + +code { + padding: 0.125rem 0.3125rem 0.0625rem; + border: 1px solid #cacaca; + background-color: #e6e6e6; + font-family: Consolas, "Liberation Mono", Courier, monospace; + font-weight: normal; + color: #0a0a0a; } + +kbd { + margin: 0; + padding: 0.125rem 0.25rem 0; + background-color: #e6e6e6; + font-family: Consolas, "Liberation Mono", Courier, monospace; + color: #0a0a0a; } + +.subheader { + margin-top: 0.2rem; + margin-bottom: 0.5rem; + font-weight: normal; + line-height: 1.4; + color: #8a8a8a; } + +.lead { + font-size: 125%; + line-height: 1.6; } + +.stat { + font-size: 2.5rem; + line-height: 1; } + p + .stat { + margin-top: -1rem; } + +.no-bullet { + margin-left: 0; + list-style: none; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +@media print, screen and (min-width: 40em) { + .medium-text-left { + text-align: left; } + .medium-text-right { + text-align: right; } + .medium-text-center { + text-align: center; } + .medium-text-justify { + text-align: justify; } } + +@media print, screen and (min-width: 64em) { + .large-text-left { + text-align: left; } + .large-text-right { + text-align: right; } + .large-text-center { + text-align: center; } + .large-text-justify { + text-align: justify; } } + +.show-for-print { + display: none !important; } + +@media print { + * { + background: transparent !important; + box-shadow: none !important; + color: black !important; + text-shadow: none !important; } + .show-for-print { + display: block !important; } + .hide-for-print { + display: none !important; } + table.show-for-print { + display: table !important; } + thead.show-for-print { + display: table-header-group !important; } + tbody.show-for-print { + display: table-row-group !important; } + tr.show-for-print { + display: table-row !important; } + td.show-for-print { + display: table-cell !important; } + th.show-for-print { + display: table-cell !important; } + a, + a:visited { + text-decoration: underline; } + a[href]:after { + content: " (" attr(href) ")"; } + .ir a:after, + a[href^='javascript:']:after, + a[href^='#']:after { + content: ''; } + abbr[title]:after { + content: " (" attr(title) ")"; } + pre, + blockquote { + border: 1px solid #8a8a8a; + page-break-inside: avoid; } + thead { + display: table-header-group; } + tr, + img { + page-break-inside: avoid; } + img { + max-width: 100% !important; } + @page { + margin: 0.5cm; } + p, + h2, + h3 { + orphans: 3; + widows: 3; } + h2, + h3 { + page-break-after: avoid; } } + +.button { + display: inline-block; + vertical-align: middle; + margin: 0 0 1rem 0; + padding: 0.85em 1em; + -webkit-appearance: none; + border: 1px solid transparent; + border-radius: 0; + transition: background-color 0.25s ease-out, color 0.25s ease-out; + font-size: 0.9rem; + line-height: 1; + text-align: center; + cursor: pointer; + background-color: #1779ba; + color: #fefefe; } + [data-whatinput='mouse'] .button { + outline: 0; } + .button:hover, .button:focus { + background-color: #14679e; + color: #fefefe; } + .button.tiny { + font-size: 0.6rem; } + .button.small { + font-size: 0.75rem; } + .button.large { + font-size: 1.25rem; } + .button.expanded { + display: block; + width: 100%; + margin-right: 0; + margin-left: 0; } + .button.primary { + background-color: #1779ba; + color: #fefefe; } + .button.primary:hover, .button.primary:focus { + background-color: #126195; + color: #fefefe; } + .button.secondary { + background-color: #767676; + color: #fefefe; } + .button.secondary:hover, .button.secondary:focus { + background-color: #5e5e5e; + color: #fefefe; } + .button.success { + background-color: #3adb76; + color: #0a0a0a; } + .button.success:hover, .button.success:focus { + background-color: #22bb5b; + color: #0a0a0a; } + .button.warning { + background-color: #ffae00; + color: #0a0a0a; } + .button.warning:hover, .button.warning:focus { + background-color: #cc8b00; + color: #0a0a0a; } + .button.alert { + background-color: #cc4b37; + color: #fefefe; } + .button.alert:hover, .button.alert:focus { + background-color: #a53b2a; + color: #fefefe; } + .button.hollow { + border: 1px solid #1779ba; + color: #1779ba; } + .button.hollow, .button.hollow:hover, .button.hollow:focus { + background-color: transparent; } + .button.hollow:hover, .button.hollow:focus { + border-color: #0c3d5d; + color: #0c3d5d; } + .button.hollow.primary { + border: 1px solid #1779ba; + color: #1779ba; } + .button.hollow.primary:hover, .button.hollow.primary:focus { + border-color: #0c3d5d; + color: #0c3d5d; } + .button.hollow.secondary { + border: 1px solid #767676; + color: #767676; } + .button.hollow.secondary:hover, .button.hollow.secondary:focus { + border-color: #3b3b3b; + color: #3b3b3b; } + .button.hollow.success { + border: 1px solid #3adb76; + color: #3adb76; } + .button.hollow.success:hover, .button.hollow.success:focus { + border-color: #157539; + color: #157539; } + .button.hollow.warning { + border: 1px solid #ffae00; + color: #ffae00; } + .button.hollow.warning:hover, .button.hollow.warning:focus { + border-color: #805700; + color: #805700; } + .button.hollow.alert { + border: 1px solid #cc4b37; + color: #cc4b37; } + .button.hollow.alert:hover, .button.hollow.alert:focus { + border-color: #67251a; + color: #67251a; } + .button.disabled, .button[disabled] { + opacity: 0.25; + cursor: not-allowed; } + .button.disabled, .button.disabled:hover, .button.disabled:focus, .button[disabled], .button[disabled]:hover, .button[disabled]:focus { + background-color: #1779ba; + color: #fefefe; } + .button.disabled.primary, .button[disabled].primary { + opacity: 0.25; + cursor: not-allowed; } + .button.disabled.primary, .button.disabled.primary:hover, .button.disabled.primary:focus, .button[disabled].primary, .button[disabled].primary:hover, .button[disabled].primary:focus { + background-color: #1779ba; + color: #fefefe; } + .button.disabled.secondary, .button[disabled].secondary { + opacity: 0.25; + cursor: not-allowed; } + .button.disabled.secondary, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary, .button[disabled].secondary:hover, .button[disabled].secondary:focus { + background-color: #767676; + color: #fefefe; } + .button.disabled.success, .button[disabled].success { + opacity: 0.25; + cursor: not-allowed; } + .button.disabled.success, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success, .button[disabled].success:hover, .button[disabled].success:focus { + background-color: #3adb76; + color: #0a0a0a; } + .button.disabled.warning, .button[disabled].warning { + opacity: 0.25; + cursor: not-allowed; } + .button.disabled.warning, .button.disabled.warning:hover, .button.disabled.warning:focus, .button[disabled].warning, .button[disabled].warning:hover, .button[disabled].warning:focus { + background-color: #ffae00; + color: #0a0a0a; } + .button.disabled.alert, .button[disabled].alert { + opacity: 0.25; + cursor: not-allowed; } + .button.disabled.alert, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert, .button[disabled].alert:hover, .button[disabled].alert:focus { + background-color: #cc4b37; + color: #fefefe; } + .button.dropdown::after { + display: block; + width: 0; + height: 0; + border: inset 0.4em; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #fefefe transparent transparent; + position: relative; + top: 0.4em; + display: inline-block; + float: right; + margin-left: 1em; } + .button.arrow-only::after { + top: -0.1em; + float: none; + margin-left: 0; } + +[type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], +textarea { + display: block; + box-sizing: border-box; + width: 100%; + height: 2.4375rem; + margin: 0 0 1rem; + padding: 0.5rem; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + font-family: inherit; + font-size: 1rem; + font-weight: normal; + color: #0a0a0a; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } + [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, + textarea:focus { + outline: none; + border: 1px solid #8a8a8a; + background-color: #fefefe; + box-shadow: 0 0 5px #cacaca; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; } + +textarea { + max-width: 100%; } + textarea[rows] { + height: auto; } + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #cacaca; } + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #cacaca; } + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #cacaca; } + +input::placeholder, +textarea::placeholder { + color: #cacaca; } + +input:disabled, input[readonly], +textarea:disabled, +textarea[readonly] { + background-color: #e6e6e6; + cursor: not-allowed; } + +[type='submit'], +[type='button'] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0; } + +input[type='search'] { + box-sizing: border-box; } + +[type='file'], +[type='checkbox'], +[type='radio'] { + margin: 0 0 1rem; } + +[type='checkbox'] + label, +[type='radio'] + label { + display: inline-block; + vertical-align: baseline; + margin-left: 0.5rem; + margin-right: 1rem; + margin-bottom: 0; } + [type='checkbox'] + label[for], + [type='radio'] + label[for] { + cursor: pointer; } + +label > [type='checkbox'], +label > [type='radio'] { + margin-right: 0.5rem; } + +[type='file'] { + width: 100%; } + +label { + display: block; + margin: 0; + font-size: 0.875rem; + font-weight: normal; + line-height: 1.8; + color: #0a0a0a; } + label.middle { + margin: 0 0 1rem; + padding: 0.5625rem 0; } + +.help-text { + margin-top: -0.5rem; + font-size: 0.8125rem; + font-style: italic; + color: #0a0a0a; } + +.input-group { + display: table; + width: 100%; + margin-bottom: 1rem; } + .input-group > :first-child { + border-radius: 0 0 0 0; } + .input-group > :last-child > * { + border-radius: 0 0 0 0; } + +.input-group-label, .input-group-field, .input-group-button, .input-group-button a, +.input-group-button input, +.input-group-button button, +.input-group-button label { + margin: 0; + white-space: nowrap; + display: table-cell; + vertical-align: middle; } + +.input-group-label { + padding: 0 1rem; + border: 1px solid #cacaca; + background: #e6e6e6; + color: #0a0a0a; + text-align: center; + white-space: nowrap; + width: 1%; + height: 100%; } + .input-group-label:first-child { + border-right: 0; } + .input-group-label:last-child { + border-left: 0; } + +.input-group-field { + border-radius: 0; + height: 2.5rem; } + +.input-group-button { + padding-top: 0; + padding-bottom: 0; + text-align: center; + width: 1%; + height: 100%; } + .input-group-button a, + .input-group-button input, + .input-group-button button, + .input-group-button label { + height: 2.5rem; + padding-top: 0; + padding-bottom: 0; + font-size: 1rem; } + +.input-group .input-group-button { + display: table-cell; } + +fieldset { + margin: 0; + padding: 0; + border: 0; } + +legend { + max-width: 100%; + margin-bottom: 0.5rem; } + +.fieldset { + margin: 1.125rem 0; + padding: 1.25rem; + border: 1px solid #cacaca; } + .fieldset legend { + margin: 0; + margin-left: -0.1875rem; + padding: 0 0.1875rem; + background: #fefefe; } + +select { + height: 2.4375rem; + margin: 0 0 1rem; + padding: 0.5rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + font-family: inherit; + font-size: 1rem; + line-height: normal; + color: #0a0a0a; + background-image: url("data:image/svg+xml;utf8,"); + background-origin: content-box; + background-position: right -1rem center; + background-repeat: no-repeat; + background-size: 9px 6px; + padding-right: 1.5rem; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; } + @media screen and (min-width: 0\0) { + select { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); } } + select:focus { + outline: none; + border: 1px solid #8a8a8a; + background-color: #fefefe; + box-shadow: 0 0 5px #cacaca; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; } + select:disabled { + background-color: #e6e6e6; + cursor: not-allowed; } + select::-ms-expand { + display: none; } + select[multiple] { + height: auto; + background-image: none; } + +.is-invalid-input:not(:focus) { + border-color: #cc4b37; + background-color: #f9ecea; } + .is-invalid-input:not(:focus)::-webkit-input-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus)::-moz-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus):-ms-input-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus)::placeholder { + color: #cc4b37; } + +.is-invalid-label { + color: #cc4b37; } + +.form-error { + display: none; + margin-top: -0.5rem; + margin-bottom: 1rem; + font-size: 0.75rem; + font-weight: bold; + color: #cc4b37; } + .form-error.is-visible { + display: block; } + +.accordion { + margin-left: 0; + background: #fefefe; + list-style-type: none; } + +.accordion-item:first-child > :first-child { + border-radius: 0 0 0 0; } + +.accordion-item:last-child > :last-child { + border-radius: 0 0 0 0; } + +.accordion-title { + position: relative; + display: block; + padding: 1.25rem 1rem; + border: 1px solid #e6e6e6; + border-bottom: 0; + font-size: 0.75rem; + line-height: 1; + color: #1779ba; } + :last-child:not(.is-active) > .accordion-title { + border-bottom: 1px solid #e6e6e6; + border-radius: 0 0 0 0; } + .accordion-title:hover, .accordion-title:focus { + background-color: #e6e6e6; } + .accordion-title::before { + position: absolute; + top: 50%; + right: 1rem; + margin-top: -0.5rem; + content: '+'; } + .is-active > .accordion-title::before { + content: '\2013'; } + +.accordion-content { + display: none; + padding: 1rem; + border: 1px solid #e6e6e6; + border-bottom: 0; + background-color: #fefefe; + color: #0a0a0a; } + :last-child > .accordion-content:last-child { + border-bottom: 1px solid #e6e6e6; } + +.is-accordion-submenu-parent > a { + position: relative; } + .is-accordion-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #1779ba transparent transparent; + position: absolute; + top: 50%; + margin-top: -3px; + right: 1rem; } + +.is-accordion-submenu-parent[aria-expanded='true'] > a::after { + -ms-transform: rotate(180deg); + transform: rotate(180deg); + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; } + +.badge { + display: inline-block; + min-width: 2.1em; + padding: 0.3em; + border-radius: 50%; + font-size: 0.6rem; + text-align: center; + background: #1779ba; + color: #fefefe; } + .badge.primary { + background: #1779ba; + color: #fefefe; } + .badge.secondary { + background: #767676; + color: #fefefe; } + .badge.success { + background: #3adb76; + color: #0a0a0a; } + .badge.warning { + background: #ffae00; + color: #0a0a0a; } + .badge.alert { + background: #cc4b37; + color: #fefefe; } + +.breadcrumbs { + margin: 0 0 1rem 0; + list-style: none; } + .breadcrumbs::before, .breadcrumbs::after { + display: table; + content: ' '; } + .breadcrumbs::after { + clear: both; } + .breadcrumbs li { + float: left; + font-size: 0.6875rem; + color: #0a0a0a; + cursor: default; + text-transform: uppercase; } + .breadcrumbs li:not(:last-child)::after { + position: relative; + top: 1px; + margin: 0 0.75rem; + opacity: 1; + content: "/"; + color: #cacaca; } + .breadcrumbs a { + color: #1779ba; } + .breadcrumbs a:hover { + text-decoration: underline; } + .breadcrumbs .disabled { + color: #cacaca; + cursor: not-allowed; } + +.button-group { + margin-bottom: 1rem; + font-size: 0; } + .button-group::before, .button-group::after { + display: table; + content: ' '; } + .button-group::after { + clear: both; } + .button-group .button { + margin: 0; + margin-right: 1px; + margin-bottom: 1px; + font-size: 0.9rem; } + .button-group .button:last-child { + margin-right: 0; } + .button-group.tiny .button { + font-size: 0.6rem; } + .button-group.small .button { + font-size: 0.75rem; } + .button-group.large .button { + font-size: 1.25rem; } + .button-group.expanded { + margin-right: -1px; } + .button-group.expanded::before, .button-group.expanded::after { + display: none; } + .button-group.expanded .button:first-child:last-child { + width: 100%; } + .button-group.expanded .button:first-child:nth-last-child(2), .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button { + display: inline-block; + width: calc(50% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(2):last-child, .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(3), .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button { + display: inline-block; + width: calc(33.33333% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(3):last-child, .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(4), .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button { + display: inline-block; + width: calc(25% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(4):last-child, .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(5), .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button { + display: inline-block; + width: calc(20% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(5):last-child, .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button:last-child { + margin-right: -6px; } + .button-group.expanded .button:first-child:nth-last-child(6), .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button { + display: inline-block; + width: calc(16.66667% - 1px); + margin-right: 1px; } + .button-group.expanded .button:first-child:nth-last-child(6):last-child, .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button:last-child { + margin-right: -6px; } + .button-group.primary .button { + background-color: #1779ba; + color: #fefefe; } + .button-group.primary .button:hover, .button-group.primary .button:focus { + background-color: #126195; + color: #fefefe; } + .button-group.secondary .button { + background-color: #767676; + color: #fefefe; } + .button-group.secondary .button:hover, .button-group.secondary .button:focus { + background-color: #5e5e5e; + color: #fefefe; } + .button-group.success .button { + background-color: #3adb76; + color: #0a0a0a; } + .button-group.success .button:hover, .button-group.success .button:focus { + background-color: #22bb5b; + color: #0a0a0a; } + .button-group.warning .button { + background-color: #ffae00; + color: #0a0a0a; } + .button-group.warning .button:hover, .button-group.warning .button:focus { + background-color: #cc8b00; + color: #0a0a0a; } + .button-group.alert .button { + background-color: #cc4b37; + color: #fefefe; } + .button-group.alert .button:hover, .button-group.alert .button:focus { + background-color: #a53b2a; + color: #fefefe; } + .button-group.stacked .button, .button-group.stacked-for-small .button, .button-group.stacked-for-medium .button { + width: 100%; } + .button-group.stacked .button:last-child, .button-group.stacked-for-small .button:last-child, .button-group.stacked-for-medium .button:last-child { + margin-bottom: 0; } + @media print, screen and (min-width: 40em) { + .button-group.stacked-for-small .button { + width: auto; + margin-bottom: 0; } } + @media print, screen and (min-width: 64em) { + .button-group.stacked-for-medium .button { + width: auto; + margin-bottom: 0; } } + @media screen and (max-width: 39.9375em) { + .button-group.stacked-for-small.expanded { + display: block; } + .button-group.stacked-for-small.expanded .button { + display: block; + margin-right: 0; } } + +.card { + margin-bottom: 1rem; + border: 1px solid #e6e6e6; + border-radius: 0; + background: #fefefe; + box-shadow: none; + overflow: hidden; + color: #0a0a0a; } + .card > :last-child { + margin-bottom: 0; } + +.card-divider { + padding: 1rem; + background: #e6e6e6; } + .card-divider > :last-child { + margin-bottom: 0; } + +.card-section { + padding: 1rem; } + .card-section > :last-child { + margin-bottom: 0; } + +.callout { + position: relative; + margin: 0 0 1rem 0; + padding: 1rem; + border: 1px solid rgba(10, 10, 10, 0.25); + border-radius: 0; + background-color: white; + color: #0a0a0a; } + .callout > :first-child { + margin-top: 0; } + .callout > :last-child { + margin-bottom: 0; } + .callout.primary { + background-color: #d7ecfa; + color: #0a0a0a; } + .callout.secondary { + background-color: #eaeaea; + color: #0a0a0a; } + .callout.success { + background-color: #e1faea; + color: #0a0a0a; } + .callout.warning { + background-color: #fff3d9; + color: #0a0a0a; } + .callout.alert { + background-color: #f7e4e1; + color: #0a0a0a; } + .callout.small { + padding-top: 0.5rem; + padding-right: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 0.5rem; } + .callout.large { + padding-top: 3rem; + padding-right: 3rem; + padding-bottom: 3rem; + padding-left: 3rem; } + +.close-button { + position: absolute; + color: #8a8a8a; + cursor: pointer; } + [data-whatinput='mouse'] .close-button { + outline: 0; } + .close-button:hover, .close-button:focus { + color: #0a0a0a; } + .close-button.small { + right: 0.66rem; + top: 0.33em; + font-size: 1.5em; + line-height: 1; } + .close-button, .close-button.medium { + right: 1rem; + top: 0.5rem; + font-size: 2em; + line-height: 1; } + +.menu { + margin: 0; + list-style-type: none; } + .menu > li { + display: table-cell; + vertical-align: middle; } + [data-whatinput='mouse'] .menu > li { + outline: 0; } + .menu > li > a { + display: block; + padding: 0.7rem 1rem; + line-height: 1; } + .menu input, + .menu select, + .menu a, + .menu button { + margin-bottom: 0; } + .menu > li > a img, + .menu > li > a i, + .menu > li > a svg { + vertical-align: middle; } + .menu > li > a img + span, + .menu > li > a i + span, + .menu > li > a svg + span { + vertical-align: middle; } + .menu > li > a img, + .menu > li > a i, + .menu > li > a svg { + margin-right: 0.25rem; + display: inline-block; } + .menu > li, .menu.horizontal > li { + display: table-cell; } + .menu.expanded { + display: table; + width: 100%; + table-layout: fixed; } + .menu.expanded > li:first-child:last-child { + width: 100%; } + .menu.vertical > li { + display: block; } + @media print, screen and (min-width: 40em) { + .menu.medium-horizontal > li { + display: table-cell; } + .menu.medium-expanded { + display: table; + width: 100%; + table-layout: fixed; } + .menu.medium-expanded > li:first-child:last-child { + width: 100%; } + .menu.medium-vertical > li { + display: block; } } + @media print, screen and (min-width: 64em) { + .menu.large-horizontal > li { + display: table-cell; } + .menu.large-expanded { + display: table; + width: 100%; + table-layout: fixed; } + .menu.large-expanded > li:first-child:last-child { + width: 100%; } + .menu.large-vertical > li { + display: block; } } + .menu.simple li { + display: inline-block; + vertical-align: top; + line-height: 1; } + .menu.simple a { + padding: 0; } + .menu.simple li { + margin-left: 0; + margin-right: 1rem; } + .menu.simple.align-right li { + margin-right: 0; + margin-left: 1rem; } + .menu.align-right::before, .menu.align-right::after { + display: table; + content: ' '; } + .menu.align-right::after { + clear: both; } + .menu.align-right > li { + float: right; } + .menu.icon-top > li > a { + text-align: center; } + .menu.icon-top > li > a img, + .menu.icon-top > li > a i, + .menu.icon-top > li > a svg { + display: block; + margin: 0 auto 0.25rem; } + .menu.icon-top.vertical a > span { + margin: auto; } + .menu.nested { + margin-left: 1rem; } + .menu .active > a { + background: #1779ba; + color: #fefefe; } + .menu.menu-bordered li { + border: 1px solid #e6e6e6; } + .menu.menu-bordered li:not(:first-child) { + border-top: 0; } + .menu.menu-hover li:hover { + background-color: #e6e6e6; } + +.menu-text { + padding-top: 0; + padding-bottom: 0; + padding: 0.7rem 1rem; + font-weight: bold; + line-height: 1; + color: inherit; } + +.menu-centered { + text-align: center; } + .menu-centered > .menu { + display: inline-block; + vertical-align: top; } + +.no-js [data-responsive-menu] ul { + display: none; } + +.menu-icon { + position: relative; + display: inline-block; + vertical-align: middle; + width: 20px; + height: 16px; + cursor: pointer; } + .menu-icon::after { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + height: 2px; + background: #fefefe; + box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe; + content: ''; } + .menu-icon:hover::after { + background: #cacaca; + box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; } + +.menu-icon.dark { + position: relative; + display: inline-block; + vertical-align: middle; + width: 20px; + height: 16px; + cursor: pointer; } + .menu-icon.dark::after { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + height: 2px; + background: #0a0a0a; + box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; + content: ''; } + .menu-icon.dark:hover::after { + background: #8a8a8a; + box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; } + +.is-drilldown { + position: relative; + overflow: hidden; } + .is-drilldown li { + display: block; } + .is-drilldown.animate-height { + transition: height 0.5s; } + +.is-drilldown-submenu { + position: absolute; + top: 0; + left: 100%; + z-index: -1; + width: 100%; + background: #fefefe; + transition: transform 0.15s linear; } + .is-drilldown-submenu.is-active { + z-index: 1; + display: block; + -ms-transform: translateX(-100%); + transform: translateX(-100%); } + .is-drilldown-submenu.is-closing { + -ms-transform: translateX(100%); + transform: translateX(100%); } + +.drilldown-submenu-cover-previous { + min-height: 100%; } + +.is-drilldown-submenu-parent > a { + position: relative; } + .is-drilldown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; + position: absolute; + top: 50%; + margin-top: -6px; + right: 1rem; } + +.js-drilldown-back > a::before { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; + border-left-width: 0; + display: inline-block; + vertical-align: middle; + margin-right: 0.75rem; + border-left-width: 0; } + +.dropdown-pane { + position: absolute; + z-index: 10; + display: block; + width: 300px; + padding: 1rem; + visibility: hidden; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + font-size: 1rem; } + .dropdown-pane.is-open { + visibility: visible; } + +.dropdown-pane.tiny { + width: 100px; } + +.dropdown-pane.small { + width: 200px; } + +.dropdown-pane.large { + width: 400px; } + +.dropdown.menu > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; } + +.dropdown.menu > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; } + +.dropdown.menu > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; } + +.dropdown.menu > li.is-dropdown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #1779ba transparent transparent; + right: 5px; + margin-top: -3px; } + +[data-whatinput='mouse'] .dropdown.menu a { + outline: 0; } + +.no-js .dropdown.menu ul { + display: none; } + +.dropdown.menu.vertical > li .is-dropdown-submenu { + top: 0; } + +.dropdown.menu.vertical > li.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; } + +.dropdown.menu.vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + +.dropdown.menu.vertical > li > a::after { + right: 14px; } + +.dropdown.menu.vertical > li.opens-left > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; } + +.dropdown.menu.vertical > li.opens-right > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; } + +@media print, screen and (min-width: 40em) { + .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; } + .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; } + .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; } + .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #1779ba transparent transparent; + right: 5px; + margin-top: -3px; } + .dropdown.menu.medium-vertical > li .is-dropdown-submenu { + top: 0; } + .dropdown.menu.medium-vertical > li.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; } + .dropdown.menu.medium-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + .dropdown.menu.medium-vertical > li > a::after { + right: 14px; } + .dropdown.menu.medium-vertical > li.opens-left > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; } + .dropdown.menu.medium-vertical > li.opens-right > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; } } + +@media print, screen and (min-width: 64em) { + .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; } + .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; } + .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; } + .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #1779ba transparent transparent; + right: 5px; + margin-top: -3px; } + .dropdown.menu.large-vertical > li .is-dropdown-submenu { + top: 0; } + .dropdown.menu.large-vertical > li.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; } + .dropdown.menu.large-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + .dropdown.menu.large-vertical > li > a::after { + right: 14px; } + .dropdown.menu.large-vertical > li.opens-left > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; } + .dropdown.menu.large-vertical > li.opens-right > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; } } + +.dropdown.menu.align-right .is-dropdown-submenu.first-sub { + top: 100%; + right: 0; + left: auto; } + +.is-dropdown-menu.vertical { + width: 100px; } + .is-dropdown-menu.vertical.align-right { + float: right; } + +.is-dropdown-submenu-parent { + position: relative; } + .is-dropdown-submenu-parent a::after { + position: absolute; + top: 50%; + right: 5px; + margin-top: -6px; } + .is-dropdown-submenu-parent.opens-inner > .is-dropdown-submenu { + top: 100%; + left: auto; } + .is-dropdown-submenu-parent.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; } + .is-dropdown-submenu-parent.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + +.is-dropdown-submenu { + position: absolute; + top: 0; + left: 100%; + z-index: 1; + display: none; + min-width: 200px; + border: 1px solid #cacaca; + background: #fefefe; } + .is-dropdown-submenu .is-dropdown-submenu-parent > a::after { + right: 14px; } + .is-dropdown-submenu .is-dropdown-submenu-parent.opens-left > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #1779ba transparent transparent; } + .is-dropdown-submenu .is-dropdown-submenu-parent.opens-right > a::after { + display: block; + width: 0; + height: 0; + border: inset 6px; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #1779ba; } + .is-dropdown-submenu .is-dropdown-submenu { + margin-top: -1px; } + .is-dropdown-submenu > li { + width: 100%; } + .is-dropdown-submenu.js-dropdown-active { + display: block; } + +.responsive-embed, +.flex-video { + position: relative; + height: 0; + margin-bottom: 1rem; + padding-bottom: 75%; + overflow: hidden; } + .responsive-embed iframe, + .responsive-embed object, + .responsive-embed embed, + .responsive-embed video, + .flex-video iframe, + .flex-video object, + .flex-video embed, + .flex-video video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; } + .responsive-embed.widescreen, + .flex-video.widescreen { + padding-bottom: 56.25%; } + +.label { + display: inline-block; + padding: 0.33333rem 0.5rem; + border-radius: 0; + font-size: 0.8rem; + line-height: 1; + white-space: nowrap; + cursor: default; + background: #1779ba; + color: #fefefe; } + .label.primary { + background: #1779ba; + color: #fefefe; } + .label.secondary { + background: #767676; + color: #fefefe; } + .label.success { + background: #3adb76; + color: #0a0a0a; } + .label.warning { + background: #ffae00; + color: #0a0a0a; } + .label.alert { + background: #cc4b37; + color: #fefefe; } + +.media-object { + display: block; + margin-bottom: 1rem; } + .media-object img { + max-width: none; } + @media screen and (max-width: 39.9375em) { + .media-object.stack-for-small .media-object-section { + padding: 0; + padding-bottom: 1rem; + display: block; } + .media-object.stack-for-small .media-object-section img { + width: 100%; } } + +.media-object-section { + display: table-cell; + vertical-align: top; } + .media-object-section:first-child { + padding-right: 1rem; } + .media-object-section:last-child:not(:nth-child(2)) { + padding-left: 1rem; } + .media-object-section > :last-child { + margin-bottom: 0; } + .media-object-section.middle { + vertical-align: middle; } + .media-object-section.bottom { + vertical-align: bottom; } + +.is-off-canvas-open { + overflow: hidden; } + +.js-off-canvas-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + transition: opacity 0.5s ease, visibility 0.5s ease; + background: rgba(254, 254, 254, 0.25); + opacity: 0; + visibility: hidden; + overflow: hidden; } + .js-off-canvas-overlay.is-visible { + opacity: 1; + visibility: visible; } + .js-off-canvas-overlay.is-closable { + cursor: pointer; } + .js-off-canvas-overlay.is-overlay-absolute { + position: absolute; } + .js-off-canvas-overlay.is-overlay-fixed { + position: fixed; } + +.off-canvas-wrapper { + position: relative; + overflow: hidden; } + +.off-canvas { + position: fixed; + z-index: 1; + transition: transform 0.5s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + background: #e6e6e6; } + [data-whatinput='mouse'] .off-canvas { + outline: 0; } + .off-canvas.is-transition-overlap { + z-index: 10; } + .off-canvas.is-transition-overlap.is-open { + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); } + .off-canvas.is-open { + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + +.off-canvas-absolute { + position: absolute; + z-index: 1; + transition: transform 0.5s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + background: #e6e6e6; } + [data-whatinput='mouse'] .off-canvas-absolute { + outline: 0; } + .off-canvas-absolute.is-transition-overlap { + z-index: 10; } + .off-canvas-absolute.is-transition-overlap.is-open { + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); } + .off-canvas-absolute.is-open { + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + +.position-left { + top: 0; + left: 0; + width: 250px; + height: 100%; + -ms-transform: translateX(-250px); + transform: translateX(-250px); + overflow-y: auto; } + .position-left.is-open ~ .off-canvas-content { + -ms-transform: translateX(250px); + transform: translateX(250px); } + .position-left.is-transition-push::after { + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 1px; + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + content: " "; } + .position-left.is-transition-overlap.is-open ~ .off-canvas-content { + -ms-transform: none; + transform: none; } + +.position-right { + top: 0; + right: 0; + width: 250px; + height: 100%; + -ms-transform: translateX(250px); + transform: translateX(250px); + overflow-y: auto; } + .position-right.is-open ~ .off-canvas-content { + -ms-transform: translateX(-250px); + transform: translateX(-250px); } + .position-right.is-transition-push::after { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 1px; + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + content: " "; } + .position-right.is-transition-overlap.is-open ~ .off-canvas-content { + -ms-transform: none; + transform: none; } + +.position-top { + top: 0; + left: 0; + width: 100%; + height: 250px; + -ms-transform: translateY(-250px); + transform: translateY(-250px); + overflow-x: auto; } + .position-top.is-open ~ .off-canvas-content { + -ms-transform: translateY(250px); + transform: translateY(250px); } + .position-top.is-transition-push::after { + position: absolute; + bottom: 0; + left: 0; + height: 1px; + width: 100%; + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + content: " "; } + .position-top.is-transition-overlap.is-open ~ .off-canvas-content { + -ms-transform: none; + transform: none; } + +.position-bottom { + bottom: 0; + left: 0; + width: 100%; + height: 250px; + -ms-transform: translateY(250px); + transform: translateY(250px); + overflow-x: auto; } + .position-bottom.is-open ~ .off-canvas-content { + -ms-transform: translateY(-250px); + transform: translateY(-250px); } + .position-bottom.is-transition-push::after { + position: absolute; + top: 0; + left: 0; + height: 1px; + width: 100%; + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + content: " "; } + .position-bottom.is-transition-overlap.is-open ~ .off-canvas-content { + -ms-transform: none; + transform: none; } + +.off-canvas-content { + transition: transform 0.5s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +@media print, screen and (min-width: 40em) { + .position-left.reveal-for-medium { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-left.reveal-for-medium ~ .off-canvas-content { + margin-left: 250px; } + .position-right.reveal-for-medium { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-right.reveal-for-medium ~ .off-canvas-content { + margin-right: 250px; } + .position-top.reveal-for-medium { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-top.reveal-for-medium ~ .off-canvas-content { + margin-top: 250px; } + .position-bottom.reveal-for-medium { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-bottom.reveal-for-medium ~ .off-canvas-content { + margin-bottom: 250px; } } + +@media print, screen and (min-width: 64em) { + .position-left.reveal-for-large { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-left.reveal-for-large ~ .off-canvas-content { + margin-left: 250px; } + .position-right.reveal-for-large { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-right.reveal-for-large ~ .off-canvas-content { + margin-right: 250px; } + .position-top.reveal-for-large { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-top.reveal-for-large ~ .off-canvas-content { + margin-top: 250px; } + .position-bottom.reveal-for-large { + -ms-transform: none; + transform: none; + z-index: 1; } + .position-bottom.reveal-for-large ~ .off-canvas-content { + margin-bottom: 250px; } } + +.orbit { + position: relative; } + +.orbit-container { + position: relative; + height: 0; + margin: 0; + list-style: none; + overflow: hidden; } + +.orbit-slide { + width: 100%; } + .orbit-slide.no-motionui.is-active { + top: 0; + left: 0; } + +.orbit-figure { + margin: 0; } + +.orbit-image { + width: 100%; + max-width: 100%; + margin: 0; } + +.orbit-caption { + position: absolute; + bottom: 0; + width: 100%; + margin-bottom: 0; + padding: 1rem; + background-color: rgba(10, 10, 10, 0.5); + color: #fefefe; } + +.orbit-previous, .orbit-next { + position: absolute; + top: 50%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); + z-index: 10; + padding: 1rem; + color: #fefefe; } + [data-whatinput='mouse'] .orbit-previous, [data-whatinput='mouse'] .orbit-next { + outline: 0; } + .orbit-previous:hover, .orbit-next:hover, .orbit-previous:active, .orbit-next:active, .orbit-previous:focus, .orbit-next:focus { + background-color: rgba(10, 10, 10, 0.5); } + +.orbit-previous { + left: 0; } + +.orbit-next { + left: auto; + right: 0; } + +.orbit-bullets { + position: relative; + margin-top: 0.8rem; + margin-bottom: 0.8rem; + text-align: center; } + [data-whatinput='mouse'] .orbit-bullets { + outline: 0; } + .orbit-bullets button { + width: 1.2rem; + height: 1.2rem; + margin: 0.1rem; + border-radius: 50%; + background-color: #cacaca; } + .orbit-bullets button:hover { + background-color: #8a8a8a; } + .orbit-bullets button.is-active { + background-color: #8a8a8a; } + +.pagination { + margin-left: 0; + margin-bottom: 1rem; } + .pagination::before, .pagination::after { + display: table; + content: ' '; } + .pagination::after { + clear: both; } + .pagination li { + margin-right: 0.0625rem; + border-radius: 0; + font-size: 0.875rem; + display: none; } + .pagination li:last-child, .pagination li:first-child { + display: inline-block; } + @media print, screen and (min-width: 40em) { + .pagination li { + display: inline-block; } } + .pagination a, + .pagination button { + display: block; + padding: 0.1875rem 0.625rem; + border-radius: 0; + color: #0a0a0a; } + .pagination a:hover, + .pagination button:hover { + background: #e6e6e6; } + .pagination .current { + padding: 0.1875rem 0.625rem; + background: #1779ba; + color: #fefefe; + cursor: default; } + .pagination .disabled { + padding: 0.1875rem 0.625rem; + color: #cacaca; + cursor: not-allowed; } + .pagination .disabled:hover { + background: transparent; } + .pagination .ellipsis::after { + padding: 0.1875rem 0.625rem; + content: '\2026'; + color: #0a0a0a; } + +.pagination-previous a::before, +.pagination-previous.disabled::before { + display: inline-block; + margin-right: 0.5rem; + content: '\00ab'; } + +.pagination-next a::after, +.pagination-next.disabled::after { + display: inline-block; + margin-left: 0.5rem; + content: '\00bb'; } + +.progress { + height: 1rem; + margin-bottom: 1rem; + border-radius: 0; + background-color: #cacaca; } + .progress.primary .progress-meter { + background-color: #1779ba; } + .progress.secondary .progress-meter { + background-color: #767676; } + .progress.success .progress-meter { + background-color: #3adb76; } + .progress.warning .progress-meter { + background-color: #ffae00; } + .progress.alert .progress-meter { + background-color: #cc4b37; } + +.progress-meter { + position: relative; + display: block; + width: 0%; + height: 100%; + background-color: #1779ba; } + +.progress-meter-text { + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + position: absolute; + margin: 0; + font-size: 0.75rem; + font-weight: bold; + color: #fefefe; + white-space: nowrap; } + +body.is-reveal-open { + overflow: hidden; } + +html.is-reveal-open, +html.is-reveal-open body { + min-height: 100%; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.reveal-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1005; + display: none; + background-color: rgba(10, 10, 10, 0.45); + overflow-y: scroll; } + +.reveal { + z-index: 1006; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + display: none; + padding: 1rem; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + position: relative; + top: 100px; + margin-right: auto; + margin-left: auto; + overflow-y: auto; } + [data-whatinput='mouse'] .reveal { + outline: 0; } + @media print, screen and (min-width: 40em) { + .reveal { + min-height: 0; } } + .reveal .column, .reveal .columns, + .reveal .columns { + min-width: 0; } + .reveal > :last-child { + margin-bottom: 0; } + @media print, screen and (min-width: 40em) { + .reveal { + width: 600px; + max-width: 75rem; } } + @media print, screen and (min-width: 40em) { + .reveal .reveal { + right: auto; + left: auto; + margin: 0 auto; } } + .reveal.collapse { + padding: 0; } + @media print, screen and (min-width: 40em) { + .reveal.tiny { + width: 30%; + max-width: 75rem; } } + @media print, screen and (min-width: 40em) { + .reveal.small { + width: 50%; + max-width: 75rem; } } + @media print, screen and (min-width: 40em) { + .reveal.large { + width: 90%; + max-width: 75rem; } } + .reveal.full { + top: 0; + left: 0; + width: 100%; + max-width: none; + height: 100%; + height: 100vh; + min-height: 100vh; + margin-left: 0; + border: 0; + border-radius: 0; } + @media screen and (max-width: 39.9375em) { + .reveal { + top: 0; + left: 0; + width: 100%; + max-width: none; + height: 100%; + height: 100vh; + min-height: 100vh; + margin-left: 0; + border: 0; + border-radius: 0; } } + .reveal.without-overlay { + position: fixed; } + +.slider { + position: relative; + height: 0.5rem; + margin-top: 1.25rem; + margin-bottom: 2.25rem; + background-color: #e6e6e6; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-touch-action: none; + touch-action: none; } + +.slider-fill { + position: absolute; + top: 0; + left: 0; + display: inline-block; + max-width: 100%; + height: 0.5rem; + background-color: #cacaca; + transition: all 0.2s ease-in-out; } + .slider-fill.is-dragging { + transition: all 0s linear; } + +.slider-handle { + position: absolute; + top: 50%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); + position: absolute; + left: 0; + z-index: 1; + display: inline-block; + width: 1.4rem; + height: 1.4rem; + border-radius: 0; + background-color: #1779ba; + transition: all 0.2s ease-in-out; + -ms-touch-action: manipulation; + touch-action: manipulation; } + [data-whatinput='mouse'] .slider-handle { + outline: 0; } + .slider-handle:hover { + background-color: #14679e; } + .slider-handle.is-dragging { + transition: all 0s linear; } + +.slider.disabled, +.slider[disabled] { + opacity: 0.25; + cursor: not-allowed; } + +.slider.vertical { + display: inline-block; + width: 0.5rem; + height: 12.5rem; + margin: 0 1.25rem; + -ms-transform: scale(1, -1); + transform: scale(1, -1); } + .slider.vertical .slider-fill { + top: 0; + width: 0.5rem; + max-height: 100%; } + .slider.vertical .slider-handle { + position: absolute; + top: 0; + left: 50%; + width: 1.4rem; + height: 1.4rem; + -ms-transform: translateX(-50%); + transform: translateX(-50%); } + +.sticky-container { + position: relative; } + +.sticky { + position: relative; + z-index: 0; + transform: translate3d(0, 0, 0); } + +.sticky.is-stuck { + position: fixed; + z-index: 5; } + .sticky.is-stuck.is-at-top { + top: 0; } + .sticky.is-stuck.is-at-bottom { + bottom: 0; } + +.sticky.is-anchored { + position: relative; + right: auto; + left: auto; } + .sticky.is-anchored.is-at-bottom { + bottom: 0; } + +.switch { + height: 2rem; + position: relative; + margin-bottom: 1rem; + outline: 0; + font-size: 0.875rem; + font-weight: bold; + color: #fefefe; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.switch-input { + position: absolute; + margin-bottom: 0; + opacity: 0; } + +.switch-paddle { + position: relative; + display: block; + width: 4rem; + height: 2rem; + border-radius: 0; + background: #cacaca; + transition: all 0.25s ease-out; + font-weight: inherit; + color: inherit; + cursor: pointer; } + input + .switch-paddle { + margin: 0; } + .switch-paddle::after { + position: absolute; + top: 0.25rem; + left: 0.25rem; + display: block; + width: 1.5rem; + height: 1.5rem; + transform: translate3d(0, 0, 0); + border-radius: 0; + background: #fefefe; + transition: all 0.25s ease-out; + content: ''; } + input:checked ~ .switch-paddle { + background: #1779ba; } + input:checked ~ .switch-paddle::after { + left: 2.25rem; } + [data-whatinput='mouse'] input:focus ~ .switch-paddle { + outline: 0; } + +.switch-active, .switch-inactive { + position: absolute; + top: 50%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + +.switch-active { + left: 8%; + display: none; } + input:checked + label > .switch-active { + display: block; } + +.switch-inactive { + right: 15%; } + input:checked + label > .switch-inactive { + display: none; } + +.switch.tiny { + height: 1.5rem; } + .switch.tiny .switch-paddle { + width: 3rem; + height: 1.5rem; + font-size: 0.625rem; } + .switch.tiny .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 1rem; + height: 1rem; } + .switch.tiny input:checked ~ .switch-paddle::after { + left: 1.75rem; } + +.switch.small { + height: 1.75rem; } + .switch.small .switch-paddle { + width: 3.5rem; + height: 1.75rem; + font-size: 0.75rem; } + .switch.small .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 1.25rem; + height: 1.25rem; } + .switch.small input:checked ~ .switch-paddle::after { + left: 2rem; } + +.switch.large { + height: 2.5rem; } + .switch.large .switch-paddle { + width: 5rem; + height: 2.5rem; + font-size: 1rem; } + .switch.large .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 2rem; + height: 2rem; } + .switch.large input:checked ~ .switch-paddle::after { + left: 2.75rem; } + +table { + width: 100%; + margin-bottom: 1rem; + border-radius: 0; } + table thead, + table tbody, + table tfoot { + border: 1px solid #f1f1f1; + background-color: #fefefe; } + table caption { + padding: 0.5rem 0.625rem 0.625rem; + font-weight: bold; } + table thead { + background: #f8f8f8; + color: #0a0a0a; } + table tfoot { + background: #f1f1f1; + color: #0a0a0a; } + table thead tr, + table tfoot tr { + background: transparent; } + table thead th, + table thead td, + table tfoot th, + table tfoot td { + padding: 0.5rem 0.625rem 0.625rem; + font-weight: bold; + text-align: left; } + table tbody th, + table tbody td { + padding: 0.5rem 0.625rem 0.625rem; } + table tbody tr:nth-child(even) { + border-bottom: 0; + background-color: #f1f1f1; } + table.unstriped tbody { + background-color: #fefefe; } + table.unstriped tbody tr { + border-bottom: 0; + border-bottom: 1px solid #f1f1f1; + background-color: #fefefe; } + +@media screen and (max-width: 63.9375em) { + table.stack thead { + display: none; } + table.stack tfoot { + display: none; } + table.stack tr, + table.stack th, + table.stack td { + display: block; } + table.stack td { + border-top: 0; } } + +table.scroll { + display: block; + width: 100%; + overflow-x: auto; } + +table.hover thead tr:hover { + background-color: #f3f3f3; } + +table.hover tfoot tr:hover { + background-color: #ececec; } + +table.hover tbody tr:hover { + background-color: #f9f9f9; } + +table.hover:not(.unstriped) tr:nth-of-type(even):hover { + background-color: #ececec; } + +.table-scroll { + overflow-x: auto; } + .table-scroll table { + width: auto; } + +.tabs { + margin: 0; + border: 1px solid #e6e6e6; + background: #fefefe; + list-style-type: none; } + .tabs::before, .tabs::after { + display: table; + content: ' '; } + .tabs::after { + clear: both; } + +.tabs.vertical > li { + display: block; + float: none; + width: auto; } + +.tabs.simple > li > a { + padding: 0; } + .tabs.simple > li > a:hover { + background: transparent; } + +.tabs.primary { + background: #1779ba; } + .tabs.primary > li > a { + color: #fefefe; } + .tabs.primary > li > a:hover, .tabs.primary > li > a:focus { + background: #1673b1; } + +.tabs-title { + float: left; } + .tabs-title > a { + display: block; + padding: 1.25rem 1.5rem; + font-size: 0.75rem; + line-height: 1; + color: #1779ba; } + .tabs-title > a:hover { + background: #fefefe; + color: #1468a0; } + .tabs-title > a:focus, .tabs-title > a[aria-selected='true'] { + background: #e6e6e6; + color: #1779ba; } + +.tabs-content { + border: 1px solid #e6e6e6; + border-top: 0; + background: #fefefe; + color: #0a0a0a; + transition: all 0.5s ease; } + +.tabs-content.vertical { + border: 1px solid #e6e6e6; + border-left: 0; } + +.tabs-panel { + display: none; + padding: 1rem; } + .tabs-panel[aria-hidden="false"] { + display: block; } + +.thumbnail { + display: inline-block; + max-width: 100%; + margin-bottom: 1rem; + border: solid 4px #fefefe; + border-radius: 0; + box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); + line-height: 0; } + +a.thumbnail { + transition: box-shadow 200ms ease-out; } + a.thumbnail:hover, a.thumbnail:focus { + box-shadow: 0 0 6px 1px rgba(23, 121, 186, 0.5); } + a.thumbnail image { + box-shadow: none; } + +.title-bar { + padding: 0.5rem; + background: #0a0a0a; + color: #fefefe; } + .title-bar::before, .title-bar::after { + display: table; + content: ' '; } + .title-bar::after { + clear: both; } + .title-bar .menu-icon { + margin-left: 0.25rem; + margin-right: 0.25rem; } + +.title-bar-left { + float: left; } + +.title-bar-right { + float: right; + text-align: right; } + +.title-bar-title { + display: inline-block; + vertical-align: middle; + font-weight: bold; } + +.has-tip { + position: relative; + display: inline-block; + border-bottom: dotted 1px #8a8a8a; + font-weight: bold; + cursor: help; } + +.tooltip { + position: absolute; + top: calc(100% + 0.6495rem); + z-index: 1200; + max-width: 10rem; + padding: 0.75rem; + border-radius: 0; + background-color: #0a0a0a; + font-size: 80%; + color: #fefefe; } + .tooltip::before { + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + content: ''; + border-top-width: 0; + border-bottom-style: solid; + border-color: transparent transparent #0a0a0a; + position: absolute; + bottom: 100%; + left: 50%; + -ms-transform: translateX(-50%); + transform: translateX(-50%); } + .tooltip.top::before { + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + content: ''; + border-bottom-width: 0; + border-top-style: solid; + border-color: #0a0a0a transparent transparent; + top: 100%; + bottom: auto; } + .tooltip.left::before { + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + content: ''; + border-right-width: 0; + border-left-style: solid; + border-color: transparent transparent transparent #0a0a0a; + top: 50%; + bottom: auto; + left: 100%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + .tooltip.right::before { + display: block; + width: 0; + height: 0; + border: inset 0.75rem; + content: ''; + border-left-width: 0; + border-right-style: solid; + border-color: transparent #0a0a0a transparent transparent; + top: 50%; + right: 100%; + bottom: auto; + left: auto; + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + +.top-bar { + padding: 0.5rem; } + .top-bar::before, .top-bar::after { + display: table; + content: ' '; } + .top-bar::after { + clear: both; } + .top-bar, + .top-bar ul { + background-color: #e6e6e6; } + .top-bar input { + max-width: 200px; + margin-right: 1rem; } + .top-bar .input-group-field { + width: 100%; + margin-right: 0; } + .top-bar input.button { + width: auto; } + .top-bar .top-bar-left, + .top-bar .top-bar-right { + width: 100%; } + @media print, screen and (min-width: 40em) { + .top-bar .top-bar-left, + .top-bar .top-bar-right { + width: auto; } } + @media screen and (max-width: 63.9375em) { + .top-bar.stacked-for-medium .top-bar-left, + .top-bar.stacked-for-medium .top-bar-right { + width: 100%; } } + @media screen and (max-width: 74.9375em) { + .top-bar.stacked-for-large .top-bar-left, + .top-bar.stacked-for-large .top-bar-right { + width: 100%; } } + +.top-bar-title { + display: inline-block; + float: left; + padding: 0.5rem 1rem 0.5rem 0; } + .top-bar-title .menu-icon { + bottom: 2px; } + +.top-bar-left { + float: left; } + +.top-bar-right { + float: right; } + +.hide { + display: none !important; } + +.invisible { + visibility: hidden; } + +@media screen and (max-width: 39.9375em) { + .hide-for-small-only { + display: none !important; } } + +@media screen and (max-width: 0em), screen and (min-width: 40em) { + .show-for-small-only { + display: none !important; } } + +@media print, screen and (min-width: 40em) { + .hide-for-medium { + display: none !important; } } + +@media screen and (max-width: 39.9375em) { + .show-for-medium { + display: none !important; } } + +@media screen and (min-width: 40em) and (max-width: 63.9375em) { + .hide-for-medium-only { + display: none !important; } } + +@media screen and (max-width: 39.9375em), screen and (min-width: 64em) { + .show-for-medium-only { + display: none !important; } } + +@media print, screen and (min-width: 64em) { + .hide-for-large { + display: none !important; } } + +@media screen and (max-width: 63.9375em) { + .show-for-large { + display: none !important; } } + +@media screen and (min-width: 64em) and (max-width: 74.9375em) { + .hide-for-large-only { + display: none !important; } } + +@media screen and (max-width: 63.9375em), screen and (min-width: 75em) { + .show-for-large-only { + display: none !important; } } + +.show-for-sr, +.show-on-focus { + position: absolute !important; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); } + +.show-on-focus:active, .show-on-focus:focus { + position: static !important; + width: auto; + height: auto; + overflow: visible; + clip: auto; } + +.show-for-landscape, +.hide-for-portrait { + display: block !important; } + @media screen and (orientation: landscape) { + .show-for-landscape, + .hide-for-portrait { + display: block !important; } } + @media screen and (orientation: portrait) { + .show-for-landscape, + .hide-for-portrait { + display: none !important; } } + +.hide-for-landscape, +.show-for-portrait { + display: none !important; } + @media screen and (orientation: landscape) { + .hide-for-landscape, + .show-for-portrait { + display: none !important; } } + @media screen and (orientation: portrait) { + .hide-for-landscape, + .show-for-portrait { + display: block !important; } } + +.float-left { + float: left !important; } + +.float-right { + float: right !important; } + +.float-center { + display: block; + margin-right: auto; + margin-left: auto; } + +.clearfix::before, .clearfix::after { + display: table; + content: ' '; } + +.clearfix::after { + clear: both; } + +.slide-in-down.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateY(-100%); + transform: translateY(-100%); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-down.mui-enter.mui-enter-active { + -ms-transform: translateY(0); + transform: translateY(0); } + +.slide-in-left.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateX(-100%); + transform: translateX(-100%); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-left.mui-enter.mui-enter-active { + -ms-transform: translateX(0); + transform: translateX(0); } + +.slide-in-up.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateY(100%); + transform: translateY(100%); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-up.mui-enter.mui-enter-active { + -ms-transform: translateY(0); + transform: translateY(0); } + +.slide-in-right.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateX(100%); + transform: translateX(100%); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-in-right.mui-enter.mui-enter-active { + -ms-transform: translateX(0); + transform: translateX(0); } + +.slide-out-down.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateY(0); + transform: translateY(0); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-down.mui-leave.mui-leave-active { + -ms-transform: translateY(100%); + transform: translateY(100%); } + +.slide-out-right.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateX(0); + transform: translateX(0); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-right.mui-leave.mui-leave-active { + -ms-transform: translateX(100%); + transform: translateX(100%); } + +.slide-out-up.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateY(0); + transform: translateY(0); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-up.mui-leave.mui-leave-active { + -ms-transform: translateY(-100%); + transform: translateY(-100%); } + +.slide-out-left.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: translateX(0); + transform: translateX(0); + transition-property: transform, opacity; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.slide-out-left.mui-leave.mui-leave-active { + -ms-transform: translateX(-100%); + transform: translateX(-100%); } + +.fade-in.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + opacity: 0; + transition-property: opacity; } + +.fade-in.mui-enter.mui-enter-active { + opacity: 1; } + +.fade-out.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + opacity: 1; + transition-property: opacity; } + +.fade-out.mui-leave.mui-leave-active { + opacity: 0; } + +.hinge-in-from-top.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateX(-90deg); + -ms-transform-origin: top; + transform-origin: top; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-top.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-right.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateY(-90deg); + -ms-transform-origin: right; + transform-origin: right; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-right.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-bottom.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateX(90deg); + -ms-transform-origin: bottom; + transform-origin: bottom; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-bottom.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-left.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateY(90deg); + -ms-transform-origin: left; + transform-origin: left; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-left.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-middle-x.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateX(-90deg); + -ms-transform-origin: center; + transform-origin: center; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-middle-x.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-in-from-middle-y.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotateY(-90deg); + -ms-transform-origin: center; + transform-origin: center; + transition-property: transform, opacity; + opacity: 0; } + +.hinge-in-from-middle-y.mui-enter.mui-enter-active { + transform: perspective(2000px) rotate(0deg); + opacity: 1; } + +.hinge-out-from-top.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: top; + transform-origin: top; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-top.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateX(-90deg); + opacity: 0; } + +.hinge-out-from-right.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: right; + transform-origin: right; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-right.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateY(-90deg); + opacity: 0; } + +.hinge-out-from-bottom.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: bottom; + transform-origin: bottom; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-bottom.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateX(90deg); + opacity: 0; } + +.hinge-out-from-left.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: left; + transform-origin: left; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-left.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateY(90deg); + opacity: 0; } + +.hinge-out-from-middle-x.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: center; + transform-origin: center; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-middle-x.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateX(-90deg); + opacity: 0; } + +.hinge-out-from-middle-y.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + transform: perspective(2000px) rotate(0deg); + -ms-transform-origin: center; + transform-origin: center; + transition-property: transform, opacity; + opacity: 1; } + +.hinge-out-from-middle-y.mui-leave.mui-leave-active { + transform: perspective(2000px) rotateY(-90deg); + opacity: 0; } + +.scale-in-up.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: scale(0.5); + transform: scale(0.5); + transition-property: transform, opacity; + opacity: 0; } + +.scale-in-up.mui-enter.mui-enter-active { + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; } + +.scale-in-down.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: scale(1.5); + transform: scale(1.5); + transition-property: transform, opacity; + opacity: 0; } + +.scale-in-down.mui-enter.mui-enter-active { + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; } + +.scale-out-up.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: scale(1); + transform: scale(1); + transition-property: transform, opacity; + opacity: 1; } + +.scale-out-up.mui-leave.mui-leave-active { + -ms-transform: scale(1.5); + transform: scale(1.5); + opacity: 0; } + +.scale-out-down.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: scale(1); + transform: scale(1); + transition-property: transform, opacity; + opacity: 1; } + +.scale-out-down.mui-leave.mui-leave-active { + -ms-transform: scale(0.5); + transform: scale(0.5); + opacity: 0; } + +.spin-in.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: rotate(-0.75turn); + transform: rotate(-0.75turn); + transition-property: transform, opacity; + opacity: 0; } + +.spin-in.mui-enter.mui-enter-active { + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; } + +.spin-out.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: rotate(0); + transform: rotate(0); + transition-property: transform, opacity; + opacity: 1; } + +.spin-out.mui-leave.mui-leave-active { + -ms-transform: rotate(0.75turn); + transform: rotate(0.75turn); + opacity: 0; } + +.spin-in-ccw.mui-enter { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: rotate(0.75turn); + transform: rotate(0.75turn); + transition-property: transform, opacity; + opacity: 0; } + +.spin-in-ccw.mui-enter.mui-enter-active { + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; } + +.spin-out-ccw.mui-leave { + transition-duration: 500ms; + transition-timing-function: linear; + -ms-transform: rotate(0); + transform: rotate(0); + transition-property: transform, opacity; + opacity: 1; } + +.spin-out-ccw.mui-leave.mui-leave-active { + -ms-transform: rotate(-0.75turn); + transform: rotate(-0.75turn); + opacity: 0; } + +.slow { + transition-duration: 750ms !important; } + +.fast { + transition-duration: 250ms !important; } + +.linear { + transition-timing-function: linear !important; } + +.ease { + transition-timing-function: ease !important; } + +.ease-in { + transition-timing-function: ease-in !important; } + +.ease-out { + transition-timing-function: ease-out !important; } + +.ease-in-out { + transition-timing-function: ease-in-out !important; } + +.bounce-in { + transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } + +.bounce-out { + transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } + +.bounce-in-out { + transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } + +.short-delay { + transition-delay: 300ms !important; } + +.long-delay { + transition-delay: 700ms !important; } + +.shake { + animation-name: shake-7; } + +@keyframes shake-7 { + 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% { + transform: translateX(7%); } + 5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% { + transform: translateX(-7%); } } + +.spin-cw { + animation-name: spin-cw-1turn; } + +@keyframes spin-cw-1turn { + 0% { + transform: rotate(-1turn); } + 100% { + transform: rotate(0); } } + +.spin-ccw { + animation-name: spin-cw-1turn; } + +@keyframes spin-cw-1turn { + 0% { + transform: rotate(0); } + 100% { + transform: rotate(1turn); } } + +.wiggle { + animation-name: wiggle-7deg; } + +@keyframes wiggle-7deg { + 40%, 50%, 60% { + transform: rotate(7deg); } + 35%, 45%, 55%, 65% { + transform: rotate(-7deg); } + 0%, 30%, 70%, 100% { + transform: rotate(0); } } + +.shake, +.spin-cw, +.spin-ccw, +.wiggle { + animation-duration: 500ms; } + +.infinite { + animation-iteration-count: infinite; } + +.slow { + animation-duration: 750ms !important; } + +.fast { + animation-duration: 250ms !important; } + +.linear { + animation-timing-function: linear !important; } + +.ease { + animation-timing-function: ease !important; } + +.ease-in { + animation-timing-function: ease-in !important; } + +.ease-out { + animation-timing-function: ease-out !important; } + +.ease-in-out { + animation-timing-function: ease-in-out !important; } + +.bounce-in { + animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } + +.bounce-out { + animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } + +.bounce-in-out { + animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } + +.short-delay { + animation-delay: 300ms !important; } + +.long-delay { + animation-delay: 700ms !important; } diff --git a/pkgs/csslib/test/examples/materialize.css b/pkgs/csslib/test/examples/materialize.css new file mode 100644 index 000000000..77ff7497d --- /dev/null +++ b/pkgs/csslib/test/examples/materialize.css @@ -0,0 +1,8952 @@ +/*! + * Materialize v0.98.2 (http://materializecss.com) + * Copyright 2014-2015 Materialize + * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) + */ +.materialize-red { + background-color: #e51c23 !important; +} + +.materialize-red-text { + color: #e51c23 !important; +} + +.materialize-red.lighten-5 { + background-color: #fdeaeb !important; +} + +.materialize-red-text.text-lighten-5 { + color: #fdeaeb !important; +} + +.materialize-red.lighten-4 { + background-color: #f8c1c3 !important; +} + +.materialize-red-text.text-lighten-4 { + color: #f8c1c3 !important; +} + +.materialize-red.lighten-3 { + background-color: #f3989b !important; +} + +.materialize-red-text.text-lighten-3 { + color: #f3989b !important; +} + +.materialize-red.lighten-2 { + background-color: #ee6e73 !important; +} + +.materialize-red-text.text-lighten-2 { + color: #ee6e73 !important; +} + +.materialize-red.lighten-1 { + background-color: #ea454b !important; +} + +.materialize-red-text.text-lighten-1 { + color: #ea454b !important; +} + +.materialize-red.darken-1 { + background-color: #d0181e !important; +} + +.materialize-red-text.text-darken-1 { + color: #d0181e !important; +} + +.materialize-red.darken-2 { + background-color: #b9151b !important; +} + +.materialize-red-text.text-darken-2 { + color: #b9151b !important; +} + +.materialize-red.darken-3 { + background-color: #a21318 !important; +} + +.materialize-red-text.text-darken-3 { + color: #a21318 !important; +} + +.materialize-red.darken-4 { + background-color: #8b1014 !important; +} + +.materialize-red-text.text-darken-4 { + color: #8b1014 !important; +} + +.red { + background-color: #F44336 !important; +} + +.red-text { + color: #F44336 !important; +} + +.red.lighten-5 { + background-color: #FFEBEE !important; +} + +.red-text.text-lighten-5 { + color: #FFEBEE !important; +} + +.red.lighten-4 { + background-color: #FFCDD2 !important; +} + +.red-text.text-lighten-4 { + color: #FFCDD2 !important; +} + +.red.lighten-3 { + background-color: #EF9A9A !important; +} + +.red-text.text-lighten-3 { + color: #EF9A9A !important; +} + +.red.lighten-2 { + background-color: #E57373 !important; +} + +.red-text.text-lighten-2 { + color: #E57373 !important; +} + +.red.lighten-1 { + background-color: #EF5350 !important; +} + +.red-text.text-lighten-1 { + color: #EF5350 !important; +} + +.red.darken-1 { + background-color: #E53935 !important; +} + +.red-text.text-darken-1 { + color: #E53935 !important; +} + +.red.darken-2 { + background-color: #D32F2F !important; +} + +.red-text.text-darken-2 { + color: #D32F2F !important; +} + +.red.darken-3 { + background-color: #C62828 !important; +} + +.red-text.text-darken-3 { + color: #C62828 !important; +} + +.red.darken-4 { + background-color: #B71C1C !important; +} + +.red-text.text-darken-4 { + color: #B71C1C !important; +} + +.red.accent-1 { + background-color: #FF8A80 !important; +} + +.red-text.text-accent-1 { + color: #FF8A80 !important; +} + +.red.accent-2 { + background-color: #FF5252 !important; +} + +.red-text.text-accent-2 { + color: #FF5252 !important; +} + +.red.accent-3 { + background-color: #FF1744 !important; +} + +.red-text.text-accent-3 { + color: #FF1744 !important; +} + +.red.accent-4 { + background-color: #D50000 !important; +} + +.red-text.text-accent-4 { + color: #D50000 !important; +} + +.pink { + background-color: #e91e63 !important; +} + +.pink-text { + color: #e91e63 !important; +} + +.pink.lighten-5 { + background-color: #fce4ec !important; +} + +.pink-text.text-lighten-5 { + color: #fce4ec !important; +} + +.pink.lighten-4 { + background-color: #f8bbd0 !important; +} + +.pink-text.text-lighten-4 { + color: #f8bbd0 !important; +} + +.pink.lighten-3 { + background-color: #f48fb1 !important; +} + +.pink-text.text-lighten-3 { + color: #f48fb1 !important; +} + +.pink.lighten-2 { + background-color: #f06292 !important; +} + +.pink-text.text-lighten-2 { + color: #f06292 !important; +} + +.pink.lighten-1 { + background-color: #ec407a !important; +} + +.pink-text.text-lighten-1 { + color: #ec407a !important; +} + +.pink.darken-1 { + background-color: #d81b60 !important; +} + +.pink-text.text-darken-1 { + color: #d81b60 !important; +} + +.pink.darken-2 { + background-color: #c2185b !important; +} + +.pink-text.text-darken-2 { + color: #c2185b !important; +} + +.pink.darken-3 { + background-color: #ad1457 !important; +} + +.pink-text.text-darken-3 { + color: #ad1457 !important; +} + +.pink.darken-4 { + background-color: #880e4f !important; +} + +.pink-text.text-darken-4 { + color: #880e4f !important; +} + +.pink.accent-1 { + background-color: #ff80ab !important; +} + +.pink-text.text-accent-1 { + color: #ff80ab !important; +} + +.pink.accent-2 { + background-color: #ff4081 !important; +} + +.pink-text.text-accent-2 { + color: #ff4081 !important; +} + +.pink.accent-3 { + background-color: #f50057 !important; +} + +.pink-text.text-accent-3 { + color: #f50057 !important; +} + +.pink.accent-4 { + background-color: #c51162 !important; +} + +.pink-text.text-accent-4 { + color: #c51162 !important; +} + +.purple { + background-color: #9c27b0 !important; +} + +.purple-text { + color: #9c27b0 !important; +} + +.purple.lighten-5 { + background-color: #f3e5f5 !important; +} + +.purple-text.text-lighten-5 { + color: #f3e5f5 !important; +} + +.purple.lighten-4 { + background-color: #e1bee7 !important; +} + +.purple-text.text-lighten-4 { + color: #e1bee7 !important; +} + +.purple.lighten-3 { + background-color: #ce93d8 !important; +} + +.purple-text.text-lighten-3 { + color: #ce93d8 !important; +} + +.purple.lighten-2 { + background-color: #ba68c8 !important; +} + +.purple-text.text-lighten-2 { + color: #ba68c8 !important; +} + +.purple.lighten-1 { + background-color: #ab47bc !important; +} + +.purple-text.text-lighten-1 { + color: #ab47bc !important; +} + +.purple.darken-1 { + background-color: #8e24aa !important; +} + +.purple-text.text-darken-1 { + color: #8e24aa !important; +} + +.purple.darken-2 { + background-color: #7b1fa2 !important; +} + +.purple-text.text-darken-2 { + color: #7b1fa2 !important; +} + +.purple.darken-3 { + background-color: #6a1b9a !important; +} + +.purple-text.text-darken-3 { + color: #6a1b9a !important; +} + +.purple.darken-4 { + background-color: #4a148c !important; +} + +.purple-text.text-darken-4 { + color: #4a148c !important; +} + +.purple.accent-1 { + background-color: #ea80fc !important; +} + +.purple-text.text-accent-1 { + color: #ea80fc !important; +} + +.purple.accent-2 { + background-color: #e040fb !important; +} + +.purple-text.text-accent-2 { + color: #e040fb !important; +} + +.purple.accent-3 { + background-color: #d500f9 !important; +} + +.purple-text.text-accent-3 { + color: #d500f9 !important; +} + +.purple.accent-4 { + background-color: #aa00ff !important; +} + +.purple-text.text-accent-4 { + color: #aa00ff !important; +} + +.deep-purple { + background-color: #673ab7 !important; +} + +.deep-purple-text { + color: #673ab7 !important; +} + +.deep-purple.lighten-5 { + background-color: #ede7f6 !important; +} + +.deep-purple-text.text-lighten-5 { + color: #ede7f6 !important; +} + +.deep-purple.lighten-4 { + background-color: #d1c4e9 !important; +} + +.deep-purple-text.text-lighten-4 { + color: #d1c4e9 !important; +} + +.deep-purple.lighten-3 { + background-color: #b39ddb !important; +} + +.deep-purple-text.text-lighten-3 { + color: #b39ddb !important; +} + +.deep-purple.lighten-2 { + background-color: #9575cd !important; +} + +.deep-purple-text.text-lighten-2 { + color: #9575cd !important; +} + +.deep-purple.lighten-1 { + background-color: #7e57c2 !important; +} + +.deep-purple-text.text-lighten-1 { + color: #7e57c2 !important; +} + +.deep-purple.darken-1 { + background-color: #5e35b1 !important; +} + +.deep-purple-text.text-darken-1 { + color: #5e35b1 !important; +} + +.deep-purple.darken-2 { + background-color: #512da8 !important; +} + +.deep-purple-text.text-darken-2 { + color: #512da8 !important; +} + +.deep-purple.darken-3 { + background-color: #4527a0 !important; +} + +.deep-purple-text.text-darken-3 { + color: #4527a0 !important; +} + +.deep-purple.darken-4 { + background-color: #311b92 !important; +} + +.deep-purple-text.text-darken-4 { + color: #311b92 !important; +} + +.deep-purple.accent-1 { + background-color: #b388ff !important; +} + +.deep-purple-text.text-accent-1 { + color: #b388ff !important; +} + +.deep-purple.accent-2 { + background-color: #7c4dff !important; +} + +.deep-purple-text.text-accent-2 { + color: #7c4dff !important; +} + +.deep-purple.accent-3 { + background-color: #651fff !important; +} + +.deep-purple-text.text-accent-3 { + color: #651fff !important; +} + +.deep-purple.accent-4 { + background-color: #6200ea !important; +} + +.deep-purple-text.text-accent-4 { + color: #6200ea !important; +} + +.indigo { + background-color: #3f51b5 !important; +} + +.indigo-text { + color: #3f51b5 !important; +} + +.indigo.lighten-5 { + background-color: #e8eaf6 !important; +} + +.indigo-text.text-lighten-5 { + color: #e8eaf6 !important; +} + +.indigo.lighten-4 { + background-color: #c5cae9 !important; +} + +.indigo-text.text-lighten-4 { + color: #c5cae9 !important; +} + +.indigo.lighten-3 { + background-color: #9fa8da !important; +} + +.indigo-text.text-lighten-3 { + color: #9fa8da !important; +} + +.indigo.lighten-2 { + background-color: #7986cb !important; +} + +.indigo-text.text-lighten-2 { + color: #7986cb !important; +} + +.indigo.lighten-1 { + background-color: #5c6bc0 !important; +} + +.indigo-text.text-lighten-1 { + color: #5c6bc0 !important; +} + +.indigo.darken-1 { + background-color: #3949ab !important; +} + +.indigo-text.text-darken-1 { + color: #3949ab !important; +} + +.indigo.darken-2 { + background-color: #303f9f !important; +} + +.indigo-text.text-darken-2 { + color: #303f9f !important; +} + +.indigo.darken-3 { + background-color: #283593 !important; +} + +.indigo-text.text-darken-3 { + color: #283593 !important; +} + +.indigo.darken-4 { + background-color: #1a237e !important; +} + +.indigo-text.text-darken-4 { + color: #1a237e !important; +} + +.indigo.accent-1 { + background-color: #8c9eff !important; +} + +.indigo-text.text-accent-1 { + color: #8c9eff !important; +} + +.indigo.accent-2 { + background-color: #536dfe !important; +} + +.indigo-text.text-accent-2 { + color: #536dfe !important; +} + +.indigo.accent-3 { + background-color: #3d5afe !important; +} + +.indigo-text.text-accent-3 { + color: #3d5afe !important; +} + +.indigo.accent-4 { + background-color: #304ffe !important; +} + +.indigo-text.text-accent-4 { + color: #304ffe !important; +} + +.blue { + background-color: #2196F3 !important; +} + +.blue-text { + color: #2196F3 !important; +} + +.blue.lighten-5 { + background-color: #E3F2FD !important; +} + +.blue-text.text-lighten-5 { + color: #E3F2FD !important; +} + +.blue.lighten-4 { + background-color: #BBDEFB !important; +} + +.blue-text.text-lighten-4 { + color: #BBDEFB !important; +} + +.blue.lighten-3 { + background-color: #90CAF9 !important; +} + +.blue-text.text-lighten-3 { + color: #90CAF9 !important; +} + +.blue.lighten-2 { + background-color: #64B5F6 !important; +} + +.blue-text.text-lighten-2 { + color: #64B5F6 !important; +} + +.blue.lighten-1 { + background-color: #42A5F5 !important; +} + +.blue-text.text-lighten-1 { + color: #42A5F5 !important; +} + +.blue.darken-1 { + background-color: #1E88E5 !important; +} + +.blue-text.text-darken-1 { + color: #1E88E5 !important; +} + +.blue.darken-2 { + background-color: #1976D2 !important; +} + +.blue-text.text-darken-2 { + color: #1976D2 !important; +} + +.blue.darken-3 { + background-color: #1565C0 !important; +} + +.blue-text.text-darken-3 { + color: #1565C0 !important; +} + +.blue.darken-4 { + background-color: #0D47A1 !important; +} + +.blue-text.text-darken-4 { + color: #0D47A1 !important; +} + +.blue.accent-1 { + background-color: #82B1FF !important; +} + +.blue-text.text-accent-1 { + color: #82B1FF !important; +} + +.blue.accent-2 { + background-color: #448AFF !important; +} + +.blue-text.text-accent-2 { + color: #448AFF !important; +} + +.blue.accent-3 { + background-color: #2979FF !important; +} + +.blue-text.text-accent-3 { + color: #2979FF !important; +} + +.blue.accent-4 { + background-color: #2962FF !important; +} + +.blue-text.text-accent-4 { + color: #2962FF !important; +} + +.light-blue { + background-color: #03a9f4 !important; +} + +.light-blue-text { + color: #03a9f4 !important; +} + +.light-blue.lighten-5 { + background-color: #e1f5fe !important; +} + +.light-blue-text.text-lighten-5 { + color: #e1f5fe !important; +} + +.light-blue.lighten-4 { + background-color: #b3e5fc !important; +} + +.light-blue-text.text-lighten-4 { + color: #b3e5fc !important; +} + +.light-blue.lighten-3 { + background-color: #81d4fa !important; +} + +.light-blue-text.text-lighten-3 { + color: #81d4fa !important; +} + +.light-blue.lighten-2 { + background-color: #4fc3f7 !important; +} + +.light-blue-text.text-lighten-2 { + color: #4fc3f7 !important; +} + +.light-blue.lighten-1 { + background-color: #29b6f6 !important; +} + +.light-blue-text.text-lighten-1 { + color: #29b6f6 !important; +} + +.light-blue.darken-1 { + background-color: #039be5 !important; +} + +.light-blue-text.text-darken-1 { + color: #039be5 !important; +} + +.light-blue.darken-2 { + background-color: #0288d1 !important; +} + +.light-blue-text.text-darken-2 { + color: #0288d1 !important; +} + +.light-blue.darken-3 { + background-color: #0277bd !important; +} + +.light-blue-text.text-darken-3 { + color: #0277bd !important; +} + +.light-blue.darken-4 { + background-color: #01579b !important; +} + +.light-blue-text.text-darken-4 { + color: #01579b !important; +} + +.light-blue.accent-1 { + background-color: #80d8ff !important; +} + +.light-blue-text.text-accent-1 { + color: #80d8ff !important; +} + +.light-blue.accent-2 { + background-color: #40c4ff !important; +} + +.light-blue-text.text-accent-2 { + color: #40c4ff !important; +} + +.light-blue.accent-3 { + background-color: #00b0ff !important; +} + +.light-blue-text.text-accent-3 { + color: #00b0ff !important; +} + +.light-blue.accent-4 { + background-color: #0091ea !important; +} + +.light-blue-text.text-accent-4 { + color: #0091ea !important; +} + +.cyan { + background-color: #00bcd4 !important; +} + +.cyan-text { + color: #00bcd4 !important; +} + +.cyan.lighten-5 { + background-color: #e0f7fa !important; +} + +.cyan-text.text-lighten-5 { + color: #e0f7fa !important; +} + +.cyan.lighten-4 { + background-color: #b2ebf2 !important; +} + +.cyan-text.text-lighten-4 { + color: #b2ebf2 !important; +} + +.cyan.lighten-3 { + background-color: #80deea !important; +} + +.cyan-text.text-lighten-3 { + color: #80deea !important; +} + +.cyan.lighten-2 { + background-color: #4dd0e1 !important; +} + +.cyan-text.text-lighten-2 { + color: #4dd0e1 !important; +} + +.cyan.lighten-1 { + background-color: #26c6da !important; +} + +.cyan-text.text-lighten-1 { + color: #26c6da !important; +} + +.cyan.darken-1 { + background-color: #00acc1 !important; +} + +.cyan-text.text-darken-1 { + color: #00acc1 !important; +} + +.cyan.darken-2 { + background-color: #0097a7 !important; +} + +.cyan-text.text-darken-2 { + color: #0097a7 !important; +} + +.cyan.darken-3 { + background-color: #00838f !important; +} + +.cyan-text.text-darken-3 { + color: #00838f !important; +} + +.cyan.darken-4 { + background-color: #006064 !important; +} + +.cyan-text.text-darken-4 { + color: #006064 !important; +} + +.cyan.accent-1 { + background-color: #84ffff !important; +} + +.cyan-text.text-accent-1 { + color: #84ffff !important; +} + +.cyan.accent-2 { + background-color: #18ffff !important; +} + +.cyan-text.text-accent-2 { + color: #18ffff !important; +} + +.cyan.accent-3 { + background-color: #00e5ff !important; +} + +.cyan-text.text-accent-3 { + color: #00e5ff !important; +} + +.cyan.accent-4 { + background-color: #00b8d4 !important; +} + +.cyan-text.text-accent-4 { + color: #00b8d4 !important; +} + +.teal { + background-color: #009688 !important; +} + +.teal-text { + color: #009688 !important; +} + +.teal.lighten-5 { + background-color: #e0f2f1 !important; +} + +.teal-text.text-lighten-5 { + color: #e0f2f1 !important; +} + +.teal.lighten-4 { + background-color: #b2dfdb !important; +} + +.teal-text.text-lighten-4 { + color: #b2dfdb !important; +} + +.teal.lighten-3 { + background-color: #80cbc4 !important; +} + +.teal-text.text-lighten-3 { + color: #80cbc4 !important; +} + +.teal.lighten-2 { + background-color: #4db6ac !important; +} + +.teal-text.text-lighten-2 { + color: #4db6ac !important; +} + +.teal.lighten-1 { + background-color: #26a69a !important; +} + +.teal-text.text-lighten-1 { + color: #26a69a !important; +} + +.teal.darken-1 { + background-color: #00897b !important; +} + +.teal-text.text-darken-1 { + color: #00897b !important; +} + +.teal.darken-2 { + background-color: #00796b !important; +} + +.teal-text.text-darken-2 { + color: #00796b !important; +} + +.teal.darken-3 { + background-color: #00695c !important; +} + +.teal-text.text-darken-3 { + color: #00695c !important; +} + +.teal.darken-4 { + background-color: #004d40 !important; +} + +.teal-text.text-darken-4 { + color: #004d40 !important; +} + +.teal.accent-1 { + background-color: #a7ffeb !important; +} + +.teal-text.text-accent-1 { + color: #a7ffeb !important; +} + +.teal.accent-2 { + background-color: #64ffda !important; +} + +.teal-text.text-accent-2 { + color: #64ffda !important; +} + +.teal.accent-3 { + background-color: #1de9b6 !important; +} + +.teal-text.text-accent-3 { + color: #1de9b6 !important; +} + +.teal.accent-4 { + background-color: #00bfa5 !important; +} + +.teal-text.text-accent-4 { + color: #00bfa5 !important; +} + +.green { + background-color: #4CAF50 !important; +} + +.green-text { + color: #4CAF50 !important; +} + +.green.lighten-5 { + background-color: #E8F5E9 !important; +} + +.green-text.text-lighten-5 { + color: #E8F5E9 !important; +} + +.green.lighten-4 { + background-color: #C8E6C9 !important; +} + +.green-text.text-lighten-4 { + color: #C8E6C9 !important; +} + +.green.lighten-3 { + background-color: #A5D6A7 !important; +} + +.green-text.text-lighten-3 { + color: #A5D6A7 !important; +} + +.green.lighten-2 { + background-color: #81C784 !important; +} + +.green-text.text-lighten-2 { + color: #81C784 !important; +} + +.green.lighten-1 { + background-color: #66BB6A !important; +} + +.green-text.text-lighten-1 { + color: #66BB6A !important; +} + +.green.darken-1 { + background-color: #43A047 !important; +} + +.green-text.text-darken-1 { + color: #43A047 !important; +} + +.green.darken-2 { + background-color: #388E3C !important; +} + +.green-text.text-darken-2 { + color: #388E3C !important; +} + +.green.darken-3 { + background-color: #2E7D32 !important; +} + +.green-text.text-darken-3 { + color: #2E7D32 !important; +} + +.green.darken-4 { + background-color: #1B5E20 !important; +} + +.green-text.text-darken-4 { + color: #1B5E20 !important; +} + +.green.accent-1 { + background-color: #B9F6CA !important; +} + +.green-text.text-accent-1 { + color: #B9F6CA !important; +} + +.green.accent-2 { + background-color: #69F0AE !important; +} + +.green-text.text-accent-2 { + color: #69F0AE !important; +} + +.green.accent-3 { + background-color: #00E676 !important; +} + +.green-text.text-accent-3 { + color: #00E676 !important; +} + +.green.accent-4 { + background-color: #00C853 !important; +} + +.green-text.text-accent-4 { + color: #00C853 !important; +} + +.light-green { + background-color: #8bc34a !important; +} + +.light-green-text { + color: #8bc34a !important; +} + +.light-green.lighten-5 { + background-color: #f1f8e9 !important; +} + +.light-green-text.text-lighten-5 { + color: #f1f8e9 !important; +} + +.light-green.lighten-4 { + background-color: #dcedc8 !important; +} + +.light-green-text.text-lighten-4 { + color: #dcedc8 !important; +} + +.light-green.lighten-3 { + background-color: #c5e1a5 !important; +} + +.light-green-text.text-lighten-3 { + color: #c5e1a5 !important; +} + +.light-green.lighten-2 { + background-color: #aed581 !important; +} + +.light-green-text.text-lighten-2 { + color: #aed581 !important; +} + +.light-green.lighten-1 { + background-color: #9ccc65 !important; +} + +.light-green-text.text-lighten-1 { + color: #9ccc65 !important; +} + +.light-green.darken-1 { + background-color: #7cb342 !important; +} + +.light-green-text.text-darken-1 { + color: #7cb342 !important; +} + +.light-green.darken-2 { + background-color: #689f38 !important; +} + +.light-green-text.text-darken-2 { + color: #689f38 !important; +} + +.light-green.darken-3 { + background-color: #558b2f !important; +} + +.light-green-text.text-darken-3 { + color: #558b2f !important; +} + +.light-green.darken-4 { + background-color: #33691e !important; +} + +.light-green-text.text-darken-4 { + color: #33691e !important; +} + +.light-green.accent-1 { + background-color: #ccff90 !important; +} + +.light-green-text.text-accent-1 { + color: #ccff90 !important; +} + +.light-green.accent-2 { + background-color: #b2ff59 !important; +} + +.light-green-text.text-accent-2 { + color: #b2ff59 !important; +} + +.light-green.accent-3 { + background-color: #76ff03 !important; +} + +.light-green-text.text-accent-3 { + color: #76ff03 !important; +} + +.light-green.accent-4 { + background-color: #64dd17 !important; +} + +.light-green-text.text-accent-4 { + color: #64dd17 !important; +} + +.lime { + background-color: #cddc39 !important; +} + +.lime-text { + color: #cddc39 !important; +} + +.lime.lighten-5 { + background-color: #f9fbe7 !important; +} + +.lime-text.text-lighten-5 { + color: #f9fbe7 !important; +} + +.lime.lighten-4 { + background-color: #f0f4c3 !important; +} + +.lime-text.text-lighten-4 { + color: #f0f4c3 !important; +} + +.lime.lighten-3 { + background-color: #e6ee9c !important; +} + +.lime-text.text-lighten-3 { + color: #e6ee9c !important; +} + +.lime.lighten-2 { + background-color: #dce775 !important; +} + +.lime-text.text-lighten-2 { + color: #dce775 !important; +} + +.lime.lighten-1 { + background-color: #d4e157 !important; +} + +.lime-text.text-lighten-1 { + color: #d4e157 !important; +} + +.lime.darken-1 { + background-color: #c0ca33 !important; +} + +.lime-text.text-darken-1 { + color: #c0ca33 !important; +} + +.lime.darken-2 { + background-color: #afb42b !important; +} + +.lime-text.text-darken-2 { + color: #afb42b !important; +} + +.lime.darken-3 { + background-color: #9e9d24 !important; +} + +.lime-text.text-darken-3 { + color: #9e9d24 !important; +} + +.lime.darken-4 { + background-color: #827717 !important; +} + +.lime-text.text-darken-4 { + color: #827717 !important; +} + +.lime.accent-1 { + background-color: #f4ff81 !important; +} + +.lime-text.text-accent-1 { + color: #f4ff81 !important; +} + +.lime.accent-2 { + background-color: #eeff41 !important; +} + +.lime-text.text-accent-2 { + color: #eeff41 !important; +} + +.lime.accent-3 { + background-color: #c6ff00 !important; +} + +.lime-text.text-accent-3 { + color: #c6ff00 !important; +} + +.lime.accent-4 { + background-color: #aeea00 !important; +} + +.lime-text.text-accent-4 { + color: #aeea00 !important; +} + +.yellow { + background-color: #ffeb3b !important; +} + +.yellow-text { + color: #ffeb3b !important; +} + +.yellow.lighten-5 { + background-color: #fffde7 !important; +} + +.yellow-text.text-lighten-5 { + color: #fffde7 !important; +} + +.yellow.lighten-4 { + background-color: #fff9c4 !important; +} + +.yellow-text.text-lighten-4 { + color: #fff9c4 !important; +} + +.yellow.lighten-3 { + background-color: #fff59d !important; +} + +.yellow-text.text-lighten-3 { + color: #fff59d !important; +} + +.yellow.lighten-2 { + background-color: #fff176 !important; +} + +.yellow-text.text-lighten-2 { + color: #fff176 !important; +} + +.yellow.lighten-1 { + background-color: #ffee58 !important; +} + +.yellow-text.text-lighten-1 { + color: #ffee58 !important; +} + +.yellow.darken-1 { + background-color: #fdd835 !important; +} + +.yellow-text.text-darken-1 { + color: #fdd835 !important; +} + +.yellow.darken-2 { + background-color: #fbc02d !important; +} + +.yellow-text.text-darken-2 { + color: #fbc02d !important; +} + +.yellow.darken-3 { + background-color: #f9a825 !important; +} + +.yellow-text.text-darken-3 { + color: #f9a825 !important; +} + +.yellow.darken-4 { + background-color: #f57f17 !important; +} + +.yellow-text.text-darken-4 { + color: #f57f17 !important; +} + +.yellow.accent-1 { + background-color: #ffff8d !important; +} + +.yellow-text.text-accent-1 { + color: #ffff8d !important; +} + +.yellow.accent-2 { + background-color: #ffff00 !important; +} + +.yellow-text.text-accent-2 { + color: #ffff00 !important; +} + +.yellow.accent-3 { + background-color: #ffea00 !important; +} + +.yellow-text.text-accent-3 { + color: #ffea00 !important; +} + +.yellow.accent-4 { + background-color: #ffd600 !important; +} + +.yellow-text.text-accent-4 { + color: #ffd600 !important; +} + +.amber { + background-color: #ffc107 !important; +} + +.amber-text { + color: #ffc107 !important; +} + +.amber.lighten-5 { + background-color: #fff8e1 !important; +} + +.amber-text.text-lighten-5 { + color: #fff8e1 !important; +} + +.amber.lighten-4 { + background-color: #ffecb3 !important; +} + +.amber-text.text-lighten-4 { + color: #ffecb3 !important; +} + +.amber.lighten-3 { + background-color: #ffe082 !important; +} + +.amber-text.text-lighten-3 { + color: #ffe082 !important; +} + +.amber.lighten-2 { + background-color: #ffd54f !important; +} + +.amber-text.text-lighten-2 { + color: #ffd54f !important; +} + +.amber.lighten-1 { + background-color: #ffca28 !important; +} + +.amber-text.text-lighten-1 { + color: #ffca28 !important; +} + +.amber.darken-1 { + background-color: #ffb300 !important; +} + +.amber-text.text-darken-1 { + color: #ffb300 !important; +} + +.amber.darken-2 { + background-color: #ffa000 !important; +} + +.amber-text.text-darken-2 { + color: #ffa000 !important; +} + +.amber.darken-3 { + background-color: #ff8f00 !important; +} + +.amber-text.text-darken-3 { + color: #ff8f00 !important; +} + +.amber.darken-4 { + background-color: #ff6f00 !important; +} + +.amber-text.text-darken-4 { + color: #ff6f00 !important; +} + +.amber.accent-1 { + background-color: #ffe57f !important; +} + +.amber-text.text-accent-1 { + color: #ffe57f !important; +} + +.amber.accent-2 { + background-color: #ffd740 !important; +} + +.amber-text.text-accent-2 { + color: #ffd740 !important; +} + +.amber.accent-3 { + background-color: #ffc400 !important; +} + +.amber-text.text-accent-3 { + color: #ffc400 !important; +} + +.amber.accent-4 { + background-color: #ffab00 !important; +} + +.amber-text.text-accent-4 { + color: #ffab00 !important; +} + +.orange { + background-color: #ff9800 !important; +} + +.orange-text { + color: #ff9800 !important; +} + +.orange.lighten-5 { + background-color: #fff3e0 !important; +} + +.orange-text.text-lighten-5 { + color: #fff3e0 !important; +} + +.orange.lighten-4 { + background-color: #ffe0b2 !important; +} + +.orange-text.text-lighten-4 { + color: #ffe0b2 !important; +} + +.orange.lighten-3 { + background-color: #ffcc80 !important; +} + +.orange-text.text-lighten-3 { + color: #ffcc80 !important; +} + +.orange.lighten-2 { + background-color: #ffb74d !important; +} + +.orange-text.text-lighten-2 { + color: #ffb74d !important; +} + +.orange.lighten-1 { + background-color: #ffa726 !important; +} + +.orange-text.text-lighten-1 { + color: #ffa726 !important; +} + +.orange.darken-1 { + background-color: #fb8c00 !important; +} + +.orange-text.text-darken-1 { + color: #fb8c00 !important; +} + +.orange.darken-2 { + background-color: #f57c00 !important; +} + +.orange-text.text-darken-2 { + color: #f57c00 !important; +} + +.orange.darken-3 { + background-color: #ef6c00 !important; +} + +.orange-text.text-darken-3 { + color: #ef6c00 !important; +} + +.orange.darken-4 { + background-color: #e65100 !important; +} + +.orange-text.text-darken-4 { + color: #e65100 !important; +} + +.orange.accent-1 { + background-color: #ffd180 !important; +} + +.orange-text.text-accent-1 { + color: #ffd180 !important; +} + +.orange.accent-2 { + background-color: #ffab40 !important; +} + +.orange-text.text-accent-2 { + color: #ffab40 !important; +} + +.orange.accent-3 { + background-color: #ff9100 !important; +} + +.orange-text.text-accent-3 { + color: #ff9100 !important; +} + +.orange.accent-4 { + background-color: #ff6d00 !important; +} + +.orange-text.text-accent-4 { + color: #ff6d00 !important; +} + +.deep-orange { + background-color: #ff5722 !important; +} + +.deep-orange-text { + color: #ff5722 !important; +} + +.deep-orange.lighten-5 { + background-color: #fbe9e7 !important; +} + +.deep-orange-text.text-lighten-5 { + color: #fbe9e7 !important; +} + +.deep-orange.lighten-4 { + background-color: #ffccbc !important; +} + +.deep-orange-text.text-lighten-4 { + color: #ffccbc !important; +} + +.deep-orange.lighten-3 { + background-color: #ffab91 !important; +} + +.deep-orange-text.text-lighten-3 { + color: #ffab91 !important; +} + +.deep-orange.lighten-2 { + background-color: #ff8a65 !important; +} + +.deep-orange-text.text-lighten-2 { + color: #ff8a65 !important; +} + +.deep-orange.lighten-1 { + background-color: #ff7043 !important; +} + +.deep-orange-text.text-lighten-1 { + color: #ff7043 !important; +} + +.deep-orange.darken-1 { + background-color: #f4511e !important; +} + +.deep-orange-text.text-darken-1 { + color: #f4511e !important; +} + +.deep-orange.darken-2 { + background-color: #e64a19 !important; +} + +.deep-orange-text.text-darken-2 { + color: #e64a19 !important; +} + +.deep-orange.darken-3 { + background-color: #d84315 !important; +} + +.deep-orange-text.text-darken-3 { + color: #d84315 !important; +} + +.deep-orange.darken-4 { + background-color: #bf360c !important; +} + +.deep-orange-text.text-darken-4 { + color: #bf360c !important; +} + +.deep-orange.accent-1 { + background-color: #ff9e80 !important; +} + +.deep-orange-text.text-accent-1 { + color: #ff9e80 !important; +} + +.deep-orange.accent-2 { + background-color: #ff6e40 !important; +} + +.deep-orange-text.text-accent-2 { + color: #ff6e40 !important; +} + +.deep-orange.accent-3 { + background-color: #ff3d00 !important; +} + +.deep-orange-text.text-accent-3 { + color: #ff3d00 !important; +} + +.deep-orange.accent-4 { + background-color: #dd2c00 !important; +} + +.deep-orange-text.text-accent-4 { + color: #dd2c00 !important; +} + +.brown { + background-color: #795548 !important; +} + +.brown-text { + color: #795548 !important; +} + +.brown.lighten-5 { + background-color: #efebe9 !important; +} + +.brown-text.text-lighten-5 { + color: #efebe9 !important; +} + +.brown.lighten-4 { + background-color: #d7ccc8 !important; +} + +.brown-text.text-lighten-4 { + color: #d7ccc8 !important; +} + +.brown.lighten-3 { + background-color: #bcaaa4 !important; +} + +.brown-text.text-lighten-3 { + color: #bcaaa4 !important; +} + +.brown.lighten-2 { + background-color: #a1887f !important; +} + +.brown-text.text-lighten-2 { + color: #a1887f !important; +} + +.brown.lighten-1 { + background-color: #8d6e63 !important; +} + +.brown-text.text-lighten-1 { + color: #8d6e63 !important; +} + +.brown.darken-1 { + background-color: #6d4c41 !important; +} + +.brown-text.text-darken-1 { + color: #6d4c41 !important; +} + +.brown.darken-2 { + background-color: #5d4037 !important; +} + +.brown-text.text-darken-2 { + color: #5d4037 !important; +} + +.brown.darken-3 { + background-color: #4e342e !important; +} + +.brown-text.text-darken-3 { + color: #4e342e !important; +} + +.brown.darken-4 { + background-color: #3e2723 !important; +} + +.brown-text.text-darken-4 { + color: #3e2723 !important; +} + +.blue-grey { + background-color: #607d8b !important; +} + +.blue-grey-text { + color: #607d8b !important; +} + +.blue-grey.lighten-5 { + background-color: #eceff1 !important; +} + +.blue-grey-text.text-lighten-5 { + color: #eceff1 !important; +} + +.blue-grey.lighten-4 { + background-color: #cfd8dc !important; +} + +.blue-grey-text.text-lighten-4 { + color: #cfd8dc !important; +} + +.blue-grey.lighten-3 { + background-color: #b0bec5 !important; +} + +.blue-grey-text.text-lighten-3 { + color: #b0bec5 !important; +} + +.blue-grey.lighten-2 { + background-color: #90a4ae !important; +} + +.blue-grey-text.text-lighten-2 { + color: #90a4ae !important; +} + +.blue-grey.lighten-1 { + background-color: #78909c !important; +} + +.blue-grey-text.text-lighten-1 { + color: #78909c !important; +} + +.blue-grey.darken-1 { + background-color: #546e7a !important; +} + +.blue-grey-text.text-darken-1 { + color: #546e7a !important; +} + +.blue-grey.darken-2 { + background-color: #455a64 !important; +} + +.blue-grey-text.text-darken-2 { + color: #455a64 !important; +} + +.blue-grey.darken-3 { + background-color: #37474f !important; +} + +.blue-grey-text.text-darken-3 { + color: #37474f !important; +} + +.blue-grey.darken-4 { + background-color: #263238 !important; +} + +.blue-grey-text.text-darken-4 { + color: #263238 !important; +} + +.grey { + background-color: #9e9e9e !important; +} + +.grey-text { + color: #9e9e9e !important; +} + +.grey.lighten-5 { + background-color: #fafafa !important; +} + +.grey-text.text-lighten-5 { + color: #fafafa !important; +} + +.grey.lighten-4 { + background-color: #f5f5f5 !important; +} + +.grey-text.text-lighten-4 { + color: #f5f5f5 !important; +} + +.grey.lighten-3 { + background-color: #eeeeee !important; +} + +.grey-text.text-lighten-3 { + color: #eeeeee !important; +} + +.grey.lighten-2 { + background-color: #e0e0e0 !important; +} + +.grey-text.text-lighten-2 { + color: #e0e0e0 !important; +} + +.grey.lighten-1 { + background-color: #bdbdbd !important; +} + +.grey-text.text-lighten-1 { + color: #bdbdbd !important; +} + +.grey.darken-1 { + background-color: #757575 !important; +} + +.grey-text.text-darken-1 { + color: #757575 !important; +} + +.grey.darken-2 { + background-color: #616161 !important; +} + +.grey-text.text-darken-2 { + color: #616161 !important; +} + +.grey.darken-3 { + background-color: #424242 !important; +} + +.grey-text.text-darken-3 { + color: #424242 !important; +} + +.grey.darken-4 { + background-color: #212121 !important; +} + +.grey-text.text-darken-4 { + color: #212121 !important; +} + +.black { + background-color: #000000 !important; +} + +.black-text { + color: #000000 !important; +} + +.white { + background-color: #FFFFFF !important; +} + +.white-text { + color: #FFFFFF !important; +} + +.transparent { + background-color: transparent !important; +} + +.transparent-text { + color: transparent !important; +} + +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS and IE text size adjust after device orientation change, + * without disabling user zoom. + */ +html { + font-family: sans-serif; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} + +/** + * Remove default margin. + */ +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ +audio, +canvas, +progress, +video { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. + */ +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ +/** + * Remove the gray background color from active links in IE 10. + */ +a { + background-color: transparent; +} + +/** + * Improve readability of focused elements when they are also in an + * active/hover state. + */ +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ +/** + * Remove border when inside `a` element in IE 8/9/10. + */ +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ +/** + * Address margin not present in IE 8/9 and Safari. + */ +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ +hr { + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ +button, +input, +optgroup, +select, +textarea { + color: inherit; + /* 1 */ + font: inherit; + /* 2 */ + margin: 0; + /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. + */ +input[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + box-sizing: content-box; + /* 2 */ +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ +legend { + border: 0; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ +/** + * Remove most spacing between table cells. + */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} + +html { + box-sizing: border-box; +} + +*, *:before, *:after { + box-sizing: inherit; +} + +ul:not(.browser-default) { + padding-left: 0; + list-style-type: none; +} + +ul:not(.browser-default) li { + list-style-type: none; +} + +a { + color: #039be5; + text-decoration: none; + -webkit-tap-highlight-color: transparent; +} + +.valign-wrapper { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; +} + +.clearfix { + clear: both; +} + +.z-depth-0 { + box-shadow: none !important; +} + +.z-depth-1, nav, .card-panel, .card, .toast, .btn, .btn-large, .btn-floating, .dropdown-content, .collapsible, .side-nav { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); +} + +.z-depth-1-half, .btn:hover, .btn-large:hover, .btn-floating:hover { + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); +} + +.z-depth-2 { + box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); +} + +.z-depth-3 { + box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.3); +} + +.z-depth-4, .modal { + box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.3); +} + +.z-depth-5 { + box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3); +} + +.hoverable { + transition: box-shadow .25s; + box-shadow: 0; +} + +.hoverable:hover { + transition: box-shadow .25s; + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +.divider { + height: 1px; + overflow: hidden; + background-color: #e0e0e0; +} + +blockquote { + margin: 20px 0; + padding-left: 1.5rem; + border-left: 5px solid #ee6e73; +} + +i { + line-height: inherit; +} + +i.left { + float: left; + margin-right: 15px; +} + +i.right { + float: right; + margin-left: 15px; +} + +i.tiny { + font-size: 1rem; +} + +i.small { + font-size: 2rem; +} + +i.medium { + font-size: 4rem; +} + +i.large { + font-size: 6rem; +} + +img.responsive-img, +video.responsive-video { + max-width: 100%; + height: auto; +} + +.pagination li { + display: inline-block; + border-radius: 2px; + text-align: center; + vertical-align: top; + height: 30px; +} + +.pagination li a { + color: #444; + display: inline-block; + font-size: 1.2rem; + padding: 0 10px; + line-height: 30px; +} + +.pagination li.active a { + color: #fff; +} + +.pagination li.active { + background-color: #ee6e73; +} + +.pagination li.disabled a { + cursor: default; + color: #999; +} + +.pagination li i { + font-size: 2rem; +} + +.pagination li.pages ul li { + display: inline-block; + float: none; +} + +@media only screen and (max-width: 992px) { + .pagination { + width: 100%; + } + .pagination li.prev, + .pagination li.next { + width: 10%; + } + .pagination li.pages { + width: 80%; + overflow: hidden; + white-space: nowrap; + } +} + +.breadcrumb { + font-size: 18px; + color: rgba(255, 255, 255, 0.7); +} + +.breadcrumb i, +.breadcrumb [class^="mdi-"], .breadcrumb [class*="mdi-"], +.breadcrumb i.material-icons { + display: inline-block; + float: left; + font-size: 24px; +} + +.breadcrumb:before { + content: '\E5CC'; + color: rgba(255, 255, 255, 0.7); + vertical-align: top; + display: inline-block; + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 25px; + margin: 0 10px 0 8px; + -webkit-font-smoothing: antialiased; +} + +.breadcrumb:first-child:before { + display: none; +} + +.breadcrumb:last-child { + color: #fff; +} + +.parallax-container { + position: relative; + overflow: hidden; + height: 500px; +} + +.parallax { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; +} + +.parallax img { + display: none; + position: absolute; + left: 50%; + bottom: 0; + min-width: 100%; + min-height: 100%; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} + +.pin-top, .pin-bottom { + position: relative; +} + +.pinned { + position: fixed !important; +} + +/********************* + Transition Classes +**********************/ +ul.staggered-list li { + opacity: 0; +} + +.fade-in { + opacity: 0; + -webkit-transform-origin: 0 50%; + transform-origin: 0 50%; +} + +/********************* + Media Query Classes +**********************/ +@media only screen and (max-width: 600px) { + .hide-on-small-only, .hide-on-small-and-down { + display: none !important; + } +} + +@media only screen and (max-width: 992px) { + .hide-on-med-and-down { + display: none !important; + } +} + +@media only screen and (min-width: 601px) { + .hide-on-med-and-up { + display: none !important; + } +} + +@media only screen and (min-width: 600px) and (max-width: 992px) { + .hide-on-med-only { + display: none !important; + } +} + +@media only screen and (min-width: 993px) { + .hide-on-large-only { + display: none !important; + } +} + +@media only screen and (min-width: 993px) { + .show-on-large { + display: block !important; + } +} + +@media only screen and (min-width: 600px) and (max-width: 992px) { + .show-on-medium { + display: block !important; + } +} + +@media only screen and (max-width: 600px) { + .show-on-small { + display: block !important; + } +} + +@media only screen and (min-width: 601px) { + .show-on-medium-and-up { + display: block !important; + } +} + +@media only screen and (max-width: 992px) { + .show-on-medium-and-down { + display: block !important; + } +} + +@media only screen and (max-width: 600px) { + .center-on-small-only { + text-align: center; + } +} + +.page-footer { + padding-top: 20px; + background-color: #ee6e73; +} + +.page-footer .footer-copyright { + overflow: hidden; + min-height: 50px; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + padding: 10px 0px; + color: rgba(255, 255, 255, 0.8); + background-color: rgba(51, 51, 51, 0.08); +} + +table, th, td { + border: none; +} + +table { + width: 100%; + display: table; +} + +table.bordered > thead > tr, +table.bordered > tbody > tr { + border-bottom: 1px solid #d0d0d0; +} + +table.striped > tbody > tr:nth-child(odd) { + background-color: #f2f2f2; +} + +table.striped > tbody > tr > td { + border-radius: 0; +} + +table.highlight > tbody > tr { + transition: background-color .25s ease; +} + +table.highlight > tbody > tr:hover { + background-color: #f2f2f2; +} + +table.centered thead tr th, table.centered tbody tr td { + text-align: center; +} + +thead { + border-bottom: 1px solid #d0d0d0; +} + +td, th { + padding: 15px 5px; + display: table-cell; + text-align: left; + vertical-align: middle; + border-radius: 2px; +} + +@media only screen and (max-width: 992px) { + table.responsive-table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + display: block; + position: relative; + /* sort out borders */ + } + table.responsive-table td:empty:before { + content: '\00a0'; + } + table.responsive-table th, + table.responsive-table td { + margin: 0; + vertical-align: top; + } + table.responsive-table th { + text-align: left; + } + table.responsive-table thead { + display: block; + float: left; + } + table.responsive-table thead tr { + display: block; + padding: 0 10px 0 0; + } + table.responsive-table thead tr th::before { + content: "\00a0"; + } + table.responsive-table tbody { + display: block; + width: auto; + position: relative; + overflow-x: auto; + white-space: nowrap; + } + table.responsive-table tbody tr { + display: inline-block; + vertical-align: top; + } + table.responsive-table th { + display: block; + text-align: right; + } + table.responsive-table td { + display: block; + min-height: 1.25em; + text-align: left; + } + table.responsive-table tr { + padding: 0 10px; + } + table.responsive-table thead { + border: 0; + border-right: 1px solid #d0d0d0; + } + table.responsive-table.bordered th { + border-bottom: 0; + border-left: 0; + } + table.responsive-table.bordered td { + border-left: 0; + border-right: 0; + border-bottom: 0; + } + table.responsive-table.bordered tr { + border: 0; + } + table.responsive-table.bordered tbody tr { + border-right: 1px solid #d0d0d0; + } +} + +.collection { + margin: 0.5rem 0 1rem 0; + border: 1px solid #e0e0e0; + border-radius: 2px; + overflow: hidden; + position: relative; +} + +.collection .collection-item { + background-color: #fff; + line-height: 1.5rem; + padding: 10px 20px; + margin: 0; + border-bottom: 1px solid #e0e0e0; +} + +.collection .collection-item.avatar { + min-height: 84px; + padding-left: 72px; + position: relative; +} + +.collection .collection-item.avatar .circle { + position: absolute; + width: 42px; + height: 42px; + overflow: hidden; + left: 15px; + display: inline-block; + vertical-align: middle; +} + +.collection .collection-item.avatar i.circle { + font-size: 18px; + line-height: 42px; + color: #fff; + background-color: #999; + text-align: center; +} + +.collection .collection-item.avatar .title { + font-size: 16px; +} + +.collection .collection-item.avatar p { + margin: 0; +} + +.collection .collection-item.avatar .secondary-content { + position: absolute; + top: 16px; + right: 16px; +} + +.collection .collection-item:last-child { + border-bottom: none; +} + +.collection .collection-item.active { + background-color: #26a69a; + color: #eafaf9; +} + +.collection .collection-item.active .secondary-content { + color: #fff; +} + +.collection a.collection-item { + display: block; + transition: .25s; + color: #26a69a; +} + +.collection a.collection-item:not(.active):hover { + background-color: #ddd; +} + +.collection.with-header .collection-header { + background-color: #fff; + border-bottom: 1px solid #e0e0e0; + padding: 10px 20px; +} + +.collection.with-header .collection-item { + padding-left: 30px; +} + +.collection.with-header .collection-item.avatar { + padding-left: 72px; +} + +.secondary-content { + float: right; + color: #26a69a; +} + +.collapsible .collection { + margin: 0; + border: none; +} + +.video-container { + position: relative; + padding-bottom: 56.25%; + height: 0; + overflow: hidden; +} + +.video-container iframe, .video-container object, .video-container embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.progress { + position: relative; + height: 4px; + display: block; + width: 100%; + background-color: #acece6; + border-radius: 2px; + margin: 0.5rem 0 1rem 0; + overflow: hidden; +} + +.progress .determinate { + position: absolute; + top: 0; + left: 0; + bottom: 0; + background-color: #26a69a; + transition: width .3s linear; +} + +.progress .indeterminate { + background-color: #26a69a; +} + +.progress .indeterminate:before { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + -webkit-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; + animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; +} + +.progress .indeterminate:after { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + -webkit-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; + animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; + -webkit-animation-delay: 1.15s; + animation-delay: 1.15s; +} + +@-webkit-keyframes indeterminate { + 0% { + left: -35%; + right: 100%; + } + 60% { + left: 100%; + right: -90%; + } + 100% { + left: 100%; + right: -90%; + } +} + +@keyframes indeterminate { + 0% { + left: -35%; + right: 100%; + } + 60% { + left: 100%; + right: -90%; + } + 100% { + left: 100%; + right: -90%; + } +} + +@-webkit-keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } +} + +@keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } +} + +/******************* + Utility Classes +*******************/ +.hide { + display: none !important; +} + +.left-align { + text-align: left; +} + +.right-align { + text-align: right; +} + +.center, .center-align { + text-align: center; +} + +.left { + float: left !important; +} + +.right { + float: right !important; +} + +.no-select, input[type=range], +input[type=range] + .thumb { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.circle { + border-radius: 50%; +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +.truncate { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.no-padding { + padding: 0 !important; +} + +span.badge { + min-width: 3rem; + padding: 0 6px; + margin-left: 14px; + text-align: center; + font-size: 1rem; + line-height: 22px; + height: 22px; + color: #757575; + float: right; + box-sizing: border-box; +} + +span.badge.new { + font-weight: 300; + font-size: 0.8rem; + color: #fff; + background-color: #26a69a; + border-radius: 2px; +} + +span.badge.new:after { + content: " new"; +} + +span.badge[data-badge-caption]::after { + content: " " attr(data-badge-caption); +} + +nav ul a span.badge { + display: inline-block; + float: none; + margin-left: 4px; + line-height: 22px; + height: 22px; +} + +.collection-item span.badge { + margin-top: calc(0.75rem - 11px); +} + +.collapsible span.badge { + margin-top: calc(1.5rem - 11px); +} + +.side-nav span.badge { + margin-top: calc(24px - 11px); +} + +/* This is needed for some mobile phones to display the Google Icon font properly */ +.material-icons { + text-rendering: optimizeLegibility; + -webkit-font-feature-settings: 'liga'; + -moz-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; +} + +.container { + margin: 0 auto; + max-width: 1280px; + width: 90%; +} + +@media only screen and (min-width: 601px) { + .container { + width: 85%; + } +} + +@media only screen and (min-width: 993px) { + .container { + width: 70%; + } +} + +.container .row { + margin-left: -0.75rem; + margin-right: -0.75rem; +} + +.section { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.section.no-pad { + padding: 0; +} + +.section.no-pad-bot { + padding-bottom: 0; +} + +.section.no-pad-top { + padding-top: 0; +} + +.row { + margin-left: auto; + margin-right: auto; + margin-bottom: 20px; +} + +.row:after { + content: ""; + display: table; + clear: both; +} + +.row .col { + float: left; + box-sizing: border-box; + padding: 0 0.75rem; + min-height: 1px; +} + +.row .col[class*="push-"], .row .col[class*="pull-"] { + position: relative; +} + +.row .col.s1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.offset-s1 { + margin-left: 8.3333333333%; +} + +.row .col.pull-s1 { + right: 8.3333333333%; +} + +.row .col.push-s1 { + left: 8.3333333333%; +} + +.row .col.offset-s2 { + margin-left: 16.6666666667%; +} + +.row .col.pull-s2 { + right: 16.6666666667%; +} + +.row .col.push-s2 { + left: 16.6666666667%; +} + +.row .col.offset-s3 { + margin-left: 25%; +} + +.row .col.pull-s3 { + right: 25%; +} + +.row .col.push-s3 { + left: 25%; +} + +.row .col.offset-s4 { + margin-left: 33.3333333333%; +} + +.row .col.pull-s4 { + right: 33.3333333333%; +} + +.row .col.push-s4 { + left: 33.3333333333%; +} + +.row .col.offset-s5 { + margin-left: 41.6666666667%; +} + +.row .col.pull-s5 { + right: 41.6666666667%; +} + +.row .col.push-s5 { + left: 41.6666666667%; +} + +.row .col.offset-s6 { + margin-left: 50%; +} + +.row .col.pull-s6 { + right: 50%; +} + +.row .col.push-s6 { + left: 50%; +} + +.row .col.offset-s7 { + margin-left: 58.3333333333%; +} + +.row .col.pull-s7 { + right: 58.3333333333%; +} + +.row .col.push-s7 { + left: 58.3333333333%; +} + +.row .col.offset-s8 { + margin-left: 66.6666666667%; +} + +.row .col.pull-s8 { + right: 66.6666666667%; +} + +.row .col.push-s8 { + left: 66.6666666667%; +} + +.row .col.offset-s9 { + margin-left: 75%; +} + +.row .col.pull-s9 { + right: 75%; +} + +.row .col.push-s9 { + left: 75%; +} + +.row .col.offset-s10 { + margin-left: 83.3333333333%; +} + +.row .col.pull-s10 { + right: 83.3333333333%; +} + +.row .col.push-s10 { + left: 83.3333333333%; +} + +.row .col.offset-s11 { + margin-left: 91.6666666667%; +} + +.row .col.pull-s11 { + right: 91.6666666667%; +} + +.row .col.push-s11 { + left: 91.6666666667%; +} + +.row .col.offset-s12 { + margin-left: 100%; +} + +.row .col.pull-s12 { + right: 100%; +} + +.row .col.push-s12 { + left: 100%; +} + +@media only screen and (min-width: 601px) { + .row .col.m1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.offset-m1 { + margin-left: 8.3333333333%; + } + .row .col.pull-m1 { + right: 8.3333333333%; + } + .row .col.push-m1 { + left: 8.3333333333%; + } + .row .col.offset-m2 { + margin-left: 16.6666666667%; + } + .row .col.pull-m2 { + right: 16.6666666667%; + } + .row .col.push-m2 { + left: 16.6666666667%; + } + .row .col.offset-m3 { + margin-left: 25%; + } + .row .col.pull-m3 { + right: 25%; + } + .row .col.push-m3 { + left: 25%; + } + .row .col.offset-m4 { + margin-left: 33.3333333333%; + } + .row .col.pull-m4 { + right: 33.3333333333%; + } + .row .col.push-m4 { + left: 33.3333333333%; + } + .row .col.offset-m5 { + margin-left: 41.6666666667%; + } + .row .col.pull-m5 { + right: 41.6666666667%; + } + .row .col.push-m5 { + left: 41.6666666667%; + } + .row .col.offset-m6 { + margin-left: 50%; + } + .row .col.pull-m6 { + right: 50%; + } + .row .col.push-m6 { + left: 50%; + } + .row .col.offset-m7 { + margin-left: 58.3333333333%; + } + .row .col.pull-m7 { + right: 58.3333333333%; + } + .row .col.push-m7 { + left: 58.3333333333%; + } + .row .col.offset-m8 { + margin-left: 66.6666666667%; + } + .row .col.pull-m8 { + right: 66.6666666667%; + } + .row .col.push-m8 { + left: 66.6666666667%; + } + .row .col.offset-m9 { + margin-left: 75%; + } + .row .col.pull-m9 { + right: 75%; + } + .row .col.push-m9 { + left: 75%; + } + .row .col.offset-m10 { + margin-left: 83.3333333333%; + } + .row .col.pull-m10 { + right: 83.3333333333%; + } + .row .col.push-m10 { + left: 83.3333333333%; + } + .row .col.offset-m11 { + margin-left: 91.6666666667%; + } + .row .col.pull-m11 { + right: 91.6666666667%; + } + .row .col.push-m11 { + left: 91.6666666667%; + } + .row .col.offset-m12 { + margin-left: 100%; + } + .row .col.pull-m12 { + right: 100%; + } + .row .col.push-m12 { + left: 100%; + } +} + +@media only screen and (min-width: 993px) { + .row .col.l1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.offset-l1 { + margin-left: 8.3333333333%; + } + .row .col.pull-l1 { + right: 8.3333333333%; + } + .row .col.push-l1 { + left: 8.3333333333%; + } + .row .col.offset-l2 { + margin-left: 16.6666666667%; + } + .row .col.pull-l2 { + right: 16.6666666667%; + } + .row .col.push-l2 { + left: 16.6666666667%; + } + .row .col.offset-l3 { + margin-left: 25%; + } + .row .col.pull-l3 { + right: 25%; + } + .row .col.push-l3 { + left: 25%; + } + .row .col.offset-l4 { + margin-left: 33.3333333333%; + } + .row .col.pull-l4 { + right: 33.3333333333%; + } + .row .col.push-l4 { + left: 33.3333333333%; + } + .row .col.offset-l5 { + margin-left: 41.6666666667%; + } + .row .col.pull-l5 { + right: 41.6666666667%; + } + .row .col.push-l5 { + left: 41.6666666667%; + } + .row .col.offset-l6 { + margin-left: 50%; + } + .row .col.pull-l6 { + right: 50%; + } + .row .col.push-l6 { + left: 50%; + } + .row .col.offset-l7 { + margin-left: 58.3333333333%; + } + .row .col.pull-l7 { + right: 58.3333333333%; + } + .row .col.push-l7 { + left: 58.3333333333%; + } + .row .col.offset-l8 { + margin-left: 66.6666666667%; + } + .row .col.pull-l8 { + right: 66.6666666667%; + } + .row .col.push-l8 { + left: 66.6666666667%; + } + .row .col.offset-l9 { + margin-left: 75%; + } + .row .col.pull-l9 { + right: 75%; + } + .row .col.push-l9 { + left: 75%; + } + .row .col.offset-l10 { + margin-left: 83.3333333333%; + } + .row .col.pull-l10 { + right: 83.3333333333%; + } + .row .col.push-l10 { + left: 83.3333333333%; + } + .row .col.offset-l11 { + margin-left: 91.6666666667%; + } + .row .col.pull-l11 { + right: 91.6666666667%; + } + .row .col.push-l11 { + left: 91.6666666667%; + } + .row .col.offset-l12 { + margin-left: 100%; + } + .row .col.pull-l12 { + right: 100%; + } + .row .col.push-l12 { + left: 100%; + } +} + +@media only screen and (min-width: 1201px) { + .row .col.xl1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.offset-xl1 { + margin-left: 8.3333333333%; + } + .row .col.pull-xl1 { + right: 8.3333333333%; + } + .row .col.push-xl1 { + left: 8.3333333333%; + } + .row .col.offset-xl2 { + margin-left: 16.6666666667%; + } + .row .col.pull-xl2 { + right: 16.6666666667%; + } + .row .col.push-xl2 { + left: 16.6666666667%; + } + .row .col.offset-xl3 { + margin-left: 25%; + } + .row .col.pull-xl3 { + right: 25%; + } + .row .col.push-xl3 { + left: 25%; + } + .row .col.offset-xl4 { + margin-left: 33.3333333333%; + } + .row .col.pull-xl4 { + right: 33.3333333333%; + } + .row .col.push-xl4 { + left: 33.3333333333%; + } + .row .col.offset-xl5 { + margin-left: 41.6666666667%; + } + .row .col.pull-xl5 { + right: 41.6666666667%; + } + .row .col.push-xl5 { + left: 41.6666666667%; + } + .row .col.offset-xl6 { + margin-left: 50%; + } + .row .col.pull-xl6 { + right: 50%; + } + .row .col.push-xl6 { + left: 50%; + } + .row .col.offset-xl7 { + margin-left: 58.3333333333%; + } + .row .col.pull-xl7 { + right: 58.3333333333%; + } + .row .col.push-xl7 { + left: 58.3333333333%; + } + .row .col.offset-xl8 { + margin-left: 66.6666666667%; + } + .row .col.pull-xl8 { + right: 66.6666666667%; + } + .row .col.push-xl8 { + left: 66.6666666667%; + } + .row .col.offset-xl9 { + margin-left: 75%; + } + .row .col.pull-xl9 { + right: 75%; + } + .row .col.push-xl9 { + left: 75%; + } + .row .col.offset-xl10 { + margin-left: 83.3333333333%; + } + .row .col.pull-xl10 { + right: 83.3333333333%; + } + .row .col.push-xl10 { + left: 83.3333333333%; + } + .row .col.offset-xl11 { + margin-left: 91.6666666667%; + } + .row .col.pull-xl11 { + right: 91.6666666667%; + } + .row .col.push-xl11 { + left: 91.6666666667%; + } + .row .col.offset-xl12 { + margin-left: 100%; + } + .row .col.pull-xl12 { + right: 100%; + } + .row .col.push-xl12 { + left: 100%; + } +} + +nav { + color: #fff; + background-color: #ee6e73; + width: 100%; + height: 56px; + line-height: 56px; +} + +nav.nav-extended { + height: auto; +} + +nav.nav-extended .nav-wrapper { + min-height: 56px; + height: auto; +} + +nav.nav-extended .nav-content { + position: relative; + line-height: normal; +} + +nav a { + color: #fff; +} + +nav i, +nav [class^="mdi-"], nav [class*="mdi-"], +nav i.material-icons { + display: block; + font-size: 24px; + height: 56px; + line-height: 56px; +} + +nav .nav-wrapper { + position: relative; + height: 100%; +} + +@media only screen and (min-width: 993px) { + nav a.button-collapse { + display: none; + } +} + +nav .button-collapse { + float: left; + position: relative; + z-index: 1; + height: 56px; + margin: 0 18px; +} + +nav .button-collapse i { + height: 56px; + line-height: 56px; +} + +nav .brand-logo { + position: absolute; + color: #fff; + display: inline-block; + font-size: 2.1rem; + padding: 0; + white-space: nowrap; +} + +nav .brand-logo.center { + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} + +@media only screen and (max-width: 992px) { + nav .brand-logo { + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + } + nav .brand-logo.left, nav .brand-logo.right { + padding: 0; + -webkit-transform: none; + transform: none; + } + nav .brand-logo.left { + left: 0.5rem; + } + nav .brand-logo.right { + right: 0.5rem; + left: auto; + } +} + +nav .brand-logo.right { + right: 0.5rem; + padding: 0; +} + +nav .brand-logo i, +nav .brand-logo [class^="mdi-"], nav .brand-logo [class*="mdi-"], +nav .brand-logo i.material-icons { + float: left; + margin-right: 15px; +} + +nav .nav-title { + display: inline-block; + font-size: 32px; + padding: 28px 0; +} + +nav ul { + margin: 0; +} + +nav ul li { + transition: background-color .3s; + float: left; + padding: 0; +} + +nav ul li.active { + background-color: rgba(0, 0, 0, 0.1); +} + +nav ul a { + transition: background-color .3s; + font-size: 1rem; + color: #fff; + display: block; + padding: 0 15px; + cursor: pointer; +} + +nav ul a.btn, nav ul a.btn-large, nav ul a.btn-large, nav ul a.btn-flat, nav ul a.btn-floating { + margin-top: -2px; + margin-left: 15px; + margin-right: 15px; +} + +nav ul a.btn > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-flat > .material-icons, nav ul a.btn-floating > .material-icons { + height: inherit; + line-height: inherit; +} + +nav ul a:hover { + background-color: rgba(0, 0, 0, 0.1); +} + +nav ul.left { + float: left; +} + +nav form { + height: 100%; +} + +nav .input-field { + margin: 0; + height: 100%; +} + +nav .input-field input { + height: 100%; + font-size: 1.2rem; + border: none; + padding-left: 2rem; +} + +nav .input-field input:focus, nav .input-field input[type=text]:valid, nav .input-field input[type=password]:valid, nav .input-field input[type=email]:valid, nav .input-field input[type=url]:valid, nav .input-field input[type=date]:valid { + border: none; + box-shadow: none; +} + +nav .input-field label { + top: 0; + left: 0; +} + +nav .input-field label i { + color: rgba(255, 255, 255, 0.7); + transition: color .3s; +} + +nav .input-field label.active i { + color: #fff; +} + +.navbar-fixed { + position: relative; + height: 56px; + z-index: 997; +} + +.navbar-fixed nav { + position: fixed; +} + +@media only screen and (min-width: 601px) { + nav.nav-extended .nav-wrapper { + min-height: 64px; + } + nav, nav .nav-wrapper i, nav a.button-collapse, nav a.button-collapse i { + height: 64px; + line-height: 64px; + } + .navbar-fixed { + height: 64px; + } +} + +@font-face { + font-family: "Roboto"; + src: local(Roboto Thin), url("../fonts/roboto/Roboto-Thin.woff2") format("woff2"), url("../fonts/roboto/Roboto-Thin.woff") format("woff"); + font-weight: 100; +} + +@font-face { + font-family: "Roboto"; + src: local(Roboto Light), url("../fonts/roboto/Roboto-Light.woff2") format("woff2"), url("../fonts/roboto/Roboto-Light.woff") format("woff"); + font-weight: 300; +} + +@font-face { + font-family: "Roboto"; + src: local(Roboto Regular), url("../fonts/roboto/Roboto-Regular.woff2") format("woff2"), url("../fonts/roboto/Roboto-Regular.woff") format("woff"); + font-weight: 400; +} + +@font-face { + font-family: "Roboto"; + src: local(Roboto Medium), url("../fonts/roboto/Roboto-Medium.woff2") format("woff2"), url("../fonts/roboto/Roboto-Medium.woff") format("woff"); + font-weight: 500; +} + +@font-face { + font-family: "Roboto"; + src: local(Roboto Bold), url("../fonts/roboto/Roboto-Bold.woff2") format("woff2"), url("../fonts/roboto/Roboto-Bold.woff") format("woff"); + font-weight: 700; +} + +a { + text-decoration: none; +} + +html { + line-height: 1.5; + font-family: "Roboto", sans-serif; + font-weight: normal; + color: rgba(0, 0, 0, 0.87); +} + +@media only screen and (min-width: 0) { + html { + font-size: 14px; + } +} + +@media only screen and (min-width: 992px) { + html { + font-size: 14.5px; + } +} + +@media only screen and (min-width: 1200px) { + html { + font-size: 15px; + } +} + +h1, h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.1; +} + +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + font-weight: inherit; +} + +h1 { + font-size: 4.2rem; + line-height: 110%; + margin: 2.1rem 0 1.68rem 0; +} + +h2 { + font-size: 3.56rem; + line-height: 110%; + margin: 1.78rem 0 1.424rem 0; +} + +h3 { + font-size: 2.92rem; + line-height: 110%; + margin: 1.46rem 0 1.168rem 0; +} + +h4 { + font-size: 2.28rem; + line-height: 110%; + margin: 1.14rem 0 0.912rem 0; +} + +h5 { + font-size: 1.64rem; + line-height: 110%; + margin: 0.82rem 0 0.656rem 0; +} + +h6 { + font-size: 1rem; + line-height: 110%; + margin: 0.5rem 0 0.4rem 0; +} + +em { + font-style: italic; +} + +strong { + font-weight: 500; +} + +small { + font-size: 75%; +} + +.light, .page-footer .footer-copyright { + font-weight: 300; +} + +.thin { + font-weight: 200; +} + +.flow-text { + font-weight: 300; +} + +@media only screen and (min-width: 360px) { + .flow-text { + font-size: 1.2rem; + } +} + +@media only screen and (min-width: 390px) { + .flow-text { + font-size: 1.224rem; + } +} + +@media only screen and (min-width: 420px) { + .flow-text { + font-size: 1.248rem; + } +} + +@media only screen and (min-width: 450px) { + .flow-text { + font-size: 1.272rem; + } +} + +@media only screen and (min-width: 480px) { + .flow-text { + font-size: 1.296rem; + } +} + +@media only screen and (min-width: 510px) { + .flow-text { + font-size: 1.32rem; + } +} + +@media only screen and (min-width: 540px) { + .flow-text { + font-size: 1.344rem; + } +} + +@media only screen and (min-width: 570px) { + .flow-text { + font-size: 1.368rem; + } +} + +@media only screen and (min-width: 600px) { + .flow-text { + font-size: 1.392rem; + } +} + +@media only screen and (min-width: 630px) { + .flow-text { + font-size: 1.416rem; + } +} + +@media only screen and (min-width: 660px) { + .flow-text { + font-size: 1.44rem; + } +} + +@media only screen and (min-width: 690px) { + .flow-text { + font-size: 1.464rem; + } +} + +@media only screen and (min-width: 720px) { + .flow-text { + font-size: 1.488rem; + } +} + +@media only screen and (min-width: 750px) { + .flow-text { + font-size: 1.512rem; + } +} + +@media only screen and (min-width: 780px) { + .flow-text { + font-size: 1.536rem; + } +} + +@media only screen and (min-width: 810px) { + .flow-text { + font-size: 1.56rem; + } +} + +@media only screen and (min-width: 840px) { + .flow-text { + font-size: 1.584rem; + } +} + +@media only screen and (min-width: 870px) { + .flow-text { + font-size: 1.608rem; + } +} + +@media only screen and (min-width: 900px) { + .flow-text { + font-size: 1.632rem; + } +} + +@media only screen and (min-width: 930px) { + .flow-text { + font-size: 1.656rem; + } +} + +@media only screen and (min-width: 960px) { + .flow-text { + font-size: 1.68rem; + } +} + +@media only screen and (max-width: 360px) { + .flow-text { + font-size: 1.2rem; + } +} + +.scale-transition { + transition: -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; + transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; + transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; +} + +.scale-transition.scale-out { + -webkit-transform: scale(0); + transform: scale(0); + transition: -webkit-transform .2s !important; + transition: transform .2s !important; + transition: transform .2s, -webkit-transform .2s !important; +} + +.scale-transition.scale-in { + -webkit-transform: scale(1); + transform: scale(1); +} + +.card-panel { + transition: box-shadow .25s; + padding: 24px; + margin: 0.5rem 0 1rem 0; + border-radius: 2px; + background-color: #fff; +} + +.card { + position: relative; + margin: 0.5rem 0 1rem 0; + background-color: #fff; + transition: box-shadow .25s; + border-radius: 2px; +} + +.card .card-title { + font-size: 24px; + font-weight: 300; +} + +.card .card-title.activator { + cursor: pointer; +} + +.card.small, .card.medium, .card.large { + position: relative; +} + +.card.small .card-image, .card.medium .card-image, .card.large .card-image { + max-height: 60%; + overflow: hidden; +} + +.card.small .card-image + .card-content, .card.medium .card-image + .card-content, .card.large .card-image + .card-content { + max-height: 40%; +} + +.card.small .card-content, .card.medium .card-content, .card.large .card-content { + max-height: 100%; + overflow: hidden; +} + +.card.small .card-action, .card.medium .card-action, .card.large .card-action { + position: absolute; + bottom: 0; + left: 0; + right: 0; +} + +.card.small { + height: 300px; +} + +.card.medium { + height: 400px; +} + +.card.large { + height: 500px; +} + +.card.horizontal { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.card.horizontal.small .card-image, .card.horizontal.medium .card-image, .card.horizontal.large .card-image { + height: 100%; + max-height: none; + overflow: visible; +} + +.card.horizontal.small .card-image img, .card.horizontal.medium .card-image img, .card.horizontal.large .card-image img { + height: 100%; +} + +.card.horizontal .card-image { + max-width: 50%; +} + +.card.horizontal .card-image img { + border-radius: 2px 0 0 2px; + max-width: 100%; + width: auto; +} + +.card.horizontal .card-stacked { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + position: relative; +} + +.card.horizontal .card-stacked .card-content { + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.card.sticky-action .card-action { + z-index: 2; +} + +.card.sticky-action .card-reveal { + z-index: 1; + padding-bottom: 64px; +} + +.card .card-image { + position: relative; +} + +.card .card-image img { + display: block; + border-radius: 2px 2px 0 0; + position: relative; + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; +} + +.card .card-image .card-title { + color: #fff; + position: absolute; + bottom: 0; + left: 0; + max-width: 100%; + padding: 24px; +} + +.card .card-content { + padding: 24px; + border-radius: 0 0 2px 2px; +} + +.card .card-content p { + margin: 0; + color: inherit; +} + +.card .card-content .card-title { + display: block; + line-height: 32px; + margin-bottom: 8px; +} + +.card .card-content .card-title i { + line-height: 32px; +} + +.card .card-action { + position: relative; + background-color: inherit; + border-top: 1px solid rgba(160, 160, 160, 0.2); + padding: 16px 24px; +} + +.card .card-action:last-child { + border-radius: 0 0 2px 2px; +} + +.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating) { + color: #ffab40; + margin-right: 24px; + transition: color .3s ease; + text-transform: uppercase; +} + +.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating):hover { + color: #ffd8a6; +} + +.card .card-reveal { + padding: 24px; + position: absolute; + background-color: #fff; + width: 100%; + overflow-y: auto; + left: 0; + top: 100%; + height: 100%; + z-index: 3; + display: none; +} + +.card .card-reveal .card-title { + cursor: pointer; + display: block; +} + +#toast-container { + display: block; + position: fixed; + z-index: 10000; +} + +@media only screen and (max-width: 600px) { + #toast-container { + min-width: 100%; + bottom: 0%; + } +} + +@media only screen and (min-width: 601px) and (max-width: 992px) { + #toast-container { + left: 5%; + bottom: 7%; + max-width: 90%; + } +} + +@media only screen and (min-width: 993px) { + #toast-container { + top: 10%; + right: 7%; + max-width: 86%; + } +} + +.toast { + border-radius: 2px; + top: 35px; + width: auto; + clear: both; + margin-top: 10px; + position: relative; + max-width: 100%; + height: auto; + min-height: 48px; + line-height: 1.5em; + word-break: break-all; + background-color: #323232; + padding: 10px 25px; + font-size: 1.1rem; + font-weight: 300; + color: #fff; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.toast .btn, .toast .btn-large, .toast .btn-flat { + margin: 0; + margin-left: 3rem; +} + +.toast.rounded { + border-radius: 24px; +} + +@media only screen and (max-width: 600px) { + .toast { + width: 100%; + border-radius: 0; + } +} + +@media only screen and (min-width: 601px) and (max-width: 992px) { + .toast { + float: left; + } +} + +@media only screen and (min-width: 993px) { + .toast { + float: right; + } +} + +.tabs { + position: relative; + overflow-x: auto; + overflow-y: hidden; + height: 48px; + width: 100%; + background-color: #fff; + margin: 0 auto; + white-space: nowrap; +} + +.tabs.tabs-transparent { + background-color: transparent; +} + +.tabs.tabs-transparent .tab a, +.tabs.tabs-transparent .tab.disabled a, +.tabs.tabs-transparent .tab.disabled a:hover { + color: rgba(255, 255, 255, 0.7); +} + +.tabs.tabs-transparent .tab a:hover, +.tabs.tabs-transparent .tab a.active { + color: #fff; +} + +.tabs.tabs-transparent .indicator { + background-color: #fff; +} + +.tabs.tabs-fixed-width { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.tabs.tabs-fixed-width .tab { + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.tabs .tab { + display: inline-block; + text-align: center; + line-height: 48px; + height: 48px; + padding: 0; + margin: 0; + text-transform: uppercase; +} + +.tabs .tab a { + color: rgba(238, 110, 115, 0.7); + display: block; + width: 100%; + height: 100%; + padding: 0 24px; + font-size: 14px; + text-overflow: ellipsis; + overflow: hidden; + transition: color .28s ease; +} + +.tabs .tab a:hover, .tabs .tab a.active { + background-color: transparent; + color: #ee6e73; +} + +.tabs .tab.disabled a, +.tabs .tab.disabled a:hover { + color: rgba(238, 110, 115, 0.7); + cursor: default; +} + +.tabs .indicator { + position: absolute; + bottom: 0; + height: 2px; + background-color: #f6b2b5; + will-change: left, right; +} + +@media only screen and (max-width: 992px) { + .tabs { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + } + .tabs .tab { + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + } + .tabs .tab a { + padding: 0 12px; + } +} + +.material-tooltip { + padding: 10px 8px; + font-size: 1rem; + z-index: 2000; + background-color: transparent; + border-radius: 2px; + color: #fff; + min-height: 36px; + line-height: 120%; + opacity: 0; + position: absolute; + text-align: center; + max-width: calc(100% - 4px); + overflow: hidden; + left: 0; + top: 0; + pointer-events: none; + visibility: hidden; +} + +.backdrop { + position: absolute; + opacity: 0; + height: 7px; + width: 14px; + border-radius: 0 0 50% 50%; + background-color: #323232; + z-index: -1; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + visibility: hidden; +} + +.btn, .btn-large, +.btn-flat { + border: none; + border-radius: 2px; + display: inline-block; + height: 36px; + line-height: 36px; + padding: 0 2rem; + text-transform: uppercase; + vertical-align: middle; + -webkit-tap-highlight-color: transparent; +} + +.btn.disabled, .disabled.btn-large, +.btn-floating.disabled, +.btn-large.disabled, +.btn-flat.disabled, +.btn:disabled, +.btn-large:disabled, +.btn-floating:disabled, +.btn-large:disabled, +.btn-flat:disabled, +.btn[disabled], +[disabled].btn-large, +.btn-floating[disabled], +.btn-large[disabled], +.btn-flat[disabled] { + pointer-events: none; + background-color: #DFDFDF !important; + box-shadow: none; + color: #9F9F9F !important; + cursor: default; +} + +.btn.disabled:hover, .disabled.btn-large:hover, +.btn-floating.disabled:hover, +.btn-large.disabled:hover, +.btn-flat.disabled:hover, +.btn:disabled:hover, +.btn-large:disabled:hover, +.btn-floating:disabled:hover, +.btn-large:disabled:hover, +.btn-flat:disabled:hover, +.btn[disabled]:hover, +[disabled].btn-large:hover, +.btn-floating[disabled]:hover, +.btn-large[disabled]:hover, +.btn-flat[disabled]:hover { + background-color: #DFDFDF !important; + color: #9F9F9F !important; +} + +.btn, .btn-large, +.btn-floating, +.btn-large, +.btn-flat { + font-size: 1rem; + outline: 0; +} + +.btn i, .btn-large i, +.btn-floating i, +.btn-large i, +.btn-flat i { + font-size: 1.3rem; + line-height: inherit; +} + +.btn:focus, .btn-large:focus, +.btn-floating:focus { + background-color: #1d7d74; +} + +.btn, .btn-large { + text-decoration: none; + color: #fff; + background-color: #26a69a; + text-align: center; + letter-spacing: .5px; + transition: .2s ease-out; + cursor: pointer; +} + +.btn:hover, .btn-large:hover { + background-color: #2bbbad; +} + +.btn-floating { + display: inline-block; + color: #fff; + position: relative; + overflow: hidden; + z-index: 1; + width: 40px; + height: 40px; + line-height: 40px; + padding: 0; + background-color: #26a69a; + border-radius: 50%; + transition: .3s; + cursor: pointer; + vertical-align: middle; +} + +.btn-floating:hover { + background-color: #26a69a; +} + +.btn-floating:before { + border-radius: 0; +} + +.btn-floating.btn-large { + width: 56px; + height: 56px; +} + +.btn-floating.btn-large.halfway-fab { + bottom: -28px; +} + +.btn-floating.btn-large i { + line-height: 56px; +} + +.btn-floating.halfway-fab { + position: absolute; + right: 24px; + bottom: -20px; +} + +.btn-floating.halfway-fab.left { + right: auto; + left: 24px; +} + +.btn-floating i { + width: inherit; + display: inline-block; + text-align: center; + color: #fff; + font-size: 1.6rem; + line-height: 40px; +} + +button.btn-floating { + border: none; +} + +.fixed-action-btn { + position: fixed; + right: 23px; + bottom: 23px; + padding-top: 15px; + margin-bottom: 0; + z-index: 998; +} + +.fixed-action-btn.active ul { + visibility: visible; +} + +.fixed-action-btn.horizontal { + padding: 0 0 0 15px; +} + +.fixed-action-btn.horizontal ul { + text-align: right; + right: 64px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + height: 100%; + left: auto; + width: 500px; + /*width 100% only goes to width of button container */ +} + +.fixed-action-btn.horizontal ul li { + display: inline-block; + margin: 15px 15px 0 0; +} + +.fixed-action-btn.toolbar { + padding: 0; + height: 56px; +} + +.fixed-action-btn.toolbar.active > a i { + opacity: 0; +} + +.fixed-action-btn.toolbar ul { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + top: 0; + bottom: 0; +} + +.fixed-action-btn.toolbar ul li { + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: inline-block; + margin: 0; + height: 100%; + transition: none; +} + +.fixed-action-btn.toolbar ul li a { + display: block; + overflow: hidden; + position: relative; + width: 100%; + height: 100%; + background-color: transparent; + box-shadow: none; + color: #fff; + line-height: 56px; + z-index: 1; +} + +.fixed-action-btn.toolbar ul li a i { + line-height: inherit; +} + +.fixed-action-btn ul { + left: 0; + right: 0; + text-align: center; + position: absolute; + bottom: 64px; + margin: 0; + visibility: hidden; +} + +.fixed-action-btn ul li { + margin-bottom: 15px; +} + +.fixed-action-btn ul a.btn-floating { + opacity: 0; +} + +.fixed-action-btn .fab-backdrop { + position: absolute; + top: 0; + left: 0; + z-index: -1; + width: 40px; + height: 40px; + background-color: #26a69a; + border-radius: 50%; + -webkit-transform: scale(0); + transform: scale(0); +} + +.btn-flat { + box-shadow: none; + background-color: transparent; + color: #343434; + cursor: pointer; + transition: background-color .2s; +} + +.btn-flat:focus, .btn-flat:active { + background-color: transparent; +} + +.btn-flat:focus, .btn-flat:hover { + background-color: rgba(0, 0, 0, 0.1); + box-shadow: none; +} + +.btn-flat:active { + background-color: rgba(0, 0, 0, 0.2); +} + +.btn-flat.disabled { + background-color: transparent !important; + color: #b3b3b3 !important; + cursor: default; +} + +.btn-large { + height: 54px; + line-height: 54px; +} + +.btn-large i { + font-size: 1.6rem; +} + +.btn-block { + display: block; +} + +.dropdown-content { + background-color: #fff; + margin: 0; + display: none; + min-width: 100px; + max-height: 650px; + overflow-y: auto; + opacity: 0; + position: absolute; + z-index: 999; + will-change: width, height; +} + +.dropdown-content li { + clear: both; + color: rgba(0, 0, 0, 0.87); + cursor: pointer; + min-height: 50px; + line-height: 1.5rem; + width: 100%; + text-align: left; + text-transform: none; +} + +.dropdown-content li:hover, .dropdown-content li.active, .dropdown-content li.selected { + background-color: #eee; +} + +.dropdown-content li.active.selected { + background-color: #e1e1e1; +} + +.dropdown-content li.divider { + min-height: 0; + height: 1px; +} + +.dropdown-content li > a, .dropdown-content li > span { + font-size: 16px; + color: #26a69a; + display: block; + line-height: 22px; + padding: 14px 16px; +} + +.dropdown-content li > span > label { + top: 1px; + left: 0; + height: 18px; +} + +.dropdown-content li > a > i { + height: inherit; + line-height: inherit; + float: left; + margin: 0 24px 0 0; + width: 24px; +} + +.input-field.col .dropdown-content [type="checkbox"] + label { + top: 1px; + left: 0; + height: 18px; +} + +/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */ +.waves-effect { + position: relative; + cursor: pointer; + display: inline-block; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + vertical-align: middle; + z-index: 1; + transition: .3s ease-out; +} + +.waves-effect .waves-ripple { + position: absolute; + border-radius: 50%; + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + opacity: 0; + background: rgba(0, 0, 0, 0.2); + transition: all 0.7s ease-out; + transition-property: opacity, -webkit-transform; + transition-property: transform, opacity; + transition-property: transform, opacity, -webkit-transform; + -webkit-transform: scale(0); + transform: scale(0); + pointer-events: none; +} + +.waves-effect.waves-light .waves-ripple { + background-color: rgba(255, 255, 255, 0.45); +} + +.waves-effect.waves-red .waves-ripple { + background-color: rgba(244, 67, 54, 0.7); +} + +.waves-effect.waves-yellow .waves-ripple { + background-color: rgba(255, 235, 59, 0.7); +} + +.waves-effect.waves-orange .waves-ripple { + background-color: rgba(255, 152, 0, 0.7); +} + +.waves-effect.waves-purple .waves-ripple { + background-color: rgba(156, 39, 176, 0.7); +} + +.waves-effect.waves-green .waves-ripple { + background-color: rgba(76, 175, 80, 0.7); +} + +.waves-effect.waves-teal .waves-ripple { + background-color: rgba(0, 150, 136, 0.7); +} + +.waves-effect input[type="button"], .waves-effect input[type="reset"], .waves-effect input[type="submit"] { + border: 0; + font-style: normal; + font-size: inherit; + text-transform: inherit; + background: none; +} + +.waves-effect img { + position: relative; + z-index: -1; +} + +.waves-notransition { + transition: none !important; +} + +.waves-circle { + -webkit-transform: translateZ(0); + transform: translateZ(0); + -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); +} + +.waves-input-wrapper { + border-radius: 0.2em; + vertical-align: bottom; +} + +.waves-input-wrapper .waves-button-input { + position: relative; + top: 0; + left: 0; + z-index: 1; +} + +.waves-circle { + text-align: center; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; + border-radius: 50%; + -webkit-mask-image: none; +} + +.waves-block { + display: block; +} + +/* Firefox Bug: link not triggered */ +.waves-effect .waves-ripple { + z-index: -1; +} + +.modal { + display: none; + position: fixed; + left: 0; + right: 0; + background-color: #fafafa; + padding: 0; + max-height: 70%; + width: 55%; + margin: auto; + overflow-y: auto; + border-radius: 2px; + will-change: top, opacity; +} + +@media only screen and (max-width: 992px) { + .modal { + width: 80%; + } +} + +.modal h1, .modal h2, .modal h3, .modal h4 { + margin-top: 0; +} + +.modal .modal-content { + padding: 24px; +} + +.modal .modal-close { + cursor: pointer; +} + +.modal .modal-footer { + border-radius: 0 0 2px 2px; + background-color: #fafafa; + padding: 4px 6px; + height: 56px; + width: 100%; +} + +.modal .modal-footer .btn, .modal .modal-footer .btn-large, .modal .modal-footer .btn-flat { + float: right; + margin: 6px 0; +} + +.modal-overlay { + position: fixed; + z-index: 999; + top: -100px; + left: 0; + bottom: 0; + right: 0; + height: 125%; + width: 100%; + background: #000; + display: none; + will-change: opacity; +} + +.modal.modal-fixed-footer { + padding: 0; + height: 70%; +} + +.modal.modal-fixed-footer .modal-content { + position: absolute; + height: calc(100% - 56px); + max-height: 100%; + width: 100%; + overflow-y: auto; +} + +.modal.modal-fixed-footer .modal-footer { + border-top: 1px solid rgba(0, 0, 0, 0.1); + position: absolute; + bottom: 0; +} + +.modal.bottom-sheet { + top: auto; + bottom: -100%; + margin: 0; + width: 100%; + max-height: 45%; + border-radius: 0; + will-change: bottom, opacity; +} + +.collapsible { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; + border-left: 1px solid #ddd; + margin: 0.5rem 0 1rem 0; +} + +.collapsible-header { + display: block; + cursor: pointer; + min-height: 3rem; + line-height: 3rem; + padding: 0 1rem; + background-color: #fff; + border-bottom: 1px solid #ddd; +} + +.collapsible-header i { + width: 2rem; + font-size: 1.6rem; + line-height: 3rem; + display: block; + float: left; + text-align: center; + margin-right: 1rem; +} + +.collapsible-body { + display: none; + border-bottom: 1px solid #ddd; + box-sizing: border-box; + padding: 2rem; +} + +.side-nav .collapsible, +.side-nav.fixed .collapsible { + border: none; + box-shadow: none; +} + +.side-nav .collapsible li, +.side-nav.fixed .collapsible li { + padding: 0; +} + +.side-nav .collapsible-header, +.side-nav.fixed .collapsible-header { + background-color: transparent; + border: none; + line-height: inherit; + height: inherit; + padding: 0 16px; +} + +.side-nav .collapsible-header:hover, +.side-nav.fixed .collapsible-header:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.side-nav .collapsible-header i, +.side-nav.fixed .collapsible-header i { + line-height: inherit; +} + +.side-nav .collapsible-body, +.side-nav.fixed .collapsible-body { + border: 0; + background-color: #fff; +} + +.side-nav .collapsible-body li a, +.side-nav.fixed .collapsible-body li a { + padding: 0 23.5px 0 31px; +} + +.collapsible.popout { + border: none; + box-shadow: none; +} + +.collapsible.popout > li { + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + margin: 0 24px; + transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); +} + +.collapsible.popout > li.active { + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); + margin: 16px 0; +} + +.chip { + display: inline-block; + height: 32px; + font-size: 13px; + font-weight: 500; + color: rgba(0, 0, 0, 0.6); + line-height: 32px; + padding: 0 12px; + border-radius: 16px; + background-color: #e4e4e4; + margin-bottom: 5px; + margin-right: 5px; +} + +.chip > img { + float: left; + margin: 0 8px 0 -12px; + height: 32px; + width: 32px; + border-radius: 50%; +} + +.chip .close { + cursor: pointer; + float: right; + font-size: 16px; + line-height: 32px; + padding-left: 8px; +} + +.chips { + border: none; + border-bottom: 1px solid #9e9e9e; + box-shadow: none; + margin: 0 0 20px 0; + min-height: 45px; + outline: none; + transition: all .3s; +} + +.chips.focus { + border-bottom: 1px solid #26a69a; + box-shadow: 0 1px 0 0 #26a69a; +} + +.chips:hover { + cursor: text; +} + +.chips .chip.selected { + background-color: #26a69a; + color: #fff; +} + +.chips .input { + background: none; + border: 0; + color: rgba(0, 0, 0, 0.6); + display: inline-block; + font-size: 1rem; + height: 3rem; + line-height: 32px; + outline: 0; + margin: 0; + padding: 0 !important; + width: 120px !important; +} + +.chips .input:focus { + border: 0 !important; + box-shadow: none !important; +} + +.chips .autocomplete-content { + margin-top: 0; +} + +.prefix ~ .chips { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.chips:empty ~ label { + font-size: 0.8rem; + -webkit-transform: translateY(-140%); + transform: translateY(-140%); +} + +.materialboxed { + display: block; + cursor: -webkit-zoom-in; + cursor: zoom-in; + position: relative; + transition: opacity .4s; + -webkit-backface-visibility: hidden; +} + +.materialboxed:hover:not(.active) { + opacity: .8; +} + +.materialboxed.active { + cursor: -webkit-zoom-out; + cursor: zoom-out; +} + +#materialbox-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #292929; + z-index: 1000; + will-change: opacity; +} + +.materialbox-caption { + position: fixed; + display: none; + color: #fff; + line-height: 50px; + bottom: 0; + left: 0; + width: 100%; + text-align: center; + padding: 0% 15%; + height: 50px; + z-index: 1000; + -webkit-font-smoothing: antialiased; +} + +select:focus { + outline: 1px solid #c9f3ef; +} + +button:focus { + outline: none; + background-color: #2ab7a9; +} + +label { + font-size: 0.8rem; + color: #9e9e9e; +} + +/* Text Inputs + Textarea + ========================================================================== */ +/* Style Placeholders */ +::-webkit-input-placeholder { + color: #d1d1d1; +} + +:-moz-placeholder { + /* Firefox 18- */ + color: #d1d1d1; +} + +::-moz-placeholder { + /* Firefox 19+ */ + color: #d1d1d1; +} + +:-ms-input-placeholder { + color: #d1d1d1; +} + +/* Text inputs */ +input:not([type]), +input[type=text], +input[type=password], +input[type=email], +input[type=url], +input[type=time], +input[type=date], +input[type=datetime], +input[type=datetime-local], +input[type=tel], +input[type=number], +input[type=search], +textarea.materialize-textarea { + background-color: transparent; + border: none; + border-bottom: 1px solid #9e9e9e; + border-radius: 0; + outline: none; + height: 3rem; + width: 100%; + font-size: 1rem; + margin: 0 0 20px 0; + padding: 0; + box-shadow: none; + box-sizing: content-box; + transition: all 0.3s; +} + +input:not([type]):disabled, input:not([type])[readonly="readonly"], +input[type=text]:disabled, +input[type=text][readonly="readonly"], +input[type=password]:disabled, +input[type=password][readonly="readonly"], +input[type=email]:disabled, +input[type=email][readonly="readonly"], +input[type=url]:disabled, +input[type=url][readonly="readonly"], +input[type=time]:disabled, +input[type=time][readonly="readonly"], +input[type=date]:disabled, +input[type=date][readonly="readonly"], +input[type=datetime]:disabled, +input[type=datetime][readonly="readonly"], +input[type=datetime-local]:disabled, +input[type=datetime-local][readonly="readonly"], +input[type=tel]:disabled, +input[type=tel][readonly="readonly"], +input[type=number]:disabled, +input[type=number][readonly="readonly"], +input[type=search]:disabled, +input[type=search][readonly="readonly"], +textarea.materialize-textarea:disabled, +textarea.materialize-textarea[readonly="readonly"] { + color: rgba(0, 0, 0, 0.26); + border-bottom: 1px dotted rgba(0, 0, 0, 0.26); +} + +input:not([type]):disabled + label, +input:not([type])[readonly="readonly"] + label, +input[type=text]:disabled + label, +input[type=text][readonly="readonly"] + label, +input[type=password]:disabled + label, +input[type=password][readonly="readonly"] + label, +input[type=email]:disabled + label, +input[type=email][readonly="readonly"] + label, +input[type=url]:disabled + label, +input[type=url][readonly="readonly"] + label, +input[type=time]:disabled + label, +input[type=time][readonly="readonly"] + label, +input[type=date]:disabled + label, +input[type=date][readonly="readonly"] + label, +input[type=datetime]:disabled + label, +input[type=datetime][readonly="readonly"] + label, +input[type=datetime-local]:disabled + label, +input[type=datetime-local][readonly="readonly"] + label, +input[type=tel]:disabled + label, +input[type=tel][readonly="readonly"] + label, +input[type=number]:disabled + label, +input[type=number][readonly="readonly"] + label, +input[type=search]:disabled + label, +input[type=search][readonly="readonly"] + label, +textarea.materialize-textarea:disabled + label, +textarea.materialize-textarea[readonly="readonly"] + label { + color: rgba(0, 0, 0, 0.26); +} + +input:not([type]):focus:not([readonly]), +input[type=text]:focus:not([readonly]), +input[type=password]:focus:not([readonly]), +input[type=email]:focus:not([readonly]), +input[type=url]:focus:not([readonly]), +input[type=time]:focus:not([readonly]), +input[type=date]:focus:not([readonly]), +input[type=datetime]:focus:not([readonly]), +input[type=datetime-local]:focus:not([readonly]), +input[type=tel]:focus:not([readonly]), +input[type=number]:focus:not([readonly]), +input[type=search]:focus:not([readonly]), +textarea.materialize-textarea:focus:not([readonly]) { + border-bottom: 1px solid #26a69a; + box-shadow: 0 1px 0 0 #26a69a; +} + +input:not([type]):focus:not([readonly]) + label, +input[type=text]:focus:not([readonly]) + label, +input[type=password]:focus:not([readonly]) + label, +input[type=email]:focus:not([readonly]) + label, +input[type=url]:focus:not([readonly]) + label, +input[type=time]:focus:not([readonly]) + label, +input[type=date]:focus:not([readonly]) + label, +input[type=datetime]:focus:not([readonly]) + label, +input[type=datetime-local]:focus:not([readonly]) + label, +input[type=tel]:focus:not([readonly]) + label, +input[type=number]:focus:not([readonly]) + label, +input[type=search]:focus:not([readonly]) + label, +textarea.materialize-textarea:focus:not([readonly]) + label { + color: #26a69a; +} + +input:not([type]).valid, input:not([type]):focus.valid, +input[type=text].valid, +input[type=text]:focus.valid, +input[type=password].valid, +input[type=password]:focus.valid, +input[type=email].valid, +input[type=email]:focus.valid, +input[type=url].valid, +input[type=url]:focus.valid, +input[type=time].valid, +input[type=time]:focus.valid, +input[type=date].valid, +input[type=date]:focus.valid, +input[type=datetime].valid, +input[type=datetime]:focus.valid, +input[type=datetime-local].valid, +input[type=datetime-local]:focus.valid, +input[type=tel].valid, +input[type=tel]:focus.valid, +input[type=number].valid, +input[type=number]:focus.valid, +input[type=search].valid, +input[type=search]:focus.valid, +textarea.materialize-textarea.valid, +textarea.materialize-textarea:focus.valid { + border-bottom: 1px solid #4CAF50; + box-shadow: 0 1px 0 0 #4CAF50; +} + +input:not([type]).valid + label:after, +input:not([type]):focus.valid + label:after, +input[type=text].valid + label:after, +input[type=text]:focus.valid + label:after, +input[type=password].valid + label:after, +input[type=password]:focus.valid + label:after, +input[type=email].valid + label:after, +input[type=email]:focus.valid + label:after, +input[type=url].valid + label:after, +input[type=url]:focus.valid + label:after, +input[type=time].valid + label:after, +input[type=time]:focus.valid + label:after, +input[type=date].valid + label:after, +input[type=date]:focus.valid + label:after, +input[type=datetime].valid + label:after, +input[type=datetime]:focus.valid + label:after, +input[type=datetime-local].valid + label:after, +input[type=datetime-local]:focus.valid + label:after, +input[type=tel].valid + label:after, +input[type=tel]:focus.valid + label:after, +input[type=number].valid + label:after, +input[type=number]:focus.valid + label:after, +input[type=search].valid + label:after, +input[type=search]:focus.valid + label:after, +textarea.materialize-textarea.valid + label:after, +textarea.materialize-textarea:focus.valid + label:after { + content: attr(data-success); + color: #4CAF50; + opacity: 1; +} + +input:not([type]).invalid, input:not([type]):focus.invalid, +input[type=text].invalid, +input[type=text]:focus.invalid, +input[type=password].invalid, +input[type=password]:focus.invalid, +input[type=email].invalid, +input[type=email]:focus.invalid, +input[type=url].invalid, +input[type=url]:focus.invalid, +input[type=time].invalid, +input[type=time]:focus.invalid, +input[type=date].invalid, +input[type=date]:focus.invalid, +input[type=datetime].invalid, +input[type=datetime]:focus.invalid, +input[type=datetime-local].invalid, +input[type=datetime-local]:focus.invalid, +input[type=tel].invalid, +input[type=tel]:focus.invalid, +input[type=number].invalid, +input[type=number]:focus.invalid, +input[type=search].invalid, +input[type=search]:focus.invalid, +textarea.materialize-textarea.invalid, +textarea.materialize-textarea:focus.invalid { + border-bottom: 1px solid #F44336; + box-shadow: 0 1px 0 0 #F44336; +} + +input:not([type]).invalid + label:after, +input:not([type]):focus.invalid + label:after, +input[type=text].invalid + label:after, +input[type=text]:focus.invalid + label:after, +input[type=password].invalid + label:after, +input[type=password]:focus.invalid + label:after, +input[type=email].invalid + label:after, +input[type=email]:focus.invalid + label:after, +input[type=url].invalid + label:after, +input[type=url]:focus.invalid + label:after, +input[type=time].invalid + label:after, +input[type=time]:focus.invalid + label:after, +input[type=date].invalid + label:after, +input[type=date]:focus.invalid + label:after, +input[type=datetime].invalid + label:after, +input[type=datetime]:focus.invalid + label:after, +input[type=datetime-local].invalid + label:after, +input[type=datetime-local]:focus.invalid + label:after, +input[type=tel].invalid + label:after, +input[type=tel]:focus.invalid + label:after, +input[type=number].invalid + label:after, +input[type=number]:focus.invalid + label:after, +input[type=search].invalid + label:after, +input[type=search]:focus.invalid + label:after, +textarea.materialize-textarea.invalid + label:after, +textarea.materialize-textarea:focus.invalid + label:after { + content: attr(data-error); + color: #F44336; + opacity: 1; +} + +input:not([type]).validate + label, +input[type=text].validate + label, +input[type=password].validate + label, +input[type=email].validate + label, +input[type=url].validate + label, +input[type=time].validate + label, +input[type=date].validate + label, +input[type=datetime].validate + label, +input[type=datetime-local].validate + label, +input[type=tel].validate + label, +input[type=number].validate + label, +input[type=search].validate + label, +textarea.materialize-textarea.validate + label { + width: 100%; + pointer-events: none; +} + +input:not([type]) + label:after, +input[type=text] + label:after, +input[type=password] + label:after, +input[type=email] + label:after, +input[type=url] + label:after, +input[type=time] + label:after, +input[type=date] + label:after, +input[type=datetime] + label:after, +input[type=datetime-local] + label:after, +input[type=tel] + label:after, +input[type=number] + label:after, +input[type=search] + label:after, +textarea.materialize-textarea + label:after { + display: block; + content: ""; + position: absolute; + top: 60px; + opacity: 0; + transition: .2s opacity ease-out, .2s color ease-out; +} + +.input-field { + position: relative; + margin-top: 1rem; +} + +.input-field.inline { + display: inline-block; + vertical-align: middle; + margin-left: 5px; +} + +.input-field.inline input, +.input-field.inline .select-dropdown { + margin-bottom: 1rem; +} + +.input-field.col label { + left: 0.75rem; +} + +.input-field.col .prefix ~ label, +.input-field.col .prefix ~ .validate ~ label { + width: calc(100% - 3rem - 1.5rem); +} + +.input-field label { + color: #9e9e9e; + position: absolute; + top: 0.8rem; + left: 0; + font-size: 1rem; + cursor: text; + transition: .2s ease-out; + text-align: initial; +} + +.input-field label:not(.label-icon).active { + font-size: 0.8rem; + -webkit-transform: translateY(-140%); + transform: translateY(-140%); +} + +.input-field .prefix { + position: absolute; + width: 3rem; + font-size: 2rem; + transition: color .2s; +} + +.input-field .prefix.active { + color: #26a69a; +} + +.input-field .prefix ~ input, +.input-field .prefix ~ textarea, +.input-field .prefix ~ label, +.input-field .prefix ~ .validate ~ label, +.input-field .prefix ~ .autocomplete-content { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.input-field .prefix ~ label { + margin-left: 3rem; +} + +@media only screen and (max-width: 992px) { + .input-field .prefix ~ input { + width: 86%; + width: calc(100% - 3rem); + } +} + +@media only screen and (max-width: 600px) { + .input-field .prefix ~ input { + width: 80%; + width: calc(100% - 3rem); + } +} + +/* Search Field */ +.input-field input[type=search] { + display: block; + line-height: inherit; + padding-left: 4rem; + width: calc(100% - 4rem); +} + +.input-field input[type=search]:focus { + background-color: #fff; + border: 0; + box-shadow: none; + color: #444; +} + +.input-field input[type=search]:focus + label i, +.input-field input[type=search]:focus ~ .mdi-navigation-close, +.input-field input[type=search]:focus ~ .material-icons { + color: #444; +} + +.input-field input[type=search] + label { + left: 1rem; +} + +.input-field input[type=search] ~ .mdi-navigation-close, +.input-field input[type=search] ~ .material-icons { + position: absolute; + top: 0; + right: 1rem; + color: transparent; + cursor: pointer; + font-size: 2rem; + transition: .3s color; +} + +/* Textarea */ +textarea { + width: 100%; + height: 3rem; + background-color: transparent; +} + +textarea.materialize-textarea { + overflow-y: hidden; + /* prevents scroll bar flash */ + padding: .8rem 0 1.6rem 0; + /* prevents text jump on Enter keypress */ + resize: none; + min-height: 3rem; +} + +.hiddendiv { + display: none; + white-space: pre-wrap; + word-wrap: break-word; + overflow-wrap: break-word; + /* future version of deprecated 'word-wrap' */ + padding-top: 1.2rem; + /* prevents text jump on Enter keypress */ + position: absolute; + top: 0; +} + +/* Autocomplete */ +.autocomplete-content { + margin-top: -20px; + display: block; + opacity: 1; + position: static; +} + +.autocomplete-content li .highlight { + color: #444; +} + +.autocomplete-content li img { + height: 40px; + width: 40px; + margin: 5px 15px; +} + +/* Radio Buttons + ========================================================================== */ +[type="radio"]:not(:checked), +[type="radio"]:checked { + position: absolute; + left: -9999px; + opacity: 0; +} + +[type="radio"]:not(:checked) + label, +[type="radio"]:checked + label { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + transition: .28s ease; + /* webkit (konqueror) browsers */ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +[type="radio"] + label:before, +[type="radio"] + label:after { + content: ''; + position: absolute; + left: 0; + top: 0; + margin: 4px; + width: 16px; + height: 16px; + z-index: 0; + transition: .28s ease; +} + +/* Unchecked styles */ +[type="radio"]:not(:checked) + label:before, +[type="radio"]:not(:checked) + label:after, +[type="radio"]:checked + label:before, +[type="radio"]:checked + label:after, +[type="radio"].with-gap:checked + label:before, +[type="radio"].with-gap:checked + label:after { + border-radius: 50%; +} + +[type="radio"]:not(:checked) + label:before, +[type="radio"]:not(:checked) + label:after { + border: 2px solid #5a5a5a; +} + +[type="radio"]:not(:checked) + label:after { + -webkit-transform: scale(0); + transform: scale(0); +} + +/* Checked styles */ +[type="radio"]:checked + label:before { + border: 2px solid transparent; +} + +[type="radio"]:checked + label:after, +[type="radio"].with-gap:checked + label:before, +[type="radio"].with-gap:checked + label:after { + border: 2px solid #26a69a; +} + +[type="radio"]:checked + label:after, +[type="radio"].with-gap:checked + label:after { + background-color: #26a69a; +} + +[type="radio"]:checked + label:after { + -webkit-transform: scale(1.02); + transform: scale(1.02); +} + +/* Radio With gap */ +[type="radio"].with-gap:checked + label:after { + -webkit-transform: scale(0.5); + transform: scale(0.5); +} + +/* Focused styles */ +[type="radio"].tabbed:focus + label:before { + box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); +} + +/* Disabled Radio With gap */ +[type="radio"].with-gap:disabled:checked + label:before { + border: 2px solid rgba(0, 0, 0, 0.26); +} + +[type="radio"].with-gap:disabled:checked + label:after { + border: none; + background-color: rgba(0, 0, 0, 0.26); +} + +/* Disabled style */ +[type="radio"]:disabled:not(:checked) + label:before, +[type="radio"]:disabled:checked + label:before { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.26); +} + +[type="radio"]:disabled + label { + color: rgba(0, 0, 0, 0.26); +} + +[type="radio"]:disabled:not(:checked) + label:before { + border-color: rgba(0, 0, 0, 0.26); +} + +[type="radio"]:disabled:checked + label:after { + background-color: rgba(0, 0, 0, 0.26); + border-color: #BDBDBD; +} + +/* Checkboxes + ========================================================================== */ +/* CUSTOM CSS CHECKBOXES */ +form p { + margin-bottom: 10px; + text-align: left; +} + +form p:last-child { + margin-bottom: 0; +} + +/* Remove default checkbox */ +[type="checkbox"]:not(:checked), +[type="checkbox"]:checked { + position: absolute; + left: -9999px; + opacity: 0; +} + +[type="checkbox"] { + /* checkbox aspect */ +} + +[type="checkbox"] + label { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + -webkit-user-select: none; + /* webkit (safari, chrome) browsers */ + -moz-user-select: none; + /* mozilla browsers */ + -khtml-user-select: none; + /* webkit (konqueror) browsers */ + -ms-user-select: none; + /* IE10+ */ +} + +[type="checkbox"] + label:before, +[type="checkbox"]:not(.filled-in) + label:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 18px; + z-index: 0; + border: 2px solid #5a5a5a; + border-radius: 1px; + margin-top: 2px; + transition: .2s; +} + +[type="checkbox"]:not(.filled-in) + label:after { + border: 0; + -webkit-transform: scale(0); + transform: scale(0); +} + +[type="checkbox"]:not(:checked):disabled + label:before { + border: none; + background-color: rgba(0, 0, 0, 0.26); +} + +[type="checkbox"].tabbed:focus + label:after { + -webkit-transform: scale(1); + transform: scale(1); + border: 0; + border-radius: 50%; + box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); + background-color: rgba(0, 0, 0, 0.1); +} + +[type="checkbox"]:checked + label:before { + top: -4px; + left: -5px; + width: 12px; + height: 22px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #26a69a; + border-bottom: 2px solid #26a69a; + -webkit-transform: rotate(40deg); + transform: rotate(40deg); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"]:checked:disabled + label:before { + border-right: 2px solid rgba(0, 0, 0, 0.26); + border-bottom: 2px solid rgba(0, 0, 0, 0.26); +} + +/* Indeterminate checkbox */ +[type="checkbox"]:indeterminate + label:before { + top: -11px; + left: -12px; + width: 10px; + height: 22px; + border-top: none; + border-left: none; + border-right: 2px solid #26a69a; + border-bottom: none; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"]:indeterminate:disabled + label:before { + border-right: 2px solid rgba(0, 0, 0, 0.26); + background-color: transparent; +} + +[type="checkbox"].filled-in + label:after { + border-radius: 2px; +} + +[type="checkbox"].filled-in + label:before, +[type="checkbox"].filled-in + label:after { + content: ''; + left: 0; + position: absolute; + /* .1s delay is for check animation */ + transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; + z-index: 1; +} + +[type="checkbox"].filled-in:not(:checked) + label:before { + width: 0; + height: 0; + border: 3px solid transparent; + left: 6px; + top: 10px; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 20% 40%; + transform-origin: 100% 100%; +} + +[type="checkbox"].filled-in:not(:checked) + label:after { + height: 20px; + width: 20px; + background-color: transparent; + border: 2px solid #5a5a5a; + top: 0px; + z-index: 0; +} + +[type="checkbox"].filled-in:checked + label:before { + top: 0; + left: 1px; + width: 8px; + height: 13px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #fff; + border-bottom: 2px solid #fff; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"].filled-in:checked + label:after { + top: 0; + width: 20px; + height: 20px; + border: 2px solid #26a69a; + background-color: #26a69a; + z-index: 0; +} + +[type="checkbox"].filled-in.tabbed:focus + label:after { + border-radius: 2px; + border-color: #5a5a5a; + background-color: rgba(0, 0, 0, 0.1); +} + +[type="checkbox"].filled-in.tabbed:checked:focus + label:after { + border-radius: 2px; + background-color: #26a69a; + border-color: #26a69a; +} + +[type="checkbox"].filled-in:disabled:not(:checked) + label:before { + background-color: transparent; + border: 2px solid transparent; +} + +[type="checkbox"].filled-in:disabled:not(:checked) + label:after { + border-color: transparent; + background-color: #BDBDBD; +} + +[type="checkbox"].filled-in:disabled:checked + label:before { + background-color: transparent; +} + +[type="checkbox"].filled-in:disabled:checked + label:after { + background-color: #BDBDBD; + border-color: #BDBDBD; +} + +/* Switch + ========================================================================== */ +.switch, +.switch * { + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -ms-user-select: none; +} + +.switch label { + cursor: pointer; +} + +.switch label input[type=checkbox] { + opacity: 0; + width: 0; + height: 0; +} + +.switch label input[type=checkbox]:checked + .lever { + background-color: #84c7c1; +} + +.switch label input[type=checkbox]:checked + .lever:after { + background-color: #26a69a; + left: 24px; +} + +.switch label .lever { + content: ""; + display: inline-block; + position: relative; + width: 40px; + height: 15px; + background-color: #818181; + border-radius: 15px; + margin-right: 10px; + transition: background 0.3s ease; + vertical-align: middle; + margin: 0 16px; +} + +.switch label .lever:after { + content: ""; + position: absolute; + display: inline-block; + width: 21px; + height: 21px; + background-color: #F1F1F1; + border-radius: 21px; + box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4); + left: -5px; + top: -3px; + transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease; +} + +input[type=checkbox]:checked:not(:disabled) ~ .lever:active::after, +input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::after { + box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(38, 166, 154, 0.1); +} + +input[type=checkbox]:not(:disabled) ~ .lever:active:after, +input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::after { + box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(0, 0, 0, 0.08); +} + +.switch input[type=checkbox][disabled] + .lever { + cursor: default; +} + +.switch label input[type=checkbox][disabled] + .lever:after, +.switch label input[type=checkbox][disabled]:checked + .lever:after { + background-color: #BDBDBD; +} + +/* Select Field + ========================================================================== */ +select { + display: none; +} + +select.browser-default { + display: block; +} + +select { + background-color: rgba(255, 255, 255, 0.9); + width: 100%; + padding: 5px; + border: 1px solid #f2f2f2; + border-radius: 2px; + height: 3rem; +} + +.select-label { + position: absolute; +} + +.select-wrapper { + position: relative; +} + +.select-wrapper input.select-dropdown { + position: relative; + cursor: pointer; + background-color: transparent; + border: none; + border-bottom: 1px solid #9e9e9e; + outline: none; + height: 3rem; + line-height: 3rem; + width: 100%; + font-size: 1rem; + margin: 0 0 20px 0; + padding: 0; + display: block; +} + +.select-wrapper span.caret { + color: initial; + position: absolute; + right: 0; + top: 0; + bottom: 0; + height: 10px; + margin: auto 0; + font-size: 10px; + line-height: 10px; +} + +.select-wrapper span.caret.disabled { + color: rgba(0, 0, 0, 0.26); +} + +.select-wrapper + label { + position: absolute; + top: -14px; + font-size: 0.8rem; +} + +select:disabled { + color: rgba(0, 0, 0, 0.3); +} + +.select-wrapper input.select-dropdown:disabled { + color: rgba(0, 0, 0, 0.3); + cursor: default; + -webkit-user-select: none; + /* webkit (safari, chrome) browsers */ + -moz-user-select: none; + /* mozilla browsers */ + -ms-user-select: none; + /* IE10+ */ + border-bottom: 1px solid rgba(0, 0, 0, 0.3); +} + +.select-wrapper i { + color: rgba(0, 0, 0, 0.3); +} + +.select-dropdown li.disabled, +.select-dropdown li.disabled > span, +.select-dropdown li.optgroup { + color: rgba(0, 0, 0, 0.3); + background-color: transparent; +} + +.prefix ~ .select-wrapper { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.prefix ~ label { + margin-left: 3rem; +} + +.select-dropdown li img { + height: 40px; + width: 40px; + margin: 5px 15px; + float: right; +} + +.select-dropdown li.optgroup { + border-top: 1px solid #eee; +} + +.select-dropdown li.optgroup.selected > span { + color: rgba(0, 0, 0, 0.7); +} + +.select-dropdown li.optgroup > span { + color: rgba(0, 0, 0, 0.4); +} + +.select-dropdown li.optgroup ~ li.optgroup-option { + padding-left: 1rem; +} + +/* File Input + ========================================================================== */ +.file-field { + position: relative; +} + +.file-field .file-path-wrapper { + overflow: hidden; + padding-left: 10px; +} + +.file-field input.file-path { + width: 100%; +} + +.file-field .btn, .file-field .btn-large { + float: left; + height: 3rem; + line-height: 3rem; +} + +.file-field span { + cursor: pointer; +} + +.file-field input[type=file] { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + width: 100%; + margin: 0; + padding: 0; + font-size: 20px; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); +} + +/* Range + ========================================================================== */ +.range-field { + position: relative; +} + +input[type=range], +input[type=range] + .thumb { + cursor: pointer; +} + +input[type=range] { + position: relative; + background-color: transparent; + border: none; + outline: none; + width: 100%; + margin: 15px 0; + padding: 0; +} + +input[type=range]:focus { + outline: none; +} + +input[type=range] + .thumb { + position: absolute; + top: 10px; + left: 0; + border: none; + height: 0; + width: 0; + border-radius: 50%; + background-color: #26a69a; + margin-left: 7px; + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +input[type=range] + .thumb .value { + display: block; + width: 30px; + text-align: center; + color: #26a69a; + font-size: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +input[type=range] + .thumb.active { + border-radius: 50% 50% 50% 0; +} + +input[type=range] + .thumb.active .value { + color: #fff; + margin-left: -1px; + margin-top: 8px; + font-size: 10px; +} + +input[type=range] { + -webkit-appearance: none; +} + +input[type=range]::-webkit-slider-runnable-track { + height: 3px; + background: #c2c0c2; + border: none; +} + +input[type=range]::-webkit-slider-thumb { + -webkit-appearance: none; + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background-color: #26a69a; + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + margin: -5px 0 0 0; + transition: .3s; +} + +input[type=range]:focus::-webkit-slider-runnable-track { + background: #ccc; +} + +input[type=range] { + /* fix for FF unable to apply focus style bug */ + border: 1px solid white; + /*required for proper track sizing in FF*/ +} + +input[type=range]::-moz-range-track { + height: 3px; + background: #ddd; + border: none; +} + +input[type=range]::-moz-range-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #26a69a; + margin-top: -5px; +} + +input[type=range]:-moz-focusring { + outline: 1px solid #fff; + outline-offset: -1px; +} + +input[type=range]:focus::-moz-range-track { + background: #ccc; +} + +input[type=range]::-ms-track { + height: 3px; + background: transparent; + border-color: transparent; + border-width: 6px 0; + /*remove default tick marks*/ + color: transparent; +} + +input[type=range]::-ms-fill-lower { + background: #777; +} + +input[type=range]::-ms-fill-upper { + background: #ddd; +} + +input[type=range]::-ms-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #26a69a; +} + +input[type=range]:focus::-ms-fill-lower { + background: #888; +} + +input[type=range]:focus::-ms-fill-upper { + background: #ccc; +} + +/*************** + Nav List +***************/ +.table-of-contents.fixed { + position: fixed; +} + +.table-of-contents li { + padding: 2px 0; +} + +.table-of-contents a { + display: inline-block; + font-weight: 300; + color: #757575; + padding-left: 20px; + height: 1.5rem; + line-height: 1.5rem; + letter-spacing: .4; + display: inline-block; +} + +.table-of-contents a:hover { + color: #a8a8a8; + padding-left: 19px; + border-left: 1px solid #ee6e73; +} + +.table-of-contents a.active { + font-weight: 500; + padding-left: 18px; + border-left: 2px solid #ee6e73; +} + +.side-nav { + position: fixed; + width: 300px; + left: 0; + top: 0; + margin: 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + height: 100%; + height: calc(100% + 60px); + height: -moz-calc(100%); + padding-bottom: 60px; + background-color: #fff; + z-index: 999; + overflow-y: auto; + will-change: transform; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform: translateX(-105%); + transform: translateX(-105%); +} + +.side-nav.right-aligned { + right: 0; + -webkit-transform: translateX(105%); + transform: translateX(105%); + left: auto; + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.side-nav .collapsible { + margin: 0; +} + +.side-nav li { + float: none; + line-height: 48px; +} + +.side-nav li.active { + background-color: rgba(0, 0, 0, 0.05); +} + +.side-nav li > a { + color: rgba(0, 0, 0, 0.87); + display: block; + font-size: 14px; + font-weight: 500; + height: 48px; + line-height: 48px; + padding: 0 32px; +} + +.side-nav li > a:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.side-nav li > a.btn, .side-nav li > a.btn-large, .side-nav li > a.btn-large, .side-nav li > a.btn-flat, .side-nav li > a.btn-floating { + margin: 10px 15px; +} + +.side-nav li > a.btn, .side-nav li > a.btn-large, .side-nav li > a.btn-large, .side-nav li > a.btn-floating { + color: #fff; +} + +.side-nav li > a.btn-flat { + color: #343434; +} + +.side-nav li > a.btn:hover, .side-nav li > a.btn-large:hover, .side-nav li > a.btn-large:hover { + background-color: #2bbbad; +} + +.side-nav li > a.btn-floating:hover { + background-color: #26a69a; +} + +.side-nav li > a > i, +.side-nav li > a > [class^="mdi-"], .side-nav li > a li > a > [class*="mdi-"], +.side-nav li > a > i.material-icons { + float: left; + height: 48px; + line-height: 48px; + margin: 0 32px 0 0; + width: 24px; + color: rgba(0, 0, 0, 0.54); +} + +.side-nav .divider { + margin: 8px 0 0 0; +} + +.side-nav .subheader { + cursor: initial; + pointer-events: none; + color: rgba(0, 0, 0, 0.54); + font-size: 14px; + font-weight: 500; + line-height: 48px; +} + +.side-nav .subheader:hover { + background-color: transparent; +} + +.side-nav .userView { + position: relative; + padding: 32px 32px 0; + margin-bottom: 8px; +} + +.side-nav .userView > a { + height: auto; + padding: 0; +} + +.side-nav .userView > a:hover { + background-color: transparent; +} + +.side-nav .userView .background { + overflow: hidden; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; +} + +.side-nav .userView .circle, .side-nav .userView .name, .side-nav .userView .email { + display: block; +} + +.side-nav .userView .circle { + height: 64px; + width: 64px; +} + +.side-nav .userView .name, +.side-nav .userView .email { + font-size: 14px; + line-height: 24px; +} + +.side-nav .userView .name { + margin-top: 16px; + font-weight: 500; +} + +.side-nav .userView .email { + padding-bottom: 16px; + font-weight: 400; +} + +.drag-target { + height: 100%; + width: 10px; + position: fixed; + top: 0; + z-index: 998; +} + +.side-nav.fixed { + left: 0; + -webkit-transform: translateX(0); + transform: translateX(0); + position: fixed; +} + +.side-nav.fixed.right-aligned { + right: 0; + left: auto; +} + +@media only screen and (max-width: 992px) { + .side-nav.fixed { + -webkit-transform: translateX(-105%); + transform: translateX(-105%); + } + .side-nav.fixed.right-aligned { + -webkit-transform: translateX(105%); + transform: translateX(105%); + } + .side-nav a { + padding: 0 16px; + } + .side-nav .userView { + padding: 16px 16px 0; + } +} + +.side-nav .collapsible-body > ul:not(.collapsible) > li.active, +.side-nav.fixed .collapsible-body > ul:not(.collapsible) > li.active { + background-color: #ee6e73; +} + +.side-nav .collapsible-body > ul:not(.collapsible) > li.active a, +.side-nav.fixed .collapsible-body > ul:not(.collapsible) > li.active a { + color: #fff; +} + +.side-nav .collapsible-body { + padding: 0; +} + +#sidenav-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 120vh; + background-color: rgba(0, 0, 0, 0.5); + z-index: 997; + will-change: opacity; +} + +/* + @license + Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + Code distributed by Google as part of the polymer project is also + subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ +/**************************/ +/* STYLES FOR THE SPINNER */ +/**************************/ +/* + * Constants: + * STROKEWIDTH = 3px + * ARCSIZE = 270 degrees (amount of circle the arc takes up) + * ARCTIME = 1333ms (time it takes to expand and contract arc) + * ARCSTARTROT = 216 degrees (how much the start location of the arc + * should rotate each time, 216 gives us a + * 5 pointed star shape (it's 360/5 * 3). + * For a 7 pointed star, we might do + * 360/7 * 3 = 154.286) + * CONTAINERWIDTH = 28px + * SHRINK_TIME = 400ms + */ +.preloader-wrapper { + display: inline-block; + position: relative; + width: 50px; + height: 50px; +} + +.preloader-wrapper.small { + width: 36px; + height: 36px; +} + +.preloader-wrapper.big { + width: 64px; + height: 64px; +} + +.preloader-wrapper.active { + /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */ + -webkit-animation: container-rotate 1568ms linear infinite; + animation: container-rotate 1568ms linear infinite; +} + +@-webkit-keyframes container-rotate { + to { + -webkit-transform: rotate(360deg); + } +} + +@keyframes container-rotate { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.spinner-layer { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + border-color: #26a69a; +} + +.spinner-blue, +.spinner-blue-only { + border-color: #4285f4; +} + +.spinner-red, +.spinner-red-only { + border-color: #db4437; +} + +.spinner-yellow, +.spinner-yellow-only { + border-color: #f4b400; +} + +.spinner-green, +.spinner-green-only { + border-color: #0f9d58; +} + +/** + * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee): + * + * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't + * guarantee that the animation will start _exactly_ after that value. So we avoid using + * animation-delay and instead set custom keyframes for each color (as redundant as it + * seems). + * + * We write out each animation in full (instead of separating animation-name, + * animation-duration, etc.) because under the polyfill, Safari does not recognize those + * specific properties properly, treats them as -webkit-animation, and overrides the + * other animation rules. See https://github.com/Polymer/platform/issues/53. + */ +.active .spinner-layer.spinner-blue { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-red { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-yellow { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-green { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer, +.active .spinner-layer.spinner-blue-only, +.active .spinner-layer.spinner-red-only, +.active .spinner-layer.spinner-yellow-only, +.active .spinner-layer.spinner-green-only { + /* durations: 4 * ARCTIME */ + opacity: 1; + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +@-webkit-keyframes fill-unfill-rotate { + 12.5% { + -webkit-transform: rotate(135deg); + } + /* 0.5 * ARCSIZE */ + 25% { + -webkit-transform: rotate(270deg); + } + /* 1 * ARCSIZE */ + 37.5% { + -webkit-transform: rotate(405deg); + } + /* 1.5 * ARCSIZE */ + 50% { + -webkit-transform: rotate(540deg); + } + /* 2 * ARCSIZE */ + 62.5% { + -webkit-transform: rotate(675deg); + } + /* 2.5 * ARCSIZE */ + 75% { + -webkit-transform: rotate(810deg); + } + /* 3 * ARCSIZE */ + 87.5% { + -webkit-transform: rotate(945deg); + } + /* 3.5 * ARCSIZE */ + to { + -webkit-transform: rotate(1080deg); + } + /* 4 * ARCSIZE */ +} + +@keyframes fill-unfill-rotate { + 12.5% { + -webkit-transform: rotate(135deg); + transform: rotate(135deg); + } + /* 0.5 * ARCSIZE */ + 25% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } + /* 1 * ARCSIZE */ + 37.5% { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + /* 1.5 * ARCSIZE */ + 50% { + -webkit-transform: rotate(540deg); + transform: rotate(540deg); + } + /* 2 * ARCSIZE */ + 62.5% { + -webkit-transform: rotate(675deg); + transform: rotate(675deg); + } + /* 2.5 * ARCSIZE */ + 75% { + -webkit-transform: rotate(810deg); + transform: rotate(810deg); + } + /* 3 * ARCSIZE */ + 87.5% { + -webkit-transform: rotate(945deg); + transform: rotate(945deg); + } + /* 3.5 * ARCSIZE */ + to { + -webkit-transform: rotate(1080deg); + transform: rotate(1080deg); + } + /* 4 * ARCSIZE */ +} + +@-webkit-keyframes blue-fade-in-out { + from { + opacity: 1; + } + 25% { + opacity: 1; + } + 26% { + opacity: 0; + } + 89% { + opacity: 0; + } + 90% { + opacity: 1; + } + 100% { + opacity: 1; + } +} + +@keyframes blue-fade-in-out { + from { + opacity: 1; + } + 25% { + opacity: 1; + } + 26% { + opacity: 0; + } + 89% { + opacity: 0; + } + 90% { + opacity: 1; + } + 100% { + opacity: 1; + } +} + +@-webkit-keyframes red-fade-in-out { + from { + opacity: 0; + } + 15% { + opacity: 0; + } + 25% { + opacity: 1; + } + 50% { + opacity: 1; + } + 51% { + opacity: 0; + } +} + +@keyframes red-fade-in-out { + from { + opacity: 0; + } + 15% { + opacity: 0; + } + 25% { + opacity: 1; + } + 50% { + opacity: 1; + } + 51% { + opacity: 0; + } +} + +@-webkit-keyframes yellow-fade-in-out { + from { + opacity: 0; + } + 40% { + opacity: 0; + } + 50% { + opacity: 1; + } + 75% { + opacity: 1; + } + 76% { + opacity: 0; + } +} + +@keyframes yellow-fade-in-out { + from { + opacity: 0; + } + 40% { + opacity: 0; + } + 50% { + opacity: 1; + } + 75% { + opacity: 1; + } + 76% { + opacity: 0; + } +} + +@-webkit-keyframes green-fade-in-out { + from { + opacity: 0; + } + 65% { + opacity: 0; + } + 75% { + opacity: 1; + } + 90% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +@keyframes green-fade-in-out { + from { + opacity: 0; + } + 65% { + opacity: 0; + } + 75% { + opacity: 1; + } + 90% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +/** + * Patch the gap that appear between the two adjacent div.circle-clipper while the + * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11). + */ +.gap-patch { + position: absolute; + top: 0; + left: 45%; + width: 10%; + height: 100%; + overflow: hidden; + border-color: inherit; +} + +.gap-patch .circle { + width: 1000%; + left: -450%; +} + +.circle-clipper { + display: inline-block; + position: relative; + width: 50%; + height: 100%; + overflow: hidden; + border-color: inherit; +} + +.circle-clipper .circle { + width: 200%; + height: 100%; + border-width: 3px; + /* STROKEWIDTH */ + border-style: solid; + border-color: inherit; + border-bottom-color: transparent !important; + border-radius: 50%; + -webkit-animation: none; + animation: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; +} + +.circle-clipper.left .circle { + left: 0; + border-right-color: transparent !important; + -webkit-transform: rotate(129deg); + transform: rotate(129deg); +} + +.circle-clipper.right .circle { + left: -100%; + border-left-color: transparent !important; + -webkit-transform: rotate(-129deg); + transform: rotate(-129deg); +} + +.active .circle-clipper.left .circle { + /* duration: ARCTIME */ + -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .circle-clipper.right .circle { + /* duration: ARCTIME */ + -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +@-webkit-keyframes left-spin { + from { + -webkit-transform: rotate(130deg); + } + 50% { + -webkit-transform: rotate(-5deg); + } + to { + -webkit-transform: rotate(130deg); + } +} + +@keyframes left-spin { + from { + -webkit-transform: rotate(130deg); + transform: rotate(130deg); + } + 50% { + -webkit-transform: rotate(-5deg); + transform: rotate(-5deg); + } + to { + -webkit-transform: rotate(130deg); + transform: rotate(130deg); + } +} + +@-webkit-keyframes right-spin { + from { + -webkit-transform: rotate(-130deg); + } + 50% { + -webkit-transform: rotate(5deg); + } + to { + -webkit-transform: rotate(-130deg); + } +} + +@keyframes right-spin { + from { + -webkit-transform: rotate(-130deg); + transform: rotate(-130deg); + } + 50% { + -webkit-transform: rotate(5deg); + transform: rotate(5deg); + } + to { + -webkit-transform: rotate(-130deg); + transform: rotate(-130deg); + } +} + +#spinnerContainer.cooldown { + /* duration: SHRINK_TIME */ + -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); + animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); +} + +@-webkit-keyframes fade-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes fade-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +.slider { + position: relative; + height: 400px; + width: 100%; +} + +.slider.fullscreen { + height: 100%; + width: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.slider.fullscreen ul.slides { + height: 100%; +} + +.slider.fullscreen ul.indicators { + z-index: 2; + bottom: 30px; +} + +.slider .slides { + background-color: #9e9e9e; + margin: 0; + height: 400px; +} + +.slider .slides li { + opacity: 0; + position: absolute; + top: 0; + left: 0; + z-index: 1; + width: 100%; + height: inherit; + overflow: hidden; +} + +.slider .slides li img { + height: 100%; + width: 100%; + background-size: cover; + background-position: center; +} + +.slider .slides li .caption { + color: #fff; + position: absolute; + top: 15%; + left: 15%; + width: 70%; + opacity: 0; +} + +.slider .slides li .caption p { + color: #e0e0e0; +} + +.slider .slides li.active { + z-index: 2; +} + +.slider .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; +} + +.slider .indicators .indicator-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 16px; + width: 16px; + margin: 0 12px; + background-color: #e0e0e0; + transition: background-color .3s; + border-radius: 50%; +} + +.slider .indicators .indicator-item.active { + background-color: #4CAF50; +} + +.carousel { + overflow: hidden; + position: relative; + width: 100%; + height: 400px; + -webkit-perspective: 500px; + perspective: 500px; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; +} + +.carousel.carousel-slider { + top: 0; + left: 0; + height: 0; +} + +.carousel.carousel-slider .carousel-fixed-item { + position: absolute; + left: 0; + right: 0; + bottom: 20px; + z-index: 1; +} + +.carousel.carousel-slider .carousel-fixed-item.with-indicators { + bottom: 68px; +} + +.carousel.carousel-slider .carousel-item { + width: 100%; + height: 100%; + min-height: 400px; + position: absolute; + top: 0; + left: 0; +} + +.carousel.carousel-slider .carousel-item h2 { + font-size: 24px; + font-weight: 500; + line-height: 32px; +} + +.carousel.carousel-slider .carousel-item p { + font-size: 15px; +} + +.carousel .carousel-item { + display: none; + width: 200px; + height: 200px; + position: absolute; + top: 0; + left: 0; +} + +.carousel .carousel-item > img { + width: 100%; +} + +.carousel .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; +} + +.carousel .indicators .indicator-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 8px; + width: 8px; + margin: 24px 4px; + background-color: rgba(255, 255, 255, 0.5); + transition: background-color .3s; + border-radius: 50%; +} + +.carousel .indicators .indicator-item.active { + background-color: #fff; +} + +.carousel.scrolling .carousel-item .materialboxed, +.carousel .carousel-item:not(.active) .materialboxed { + pointer-events: none; +} + +.tap-target-wrapper { + width: 800px; + height: 800px; + position: fixed; + z-index: 1000; + visibility: hidden; + transition: visibility 0s .3s; +} + +.tap-target-wrapper.open { + visibility: visible; + transition: visibility 0s; +} + +.tap-target-wrapper.open .tap-target { + -webkit-transform: scale(1); + transform: scale(1); + opacity: .95; + transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); +} + +.tap-target-wrapper.open .tap-target-wave::before { + -webkit-transform: scale(1); + transform: scale(1); +} + +.tap-target-wrapper.open .tap-target-wave::after { + visibility: visible; + -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + transition: opacity .3s, visibility 0s 1s, -webkit-transform .3s; + transition: opacity .3s, transform .3s, visibility 0s 1s; + transition: opacity .3s, transform .3s, visibility 0s 1s, -webkit-transform .3s; +} + +.tap-target { + position: absolute; + font-size: 1rem; + border-radius: 50%; + background-color: #ee6e73; + box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2); + width: 100%; + height: 100%; + opacity: 0; + -webkit-transform: scale(0); + transform: scale(0); + transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); +} + +.tap-target-content { + position: relative; + display: table-cell; +} + +.tap-target-wave { + position: absolute; + border-radius: 50%; + z-index: 10001; +} + +.tap-target-wave::before, .tap-target-wave::after { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #ffffff; +} + +.tap-target-wave::before { + -webkit-transform: scale(0); + transform: scale(0); + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} + +.tap-target-wave::after { + visibility: hidden; + transition: opacity .3s, visibility 0s, -webkit-transform .3s; + transition: opacity .3s, transform .3s, visibility 0s; + transition: opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s; + z-index: -1; +} + +.tap-target-origin { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + z-index: 10002; + position: absolute !important; +} + +.tap-target-origin:not(.btn):not(.btn-large), .tap-target-origin:not(.btn):not(.btn-large):hover { + background: none; +} + +@media only screen and (max-width: 600px) { + .tap-target, .tap-target-wrapper { + width: 600px; + height: 600px; + } +} + +.pulse { + overflow: initial; + position: relative; +} + +.pulse::before { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: inherit; + border-radius: inherit; + transition: opacity .3s, -webkit-transform .3s; + transition: opacity .3s, transform .3s; + transition: opacity .3s, transform .3s, -webkit-transform .3s; + -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + z-index: -1; +} + +@-webkit-keyframes pulse-animation { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } + 100% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } +} + +@keyframes pulse-animation { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } + 100% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } +} + +/* ========================================================================== + $BASE-PICKER + ========================================================================== */ +/** + * Note: the root picker element should *NOT* be styled more than what's here. + */ +.picker { + font-size: 16px; + text-align: left; + line-height: 1.2; + color: #000000; + position: absolute; + z-index: 10000; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/** + * The picker input element. + */ +.picker__input { + cursor: default; +} + +/** + * When the picker is opened, the input element is "activated". + */ +.picker__input.picker__input--active { + border-color: #0089ec; +} + +/** + * The holder is the only "scrollable" top-level container element. + */ +.picker__holder { + width: 100%; + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} + +/*! + * Default mobile-first, responsive styling for pickadate.js + * Demo: http://amsul.github.io/pickadate.js + */ +/** + * Note: the root picker element should *NOT* be styled more than what's here. + */ +/** + * Make the holder and frame fullscreen. + */ +.picker__holder, +.picker__frame { + bottom: 0; + left: 0; + right: 0; + top: 100%; +} + +/** + * The holder should overlay the entire screen. + */ +.picker__holder { + position: fixed; + transition: background 0.15s ease-out, top 0s 0.15s; + -webkit-backface-visibility: hidden; +} + +/** + * The frame that bounds the box contents of the picker. + */ +.picker__frame { + position: absolute; + margin: 0 auto; + min-width: 256px; + width: 300px; + max-height: 350px; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -moz-opacity: 0; + opacity: 0; + transition: all 0.15s ease-out; +} + +@media (min-height: 28.875em) { + .picker__frame { + overflow: visible; + top: auto; + bottom: -100%; + max-height: 80%; + } +} + +@media (min-height: 40.125em) { + .picker__frame { + margin-bottom: 7.5%; + } +} + +/** + * The wrapper sets the stage to vertically align the box contents. + */ +.picker__wrap { + display: table; + width: 100%; + height: 100%; +} + +@media (min-height: 28.875em) { + .picker__wrap { + display: block; + } +} + +/** + * The box contains all the picker contents. + */ +.picker__box { + background: #ffffff; + display: table-cell; + vertical-align: middle; +} + +@media (min-height: 28.875em) { + .picker__box { + display: block; + border: 1px solid #777777; + border-top-color: #898989; + border-bottom-width: 0; + border-radius: 5px 5px 0 0; + box-shadow: 0 12px 36px 16px rgba(0, 0, 0, 0.24); + } +} + +/** + * When the picker opens... + */ +.picker--opened .picker__holder { + top: 0; + background: transparent; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)"; + zoom: 1; + background: rgba(0, 0, 0, 0.32); + transition: background 0.15s ease-out; +} + +.picker--opened .picker__frame { + top: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + filter: alpha(opacity=100); + -moz-opacity: 1; + opacity: 1; +} + +@media (min-height: 35.875em) { + .picker--opened .picker__frame { + top: 10%; + bottom: auto; + } +} + +/** + * For `large` screens, transform into an inline picker. + */ +/* ========================================================================== + CUSTOM MATERIALIZE STYLES + ========================================================================== */ +.picker__input.picker__input--active { + border-color: #E3F2FD; +} + +.picker__frame { + margin: 0 auto; + max-width: 325px; +} + +@media (min-height: 38.875em) { + .picker--opened .picker__frame { + top: 10%; + bottom: auto; + } +} + +/* ========================================================================== + $BASE-DATE-PICKER + ========================================================================== */ +/** + * The picker box. + */ +.picker__box { + padding: 0 1em; +} + +/** + * The header containing the month and year stuff. + */ +.picker__header { + text-align: center; + position: relative; + margin-top: .75em; +} + +/** + * The month and year labels. + */ +.picker__month, +.picker__year { + display: inline-block; + margin-left: .25em; + margin-right: .25em; +} + +/** + * The month and year selectors. + */ +.picker__select--month, +.picker__select--year { + height: 2em; + padding: 0; + margin-left: .25em; + margin-right: .25em; +} + +.picker__select--month.browser-default { + display: inline; + background-color: #FFFFFF; + width: 40%; +} + +.picker__select--year.browser-default { + display: inline; + background-color: #FFFFFF; + width: 26%; +} + +.picker__select--month:focus, +.picker__select--year:focus { + border-color: rgba(0, 0, 0, 0.05); +} + +/** + * The month navigation buttons. + */ +.picker__nav--prev, +.picker__nav--next { + position: absolute; + padding: .5em 1.25em; + width: 1em; + height: 1em; + box-sizing: content-box; + top: -0.25em; +} + +.picker__nav--prev { + left: -1em; + padding-right: 1.25em; +} + +.picker__nav--next { + right: -1em; + padding-left: 1.25em; +} + +.picker__nav--disabled, +.picker__nav--disabled:hover, +.picker__nav--disabled:before, +.picker__nav--disabled:before:hover { + cursor: default; + background: none; + border-right-color: #f5f5f5; + border-left-color: #f5f5f5; +} + +/** + * The calendar table of dates + */ +.picker__table { + text-align: center; + border-collapse: collapse; + border-spacing: 0; + table-layout: fixed; + font-size: 1rem; + width: 100%; + margin-top: .75em; + margin-bottom: .5em; +} + +.picker__table th, .picker__table td { + text-align: center; +} + +.picker__table td { + margin: 0; + padding: 0; +} + +/** + * The weekday labels + */ +.picker__weekday { + width: 14.285714286%; + font-size: .75em; + padding-bottom: .25em; + color: #999999; + font-weight: 500; + /* Increase the spacing a tad */ +} + +@media (min-height: 33.875em) { + .picker__weekday { + padding-bottom: .5em; + } +} + +/** + * The days on the calendar + */ +.picker__day--today { + position: relative; + color: #595959; + letter-spacing: -.3; + padding: .75rem 0; + font-weight: 400; + border: 1px solid transparent; +} + +.picker__day--disabled:before { + border-top-color: #aaaaaa; +} + +.picker__day--infocus:hover { + cursor: pointer; + color: #000; + font-weight: 500; +} + +.picker__day--outfocus { + display: none; + padding: .75rem 0; + color: #fff; +} + +.picker__day--outfocus:hover { + cursor: pointer; + color: #dddddd; + font-weight: 500; +} + +.picker__day--highlighted:hover, +.picker--focused .picker__day--highlighted { + cursor: pointer; +} + +.picker__day--selected, +.picker__day--selected:hover, +.picker--focused .picker__day--selected { + border-radius: 50%; + -webkit-transform: scale(0.75); + transform: scale(0.75); + background: #0089ec; + color: #ffffff; +} + +.picker__day--disabled, +.picker__day--disabled:hover, +.picker--focused .picker__day--disabled { + background: #f5f5f5; + border-color: #f5f5f5; + color: #dddddd; + cursor: default; +} + +.picker__day--highlighted.picker__day--disabled, +.picker__day--highlighted.picker__day--disabled:hover { + background: #bbbbbb; +} + +/** + * The footer containing the "today", "clear", and "close" buttons. + */ +.picker__footer { + text-align: center; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.picker__button--today, +.picker__button--clear, +.picker__button--close { + border: 1px solid #ffffff; + background: #ffffff; + font-size: .8em; + padding: .66em 0; + font-weight: bold; + width: 33%; + display: inline-block; + vertical-align: bottom; +} + +.picker__button--today:hover, +.picker__button--clear:hover, +.picker__button--close:hover { + cursor: pointer; + color: #000000; + background: #b1dcfb; + border-bottom-color: #b1dcfb; +} + +.picker__button--today:focus, +.picker__button--clear:focus, +.picker__button--close:focus { + background: #b1dcfb; + border-color: rgba(0, 0, 0, 0.05); + outline: none; +} + +.picker__button--today:before, +.picker__button--clear:before, +.picker__button--close:before { + position: relative; + display: inline-block; + height: 0; +} + +.picker__button--today:before, +.picker__button--clear:before { + content: " "; + margin-right: .45em; +} + +.picker__button--today:before { + top: -0.05em; + width: 0; + border-top: 0.66em solid #0059bc; + border-left: .66em solid transparent; +} + +.picker__button--clear:before { + top: -0.25em; + width: .66em; + border-top: 3px solid #ee2200; +} + +.picker__button--close:before { + content: "\D7"; + top: -0.1em; + vertical-align: top; + font-size: 1.1em; + margin-right: .35em; + color: #777777; +} + +.picker__button--today[disabled], +.picker__button--today[disabled]:hover { + background: #f5f5f5; + border-color: #f5f5f5; + color: #dddddd; + cursor: default; +} + +.picker__button--today[disabled]:before { + border-top-color: #aaaaaa; +} + +/* ========================================================================== + CUSTOM MATERIALIZE STYLES + ========================================================================== */ +.picker__box { + border-radius: 2px; + overflow: hidden; +} + +.picker__date-display { + text-align: center; + background-color: #26a69a; + color: #fff; + padding-bottom: 15px; + font-weight: 300; +} + +.picker__nav--prev:hover, +.picker__nav--next:hover { + cursor: pointer; + color: #000000; + background: #a1ded8; +} + +.picker__weekday-display { + background-color: #1f897f; + padding: 10px; + font-weight: 200; + letter-spacing: .5; + font-size: 1rem; + margin-bottom: 15px; +} + +.picker__month-display { + text-transform: uppercase; + font-size: 2rem; +} + +.picker__day-display { + font-size: 4.5rem; + font-weight: 400; +} + +.picker__year-display { + font-size: 1.8rem; + color: rgba(255, 255, 255, 0.4); +} + +.picker__box { + padding: 0; +} + +.picker__calendar-container { + padding: 0 1rem; +} + +.picker__calendar-container thead { + border: none; +} + +.picker__table { + margin-top: 0; + margin-bottom: .5em; +} + +.picker__day--infocus { + color: #595959; + letter-spacing: -.3; + padding: .75rem 0; + font-weight: 400; + border: 1px solid transparent; +} + +.picker__day.picker__day--today { + color: #26a69a; +} + +.picker__day.picker__day--today.picker__day--selected { + color: #fff; +} + +.picker__weekday { + font-size: .9rem; +} + +.picker__day--selected, +.picker__day--selected:hover, +.picker--focused .picker__day--selected { + border-radius: 50%; + -webkit-transform: scale(0.9); + transform: scale(0.9); + background-color: #26a69a; + color: #ffffff; +} + +.picker__day--selected.picker__day--outfocus, +.picker__day--selected:hover.picker__day--outfocus, +.picker--focused .picker__day--selected.picker__day--outfocus { + background-color: #a1ded8; +} + +.picker__footer { + text-align: right; + padding: 5px 10px; +} + +.picker__close, .picker__today { + font-size: 1.1rem; + padding: 0 1rem; + color: #26a69a; +} + +.picker__nav--prev:before, +.picker__nav--next:before { + content: " "; + border-top: .5em solid transparent; + border-bottom: .5em solid transparent; + border-right: 0.75em solid #676767; + width: 0; + height: 0; + display: block; + margin: 0 auto; +} + +.picker__nav--next:before { + border-right: 0; + border-left: 0.75em solid #676767; +} + +button.picker__today:focus, button.picker__clear:focus, button.picker__close:focus { + background-color: #a1ded8; +} + +/* ========================================================================== + $BASE-TIME-PICKER + ========================================================================== */ +/** + * The list of times. + */ +.picker__list { + list-style: none; + padding: 0.75em 0 4.2em; + margin: 0; +} + +/** + * The times on the clock. + */ +.picker__list-item { + border-bottom: 1px solid #dddddd; + border-top: 1px solid #dddddd; + margin-bottom: -1px; + position: relative; + background: #ffffff; + padding: .75em 1.25em; +} + +@media (min-height: 46.75em) { + .picker__list-item { + padding: .5em 1em; + } +} + +/* Hovered time */ +.picker__list-item:hover { + cursor: pointer; + color: #000000; + background: #b1dcfb; + border-color: #0089ec; + z-index: 10; +} + +/* Highlighted and hovered/focused time */ +.picker__list-item--highlighted { + border-color: #0089ec; + z-index: 10; +} + +.picker__list-item--highlighted:hover, +.picker--focused .picker__list-item--highlighted { + cursor: pointer; + color: #000000; + background: #b1dcfb; +} + +/* Selected and hovered/focused time */ +.picker__list-item--selected, +.picker__list-item--selected:hover, +.picker--focused .picker__list-item--selected { + background: #0089ec; + color: #ffffff; + z-index: 10; +} + +/* Disabled time */ +.picker__list-item--disabled, +.picker__list-item--disabled:hover, +.picker--focused .picker__list-item--disabled { + background: #f5f5f5; + border-color: #f5f5f5; + color: #dddddd; + cursor: default; + border-color: #dddddd; + z-index: auto; +} + +/** + * The clear button + */ +.picker--time .picker__button--clear { + display: block; + width: 80%; + margin: 1em auto 0; + padding: 1em 1.25em; + background: none; + border: 0; + font-weight: 500; + font-size: .67em; + text-align: center; + text-transform: uppercase; + color: #666; +} + +.picker--time .picker__button--clear:hover, +.picker--time .picker__button--clear:focus { + color: #000000; + background: #b1dcfb; + background: #ee2200; + border-color: #ee2200; + cursor: pointer; + color: #ffffff; + outline: none; +} + +.picker--time .picker__button--clear:before { + top: -0.25em; + color: #666; + font-size: 1.25em; + font-weight: bold; +} + +.picker--time .picker__button--clear:hover:before, +.picker--time .picker__button--clear:focus:before { + color: #ffffff; +} + +/* ========================================================================== + $DEFAULT-TIME-PICKER + ========================================================================== */ +/** + * The frame the bounds the time picker. + */ +.picker--time .picker__frame { + min-width: 256px; + max-width: 320px; +} + +/** + * The picker box. + */ +.picker--time .picker__box { + font-size: 1em; + background: #f2f2f2; + padding: 0; +} + +@media (min-height: 40.125em) { + .picker--time .picker__box { + margin-bottom: 5em; + } +} diff --git a/pkgs/csslib/test/examples/mdc-card.css b/pkgs/csslib/test/examples/mdc-card.css new file mode 100644 index 000000000..72c5d439f --- /dev/null +++ b/pkgs/csslib/test/examples/mdc-card.css @@ -0,0 +1,412 @@ +/** +* Copyright 2017 Google Inc. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +**/ +/** + * The css property used for elevation. In most cases this should not be changed. It is exposed + * as a variable for abstraction / easy use when needing to reference the property directly, for + * example in a `will-change` rule. + */ +/** + * The default duration value for elevation transitions. + */ +/** + * The default easing value for elevation transitions. + */ +/** + * Applies the correct css rules to an element to give it the elevation specified by $z-value. + * The $z-value must be between 0 and 24. + */ +/** + * Returns a string that can be used as the value for a `transition` property for elevation. + * Calling this function directly is useful in situations where a component needs to transition + * more than one property. + * + * ```scss + * .foo { + * transition: mdc-elevation-transition-rule(), opacity 100ms ease; + * will-change: $mdc-elevation-property, opacity; + * } + * ``` + */ +/** + * Applies the correct css rules needed to have an element transition between elevations. + * This mixin should be applied to elements whose elevation values will change depending on their + * context (e.g. when active or disabled). + */ +/* + Precomputed linear color channel values, for use in contrast calculations. + See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests + + Algorithm, for c in 0 to 255: + f(c) { + c = c / 255; + return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); + } + + This lookup table is needed since there is no `pow` in SASS. +*/ +/** + * Calculate the luminance for a color. + * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests + */ +/** + * Calculate the contrast ratio between two colors. + * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests + */ +/** + * Determine whether to use dark or light text on top of given color. + * Returns "dark" for dark text and "light" for light text. + */ +/* + Main theme colors. + If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change. +*/ +/* Indigo 500 */ +/* Pink A200 */ +/* White */ +/* Which set of text colors to use for each main theme color (light or dark) */ +/* Text colors according to light vs dark and text type */ +/* Primary text colors for each of the theme colors */ +/** + * Applies the correct theme color style to the specified property. + * $property is typically color or background-color, but can be any CSS property that accepts color values. + * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss). + */ +/** + * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents. + * Should provide the $root-selector option if applied to anything other than the root selector. + * When used with a modifier class, provide a second argument of `true` for the $compound parameter + * to specify that this should be attached as a compound class. + * + * Usage example: + * + * ```scss + * .mdc-foo { + * color: black; + * + * @include mdc-theme-dark { + * color: white; + * } + * + * &__bar { + * background: black; + * + * @include mdc-theme-dark(".mdc-foo") { + * background: white; + * } + * } + * } + * + * .mdc-foo--disabled { + * opacity: .38; + * + * @include mdc-theme-dark(".mdc-foo", true) { + * opacity: .5; + * } + * } + * ``` + */ +/* TODO(sgomes): Figure out what to do about desktop font sizes. */ +/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */ +/** + * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout. + * + * Usage Example: + * ```scss + * .mdc-foo { + * position: absolute; + * left: 0; + * + * @include mdc-rtl { + * left: auto; + * right: 0; + * } + * + * &__bar { + * margin-left: 4px; + * @include mdc-rtl(".mdc-foo") { + * margin-left: auto; + * margin-right: 4px; + * } + * } + * } + * + * .mdc-foo--mod { + * padding-left: 4px; + * + * @include mdc-rtl { + * padding-left: auto; + * padding-right: 4px; + * } + * } + * ``` + * + * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work + * in most cases, it will in some cases lead to false negatives, e.g. + * + * ```html + * + * + *
+ *
Styled incorrectly as RTL!
+ *
+ * + * ``` + * + * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this. + */ +/** + * Takes a base box-model property - e.g. margin / border / padding - along with a default + * direction and value, and emits rules which apply the value to the + * "-" property by default, but flips the direction + * when within an RTL context. + * + * For example: + * + * ```scss + * .mdc-foo { + * @include mdc-rtl-reflexive-box(margin, left, 8px); + * } + * ``` + * is equivalent to: + * + * ```scss + * .mdc-foo { + * margin-left: 8px; + * + * @include mdc-rtl { + * margin-right: 8px; + * margin-left: 0; + * } + * } + * ``` + * whereas: + * + * ```scss + * .mdc-foo { + * @include mdc-rtl-reflexive-box(margin, right, 8px); + * } + * ``` + * is equivalent to: + * + * ```scss + * .mdc-foo { + * margin-right: 8px; + * + * @include mdc-rtl { + * margin-right: 0; + * margin-left: 8px; + * } + * } + * ``` + * + * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`, + * e.g. `@include mdc-rtl-reflexive-box-property(margin, left, 8px, ".mdc-component")`. + * + * Note that this function will always zero out the original value in an RTL context. If you're + * trying to flip the values, use mdc-rtl-reflexive-property(). + */ +/** + * Takes a base property and emits rules that assign -left to and + * -right to in a LTR context, and vice versa in a RTL context. + * For example: + * + * ```scss + * .mdc-foo { + * @include mdc-rtl-reflexive-property(margin, auto, 12px); + * } + * ``` + * is equivalent to: + * + * ```scss + * .mdc-foo { + * margin-left: auto; + * margin-right: 12px; + * + * @include mdc-rtl { + * margin-left: 12px; + * margin-right: auto; + * } + * } + * ``` + * + * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`. + */ +/** + * Takes an argument specifying a horizontal position property (either "left" or "right") as well + * as a value, and applies that value to the specified position in a LTR context, and flips it in a + * RTL context. For example: + * + * ```scss + * .mdc-foo { + * @include mdc-rtl-reflexive-position(left, 0); + * position: absolute; + * } + * ``` + * is equivalent to: + * + * ```scss + * .mdc-foo { + * position: absolute; + * left: 0; + * right: initial; + * + * @include mdc-rtl { + * right: 0; + * left: initial; + * } + * } + * ``` + * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`. + */ +.mdc-card { + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14); + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: 0; + box-sizing: border-box; } + .mdc-card__primary { + padding: 16px; } + .mdc-card__primary .mdc-card__title--large { + padding-top: 8px; } + .mdc-card__primary:last-child { + padding-bottom: 24px; } + .mdc-card__supporting-text { + padding: 8px 16px; + box-sizing: border-box; + font-family: Roboto, sans-serif; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-size: 0.875rem; + font-weight: 400; + letter-spacing: 0.04em; + line-height: 1.25rem; + color: rgba(0, 0, 0, 0.87); + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); } + .mdc-card--theme-dark .mdc-card__supporting-text, .mdc-theme--dark .mdc-card__supporting-text { + color: white; + color: var(--mdc-theme-text-primary-on-dark, white); } + .mdc-card__primary + .mdc-card__supporting-text { + margin-top: -8px; + padding-top: 0; } + .mdc-card__supporting-text:last-child { + padding-bottom: 24px; } + .mdc-card__actions { + display: flex; + padding: 8px; + box-sizing: border-box; } + .mdc-card--theme-dark .mdc-card__actions, .mdc-theme--dark .mdc-card__actions { + color: white; + color: var(--mdc-theme-text-primary-on-dark, white); } + .mdc-card__actions .mdc-card__action { + margin: 0 8px 0 0; } + [dir="rtl"] .mdc-card__actions .mdc-card__action, .mdc-card__actions .mdc-card__action[dir="rtl"] { + margin: 0 0 0 8px; } + .mdc-card__actions .mdc-card__action:last-child { + margin-left: 0; + margin-right: 0; } + [dir="rtl"] .mdc-card__actions .mdc-card__action:last-child, .mdc-card__actions .mdc-card__action:last-child[dir="rtl"] { + margin-left: 0; + margin-right: 0; } + .mdc-card__actions--vertical { + flex-flow: column; + align-items: flex-start; } + .mdc-card__actions--vertical .mdc-card__action { + margin: 0 0 4px; } + .mdc-card__actions--vertical .mdc-card__action:last-child { + margin-bottom: 0; } + .mdc-card__media { + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: 16px; + box-sizing: border-box; } + .mdc-card__media-item { + display: inline-block; + width: auto; + height: 80px; + margin: 16px 0 0; + padding: 0; } + .mdc-card__media-item--1dot5x { + width: auto; + height: 120px; } + .mdc-card__media-item--2x { + width: auto; + height: 160px; } + .mdc-card__media-item--3x { + width: auto; + height: 240px; } + .mdc-card__title { + font-family: Roboto, sans-serif; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-size: 0.875rem; + font-weight: 500; + letter-spacing: 0.04em; + line-height: 1.5rem; + color: rgba(0, 0, 0, 0.87); + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); + margin: -.063rem 0; } + .mdc-card--theme-dark .mdc-card__title, .mdc-theme--dark .mdc-card__title { + color: white; + color: var(--mdc-theme-text-primary-on-dark, white); } + .mdc-card__title--large { + font-family: Roboto, sans-serif; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-size: 1.5rem; + font-weight: 400; + letter-spacing: normal; + line-height: 2rem; + margin: 0; } + .mdc-card__subtitle { + font-family: Roboto, sans-serif; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-size: 0.875rem; + font-weight: 400; + letter-spacing: 0.04em; + line-height: 1.25rem; + color: rgba(0, 0, 0, 0.87); + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); + margin: -.063rem 0; } + .mdc-card--theme-dark .mdc-card__subtitle, .mdc-theme--dark .mdc-card__subtitle { + color: white; + color: var(--mdc-theme-text-primary-on-dark, white); } + .mdc-card__horizontal-block { + display: flex; + flex-direction: row; + align-items: flex-start; + justify-content: space-between; + box-sizing: border-box; + padding: 0; + padding-left: 0; + padding-right: 16px; } + [dir="rtl"] .mdc-card__horizontal-block, .mdc-card__horizontal-block[dir="rtl"] { + padding-left: 16px; + padding-right: 0; } + .mdc-card__horizontal-block .mdc-card__actions--vertical { + margin: 16px; } + .mdc-card__horizontal-block .mdc-card__media-item { + margin-left: 16px; + margin-right: 0; } + [dir="rtl"] .mdc-card__horizontal-block .mdc-card__media-item, .mdc-card__horizontal-block .mdc-card__media-item[dir="rtl"] { + margin-left: 0; + margin-right: 16px; } + .mdc-card__horizontal-block .mdc-card__media-item--3x { + margin-bottom: 16px; } + +/*# sourceMappingURL=mdc-card.css.map */ diff --git a/pkgs/csslib/test/examples/mdc-layout.css b/pkgs/csslib/test/examples/mdc-layout.css new file mode 100644 index 000000000..75e6390bc --- /dev/null +++ b/pkgs/csslib/test/examples/mdc-layout.css @@ -0,0 +1,434 @@ +/** +* Copyright 2017 Google Inc. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +**/ +.mdc-layout-grid { + display: flex; + flex-flow: row wrap; + align-items: stretch; + margin: 0 auto; + box-sizing: border-box; + padding: 8px; + padding: calc(var(--mdc-layout-grid-margin, 16px) - var(--mdc-layout-grid-gutter, 16px) / 2); } + @supports (display: grid) { + .mdc-layout-grid { + display: grid; + grid-gap: 16px; + grid-gap: var(--mdc-layout-grid-gutter, 16px); + padding: 16px; + padding: var(--mdc-layout-grid-margin, 16px); } + @media (min-width: 840px) { + .mdc-layout-grid { + grid-template-columns: repeat(12, minmax(0, 1fr)); } } + @media (min-width: 480px) and (max-width: 839px) { + .mdc-layout-grid { + grid-template-columns: repeat(8, minmax(0, 1fr)); } } + @media (max-width: 479px) { + .mdc-layout-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); } } } + +.mdc-layout-grid__cell { + margin: 8px; + margin: calc(var(--mdc-layout-grid-gutter, 16px) / 2); + box-sizing: border-box; } + @supports (display: grid) { + .mdc-layout-grid__cell { + margin: 0; } } + @media (min-width: 840px) { + .mdc-layout-grid__cell { + width: calc(33.33333% - 16px); + width: calc(33.33333% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell { + width: auto; + grid-column-end: span 4; } } } + @media (min-width: 480px) and (max-width: 839px) { + .mdc-layout-grid__cell { + width: calc(50% - 16px); + width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell { + width: auto; + grid-column-end: span 4; } } } + @media (max-width: 479px) { + .mdc-layout-grid__cell { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell { + width: auto; + grid-column-end: span 4; } } } + @media (min-width: 840px) { + .mdc-layout-grid__cell--span-1, + .mdc-layout-grid__cell--span-1-desktop.mdc-layout-grid__cell--span-1-desktop { + width: calc(8.33333% - 16px); + width: calc(8.33333% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-1, + .mdc-layout-grid__cell--span-1-desktop.mdc-layout-grid__cell--span-1-desktop { + width: auto; + grid-column-end: span 1; } } + .mdc-layout-grid__cell--span-2, + .mdc-layout-grid__cell--span-2-desktop.mdc-layout-grid__cell--span-2-desktop { + width: calc(16.66667% - 16px); + width: calc(16.66667% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-2, + .mdc-layout-grid__cell--span-2-desktop.mdc-layout-grid__cell--span-2-desktop { + width: auto; + grid-column-end: span 2; } } + .mdc-layout-grid__cell--span-3, + .mdc-layout-grid__cell--span-3-desktop.mdc-layout-grid__cell--span-3-desktop { + width: calc(25% - 16px); + width: calc(25% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-3, + .mdc-layout-grid__cell--span-3-desktop.mdc-layout-grid__cell--span-3-desktop { + width: auto; + grid-column-end: span 3; } } + .mdc-layout-grid__cell--span-4, + .mdc-layout-grid__cell--span-4-desktop.mdc-layout-grid__cell--span-4-desktop { + width: calc(33.33333% - 16px); + width: calc(33.33333% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-4, + .mdc-layout-grid__cell--span-4-desktop.mdc-layout-grid__cell--span-4-desktop { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-5, + .mdc-layout-grid__cell--span-5-desktop.mdc-layout-grid__cell--span-5-desktop { + width: calc(41.66667% - 16px); + width: calc(41.66667% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-5, + .mdc-layout-grid__cell--span-5-desktop.mdc-layout-grid__cell--span-5-desktop { + width: auto; + grid-column-end: span 5; } } + .mdc-layout-grid__cell--span-6, + .mdc-layout-grid__cell--span-6-desktop.mdc-layout-grid__cell--span-6-desktop { + width: calc(50% - 16px); + width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-6, + .mdc-layout-grid__cell--span-6-desktop.mdc-layout-grid__cell--span-6-desktop { + width: auto; + grid-column-end: span 6; } } + .mdc-layout-grid__cell--span-7, + .mdc-layout-grid__cell--span-7-desktop.mdc-layout-grid__cell--span-7-desktop { + width: calc(58.33333% - 16px); + width: calc(58.33333% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-7, + .mdc-layout-grid__cell--span-7-desktop.mdc-layout-grid__cell--span-7-desktop { + width: auto; + grid-column-end: span 7; } } + .mdc-layout-grid__cell--span-8, + .mdc-layout-grid__cell--span-8-desktop.mdc-layout-grid__cell--span-8-desktop { + width: calc(66.66667% - 16px); + width: calc(66.66667% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-8, + .mdc-layout-grid__cell--span-8-desktop.mdc-layout-grid__cell--span-8-desktop { + width: auto; + grid-column-end: span 8; } } + .mdc-layout-grid__cell--span-9, + .mdc-layout-grid__cell--span-9-desktop.mdc-layout-grid__cell--span-9-desktop { + width: calc(75% - 16px); + width: calc(75% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-9, + .mdc-layout-grid__cell--span-9-desktop.mdc-layout-grid__cell--span-9-desktop { + width: auto; + grid-column-end: span 9; } } + .mdc-layout-grid__cell--span-10, + .mdc-layout-grid__cell--span-10-desktop.mdc-layout-grid__cell--span-10-desktop { + width: calc(83.33333% - 16px); + width: calc(83.33333% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-10, + .mdc-layout-grid__cell--span-10-desktop.mdc-layout-grid__cell--span-10-desktop { + width: auto; + grid-column-end: span 10; } } + .mdc-layout-grid__cell--span-11, + .mdc-layout-grid__cell--span-11-desktop.mdc-layout-grid__cell--span-11-desktop { + width: calc(91.66667% - 16px); + width: calc(91.66667% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-11, + .mdc-layout-grid__cell--span-11-desktop.mdc-layout-grid__cell--span-11-desktop { + width: auto; + grid-column-end: span 11; } } + .mdc-layout-grid__cell--span-12, + .mdc-layout-grid__cell--span-12-desktop.mdc-layout-grid__cell--span-12-desktop { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-12, + .mdc-layout-grid__cell--span-12-desktop.mdc-layout-grid__cell--span-12-desktop { + width: auto; + grid-column-end: span 12; } } } + @media (min-width: 480px) and (max-width: 839px) { + .mdc-layout-grid__cell--span-1, + .mdc-layout-grid__cell--span-1-tablet.mdc-layout-grid__cell--span-1-tablet { + width: calc(12.5% - 16px); + width: calc(12.5% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-1, + .mdc-layout-grid__cell--span-1-tablet.mdc-layout-grid__cell--span-1-tablet { + width: auto; + grid-column-end: span 1; } } + .mdc-layout-grid__cell--span-2, + .mdc-layout-grid__cell--span-2-tablet.mdc-layout-grid__cell--span-2-tablet { + width: calc(25% - 16px); + width: calc(25% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-2, + .mdc-layout-grid__cell--span-2-tablet.mdc-layout-grid__cell--span-2-tablet { + width: auto; + grid-column-end: span 2; } } + .mdc-layout-grid__cell--span-3, + .mdc-layout-grid__cell--span-3-tablet.mdc-layout-grid__cell--span-3-tablet { + width: calc(37.5% - 16px); + width: calc(37.5% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-3, + .mdc-layout-grid__cell--span-3-tablet.mdc-layout-grid__cell--span-3-tablet { + width: auto; + grid-column-end: span 3; } } + .mdc-layout-grid__cell--span-4, + .mdc-layout-grid__cell--span-4-tablet.mdc-layout-grid__cell--span-4-tablet { + width: calc(50% - 16px); + width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-4, + .mdc-layout-grid__cell--span-4-tablet.mdc-layout-grid__cell--span-4-tablet { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-5, + .mdc-layout-grid__cell--span-5-tablet.mdc-layout-grid__cell--span-5-tablet { + width: calc(62.5% - 16px); + width: calc(62.5% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-5, + .mdc-layout-grid__cell--span-5-tablet.mdc-layout-grid__cell--span-5-tablet { + width: auto; + grid-column-end: span 5; } } + .mdc-layout-grid__cell--span-6, + .mdc-layout-grid__cell--span-6-tablet.mdc-layout-grid__cell--span-6-tablet { + width: calc(75% - 16px); + width: calc(75% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-6, + .mdc-layout-grid__cell--span-6-tablet.mdc-layout-grid__cell--span-6-tablet { + width: auto; + grid-column-end: span 6; } } + .mdc-layout-grid__cell--span-7, + .mdc-layout-grid__cell--span-7-tablet.mdc-layout-grid__cell--span-7-tablet { + width: calc(87.5% - 16px); + width: calc(87.5% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-7, + .mdc-layout-grid__cell--span-7-tablet.mdc-layout-grid__cell--span-7-tablet { + width: auto; + grid-column-end: span 7; } } + .mdc-layout-grid__cell--span-8, + .mdc-layout-grid__cell--span-8-tablet.mdc-layout-grid__cell--span-8-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-8, + .mdc-layout-grid__cell--span-8-tablet.mdc-layout-grid__cell--span-8-tablet { + width: auto; + grid-column-end: span 8; } } + .mdc-layout-grid__cell--span-9, + .mdc-layout-grid__cell--span-9-tablet.mdc-layout-grid__cell--span-9-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-9, + .mdc-layout-grid__cell--span-9-tablet.mdc-layout-grid__cell--span-9-tablet { + width: auto; + grid-column-end: span 8; } } + .mdc-layout-grid__cell--span-10, + .mdc-layout-grid__cell--span-10-tablet.mdc-layout-grid__cell--span-10-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-10, + .mdc-layout-grid__cell--span-10-tablet.mdc-layout-grid__cell--span-10-tablet { + width: auto; + grid-column-end: span 8; } } + .mdc-layout-grid__cell--span-11, + .mdc-layout-grid__cell--span-11-tablet.mdc-layout-grid__cell--span-11-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-11, + .mdc-layout-grid__cell--span-11-tablet.mdc-layout-grid__cell--span-11-tablet { + width: auto; + grid-column-end: span 8; } } + .mdc-layout-grid__cell--span-12, + .mdc-layout-grid__cell--span-12-tablet.mdc-layout-grid__cell--span-12-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-12, + .mdc-layout-grid__cell--span-12-tablet.mdc-layout-grid__cell--span-12-tablet { + width: auto; + grid-column-end: span 8; } } } + @media (max-width: 479px) { + .mdc-layout-grid__cell--span-1, + .mdc-layout-grid__cell--span-1-phone.mdc-layout-grid__cell--span-1-phone { + width: calc(25% - 16px); + width: calc(25% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-1, + .mdc-layout-grid__cell--span-1-phone.mdc-layout-grid__cell--span-1-phone { + width: auto; + grid-column-end: span 1; } } + .mdc-layout-grid__cell--span-2, + .mdc-layout-grid__cell--span-2-phone.mdc-layout-grid__cell--span-2-phone { + width: calc(50% - 16px); + width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-2, + .mdc-layout-grid__cell--span-2-phone.mdc-layout-grid__cell--span-2-phone { + width: auto; + grid-column-end: span 2; } } + .mdc-layout-grid__cell--span-3, + .mdc-layout-grid__cell--span-3-phone.mdc-layout-grid__cell--span-3-phone { + width: calc(75% - 16px); + width: calc(75% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-3, + .mdc-layout-grid__cell--span-3-phone.mdc-layout-grid__cell--span-3-phone { + width: auto; + grid-column-end: span 3; } } + .mdc-layout-grid__cell--span-4, + .mdc-layout-grid__cell--span-4-phone.mdc-layout-grid__cell--span-4-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-4, + .mdc-layout-grid__cell--span-4-phone.mdc-layout-grid__cell--span-4-phone { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-5, + .mdc-layout-grid__cell--span-5-phone.mdc-layout-grid__cell--span-5-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-5, + .mdc-layout-grid__cell--span-5-phone.mdc-layout-grid__cell--span-5-phone { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-6, + .mdc-layout-grid__cell--span-6-phone.mdc-layout-grid__cell--span-6-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-6, + .mdc-layout-grid__cell--span-6-phone.mdc-layout-grid__cell--span-6-phone { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-7, + .mdc-layout-grid__cell--span-7-phone.mdc-layout-grid__cell--span-7-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-7, + .mdc-layout-grid__cell--span-7-phone.mdc-layout-grid__cell--span-7-phone { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-8, + .mdc-layout-grid__cell--span-8-phone.mdc-layout-grid__cell--span-8-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-8, + .mdc-layout-grid__cell--span-8-phone.mdc-layout-grid__cell--span-8-phone { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-9, + .mdc-layout-grid__cell--span-9-phone.mdc-layout-grid__cell--span-9-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-9, + .mdc-layout-grid__cell--span-9-phone.mdc-layout-grid__cell--span-9-phone { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-10, + .mdc-layout-grid__cell--span-10-phone.mdc-layout-grid__cell--span-10-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-10, + .mdc-layout-grid__cell--span-10-phone.mdc-layout-grid__cell--span-10-phone { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-11, + .mdc-layout-grid__cell--span-11-phone.mdc-layout-grid__cell--span-11-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-11, + .mdc-layout-grid__cell--span-11-phone.mdc-layout-grid__cell--span-11-phone { + width: auto; + grid-column-end: span 4; } } + .mdc-layout-grid__cell--span-12, + .mdc-layout-grid__cell--span-12-phone.mdc-layout-grid__cell--span-12-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } + @supports (display: grid) { + .mdc-layout-grid__cell--span-12, + .mdc-layout-grid__cell--span-12-phone.mdc-layout-grid__cell--span-12-phone { + width: auto; + grid-column-end: span 4; } } } + .mdc-layout-grid__cell--order-1 { + order: 1; } + .mdc-layout-grid__cell--order-2 { + order: 2; } + .mdc-layout-grid__cell--order-3 { + order: 3; } + .mdc-layout-grid__cell--order-4 { + order: 4; } + .mdc-layout-grid__cell--order-5 { + order: 5; } + .mdc-layout-grid__cell--order-6 { + order: 6; } + .mdc-layout-grid__cell--order-7 { + order: 7; } + .mdc-layout-grid__cell--order-8 { + order: 8; } + .mdc-layout-grid__cell--order-9 { + order: 9; } + .mdc-layout-grid__cell--order-10 { + order: 10; } + .mdc-layout-grid__cell--order-11 { + order: 11; } + .mdc-layout-grid__cell--order-12 { + order: 12; } + .mdc-layout-grid__cell--align-top { + align-self: flex-start; } + @supports (display: grid) { + .mdc-layout-grid__cell--align-top { + align-self: start; } } + .mdc-layout-grid__cell--align-middle { + align-self: center; } + .mdc-layout-grid__cell--align-bottom { + align-self: flex-end; } + @supports (display: grid) { + .mdc-layout-grid__cell--align-bottom { + align-self: end; } } diff --git a/pkgs/csslib/test/examples/pure.css b/pkgs/csslib/test/examples/pure.css new file mode 100644 index 000000000..9f3d66a20 --- /dev/null +++ b/pkgs/csslib/test/examples/pure.css @@ -0,0 +1,1507 @@ +/*! +Pure v0.6.2 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/yahoo/pure/blob/master/LICENSE.md +*/ +/*! +normalize.css v^3.0 | MIT License | git.io/normalize +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS and IE text size adjust after device orientation change, + * without disabling user zoom. + */ +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability of focused elements when they are also in an + * active/hover state. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + box-sizing: content-box; /* 2 */ +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} + +/*csslint important:false*/ + +/* ========================================================================== + Pure Base Extras + ========================================================================== */ + +/** + * Extra rules that Pure adds on top of Normalize.css + */ + +/** + * Always hide an element when it has the `hidden` HTML attribute. + */ + +.hidden, +[hidden] { + display: none !important; +} + +/** + * Add this class to an image to make it fit within it's fluid parent wrapper while maintaining + * aspect ratio. + */ +.pure-img { + max-width: 100%; + height: auto; + display: block; +} + +/*csslint regex-selectors:false, known-properties:false, duplicate-properties:false*/ + +.pure-g { + letter-spacing: -0.31em; /* Webkit: collapse white-space between units */ + *letter-spacing: normal; /* reset IE < 8 */ + *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */ + text-rendering: optimizespeed; /* Webkit: fixes text-rendering: optimizeLegibility */ + + /* + Sets the font stack to fonts known to work properly with the above letter + and word spacings. See: https://github.com/yahoo/pure/issues/41/ + + The following font stack makes Pure Grids work on all known environments. + + * FreeSans: Ships with many Linux distros, including Ubuntu + + * Arimo: Ships with Chrome OS. Arimo has to be defined before Helvetica and + Arial to get picked up by the browser, even though neither is available + in Chrome OS. + + * Droid Sans: Ships with all versions of Android. + + * Helvetica, Arial, sans-serif: Common font stack on OS X and Windows. + */ + font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif; + + /* Use flexbox when possible to avoid `letter-spacing` side-effects. */ + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + + /* Prevents distributing space between rows */ + -webkit-align-content: flex-start; + -ms-flex-line-pack: start; + align-content: flex-start; +} + +/* IE10 display: -ms-flexbox (and display: flex in IE 11) does not work inside a table; fall back to block and rely on font hack */ +@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { + table .pure-g { + display: block; + } +} + +/* Opera as of 12 on Windows needs word-spacing. + The ".opera-only" selector is used to prevent actual prefocus styling + and is not required in markup. +*/ +.opera-only :-o-prefocus, +.pure-g { + word-spacing: -0.43em; +} + +.pure-u { + display: inline-block; + *display: inline; /* IE < 8: fake inline-block */ + zoom: 1; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto; +} + +/* +Resets the font family back to the OS/browser's default sans-serif font, +this the same font stack that Normalize.css sets for the `body`. +*/ +.pure-g [class *= "pure-u"] { + font-family: sans-serif; +} + +.pure-u-1, +.pure-u-1-1, +.pure-u-1-2, +.pure-u-1-3, +.pure-u-2-3, +.pure-u-1-4, +.pure-u-3-4, +.pure-u-1-5, +.pure-u-2-5, +.pure-u-3-5, +.pure-u-4-5, +.pure-u-5-5, +.pure-u-1-6, +.pure-u-5-6, +.pure-u-1-8, +.pure-u-3-8, +.pure-u-5-8, +.pure-u-7-8, +.pure-u-1-12, +.pure-u-5-12, +.pure-u-7-12, +.pure-u-11-12, +.pure-u-1-24, +.pure-u-2-24, +.pure-u-3-24, +.pure-u-4-24, +.pure-u-5-24, +.pure-u-6-24, +.pure-u-7-24, +.pure-u-8-24, +.pure-u-9-24, +.pure-u-10-24, +.pure-u-11-24, +.pure-u-12-24, +.pure-u-13-24, +.pure-u-14-24, +.pure-u-15-24, +.pure-u-16-24, +.pure-u-17-24, +.pure-u-18-24, +.pure-u-19-24, +.pure-u-20-24, +.pure-u-21-24, +.pure-u-22-24, +.pure-u-23-24, +.pure-u-24-24 { + display: inline-block; + *display: inline; + zoom: 1; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto; +} + +.pure-u-1-24 { + width: 4.1667%; + *width: 4.1357%; +} + +.pure-u-1-12, +.pure-u-2-24 { + width: 8.3333%; + *width: 8.3023%; +} + +.pure-u-1-8, +.pure-u-3-24 { + width: 12.5000%; + *width: 12.4690%; +} + +.pure-u-1-6, +.pure-u-4-24 { + width: 16.6667%; + *width: 16.6357%; +} + +.pure-u-1-5 { + width: 20%; + *width: 19.9690%; +} + +.pure-u-5-24 { + width: 20.8333%; + *width: 20.8023%; +} + +.pure-u-1-4, +.pure-u-6-24 { + width: 25%; + *width: 24.9690%; +} + +.pure-u-7-24 { + width: 29.1667%; + *width: 29.1357%; +} + +.pure-u-1-3, +.pure-u-8-24 { + width: 33.3333%; + *width: 33.3023%; +} + +.pure-u-3-8, +.pure-u-9-24 { + width: 37.5000%; + *width: 37.4690%; +} + +.pure-u-2-5 { + width: 40%; + *width: 39.9690%; +} + +.pure-u-5-12, +.pure-u-10-24 { + width: 41.6667%; + *width: 41.6357%; +} + +.pure-u-11-24 { + width: 45.8333%; + *width: 45.8023%; +} + +.pure-u-1-2, +.pure-u-12-24 { + width: 50%; + *width: 49.9690%; +} + +.pure-u-13-24 { + width: 54.1667%; + *width: 54.1357%; +} + +.pure-u-7-12, +.pure-u-14-24 { + width: 58.3333%; + *width: 58.3023%; +} + +.pure-u-3-5 { + width: 60%; + *width: 59.9690%; +} + +.pure-u-5-8, +.pure-u-15-24 { + width: 62.5000%; + *width: 62.4690%; +} + +.pure-u-2-3, +.pure-u-16-24 { + width: 66.6667%; + *width: 66.6357%; +} + +.pure-u-17-24 { + width: 70.8333%; + *width: 70.8023%; +} + +.pure-u-3-4, +.pure-u-18-24 { + width: 75%; + *width: 74.9690%; +} + +.pure-u-19-24 { + width: 79.1667%; + *width: 79.1357%; +} + +.pure-u-4-5 { + width: 80%; + *width: 79.9690%; +} + +.pure-u-5-6, +.pure-u-20-24 { + width: 83.3333%; + *width: 83.3023%; +} + +.pure-u-7-8, +.pure-u-21-24 { + width: 87.5000%; + *width: 87.4690%; +} + +.pure-u-11-12, +.pure-u-22-24 { + width: 91.6667%; + *width: 91.6357%; +} + +.pure-u-23-24 { + width: 95.8333%; + *width: 95.8023%; +} + +.pure-u-1, +.pure-u-1-1, +.pure-u-5-5, +.pure-u-24-24 { + width: 100%; +} +.pure-button { + /* Structure */ + display: inline-block; + zoom: 1; + line-height: normal; + white-space: nowrap; + vertical-align: middle; + text-align: center; + cursor: pointer; + -webkit-user-drag: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + box-sizing: border-box; +} + +/* Firefox: Get rid of the inner focus border */ +.pure-button::-moz-focus-inner { + padding: 0; + border: 0; +} + +/* Inherit .pure-g styles */ +.pure-button-group { + letter-spacing: -0.31em; /* Webkit: collapse white-space between units */ + *letter-spacing: normal; /* reset IE < 8 */ + *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */ + text-rendering: optimizespeed; /* Webkit: fixes text-rendering: optimizeLegibility */ +} + +.opera-only :-o-prefocus, +.pure-button-group { + word-spacing: -0.43em; +} + +.pure-button-group .pure-button { + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto; +} + +/*csslint outline-none:false*/ + +.pure-button { + font-family: inherit; + font-size: 100%; + padding: 0.5em 1em; + color: #444; /* rgba not supported (IE 8) */ + color: rgba(0, 0, 0, 0.80); /* rgba supported */ + border: 1px solid #999; /*IE 6/7/8*/ + border: none rgba(0, 0, 0, 0); /*IE9 + everything else*/ + background-color: #E6E6E6; + text-decoration: none; + border-radius: 2px; +} + +.pure-button-hover, +.pure-button:hover, +.pure-button:focus { + /* csslint ignore:start */ + filter: alpha(opacity=90); + /* csslint ignore:end */ + background-image: -webkit-linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); + background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); +} +.pure-button:focus { + outline: 0; +} +.pure-button-active, +.pure-button:active { + box-shadow: 0 0 0 1px rgba(0,0,0, 0.15) inset, 0 0 6px rgba(0,0,0, 0.20) inset; + border-color: #000\9; +} + +.pure-button[disabled], +.pure-button-disabled, +.pure-button-disabled:hover, +.pure-button-disabled:focus, +.pure-button-disabled:active { + border: none; + background-image: none; + /* csslint ignore:start */ + filter: alpha(opacity=40); + /* csslint ignore:end */ + opacity: 0.40; + cursor: not-allowed; + box-shadow: none; + pointer-events: none; +} + +.pure-button-hidden { + display: none; +} + +.pure-button-primary, +.pure-button-selected, +a.pure-button-primary, +a.pure-button-selected { + background-color: rgb(0, 120, 231); + color: #fff; +} + +/* Button Groups */ +.pure-button-group .pure-button { + margin: 0; + border-radius: 0; + border-right: 1px solid #111; /* fallback color for rgba() for IE7/8 */ + border-right: 1px solid rgba(0, 0, 0, 0.2); + +} + +.pure-button-group .pure-button:first-child { + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} +.pure-button-group .pure-button:last-child { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-right: none; +} + +/*csslint box-model:false*/ +/* +Box-model set to false because we're setting a height on select elements, which +also have border and padding. This is done because some browsers don't render +the padding. We explicitly set the box-model for select elements to border-box, +so we can ignore the csslint warning. +*/ + +.pure-form input[type="text"], +.pure-form input[type="password"], +.pure-form input[type="email"], +.pure-form input[type="url"], +.pure-form input[type="date"], +.pure-form input[type="month"], +.pure-form input[type="time"], +.pure-form input[type="datetime"], +.pure-form input[type="datetime-local"], +.pure-form input[type="week"], +.pure-form input[type="number"], +.pure-form input[type="search"], +.pure-form input[type="tel"], +.pure-form input[type="color"], +.pure-form select, +.pure-form textarea { + padding: 0.5em 0.6em; + display: inline-block; + border: 1px solid #ccc; + box-shadow: inset 0 1px 3px #ddd; + border-radius: 4px; + vertical-align: middle; + box-sizing: border-box; +} + +/* +Need to separate out the :not() selector from the rest of the CSS 2.1 selectors +since IE8 won't execute CSS that contains a CSS3 selector. +*/ +.pure-form input:not([type]) { + padding: 0.5em 0.6em; + display: inline-block; + border: 1px solid #ccc; + box-shadow: inset 0 1px 3px #ddd; + border-radius: 4px; + box-sizing: border-box; +} + + +/* Chrome (as of v.32/34 on OS X) needs additional room for color to display. */ +/* May be able to remove this tweak as color inputs become more standardized across browsers. */ +.pure-form input[type="color"] { + padding: 0.2em 0.5em; +} + + +.pure-form input[type="text"]:focus, +.pure-form input[type="password"]:focus, +.pure-form input[type="email"]:focus, +.pure-form input[type="url"]:focus, +.pure-form input[type="date"]:focus, +.pure-form input[type="month"]:focus, +.pure-form input[type="time"]:focus, +.pure-form input[type="datetime"]:focus, +.pure-form input[type="datetime-local"]:focus, +.pure-form input[type="week"]:focus, +.pure-form input[type="number"]:focus, +.pure-form input[type="search"]:focus, +.pure-form input[type="tel"]:focus, +.pure-form input[type="color"]:focus, +.pure-form select:focus, +.pure-form textarea:focus { + outline: 0; + border-color: #129FEA; +} + +/* +Need to separate out the :not() selector from the rest of the CSS 2.1 selectors +since IE8 won't execute CSS that contains a CSS3 selector. +*/ +.pure-form input:not([type]):focus { + outline: 0; + border-color: #129FEA; +} + +.pure-form input[type="file"]:focus, +.pure-form input[type="radio"]:focus, +.pure-form input[type="checkbox"]:focus { + outline: thin solid #129FEA; + outline: 1px auto #129FEA; +} +.pure-form .pure-checkbox, +.pure-form .pure-radio { + margin: 0.5em 0; + display: block; +} + +.pure-form input[type="text"][disabled], +.pure-form input[type="password"][disabled], +.pure-form input[type="email"][disabled], +.pure-form input[type="url"][disabled], +.pure-form input[type="date"][disabled], +.pure-form input[type="month"][disabled], +.pure-form input[type="time"][disabled], +.pure-form input[type="datetime"][disabled], +.pure-form input[type="datetime-local"][disabled], +.pure-form input[type="week"][disabled], +.pure-form input[type="number"][disabled], +.pure-form input[type="search"][disabled], +.pure-form input[type="tel"][disabled], +.pure-form input[type="color"][disabled], +.pure-form select[disabled], +.pure-form textarea[disabled] { + cursor: not-allowed; + background-color: #eaeded; + color: #cad2d3; +} + +/* +Need to separate out the :not() selector from the rest of the CSS 2.1 selectors +since IE8 won't execute CSS that contains a CSS3 selector. +*/ +.pure-form input:not([type])[disabled] { + cursor: not-allowed; + background-color: #eaeded; + color: #cad2d3; +} +.pure-form input[readonly], +.pure-form select[readonly], +.pure-form textarea[readonly] { + background-color: #eee; /* menu hover bg color */ + color: #777; /* menu text color */ + border-color: #ccc; +} + +.pure-form input:focus:invalid, +.pure-form textarea:focus:invalid, +.pure-form select:focus:invalid { + color: #b94a48; + border-color: #e9322d; +} +.pure-form input[type="file"]:focus:invalid:focus, +.pure-form input[type="radio"]:focus:invalid:focus, +.pure-form input[type="checkbox"]:focus:invalid:focus { + outline-color: #e9322d; +} +.pure-form select { + /* Normalizes the height; padding is not sufficient. */ + height: 2.25em; + border: 1px solid #ccc; + background-color: white; +} +.pure-form select[multiple] { + height: auto; +} +.pure-form label { + margin: 0.5em 0 0.2em; +} +.pure-form fieldset { + margin: 0; + padding: 0.35em 0 0.75em; + border: 0; +} +.pure-form legend { + display: block; + width: 100%; + padding: 0.3em 0; + margin-bottom: 0.3em; + color: #333; + border-bottom: 1px solid #e5e5e5; +} + +.pure-form-stacked input[type="text"], +.pure-form-stacked input[type="password"], +.pure-form-stacked input[type="email"], +.pure-form-stacked input[type="url"], +.pure-form-stacked input[type="date"], +.pure-form-stacked input[type="month"], +.pure-form-stacked input[type="time"], +.pure-form-stacked input[type="datetime"], +.pure-form-stacked input[type="datetime-local"], +.pure-form-stacked input[type="week"], +.pure-form-stacked input[type="number"], +.pure-form-stacked input[type="search"], +.pure-form-stacked input[type="tel"], +.pure-form-stacked input[type="color"], +.pure-form-stacked input[type="file"], +.pure-form-stacked select, +.pure-form-stacked label, +.pure-form-stacked textarea { + display: block; + margin: 0.25em 0; +} + +/* +Need to separate out the :not() selector from the rest of the CSS 2.1 selectors +since IE8 won't execute CSS that contains a CSS3 selector. +*/ +.pure-form-stacked input:not([type]) { + display: block; + margin: 0.25em 0; +} +.pure-form-aligned input, +.pure-form-aligned textarea, +.pure-form-aligned select, +/* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline instead. */ +.pure-form-aligned .pure-help-inline, +.pure-form-message-inline { + display: inline-block; + *display: inline; + *zoom: 1; + vertical-align: middle; +} +.pure-form-aligned textarea { + vertical-align: top; +} + +/* Aligned Forms */ +.pure-form-aligned .pure-control-group { + margin-bottom: 0.5em; +} +.pure-form-aligned .pure-control-group label { + text-align: right; + display: inline-block; + vertical-align: middle; + width: 10em; + margin: 0 1em 0 0; +} +.pure-form-aligned .pure-controls { + margin: 1.5em 0 0 11em; +} + +/* Rounded Inputs */ +.pure-form input.pure-input-rounded, +.pure-form .pure-input-rounded { + border-radius: 2em; + padding: 0.5em 1em; +} + +/* Grouped Inputs */ +.pure-form .pure-group fieldset { + margin-bottom: 10px; +} +.pure-form .pure-group input, +.pure-form .pure-group textarea { + display: block; + padding: 10px; + margin: 0 0 -1px; + border-radius: 0; + position: relative; + top: -1px; +} +.pure-form .pure-group input:focus, +.pure-form .pure-group textarea:focus { + z-index: 3; +} +.pure-form .pure-group input:first-child, +.pure-form .pure-group textarea:first-child { + top: 1px; + border-radius: 4px 4px 0 0; + margin: 0; +} +.pure-form .pure-group input:first-child:last-child, +.pure-form .pure-group textarea:first-child:last-child { + top: 1px; + border-radius: 4px; + margin: 0; +} +.pure-form .pure-group input:last-child, +.pure-form .pure-group textarea:last-child { + top: -2px; + border-radius: 0 0 4px 4px; + margin: 0; +} +.pure-form .pure-group button { + margin: 0.35em 0; +} + +.pure-form .pure-input-1 { + width: 100%; +} +.pure-form .pure-input-3-4 { + width: 75%; +} +.pure-form .pure-input-2-3 { + width: 66%; +} +.pure-form .pure-input-1-2 { + width: 50%; +} +.pure-form .pure-input-1-3 { + width: 33%; +} +.pure-form .pure-input-1-4 { + width: 25%; +} + +/* Inline help for forms */ +/* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline instead. */ +.pure-form .pure-help-inline, +.pure-form-message-inline { + display: inline-block; + padding-left: 0.3em; + color: #666; + vertical-align: middle; + font-size: 0.875em; +} + +/* Block help for forms */ +.pure-form-message { + display: block; + color: #666; + font-size: 0.875em; +} + +@media only screen and (max-width : 480px) { + .pure-form button[type="submit"] { + margin: 0.7em 0 0; + } + + .pure-form input:not([type]), + .pure-form input[type="text"], + .pure-form input[type="password"], + .pure-form input[type="email"], + .pure-form input[type="url"], + .pure-form input[type="date"], + .pure-form input[type="month"], + .pure-form input[type="time"], + .pure-form input[type="datetime"], + .pure-form input[type="datetime-local"], + .pure-form input[type="week"], + .pure-form input[type="number"], + .pure-form input[type="search"], + .pure-form input[type="tel"], + .pure-form input[type="color"], + .pure-form label { + margin-bottom: 0.3em; + display: block; + } + + .pure-group input:not([type]), + .pure-group input[type="text"], + .pure-group input[type="password"], + .pure-group input[type="email"], + .pure-group input[type="url"], + .pure-group input[type="date"], + .pure-group input[type="month"], + .pure-group input[type="time"], + .pure-group input[type="datetime"], + .pure-group input[type="datetime-local"], + .pure-group input[type="week"], + .pure-group input[type="number"], + .pure-group input[type="search"], + .pure-group input[type="tel"], + .pure-group input[type="color"] { + margin-bottom: 0; + } + + .pure-form-aligned .pure-control-group label { + margin-bottom: 0.3em; + text-align: left; + display: block; + width: 100%; + } + + .pure-form-aligned .pure-controls { + margin: 1.5em 0 0 0; + } + + /* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline instead. */ + .pure-form .pure-help-inline, + .pure-form-message-inline, + .pure-form-message { + display: block; + font-size: 0.75em; + /* Increased bottom padding to make it group with its related input element. */ + padding: 0.2em 0 0.8em; + } +} + +/*csslint adjoining-classes: false, box-model:false*/ +.pure-menu { + box-sizing: border-box; +} + +.pure-menu-fixed { + position: fixed; + left: 0; + top: 0; + z-index: 3; +} + +.pure-menu-list, +.pure-menu-item { + position: relative; +} + +.pure-menu-list { + list-style: none; + margin: 0; + padding: 0; +} + +.pure-menu-item { + padding: 0; + margin: 0; + height: 100%; +} + +.pure-menu-link, +.pure-menu-heading { + display: block; + text-decoration: none; + white-space: nowrap; +} + +/* HORIZONTAL MENU */ +.pure-menu-horizontal { + width: 100%; + white-space: nowrap; +} + +.pure-menu-horizontal .pure-menu-list { + display: inline-block; +} + +/* Initial menus should be inline-block so that they are horizontal */ +.pure-menu-horizontal .pure-menu-item, +.pure-menu-horizontal .pure-menu-heading, +.pure-menu-horizontal .pure-menu-separator { + display: inline-block; + *display: inline; + zoom: 1; + vertical-align: middle; +} + +/* Submenus should still be display: block; */ +.pure-menu-item .pure-menu-item { + display: block; +} + +.pure-menu-children { + display: none; + position: absolute; + left: 100%; + top: 0; + margin: 0; + padding: 0; + z-index: 3; +} + +.pure-menu-horizontal .pure-menu-children { + left: 0; + top: auto; + width: inherit; +} + +.pure-menu-allow-hover:hover > .pure-menu-children, +.pure-menu-active > .pure-menu-children { + display: block; + position: absolute; +} + +/* Vertical Menus - show the dropdown arrow */ +.pure-menu-has-children > .pure-menu-link:after { + padding-left: 0.5em; + content: "\25B8"; + font-size: small; +} + +/* Horizontal Menus - show the dropdown arrow */ +.pure-menu-horizontal .pure-menu-has-children > .pure-menu-link:after { + content: "\25BE"; +} + +/* scrollable menus */ +.pure-menu-scrollable { + overflow-y: scroll; + overflow-x: hidden; +} + +.pure-menu-scrollable .pure-menu-list { + display: block; +} + +.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list { + display: inline-block; +} + +.pure-menu-horizontal.pure-menu-scrollable { + white-space: nowrap; + overflow-y: hidden; + overflow-x: auto; + -ms-overflow-style: none; + -webkit-overflow-scrolling: touch; + /* a little extra padding for this style to allow for scrollbars */ + padding: .5em 0; +} + +.pure-menu-horizontal.pure-menu-scrollable::-webkit-scrollbar { + display: none; +} + +/* misc default styling */ + +.pure-menu-separator, +.pure-menu-horizontal .pure-menu-children .pure-menu-separator { + background-color: #ccc; + height: 1px; + margin: .3em 0; +} + +.pure-menu-horizontal .pure-menu-separator { + width: 1px; + height: 1.3em; + margin: 0 .3em ; +} + +/* Need to reset the separator since submenu is vertical */ +.pure-menu-horizontal .pure-menu-children .pure-menu-separator { + display: block; + width: auto; +} + +.pure-menu-heading { + text-transform: uppercase; + color: #565d64; +} + +.pure-menu-link { + color: #777; +} + +.pure-menu-children { + background-color: #fff; +} + +.pure-menu-link, +.pure-menu-disabled, +.pure-menu-heading { + padding: .5em 1em; +} + +.pure-menu-disabled { + opacity: .5; +} + +.pure-menu-disabled .pure-menu-link:hover { + background-color: transparent; +} + +.pure-menu-active > .pure-menu-link, +.pure-menu-link:hover, +.pure-menu-link:focus { + background-color: #eee; +} + +.pure-menu-selected .pure-menu-link, +.pure-menu-selected .pure-menu-link:visited { + color: #000; +} + +.pure-table { + /* Remove spacing between table cells (from Normalize.css) */ + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + border: 1px solid #cbcbcb; +} + +.pure-table caption { + color: #000; + font: italic 85%/1 arial, sans-serif; + padding: 1em 0; + text-align: center; +} + +.pure-table td, +.pure-table th { + border-left: 1px solid #cbcbcb;/* inner column border */ + border-width: 0 0 0 1px; + font-size: inherit; + margin: 0; + overflow: visible; /*to make ths where the title is really long work*/ + padding: 0.5em 1em; /* cell padding */ +} + +/* Consider removing this next declaration block, as it causes problems when +there's a rowspan on the first cell. Case added to the tests. issue#432 */ +.pure-table td:first-child, +.pure-table th:first-child { + border-left-width: 0; +} + +.pure-table thead { + background-color: #e0e0e0; + color: #000; + text-align: left; + vertical-align: bottom; +} + +/* +striping: + even - #fff (white) + odd - #f2f2f2 (light gray) +*/ +.pure-table td { + background-color: transparent; +} +.pure-table-odd td { + background-color: #f2f2f2; +} + +/* nth-child selector for modern browsers */ +.pure-table-striped tr:nth-child(2n-1) td { + background-color: #f2f2f2; +} + +/* BORDERED TABLES */ +.pure-table-bordered td { + border-bottom: 1px solid #cbcbcb; +} +.pure-table-bordered tbody > tr:last-child > td { + border-bottom-width: 0; +} + + +/* HORIZONTAL BORDERED TABLES */ + +.pure-table-horizontal td, +.pure-table-horizontal th { + border-width: 0 0 1px 0; + border-bottom: 1px solid #cbcbcb; +} +.pure-table-horizontal tbody > tr:last-child > td { + border-bottom-width: 0; +} diff --git a/pkgs/csslib/test/examples/skeleton.css b/pkgs/csslib/test/examples/skeleton.css new file mode 100644 index 000000000..f28bf6c59 --- /dev/null +++ b/pkgs/csslib/test/examples/skeleton.css @@ -0,0 +1,418 @@ +/* +* Skeleton V2.0.4 +* Copyright 2014, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/29/2014 +*/ + + +/* Table of contents +–––––––––––––––––––––––––––––––––––––––––––––––––– +- Grid +- Base Styles +- Typography +- Links +- Buttons +- Forms +- Lists +- Code +- Tables +- Spacing +- Utilities +- Clearing +- Media Queries +*/ + + +/* Grid +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.container { + position: relative; + width: 100%; + max-width: 960px; + margin: 0 auto; + padding: 0 20px; + box-sizing: border-box; } +.column, +.columns { + width: 100%; + float: left; + box-sizing: border-box; } + +/* For devices larger than 400px */ +@media (min-width: 400px) { + .container { + width: 85%; + padding: 0; } +} + +/* For devices larger than 550px */ +@media (min-width: 550px) { + .container { + width: 80%; } + .column, + .columns { + margin-left: 4%; } + .column:first-child, + .columns:first-child { + margin-left: 0; } + + .one.column, + .one.columns { width: 4.66666666667%; } + .two.columns { width: 13.3333333333%; } + .three.columns { width: 22%; } + .four.columns { width: 30.6666666667%; } + .five.columns { width: 39.3333333333%; } + .six.columns { width: 48%; } + .seven.columns { width: 56.6666666667%; } + .eight.columns { width: 65.3333333333%; } + .nine.columns { width: 74.0%; } + .ten.columns { width: 82.6666666667%; } + .eleven.columns { width: 91.3333333333%; } + .twelve.columns { width: 100%; margin-left: 0; } + + .one-third.column { width: 30.6666666667%; } + .two-thirds.column { width: 65.3333333333%; } + + .one-half.column { width: 48%; } + + /* Offsets */ + .offset-by-one.column, + .offset-by-one.columns { margin-left: 8.66666666667%; } + .offset-by-two.column, + .offset-by-two.columns { margin-left: 17.3333333333%; } + .offset-by-three.column, + .offset-by-three.columns { margin-left: 26%; } + .offset-by-four.column, + .offset-by-four.columns { margin-left: 34.6666666667%; } + .offset-by-five.column, + .offset-by-five.columns { margin-left: 43.3333333333%; } + .offset-by-six.column, + .offset-by-six.columns { margin-left: 52%; } + .offset-by-seven.column, + .offset-by-seven.columns { margin-left: 60.6666666667%; } + .offset-by-eight.column, + .offset-by-eight.columns { margin-left: 69.3333333333%; } + .offset-by-nine.column, + .offset-by-nine.columns { margin-left: 78.0%; } + .offset-by-ten.column, + .offset-by-ten.columns { margin-left: 86.6666666667%; } + .offset-by-eleven.column, + .offset-by-eleven.columns { margin-left: 95.3333333333%; } + + .offset-by-one-third.column, + .offset-by-one-third.columns { margin-left: 34.6666666667%; } + .offset-by-two-thirds.column, + .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } + + .offset-by-one-half.column, + .offset-by-one-half.columns { margin-left: 52%; } + +} + + +/* Base Styles +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* NOTE +html is set to 62.5% so that all the REM measurements throughout Skeleton +are based on 10px sizing. So basically 1.5rem = 15px :) */ +html { + font-size: 62.5%; } +body { + font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ + line-height: 1.6; + font-weight: 400; + font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #222; } + + +/* Typography +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 2rem; + font-weight: 300; } +h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} +h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } +h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } +h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } +h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } +h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } + +/* Larger than phablet */ +@media (min-width: 550px) { + h1 { font-size: 5.0rem; } + h2 { font-size: 4.2rem; } + h3 { font-size: 3.6rem; } + h4 { font-size: 3.0rem; } + h5 { font-size: 2.4rem; } + h6 { font-size: 1.5rem; } +} + +p { + margin-top: 0; } + + +/* Links +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +a { + color: #1EAEDB; } +a:hover { + color: #0FA0CE; } + + +/* Buttons +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.button, +button, +input[type="submit"], +input[type="reset"], +input[type="button"] { + display: inline-block; + height: 38px; + padding: 0 30px; + color: #555; + text-align: center; + font-size: 11px; + font-weight: 600; + line-height: 38px; + letter-spacing: .1rem; + text-transform: uppercase; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border-radius: 4px; + border: 1px solid #bbb; + cursor: pointer; + box-sizing: border-box; } +.button:hover, +button:hover, +input[type="submit"]:hover, +input[type="reset"]:hover, +input[type="button"]:hover, +.button:focus, +button:focus, +input[type="submit"]:focus, +input[type="reset"]:focus, +input[type="button"]:focus { + color: #333; + border-color: #888; + outline: 0; } +.button.button-primary, +button.button-primary, +input[type="submit"].button-primary, +input[type="reset"].button-primary, +input[type="button"].button-primary { + color: #FFF; + background-color: #33C3F0; + border-color: #33C3F0; } +.button.button-primary:hover, +button.button-primary:hover, +input[type="submit"].button-primary:hover, +input[type="reset"].button-primary:hover, +input[type="button"].button-primary:hover, +.button.button-primary:focus, +button.button-primary:focus, +input[type="submit"].button-primary:focus, +input[type="reset"].button-primary:focus, +input[type="button"].button-primary:focus { + color: #FFF; + background-color: #1EAEDB; + border-color: #1EAEDB; } + + +/* Forms +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea, +select { + height: 38px; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + background-color: #fff; + border: 1px solid #D1D1D1; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; } +/* Removes awkward default styles on some inputs for iOS */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } +textarea { + min-height: 65px; + padding-top: 6px; + padding-bottom: 6px; } +input[type="email"]:focus, +input[type="number"]:focus, +input[type="search"]:focus, +input[type="text"]:focus, +input[type="tel"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +textarea:focus, +select:focus { + border: 1px solid #33C3F0; + outline: 0; } +label, +legend { + display: block; + margin-bottom: .5rem; + font-weight: 600; } +fieldset { + padding: 0; + border-width: 0; } +input[type="checkbox"], +input[type="radio"] { + display: inline; } +label > .label-body { + display: inline-block; + margin-left: .5rem; + font-weight: normal; } + + +/* Lists +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +ul { + list-style: circle inside; } +ol { + list-style: decimal inside; } +ol, ul { + padding-left: 0; + margin-top: 0; } +ul ul, +ul ol, +ol ol, +ol ul { + margin: 1.5rem 0 1.5rem 3rem; + font-size: 90%; } +li { + margin-bottom: 1rem; } + + +/* Code +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +code { + padding: .2rem .5rem; + margin: 0 .2rem; + font-size: 90%; + white-space: nowrap; + background: #F1F1F1; + border: 1px solid #E1E1E1; + border-radius: 4px; } +pre > code { + display: block; + padding: 1rem 1.5rem; + white-space: pre; } + + +/* Tables +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +th, +td { + padding: 12px 15px; + text-align: left; + border-bottom: 1px solid #E1E1E1; } +th:first-child, +td:first-child { + padding-left: 0; } +th:last-child, +td:last-child { + padding-right: 0; } + + +/* Spacing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +button, +.button { + margin-bottom: 1rem; } +input, +textarea, +select, +fieldset { + margin-bottom: 1.5rem; } +pre, +blockquote, +dl, +figure, +table, +p, +ul, +ol, +form { + margin-bottom: 2.5rem; } + + +/* Utilities +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.u-full-width { + width: 100%; + box-sizing: border-box; } +.u-max-full-width { + max-width: 100%; + box-sizing: border-box; } +.u-pull-right { + float: right; } +.u-pull-left { + float: left; } + + +/* Misc +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +hr { + margin-top: 3rem; + margin-bottom: 3.5rem; + border-width: 0; + border-top: 1px solid #E1E1E1; } + + +/* Clearing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ + +/* Self Clearing Goodness */ +.container:after, +.row:after, +.u-cf { + content: ""; + display: table; + clear: both; } + + +/* Media Queries +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* +Note: The best way to structure the use of media queries is to create the queries +near the relevant code. For example, if you wanted to change the styles for buttons +on small devices, paste the mobile query code up in the buttons section and style it +there. +*/ + + +/* Larger than mobile */ +@media (min-width: 400px) {} + +/* Larger than phablet (also point when grid becomes active) */ +@media (min-width: 550px) {} + +/* Larger than tablet */ +@media (min-width: 750px) {} + +/* Larger than desktop */ +@media (min-width: 1000px) {} + +/* Larger than Desktop HD */ +@media (min-width: 1200px) {} diff --git a/pkgs/csslib/test/samples_test.dart b/pkgs/csslib/test/samples_test.dart new file mode 100644 index 000000000..22d4747ac --- /dev/null +++ b/pkgs/csslib/test/samples_test.dart @@ -0,0 +1,32 @@ +library samples_test; + +import 'dart:mirrors'; +import 'dart:io'; +import 'package:test/test.dart'; +import 'package:csslib/parser.dart'; +import 'package:csslib/src/messages.dart'; +import 'testing.dart'; + +const testOptions = const PreprocessorOptions( + useColors: false, + checked: false, + warningsAsErrors: true, + inputFile: 'memory'); + +void testCSSFile(File cssFile) { + final errors = []; + final css = cssFile.readAsStringSync(); + final stylesheet = parseCss(css, errors: errors, opts: testOptions); + + expect(stylesheet, isNotNull); + expect(errors, isEmpty, reason: errors.toString()); +} + +main() { + final libraryUri = currentMirrorSystem().findLibrary(#samples_test).uri; + final cssDir = new Directory.fromUri(libraryUri.resolve('examples')); + for (var element in cssDir.listSync()) + if (element is File && element.uri.pathSegments.last.endsWith('.css')) { + test(element.uri.pathSegments.last, () => testCSSFile(element)); + } +} From 022217fd6591196f65d203e41f48bcbedea706c6 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Thu, 18 May 2017 11:01:15 -0700 Subject: [PATCH 093/245] Restricts examples test to VM due to file I/O (dart-lang/csslib#54) --- pkgs/csslib/test/samples_test.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/test/samples_test.dart b/pkgs/csslib/test/samples_test.dart index 22d4747ac..4607a0503 100644 --- a/pkgs/csslib/test/samples_test.dart +++ b/pkgs/csslib/test/samples_test.dart @@ -1,11 +1,11 @@ +@TestOn('vm') library samples_test; -import 'dart:mirrors'; import 'dart:io'; +import 'dart:mirrors'; + import 'package:test/test.dart'; import 'package:csslib/parser.dart'; -import 'package:csslib/src/messages.dart'; -import 'testing.dart'; const testOptions = const PreprocessorOptions( useColors: false, @@ -16,7 +16,7 @@ const testOptions = const PreprocessorOptions( void testCSSFile(File cssFile) { final errors = []; final css = cssFile.readAsStringSync(); - final stylesheet = parseCss(css, errors: errors, opts: testOptions); + final stylesheet = parse(css, errors: errors, options: testOptions); expect(stylesheet, isNotNull); expect(errors, isEmpty, reason: errors.toString()); From d2ee65487b7146cc7476bd277c7a6a0171157c18 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Mon, 22 May 2017 11:18:54 -0700 Subject: [PATCH 094/245] Updates version (dart-lang/csslib#55) --- pkgs/csslib/CHANGELOG.md | 5 +++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index e23bdf8f1..7a10387f5 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.13.7 + +* Supports nested at-rules. +* Supports nested HTML comments in CSS comments and vice-versa. + ## 0.13.6 * Adds support for `@viewport`. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 8ed29b650..8634c95c5 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.6 +version: 0.13.7 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 2b36d1c9fcb040e8f4b20ac9b960daf695aec5ee Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Tue, 30 May 2017 13:15:44 -0700 Subject: [PATCH 095/245] Updates version (dart-lang/csslib#57) --- pkgs/csslib/CHANGELOG.md | 10 +++++++++- pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 7a10387f5..8662956ec 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,8 +1,16 @@ -## 0.13.7 +## 0.14.0 + +### New features * Supports nested at-rules. * Supports nested HTML comments in CSS comments and vice-versa. +### Breaking changes + +* The `List rulesets` field on `MediaDirective`, `HostDirective`, and + `StyletDirective` has been replaced by `List rules` to allow nested + at-rules in addition to rulesets. + ## 0.13.6 * Adds support for `@viewport`. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 8634c95c5..2111ec92e 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.13.7 +version: 0.14.0 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 66a100d6842122a1b3f3d5c75a98a1d0c59a3e3c Mon Sep 17 00:00:00 2001 From: Keerti Parthasarathy Date: Wed, 26 Jul 2017 17:28:46 -0700 Subject: [PATCH 096/245] Update the comment based generic syntax usage BUG= R=kevmoo@google.com Review-Url: https://codereview.chromium.org//2985973002 . --- pkgs/csslib/lib/src/property.dart | 2 +- pkgs/csslib/pubspec.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index a2cf97ca1..69f5c5425 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -1245,4 +1245,4 @@ class BoxEdge { num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0); } -/*=T*/ _mergeVal/**/(/*=T*/ x, /*=T*/ y) => y != null ? y : x; +T _mergeVal(T x, T y) => y != null ? y : x; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 2111ec92e..225b60118 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,10 +1,10 @@ name: csslib -version: 0.14.0 +version: 0.14.1-dev author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib environment: - sdk: '>=1.1.0 <2.0.0' + sdk: '>=1.21.0 <2.0.0-dev.infinity' dependencies: args: '>=0.9.0 <0.14.0' logging: '>=0.9.0 <0.12.0' From a39f810f2518b89d09161d51a2e598c38dad9f9c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 26 Jul 2017 17:40:26 -0700 Subject: [PATCH 097/245] rename analysis_options --- pkgs/csslib/{.analysis_options => analysis_options.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pkgs/csslib/{.analysis_options => analysis_options.yaml} (100%) diff --git a/pkgs/csslib/.analysis_options b/pkgs/csslib/analysis_options.yaml similarity index 100% rename from pkgs/csslib/.analysis_options rename to pkgs/csslib/analysis_options.yaml From 4a47482a8fe27670afed3458b00801173fb90d0a Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 26 Jul 2017 17:40:59 -0700 Subject: [PATCH 098/245] Enable travis --- pkgs/csslib/.travis.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 pkgs/csslib/.travis.yml diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml new file mode 100644 index 000000000..b79391f8e --- /dev/null +++ b/pkgs/csslib/.travis.yml @@ -0,0 +1,24 @@ +language: dart +sudo: false +dart: + - dev + - stable +dart_task: + - test: --platform vm + - test: --platform firefox -j 1 + - test: --platform dartium + install_dartium: true + - dartanalyzer + +matrix: + include: + - dart: dev + dart_task: dartfmt + +# Only building master means that we don't run two builds for each pull request. +branches: + only: [master] + +cache: + directories: + - $HOME/.pub-cache From 6c8b08e2234bc85be63d1a36aeb6e3ec60d7ab02 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 26 Jul 2017 17:43:10 -0700 Subject: [PATCH 099/245] dartfmt --- pkgs/csslib/lib/src/tree.dart | 3 +- pkgs/csslib/test/compiler_test.dart | 20 ++---- pkgs/csslib/test/error_test.dart | 96 +++++++------------------- pkgs/csslib/test/extend_test.dart | 42 ++++-------- pkgs/csslib/test/mixin_test.dart | 102 ++++++++++------------------ pkgs/csslib/test/var_test.dart | 12 ++-- pkgs/csslib/test/visitor_test.dart | 4 +- 7 files changed, 83 insertions(+), 196 deletions(-) diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 7e684734b..7e1fe6d75 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -640,8 +640,7 @@ class MediaDirective extends Directive { final List mediaQueries; final List rules; - MediaDirective(this.mediaQueries, this.rules, SourceSpan span) - : super(span); + MediaDirective(this.mediaQueries, this.rules, SourceSpan span) : super(span); MediaDirective clone() { var cloneQueries = []; diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index e64af7faa..5faabe27f 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -533,9 +533,7 @@ void testArrayOfChars() { expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foo { color: #f00; left: 20px; @@ -597,9 +595,7 @@ div:nth-child(2n) { color : red; } expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' html:lang(fr-ca) { quotes: '" ' ' "'; } @@ -669,9 +665,7 @@ void testHost() { expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' @host { :scope { white-space: nowrap; @@ -697,9 +691,7 @@ void testStringEscape() { expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' a { foo: '{"text" : "a\\\""}'; }'''); @@ -721,9 +713,7 @@ void testEmitter() { walkTree(stylesheet); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foo { color: #f00; left: 20px; diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 1060d8355..013865e3e 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -21,17 +21,13 @@ void testUnsupportedFontWeights() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 24: Unknown property value bolder .foobar { font-weight: bolder; } ^^^^^^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { font-weight: bolder; }'''); @@ -42,16 +38,12 @@ error on line 1, column 24: Unknown property value bolder stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 24: Unknown property value lighter .foobar { font-weight: lighter; } ^^^^^^^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { font-weight: lighter; }'''); @@ -62,16 +54,12 @@ error on line 1, column 24: Unknown property value lighter stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 24: Unknown property value inherit .foobar { font-weight: inherit; } ^^^^^^^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { font-weight: inherit; }'''); @@ -89,16 +77,12 @@ void testUnsupportedLineHeights() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 24: Unexpected value for line-height .foobar { line-height: 120%; } ^^^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { line-height: 120%; }'''); @@ -109,16 +93,12 @@ error on line 1, column 24: Unexpected value for line-height stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 24: Unexpected unit for line-height .foobar { line-height: 20cm; } ^^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { line-height: 20cm; }'''); @@ -129,16 +109,12 @@ error on line 1, column 24: Unexpected unit for line-height stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 24: Unknown property value inherit .foobar { line-height: inherit; } ^^^^^^^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { line-height: inherit; }'''); @@ -153,16 +129,12 @@ void testBadSelectors() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 1: Not a valid ID selector expected #id # foo { color: #ff00ff; } ^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' # foo { color: #f0f; }'''); @@ -172,16 +144,12 @@ error on line 1, column 1: Not a valid ID selector expected #id stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 1: Not a valid class selector expected .className . foo { color: #ff00ff; } ^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' . foo { color: #f0f; }'''); @@ -196,16 +164,12 @@ void testBadHexValues() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 18: Bad hex number .foobar { color: #AH787; } ^^^^^^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { color: #AH787; }'''); @@ -215,17 +179,13 @@ error on line 1, column 18: Bad hex number stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 18: Unknown property value redder .foobar { color: redder; } ^^^^^^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { color: redder; }'''); @@ -235,17 +195,13 @@ error on line 1, column 18: Unknown property value redder stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 18: Expected hex number .foobar { color: # ffffff; } ^'''); expect(stylesheet != null, true); - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { color: # ffffff; }'''); @@ -255,9 +211,7 @@ error on line 1, column 18: Expected hex number stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect( - errors[0].toString(), - r''' + expect(errors[0].toString(), r''' error on line 1, column 18: Expected hex number .foobar { color: # 123fff; } ^'''); @@ -266,9 +220,7 @@ error on line 1, column 18: Expected hex number // Formating is off with an extra space. However, the entire value is bad // and isn't processed anyway. - expect( - prettyPrint(stylesheet), - r''' + expect(prettyPrint(stylesheet), r''' .foobar { color: # 123 fff; }'''); diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index 184a8b467..7df68c577 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -18,8 +18,7 @@ compileAndValidate(String input, String generated) { } void simpleExtend() { - compileAndValidate( - r''' + compileAndValidate(r''' .error { border: 1px red; background-color: #fdd; @@ -28,8 +27,7 @@ void simpleExtend() { @extend .error; border-width: 3px; } -''', - r''' +''', r''' .error, .seriousError { border: 1px #f00; background-color: #fdd; @@ -40,8 +38,7 @@ void simpleExtend() { } void complexSelectors() { - compileAndValidate( - r''' + compileAndValidate(r''' .error { border: 1px #f00; background-color: #fdd; @@ -53,8 +50,7 @@ void complexSelectors() { @extend .error; border-width: 3px; } -''', - r''' +''', r''' .error, .seriousError { border: 1px #f00; background-color: #fdd; @@ -66,16 +62,14 @@ void complexSelectors() { border-width: 3px; }'''); - compileAndValidate( - r''' + compileAndValidate(r''' a:hover { text-decoration: underline; } .hoverlink { @extend a:hover; } -''', - r''' +''', r''' a:hover, .hoverlink { text-decoration: underline; } @@ -84,8 +78,7 @@ a:hover, .hoverlink { } void multipleExtends() { - compileAndValidate( - r''' + compileAndValidate(r''' .error { border: 1px #f00; background-color: #fdd; @@ -99,8 +92,7 @@ void multipleExtends() { @extend .attention; border-width: 3px; } -''', - r''' +''', r''' .error, .seriousError { border: 1px #f00; background-color: #fdd; @@ -115,8 +107,7 @@ void multipleExtends() { } void chaining() { - compileAndValidate( - r''' + compileAndValidate(r''' .error { border: 1px #f00; background-color: #fdd; @@ -133,8 +124,7 @@ void chaining() { left: 10%; right: 10%; } -''', - r''' +''', r''' .error, .seriousError, .criticalError { border: 1px #f00; background-color: #fdd; @@ -152,8 +142,7 @@ void chaining() { } void nestedSelectors() { - compileAndValidate( - r''' + compileAndValidate(r''' a { color: blue; &:hover { @@ -164,8 +153,7 @@ a { #fake-links .link { @extend a; } -''', - r''' +''', r''' a, #fake-links .link { color: #00f; } @@ -177,8 +165,7 @@ a:hover, #fake-links .link:hover { } void nestedMulty() { - compileAndValidate( - r''' + compileAndValidate(r''' .btn { display: inline-block; } @@ -190,8 +177,7 @@ input[type="checkbox"].toggle-button { @extend .btn; } } -''', - r''' +''', r''' .btn, input[type="checkbox"].toggle-button label { display: inline-block; } diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 375054cef..59071f91e 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -26,8 +26,7 @@ compilePolyfillAndValidate(String input, String generated) { } void topLevelMixin() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin silly-links { a { color: blue; @@ -36,8 +35,7 @@ void topLevelMixin() { } @include silly-links; -''', - r''' +''', r''' a { color: #00f; background-color: #f00; @@ -45,8 +43,7 @@ a { } void topLevelMixinTwoIncludes() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin a { a { color: blue; @@ -61,8 +58,7 @@ void topLevelMixinTwoIncludes() { } @include a; @include b; -''', - r''' +''', r''' a { color: #00f; background-color: #f00; @@ -75,8 +71,7 @@ span { /** Tests top-level mixins that includes another mixin. */ void topLevelMixinMultiRulesets() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin a { a { color: blue; @@ -98,8 +93,7 @@ void topLevelMixinMultiRulesets() { } @include a; @include c; -''', - r''' +''', r''' a { color: #00f; background-color: #f00; @@ -115,8 +109,7 @@ span { } void topLevelMixinDeeplyNestedRulesets() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin a { a { color: blue; @@ -156,8 +149,7 @@ void topLevelMixinDeeplyNestedRulesets() { @include d; } @include c; -''', - r''' +''', r''' a { color: #00f; background-color: #f00; @@ -183,8 +175,7 @@ a:hover { /** Tests selector groups and other combinators. */ void topLevelMixinSelectors() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin a { a, b { color: blue; @@ -197,8 +188,7 @@ void topLevelMixinSelectors() { } @include a; -''', - r''' +''', r''' a, b { color: #00f; background-color: #f00; @@ -210,24 +200,21 @@ div > span { } void declSimpleMixin() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin div-border { border: 2px dashed red; } div { @include div-border; } -''', - r''' +''', r''' div { border: 2px dashed #f00; }'''); } void declMixinTwoIncludes() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin div-border { border: 2px dashed red; } @@ -238,8 +225,7 @@ div { @include div-border; @include div-color; } -''', - r''' +''', r''' div { border: 2px dashed #f00; color: #00f; @@ -247,8 +233,7 @@ div { } void declMixinNestedIncludes() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin div-border { border: 2px dashed red; } @@ -267,8 +252,7 @@ div { @include div-border; @include div-color; } -''', - r''' +''', r''' div { border: 2px dashed #f00; padding: .5em; @@ -278,8 +262,7 @@ div { } void declMixinDeeperNestedIncludes() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin div-border { border: 2px dashed red; } @@ -297,8 +280,7 @@ div { @include div-border; @include div-color; } -''', - r''' +''', r''' div { border: 2px dashed #f00; padding: .5em; @@ -307,8 +289,7 @@ div { } void mixinArg() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin div-border-1 { border: 2px dashed red; } @@ -337,8 +318,7 @@ div-3 { div-4 { @include div-border-2; } -''', - r''' +''', r''' div-1 { margin-left: 10px; margin-right: 100px; @@ -358,8 +338,7 @@ div-4 { } void mixinArgs() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin box-shadow(@shadows...) { -moz-box-shadow: @shadows; -webkit-box-shadow: @shadows; @@ -368,8 +347,7 @@ void mixinArgs() { .shadows { @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999); -}''', - r''' +}''', r''' .shadowed { -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; @@ -379,8 +357,7 @@ void mixinArgs() { } void mixinManyArgs() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin border(@border-values) { border: @border-values } @@ -388,14 +365,12 @@ void mixinManyArgs() { .primary { @include border(3px solid green); } -''', - r''' +''', r''' .primary { border: 3px solid #008000; }'''); - compileAndValidate( - r''' + compileAndValidate(r''' @mixin setup(@border-color, @border-style, @border-size, @color) { border: @border-size @border-style @border-color; color: @color; @@ -404,16 +379,14 @@ void mixinManyArgs() { .primary { @include setup(red, solid, 5px, blue); } -''', - r''' +''', r''' .primary { border: 5px solid #f00; color: #00f; }'''); // Test passing a declaration that is multiple parameters. - compileAndValidate( - r''' + compileAndValidate(r''' @mixin colors(@text, @background, @border) { color: @text; background-color: @background; @@ -424,8 +397,7 @@ void mixinManyArgs() { .primary { @include colors(@values); } -''', - r''' +''', r''' var-values: #f00, #0f0, #00f; .primary { @@ -434,8 +406,7 @@ var-values: #f00, #0f0, #00f; border-color: #00f; }'''); - compilePolyfillAndValidate( - r''' + compilePolyfillAndValidate(r''' @mixin colors(@text, @background, @border) { color: @text; background-color: @background; @@ -446,8 +417,7 @@ var-values: #f00, #0f0, #00f; .primary { @include colors(@values); } -''', - r''' +''', r''' .primary { color: #f00; background-color: #0f0; @@ -590,8 +560,7 @@ div { } void includeGrammar() { - compileAndValidate( - r''' + compileAndValidate(r''' @mixin a { foo { color: red } } @@ -602,8 +571,7 @@ void includeGrammar() { } @include b; -''', - r''' +''', r''' foo { color: #f00; } @@ -611,8 +579,7 @@ foo { color: #f00; }'''); - compileAndValidate( - r''' + compileAndValidate(r''' @mixin a { color: red } @@ -621,8 +588,7 @@ foo { @include a; @include a } -''', - r''' +''', r''' foo { color: #f00; color: #f00; diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 3c53169b1..39e7c4581 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -748,15 +748,13 @@ var-color-foreground: #00f; } void polyfill() { - compilePolyfillAndValidate( - r''' + compilePolyfillAndValidate(r''' @color-background: red; @color-foreground: blue; .test { background-color: @color-background; color: @color-foreground; -}''', - r''' +}''', r''' .test { background-color: #f00; color: #00f; @@ -764,8 +762,7 @@ void polyfill() { } void testIndirects() { - compilePolyfillAndValidate( - ''' + compilePolyfillAndValidate(''' :root { var-redef: #0f0; @@ -782,8 +779,7 @@ void testIndirects() { } .test-1 { color: @redef; -}''', - r''' +}''', r''' :root { } .test { diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index 16071c7d0..02784c404 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -60,9 +60,7 @@ void testClassVisitors() { ..visitTree(s); expect(clsVisits.matches, true); - expect( - prettyPrint(s), - r''' + expect(prettyPrint(s), r''' .foobar1 { } .xyzzy .foo #my-div { From b34b2cf2d393dd5834efbc55ec29a741c2f230b4 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 26 Jul 2017 17:49:37 -0700 Subject: [PATCH 100/245] sort directives, use isNotEmpty --- pkgs/csslib/example/call_parser.dart | 8 ++++---- pkgs/csslib/lib/parser.dart | 2 +- pkgs/csslib/lib/src/analyzer.dart | 8 ++++---- pkgs/csslib/lib/src/css_printer.dart | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index 9a993ea6f..85325e4e5 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -43,7 +43,7 @@ main() { '}', errors: errors); - if (!errors.isEmpty) { + if (errors.isNotEmpty) { print("Got ${errors.length} errors.\n"); for (var error in errors) { print(error); @@ -61,7 +61,7 @@ main() { '}', errors: errors); - if (!errors.isEmpty) { + if (errors.isNotEmpty) { print("Got ${errors.length} errors.\n"); for (var error in errors) { print(error); @@ -75,7 +75,7 @@ main() { print(' ==================================='); stylesheetError = parseCss('# div1 { color: red; }', errors: errors); - if (!errors.isEmpty) { + if (errors.isNotEmpty) { print("Detected ${errors.length} problem in checked mode.\n"); for (var error in errors) { print(error); @@ -88,7 +88,7 @@ main() { print('4. Parse a selector only:'); print(' ======================'); var selectorAst = css.selector('#div .foo', errors: errors); - if (!errors.isEmpty) { + if (errors.isNotEmpty) { print("Got ${errors.length} errors.\n"); for (var error in errors) { print(error); diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 6688507d5..32e27f5bc 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -8,9 +8,9 @@ import 'dart:math' as math; import 'package:source_span/source_span.dart'; -import 'visitor.dart'; import 'src/messages.dart'; import 'src/options.dart'; +import 'visitor.dart'; export 'src/messages.dart' show Message; export 'src/options.dart'; diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 6c6ba6d61..0bfb2f326 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -222,7 +222,7 @@ class ExpandNestedSelectors extends Visitor { // If any expandedRuleSets and we're back at the top-level rule set then // there were nested rule set(s). if (_parentRuleSet == null) { - if (!_expandedRuleSets.isEmpty) { + if (_expandedRuleSets.isNotEmpty) { // Remember ruleset to replace with these flattened rulesets. _expansions[node] = _expandedRuleSets; _expandedRuleSets = []; @@ -278,8 +278,8 @@ class ExpandNestedSelectors extends Visitor { // Substitue the & with the parent selector and only use a combinator // descendant if & is prefix by a sequence with an empty name e.g., // "... + &", "&", "... ~ &", etc. - var hasPrefix = !newSequence.isEmpty && - !newSequence.last.simpleSelector.name.isEmpty; + var hasPrefix = newSequence.isNotEmpty && + newSequence.last.simpleSelector.name.isNotEmpty; newSequence.addAll( hasPrefix ? _convertToDescendentSequence(parent) : parent); } else { @@ -906,7 +906,7 @@ class AllExtends extends Visitor { SelectorGroup _currSelectorGroup; int _currDeclIndex; - List _extendsToRemove = []; + final List _extendsToRemove = []; void visitRuleSet(RuleSet node) { var oldSelectorGroup = _currSelectorGroup; diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 91c28612d..14c1f8c73 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -529,7 +529,7 @@ class CssPrinter extends Visitor { void visitVarUsage(VarUsage node) { emit('var(${node.name}'); - if (!node.defaultValues.isEmpty) { + if (node.defaultValues.isNotEmpty) { emit(','); for (var defaultValue in node.defaultValues) { emit(' '); From a116a4d8c8947157f9d511dc443be432e365526c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 26 Jul 2017 17:52:20 -0700 Subject: [PATCH 101/245] Stop using deprecated SourceSpan ctor --- pkgs/csslib/lib/css.dart | 2 +- pkgs/csslib/lib/parser.dart | 8 ++++---- pkgs/csslib/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index e7ef53443..65f6511ff 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -35,7 +35,7 @@ void _compile(String inputPath, bool verbose) { // Read the file. var filename = path.basename(inputPath); var contents = new File(inputPath).readAsStringSync(); - var file = new SourceFile(contents, url: path.toUri(inputPath)); + var file = new SourceFile.fromString(contents, url: path.toUri(inputPath)); // Parse the CSS. StyleSheet tree = _time( diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 32e27f5bc..db2068c74 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -68,7 +68,7 @@ StyleSheet compile(input, _createMessages(errors: errors, options: options); - var file = new SourceFile(source); + var file = new SourceFile.fromString(source); var tree = new _Parser(file, source).parse(); @@ -99,7 +99,7 @@ StyleSheet parse(input, {List errors, PreprocessorOptions options}) { _createMessages(errors: errors, options: options); - var file = new SourceFile(source); + var file = new SourceFile.fromString(source); return new _Parser(file, source).parse(); } @@ -114,7 +114,7 @@ StyleSheet selector(input, {List errors}) { _createMessages(errors: errors); - var file = new SourceFile(source); + var file = new SourceFile.fromString(source); return (new _Parser(file, source)..tokenizer.inSelector = true) .parseSelector(); } @@ -124,7 +124,7 @@ SelectorGroup parseSelectorGroup(input, {List errors}) { _createMessages(errors: errors); - var file = new SourceFile(source); + var file = new SourceFile.fromString(source); return (new _Parser(file, source) // TODO(jmesserly): this fix should be applied to the parser. It's tricky // because by the time the flag is set one token has already been fetched. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 225b60118..221d92b8f 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: args: '>=0.9.0 <0.14.0' logging: '>=0.9.0 <0.12.0' path: '>=0.9.0 <2.0.0' - source_span: '>=1.0.0 <2.0.0' + source_span: '>=1.4.0 <2.0.0' dev_dependencies: browser: '>=0.9.0 <0.11.0' test: '>=0.12.0 <0.13.0' From abef48af67363bf180e3bc88c52fb98f0bcac8d2 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 18 Sep 2017 18:08:17 -0700 Subject: [PATCH 102/245] Remove -dev.infinity in SDK upper constraint --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 221d92b8f..d8c2029f0 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -4,7 +4,7 @@ author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib environment: - sdk: '>=1.21.0 <2.0.0-dev.infinity' + sdk: '>=1.21.0 <2.0.0' dependencies: args: '>=0.9.0 <0.14.0' logging: '>=0.9.0 <0.12.0' From 28356e00c7fcb3eb3bd6793ef2ffb40be7e0f216 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 21 Sep 2017 10:51:33 -0700 Subject: [PATCH 103/245] Update args usage logic --- pkgs/csslib/lib/src/options.dart | 4 ++-- pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/options.dart index c80370b45..1b2aee08e 100644 --- a/pkgs/csslib/lib/src/options.dart +++ b/pkgs/csslib/lib/src/options.dart @@ -110,8 +110,8 @@ class PreprocessorOptions { } } - static showUsage(parser) { + static showUsage(ArgParser parser) { print('Usage: css [options...] input.css'); - print(parser.getUsage()); + print(parser.usage); } } diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index d8c2029f0..5bf41421e 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -6,7 +6,7 @@ homepage: https://github.com/dart-lang/csslib environment: sdk: '>=1.21.0 <2.0.0' dependencies: - args: '>=0.9.0 <0.14.0' + args: '>=0.12.1 <2.0.0' logging: '>=0.9.0 <0.12.0' path: '>=0.9.0 <2.0.0' source_span: '>=1.4.0 <2.0.0' From a279c6f16ec6131fe3ec36e61a0c121e24fcdd8f Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 21 Sep 2017 11:06:26 -0700 Subject: [PATCH 104/245] Deprecate css.dart Entry point for the executable, which is not why folks want this package When removed, will allow us to remove the dependency on pkg/args --- pkgs/csslib/CHANGELOG.md | 5 +++ pkgs/csslib/lib/css.dart | 68 +++++++++++++++++++++++++++++++- pkgs/csslib/lib/src/options.dart | 66 ------------------------------- 3 files changed, 72 insertions(+), 67 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 8662956ec..213cb82c4 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.14.1 + +* Deprecated `package:csslib/css.dart`. + Use `parser.dart` and `visitor.dart` instead. + ## 0.14.0 ### New features diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index 65f6511ff..98c9b2a86 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -2,10 +2,12 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +@Deprecated('Will be removed in v0.15.0') library css; import 'dart:io'; +import 'package:args/args.dart'; import 'package:path/path.dart' as path; import 'package:source_span/source_span.dart'; @@ -15,7 +17,7 @@ import 'visitor.dart'; void main(List arguments) { // TODO(jmesserly): fix this to return a proper exit code - var options = PreprocessorOptions.parse(arguments); + var options = _parseOptions(arguments); if (options == null) return; messages = new Messages(options: options); @@ -78,3 +80,67 @@ void _printMessage(String message, int duration) { buf..write(duration)..write(' ms'); print(buf.toString()); } + +PreprocessorOptions _fromArgs(ArgResults args) => new PreprocessorOptions( + warningsAsErrors: args['warnings_as_errors'], + throwOnWarnings: args['throw_on_warnings'], + throwOnErrors: args['throw_on_errors'], + verbose: args['verbose'], + checked: args['checked'], + lessSupport: args['less'], + useColors: args['colors'], + polyfill: args['polyfill'], + inputFile: args.rest.length > 0 ? args.rest[0] : null); + +// tool.dart [options...] +PreprocessorOptions _parseOptions(List arguments) { + var parser = new ArgParser() + ..addFlag('verbose', + abbr: 'v', + defaultsTo: false, + negatable: false, + help: 'Display detail info') + ..addFlag('checked', + defaultsTo: false, + negatable: false, + help: 'Validate CSS values invalid value display a warning message') + ..addFlag('less', + defaultsTo: true, + negatable: true, + help: 'Supports subset of Less syntax') + ..addFlag('suppress_warnings', + defaultsTo: true, help: 'Warnings not displayed') + ..addFlag('warnings_as_errors', + defaultsTo: false, help: 'Warning handled as errors') + ..addFlag('throw_on_errors', + defaultsTo: false, help: 'Throw on errors encountered') + ..addFlag('throw_on_warnings', + defaultsTo: false, help: 'Throw on warnings encountered') + ..addFlag('colors', + defaultsTo: true, help: 'Display errors/warnings in colored text') + ..addFlag('polyfill', + defaultsTo: false, help: 'Generate polyfill for new CSS features') + ..addFlag('help', + abbr: 'h', + defaultsTo: false, + negatable: false, + help: 'Displays this help message'); + + try { + var results = parser.parse(arguments); + if (results['help'] || results.rest.length == 0) { + _showUsage(parser); + return null; + } + return _fromArgs(results); + } on FormatException catch (e) { + print(e.message); + _showUsage(parser); + return null; + } +} + +void _showUsage(ArgParser parser) { + print('Usage: css [options...] input.css'); + print(parser.usage); +} diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/options.dart index 1b2aee08e..56c358b2f 100644 --- a/pkgs/csslib/lib/src/options.dart +++ b/pkgs/csslib/lib/src/options.dart @@ -4,8 +4,6 @@ library csslib.src.options; -import 'package:args/args.dart'; - class PreprocessorOptions { /** Generate polyfill code (e.g., var, etc.) */ final bool polyfill; @@ -50,68 +48,4 @@ class PreprocessorOptions { this.useColors: true, this.polyfill: false, this.inputFile}); - - PreprocessorOptions.fromArgs(ArgResults args) - : warningsAsErrors = args['warnings_as_errors'], - throwOnWarnings = args['throw_on_warnings'], - throwOnErrors = args['throw_on_errors'], - verbose = args['verbose'], - checked = args['checked'], - lessSupport = args['less'], - useColors = args['colors'], - polyfill = args['polyfill'], - inputFile = args.rest.length > 0 ? args.rest[0] : null; - - // tool.dart [options...] - static PreprocessorOptions parse(List arguments) { - var parser = new ArgParser() - ..addFlag('verbose', - abbr: 'v', - defaultsTo: false, - negatable: false, - help: 'Display detail info') - ..addFlag('checked', - defaultsTo: false, - negatable: false, - help: 'Validate CSS values invalid value display a warning message') - ..addFlag('less', - defaultsTo: true, - negatable: true, - help: 'Supports subset of Less syntax') - ..addFlag('suppress_warnings', - defaultsTo: true, help: 'Warnings not displayed') - ..addFlag('warnings_as_errors', - defaultsTo: false, help: 'Warning handled as errors') - ..addFlag('throw_on_errors', - defaultsTo: false, help: 'Throw on errors encountered') - ..addFlag('throw_on_warnings', - defaultsTo: false, help: 'Throw on warnings encountered') - ..addFlag('colors', - defaultsTo: true, help: 'Display errors/warnings in colored text') - ..addFlag('polyfill', - defaultsTo: false, help: 'Generate polyfill for new CSS features') - ..addFlag('help', - abbr: 'h', - defaultsTo: false, - negatable: false, - help: 'Displays this help message'); - - try { - var results = parser.parse(arguments); - if (results['help'] || results.rest.length == 0) { - showUsage(parser); - return null; - } - return new PreprocessorOptions.fromArgs(results); - } on FormatException catch (e) { - print(e.message); - showUsage(parser); - return null; - } - } - - static showUsage(ArgParser parser) { - print('Usage: css [options...] input.css'); - print(parser.usage); - } } From 100cbaee10a7d8a9370669f753cb9c6da0ecdbf5 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 21 Sep 2017 11:08:38 -0700 Subject: [PATCH 105/245] Fix readme to only reference required imports --- pkgs/csslib/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/README.md b/pkgs/csslib/README.md index 1610d3b84..8a71da492 100644 --- a/pkgs/csslib/README.md +++ b/pkgs/csslib/README.md @@ -13,13 +13,12 @@ Usage Parsing CSS is easy! ```dart -import 'package:csslib/parser.dart' show parse; -import 'package:csslib/css.dart'; +import 'package:csslib/parser.dart'; main() { var stylesheet = parse( '.foo { color: red; left: 20px; top: 20px; width: 100px; height:200px }'); - print(stylesheet.toString()); + print(stylesheet.toDebugString()); } ``` From 08051852e6a62b7810121db33bb13577a6e42a19 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 21 Sep 2017 11:09:23 -0700 Subject: [PATCH 106/245] Prepare for release --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 5bf41421e..36608337f 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.14.1-dev +version: 0.14.1 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 04908e47b24c94c469226981c567f144d3cf5135 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 14 Feb 2018 21:10:36 -0800 Subject: [PATCH 107/245] Stop testing Dartium on Travis --- pkgs/csslib/.travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml index b79391f8e..e92d42d9e 100644 --- a/pkgs/csslib/.travis.yml +++ b/pkgs/csslib/.travis.yml @@ -1,13 +1,12 @@ language: dart -sudo: false + dart: - dev - stable + dart_task: - test: --platform vm - test: --platform firefox -j 1 - - test: --platform dartium - install_dartium: true - dartanalyzer matrix: From 1eaa516499f68a090c4791715bb868d595fdc861 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Tue, 1 May 2018 15:12:47 -0700 Subject: [PATCH 108/245] Fixes Dart 2 runtime failure Closes https://github.com/dart-lang/csslib/issues/66. --- pkgs/csslib/lib/src/analyzer.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 0bfb2f326..5a2b59e34 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -508,7 +508,7 @@ class TopLevelIncludes extends Visitor { class _TopLevelIncludeReplacer extends Visitor { final Messages _messages; final IncludeDirective _include; - final List _newRules; + final List _newRules; bool _foundAndReplaced = false; /** @@ -516,7 +516,7 @@ class _TopLevelIncludeReplacer extends Visitor { * with the [newRules]. If [ruleSet] is found and replaced return true. */ static bool replace(Messages messages, StyleSheet styleSheet, - IncludeDirective include, List newRules) { + IncludeDirective include, List newRules) { var visitor = new _TopLevelIncludeReplacer(messages, include, newRules); visitor.visitStyleSheet(styleSheet); return visitor._foundAndReplaced; From 14ffbd257542856b1f420bb26c8ca8dcb152bc83 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Tue, 1 May 2018 15:15:03 -0700 Subject: [PATCH 109/245] Updates version and change log for release --- pkgs/csslib/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 213cb82c4..05f65e641 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.14.2 + +* Fixed Dart 2 runtime failure. + ## 0.14.1 * Deprecated `package:csslib/css.dart`. From cd90ef6dc2c5eb20abe681d96dab69d9fd65f5c3 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Tue, 1 May 2018 15:35:32 -0700 Subject: [PATCH 110/245] Updates version for release --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 36608337f..1c08d5de0 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.14.1 +version: 0.14.2 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 3fa14f5ec62a425391ad4dabc124633f2d41d61a Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 9 May 2018 15:50:23 -0700 Subject: [PATCH 111/245] Removes unnecessary spaces from compact output --- pkgs/csslib/lib/src/css_printer.dart | 4 ++-- pkgs/csslib/test/declaration_test.dart | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 14c1f8c73..c434caf37 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -29,7 +29,7 @@ class CssPrinter extends Visitor { /** Returns the output buffer. */ String toString() => _buff.toString().trim(); - String get _newLine => prettyPrint ? '\n' : ' '; + String get _newLine => prettyPrint ? '\n' : ''; String get _sp => prettyPrint ? ' ' : ''; // TODO(terry): When adding obfuscation we'll need isOptimized (compact w/ @@ -282,7 +282,7 @@ class CssPrinter extends Visitor { void visitRuleSet(RuleSet node) { emit("$_newLine"); node._selectorGroup.visit(this); - emit(" {$_newLine"); + emit("$_sp{$_newLine"); node._declarationGroup.visit(this); emit("}"); } diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index ab1f70df0..56473cce3 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -852,9 +852,15 @@ void testCompactEmitter() { final String input = r''' div { color: green !important; + background: red blue green; +} +.foo p[bar] { + color: blue; } '''; - final String generated = "div { color:green!important; }"; + final String generated = + 'div{color:green!important;background:red blue green;}' + '.foo p[bar]{color:blue;}'; var stylesheet = parseCss(input, errors: errors); From 6dc8eee1fff1185e6d38afe599ea322c477682dd Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 9 May 2018 15:54:40 -0700 Subject: [PATCH 112/245] Updates version and changelog for release --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 05f65e641..2efcea639 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.14.3 + +* Reduced the amount of whitespace in compact output around braces. + ## 0.14.2 * Fixed Dart 2 runtime failure. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 1c08d5de0..ddd37305b 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.14.2 +version: 0.14.3 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From d2a51841dcad8dd12d332348f8efb340593cacff Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Thu, 10 May 2018 14:09:44 -0700 Subject: [PATCH 113/245] Improves compact output for @page at-rule Also adds test cases to verify compact output of other at-rules is optimal. --- pkgs/csslib/lib/src/css_printer.dart | 4 ++-- pkgs/csslib/test/declaration_test.dart | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index c434caf37..c2f0af0fb 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -170,7 +170,7 @@ class CssPrinter extends Visitor { var declsMargin = node._declsMargin; var declsMarginLength = declsMargin.length; - emit(' {$_newLine'); + emit('$_sp{$_newLine'); for (var i = 0; i < declsMarginLength; i++) { declsMargin[i].visit(this); } @@ -303,7 +303,7 @@ class CssPrinter extends Visitor { var margin_sym_name = TokenKind.idToValue(TokenKind.MARGIN_DIRECTIVES, node.margin_sym); - emit("@$margin_sym_name {$_newLine"); + emit("@$margin_sym_name$_sp{$_newLine"); visitDeclarationGroup(node); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 56473cce3..220e8163b 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -857,10 +857,32 @@ div { .foo p[bar] { color: blue; } +@page { + @top-left { + color: red; + } +} +@page : first{} +@page foo : first {} +@media screen AND (max-width: 800px) { + div { + font-size: 24px; + } +} +@keyframes foo { + 0% { + transform: scaleX(0); + } +} '''; final String generated = 'div{color:green!important;background:red blue green;}' - '.foo p[bar]{color:blue;}'; + '.foo p[bar]{color:blue;}' + '@page{@top-left{color:red;}}' + '@page:first{}' + '@page foo:first{}' + '@media screen AND (max-width:800px){div{font-size:24px;}}' + '@keyframes foo{0%{transform:scaleX(0);}}'; var stylesheet = parseCss(input, errors: errors); From 72b0ba6f29cbbacea9224b2a398773d00ee91690 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Thu, 10 May 2018 15:09:15 -0700 Subject: [PATCH 114/245] Adds changelog entry --- pkgs/csslib/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 2efcea639..211124e88 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,5 @@ +* Reduced whitespace in compact output for the `@page` at-rule and margin boxes. + ## 0.14.3 * Reduced the amount of whitespace in compact output around braces. From 4ef0c911baa4298b3cc8c75cc718e85e6b54c545 Mon Sep 17 00:00:00 2001 From: "Lasse R.H. Nielsen" Date: Tue, 10 Apr 2018 13:59:42 +0200 Subject: [PATCH 115/245] Remove usage of upper-case constants. --- pkgs/csslib/test/compiler_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index 5faabe27f..387137fda 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -528,7 +528,7 @@ void testArrayOfChars() { 'color : #00F578; border-color: #878787;' '}]]>'; - var stylesheet = parse(UTF8.encode(input), errors: errors); + var stylesheet = parse(utf8.encode(input), errors: errors); expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); From ecc54510dc6803bb639f274a7ab7647a184c4f88 Mon Sep 17 00:00:00 2001 From: "Lasse R.H. Nielsen" Date: Tue, 10 Apr 2018 15:24:17 +0200 Subject: [PATCH 116/245] update SDK version --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index ddd37305b..cc377e97b 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -4,7 +4,7 @@ author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib environment: - sdk: '>=1.21.0 <2.0.0' + sdk: '>=2.0.0-dev.17.0 <2.0.0' dependencies: args: '>=0.12.1 <2.0.0' logging: '>=0.9.0 <0.12.0' From a3b369de679d54991b04e0b1591dc35206ab1e7e Mon Sep 17 00:00:00 2001 From: "Lasse R.H. Nielsen" Date: Thu, 12 Apr 2018 15:01:48 +0200 Subject: [PATCH 117/245] Update changelog --- pkgs/csslib/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 211124e88..643c208e8 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,4 +1,6 @@ * Reduced whitespace in compact output for the `@page` at-rule and margin boxes. +* Updated SDK version to 2.0.0-dev.17.0. +* Stop using deprecated constants. ## 0.14.3 From b4894746b1d668e663c8142de9b5c29ebfbf4567 Mon Sep 17 00:00:00 2001 From: "Lasse R.H. Nielsen" Date: Fri, 4 May 2018 11:04:39 +0200 Subject: [PATCH 118/245] Rebase, update version number. --- pkgs/csslib/.travis.yml | 1 - pkgs/csslib/CHANGELOG.md | 2 ++ pkgs/csslib/pubspec.yaml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml index e92d42d9e..afad71aeb 100644 --- a/pkgs/csslib/.travis.yml +++ b/pkgs/csslib/.travis.yml @@ -2,7 +2,6 @@ language: dart dart: - dev - - stable dart_task: - test: --platform vm diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 643c208e8..bf98f854c 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,5 @@ +## 0.14.4 + * Reduced whitespace in compact output for the `@page` at-rule and margin boxes. * Updated SDK version to 2.0.0-dev.17.0. * Stop using deprecated constants. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index cc377e97b..e0fedc67b 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.14.3 +version: 0.14.4 author: Dart Team description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 0560a27009c39735ca861df8c76695b69eb18f26 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 9 Jul 2018 08:35:31 -0700 Subject: [PATCH 119/245] dartfmt --- pkgs/csslib/lib/src/property.dart | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 69f5c5425..a2f4f6e93 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -823,10 +823,12 @@ class Border implements _StyleProperty { String get cssExpression { return (top == left && bottom == right && top == right) ? "${left}px" - : "${top != null ? '$top' : '0'}px ${ - right != null ? '$right' : '0'}px ${ - bottom != null ? '$bottom' : '0'}px ${ - left != null ? '$left' : '0'}px"; + : "${top != null ? '$top' : '0'}px ${right != null + ? '$right' + : '0'}px ${bottom != null ? '$bottom' : '0'}px ${left != + null + ? '$left' + : '0'}px"; } } From 91d11fe3af9aa3c45efa102335a9d2411ba2121a Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 12 Jul 2018 09:26:22 -0700 Subject: [PATCH 120/245] dartfmt --- pkgs/csslib/lib/src/property.dart | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index a2f4f6e93..c6b9ccff6 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -823,12 +823,7 @@ class Border implements _StyleProperty { String get cssExpression { return (top == left && bottom == right && top == right) ? "${left}px" - : "${top != null ? '$top' : '0'}px ${right != null - ? '$right' - : '0'}px ${bottom != null ? '$bottom' : '0'}px ${left != - null - ? '$left' - : '0'}px"; + : "${top != null ? '$top' : '0'}px ${right != null ? '$right' : '0'}px ${bottom != null ? '$bottom' : '0'}px ${left != null ? '$left' : '0'}px"; } } From 2197a76c14dfe8c13ab02b84b70af07fc605e797 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Mon, 16 Jul 2018 12:58:10 -0400 Subject: [PATCH 121/245] chore: set max SDK version to <3.0.0 (dart-lang/csslib#73) --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/analysis_options.yaml | 2 -- pkgs/csslib/pubspec.yaml | 21 ++++++++++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) delete mode 100644 pkgs/csslib/analysis_options.yaml diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index bf98f854c..85453d44d 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.14.4+1 + +* Set max SDK version to `<3.0.0`, and adjust other dependencies. + ## 0.14.4 * Reduced whitespace in compact output for the `@page` at-rule and margin boxes. diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml deleted file mode 100644 index a10d4c5a0..000000000 --- a/pkgs/csslib/analysis_options.yaml +++ /dev/null @@ -1,2 +0,0 @@ -analyzer: - strong-mode: true diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index e0fedc67b..64d3f9aa7 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,15 +1,18 @@ name: csslib -version: 0.14.4 -author: Dart Team +version: 0.14.4+1 + description: A library for parsing CSS. +author: Dart Team homepage: https://github.com/dart-lang/csslib + environment: - sdk: '>=2.0.0-dev.17.0 <2.0.0' + sdk: '>=2.0.0-dev.17.0 <3.0.0' + dependencies: - args: '>=0.12.1 <2.0.0' - logging: '>=0.9.0 <0.12.0' - path: '>=0.9.0 <2.0.0' - source_span: '>=1.4.0 <2.0.0' + args: ^1.4.3 + logging: ^0.11.3 + path: ^1.6.1 + source_span: ^1.4.0 + dev_dependencies: - browser: '>=0.9.0 <0.11.0' - test: '>=0.12.0 <0.13.0' + test: ^1.2.0 From 394af866d5a1bb861413a1ee595b49b9c68907f5 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Tue, 14 Aug 2018 12:50:47 -0700 Subject: [PATCH 122/245] Fix a crash caused by `:host()` without an argument Parsing `:host()` without an argument now emits an error explaining that a selector argument is expected, rather than crashing. --- pkgs/csslib/CHANGELOG.md | 3 +++ pkgs/csslib/lib/parser.dart | 13 ++++++++++--- pkgs/csslib/test/selector_test.dart | 7 +++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 85453d44d..5ec92f635 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,6 @@ +* Fixed a crashed caused by parsing `:host()` without an argument and added an + error message explaining that a selector argument is expected. + ## 0.14.4+1 * Set max SDK version to `<3.0.0`, and adjust other dependencies. diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index db2068c74..d0b8aea1f 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1379,12 +1379,15 @@ class _Parser { /// supports Selector Level 4 grammar: /// https://drafts.csswg.org/selectors-4/#typedef-compound-selector Selector processCompoundSelector() { - return processSelector() - ..simpleSelectorSequences.forEach((sequence) { + var selector = processSelector(); + if (selector != null) { + for (var sequence in selector.simpleSelectorSequences) { if (!sequence.isCombinatorNone) { _error('compound selector can not contain combinator', sequence.span); } - }); + } + } + return selector; } simpleSelectorSequence(bool forceCombinatorNone) { @@ -1625,6 +1628,10 @@ class _Parser { } else if (!pseudoElement && (name == 'host' || name == 'host-context')) { _eat(TokenKind.LPAREN); var selector = processCompoundSelector(); + if (selector == null) { + _errorExpected('a selector argument'); + return null; + } _eat(TokenKind.RPAREN); var span = _makeSpan(start); return new PseudoClassFunctionSelector(pseudoName, selector, span); diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index 66e208075..b2feed4ae 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -82,6 +82,13 @@ void testSelectorFailures() { 'found a number\n' '.foobar .1a-story .xyzzy\n' ' ^^'); + + selector(':host()', errors: errors..clear()); + expect( + errors.first.toString(), + 'error on line 1, column 7: expected a selector argument, but found )\n' + ':host()\n' + ' ^'); } main() { From edb9371c607de48ff66c666824ef47f5b76e53f3 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Tue, 14 Aug 2018 13:18:25 -0700 Subject: [PATCH 123/245] Update version for release --- pkgs/csslib/CHANGELOG.md | 2 ++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 5ec92f635..6dda34825 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,5 @@ +## 0.14.5 + * Fixed a crashed caused by parsing `:host()` without an argument and added an error message explaining that a selector argument is expected. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 64d3f9aa7..22d95b940 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.14.4+1 +version: 0.14.5 description: A library for parsing CSS. author: Dart Team From 9bd10817052260fb88ee9cfd22ee420e135a5692 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 3 Oct 2018 16:42:01 -0700 Subject: [PATCH 124/245] Remove space between comma-delimited expressions in compact output --- pkgs/csslib/CHANGELOG.md | 12 ++++++++++++ pkgs/csslib/lib/src/css_printer.dart | 11 ++++++++++- pkgs/csslib/test/declaration_test.dart | 6 +++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 6dda34825..c43fc5885 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,15 @@ +* Removed whitespace between comma-delimited expressions in compact output. + + Before: + ```css + div{color:rgba(0, 0, 0, 0.5);} + ``` + + After: + ```css + div{color:rgba(0,0,0,0.5);} + ``` + ## 0.14.5 * Fixed a crashed caused by parsing `:host()` without an argument and added an diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index c2f0af0fb..b88516f19 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -548,7 +548,16 @@ class CssPrinter extends Visitor { var expression = expressions[i]; if (i > 0 && !(expression is OperatorComma || expression is OperatorSlash)) { - emit(' '); + // If the previous expression is an operator, use `_sp` so the space is + // collapsed when emitted in compact mode. If the previous expression + // isn't an operator, the space is significant to delimit the two + // expressions and can't be collapsed. + var previous = expressions[i - 1]; + if (previous is OperatorComma || previous is OperatorSlash) { + emit(_sp); + } else { + emit(' '); + } } expression.visit(this); } diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 220e8163b..75895f797 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -874,6 +874,9 @@ div { transform: scaleX(0); } } +div { + color: rgba(0, 0, 0, 0.2); +} '''; final String generated = 'div{color:green!important;background:red blue green;}' @@ -882,7 +885,8 @@ div { '@page:first{}' '@page foo:first{}' '@media screen AND (max-width:800px){div{font-size:24px;}}' - '@keyframes foo{0%{transform:scaleX(0);}}'; + '@keyframes foo{0%{transform:scaleX(0);}}' + 'div{color:rgba(0,0,0,0.2);}'; var stylesheet = parseCss(input, errors: errors); From 2e1215eca7a72b102860bebb930ebd0775b0455a Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 3 Oct 2018 16:46:39 -0700 Subject: [PATCH 125/245] Remove last semicolon from declaration groups in compact output --- pkgs/csslib/CHANGELOG.md | 12 ++++++++++++ pkgs/csslib/lib/src/css_printer.dart | 5 ++++- pkgs/csslib/test/declaration_test.dart | 12 ++++++------ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index c43fc5885..801816fca 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -10,6 +10,18 @@ div{color:rgba(0,0,0,0.5);} ``` +* Removed last semicolon from declaration groups in compact output. + + Before: + ```css + div{color:red;background:blue;} + ``` + + After: + ```css + div{color:red;background:blue} + ``` + ## 0.14.5 * Fixed a crashed caused by parsing `:host()` without an argument and added an diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index b88516f19..ada2b2637 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -294,7 +294,10 @@ class CssPrinter extends Visitor { if (i > 0) emit(_newLine); emit("$_sp$_sp"); declarations[i].visit(this); - emit(";"); + // Don't emit the last semicolon in compact mode. + if (prettyPrint || i < declarationsLength - 1) { + emit(';'); + } } if (declarationsLength > 0) emit(_newLine); } diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 75895f797..55ab079ef 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -879,14 +879,14 @@ div { } '''; final String generated = - 'div{color:green!important;background:red blue green;}' - '.foo p[bar]{color:blue;}' - '@page{@top-left{color:red;}}' + 'div{color:green!important;background:red blue green}' + '.foo p[bar]{color:blue}' + '@page{@top-left{color:red}}' '@page:first{}' '@page foo:first{}' - '@media screen AND (max-width:800px){div{font-size:24px;}}' - '@keyframes foo{0%{transform:scaleX(0);}}' - 'div{color:rgba(0,0,0,0.2);}'; + '@media screen AND (max-width:800px){div{font-size:24px}}' + '@keyframes foo{0%{transform:scaleX(0)}}' + 'div{color:rgba(0,0,0,0.2)}'; var stylesheet = parseCss(input, errors: errors); From 6e7364c2e1e39aea50ac9707041b853281802d5d Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Thu, 4 Oct 2018 09:47:14 -0700 Subject: [PATCH 126/245] Update version for release --- pkgs/csslib/CHANGELOG.md | 2 ++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 801816fca..381b38a33 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,5 @@ +## 0.14.6 + * Removed whitespace between comma-delimited expressions in compact output. Before: diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 22d95b940..4f6a9e26f 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.14.5 +version: 0.14.6 description: A library for parsing CSS. author: Dart Team From 597a68e5f0cf45c4bd80a94470086449d1eda57c Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Wed, 16 Jan 2019 16:42:06 -0800 Subject: [PATCH 127/245] Update test expectations for source_span output (dart-lang/csslib#77) Version `1.5.0` of `source_span` changed the output format. Update the tests which hardcoded the expected output to the new format. --- pkgs/csslib/test/error_test.dart | 84 +++++++++++++++++++---------- pkgs/csslib/test/selector_test.dart | 12 +++-- pkgs/csslib/test/var_test.dart | 42 ++++++++++----- 3 files changed, 92 insertions(+), 46 deletions(-) diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 013865e3e..dbc3e7d12 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -23,8 +23,10 @@ void testUnsupportedFontWeights() { expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 24: Unknown property value bolder -.foobar { font-weight: bolder; } - ^^^^^^'''); + ╷ +1 │ .foobar { font-weight: bolder; } + │ ^^^^^^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' @@ -40,8 +42,10 @@ error on line 1, column 24: Unknown property value bolder expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 24: Unknown property value lighter -.foobar { font-weight: lighter; } - ^^^^^^^'''); + ╷ +1 │ .foobar { font-weight: lighter; } + │ ^^^^^^^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { @@ -56,8 +60,10 @@ error on line 1, column 24: Unknown property value lighter expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 24: Unknown property value inherit -.foobar { font-weight: inherit; } - ^^^^^^^'''); + ╷ +1 │ .foobar { font-weight: inherit; } + │ ^^^^^^^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { @@ -79,8 +85,10 @@ void testUnsupportedLineHeights() { expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 24: Unexpected value for line-height -.foobar { line-height: 120%; } - ^^^'''); + ╷ +1 │ .foobar { line-height: 120%; } + │ ^^^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { @@ -95,8 +103,10 @@ error on line 1, column 24: Unexpected value for line-height expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 24: Unexpected unit for line-height -.foobar { line-height: 20cm; } - ^^'''); + ╷ +1 │ .foobar { line-height: 20cm; } + │ ^^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { @@ -111,8 +121,10 @@ error on line 1, column 24: Unexpected unit for line-height expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 24: Unknown property value inherit -.foobar { line-height: inherit; } - ^^^^^^^'''); + ╷ +1 │ .foobar { line-height: inherit; } + │ ^^^^^^^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { @@ -131,8 +143,10 @@ void testBadSelectors() { expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 1: Not a valid ID selector expected #id -# foo { color: #ff00ff; } -^'''); + ╷ +1 │ # foo { color: #ff00ff; } + │ ^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' # foo { @@ -146,8 +160,10 @@ error on line 1, column 1: Not a valid ID selector expected #id expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 1: Not a valid class selector expected .className -. foo { color: #ff00ff; } -^'''); + ╷ +1 │ . foo { color: #ff00ff; } + │ ^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' . foo { @@ -166,8 +182,10 @@ void testBadHexValues() { expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 18: Bad hex number -.foobar { color: #AH787; } - ^^^^^^'''); + ╷ +1 │ .foobar { color: #AH787; } + │ ^^^^^^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { @@ -181,8 +199,10 @@ error on line 1, column 18: Bad hex number expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 18: Unknown property value redder -.foobar { color: redder; } - ^^^^^^'''); + ╷ +1 │ .foobar { color: redder; } + │ ^^^^^^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' @@ -197,8 +217,10 @@ error on line 1, column 18: Unknown property value redder expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 18: Expected hex number -.foobar { color: # ffffff; } - ^'''); + ╷ +1 │ .foobar { color: # ffffff; } + │ ^ + ╵'''); expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' @@ -213,8 +235,10 @@ error on line 1, column 18: Expected hex number expect(errors.isEmpty, false); expect(errors[0].toString(), r''' error on line 1, column 18: Expected hex number -.foobar { color: # 123fff; } - ^'''); + ╷ +1 │ .foobar { color: # 123fff; } + │ ^ + ╵'''); expect(stylesheet != null, true); @@ -241,8 +265,10 @@ void testBadUnicode() { errors[0].toString(), 'error on line 3, column 20: unicode first range can not be greater than ' 'last\n' - ' unicode-range: U+400-200;\n' - ' ^^^^^^^'); + ' ╷\n' + '3 │ unicode-range: U+400-200;\n' + ' │ ^^^^^^^\n' + ' ╵'); final String input2 = ''' @font-face { @@ -256,8 +282,10 @@ void testBadUnicode() { expect( errors[0].toString(), 'error on line 3, column 20: unicode range must be less than 10FFFF\n' - ' unicode-range: U+12FFFF;\n' - ' ^^^^^^'); + ' ╷\n' + '3 │ unicode-range: U+12FFFF;\n' + ' │ ^^^^^^\n' + ' ╵'); } void testBadNesting() { diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index b2feed4ae..7a740af5d 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -80,15 +80,19 @@ void testSelectorFailures() { errors[0].toString(), 'error on line 1, column 9: name must start with a alpha character, but ' 'found a number\n' - '.foobar .1a-story .xyzzy\n' - ' ^^'); + ' ╷\n' + '1 │ .foobar .1a-story .xyzzy\n' + ' │ ^^\n' + ' ╵'); selector(':host()', errors: errors..clear()); expect( errors.first.toString(), 'error on line 1, column 7: expected a selector argument, but found )\n' - ':host()\n' - ' ^'); + ' ╷\n' + '1 │ :host()\n' + ' │ ^\n' + ' ╵'); } main() { diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 39e7c4581..4d6edf675 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -401,26 +401,40 @@ void undefinedVars() { var errorStrings = [ 'error on line 5, column 14: Variable is not defined.\n' - ' var-a: var(b);\n' - ' ^^', + ' ╷\n' + '5 │ var-a: var(b);\n' + ' │ ^^\n' + ' ╵', 'error on line 6, column 14: Variable is not defined.\n' - ' var-b: var(c);\n' - ' ^^', + ' ╷\n' + '6 │ var-b: var(c);\n' + ' │ ^^\n' + ' ╵', 'error on line 9, column 16: Variable is not defined.\n' - ' var-one: var(two);\n' - ' ^^^^', + ' ╷\n' + '9 │ var-one: var(two);\n' + ' │ ^^^^\n' + ' ╵', 'error on line 12, column 17: Variable is not defined.\n' - ' var-four: var(five);\n' - ' ^^^^^', + ' ╷\n' + '12 │ var-four: var(five);\n' + ' │ ^^^^^\n' + ' ╵', 'error on line 13, column 17: Variable is not defined.\n' - ' var-five: var(six);\n' - ' ^^^^', + ' ╷\n' + '13 │ var-five: var(six);\n' + ' │ ^^^^\n' + ' ╵', 'error on line 16, column 18: Variable is not defined.\n' - ' var-def-1: var(def-2);\n' - ' ^^^^^^', + ' ╷\n' + '16 │ var-def-1: var(def-2);\n' + ' │ ^^^^^^\n' + ' ╵', 'error on line 17, column 18: Variable is not defined.\n' - ' var-def-2: var(def-3);\n' - ' ^^^^^^', + ' ╷\n' + '17 │ var-def-2: var(def-3);\n' + ' │ ^^^^^^\n' + ' ╵', ]; var generated = r''' From d916a2a924a00256e46b95014e7e577ce4dc6aa3 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 28 Jan 2019 09:57:21 -0800 Subject: [PATCH 128/245] Change many variables from dynamic to proper type --- pkgs/csslib/lib/css.dart | 2 +- pkgs/csslib/lib/parser.dart | 118 +++++++++++++++------------ pkgs/csslib/lib/src/css_printer.dart | 2 +- pkgs/csslib/lib/src/tokenizer.dart | 4 +- pkgs/csslib/lib/src/tree.dart | 8 +- 5 files changed, 72 insertions(+), 62 deletions(-) diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index 98c9b2a86..f47b4f1f1 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -59,7 +59,7 @@ void _compile(String inputPath, bool verbose) { } } -_time(String message, callback(), bool printTime) { +T _time(String message, T Function() callback, bool printTime) { if (!printTime) return callback(); final watch = new Stopwatch(); watch.start(); diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index d0b8aea1f..be375a723 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -269,7 +269,7 @@ class _Parser { return _peekToken.kind; } - Token _next({unicodeRange: false}) { + Token _next({bool unicodeRange: false}) { _previousToken = _peekToken; _peekToken = tokenizer.next(unicodeRange: unicodeRange); return _previousToken; @@ -295,7 +295,7 @@ class _Parser { _previousToken = markedData.previousToken; } - bool _maybeEat(int kind, {unicodeRange: false}) { + bool _maybeEat(int kind, {bool unicodeRange: false}) { if (_peekToken.kind == kind) { _previousToken = _peekToken; _peekToken = tokenizer.next(unicodeRange: unicodeRange); @@ -305,7 +305,7 @@ class _Parser { } } - void _eat(int kind, {unicodeRange: false}) { + void _eat(int kind, {bool unicodeRange: false}) { if (!_maybeEat(kind, unicodeRange: unicodeRange)) { _errorExpected(TokenKind.kindToString(kind)); } @@ -313,7 +313,7 @@ class _Parser { void _errorExpected(String expected) { var tok = _next(); - var message; + String message; try { message = 'expected $expected, but found $tok'; } catch (e) { @@ -403,7 +403,7 @@ class _Parser { start = _peekToken.span; } - var type; + Identifier type; // Get the media type. if (_peekIdentifier()) type = identifier(); @@ -481,7 +481,7 @@ class _Parser { * '}' * supports: '@supports' supports_condition group_rule_body */ - processDirective() { + Directive processDirective() { var start = _peekToken.span; var tokId = processVariableOrDirective(); @@ -578,7 +578,7 @@ class _Parser { } // Any pseudo page? - var pseudoPage; + Identifier pseudoPage; if (_maybeEat(TokenKind.COLON)) { if (_peekIdentifier()) { pseudoPage = identifier(); @@ -652,7 +652,7 @@ class _Parser { */ _next(); - var name; + Identifier name; if (_peekIdentifier()) { name = identifier(); } @@ -722,7 +722,7 @@ class _Parser { */ _next(); - var prefix; + Identifier prefix; if (_peekIdentifier()) { prefix = identifier(); } @@ -809,8 +809,8 @@ class _Parser { _eat(TokenKind.LBRACE); - List productions = []; - var mixinDirective; + var productions = []; + MixinDefinition mixinDirective; var start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE)) { @@ -881,7 +881,8 @@ class _Parser { * Returns a VarDefinitionDirective or VarDefinition if a varaible otherwise * return the token id of a directive or -1 if neither. */ - processVariableOrDirective({bool mixinParameter: false}) { + dynamic // VarDefinitionDirective | VarDefinition | int + processVariableOrDirective({bool mixinParameter: false}) { var start = _peekToken.span; var tokId = _peek(); @@ -906,7 +907,7 @@ class _Parser { // Less compatibility: // @name: value; => var-name: value; (VarDefinition) // property: @name; => property: var(name); (VarUsage) - var name; + Identifier name; if (_peekIdentifier()) { name = identifier(); } @@ -1053,7 +1054,7 @@ class _Parser { while (true) { conditions.add(processSupportsConditionInParens()); - var type; + ClauseType type; var text = _peekToken.text.toLowerCase(); if (text == 'and') { @@ -1199,7 +1200,8 @@ class _Parser { if (checkBrace) _eat(TokenKind.LBRACE); var decls = []; - var dartStyles = []; // List of latest styles exposed to Dart. + var dartStyles = + []; // List of latest styles exposed to Dart. do { var selectorGroup = _nestedSelector(); @@ -1213,7 +1215,7 @@ class _Parser { Declaration decl = processDeclaration(dartStyles); if (decl != null) { if (decl.hasDartStyle) { - var newDartStyle = decl.dartStyle; + var newDartStyle = decl.dartStyle as DartStyleExpression; // Replace or add latest Dart style. bool replaced = false; @@ -1239,7 +1241,8 @@ class _Parser { // declarations. for (var decl in decls) { if (decl is Declaration) { - if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) { + if (decl.hasDartStyle && + dartStyles.indexOf(decl.dartStyle as DartStyleExpression) < 0) { // Dart style not live, ignore these styles in this Declarations. decl.dartStyle = null; } @@ -1256,8 +1259,9 @@ class _Parser { _eat(TokenKind.LBRACE); - List decls = []; - List dartStyles = []; // List of latest styles exposed to Dart. + var decls = []; + var dartStyles = + []; // List of latest styles exposed to Dart. do { switch (_peek()) { @@ -1296,7 +1300,7 @@ class _Parser { Declaration decl = processDeclaration(dartStyles); if (decl != null) { if (decl.hasDartStyle) { - var newDartStyle = decl.dartStyle; + var newDartStyle = decl.dartStyle as DartStyleExpression; // Replace or add latest Dart style. bool replaced = false; @@ -1322,7 +1326,8 @@ class _Parser { // Fixup declaration to only have dartStyle that are live for this set of // declarations. for (var decl in decls) { - if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) { + if (decl.hasDartStyle && + dartStyles.indexOf(decl.dartStyle as DartStyleExpression) < 0) { // Dart style not live, ignore these styles in this Declarations. decl.dartStyle = null; } @@ -1390,7 +1395,7 @@ class _Parser { return selector; } - simpleSelectorSequence(bool forceCombinatorNone) { + SimpleSelectorSequence simpleSelectorSequence(bool forceCombinatorNone) { var start = _peekToken.span; var combinatorType = TokenKind.COMBINATOR_NONE; var thisOperator = false; @@ -1458,6 +1463,7 @@ class _Parser { if (simpleSel != null) { return new SimpleSelectorSequence(simpleSel, span, combinatorType); } + return null; } /** @@ -1478,7 +1484,7 @@ class _Parser { * class * : '.' IDENT */ - simpleSelector() { + SimpleSelector simpleSelector() { // TODO(terry): Natalie makes a good point parsing of namespace and element // are essentially the same (asterisk or identifier) other // than the error message for element. Should consolidate the @@ -1508,7 +1514,7 @@ class _Parser { } if (_maybeEat(TokenKind.NAMESPACE)) { - var element; + TreeNode element; switch (_peek()) { case TokenKind.ASTERISK: // Mark as universal element @@ -1549,7 +1555,7 @@ class _Parser { /** * type_selector | universal | HASH | class | attrib | pseudo */ - simpleSelectorTail() { + SimpleSelector simpleSelectorTail() { // Check for HASH | class | attrib | pseudo | negation var start = _peekToken.span; switch (_peek()) { @@ -1596,9 +1602,10 @@ class _Parser { _next(); break; } + return null; } - processPseudoSelector(FileSpan start) { + SimpleSelector processPseudoSelector(FileSpan start) { // :pseudo-class ::pseudo-element // TODO(terry): '::' should be token. _eat(TokenKind.COLON); @@ -1607,7 +1614,7 @@ class _Parser { // TODO(terry): If no identifier specified consider optimizing out the // : or :: and making this a normal selector. For now, // create an empty pseudoName. - var pseudoName; + Identifier pseudoName; if (_peekIdentifier()) { pseudoName = identifier(); } else { @@ -1652,15 +1659,15 @@ class _Parser { // Used during selector look-a-head if not a SelectorExpression is // bad. - if (expr is! SelectorExpression) { + if (expr is SelectorExpression) { + _eat(TokenKind.RPAREN); + return (pseudoElement) + ? new PseudoElementFunctionSelector(pseudoName, expr, span) + : new PseudoClassFunctionSelector(pseudoName, expr, span); + } else { _errorExpected("CSS expression"); return null; } - - _eat(TokenKind.RPAREN); - return (pseudoElement) - ? new PseudoElementFunctionSelector(pseudoName, expr, span) - : new PseudoClassFunctionSelector(pseudoName, expr, span); } } @@ -1682,7 +1689,7 @@ class _Parser { * DIMENSION {num}{ident} * NUMBER {num} */ - processSelectorExpression() { + TreeNode /* SelectorExpression | LiteralTerm */ processSelectorExpression() { var start = _peekToken.span; var expressions = []; @@ -1727,7 +1734,7 @@ class _Parser { } if (keepParsing && value != null) { - var unitTerm; + LiteralTerm unitTerm; // Don't process the dimension if MINUS or PLUS is next. if (_peek() != TokenKind.MINUS && _peek() != TokenKind.PLUS) { unitTerm = processDimension(termToken, value, _makeSpan(start)); @@ -1818,7 +1825,7 @@ class _Parser { // *IDENT - IE7 or below // _IDENT - IE6 property (automatically a valid ident) // - Declaration processDeclaration(List dartStyles) { + Declaration processDeclaration(List dartStyles) { Declaration decl; var start = _peekToken.span; @@ -1849,7 +1856,7 @@ class _Parser { important: importantPriority, ie7: ie7); } else if (_peekToken.kind == TokenKind.VAR_DEFINITION) { _next(); - var definedName; + Identifier definedName; if (_peekIdentifier()) definedName = identifier(); _eat(TokenKind.COLON); @@ -1958,8 +1965,8 @@ class _Parser { static int _findStyle(String styleName) => _stylesToDart[styleName]; - DartStyleExpression _styleForDart( - Identifier property, Expressions exprs, List dartStyles) { + DartStyleExpression _styleForDart(Identifier property, Expressions exprs, + List dartStyles) { var styleType = _findStyle(property.name.toLowerCase()); if (styleType != null) { return buildDartStyleNode(styleType, exprs, dartStyles); @@ -1967,7 +1974,8 @@ class _Parser { return null; } - FontExpression _mergeFontStyles(FontExpression fontExpr, List dartStyles) { + FontExpression _mergeFontStyles( + FontExpression fontExpr, List dartStyles) { // Merge all font styles for this class selector. for (var dartStyle in dartStyles) { if (dartStyle.isFont) { @@ -1979,7 +1987,7 @@ class _Parser { } DartStyleExpression buildDartStyleNode( - int styleType, Expressions exprs, List dartStyles) { + int styleType, Expressions exprs, List dartStyles) { switch (styleType) { /* * Properties in order: @@ -2209,10 +2217,11 @@ class _Parser { } // TODO(terry): Need to handle auto. - marginValue(var exprTerm) { + num marginValue(var exprTerm) { if (exprTerm is UnitTerm || exprTerm is NumberTerm) { - return exprTerm.value; + return exprTerm.value as num; } + return null; } // Expression grammar: @@ -2229,7 +2238,7 @@ class _Parser { var keepGoing = true; var expr; while (keepGoing && (expr = processTerm(ieFilter)) != null) { - var op; + Expression op; var opStart = _peekToken.span; @@ -2260,10 +2269,10 @@ class _Parser { } if (expr != null) { - if (expr is List) { - expr.forEach((exprItem) { + if (expr is List) { + for (var exprItem in expr) { expressions.add(exprItem); - }); + } } else { expressions.add(expr); } @@ -2307,7 +2316,8 @@ class _Parser { // FREQ: {num}['hz' | 'khz'] // function: IDENT '(' expr ')' // - processTerm([bool ieFilter = false]) { + dynamic /* Expression | List | ... */ processTerm( + [bool ieFilter = false]) { var start = _peekToken.span; Token t; // token for term's value var value; // value of term (numeric values) @@ -2361,7 +2371,7 @@ class _Parser { GroupTerm group = new GroupTerm(_makeSpan(start)); - var term; + dynamic /* Expression | List | ... */ term; do { term = processTerm(); if (term != null && term is LiteralTerm) { @@ -2428,10 +2438,10 @@ class _Parser { TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6); return _parseHex(rgbColor, _makeSpan(start)); case TokenKind.UNICODE_RANGE: - var first; - var second; - var firstNumber; - var secondNumber; + String first; + String second; + int firstNumber; + int secondNumber; _eat(TokenKind.UNICODE_RANGE, unicodeRange: true); if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { first = _previousToken.text; @@ -2712,7 +2722,7 @@ class _Parser { // // function: IDENT '(' expr ')' // - processFunction(Identifier func) { + TreeNode /* LiteralTerm | Expression */ processFunction(Identifier func) { var start = _peekToken.span; var name = func.name; diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index ada2b2637..4b81c0778 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -425,7 +425,7 @@ class CssPrinter extends Visitor { } void visitHexColorTerm(HexColorTerm node) { - var mappedName; + String mappedName; if (_isTesting && (node.value is! BAD_HEX_VALUE)) { mappedName = TokenKind.hexToColorName(node.value); } diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 0b0661a86..a5e02529a 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -13,12 +13,12 @@ class Tokenizer extends TokenizerBase { final QUESTION_MARK = '?'.codeUnitAt(0); /** CDATA keyword. */ - final List CDATA_NAME = 'CDATA'.codeUnits; + final List CDATA_NAME = 'CDATA'.codeUnits; Tokenizer(SourceFile file, String text, bool skipWhitespace, [int index = 0]) : super(file, text, skipWhitespace, index); - Token next({unicodeRange: false}) { + Token next({bool unicodeRange: false}) { // keep track of our starting position _startIndex = _index; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 7e1fe6d75..fd8a1375d 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -922,7 +922,7 @@ class Declaration extends TreeNode { final bool isIE7; Declaration(this._property, this._expression, this.dartStyle, SourceSpan span, - {important: false, ie7: false}) + {bool important: false, bool ie7: false}) : this.important = important, this.isIE7 = ie7, super(span); @@ -1285,7 +1285,7 @@ class GroupTerm extends Expression { } class ItemTerm extends NumberTerm { - ItemTerm(var value, String t, SourceSpan span) : super(value, t, span); + ItemTerm(dynamic value, String t, SourceSpan span) : super(value, t, span); ItemTerm clone() => new ItemTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitItemTerm(this); @@ -1375,14 +1375,14 @@ class FontExpression extends DartStyleExpression { // TODO(terry): Only px/pt for now need to handle all possible units to // support calc expressions on units. FontExpression(SourceSpan span, - {dynamic size, + {Object /* LengthTerm | num */ size, List family, int weight, String style, String variant, LineHeight lineHeight}) : font = new Font( - size: size is LengthTerm ? size.value : size, + size: size is LengthTerm ? size.value : size as num, family: family, weight: weight, style: style, From ec1e586b875f236cfd56066f2af958227024506a Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 28 Jan 2019 10:13:54 -0800 Subject: [PATCH 129/245] Fix Validate; bug masked by dynamic --- pkgs/csslib/lib/src/validate.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index e716e66b9..a98c66503 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -17,9 +17,9 @@ List classes = []; List ids = []; class Validate { - static int _classNameCheck(var selector, int matches) { - if (selector.isCombinatorDescendant() || - (selector.isCombinatorNone() && matches == 0)) { + static int _classNameCheck(SimpleSelectorSequence selector, int matches) { + if (selector.isCombinatorDescendant || + (selector.isCombinatorNone && matches == 0)) { if (matches < 0) { String tooMany = selector.simpleSelector.toString(); throw new CssSelectorException( @@ -35,11 +35,11 @@ class Validate { } } - static int _elementIdCheck(var selector, int matches) { - if (selector.isCombinatorNone() && matches == 0) { + static int _elementIdCheck(SimpleSelectorSequence selector, int matches) { + if (selector.isCombinatorNone && matches == 0) { // Perfect just one element id returns matches of -1. return -1; - } else if (selector.isCombinatorDescendant()) { + } else if (selector.isCombinatorDescendant) { String tooMany = selector.simpleSelector.toString(); throw new CssSelectorException( 'Use of Id selector must be singleton starting at $tooMany'); From 24e65837347e950466b01d14f8b9b92248fcdac2 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 28 Jan 2019 10:24:54 -0800 Subject: [PATCH 130/245] Fix KeyFrameDirective.clone --- pkgs/csslib/lib/src/tree.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 7e1fe6d75..70b64c8c6 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -709,7 +709,7 @@ class KeyFrameDirective extends Directive { * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-. */ final int _keyframeName; - final name; + final Identifier name; final List _blocks; KeyFrameDirective(this._keyframeName, this.name, SourceSpan span) @@ -736,11 +736,11 @@ class KeyFrameDirective extends Directive { } KeyFrameDirective clone() { - var cloneBlocks = []; + var directive = KeyFrameDirective(_keyframeName, name.clone(), span); for (var block in _blocks) { - cloneBlocks.add(block.clone()); + directive.add(block.clone()); } - return new KeyFrameDirective(_keyframeName, cloneBlocks, span); + return directive; } visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); From 3788545458bf47dc9ab48100251e90013c42dcbe Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 28 Jan 2019 10:40:19 -0800 Subject: [PATCH 131/245] Fix Supports{Con,Dis}Junction --- pkgs/csslib/lib/src/tree.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 7e1fe6d75..f746c5dfd 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -514,7 +514,7 @@ class SupportsConjunction extends SupportsCondition { SupportsConjunction(this.conditions, SourceSpan span) : super(span); SupportsConjunction clone() { - var clonedConditions = []; + var clonedConditions = []; for (var condition in conditions) { clonedConditions.add(condition.clone()); } @@ -530,7 +530,7 @@ class SupportsDisjunction extends SupportsCondition { SupportsDisjunction(this.conditions, SourceSpan span) : super(span); SupportsDisjunction clone() { - var clonedConditions = []; + var clonedConditions = []; for (var condition in conditions) { clonedConditions.add(condition.clone()); } From 9f71c57db8bd3b6ae996db00942e5d5c91e32bed Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 28 Jan 2019 11:26:07 -0800 Subject: [PATCH 132/245] Flip comments to modern doc-comment syntax --- pkgs/csslib/example/call_parser.dart | 8 +- pkgs/csslib/lib/parser.dart | 557 +++++++++++------------- pkgs/csslib/lib/src/analyzer.dart | 352 +++++++-------- pkgs/csslib/lib/src/css_printer.dart | 30 +- pkgs/csslib/lib/src/messages.dart | 24 +- pkgs/csslib/lib/src/options.dart | 26 +- pkgs/csslib/lib/src/polyfill.dart | 34 +- pkgs/csslib/lib/src/property.dart | 526 ++++++++++------------ pkgs/csslib/lib/src/token.dart | 30 +- pkgs/csslib/lib/src/tokenizer.dart | 10 +- pkgs/csslib/lib/src/tokenizer_base.dart | 26 +- pkgs/csslib/lib/src/tokenkind.dart | 42 +- pkgs/csslib/lib/src/tree.dart | 135 +++--- pkgs/csslib/lib/src/tree_base.dart | 14 +- pkgs/csslib/lib/src/tree_printer.dart | 10 +- pkgs/csslib/lib/src/validate.dart | 2 +- pkgs/csslib/lib/visitor.dart | 4 +- pkgs/csslib/test/compiler_test.dart | 2 +- pkgs/csslib/test/declaration_test.dart | 24 +- pkgs/csslib/test/error_test.dart | 14 +- pkgs/csslib/test/mixin_test.dart | 4 +- pkgs/csslib/test/testing.dart | 34 +- 22 files changed, 849 insertions(+), 1059 deletions(-) diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index 85325e4e5..fc6b33cf8 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -10,11 +10,9 @@ const _default = const css.PreprocessorOptions( warningsAsErrors: true, inputFile: 'memory'); -/** - * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, - * CSS will allow any property/value pairs regardless of validity; all of our - * tests (by default) will ensure that the CSS is really valid. - */ +/// Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, +/// CSS will allow any property/value pairs regardless of validity; all of our +/// tests (by default) will ensure that the CSS is really valid. StyleSheet parseCss(String cssInput, {List errors, css.PreprocessorOptions opts}) { return css.parse(cssInput, diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index d0b8aea1f..bd750d987 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -29,7 +29,7 @@ enum ClauseType { disjunction, } -/** Used for parser lookup ahead (used for nested selectors Less support). */ +/// Used for parser lookup ahead (used for nested selectors Less support). class ParserState extends TokenizerState { final Token peekToken; final Token previousToken; @@ -49,11 +49,11 @@ void _createMessages({List errors, PreprocessorOptions options}) { messages = new Messages(options: options, printHandler: errors.add); } -/** CSS checked mode enabled. */ +/// CSS checked mode enabled. bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. -/** Parse and analyze the CSS file. */ +/// Parse and analyze the CSS file. StyleSheet compile(input, {List errors, PreprocessorOptions options, @@ -82,18 +82,16 @@ StyleSheet compile(input, return tree; } -/** Analyze the CSS file. */ +/// Analyze the CSS file. void analyze(List styleSheets, {List errors, PreprocessorOptions options}) { _createMessages(errors: errors, options: options); new Analyzer(styleSheets, messages).run(); } -/** - * Parse the [input] CSS stylesheet into a tree. The [input] can be a [String], - * or [List] of bytes and returns a [StyleSheet] AST. The optional - * [errors] list will contain each error/warning as a [Message]. - */ +/// Parse the [input] CSS stylesheet into a tree. The [input] can be a [String], +/// or [List] of bytes and returns a [StyleSheet] AST. The optional +/// [errors] list will contain each error/warning as a [Message]. StyleSheet parse(input, {List errors, PreprocessorOptions options}) { var source = _inputAsString(input); @@ -103,11 +101,9 @@ StyleSheet parse(input, {List errors, PreprocessorOptions options}) { return new _Parser(file, source).parse(); } -/** - * Parse the [input] CSS selector into a tree. The [input] can be a [String], - * or [List] of bytes and returns a [StyleSheet] AST. The optional - * [errors] list will contain each error/warning as a [Message]. - */ +/// Parse the [input] CSS selector into a tree. The [input] can be a [String], +/// or [List] of bytes and returns a [StyleSheet] AST. The optional +/// [errors] list will contain each error/warning as a [Message]. // TODO(jmesserly): should rename "parseSelector" and return Selector StyleSheet selector(input, {List errors}) { var source = _inputAsString(input); @@ -126,8 +122,9 @@ SelectorGroup parseSelectorGroup(input, {List errors}) { var file = new SourceFile.fromString(source); return (new _Parser(file, source) - // TODO(jmesserly): this fix should be applied to the parser. It's tricky - // because by the time the flag is set one token has already been fetched. + // TODO(jmesserly): this fix should be applied to the parser. It's + // tricky because by the time the flag is set one token has already + // been fetched. ..tokenizer.inSelector = true) .processSelectorGroup(); } @@ -165,7 +162,7 @@ String _inputAsString(input) { // TODO(terry): Consider removing this class when all usages can be eliminated // or replaced with compile API. -/** Public parsing interface for csslib. */ +/// Public parsing interface for csslib. class Parser { final _Parser _parser; @@ -185,14 +182,12 @@ final _legacyPseudoElements = new Set.from(const [ 'first-line', ]); -/** A simple recursive descent parser for CSS. */ +/// A simple recursive descent parser for CSS. class _Parser { final Tokenizer tokenizer; - /** - * File containing the source being parsed, used to report errors with - * source-span locations. - */ + /// File containing the source being parsed, used to report errors with + /// source-span locations. final SourceFile file; Token _previousToken; @@ -204,7 +199,7 @@ class _Parser { _peekToken = tokenizer.next(); } - /** Main entry point for parsing an entire CSS file. */ + /// Main entry point for parsing an entire CSS file. StyleSheet parse() { List productions = []; @@ -224,7 +219,7 @@ class _Parser { return new StyleSheet(productions, _makeSpan(start)); } - /** Main entry point for parsing a simple selector sequence. */ + /// Main entry point for parsing a simple selector sequence. StyleSheet parseSelector() { List productions = []; @@ -241,7 +236,7 @@ class _Parser { return new StyleSheet.selector(productions, _makeSpan(start)); } - /** Generate an error if [file] has not been completely consumed. */ + /// Generate an error if [file] has not been completely consumed. void checkEndOfFile() { if (!(_peekKind(TokenKind.END_OF_FILE) || _peekKind(TokenKind.INCOMPLETE_COMMENT))) { @@ -249,7 +244,7 @@ class _Parser { } } - /** Guard to break out of parser when an unexpected end of file is found. */ + /// Guard to break out of parser when an unexpected end of file is found. // TODO(jimhug): Failure to call this method can lead to inifinite parser // loops. Consider embracing exceptions for more errors to reduce // the danger here. @@ -279,16 +274,16 @@ class _Parser { return _peekToken.kind == kind; } - /* Is the next token a legal identifier? This includes pseudo-keywords. */ + // Is the next token a legal identifier? This includes pseudo-keywords. bool _peekIdentifier() { return TokenKind.isIdentifier(_peekToken.kind); } - /** Marks the parser/tokenizer look ahead to support Less nested selectors. */ + /// Marks the parser/tokenizer look ahead to support Less nested selectors. ParserState get _mark => new ParserState(_peekToken, _previousToken, tokenizer); - /** Restores the parser/tokenizer state to state remembered by _mark. */ + /// Restores the parser/tokenizer state to state remembered by _mark. void _restore(ParserState markedData) { tokenizer.restore(markedData); _peekToken = markedData.peekToken; @@ -350,22 +345,20 @@ class _Parser { // Top level productions /////////////////////////////////////////////////////////////////// - /** - * The media_query_list production below replaces the media_list production - * from CSS2 the new grammar is: - * - * media_query_list - * : S* [media_query [ ',' S* media_query ]* ]? - * media_query - * : [ONLY | NOT]? S* media_type S* [ AND S* expression ]* - * | expression [ AND S* expression ]* - * media_type - * : IDENT - * expression - * : '(' S* media_feature S* [ ':' S* expr ]? ')' S* - * media_feature - * : IDENT - */ + /// The media_query_list production below replaces the media_list production + /// from CSS2 the new grammar is: + /// + /// media_query_list + /// : S* [media_query [ ',' S* media_query ]* ]? + /// media_query + /// : [ONLY | NOT]? S* media_type S* [ AND S* expression ]* + /// | expression [ AND S* expression ]* + /// media_type + /// : IDENT + /// expression + /// : '(' S* media_feature S* [ ':' S* expr ]? ')' S* + /// media_feature + /// : IDENT List processMediaQueryList() { var mediaQueries = []; @@ -459,28 +452,26 @@ class _Parser { return null; } - /** - * Directive grammar: - * - * import: '@import' [string | URI] media_list? - * media: '@media' media_query_list '{' ruleset '}' - * page: '@page' [':' IDENT]? '{' declarations '}' - * stylet: '@stylet' IDENT '{' ruleset '}' - * media_query_list: IDENT [',' IDENT] - * keyframes: '@-webkit-keyframes ...' (see grammar below). - * font_face: '@font-face' '{' declarations '}' - * namespace: '@namespace name url("xmlns") - * host: '@host '{' ruleset '}' - * mixin: '@mixin name [(args,...)] '{' declarations/ruleset '}' - * include: '@include name [(@arg,@arg1)] - * '@include name [(@arg...)] - * content: '@content' - * -moz-document: '@-moz-document' [ | url-prefix() | - * domain() | regexp( | url-prefix() | + /// domain() | regexp([]; var start = _peekToken.span; @@ -1460,24 +1437,22 @@ class _Parser { } } - /** - * Simple selector grammar: - * - * simple_selector_sequence - * : [ type_selector | universal ] - * [ HASH | class | attrib | pseudo | negation ]* - * | [ HASH | class | attrib | pseudo | negation ]+ - * type_selector - * : [ namespace_prefix ]? element_name - * namespace_prefix - * : [ IDENT | '*' ]? '|' - * element_name - * : IDENT - * universal - * : [ namespace_prefix ]? '*' - * class - * : '.' IDENT - */ + /// Simple selector grammar: + /// + /// simple_selector_sequence + /// : [ type_selector | universal ] + /// [ HASH | class | attrib | pseudo | negation ]* + /// | [ HASH | class | attrib | pseudo | negation ]+ + /// type_selector + /// : [ namespace_prefix ]? element_name + /// namespace_prefix + /// : [ IDENT | '*' ]? '|' + /// element_name + /// : IDENT + /// universal + /// : [ namespace_prefix ]? '*' + /// class + /// : '.' IDENT simpleSelector() { // TODO(terry): Natalie makes a good point parsing of namespace and element // are essentially the same (asterisk or identifier) other @@ -1546,9 +1521,7 @@ class _Parser { return false; } - /** - * type_selector | universal | HASH | class | attrib | pseudo - */ + /// type_selector | universal | HASH | class | attrib | pseudo simpleSelectorTail() { // Check for HASH | class | attrib | pseudo | negation var start = _peekToken.span; @@ -1672,16 +1645,14 @@ class _Parser { : new PseudoClassSelector(pseudoName, _makeSpan(start)); } - /** - * In CSS3, the expressions are identifiers, strings, or of the form "an+b". - * - * : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+ - * - * num [0-9]+|[0-9]*\.[0-9]+ - * PLUS '+' - * DIMENSION {num}{ident} - * NUMBER {num} - */ + /// In CSS3, the expressions are identifiers, strings, or of the form "an+b". + /// + /// : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+ + /// + /// num [0-9]+|[0-9]*\.[0-9]+ + /// PLUS '+' + /// DIMENSION {num}{ident} + /// NUMBER {num} processSelectorExpression() { var start = _peekToken.span; @@ -1744,25 +1715,23 @@ class _Parser { return new SelectorExpression(expressions, _makeSpan(start)); } - // Attribute grammar: - // - // attributes : - // '[' S* IDENT S* [ ATTRIB_MATCHES S* [ IDENT | STRING ] S* ]? ']' + // Attribute grammar: // - // ATTRIB_MATCHES : - // [ '=' | INCLUDES | DASHMATCH | PREFIXMATCH | SUFFIXMATCH | SUBSTRMATCH ] + // attributes : + // '[' S* IDENT S* [ ATTRIB_MATCHES S* [ IDENT | STRING ] S* ]? ']' // - // INCLUDES: '~=' + // ATTRIB_MATCHES : + // [ '=' | INCLUDES | DASHMATCH | PREFIXMATCH | SUFFIXMATCH | SUBSTRMATCH ] // - // DASHMATCH: '|=' + // INCLUDES: '~=' // - // PREFIXMATCH: '^=' + // DASHMATCH: '|=' // - // SUFFIXMATCH: '$=' - // - // SUBSTRMATCH: '*=' + // PREFIXMATCH: '^=' // + // SUFFIXMATCH: '$=' // + // SUBSTRMATCH: '*=' AttributeSelector processAttribute() { var start = _peekToken.span; @@ -1817,7 +1786,6 @@ class _Parser { // property: expr prio? \9; - IE8 and below property, /9 before semi-colon // *IDENT - IE7 or below // _IDENT - IE6 property (automatically a valid ident) - // Declaration processDeclaration(List dartStyles) { Declaration decl; @@ -1888,7 +1856,7 @@ class _Parser { return decl; } - /** List of styles exposed to the Dart UI framework. */ + /// List of styles exposed to the Dart UI framework. static const int _fontPartFont = 0; static const int _fontPartVariant = 1; static const int _fontPartWeight = 2; @@ -1981,14 +1949,12 @@ class _Parser { DartStyleExpression buildDartStyleNode( int styleType, Expressions exprs, List dartStyles) { switch (styleType) { - /* - * Properties in order: - * - * font-style font-variant font-weight font-size/line-height font-family - * - * The font-size and font-family values are required. If other values are - * missing; a default, if it exist, will be used. - */ + // Properties in order: + // + // font-style font-variant font-weight font-size/line-height font-family + // + // The font-size and font-family values are required. If other values are + // missing; a default, if it exist, will be used. case _fontPartFont: var processor = new ExpressionsProcessor(exprs); return _mergeFontStyles(processor.processFont(), dartStyles); @@ -2005,31 +1971,31 @@ class _Parser { var processor = new ExpressionsProcessor(exprs); return _mergeFontStyles(processor.processFontSize(), dartStyles); case _fontPartStyle: - /* Possible style values: - * normal [default] - * italic - * oblique - * inherit - */ + // Possible style values: + // normal [default] + // italic + // oblique + // inherit + // TODO(terry): TBD break; case _fontPartVariant: - /* Possible variant values: - * normal [default] - * small-caps - * inherit - */ + // Possible variant values: + // normal [default] + // small-caps + // inherit + // TODO(terry): TBD break; case _fontPartWeight: - /* Possible weight values: - * normal [default] - * bold - * bolder - * lighter - * 100 - 900 - * inherit - */ + // Possible weight values: + // normal [default] + // bold + // bolder + // lighter + // 100 - 900 + // inherit + // TODO(terry): Only 'normal', 'bold', or values of 100-900 supoorted // need to handle bolder, lighter, and inherit. See // https://github.com/dart-lang/csslib/issues/1 @@ -2159,16 +2125,14 @@ class _Parser { return null; } - /** - * Margins are of the format: - * - * top,right,bottom,left (4 parameters) - * top,right/left, bottom (3 parameters) - * top/bottom,right/left (2 parameters) - * top/right/bottom/left (1 parameter) - * - * The values of the margins can be a unit or unitless or auto. - */ + /// Margins are of the format: + /// + /// * top,right,bottom,left (4 parameters) + /// * top,right/left, bottom (3 parameters) + /// * top/bottom,right/left (2 parameters) + /// * top/right/bottom/left (1 parameter) + /// + /// The values of the margins can be a unit or unitless or auto. BoxEdge processFourNums(Expressions exprs) { num top; num right; @@ -2221,7 +2185,6 @@ class _Parser { // // operator: '/' | ',' // term: (see processTerm) - // Expressions processExpr([bool ieFilter = false]) { var start = _peekToken.span; var expressions = new Expressions(_makeSpan(start)); @@ -2241,8 +2204,8 @@ class _Parser { op = new OperatorComma(_makeSpan(opStart)); break; case TokenKind.BACKSLASH: - // Backslash outside of string; detected IE8 or older signaled by \9 at - // end of an expression. + // Backslash outside of string; detected IE8 or older signaled by \9 + // at end of an expression. var ie8Start = _peekToken.span; _next(); @@ -2286,26 +2249,26 @@ class _Parser { static const int MAX_UNICODE = 0x10FFFF; - // Term grammar: + // Term grammar: // - // term: - // unary_operator? - // [ term_value ] - // | STRING S* | IDENT S* | URI S* | UNICODERANGE S* | hexcolor + // term: + // unary_operator? + // [ term_value ] + // | STRING S* | IDENT S* | URI S* | UNICODERANGE S* | hexcolor // - // term_value: - // NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* | - // TIME S* | FREQ S* | function + // term_value: + // NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* | + // TIME S* | FREQ S* | function // - // NUMBER: {num} - // PERCENTAGE: {num}% - // LENGTH: {num}['px' | 'cm' | 'mm' | 'in' | 'pt' | 'pc'] - // EMS: {num}'em' - // EXS: {num}'ex' - // ANGLE: {num}['deg' | 'rad' | 'grad'] - // TIME: {num}['ms' | 's'] - // FREQ: {num}['hz' | 'khz'] - // function: IDENT '(' expr ')' + // NUMBER: {num} + // PERCENTAGE: {num}% + // LENGTH: {num}['px' | 'cm' | 'mm' | 'in' | 'pt' | 'pc'] + // EMS: {num}'em' + // EXS: {num}'ex' + // ANGLE: {num}['deg' | 'rad' | 'grad'] + // TIME: {num}['ms' | 's'] + // FREQ: {num}['hz' | 'khz'] + // function: IDENT '(' expr ')' // processTerm([bool ieFilter = false]) { var start = _peekToken.span; @@ -2398,8 +2361,8 @@ class _Parser { // IE filter:progid: return processIEFilter(start); } else { - // Handle filter: where name is any filter e.g., alpha, chroma, - // Wave, blur, etc. + // Handle filter: where name is any filter e.g., alpha, + // chroma, Wave, blur, etc. return processIEFilter(start); } } @@ -2479,7 +2442,7 @@ class _Parser { return t != null ? processDimension(t, value, _makeSpan(start)) : null; } - /** Process all dimension units. */ + /// Process all dimension units. LiteralTerm processDimension(Token t, var value, SourceSpan span) { LiteralTerm term; var unitType = this._peek(); @@ -2613,14 +2576,12 @@ class _Parser { // TODO(terry): Should probably understand IE's non-standard filter syntax to // fully support calc, var(), etc. - /** - * IE's filter property breaks CSS value parsing. IE's format can be: - * - * filter: progid:DXImageTransform.MS.gradient(Type=0, Color='#9d8b83'); - * - * We'll just parse everything after the 'progid:' look for the left paren - * then parse to the right paren ignoring everything in between. - */ + /// IE's filter property breaks CSS value parsing. IE's format can be: + /// + /// filter: progid:DXImageTransform.MS.gradient(Type=0, Color='#9d8b83'); + /// + /// We'll just parse everything after the 'progid:' look for the left paren + /// then parse to the right paren ignoring everything in between. processIEFilter(FileSpan startAfterProgidColon) { // Support non-functional filters (i.e. filter: FlipH) var kind = _peek(); @@ -2651,16 +2612,16 @@ class _Parser { } } - // TODO(terry): Hack to gobble up the calc expression as a string looking - // for the matching RPAREN the expression is not parsed into the - // AST. + // TODO(terry): Hack to gobble up the calc expression as a string looking + // for the matching RPAREN the expression is not parsed into the + // AST. // - // grammar should be: + // grammar should be: // - // = calc( ) - // = [ [ '+' | '-' ] ]* - // = [ '*' | '/' ]* - // = | | | ( ) + // = calc( ) + // = [ [ '+' | '-' ] ]* + // = [ '*' | '/' ]* + // = | | | ( ) // String processCalcExpression() { var inString = tokenizer._inString; @@ -2718,7 +2679,8 @@ class _Parser { switch (name) { case 'url': - // URI term sucks up everything inside of quotes(' or ") or between parens + // URI term sucks up everything inside of quotes(' or ") or between + // parens. var urlParam = processQuotedString(true); // TODO(terry): Better error message and checking for mismatched quotes. @@ -2732,9 +2694,10 @@ class _Parser { return new UriTerm(urlParam, _makeSpan(start)); case 'var': - // TODO(terry): Consider handling var in IE specific filter/progid. This - // will require parsing entire IE specific syntax e.g., - // param = value or progid:com_id, etc. for example: + // TODO(terry): Consider handling var in IE specific filter/progid. + // This will require parsing entire IE specific syntax + // e.g. `param = value` or `progid:com_id`, etc. + // for example: // // var-blur: Blur(Add = 0, Direction = 225, Strength = 10); // var-gradient: progid:DXImageTransform.Microsoft.gradient" @@ -2831,21 +2794,20 @@ class ExpressionsProcessor { // TODO(terry): Only handles ##px unit. FontExpression processFontSize() { - /* font-size[/line-height] - * - * Possible size values: - * xx-small - * small - * medium [default] - * large - * x-large - * xx-large - * smaller - * larger - * ##length in px, pt, etc. - * ##%, percent of parent elem's font-size - * inherit - */ + // font-size[/line-height] + // + // Possible size values: + // * xx-small + // * small + // * medium [default] + // * large + // * x-large + // * xx-large + // * smaller + // * larger + // * ##length in px, pt, etc. + // * ##%, percent of parent elem's font-size + // * inherit LengthTerm size; LineHeight lineHt; var nextIsLineHeight = false; @@ -2878,10 +2840,9 @@ class ExpressionsProcessor { FontExpression processFontFamily() { var family = []; - /* Possible family values: - * font-family: arial, Times new roman ,Lucida Sans Unicode,Courier; - * font-family: "Times New Roman", arial, Lucida Sans Unicode, Courier; - */ + // Possible family values: + // * font-family: arial, Times new roman ,Lucida Sans Unicode,Courier; + // * font-family: "Times New Roman", arial, Lucida Sans Unicode, Courier; var moreFamilies = false; for (; _index < _exprs.expressions.length; _index++) { @@ -2929,10 +2890,8 @@ class ExpressionsProcessor { } } -/** - * Escapes [text] for use in a CSS string. - * [single] specifies single quote `'` vs double quote `"`. - */ +/// Escapes [text] for use in a CSS string. +/// [single] specifies single quote `'` vs double quote `"`. String _escapeString(String text, {bool single: false}) { StringBuffer result = null; diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 5a2b59e34..1b195516e 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -18,10 +18,8 @@ part of csslib.parser; // div { color: red; } // -/** - * Analysis phase will validate/fixup any new CSS feature or any SASS style - * feature. - */ +/// Analysis phase will validate/fixup any new CSS feature or any Sass style +/// feature. class Analyzer { final List _styleSheets; final Messages _messages; @@ -57,139 +55,137 @@ class Analyzer { } } -/** - * Traverse all rulesets looking for nested ones. If a ruleset is in a - * declaration group (implies nested selector) then generate new ruleset(s) at - * level 0 of CSS using selector inheritance syntax (flattens the nesting). - * - * How the AST works for a rule [RuleSet] and nested rules. First of all a - * CSS rule [RuleSet] consist of a selector and a declaration e.g., - * - * selector { - * declaration - * } - * - * AST structure of a [RuleSet] is: - * - * RuleSet - * SelectorGroup - * List - * List - * Combinator // +, >, ~, DESCENDENT, or NONE - * SimpleSelector // class, id, element, namespace, attribute - * DeclarationGroup - * List // Declaration or RuleSet - * - * For the simple rule: - * - * div + span { color: red; } - * - * the AST [RuleSet] is: - * - * RuleSet - * SelectorGroup - * List - * [0] - * List - * [0] Combinator = COMBINATOR_NONE - * ElementSelector (name = div) - * [1] Combinator = COMBINATOR_PLUS - * ElementSelector (name = span) - * DeclarationGroup - * List // Declarations or RuleSets - * [0] - * Declaration (property = color, expression = red) - * - * Usually a SelectorGroup contains 1 Selector. Consider the selectors: - * - * div { color: red; } - * a { color: red; } - * - * are equivalent to - * - * div, a { color : red; } - * - * In the above the RuleSet would have a SelectorGroup with 2 selectors e.g., - * - * RuleSet - * SelectorGroup - * List - * [0] - * List - * [0] Combinator = COMBINATOR_NONE - * ElementSelector (name = div) - * [1] - * List - * [0] Combinator = COMBINATOR_NONE - * ElementSelector (name = a) - * DeclarationGroup - * List // Declarations or RuleSets - * [0] - * Declaration (property = color, expression = red) - * - * For a nested rule e.g., - * - * div { - * color : blue; - * a { color : red; } - * } - * - * Would map to the follow CSS rules: - * - * div { color: blue; } - * div a { color: red; } - * - * The AST for the former nested rule is: - * - * RuleSet - * SelectorGroup - * List - * [0] - * List - * [0] Combinator = COMBINATOR_NONE - * ElementSelector (name = div) - * DeclarationGroup - * List // Declarations or RuleSets - * [0] - * Declaration (property = color, expression = blue) - * [1] - * RuleSet - * SelectorGroup - * List - * [0] - * List - * [0] Combinator = COMBINATOR_NONE - * ElementSelector (name = a) - * DeclarationGroup - * List // Declarations or RuleSets - * [0] - * Declaration (property = color, expression = red) - * - * Nested rules is a terse mechanism to describe CSS inheritance. The analyzer - * will flatten and expand the nested rules to it's flatten strucure. Using the - * all parent [RuleSets] (selector expressions) and applying each nested - * [RuleSet] to the list of [Selectors] in a [SelectorGroup]. - * - * Then result is a style sheet where all nested rules have been flatten and - * expanded. - */ +/// Traverse all rulesets looking for nested ones. If a ruleset is in a +/// declaration group (implies nested selector) then generate new ruleset(s) at +/// level 0 of CSS using selector inheritance syntax (flattens the nesting). +/// +/// How the AST works for a rule [RuleSet] and nested rules. First of all a +/// CSS rule [RuleSet] consist of a selector and a declaration e.g., +/// +/// selector { +/// declaration +/// } +/// +/// AST structure of a [RuleSet] is: +/// +/// RuleSet +/// SelectorGroup +/// List +/// List +/// Combinator // +, >, ~, DESCENDENT, or NONE +/// SimpleSelector // class, id, element, namespace, attribute +/// DeclarationGroup +/// List // Declaration or RuleSet +/// +/// For the simple rule: +/// +/// div + span { color: red; } +/// +/// the AST [RuleSet] is: +/// +/// RuleSet +/// SelectorGroup +/// List +/// [0] +/// List +/// [0] Combinator = COMBINATOR_NONE +/// ElementSelector (name = div) +/// [1] Combinator = COMBINATOR_PLUS +/// ElementSelector (name = span) +/// DeclarationGroup +/// List // Declarations or RuleSets +/// [0] +/// Declaration (property = color, expression = red) +/// +/// Usually a SelectorGroup contains 1 Selector. Consider the selectors: +/// +/// div { color: red; } +/// a { color: red; } +/// +/// are equivalent to +/// +/// div, a { color : red; } +/// +/// In the above the RuleSet would have a SelectorGroup with 2 selectors e.g., +/// +/// RuleSet +/// SelectorGroup +/// List +/// [0] +/// List +/// [0] Combinator = COMBINATOR_NONE +/// ElementSelector (name = div) +/// [1] +/// List +/// [0] Combinator = COMBINATOR_NONE +/// ElementSelector (name = a) +/// DeclarationGroup +/// List // Declarations or RuleSets +/// [0] +/// Declaration (property = color, expression = red) +/// +/// For a nested rule e.g., +/// +/// div { +/// color : blue; +/// a { color : red; } +/// } +/// +/// Would map to the follow CSS rules: +/// +/// div { color: blue; } +/// div a { color: red; } +/// +/// The AST for the former nested rule is: +/// +/// RuleSet +/// SelectorGroup +/// List +/// [0] +/// List +/// [0] Combinator = COMBINATOR_NONE +/// ElementSelector (name = div) +/// DeclarationGroup +/// List // Declarations or RuleSets +/// [0] +/// Declaration (property = color, expression = blue) +/// [1] +/// RuleSet +/// SelectorGroup +/// List +/// [0] +/// List +/// [0] Combinator = COMBINATOR_NONE +/// ElementSelector (name = a) +/// DeclarationGroup +/// List // Declarations or RuleSets +/// [0] +/// Declaration (property = color, expression = red) +/// +/// Nested rules is a terse mechanism to describe CSS inheritance. The analyzer +/// will flatten and expand the nested rules to it's flatten strucure. Using +/// the all parent [RuleSets] (selector expressions) and applying each nested +/// [RuleSet] to the list of [Selectors] in a [SelectorGroup]. +/// +/// Then result is a style sheet where all nested rules have been flatten and +/// expanded. class ExpandNestedSelectors extends Visitor { - /** Parent [RuleSet] if a nested rule otherwise [:null:]. */ + /// Parent [RuleSet] if a nested rule otherwise [:null:]. RuleSet _parentRuleSet; - /** Top-most rule if nested rules. */ + /// Top-most rule if nested rules. SelectorGroup _topLevelSelectorGroup; - /** SelectorGroup at each nesting level. */ + /// SelectorGroup at each nesting level. SelectorGroup _nestedSelectorGroup; - /** Declaration (sans the nested selectors). */ + /// Declaration (sans the nested selectors). DeclarationGroup _flatDeclarationGroup; - /** Each nested selector get's a flatten RuleSet. */ + /// Each nested selector get's a flatten RuleSet. List _expandedRuleSets = []; - /** Maping of a nested rule set to the fully expanded list of RuleSet(s). */ + /// Maping of a nested rule set to the fully expanded list of RuleSet(s). final Map> _expansions = new Map(); void visitRuleSet(RuleSet node) { @@ -232,11 +228,9 @@ class ExpandNestedSelectors extends Visitor { } } - /** - * Build up the list of all inherited sequences from the parent selector - * [node] is the current nested selector and it's parent is the last entry in - * the [_nestedSelectorGroup]. - */ + /// Build up the list of all inherited sequences from the parent selector + /// [node] is the current nested selector and it's parent is the last entry in + /// the [_nestedSelectorGroup]. SelectorGroup _mergeToFlatten(RuleSet node) { // Create a new SelectorGroup for this nesting level. var nestedSelectors = _nestedSelectorGroup.selectors; @@ -255,10 +249,8 @@ class ExpandNestedSelectors extends Visitor { return new SelectorGroup(newSelectors, node.span); } - /** - * Merge the nested selector sequences [current] to the [parent] sequences or - * substitue any & with the parent selector. - */ + /// Merge the nested selector sequences [current] to the [parent] sequences or + /// substitue any & with the parent selector. List _mergeNestedSelector( List parent, List current) { @@ -291,12 +283,10 @@ class ExpandNestedSelectors extends Visitor { return newSequence; } - /** - * Return selector sequences with first sequence combinator being a - * descendant. Used for nested selectors when the parent selector needs to - * be prefixed to a nested selector or to substitute the this (&) with the - * parent selector. - */ + /// Return selector sequences with first sequence combinator being a + /// descendant. Used for nested selectors when the parent selector needs to + /// be prefixed to a nested selector or to substitute the this (&) with the + /// parent selector. List _convertToDescendentSequence( List sequences) { if (sequences.isEmpty) return sequences; @@ -376,9 +366,8 @@ class ExpandNestedSelectors extends Visitor { super.visitMarginGroup(node); } - /** - * Replace the rule set that contains nested rules with the flatten rule sets. - */ + /// Replace the rule set that contains nested rules with the flatten rule + /// sets. void flatten(StyleSheet styleSheet) { // TODO(terry): Iterate over topLevels instead of _expansions it's already // a map (this maybe quadratic). @@ -401,10 +390,9 @@ class _MediaRulesReplacer extends Visitor { List _newRules; bool _foundAndReplaced = false; - /** - * Look for the [ruleSet] inside of an @media directive; if found then replace - * with the [newRules]. If [ruleSet] is found and replaced return true. - */ + /// Look for the [ruleSet] inside of an @media directive; if found then + /// replace with the [newRules]. If [ruleSet] is found and replaced return + /// true. static bool replace( StyleSheet styleSheet, RuleSet ruleSet, List newRules) { var visitor = new _MediaRulesReplacer(ruleSet, newRules); @@ -423,14 +411,12 @@ class _MediaRulesReplacer extends Visitor { } } -/** - * Expand all @include at the top-level the ruleset(s) associated with the - * mixin. - */ +/// Expand all @include at the top-level the ruleset(s) associated with the +/// mixin. class TopLevelIncludes extends Visitor { StyleSheet _styleSheet; final Messages _messages; - /** Map of variable name key to it's definition. */ + /// Map of variable name key to it's definition. final Map map = new Map(); MixinDefinition currDef; @@ -504,17 +490,16 @@ class TopLevelIncludes extends Visitor { } } -/** @include as a top-level with ruleset(s). */ +/// @include as a top-level with ruleset(s). class _TopLevelIncludeReplacer extends Visitor { final Messages _messages; final IncludeDirective _include; final List _newRules; bool _foundAndReplaced = false; - /** - * Look for the [ruleSet] inside of an @media directive; if found then replace - * with the [newRules]. If [ruleSet] is found and replaced return true. - */ + /// Look for the [ruleSet] inside of an @media directive; if found then + /// replace with the [newRules]. If [ruleSet] is found and replaced return + /// true. static bool replace(Messages messages, StyleSheet styleSheet, IncludeDirective include, List newRules) { var visitor = new _TopLevelIncludeReplacer(messages, include, newRules); @@ -546,11 +531,9 @@ class _TopLevelIncludeReplacer extends Visitor { } } -/** - * Utility function to match an include to a list of either Declarations or - * RuleSets, depending on type of mixin (ruleset or declaration). The include - * can be an include in a declaration or an include directive (top-level). - */ +/// Utility function to match an include to a list of either Declarations or +/// RuleSets, depending on type of mixin (ruleset or declaration). The include +/// can be an include in a declaration or an include directive (top-level). int _findInclude(List list, var node) { IncludeDirective matchNode = (node is IncludeMixinAtDeclaration) ? node.include : node; @@ -564,10 +547,8 @@ int _findInclude(List list, var node) { return -1; } -/** - * Stamp out a mixin with the defined args substituted with the user's - * parameters. - */ +/// Stamp out a mixin with the defined args substituted with the user's +/// parameters. class CallMixin extends Visitor { final MixinDefinition mixinDef; List _definedArgs; @@ -576,7 +557,7 @@ class CallMixin extends Visitor { final varUsages = new Map>>(); - /** Only var defs with more than one expression (comma separated). */ + /// Only var defs with more than one expression (comma separated). final Map varDefs; CallMixin(this.mixinDef, [this.varDefs]) { @@ -587,10 +568,8 @@ class CallMixin extends Visitor { } } - /** - * Given a mixin's defined arguments return a cloned mixin defintion that has - * replaced all defined arguments with user's supplied VarUsages. - */ + /// Given a mixin's defined arguments return a cloned mixin defintion that has + /// replaced all defined arguments with user's supplied VarUsages. MixinDefinition transform(List> callArgs) { // TODO(terry): Handle default arguments and varArgs. // Transform mixin with callArgs. @@ -626,7 +605,7 @@ class CallMixin extends Visitor { return mixinDef.clone(); } - /** Rip apart var def with multiple parameters. */ + /// Rip apart var def with multiple parameters. List> _varDefsAsCallArgs(var callArg) { var defArgs = >[]; if (callArg is List && callArg[0] is VarUsage) { @@ -691,18 +670,18 @@ class CallMixin extends Visitor { } } -/** Expand all @include inside of a declaration associated with a mixin. */ +/// Expand all @include inside of a declaration associated with a mixin. class DeclarationIncludes extends Visitor { StyleSheet _styleSheet; final Messages _messages; - /** Map of variable name key to it's definition. */ + /// Map of variable name key to it's definition. final Map map = new Map(); - /** Cache of mixin called with parameters. */ + /// Cache of mixin called with parameters. final Map callMap = new Map(); MixinDefinition currDef; DeclarationGroup currDeclGroup; - /** Var definitions with more than 1 expression. */ + /// Var definitions with more than 1 expression. final Map varDefs = new Map(); static void expand(Messages messages, List styleSheets) { @@ -837,16 +816,14 @@ class DeclarationIncludes extends Visitor { } } -/** @include as a top-level with ruleset(s). */ +/// @include as a top-level with ruleset(s). class _IncludeReplacer extends Visitor { final _include; final List _newDeclarations; bool _foundAndReplaced = false; - /** - * Look for the [ruleSet] inside of a @media directive; if found then replace - * with the [newRules]. - */ + /// Look for the [ruleSet] inside of a @media directive; if found then replace + /// with the [newRules]. static void replace( StyleSheet ss, var include, List newDeclarations) { var visitor = new _IncludeReplacer(include, newDeclarations); @@ -867,9 +844,8 @@ class _IncludeReplacer extends Visitor { } } -/** - * Remove all @mixin and @include and any NoOp used as placeholder for @include. - */ +/// Remove all @mixin and @include and any NoOp used as placeholder for +/// @include. class MixinsAndIncludes extends Visitor { static void remove(StyleSheet styleSheet) { new MixinsAndIncludes()..visitStyleSheet(styleSheet); @@ -899,7 +875,7 @@ class MixinsAndIncludes extends Visitor { } } -/** Find all @extend to create inheritance. */ +/// Find all @extend to create inheritance. class AllExtends extends Visitor { final Map> inherits = new Map>(); @@ -957,9 +933,7 @@ class AllExtends extends Visitor { // TODO(terry): Need to handle merging selector sequences // TODO(terry): Need to handle @extend-Only selectors. // TODO(terry): Need to handle !optional glag. -/** - * Changes any selector that matches @extend. - */ +/// Changes any selector that matches @extend. class InheritExtends extends Visitor { final Messages _messages; final AllExtends _allExtends; diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index ada2b2637..7fec0146f 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -4,29 +4,25 @@ part of csslib.visitor; -/** - * Visitor that produces a formatted string representation of the CSS tree. - */ +/// Visitor that produces a formatted string representation of the CSS tree. class CssPrinter extends Visitor { StringBuffer _buff = new StringBuffer(); bool prettyPrint = true; - /** - * Walk the [tree] Stylesheet. [pretty] if true emits line breaks, extra - * spaces, friendly property values, etc., if false emits compacted output. - */ + /// Walk the [tree] Stylesheet. [pretty] if true emits line breaks, extra + /// spaces, friendly property values, etc., if false emits compacted output. void visitTree(StyleSheet tree, {bool pretty: false}) { prettyPrint = pretty; _buff = new StringBuffer(); visitStyleSheet(tree); } - /** Appends [str] to the output buffer. */ + /// Appends [str] to the output buffer. void emit(String str) { _buff.write(str); } - /** Returns the output buffer. */ + /// Returns the output buffer. String toString() => _buff.toString().trim(); String get _newLine => prettyPrint ? '\n' : ''; @@ -155,11 +151,9 @@ class CssPrinter extends Visitor { emit('$_newLine}'); } - /** - * @page : pseudoPage { - * decls - * } - */ + /// @page : pseudoPage { + /// decls + /// } void visitPageDirective(PageDirective node) { emit('$_newLine@page'); if (node.hasIdent || node.hasPseudoPage) { @@ -177,7 +171,7 @@ class CssPrinter extends Visitor { emit('}'); } - /** @charset "charset encoding" */ + /// @charset "charset encoding" void visitCharsetDirective(CharsetDirective node) { emit('$_newLine@charset "${node.charEncoding}";'); } @@ -265,10 +259,8 @@ class CssPrinter extends Visitor { emit('}'); } - /** - * Added optional newLine for handling @include at top-level vs/ inside of - * a declaration group. - */ + /// Added optional newLine for handling @include at top-level vs/ inside of + /// a declaration group. void visitIncludeDirective(IncludeDirective node, [bool topLevel = true]) { if (topLevel) emit(_newLine); emit('@include ${node.name}'); diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 420c24350..3fe079bba 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -12,7 +12,7 @@ import 'options.dart'; // TODO(terry): Remove the global messages, use some object that tracks // compilation state. -/** The global [Messages] for tracking info/warnings/messages. */ +/// The global [Messages] for tracking info/warnings/messages. Messages messages; // Color constants used for generating messages. @@ -21,7 +21,7 @@ final String RED_COLOR = '\u001b[31m'; final String MAGENTA_COLOR = '\u001b[35m'; final String NO_COLOR = '\u001b[0m'; -/** Map between error levels and their display color. */ +/// Map between error levels and their display color. final Map _ERROR_COLORS = (() { var colorsMap = new Map(); colorsMap[Level.SEVERE] = RED_COLOR; @@ -30,7 +30,7 @@ final Map _ERROR_COLORS = (() { return colorsMap; })(); -/** Map between error levels and their friendly name. */ +/// Map between error levels and their friendly name. final Map _ERROR_LABEL = (() { var labels = new Map(); labels[Level.SEVERE] = 'error'; @@ -39,7 +39,7 @@ final Map _ERROR_LABEL = (() { return labels; })(); -/** A single message from the compiler. */ +/// A single message from the compiler. class Message { final Level level; final String message; @@ -71,12 +71,10 @@ class Message { typedef void PrintHandler(Message obj); -/** - * This class tracks and prints information, warnings, and errors emitted by the - * compiler. - */ +/// This class tracks and prints information, warnings, and errors emitted by +/// the compiler. class Messages { - /** Called on every error. Set to blank function to supress printing. */ + /// Called on every error. Set to blank function to supress printing. final PrintHandler printHandler; final PreprocessorOptions options; @@ -86,7 +84,7 @@ class Messages { Messages({PreprocessorOptions options, this.printHandler: print}) : options = options != null ? options : new PreprocessorOptions(); - /** Report a compile-time CSS error. */ + /// Report a compile-time CSS error. void error(String message, SourceSpan span) { var msg = new Message(Level.SEVERE, message, span: span, useColors: options.useColors); @@ -96,7 +94,7 @@ class Messages { printHandler(msg); } - /** Report a compile-time CSS warning. */ + /// Report a compile-time CSS warning. void warning(String message, SourceSpan span) { if (options.warningsAsErrors) { error(message, span); @@ -108,7 +106,7 @@ class Messages { } } - /** Report and informational message about what the compiler is doing. */ + /// Report and informational message about what the compiler is doing. void info(String message, SourceSpan span) { var msg = new Message(Level.INFO, message, span: span, useColors: options.useColors); @@ -118,7 +116,7 @@ class Messages { if (options.verbose) printHandler(msg); } - /** Merge [newMessages] to this message lsit. */ + /// Merge [newMessages] to this message lsit. void mergeMessages(Messages newMessages) { messages.addAll(newMessages.messages); newMessages.messages diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/options.dart index 56c358b2f..19130feb8 100644 --- a/pkgs/csslib/lib/src/options.dart +++ b/pkgs/csslib/lib/src/options.dart @@ -5,37 +5,35 @@ library csslib.src.options; class PreprocessorOptions { - /** Generate polyfill code (e.g., var, etc.) */ + /// Generate polyfill code (e.g., var, etc.) final bool polyfill; - /** Report warnings as errors. */ + /// Report warnings as errors. final bool warningsAsErrors; - /** Throw an exception on warnings (not used by command line tool). */ + /// Throw an exception on warnings (not used by command line tool). final bool throwOnWarnings; - /** Throw an exception on errors (not used by command line tool). */ + /// Throw an exception on errors (not used by command line tool). final bool throwOnErrors; - /** True to show informational messages. The `--verbose` flag. */ + /// True to show informational messages. The `--verbose` flag. final bool verbose; - /** True to show warning messages for bad CSS. The '--checked' flag. */ + /// True to show warning messages for bad CSS. The '--checked' flag. final bool checked; // TODO(terry): Add mixin support and nested rules. - /** - * Subset of Less commands enabled; disable with '--no-less'. - * Less syntax supported: - * - @name at root level statically defines variables resolved at compilation - * time. Essentially a directive e.g., @var-name. - */ + /// Subset of Less commands enabled; disable with '--no-less'. + /// Less syntax supported: + /// - @name at root level statically defines variables resolved at compilation + /// time. Essentially a directive e.g., @var-name. final bool lessSupport; - /** Whether to use colors to print messages on the terminal. */ + /// Whether to use colors to print messages on the terminal. final bool useColors; - /** File to process by the compiler. */ + /// File to process by the compiler. final String inputFile; const PreprocessorOptions( diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index 9bdcbe232..fc6cc5f9a 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -4,10 +4,8 @@ part of csslib.parser; -/** - * CSS polyfill emits CSS to be understood by older parsers that which do not - * understand (var, calc, etc.). - */ +/// CSS polyfill emits CSS to be understood by older parsers that which do not +/// understand (var, calc, etc.). class PolyFill { final Messages _messages; Map _allVarDefinitions = @@ -15,17 +13,13 @@ class PolyFill { Set allStyleSheets = new Set(); - /** - * [_pseudoElements] list of known pseudo attributes found in HTML, any - * CSS pseudo-elements 'name::custom-element' is mapped to the manged name - * associated with the pseudo-element key. - */ + /// [_pseudoElements] list of known pseudo attributes found in HTML, any + /// CSS pseudo-elements 'name::custom-element' is mapped to the manged name + /// associated with the pseudo-element key. PolyFill(this._messages); - /** - * Run the analyzer on every file that is a style sheet or any component that - * has a style tag. - */ + /// Run the analyzer on every file that is a style sheet or any component that + /// has a style tag. void process(StyleSheet styleSheet, {List includes: null}) { if (includes != null) { processVarDefinitions(includes); @@ -36,7 +30,7 @@ class PolyFill { new _RemoveVarDefinitions().visitTree(styleSheet); } - /** Process all includes looking for var definitions. */ + /// Process all includes looking for var definitions. void processVarDefinitions(List includes) { for (var include in includes) { _allVarDefinitions = (new _VarDefinitionsIncludes(_allVarDefinitions) @@ -62,7 +56,7 @@ class PolyFill { } } -/** Build list of all var definitions in all includes. */ +/// Build list of all var definitions in all includes. class _VarDefinitionsIncludes extends Visitor { final Map varDefs; @@ -83,10 +77,8 @@ class _VarDefinitionsIncludes extends Visitor { } } -/** - * Find var- definitions in a style sheet. - * [found] list of known definitions. - */ +/// Find var- definitions in a style sheet. +/// [found] list of known definitions. class _VarDefAndUsage extends Visitor { final Messages _messages; final Map _knownVarDefs; @@ -206,7 +198,7 @@ class _VarDefAndUsage extends Visitor { } } -/** Remove all var definitions. */ +/// Remove all var definitions. class _RemoveVarDefinitions extends Visitor { void visitTree(StyleSheet tree) { visitStyleSheet(tree); @@ -223,7 +215,7 @@ class _RemoveVarDefinitions extends Visitor { } } -/** Find terminal definition (non VarUsage implies real CSS value). */ +/// Find terminal definition (non VarUsage implies real CSS value). VarDefinition _findTerminalVarDefinition( Map varDefs, VarDefinition varDef) { var expressions = varDef.expression as Expressions; diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index c6b9ccff6..cf614fe79 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -/** Representations of CSS styles. */ +/// Representations of CSS styles. part of csslib.parser; @@ -11,46 +11,34 @@ part of csslib.parser; // the complexity can be removed. // See https://github.com/dart-lang/csslib/issues/7 -/** - * Base for all style properties (e.g., Color, Font, Border, Margin, etc.) - */ +/// Base for all style properties (e.g., Color, Font, Border, Margin, etc.) abstract class _StyleProperty { - /** - * Returns the expression part of a CSS declaration. Declaration is: - * - * property:expression; - * - * E.g., if property is color then expression could be rgba(255,255,0) the - * CSS declaration would be 'color:rgba(255,255,0);'. - * - * then _cssExpression would return 'rgba(255,255,0)'. See - * - */ + /// Returns the expression part of a CSS declaration. Declaration is: + /// + /// property:expression; + /// + /// E.g., if property is color then expression could be rgba(255,255,0) the + /// CSS declaration would be 'color:rgba(255,255,0);'. + /// + /// then _cssExpression would return 'rgba(255,255,0)'. See + /// String get cssExpression; } -/** - * Base interface for Color, HSL and RGB. - */ +/// Base interface for Color, HSL and RGB. abstract class ColorBase { - /** - * Canonical form for color #rrggbb with alpha blending (0.0 == full - * transparency and 1.0 == fully opaque). If _argb length is 6 it's an - * rrggbb otherwise it's aarrggbb. - */ + /// Canonical form for color #rrggbb with alpha blending (0.0 == full + /// transparency and 1.0 == fully opaque). If _argb length is 6 it's an + /// rrggbb otherwise it's aarrggbb. String toHexArgbString(); - /** - * Return argb as a value (int). - */ + /// Return argb as a value (int). int get argbValue; } -/** - * General purpse Color class. Represent a color as an ARGB value that can be - * converted to and from num, hex string, hsl, hsla, rgb, rgba and SVG pre- - * defined color constant. - */ +/// General purpse Color class. Represent a color as an ARGB value that can be +/// converted to and from num, hex string, hsl, hsla, rgb, rgba and SVG pre- +/// defined color constant. class Color implements _StyleProperty, ColorBase { // If _argb length is 6 it's an rrggbb otherwise it's aarrggbb. final String _argb; @@ -59,25 +47,21 @@ class Color implements _StyleProperty, ColorBase { // converting from Color to an Rgba or Hsla for reading only. // Usefulness of creating an Rgba or Hsla is limited. - /** - * Create a color with an integer representing the rgb value of red, green, - * and blue. The value 0xffffff is the color white #ffffff (CSS style). - * The [rgb] value of 0xffd700 would map to #ffd700 or the constant - * Color.gold, where ff is red intensity, d7 is green intensity, and 00 is - * blue intensity. - */ + /// Create a color with an integer representing the rgb value of red, green, + /// and blue. The value 0xffffff is the color white #ffffff (CSS style). + /// The [rgb] value of 0xffd700 would map to #ffd700 or the constant + /// Color.gold, where ff is red intensity, d7 is green intensity, and 00 is + /// blue intensity. Color(int rgb, [num alpha]) : this._argb = Color._rgbToArgbString(rgb, alpha); - /** - * RGB takes three values. The [red], [green], and [blue] parameters are - * the intensity of those components where '0' is the least and '256' is the - * greatest. - * - * If [alpha] is provided, it is the level of translucency which ranges from - * '0' (completely transparent) to '1.0' (completely opaque). It will - * internally be mapped to an int between '0' and '255' like the other color - * components. - */ + /// RGB takes three values. The [red], [green], and [blue] parameters are + /// the intensity of those components where '0' is the least and '256' is the + /// greatest. + /// + /// If [alpha] is provided, it is the level of translucency which ranges from + /// '0' (completely transparent) to '1.0' (completely opaque). It will + /// internally be mapped to an int between '0' and '255' like the other color + /// components. Color.createRgba(int red, int green, int blue, [num alpha]) : this._argb = Color.convertToHexString( Color._clamp(red, 0, 255), @@ -85,26 +69,22 @@ class Color implements _StyleProperty, ColorBase { Color._clamp(blue, 0, 255), alpha != null ? Color._clamp(alpha, 0, 1) : alpha); - /** - * Creates a new color from a CSS color string. For more information, see - * . - */ + /// Creates a new color from a CSS color string. For more information, see + /// . Color.css(String color) : this._argb = Color._convertCssToArgb(color); // TODO(jmesserly): I found the use of percents a bit suprising. - /** - * HSL takes three values. The [hueDegree] degree on the color wheel; '0' is - * the least and '100' is the greatest. The value '0' or '360' is red, '120' - * is green, '240' is blue. Numbers in between reflect different shades. - * The [saturationPercent] percentage; where'0' is the least and '100' is the - * greatest (100 represents full color). The [lightnessPercent] percentage; - * where'0' is the least and '100' is the greatest. The value 0 is dark or - * black, 100 is light or white and 50 is a medium lightness. - * - * If [alpha] is provided, it is the level of translucency which ranges from - * '0' (completely transparent foreground) to '1.0' (completely opaque - * foreground). - */ + /// HSL takes three values. The [hueDegree] degree on the color wheel; '0' is + /// the least and '100' is the greatest. The value '0' or '360' is red, '120' + /// is green, '240' is blue. Numbers in between reflect different shades. + /// The [saturationPercent] percentage; where'0' is the least and '100' is the + /// greatest (100 represents full color). The [lightnessPercent] percentage; + /// where'0' is the least and '100' is the greatest. The value 0 is dark or + /// black, 100 is light or white and 50 is a medium lightness. + /// + /// If [alpha] is provided, it is the level of translucency which ranges from + /// '0' (completely transparent foreground) to '1.0' (completely opaque + /// foreground). Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent, [num alpha]) : this._argb = new Hsla( @@ -114,21 +94,19 @@ class Color implements _StyleProperty, ColorBase { alpha != null ? Color._clamp(alpha, 0, 1) : alpha) .toHexArgbString(); - /** - * The hslaRaw takes three values. The [hue] degree on the color wheel; '0' - * is the least and '1' is the greatest. The value '0' or '1' is red, the - * ratio of 120/360 is green, and the ratio of 240/360 is blue. Numbers in - * between reflect different shades. The [saturation] is a percentage; '0' - * is the least and '1' is the greatest. The value of '1' is equivalent to - * 100% (full colour). The [lightness] is a percentage; '0' is the least and - * '1' is the greatest. The value of '0' is dark (black), the value of '1' - * is light (white), and the value of '.50' is a medium lightness. - * - * The fourth optional parameter is: - * [alpha] level of translucency range of values is 0..1, zero is a - * completely transparent foreground and 1 is a completely - * opaque foreground. - */ + /// The hslaRaw takes three values. The [hue] degree on the color wheel; '0' + /// is the least and '1' is the greatest. The value '0' or '1' is red, the + /// ratio of 120/360 is green, and the ratio of 240/360 is blue. Numbers in + /// between reflect different shades. The [saturation] is a percentage; '0' + /// is the least and '1' is the greatest. The value of '1' is equivalent to + /// 100% (full colour). The [lightness] is a percentage; '0' is the least and + /// '1' is the greatest. The value of '0' is dark (black), the value of '1' + /// is light (white), and the value of '.50' is a medium lightness. + /// + /// The fourth optional parameter is: + /// [alpha] level of translucency range of values is 0..1, zero is a + /// completely transparent foreground and 1 is a completely + /// opaque foreground. Color.hslaRaw(num hue, num saturation, num lightness, [num alpha]) : this._argb = new Hsla( Color._clamp(hue, 0, 1), @@ -137,9 +115,7 @@ class Color implements _StyleProperty, ColorBase { alpha != null ? Color._clamp(alpha, 0, 1) : alpha) .toHexArgbString(); - /** - * Generate a real constant for pre-defined colors (no leading #). - */ + /// Generate a real constant for pre-defined colors (no leading #). const Color.hex(this._argb); // TODO(jmesserly): this is needed by the example so leave it exposed for now. @@ -237,11 +213,10 @@ class Color implements _StyleProperty, ColorBase { static const int _rgbaCss = 2; static const int _hslCss = 3; static const int _hslaCss = 4; - /** - * Parse CSS expressions of the from #rgb, rgb(r,g,b), rgba(r,g,b,a), - * hsl(h,s,l), hsla(h,s,l,a) and SVG colors (e.g., darkSlateblue, etc.) and - * convert to argb. - */ + + /// Parse CSS expressions of the from #rgb, rgb(r,g,b), rgba(r,g,b,a), + /// hsl(h,s,l), hsla(h,s,l,a) and SVG colors (e.g., darkSlateblue, etc.) and + /// convert to argb. static String _convertCssToArgb(String value) { // TODO(terry): Better parser/regex for converting CSS properties. String color = value.trim().replaceAll("\\s", ""); @@ -320,17 +295,15 @@ class Color implements _StyleProperty, ColorBase { static num _clamp(num value, num min, num max) => math.max(math.min(max, value), min); - /** - * Change the tint (make color lighter) or shade (make color darker) of all - * parts of [rgba] (r, g and b). The [amount] is percentage darker between - * -1 to 0 for darker and 0 to 1 for lighter; '0' is no change. The [amount] - * will darken or lighten the rgb values; it will not change the alpha value. - * If [amount] is outside of the value -1 to +1 then [amount] is changed to - * either the min or max direction -1 or 1. - * - * Darker will approach the color #000000 (black) and lighter will approach - * the color #ffffff (white). - */ + /// Change the tint (make color lighter) or shade (make color darker) of all + /// parts of [rgba] (r, g and b). The [amount] is percentage darker between + /// -1 to 0 for darker and 0 to 1 for lighter; '0' is no change. The [amount] + /// will darken or lighten the rgb values; it will not change the alpha value. + /// If [amount] is outside of the value -1 to +1 then [amount] is changed to + /// either the min or max direction -1 or 1. + /// + /// Darker will approach the color #000000 (black) and lighter will approach + /// the color #ffffff (white). static Rgba _createNewTintShadeFromRgba(Rgba rgba, num amount) { int r, g, b; num tintShade = Color._clamp(amount, -1, 1); @@ -353,12 +326,10 @@ class Color implements _StyleProperty, ColorBase { // TODO(terry): This does an okay lighter/darker; better would be convert to // HSL then change the lightness. - /** - * The parameter [v] is the color to change (r, g, or b) in the range '0' to - * '255'. The parameter [delta] is a number between '-1' and '1'. A value - * between '-1' and '0' is darker and a value between '0' and '1' is lighter - * ('0' imples no change). - */ + /// The parameter [v] is the color to change (r, g, or b) in the range '0' to + /// '255'. The parameter [delta] is a number between '-1' and '1'. A value + /// between '-1' and '0' is darker and a value between '0' and '1' is lighter + /// ('0' imples no change). static num _changeTintShadeColor(num v, num delta) => Color._clamp(((1 - delta) * v + (delta * 255)).round(), 0, 255); @@ -513,9 +484,7 @@ class Color implements _StyleProperty, ColorBase { static final Color yellowGreen = const Color.hex("9acd32"); } -/** - * Rgba class for users that want to interact with a color as a RGBA value. - */ +/// Rgba class for users that want to interact with a color as a RGBA value. class Rgba implements _StyleProperty, ColorBase { // TODO(terry): Consider consolidating rgba to a single 32-bit int, make sure // it works under JS and Dart VM. @@ -635,24 +604,20 @@ class Rgba implements _StyleProperty, ColorBase { int get hashCode => toHexArgbString().hashCode; } -/** - * Hsl class support to interact with a color as a hsl with hue, saturation, and - * lightness with optional alpha blending. The hue is a ratio of 360 degrees - * 360° = 1 or 0, (1° == (1/360)), saturation and lightness is a 0..1 fraction - * (1 == 100%) and alpha is a 0..1 fraction. - */ +/// Hsl class support to interact with a color as a hsl with hue, saturation, +/// and lightness with optional alpha blending. The hue is a ratio of 360 +/// degrees 360° = 1 or 0, (1° == (1/360)), saturation and lightness is a 0..1 +/// fraction (1 == 100%) and alpha is a 0..1 fraction. class Hsla implements _StyleProperty, ColorBase { final num _h; // Value from 0..1 final num _s; // Value from 0..1 final num _l; // Value from 0..1 final num _a; // Value from 0..1 - /** - * [hue] is a 0..1 fraction of 360 degrees (360 == 0). - * [saturation] is a 0..1 fraction (100% == 1). - * [lightness] is a 0..1 fraction (100% == 1). - * [alpha] is a 0..1 fraction, alpha blending between 0..1, 1 == 100% opaque. - */ + /// [hue] is a 0..1 fraction of 360 degrees (360 == 0). + /// [saturation] is a 0..1 fraction (100% == 1). + /// [lightness] is a 0..1 fraction (100% == 1). + /// [alpha] is a 0..1 fraction, alpha blending between 0..1, 1 == 100% opaque. Hsla(num hue, num saturation, num lightness, [num alpha]) : this._h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1), this._s = Color._clamp(saturation, 0, 1), @@ -730,39 +695,25 @@ class Hsla implements _StyleProperty, ColorBase { return new Hsla(h, s, l, a); } - /** - * Returns 0..1 fraction (ratio of 360°, e.g. 1° == 1/360). - */ + /// Returns 0..1 fraction (ratio of 360°, e.g. 1° == 1/360). num get hue => _h; - /** - * Returns 0..1 fraction (1 == 100%) - */ + /// Returns 0..1 fraction (1 == 100%) num get saturation => _s; - /** - * Returns 0..1 fraction (1 == 100%). - */ + /// Returns 0..1 fraction (1 == 100%). num get lightness => _l; - /** - * Returns number as degrees 0..360. - */ + /// Returns number as degrees 0..360. num get hueDegrees => (_h * 360).round(); - /** - * Returns number as percentage 0..100 - */ + /// Returns number as percentage 0..100 num get saturationPercentage => (_s * 100).round(); - /** - * Returns number as percentage 0..100. - */ + /// Returns number as percentage 0..100. num get lightnessPercentage => (_l * 100).round(); - /** - * Returns number as 0..1 - */ + /// Returns number as 0..1 num get alpha => _a; bool operator ==(other) => Color.equal(this, other); @@ -787,7 +738,7 @@ class Hsla implements _StyleProperty, ColorBase { int get hashCode => toHexArgbString().hashCode; } -/** X,Y position. */ +/// X,Y position. class PointXY implements _StyleProperty { final num x, y; const PointXY(this.x, this.y); @@ -799,9 +750,7 @@ class PointXY implements _StyleProperty { } // TODO(terry): Implement style and color. -/** - * Supports border for measuring with layout. - */ +/// Supports border for measuring with layout. class Border implements _StyleProperty { final int top, left, bottom, right; @@ -823,39 +772,42 @@ class Border implements _StyleProperty { String get cssExpression { return (top == left && bottom == right && top == right) ? "${left}px" - : "${top != null ? '$top' : '0'}px ${right != null ? '$right' : '0'}px ${bottom != null ? '$bottom' : '0'}px ${left != null ? '$left' : '0'}px"; + : "${top != null ? '$top' : '0'}px " + "${right != null ? '$right' : '0'}px " + "${bottom != null ? '$bottom' : '0'}px " + "${left != null ? '$left' : '0'}px"; } } -/** Font style constants. */ +/// Font style constants. class FontStyle { - /** Font style [normal] default. */ + /// Font style [normal] default. static const String normal = "normal"; - /** - * Font style [italic] use explicity crafted italic font otherwise inclined - * on the fly like oblique. - */ + + /// Font style [italic] use explicity crafted italic font otherwise inclined + /// on the fly like oblique. static const String italic = "italic"; - /** - * Font style [oblique] is rarely used. The normal style of a font is inclined - * on the fly to the right by 8-12 degrees. - */ + + /// Font style [oblique] is rarely used. The normal style of a font is + /// inclined on the fly to the right by 8-12 degrees. static const String oblique = "oblique"; } -/** Font variant constants. */ +/// Font variant constants. class FontVariant { - /** Font style [normal] default. */ + /// Font style [normal] default. static const String normal = "normal"; - /** Font variant [smallCaps]. */ + + /// Font variant [smallCaps]. static const String smallCaps = "small-caps"; } -/** Font weight constants values 100, 200, 300, 400, 500, 600, 700, 800, 900. */ +/// Font weight constants values 100, 200, 300, 400, 500, 600, 700, 800, 900. class FontWeight { - /** Font weight normal [default] */ + /// Font weight normal [default] static const int normal = 400; - /** Font weight bold */ + + /// Font weight bold static const int bold = 700; static const int wt100 = 100; @@ -869,73 +821,80 @@ class FontWeight { static const int wt900 = 900; } -/** Generic font family names. */ +/// Generic font family names. class FontGeneric { - /** Generic family sans-serif font (w/o serifs). */ + /// Generic family sans-serif font (w/o serifs). static const String sansSerif = "sans-serif"; - /** Generic family serif font. */ + + /// Generic family serif font. static const String serif = "serif"; - /** Generic family fixed-width font. */ + + /// Generic family fixed-width font. static const monospace = "monospace"; - /** Generic family emulate handwriting font. */ + + /// Generic family emulate handwriting font. static const String cursive = "cursive"; - /** Generic family decorative font. */ + + /// Generic family decorative font. static const String fantasy = "fantasy"; } -/** - * List of most common font families across different platforms. Use the - * collection names in the Font class (e.g., Font.SANS_SERIF, Font.FONT_SERIF, - * Font.MONOSPACE, Font.CURSIVE or Font.FANTASY). These work best on all - * platforms using the fonts that best match availability on each platform. - * See for a good - * description of fonts available between platforms and browsers. - */ +/// List of most common font families across different platforms. Use the +/// collection names in the Font class (e.g., Font.SANS_SERIF, Font.FONT_SERIF, +/// Font.MONOSPACE, Font.CURSIVE or Font.FANTASY). These work best on all +/// platforms using the fonts that best match availability on each platform. +/// See for a good +/// description of fonts available between platforms and browsers. class FontFamily { - /** Sans-Serif font for Windows similar to Helvetica on Mac bold/italic. */ + /// Sans-Serif font for Windows similar to Helvetica on Mac bold/italic. static const String arial = "arial"; - /** Sans-Serif font for Windows less common already bolded. */ + + /// Sans-Serif font for Windows less common already bolded. static const String arialBlack = "arial black"; - /** Sans-Serif font for Mac since 1984, similar to Arial/Helvetica. */ + + /// Sans-Serif font for Mac since 1984, similar to Arial/Helvetica. static const String geneva = "geneva"; - /** Sans-Serif font for Windows most readable sans-serif font for displays. */ + + /// Sans-Serif font for Windows most readable sans-serif font for displays. static const String verdana = "verdana"; - /** Sans-Serif font for Mac since 1984 is identical to Arial. */ + + /// Sans-Serif font for Mac since 1984 is identical to Arial. static const String helvetica = "helvetica"; - /** Serif font for Windows traditional font with “old-style” numerals. */ + /// Serif font for Windows traditional font with “old-style” numerals. static const String georgia = "georgia"; - /** - * Serif font for Mac. PCs may have the non-scalable Times use Times New - * Roman instead. Times is more compact than Times New Roman. - */ + + /// Serif font for Mac. PCs may have the non-scalable Times use Times New + /// Roman instead. Times is more compact than Times New Roman. static const String times = "times"; - /** - * Serif font for Windows most common serif font and default serif font for - * most browsers. - */ + + /// Serif font for Windows most common serif font and default serif font for + /// most browsers. static const String timesNewRoman = "times new roman"; - /** - * Monospace font for Mac/Windows most common. Scalable on Mac not scalable - * on Windows. - */ + /// Monospace font for Mac/Windows most common. Scalable on Mac not scalable + /// on Windows. static const String courier = "courier"; - /** Monospace font for Mac/Windows scalable on both platforms. */ + + /// Monospace font for Mac/Windows scalable on both platforms. static const String courierNew = "courier new"; - /** Cursive font for Windows and default cursive font for IE. */ + /// Cursive font for Windows and default cursive font for IE. static const String comicSansMs = "comic sans ms"; - /** Cursive font for Mac on Macs 2000 and newer. */ + + /// Cursive font for Mac on Macs 2000 and newer. static const String textile = "textile"; - /** Cursive font for older Macs. */ + + /// Cursive font for older Macs. static const String appleChancery = "apple chancery"; - /** Cursive font for some PCs. */ + + /// Cursive font for some PCs. static const String zaphChancery = "zaph chancery"; - /** Fantasy font on most Mac/Windows/Linux platforms. */ + /// Fantasy font on most Mac/Windows/Linux platforms. static const String impact = "impact"; - /** Fantasy font for Windows. */ + + /// Fantasy font for Windows. static const String webdings = "webdings"; } @@ -946,11 +905,9 @@ class LineHeight { } // TODO(terry): Support @font-face fule. -/** - * Font style support for size, family, weight, style, variant, and lineheight. - */ +/// Font style support for size, family, weight, style, variant, and lineheight. class Font implements _StyleProperty { - /** Collection of most common sans-serif fonts in order. */ + /// Collection of most common sans-serif fonts in order. static const List sansSerif = const [ FontFamily.arial, FontFamily.verdana, @@ -959,27 +916,30 @@ class Font implements _StyleProperty { FontGeneric.sansSerif ]; - /** Collection of most common serif fonts in order. */ + /// Collection of most common serif fonts in order. static const List serif = const [ FontFamily.georgia, FontFamily.timesNewRoman, FontFamily.times, FontGeneric.serif ]; - /** Collection of most common monospace fonts in order. */ + + /// Collection of most common monospace fonts in order. static const List monospace = const [ FontFamily.courierNew, FontFamily.courier, FontGeneric.monospace ]; - /** Collection of most common cursive fonts in order. */ + + /// Collection of most common cursive fonts in order. static const List cursive = const [ FontFamily.textile, FontFamily.appleChancery, FontFamily.zaphChancery, FontGeneric.fantasy ]; - /** Collection of most common fantasy fonts in order. */ + + /// Collection of most common fantasy fonts in order. static const List fantasy = const [ FontFamily.comicSansMs, FontFamily.impact, @@ -989,30 +949,26 @@ class Font implements _StyleProperty { // TODO(terry): Should support the values xx-small, small, large, xx-large, // etc. (mapped to a pixel sized font)? - /** Font size in pixels. */ + /// Font size in pixels. final num size; // TODO(terry): _family should be an immutable list, wrapper class to do this // should exist in Dart. - /** - * Family specifies a list of fonts, the browser will sequentially select the - * the first known/supported font. There are two types of font families the - * family-name (e.g., arial, times, courier, etc) or the generic-family (e.g., - * serif, sans-seric, etc.) - */ + /// Family specifies a list of fonts, the browser will sequentially select the + /// the first known/supported font. There are two types of font families the + /// family-name (e.g., arial, times, courier, etc) or the generic-family + /// (e.g., serif, sans-seric, etc.) final List family; - /** Font weight from 100, 200, 300, 400, 500, 600, 700, 800, 900 */ + /// Font weight from 100, 200, 300, 400, 500, 600, 700, 800, 900 final int weight; - /** Style of a font normal, italic, oblique. */ + /// Style of a font normal, italic, oblique. final String style; - /** - * Font variant NORMAL (default) or SMALL_CAPS. Different set of font glyph - * lower case letters designed to have to fit within the font-height and - * weight of the corresponding lowercase letters. - */ + /// Font variant NORMAL (default) or SMALL_CAPS. Different set of font glyph + /// lower case letters designed to have to fit within the font-height and + /// weight of the corresponding lowercase letters. final String variant; final LineHeight lineHeight; @@ -1028,12 +984,10 @@ class Font implements _StyleProperty { // height. Classic typography suggest the ratio be 1.5. See // and // . - /** - * Create a font using [size] of font in pixels, [family] name of font(s) - * using [FontFamily], [style] of the font using [FontStyle], [variant] using - * [FontVariant], and [lineHeight] extra space (leading) around the font in - * pixels, if not specified it's 1.2 the font size. - */ + /// Create a font using [size] of font in pixels, [family] name of font(s) + /// using [FontFamily], [style] of the font using [FontStyle], [variant] using + /// [FontVariant], and [lineHeight] extra space (leading) around the font in + /// pixels, if not specified it's 1.2 the font size. const Font( {this.size, this.family, @@ -1042,10 +996,8 @@ class Font implements _StyleProperty { this.variant, this.lineHeight}); - /** - * Merge the two fonts and return the result. See [Style.merge] for - * more information. - */ + /// Merge the two fonts and return the result. See [Style.merge] for + /// more information. factory Font.merge(Font a, Font b) { if (a == null) return b; if (b == null) return a; @@ -1060,14 +1012,12 @@ class Font implements _StyleProperty { variant = _mergeVal(a.variant, b.variant), lineHeight = _mergeVal(a.lineHeight, b.lineHeight); - /** - * Shorthand CSS format for font is: - * - * font-style font-variant font-weight font-size/line-height font-family - * - * The font-size and font-family values are required. If any of the other - * values are missing the default value is used. - */ + /// Shorthand CSS format for font is: + /// + /// font-style font-variant font-weight font-size/line-height font-family + /// + /// The font-size and font-family values are required. If any of the other + /// values are missing the default value is used. String get cssExpression { // TODO(jimhug): include variant, style, other options if (weight != null) { @@ -1088,15 +1038,13 @@ class Font implements _StyleProperty { style: style, variant: variant); - /** - * The lineHeight, provides an indirect means to specify the leading. The - * leading is the difference between the font-size height and the (used) - * value of line height in pixels. If lineHeight is not specified it's - * automatically computed as 1.2 of the font size. Firefox is 1.2, Safari is - * ~1.2, and CSS suggest a ration from 1 to 1.2 of the font-size when - * computing line-height. The Font class constructor has the computation for - * _lineHeight. - */ + /// The lineHeight, provides an indirect means to specify the leading. The + /// leading is the difference between the font-size height and the (used) + /// value of line height in pixels. If lineHeight is not specified it's + /// automatically computed as 1.2 of the font size. Firefox is 1.2, Safari is + /// ~1.2, and CSS suggest a ration from 1 to 1.2 of the font-size when + /// computing line-height. The Font class constructor has the computation for + /// _lineHeight. num get lineHeightInPixels { if (lineHeight != null) { if (lineHeight.inPixels) { @@ -1127,66 +1075,56 @@ class Font implements _StyleProperty { // TODO(terry): This is fragile should probably just iterate through the list // of fonts construction the font-family string. - /** Return fonts as a comma seperated list sans the square brackets. */ + /// Return fonts as a comma seperated list sans the square brackets. String get _fontsAsString { String fonts = family.toString(); return fonts.length > 2 ? fonts.substring(1, fonts.length - 1) : ""; } } -/** - * This class stores the sizes of the box edges in the CSS [box model][]. Each - * edge area is placed around the sides of the content box. The innermost area - * is the [Style.padding] area which has a background and surrounds the content. - * The content and padding area is surrounded by the [Style.border], which - * itself is surrounded by the transparent [Style.margin]. This box represents - * the eges of padding, border, or margin depending on which accessor was used - * to retrieve it. - * - * [box model]: https://developer.mozilla.org/en/CSS/box_model - */ +/// This class stores the sizes of the box edges in the CSS [box model][]. Each +/// edge area is placed around the sides of the content box. The innermost area +/// is the [Style.padding] area which has a background and surrounds the +/// content. The content and padding area is surrounded by the [Style.border], +/// which itself is surrounded by the transparent [Style.margin]. This box +/// represents the eges of padding, border, or margin depending on which +/// accessor was used to retrieve it. +/// +/// [box model]: https://developer.mozilla.org/en/CSS/box_model class BoxEdge { - /** The size of the left edge, or null if the style has no edge. */ + /// The size of the left edge, or null if the style has no edge. final num left; - /** The size of the top edge, or null if the style has no edge. */ + /// The size of the top edge, or null if the style has no edge. final num top; - /** The size of the right edge, or null if the style has no edge. */ + /// The size of the right edge, or null if the style has no edge. final num right; - /** The size of the bottom edge, or null if the style has no edge. */ + /// The size of the bottom edge, or null if the style has no edge. final num bottom; - /** - * Creates a box edge with the specified [left], [top], [right], and - * [bottom] width. - */ + /// Creates a box edge with the specified [left], [top], [right], and + /// [bottom] width. const BoxEdge([this.left, this.top, this.right, this.bottom]); - /** - * Creates a box edge with the specified [top], [right], [bottom], and - * [left] width. This matches the typical CSS order: - * - * - * . - */ + /// Creates a box edge with the specified [top], [right], [bottom], and + /// [left] width. This matches the typical CSS order: + /// + /// + /// . const BoxEdge.clockwiseFromTop(this.top, this.right, this.bottom, this.left); - /** - * This is a helper to creates a box edge with the same [left], [top] - * [right], and [bottom] widths. - */ + /// This is a helper to creates a box edge with the same [left], [top] + /// [right], and [bottom] widths. const BoxEdge.uniform(num size) : top = size, left = size, bottom = size, right = size; - /** - * Takes a possibly null box edge, with possibly null metrics, and fills - * them in with 0 instead. - */ + /// Takes a possibly null box edge, with possibly null metrics, and fills + /// them in with 0 instead. factory BoxEdge.nonNull(BoxEdge other) { if (other == null) return const BoxEdge(0, 0, 0, 0); num left = other.left; @@ -1213,10 +1151,8 @@ class BoxEdge { return make ? new BoxEdge(left, top, right, bottom) : other; } - /** - * Merge the two box edge sizes and return the result. See [Style.merge] for - * more information. - */ + /// Merge the two box edge sizes and return the result. See [Style.merge] for + /// more information. factory BoxEdge.merge(BoxEdge x, BoxEdge y) { if (x == null) return y; if (y == null) return x; @@ -1229,16 +1165,12 @@ class BoxEdge { right = _mergeVal(x.right, y.right), bottom = _mergeVal(x.bottom, y.bottom); - /** - * The total size of the horizontal edges. Equal to [left] + [right], where - * null is interpreted as 0px. - */ + /// The total size of the horizontal edges. Equal to [left] + [right], where + /// null is interpreted as 0px. num get width => (left != null ? left : 0) + (right != null ? right : 0); - /** - * The total size of the vertical edges. Equal to [top] + [bottom], where - * null is interpreted as 0px. - */ + /// The total size of the vertical edges. Equal to [top] + [bottom], where + /// null is interpreted as 0px. num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0); } diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index e30484d58..873c217ef 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -4,28 +4,26 @@ part of csslib.parser; -/** - * A single token in the Dart language. - */ +/// A single token in the Dart language. class Token { - /** A member of [TokenKind] specifying what kind of token this is. */ + /// A member of [TokenKind] specifying what kind of token this is. final int kind; - /** The location where this token was parsed from. */ + /// The location where this token was parsed from. final FileSpan span; - /** The start offset of this token. */ + /// The start offset of this token. int get start => span.start.offset; - /** The end offset of this token. */ + /// The end offset of this token. int get end => span.end.offset; - /** Returns the source text corresponding to this [Token]. */ + /// Returns the source text corresponding to this [Token]. String get text => span.text; Token(this.kind, this.span); - /** Returns a pretty representation of this token for error messages. **/ + /// Returns a pretty representation of this token for error messages. String toString() { var kindText = TokenKind.kindToString(kind); var actualText = text.trim(); @@ -40,24 +38,22 @@ class Token { } } -/** A token containing a parsed literal value. */ +/// A token containing a parsed literal value. class LiteralToken extends Token { var value; LiteralToken(int kind, FileSpan span, this.value) : super(kind, span); } -/** A token containing error information. */ +/// A token containing error information. class ErrorToken extends Token { String message; ErrorToken(int kind, FileSpan span, this.message) : super(kind, span); } -/** - * CSS ident-token. - * - * See and - * . - */ +/// CSS ident-token. +/// +/// See and +/// . class IdentifierToken extends Token { final String text; diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 0b0661a86..f5f4fbd8f 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -5,14 +5,14 @@ part of csslib.parser; class Tokenizer extends TokenizerBase { - /** U+ prefix for unicode characters. */ + /// U+ prefix for unicode characters. final UNICODE_U = 'U'.codeUnitAt(0); final UNICODE_LOWER_U = 'u'.codeUnitAt(0); final UNICODE_PLUS = '+'.codeUnitAt(0); final QUESTION_MARK = '?'.codeUnitAt(0); - /** CDATA keyword. */ + /// CDATA keyword. final List CDATA_NAME = 'CDATA'.codeUnits; Tokenizer(SourceFile file, String text, bool skipWhitespace, [int index = 0]) @@ -431,7 +431,7 @@ class Tokenizer extends TokenizerBase { } } -/** Static helper methods. */ +/// Static helper methods. class TokenizerHelpers { static bool isIdentifierStart(int c) { return isIdentifierStartExpr(c) || c == 45 /*-*/; @@ -451,7 +451,7 @@ class TokenizerHelpers { return isIdentifierPartExpr(c) || c == 45 /*-*/; } - /** Pseudo function expressions identifiers can't have a minus sign. */ + /// Pseudo function expressions identifiers can't have a minus sign. static bool isIdentifierStartExpr(int c) { return ((c >= 97 /*a*/ && c <= 122 /*z*/) || (c >= 65 /*A*/ && c <= 90 /*Z*/) || @@ -464,7 +464,7 @@ class TokenizerHelpers { c == 92 /*\*/); } - /** Pseudo function expressions identifiers can't have a minus sign. */ + /// Pseudo function expressions identifiers can't have a minus sign. static bool isIdentifierPartExpr(int c) { return (isIdentifierStartExpr(c) || isDigit(c)); } diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index c2a448fd8..07aee793a 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -5,7 +5,7 @@ part of csslib.parser; -/** Tokenizer state to support look ahead for Less' nested selectors. */ +/// Tokenizer state to support look ahead for Less' nested selectors. class TokenizerState { final int index; final int startIndex; @@ -19,27 +19,21 @@ class TokenizerState { inSelector = base.inSelector; } -/** - * The base class for our tokenizer. The hand coded parts are in this file, with - * the generated parts in the subclass Tokenizer. - */ +/// The base class for our tokenizer. The hand coded parts are in this file, +/// with the generated parts in the subclass Tokenizer. abstract class TokenizerBase { final SourceFile _file; final String _text; bool _inString; - /** - * Changes tokenization when in a pseudo function expression. If true then - * minus signs are handled as operators instead of identifiers. - */ + /// Changes tokenization when in a pseudo function expression. If true then + /// minus signs are handled as operators instead of identifiers. bool inSelectorExpression = false; - /** - * Changes tokenization when in selectors. If true, it prevents identifiers - * from being treated as units. This would break things like ":lang(fr)" or - * the HTML (unknown) tag name "px", which is legal to use in a selector. - */ + /// Changes tokenization when in selectors. If true, it prevents identifiers + /// from being treated as units. This would break things like ":lang(fr)" or + /// the HTML (unknown) tag name "px", which is legal to use in a selector. // TODO(jmesserly): is this a problem elsewhere? "fr" for example will be // processed as a "fraction" unit token, preventing it from working in // places where an identifier is expected. This was breaking selectors like: @@ -60,10 +54,10 @@ abstract class TokenizerBase { Token next(); int getIdentifierKind(); - /** Snapshot of Tokenizer scanning state. */ + /// Snapshot of Tokenizer scanning state. TokenizerState get mark => new TokenizerState(this); - /** Restore Tokenizer scanning state. */ + /// Restore Tokenizer scanning state. void restore(TokenizerState markedData) { _index = markedData.index; _startIndex = markedData.startIndex; diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index 14cf3c9ad..1afbe4e9c 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -51,28 +51,28 @@ class TokenKind { // character in the TokenChar list at the bottom of this file. The // order of the above tokens should be the same order as TokenChar. - /** [TokenKind] representing integer tokens. */ + /// [TokenKind] representing integer tokens. static const int INTEGER = 60; - /** [TokenKind] representing hex integer tokens. */ + /// [TokenKind] representing hex integer tokens. static const int HEX_INTEGER = 61; - /** [TokenKind] representing double tokens. */ + /// [TokenKind] representing double tokens. static const int DOUBLE = 62; - /** [TokenKind] representing whitespace tokens. */ + /// [TokenKind] representing whitespace tokens. static const int WHITESPACE = 63; - /** [TokenKind] representing comment tokens. */ + /// [TokenKind] representing comment tokens. static const int COMMENT = 64; - /** [TokenKind] representing error tokens. */ + /// [TokenKind] representing error tokens. static const int ERROR = 65; - /** [TokenKind] representing incomplete string tokens. */ + /// [TokenKind] representing incomplete string tokens. static const int INCOMPLETE_STRING = 66; - /** [TokenKind] representing incomplete comment tokens. */ + /// [TokenKind] representing incomplete comment tokens. static const int INCOMPLETE_COMMENT = 67; static const int VAR_DEFINITION = 400; // var-NNN-NNN @@ -477,10 +477,8 @@ class TokenKind { // see http://www.w3schools.com/cssref/pr_list-style-type.asp // for list of possible values. - /** - * Check if name is a pre-defined CSS name. Used by error handler to report - * if name is unknown or used improperly. - */ + /// Check if name is a pre-defined CSS name. Used by error handler to report + /// if name is unknown or used improperly. static bool isPredefinedName(String name) { var nameLen = name.length; // TODO(terry): Add more pre-defined names (hidden, bolder, inherit, etc.). @@ -494,7 +492,7 @@ class TokenKind { return true; } - /** Return the token that matches the unit ident found. */ + /// Return the token that matches the unit ident found. static int matchList( var identList, String tokenField, String text, int offset, int length) { for (final entry in identList) { @@ -526,22 +524,22 @@ class TokenKind { return -1; // Not a unit token. } - /** Return the token that matches the unit ident found. */ + /// Return the token that matches the unit ident found. static int matchUnits(String text, int offset, int length) { return matchList(_UNITS, 'unit', text, offset, length); } - /** Return the token that matches the directive name found. */ + /// Return the token that matches the directive name found. static int matchDirectives(String text, int offset, int length) { return matchList(_DIRECTIVES, 'type', text, offset, length); } - /** Return the token that matches the margin directive name found. */ + /// Return the token that matches the margin directive name found. static int matchMarginDirectives(String text, int offset, int length) { return matchList(MARGIN_DIRECTIVES, 'type', text, offset, length); } - /** Return the token that matches the media operator found. */ + /// Return the token that matches the media operator found. static int matchMediaOperator(String text, int offset, int length) { return matchList(MEDIA_OPERATORS, 'type', text, offset, length); } @@ -556,7 +554,7 @@ class TokenKind { return null; } - /** Return the unit token as its pretty name. */ + /// Return the unit token as its pretty name. static String unitToString(int unitTokenToFind) { if (unitTokenToFind == TokenKind.PERCENT) { return '%'; @@ -572,17 +570,15 @@ class TokenKind { return ''; // Not a unit token. } - /** - * Match color name, case insensitive match and return the associated color - * entry from _EXTENDED_COLOR_NAMES list, return [:null:] if not found. - */ + /// Match color name, case insensitive match and return the associated color + /// entry from _EXTENDED_COLOR_NAMES list, return [:null:] if not found. static Map matchColorName(String text) { var name = text.toLowerCase(); return _EXTENDED_COLOR_NAMES.firstWhere((e) => e['name'] == name, orElse: () => null); } - /** Return RGB value as [int] from a color entry in _EXTENDED_COLOR_NAMES. */ + /// Return RGB value as [int] from a color entry in _EXTENDED_COLOR_NAMES. static int colorValue(Map entry) { assert(entry != null); return entry['value']; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 70b64c8c6..87698662b 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -105,7 +105,7 @@ class Selector extends TreeNode { } class SimpleSelectorSequence extends TreeNode { - /** +, >, ~, NONE */ + /// +, >, ~, NONE int combinator; final SimpleSelector simpleSelector; @@ -151,9 +151,8 @@ class SimpleSelectorSequence extends TreeNode { String toString() => simpleSelector.name; } -/* All other selectors (element, #id, .class, attribute, pseudo, negation, - * namespace, *) are derived from this selector. - */ +// All other selectors (element, #id, .class, attribute, pseudo, negation, +// namespace, *) are derived from this selector. abstract class SimpleSelector extends TreeNode { final _name; // Wildcard, ThisOperator, Identifier, Negation, others? @@ -378,9 +377,7 @@ class NoOp extends TreeNode { } class StyleSheet extends TreeNode { - /** - * Contains charset, ruleset, directives (media, page, etc.), and selectors. - */ + /// Contains charset, ruleset, directives (media, page, etc.), and selectors. final List topLevels; StyleSheet(this.topLevels, SourceSpan span) : super(span) { @@ -389,7 +386,7 @@ class StyleSheet extends TreeNode { } } - /** Selectors only in this tree. */ + /// Selectors only in this tree. StyleSheet.selector(this.topLevels, SourceSpan span) : super(span); StyleSheet clone() { @@ -554,10 +551,10 @@ class ViewportDirective extends Directive { } class ImportDirective extends Directive { - /** import name specified. */ + /// import name specified. final String import; - /** Any media queries for this import. */ + /// Any media queries for this import. final List mediaQueries; ImportDirective(this.import, this.mediaQueries, SourceSpan span) @@ -574,10 +571,9 @@ class ImportDirective extends Directive { visit(VisitorBase visitor) => visitor.visitImportDirective(this); } -/** - * MediaExpression grammar: - * '(' S* media_feature S* [ ':' S* expr ]? ')' S* - */ +/// MediaExpression grammar: +/// +/// '(' S* media_feature S* [ ':' S* expr ]? ')' S* class MediaExpression extends TreeNode { final bool andOperator; final Identifier _mediaFeature; @@ -597,19 +593,18 @@ class MediaExpression extends TreeNode { visit(VisitorBase visitor) => visitor.visitMediaExpression(this); } -/** - * MediaQuery grammar: - * : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]* - * | media_expression [ AND S* media_expression ]* - * media_type - * : IDENT - * media_expression - * : '(' S* media_feature S* [ ':' S* expr ]? ')' S* - * media_feature - * : IDENT - */ +/// MediaQuery grammar: +/// +/// : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]* +/// | media_expression [ AND S* media_expression ]* +/// media_type +/// : IDENT +/// media_expression +/// : '(' S* media_feature S* [ ':' S* expr ]? ')' S* +/// media_feature +/// : IDENT class MediaQuery extends TreeNode { - /** not, only or no operator. */ + /// not, only or no operator. final int _mediaUnary; final Identifier _mediaType; final List expressions; @@ -705,9 +700,7 @@ class CharsetDirective extends Directive { } class KeyFrameDirective extends Directive { - /* - * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-. - */ + // Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-. final int _keyframeName; final Identifier name; final List _blocks; @@ -790,10 +783,10 @@ class StyletDirective extends Directive { } class NamespaceDirective extends Directive { - /** Namespace prefix. */ + /// Namespace prefix. final String _prefix; - /** URI associated with this namespace. */ + /// URI associated with this namespace. final String _uri; NamespaceDirective(this._prefix, this._uri, SourceSpan span) : super(span); @@ -805,7 +798,7 @@ class NamespaceDirective extends Directive { String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; } -/** To support Less syntax @name: expression */ +/// To support Less syntax @name: expression class VarDefinitionDirective extends Directive { final VarDefinition def; @@ -836,7 +829,7 @@ class MixinDefinition extends Directive { visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); } -/** Support a Sass @mixin. See http://sass-lang.com for description. */ +/// Support a Sass @mixin. See http://sass-lang.com for description. class MixinRulesetDirective extends MixinDefinition { final List rulesets; @@ -879,7 +872,7 @@ class MixinDeclarationDirective extends MixinDefinition { visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); } -/** To support consuming a SASS mixin @include. */ +/// To support consuming a Sass mixin @include. class IncludeDirective extends Directive { final String name; final List> args; @@ -897,7 +890,7 @@ class IncludeDirective extends Directive { visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); } -/** To support SASS @content. */ +/// To support Sass @content. class ContentDirective extends Directive { ContentDirective(SourceSpan span) : super(span); @@ -907,18 +900,17 @@ class ContentDirective extends Directive { class Declaration extends TreeNode { final Identifier _property; final Expression _expression; - /** Style exposed to Dart. */ + /// Style exposed to Dart. dynamic dartStyle; final bool important; - /** - * IE CSS hacks that can only be read by a particular IE version. - * 7 implies IE 7 or older property (e.g., *background: blue;) - * Note: IE 8 or older property (e.g., background: green\9;) is handled - * by IE8Term in declaration expression handling. - * Note: IE 6 only property with a leading underscore is a valid IDENT - * since an ident can start with underscore (e.g., _background: red;) - */ + /// IE CSS hacks that can only be read by a particular IE version. + /// 7 implies IE 7 or older property (e.g., `*background: blue;`) + /// + /// * Note: IE 8 or older property (e.g., `background: green\9;`) is handled + /// by IE8Term in declaration expression handling. + /// * Note: IE 6 only property with a leading underscore is a valid IDENT + /// since an ident can start with underscore (e.g., `_background: red;`) final bool isIE7; Declaration(this._property, this._expression, this.dartStyle, SourceSpan span, @@ -959,13 +951,12 @@ class VarDefinition extends Declaration { visit(VisitorBase visitor) => visitor.visitVarDefinition(this); } -/** - * Node for usage of @include mixin[(args,...)] found in a declaration group - * instead of at a ruleset (toplevel) e.g., - * div { - * @include mixin1; - * } - */ +/// Node for usage of @include mixin[(args,...)] found in a declaration group +/// instead of at a ruleset (toplevel) e.g., +/// +/// div { +/// @include mixin1; +/// } class IncludeMixinAtDeclaration extends Declaration { final IncludeDirective include; @@ -993,7 +984,7 @@ class ExtendDeclaration extends Declaration { } class DeclarationGroup extends TreeNode { - /** Can be either Declaration or RuleSet (if nested selector). */ + /// Can be either Declaration or RuleSet (if nested selector). final List declarations; DeclarationGroup(this.declarations, SourceSpan span) : super(span); @@ -1238,7 +1229,7 @@ class ViewportTerm extends UnitTerm { visit(VisitorBase visitor) => visitor.visitViewportTerm(this); } -/** Type to signal a bad hex value for HexColorTerm.value. */ +/// Type to signal a bad hex value for HexColorTerm.value. class BAD_HEX_VALUE {} class HexColorTerm extends LiteralTerm { @@ -1258,11 +1249,9 @@ class FunctionTerm extends LiteralTerm { visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); } -/** - * A "\9" was encountered at the end of the expression and before a semi-colon. - * This is an IE trick to ignore a property or value except by IE 8 and older - * browsers. - */ +/// A "\9" was encountered at the end of the expression and before a semi-colon. +/// This is an IE trick to ignore a property or value except by IE 8 and older +/// browsers. class IE8Term extends LiteralTerm { IE8Term(SourceSpan span) : super('\\9', '\\9', span); IE8Term clone() => new IE8Term(span); @@ -1347,11 +1336,9 @@ abstract class DartStyleExpression extends TreeNode { DartStyleExpression(this._styleType, SourceSpan span) : super(span); - /* - * Merges give 2 DartStyleExpression (or derived from DartStyleExpression, - * e.g., FontExpression, etc.) will merge if the two expressions are of the - * same property name (implies same exact type e.g, FontExpression). - */ + // Merges give 2 DartStyleExpression (or derived from DartStyleExpression, + // e.g., FontExpression, etc.) will merge if the two expressions are of the + // same property name (implies same exact type e.g, FontExpression). merged(DartStyleExpression newDartExpr); bool get isUnknown => _styleType == 0 || _styleType == null; @@ -1397,9 +1384,7 @@ class FontExpression extends DartStyleExpression { return null; } - /** - * Merge the two FontExpression and return the result. - */ + /// Merge the two FontExpression and return the result. factory FontExpression.merge(FontExpression x, FontExpression y) { return new FontExpression._merge(x, y, y.span); } @@ -1442,7 +1427,7 @@ abstract class BoxExpression extends DartStyleExpression { class MarginExpression extends BoxExpression { // TODO(terry): Does auto for margin need to be exposed to Dart UI framework? - /** Margin expression ripped apart. */ + /// Margin expression ripped apart. MarginExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.marginStyle, span, new BoxEdge(left, top, right, bottom)); @@ -1460,9 +1445,7 @@ class MarginExpression extends BoxExpression { return null; } - /** - * Merge the two MarginExpressions and return the result. - */ + /// Merge the two MarginExpressions and return the result. factory MarginExpression.merge(MarginExpression x, MarginExpression y) { return new MarginExpression._merge(x, y, y.span); } @@ -1478,7 +1461,7 @@ class MarginExpression extends BoxExpression { } class BorderExpression extends BoxExpression { - /** Border expression ripped apart. */ + /// Border expression ripped apart. BorderExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.borderStyle, span, new BoxEdge(left, top, right, bottom)); @@ -1496,9 +1479,7 @@ class BorderExpression extends BoxExpression { return null; } - /** - * Merge the two BorderExpression and return the result. - */ + /// Merge the two BorderExpression and return the result. factory BorderExpression.merge(BorderExpression x, BorderExpression y) { return new BorderExpression._merge(x, y, y.span); } @@ -1555,7 +1536,7 @@ class WidthExpression extends DartStyleExpression { } class PaddingExpression extends BoxExpression { - /** Padding expression ripped apart. */ + /// Padding expression ripped apart. PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.paddingStyle, span, new BoxEdge(left, top, right, bottom)); @@ -1573,9 +1554,7 @@ class PaddingExpression extends BoxExpression { return null; } - /** - * Merge the two PaddingExpression and return the result. - */ + /// Merge the two PaddingExpression and return the result. factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) { return new PaddingExpression._merge(x, y, y.span); } diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 3ead0bf08..f662a7cc5 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -4,21 +4,19 @@ part of csslib.visitor; -/** - * The base type for all nodes in a CSS abstract syntax tree. - */ +/// The base type for all nodes in a CSS abstract syntax tree. abstract class TreeNode { - /** The source code this [TreeNode] represents. */ + /// The source code this [TreeNode] represents. final SourceSpan span; TreeNode(this.span); TreeNode clone(); - /** Classic double-dispatch visitor for implementing passes. */ + /// Classic double-dispatch visitor for implementing passes. visit(VisitorBase visitor); - /** A multiline string showing the node and its children. */ + /// A multiline string showing the node and its children. String toDebugString() { var to = new TreeOutput(); var tp = new _TreePrinter(to, true); @@ -27,12 +25,12 @@ abstract class TreeNode { } } -/** The base type for expressions. */ +/// The base type for expressions. abstract class Expression extends TreeNode { Expression(SourceSpan span) : super(span); } -/** Simple class to provide a textual dump of trees for debugging. */ +/// Simple class to provide a textual dump of trees for debugging. class TreeOutput { int depth = 0; final StringBuffer buf = new StringBuffer(); diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 4f196c03a..6aad40c65 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -6,14 +6,14 @@ part of csslib.visitor; // TODO(terry): Enable class for debug only; when conditional imports enabled. -/** Helper function to dump the CSS AST. */ +/// Helper function to dump the CSS AST. String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) { var to = new TreeOutput(); new _TreePrinter(to, useSpan)..visitTree(styleSheet); return to.toString(); } -/** Tree dump for debug output of the CSS AST. */ +/// Tree dump for debug output of the CSS AST. class _TreePrinter extends Visitor { final TreeOutput output; final bool useSpan; @@ -226,10 +226,8 @@ class _TreePrinter extends Visitor { output.depth--; } - /** - * Added optional newLine for handling @include at top-level vs/ inside of - * a declaration group. - */ + /// Added optional newLine for handling @include at top-level vs/ inside of + /// a declaration group. void visitIncludeDirective(IncludeDirective node) { heading('IncludeDirective ${node.name}', node); var flattened = node.args.expand((e) => e).toList(); diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index a98c66503..72f14e0ed 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -7,7 +7,7 @@ library csslib.src.validate; import 'package:csslib/visitor.dart'; import 'package:source_span/source_span.dart'; -/** Can be thrown on any Css runtime problem includes source location. */ +/// Can be thrown on any Css runtime problem includes source location. class CssSelectorException extends SourceSpanException { CssSelectorException(String message, [SourceSpan span]) : super(message, span); diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 6e3af1833..e2f1f044c 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -116,9 +116,9 @@ abstract class VisitorBase { visitWidthExpression(WidthExpression node); } -/** Base vistor class for the style sheet AST. */ +/// Base vistor class for the style sheet AST. class Visitor implements VisitorBase { - /** Helper function to walk a list of nodes. */ + /// Helper function to walk a list of nodes. void _visitNodeList(List list) { // Don't use iterable otherwise the list can't grow while using Visitor. // It certainly can't have items deleted before the index being iterated diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index 387137fda..3e1852a13 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -518,7 +518,7 @@ void testWildcard() { expect("foobar", simpleSelector1.name); } -/** Test List as input to parser. */ +/// Test List as input to parser. void testArrayOfChars() { var errors = []; var input = '[]; final String input = r''' @@ -1072,16 +1070,14 @@ div { expect(prettyPrint(stylesheet), input4); } -/** - * Test IE specific declaration syntax: - * IE6 property name prefixed with _ (normal CSS property name can start - * with an underscore). - * - * IE7 or below property add asterisk before the CSS property. - * - * IE8 or below add \9 at end of declaration expression e.g., - * background: red\9; - */ +/// Test IE specific declaration syntax: +/// IE6 property name prefixed with _ (normal CSS property name can start +/// with an underscore). +/// +/// IE7 or below property add asterisk before the CSS property. +/// +/// IE8 or below add \9 at end of declaration expression e.g., +/// background: red\9; void testIEDeclaration() { var errors = []; diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index dbc3e7d12..67af07e23 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -9,9 +9,7 @@ import 'package:test/test.dart'; import 'testing.dart'; -/** - * Test for unsupported font-weights values of bolder, lighter and inherit. - */ +/// Test for unsupported font-weights values of bolder, lighter and inherit. void testUnsupportedFontWeights() { var errors = []; @@ -71,10 +69,8 @@ error on line 1, column 24: Unknown property value inherit }'''); } -/** - * Test for unsupported line-height values of units other than px, pt and - * inherit. - */ +/// Test for unsupported line-height values of units other than px, pt and +/// inherit. void testUnsupportedLineHeights() { var errors = []; @@ -132,7 +128,7 @@ error on line 1, column 24: Unknown property value inherit }'''); } -/** Test for bad selectors. */ +/// Test for bad selectors. void testBadSelectors() { var errors = []; @@ -171,7 +167,7 @@ error on line 1, column 1: Not a valid class selector expected .className }'''); } -/** Test for bad hex values. */ +/// Test for bad hex values. void testBadHexValues() { var errors = []; diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 59071f91e..e5d3ae7b8 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -69,7 +69,7 @@ span { }'''); } -/** Tests top-level mixins that includes another mixin. */ +/// Tests top-level mixins that includes another mixin. void topLevelMixinMultiRulesets() { compileAndValidate(r''' @mixin a { @@ -173,7 +173,7 @@ a:hover { }'''); } -/** Tests selector groups and other combinators. */ +/// Tests selector groups and other combinators. void topLevelMixinSelectors() { compileAndValidate(r''' @mixin a { diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 68075767f..33dbe7c7c 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -/** Common definitions used for setting up the test environment. */ +/// Common definitions used for setting up the test environment. library testing; import 'package:csslib/parser.dart'; @@ -24,11 +24,9 @@ const simpleOptions = const options = const PreprocessorOptions( useColors: false, warningsAsErrors: true, inputFile: 'memory'); -/** - * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, - * CSS will allow any property/value pairs regardless of validity; all of our - * tests (by default) will ensure that the CSS is really valid. - */ +/// Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, +/// CSS will allow any property/value pairs regardless of validity; all of our +/// tests (by default) will ensure that the CSS is really valid. StyleSheet parseCss(String cssInput, {List errors, PreprocessorOptions opts}) => parse(cssInput, @@ -36,11 +34,9 @@ StyleSheet parseCss(String cssInput, options: opts == null ? simpleOptionsWithCheckedAndWarningsAsErrors : opts); -/** - * Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, - * CSS will allow any property/value pairs regardless of validity; all of our - * tests (by default) will ensure that the CSS is really valid. - */ +/// Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, +/// CSS will allow any property/value pairs regardless of validity; all of our +/// tests (by default) will ensure that the CSS is really valid. StyleSheet compileCss(String cssInput, {List errors, PreprocessorOptions opts, @@ -57,30 +53,28 @@ StyleSheet polyFillCompileCss(input, {List errors, PreprocessorOptions opts}) => compileCss(input, errors: errors, polyfill: true, opts: opts); -/** CSS emitter walks the style sheet tree and emits readable CSS. */ +/// CSS emitter walks the style sheet tree and emits readable CSS. final _emitCss = new CssPrinter(); -/** Simple Visitor does nothing but walk tree. */ +/// Simple Visitor does nothing but walk tree. final _cssVisitor = new Visitor(); -/** Pretty printer for CSS. */ +/// Pretty printer for CSS. String prettyPrint(StyleSheet ss) { // Walk the tree testing basic Vistor class. walkTree(ss); return (_emitCss..visitTree(ss, pretty: true)).toString(); } -/** - * Helper function to emit compact (non-pretty printed) CSS for suite test - * comparsions. Spaces, new lines, etc. are reduced for easier comparsions of - * expected suite test results. - */ +/// Helper function to emit compact (non-pretty printed) CSS for suite test +/// comparsions. Spaces, new lines, etc. are reduced for easier comparsions of +/// expected suite test results. String compactOuptut(StyleSheet ss) { walkTree(ss); return (_emitCss..visitTree(ss, pretty: false)).toString(); } -/** Walks the style sheet tree does nothing; insures the basic walker works. */ +/// Walks the style sheet tree does nothing; insures the basic walker works. void walkTree(StyleSheet ss) { _cssVisitor..visitTree(ss); } From aacead0139481d6eae744a112c86c37e197b8ee2 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 28 Jan 2019 11:41:26 -0800 Subject: [PATCH 133/245] Feedback --- pkgs/csslib/lib/parser.dart | 16 ++++++++-------- pkgs/csslib/lib/src/tree.dart | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index be375a723..3347c90ed 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1215,7 +1215,7 @@ class _Parser { Declaration decl = processDeclaration(dartStyles); if (decl != null) { if (decl.hasDartStyle) { - var newDartStyle = decl.dartStyle as DartStyleExpression; + var newDartStyle = decl.dartStyle; // Replace or add latest Dart style. bool replaced = false; @@ -1241,8 +1241,7 @@ class _Parser { // declarations. for (var decl in decls) { if (decl is Declaration) { - if (decl.hasDartStyle && - dartStyles.indexOf(decl.dartStyle as DartStyleExpression) < 0) { + if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) { // Dart style not live, ignore these styles in this Declarations. decl.dartStyle = null; } @@ -1300,7 +1299,7 @@ class _Parser { Declaration decl = processDeclaration(dartStyles); if (decl != null) { if (decl.hasDartStyle) { - var newDartStyle = decl.dartStyle as DartStyleExpression; + var newDartStyle = decl.dartStyle; // Replace or add latest Dart style. bool replaced = false; @@ -1326,8 +1325,7 @@ class _Parser { // Fixup declaration to only have dartStyle that are live for this set of // declarations. for (var decl in decls) { - if (decl.hasDartStyle && - dartStyles.indexOf(decl.dartStyle as DartStyleExpression) < 0) { + if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) { // Dart style not live, ignore these styles in this Declarations. decl.dartStyle = null; } @@ -2217,8 +2215,10 @@ class _Parser { } // TODO(terry): Need to handle auto. - num marginValue(var exprTerm) { - if (exprTerm is UnitTerm || exprTerm is NumberTerm) { + num marginValue(Expression exprTerm) { + if (exprTerm is UnitTerm) { + return exprTerm.value as num; + } else if (exprTerm is NumberTerm) { return exprTerm.value as num; } return null; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index fd8a1375d..634fdcf66 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -908,7 +908,7 @@ class Declaration extends TreeNode { final Identifier _property; final Expression _expression; /** Style exposed to Dart. */ - dynamic dartStyle; + DartStyleExpression dartStyle; final bool important; /** From e6fabb99541d416c8ec8f579d9c338a99c4a1709 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 28 Jan 2019 12:55:43 -0800 Subject: [PATCH 134/245] Fmt --- pkgs/csslib/lib/src/analyzer.dart | 3 +++ pkgs/csslib/lib/src/tree.dart | 1 + 2 files changed, 4 insertions(+) diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 1b195516e..e6bb0eba6 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -416,6 +416,7 @@ class _MediaRulesReplacer extends Visitor { class TopLevelIncludes extends Visitor { StyleSheet _styleSheet; final Messages _messages; + /// Map of variable name key to it's definition. final Map map = new Map(); MixinDefinition currDef; @@ -674,8 +675,10 @@ class CallMixin extends Visitor { class DeclarationIncludes extends Visitor { StyleSheet _styleSheet; final Messages _messages; + /// Map of variable name key to it's definition. final Map map = new Map(); + /// Cache of mixin called with parameters. final Map callMap = new Map(); MixinDefinition currDef; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 87698662b..11d15a92d 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -900,6 +900,7 @@ class ContentDirective extends Directive { class Declaration extends TreeNode { final Identifier _property; final Expression _expression; + /// Style exposed to Dart. dynamic dartStyle; final bool important; From 03ce74d1197e5a5dd4bd43b1b2bfd07c1b2ee8e6 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 28 Jan 2019 13:50:03 -0800 Subject: [PATCH 135/245] oops --- pkgs/csslib/lib/src/tree.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 41ea62bd3..f68c8798f 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -900,7 +900,6 @@ class ContentDirective extends Directive { class Declaration extends TreeNode { final Identifier _property; final Expression _expression; -<<<<<<< HEAD /// Style exposed to Dart. DartStyleExpression dartStyle; From 04c3b91d1e3dcee27784a02c09b70a5cd14c1185 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 8 Apr 2019 10:58:22 -0700 Subject: [PATCH 136/245] Enable lints, fix formatting, test on oldest supported SDK (dart-lang/csslib#89) --- pkgs/csslib/.gitignore | 13 +- pkgs/csslib/.travis.yml | 6 +- pkgs/csslib/analysis_options.yaml | 9 + pkgs/csslib/bin/css.dart | 1 + pkgs/csslib/example/call_parser.dart | 4 +- pkgs/csslib/lib/css.dart | 28 +- pkgs/csslib/lib/parser.dart | 375 ++++++++++--------- pkgs/csslib/lib/src/analyzer.dart | 65 ++-- pkgs/csslib/lib/src/css_printer.dart | 10 +- pkgs/csslib/lib/src/messages.dart | 22 +- pkgs/csslib/lib/src/options.dart | 16 +- pkgs/csslib/lib/src/polyfill.dart | 15 +- pkgs/csslib/lib/src/property.dart | 77 ++-- pkgs/csslib/lib/src/tokenizer.dart | 8 +- pkgs/csslib/lib/src/tokenizer_base.dart | 21 +- pkgs/csslib/lib/src/tokenkind.dart | 464 +++++++++++------------- pkgs/csslib/lib/src/tree.dart | 232 ++++++------ pkgs/csslib/lib/src/tree_base.dart | 6 +- pkgs/csslib/lib/src/tree_printer.dart | 4 +- pkgs/csslib/lib/src/validate.dart | 13 +- pkgs/csslib/lib/visitor.dart | 18 +- pkgs/csslib/pubspec.yaml | 3 +- pkgs/csslib/test/extend_test.dart | 28 +- pkgs/csslib/test/samples_test.dart | 4 +- pkgs/csslib/test/testing.dart | 14 +- pkgs/csslib/test/visitor_test.dart | 9 +- 26 files changed, 714 insertions(+), 751 deletions(-) create mode 100644 pkgs/csslib/analysis_options.yaml diff --git a/pkgs/csslib/.gitignore b/pkgs/csslib/.gitignore index a6867f25e..79f51c3d5 100644 --- a/pkgs/csslib/.gitignore +++ b/pkgs/csslib/.gitignore @@ -1,14 +1,3 @@ -# Don’t commit the following directories created by pub. -.pub/ -build/ -packages +.dart_tool .packages - -# Or the files created by dart2js. -*.dart.js -*.js_ -*.js.deps -*.js.map - -# Include when developing application packages. pubspec.lock diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml index afad71aeb..8681e297d 100644 --- a/pkgs/csslib/.travis.yml +++ b/pkgs/csslib/.travis.yml @@ -1,15 +1,19 @@ language: dart dart: + - 2.0.0 - dev dart_task: - test: --platform vm - test: --platform firefox -j 1 - - dartanalyzer matrix: include: + - dart: dev + dartanalyzer: --fatal-infos --fatal-warnings . + - dart: stable + dartanalyzer: --fatal-warnings . - dart: dev dart_task: dartfmt diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml new file mode 100644 index 000000000..9d142917a --- /dev/null +++ b/pkgs/csslib/analysis_options.yaml @@ -0,0 +1,9 @@ +include: package:pedantic/analysis_options.yaml + +linter: + rules: + - prefer_equal_for_default_values + - prefer_generic_function_type_aliases + - slash_for_doc_comments + - unnecessary_const + - unnecessary_new diff --git a/pkgs/csslib/bin/css.dart b/pkgs/csslib/bin/css.dart index f64faac45..1aae7a835 100644 --- a/pkgs/csslib/bin/css.dart +++ b/pkgs/csslib/bin/css.dart @@ -3,6 +3,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore: deprecated_member_use_from_same_package import 'package:csslib/css.dart' as css; void main(List args) => css.main(args); diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index fc6b33cf8..fc299d93a 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -4,7 +4,7 @@ import 'package:csslib/parser.dart' as css; import 'package:csslib/visitor.dart'; -const _default = const css.PreprocessorOptions( +const _default = css.PreprocessorOptions( useColors: false, checked: true, warningsAsErrors: true, @@ -20,7 +20,7 @@ StyleSheet parseCss(String cssInput, } // Pretty printer for CSS. -var emitCss = new CssPrinter(); +var emitCss = CssPrinter(); String prettyPrint(StyleSheet ss) => (emitCss..visitTree(ss, pretty: true)).toString(); diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart index f47b4f1f1..ac6510b7b 100644 --- a/pkgs/csslib/lib/css.dart +++ b/pkgs/csslib/lib/css.dart @@ -20,7 +20,7 @@ void main(List arguments) { var options = _parseOptions(arguments); if (options == null) return; - messages = new Messages(options: options); + messages = Messages(options: options); _time('Total time spent on ${options.inputFile}', () { _compile(options.inputFile, options.verbose); @@ -36,24 +36,24 @@ void _compile(String inputPath, bool verbose) { try { // Read the file. var filename = path.basename(inputPath); - var contents = new File(inputPath).readAsStringSync(); - var file = new SourceFile.fromString(contents, url: path.toUri(inputPath)); + var contents = File(inputPath).readAsStringSync(); + var file = SourceFile.fromString(contents, url: path.toUri(inputPath)); // Parse the CSS. - StyleSheet tree = _time( - 'Parse $filename', () => new Parser(file, contents).parse(), verbose); + StyleSheet tree = + _time('Parse $filename', () => Parser(file, contents).parse(), verbose); - _time('Analyzer $filename', () => new Analyzer([tree], messages), verbose) + _time('Analyzer $filename', () => Analyzer([tree], messages), verbose) .run(); // Emit the processed CSS. - var emitter = new CssPrinter(); + var emitter = CssPrinter(); _time('Codegen $filename', () => emitter.visitTree(tree, pretty: true), verbose); // Write the contents to a file. var outPath = path.join(path.dirname(inputPath), '_$filename'); - new File(outPath).writeAsStringSync(emitter.toString()); + File(outPath).writeAsStringSync(emitter.toString()); } catch (e) { messages.error('error processing $inputPath. Original message:\n $e', null); } @@ -61,7 +61,7 @@ void _compile(String inputPath, bool verbose) { T _time(String message, T Function() callback, bool printTime) { if (!printTime) return callback(); - final watch = new Stopwatch(); + final watch = Stopwatch(); watch.start(); var result = callback(); watch.stop(); @@ -71,7 +71,7 @@ T _time(String message, T Function() callback, bool printTime) { } void _printMessage(String message, int duration) { - var buf = new StringBuffer(); + var buf = StringBuffer(); buf.write(message); for (int i = message.length; i < 60; i++) buf.write(' '); buf.write(' -- '); @@ -81,7 +81,7 @@ void _printMessage(String message, int duration) { print(buf.toString()); } -PreprocessorOptions _fromArgs(ArgResults args) => new PreprocessorOptions( +PreprocessorOptions _fromArgs(ArgResults args) => PreprocessorOptions( warningsAsErrors: args['warnings_as_errors'], throwOnWarnings: args['throw_on_warnings'], throwOnErrors: args['throw_on_errors'], @@ -90,11 +90,11 @@ PreprocessorOptions _fromArgs(ArgResults args) => new PreprocessorOptions( lessSupport: args['less'], useColors: args['colors'], polyfill: args['polyfill'], - inputFile: args.rest.length > 0 ? args.rest[0] : null); + inputFile: args.rest.isNotEmpty ? args.rest[0] : null); // tool.dart [options...] PreprocessorOptions _parseOptions(List arguments) { - var parser = new ArgParser() + var parser = ArgParser() ..addFlag('verbose', abbr: 'v', defaultsTo: false, @@ -128,7 +128,7 @@ PreprocessorOptions _parseOptions(List arguments) { try { var results = parser.parse(arguments); - if (results['help'] || results.rest.length == 0) { + if (results['help'] || results.rest.isEmpty) { _showUsage(parser); return null; } diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 511f20482..768068304 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -43,10 +43,10 @@ void _createMessages({List errors, PreprocessorOptions options}) { if (errors == null) errors = []; if (options == null) { - options = new PreprocessorOptions(useColors: false, inputFile: 'memory'); + options = PreprocessorOptions(useColors: false, inputFile: 'memory'); } - messages = new Messages(options: options, printHandler: errors.add); + messages = Messages(options: options, printHandler: errors.add); } /// CSS checked mode enabled. @@ -57,9 +57,9 @@ bool get isChecked => messages.options.checked; StyleSheet compile(input, {List errors, PreprocessorOptions options, - bool nested: true, - bool polyfill: false, - List includes: null}) { + bool nested = true, + bool polyfill = false, + List includes}) { if (includes == null) { includes = []; } @@ -68,14 +68,14 @@ StyleSheet compile(input, _createMessages(errors: errors, options: options); - var file = new SourceFile.fromString(source); + var file = SourceFile.fromString(source); - var tree = new _Parser(file, source).parse(); + var tree = _Parser(file, source).parse(); analyze([tree], errors: errors, options: options); if (polyfill) { - var processCss = new PolyFill(messages); + var processCss = PolyFill(messages); processCss.process(tree, includes: includes); } @@ -86,7 +86,7 @@ StyleSheet compile(input, void analyze(List styleSheets, {List errors, PreprocessorOptions options}) { _createMessages(errors: errors, options: options); - new Analyzer(styleSheets, messages).run(); + Analyzer(styleSheets, messages).run(); } /// Parse the [input] CSS stylesheet into a tree. The [input] can be a [String], @@ -97,8 +97,8 @@ StyleSheet parse(input, {List errors, PreprocessorOptions options}) { _createMessages(errors: errors, options: options); - var file = new SourceFile.fromString(source); - return new _Parser(file, source).parse(); + var file = SourceFile.fromString(source); + return _Parser(file, source).parse(); } /// Parse the [input] CSS selector into a tree. The [input] can be a [String], @@ -110,9 +110,8 @@ StyleSheet selector(input, {List errors}) { _createMessages(errors: errors); - var file = new SourceFile.fromString(source); - return (new _Parser(file, source)..tokenizer.inSelector = true) - .parseSelector(); + var file = SourceFile.fromString(source); + return (_Parser(file, source)..tokenizer.inSelector = true).parseSelector(); } SelectorGroup parseSelectorGroup(input, {List errors}) { @@ -120,8 +119,8 @@ SelectorGroup parseSelectorGroup(input, {List errors}) { _createMessages(errors: errors); - var file = new SourceFile.fromString(source); - return (new _Parser(file, source) + var file = SourceFile.fromString(source); + return (_Parser(file, source) // TODO(jmesserly): this fix should be applied to the parser. It's // tricky because by the time the flag is set one token has already // been fetched. @@ -149,10 +148,10 @@ String _inputAsString(input) { // See encoding helpers at: package:html5lib/lib/src/char_encodings.dart // These helpers can decode in different formats given an encoding name // (mostly unicode, ascii, windows-1252 which is html5 default encoding). - source = new String.fromCharCodes(input as List); + source = String.fromCharCodes(input as List); } else { // TODO(terry): Support RandomAccessFile using console. - throw new ArgumentError("'source' must be a String or " + throw ArgumentError("'source' must be a String or " "List (of bytes). RandomAccessFile not supported from this " "simple interface"); } @@ -168,14 +167,14 @@ class Parser { // TODO(jmesserly): having file and text is redundant. // TODO(rnystrom): baseUrl isn't used. Remove from API. - Parser(SourceFile file, String text, {int start: 0, String baseUrl}) - : _parser = new _Parser(file, text, start: start); + Parser(SourceFile file, String text, {int start = 0, String baseUrl}) + : _parser = _Parser(file, text, start: start); StyleSheet parse() => _parser.parse(); } // CSS2.1 pseudo-elements which were defined with a single ':'. -final _legacyPseudoElements = new Set.from(const [ +final _legacyPseudoElements = Set.from(const [ 'after', 'before', 'first-letter', @@ -193,9 +192,9 @@ class _Parser { Token _previousToken; Token _peekToken; - _Parser(SourceFile file, String text, {int start: 0}) + _Parser(SourceFile file, String text, {int start = 0}) : this.file = file, - tokenizer = new Tokenizer(file, text, true, start) { + tokenizer = Tokenizer(file, text, true, start) { _peekToken = tokenizer.next(); } @@ -216,7 +215,7 @@ class _Parser { checkEndOfFile(); - return new StyleSheet(productions, _makeSpan(start)); + return StyleSheet(productions, _makeSpan(start)); } /// Main entry point for parsing a simple selector sequence. @@ -233,7 +232,7 @@ class _Parser { checkEndOfFile(); - return new StyleSheet.selector(productions, _makeSpan(start)); + return StyleSheet.selector(productions, _makeSpan(start)); } /// Generate an error if [file] has not been completely consumed. @@ -264,7 +263,7 @@ class _Parser { return _peekToken.kind; } - Token _next({bool unicodeRange: false}) { + Token _next({bool unicodeRange = false}) { _previousToken = _peekToken; _peekToken = tokenizer.next(unicodeRange: unicodeRange); return _previousToken; @@ -280,8 +279,7 @@ class _Parser { } /// Marks the parser/tokenizer look ahead to support Less nested selectors. - ParserState get _mark => - new ParserState(_peekToken, _previousToken, tokenizer); + ParserState get _mark => ParserState(_peekToken, _previousToken, tokenizer); /// Restores the parser/tokenizer state to state remembered by _mark. void _restore(ParserState markedData) { @@ -290,7 +288,7 @@ class _Parser { _previousToken = markedData.previousToken; } - bool _maybeEat(int kind, {bool unicodeRange: false}) { + bool _maybeEat(int kind, {bool unicodeRange = false}) { if (_peekToken.kind == kind) { _previousToken = _peekToken; _peekToken = tokenizer.next(unicodeRange: unicodeRange); @@ -300,7 +298,7 @@ class _Parser { } } - void _eat(int kind, {bool unicodeRange: false}) { + void _eat(int kind, {bool unicodeRange = false}) { if (!_maybeEat(kind, unicodeRange: unicodeRange)) { _errorExpected(TokenKind.kindToString(kind)); } @@ -421,8 +419,8 @@ class _Parser { exprs.add(expr); } - if (unaryOp != -1 || type != null || exprs.length > 0) { - return new MediaQuery(unaryOp, type, exprs, _makeSpan(start)); + if (unaryOp != -1 || type != null || exprs.isNotEmpty) { + return MediaQuery(unaryOp, type, exprs, _makeSpan(start)); } return null; } @@ -436,10 +434,9 @@ class _Parser { var feature = identifier(); // Media feature. var exprs = _maybeEat(TokenKind.COLON) ? processExpr() - : new Expressions(_makeSpan(_peekToken.span)); + : Expressions(_makeSpan(_peekToken.span)); if (_maybeEat(TokenKind.RPAREN)) { - return new MediaExpression( - andOperator, feature, exprs, _makeSpan(start)); + return MediaExpression(andOperator, feature, exprs, _makeSpan(start)); } else if (isChecked) { _warning( "Missing parenthesis around media expression", _makeSpan(start)); @@ -500,7 +497,7 @@ class _Parser { _error('missing import string', _peekToken.span); } - return new ImportDirective(importStr.trim(), medias, _makeSpan(start)); + return ImportDirective(importStr.trim(), medias, _makeSpan(start)); case TokenKind.DIRECTIVE_MEDIA: _next(); @@ -522,7 +519,7 @@ class _Parser { } else { _error('expected { after media before ruleset', _peekToken.span); } - return new MediaDirective(media, rules, _makeSpan(start)); + return MediaDirective(media, rules, _makeSpan(start)); case TokenKind.DIRECTIVE_HOST: _next(); @@ -541,7 +538,7 @@ class _Parser { } else { _error('expected { after host before ruleset', _peekToken.span); } - return new HostDirective(rules, _makeSpan(start)); + return HostDirective(rules, _makeSpan(start)); case TokenKind.DIRECTIVE_PAGE: // @page S* IDENT? pseudo_page? @@ -585,7 +582,7 @@ class _Parser { String pseudoName = pseudoPage is Identifier ? pseudoPage.name : ''; String ident = name is Identifier ? name.name : ''; - return new PageDirective( + return PageDirective( ident, pseudoName, processMarginsDeclarations(), _makeSpan(start)); case TokenKind.DIRECTIVE_CHARSET: @@ -598,7 +595,7 @@ class _Parser { _warning('missing character encoding string', _makeSpan(start)); } - return new CharsetDirective(charEncoding, _makeSpan(start)); + return CharsetDirective(charEncoding, _makeSpan(start)); // TODO(terry): Workaround Dart2js bug continue not implemented in switch // see https://code.google.com/p/dart/issues/detail?id=8270 @@ -647,10 +644,10 @@ class _Parser { _eat(TokenKind.LBRACE); - var keyframe = new KeyFrameDirective(tokId, name, _makeSpan(start)); + var keyframe = KeyFrameDirective(tokId, name, _makeSpan(start)); do { - Expressions selectors = new Expressions(_makeSpan(start)); + Expressions selectors = Expressions(_makeSpan(start)); do { var term = processTerm(); @@ -660,7 +657,7 @@ class _Parser { selectors.add(term); } while (_maybeEat(TokenKind.COMMA)); - keyframe.add(new KeyFrameBlock( + keyframe.add(KeyFrameBlock( selectors, processDeclarations(), _makeSpan(start))); } while (!_maybeEat(TokenKind.RBRACE) && !isPrematureEndOfFile()); @@ -668,7 +665,7 @@ class _Parser { case TokenKind.DIRECTIVE_FONTFACE: _next(); - return new FontFaceDirective(processDeclarations(), _makeSpan(start)); + return FontFaceDirective(processDeclarations(), _makeSpan(start)); case TokenKind.DIRECTIVE_STYLET: // Stylet grammar: @@ -698,7 +695,7 @@ class _Parser { _eat(TokenKind.RBRACE); - return new StyletDirective(name, productions, _makeSpan(start)); + return StyletDirective(name, productions, _makeSpan(start)); case TokenKind.DIRECTIVE_NAMESPACE: // Namespace grammar: @@ -733,7 +730,7 @@ class _Parser { } } - return new NamespaceDirective( + return NamespaceDirective( prefix != null ? prefix.name : '', namespaceUri, _makeSpan(start)); case TokenKind.DIRECTIVE_MIXIN: @@ -812,7 +809,7 @@ class _Parser { // If declGroup has items that are declarations then we assume // this mixin is a declaration mixin not a top-level mixin. if (include is IncludeDirective) { - newDecls.add(new IncludeMixinAtDeclaration(include, include.span)); + newDecls.add(IncludeMixinAtDeclaration(include, include.span)); } else { _warning("Error mixing of top-level vs declarations mixins", _makeSpan(include.span)); @@ -834,7 +831,7 @@ class _Parser { if (declGroup.declarations.isNotEmpty) { if (productions.isEmpty) { - mixinDirective = new MixinDeclarationDirective( + mixinDirective = MixinDeclarationDirective( name.name, params, false, declGroup, _makeSpan(start)); break; } else { @@ -844,14 +841,14 @@ class _Parser { } } } else { - mixinDirective = new MixinRulesetDirective( + mixinDirective = MixinRulesetDirective( name.name, params, false, productions, _makeSpan(start)); break; } } if (productions.isNotEmpty) { - mixinDirective = new MixinRulesetDirective( + mixinDirective = MixinRulesetDirective( name.name, params, false, productions, _makeSpan(start)); } @@ -863,7 +860,7 @@ class _Parser { /// Returns a VarDefinitionDirective or VarDefinition if a varaible otherwise /// return the token id of a directive or -1 if neither. dynamic // VarDefinitionDirective | VarDefinition | int - processVariableOrDirective({bool mixinParameter: false}) { + processVariableOrDirective({bool mixinParameter = false}) { var start = _peekToken.span; var tokId = _peek(); @@ -902,8 +899,7 @@ class _Parser { } var span = _makeSpan(start); - return new VarDefinitionDirective( - new VarDefinition(name, exprs, span), span); + return VarDefinitionDirective(VarDefinition(name, exprs, span), span); } else if (isChecked) { _error('unexpected directive @$_peekToken', _peekToken.span); } @@ -918,13 +914,13 @@ class _Parser { exprs = processExpr(); } - return new VarDefinition(definedName, exprs, _makeSpan(start)); + return VarDefinition(definedName, exprs, _makeSpan(start)); } return tokId; } - IncludeDirective processInclude(SourceSpan span, {bool eatSemiColon: true}) { + IncludeDirective processInclude(SourceSpan span, {bool eatSemiColon = true}) { // Stylet grammar: // // @include IDENT [(args,...)]; @@ -965,7 +961,7 @@ class _Parser { _eat(TokenKind.SEMICOLON); } - return new IncludeDirective(name.name, params, span); + return IncludeDirective(name.name, params, span); } DocumentDirective processDocumentDirective() { @@ -995,9 +991,9 @@ class _Parser { _eat(TokenKind.RPAREN); - var arguments = new Expressions(_makeSpan(argumentSpan)) - ..add(new LiteralTerm(argument, argument, argumentSpan)); - function = new FunctionTerm( + var arguments = Expressions(_makeSpan(argumentSpan)) + ..add(LiteralTerm(argument, argument, argumentSpan)); + function = FunctionTerm( ident.name, ident.name, arguments, _makeSpan(ident.span)); } else { function = processFunction(ident); @@ -1009,7 +1005,7 @@ class _Parser { _eat(TokenKind.LBRACE); var groupRuleBody = processGroupRuleBody(); _eat(TokenKind.RBRACE); - return new DocumentDirective(functions, groupRuleBody, _makeSpan(start)); + return DocumentDirective(functions, groupRuleBody, _makeSpan(start)); } SupportsDirective processSupportsDirective() { @@ -1019,7 +1015,7 @@ class _Parser { _eat(TokenKind.LBRACE); var groupRuleBody = processGroupRuleBody(); _eat(TokenKind.RBRACE); - return new SupportsDirective(condition, groupRuleBody, _makeSpan(start)); + return SupportsDirective(condition, groupRuleBody, _makeSpan(start)); } SupportsCondition processSupportsCondition() { @@ -1057,9 +1053,9 @@ class _Parser { } if (clauseType == ClauseType.conjunction) { - return new SupportsConjunction(conditions, _makeSpan(start)); + return SupportsConjunction(conditions, _makeSpan(start)); } else if (clauseType == ClauseType.disjunction) { - return new SupportsDisjunction(conditions, _makeSpan(start)); + return SupportsDisjunction(conditions, _makeSpan(start)); } else { return conditions.first; } @@ -1071,7 +1067,7 @@ class _Parser { if (text != 'not') return null; _next(); // 'not' var condition = processSupportsConditionInParens(); - return new SupportsNegation(condition, _makeSpan(start)); + return SupportsNegation(condition, _makeSpan(start)); } SupportsConditionInParens processSupportsConditionInParens() { @@ -1081,19 +1077,19 @@ class _Parser { var condition = processSupportsCondition(); if (condition != null) { _eat(TokenKind.RPAREN); - return new SupportsConditionInParens.nested(condition, _makeSpan(start)); + return SupportsConditionInParens.nested(condition, _makeSpan(start)); } // Otherwise, parse a declaration. var declaration = processDeclaration([]); _eat(TokenKind.RPAREN); - return new SupportsConditionInParens(declaration, _makeSpan(start)); + return SupportsConditionInParens(declaration, _makeSpan(start)); } ViewportDirective processViewportDirective() { var start = _peekToken.span; var name = _next().text; var declarations = processDeclarations(); - return new ViewportDirective(name, declarations, _makeSpan(start)); + return ViewportDirective(name, declarations, _makeSpan(start)); } TreeNode processRule([SelectorGroup selectorGroup]) { @@ -1106,8 +1102,7 @@ class _Parser { selectorGroup = processSelectorGroup(); } if (selectorGroup != null) { - return new RuleSet( - selectorGroup, processDeclarations(), selectorGroup.span); + return RuleSet(selectorGroup, processDeclarations(), selectorGroup.span); } return null; } @@ -1173,7 +1168,7 @@ class _Parser { } } - DeclarationGroup processDeclarations({bool checkBrace: true}) { + DeclarationGroup processDeclarations({bool checkBrace = true}) { var start = _peekToken.span; if (checkBrace) _eat(TokenKind.LBRACE); @@ -1220,14 +1215,14 @@ class _Parser { // declarations. for (var decl in decls) { if (decl is Declaration) { - if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) { + if (decl.hasDartStyle && !dartStyles.contains(decl.dartStyle)) { // Dart style not live, ignore these styles in this Declarations. decl.dartStyle = null; } } } - return new DeclarationGroup(decls, _makeSpan(start)); + return DeclarationGroup(decls, _makeSpan(start)); } List processMarginsDeclarations() { @@ -1270,7 +1265,7 @@ class _Parser { var declGroup = processDeclarations(); if (declGroup != null) { - groups.add(new MarginGroup( + groups.add(MarginGroup( marginSym, declGroup.declarations, _makeSpan(start))); } break; @@ -1304,14 +1299,14 @@ class _Parser { // Fixup declaration to only have dartStyle that are live for this set of // declarations. for (var decl in decls) { - if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) { + if (decl.hasDartStyle && !dartStyles.contains(decl.dartStyle)) { // Dart style not live, ignore these styles in this Declarations. decl.dartStyle = null; } } - if (decls.length > 0) { - groups.add(new DeclarationGroup(decls, _makeSpan(start))); + if (decls.isNotEmpty) { + groups.add(DeclarationGroup(decls, _makeSpan(start))); } return groups; @@ -1328,8 +1323,8 @@ class _Parser { } } while (_maybeEat(TokenKind.COMMA)); - if (selectors.length > 0) { - return new SelectorGroup(selectors, _makeSpan(start)); + if (selectors.isNotEmpty) { + return SelectorGroup(selectors, _makeSpan(start)); } return null; } @@ -1350,7 +1345,7 @@ class _Parser { if (simpleSequences.isEmpty) return null; - return new Selector(simpleSequences, _makeSpan(start)); + return Selector(simpleSequences, _makeSpan(start)); } /// Same as [processSelector] but reports an error for each combinator. @@ -1421,7 +1416,7 @@ class _Parser { var span = _makeSpan(start); var simpleSel = thisOperator - ? new ElementSelector(new ThisOperator(span), span) + ? ElementSelector(ThisOperator(span), span) : simpleSelector(); if (simpleSel == null && (combinatorType == TokenKind.COMBINATOR_PLUS || @@ -1433,10 +1428,10 @@ class _Parser { // .foo&:hover combinator before & is NONE // .foo & combinator before & is DESCDENDANT // .foo > & combinator before & is GREATER - simpleSel = new ElementSelector(new Identifier("", span), span); + simpleSel = ElementSelector(Identifier("", span), span); } if (simpleSel != null) { - return new SimpleSelectorSequence(simpleSel, span, combinatorType); + return SimpleSelectorSequence(simpleSel, span, combinatorType); } return null; } @@ -1469,7 +1464,7 @@ class _Parser { case TokenKind.ASTERISK: // Mark as universal namespace. var tok = _next(); - first = new Wildcard(_makeSpan(tok.span)); + first = Wildcard(_makeSpan(tok.span)); break; case TokenKind.IDENTIFIER: first = identifier(); @@ -1492,7 +1487,7 @@ class _Parser { case TokenKind.ASTERISK: // Mark as universal element var tok = _next(); - element = new Wildcard(_makeSpan(tok.span)); + element = Wildcard(_makeSpan(tok.span)); break; case TokenKind.IDENTIFIER: element = identifier(); @@ -1503,10 +1498,10 @@ class _Parser { break; } - return new NamespaceSelector( - first, new ElementSelector(element, element.span), _makeSpan(start)); + return NamespaceSelector( + first, ElementSelector(element, element.span), _makeSpan(start)); } else if (first != null) { - return new ElementSelector(first, _makeSpan(start)); + return ElementSelector(first, _makeSpan(start)); } else { // Check for HASH | class | attrib | pseudo | negation return simpleSelectorTail(); @@ -1544,7 +1539,7 @@ class _Parser { // Generate bad selector id (normalized). id.name = " ${id.name}"; } - return new IdSelector(id, _makeSpan(start)); + return IdSelector(id, _makeSpan(start)); } return null; case TokenKind.DOT: @@ -1561,7 +1556,7 @@ class _Parser { // Generate bad selector class (normalized). id.name = " ${id.name}"; } - return new ClassSelector(id, _makeSpan(start)); + return ClassSelector(id, _makeSpan(start)); case TokenKind.COLON: // :pseudo-class ::pseudo-element return processPseudoSelector(start); @@ -1602,7 +1597,7 @@ class _Parser { var negArg = simpleSelector(); _eat(TokenKind.RPAREN); - return new NegationSelector(negArg, _makeSpan(start)); + return NegationSelector(negArg, _makeSpan(start)); } else if (!pseudoElement && (name == 'host' || name == 'host-context')) { _eat(TokenKind.LPAREN); var selector = processCompoundSelector(); @@ -1612,7 +1607,7 @@ class _Parser { } _eat(TokenKind.RPAREN); var span = _makeSpan(start); - return new PseudoClassFunctionSelector(pseudoName, selector, span); + return PseudoClassFunctionSelector(pseudoName, selector, span); } else { // Special parsing for expressions in pseudo functions. Minus is used // as operator not identifier. @@ -1633,8 +1628,8 @@ class _Parser { if (expr is SelectorExpression) { _eat(TokenKind.RPAREN); return (pseudoElement) - ? new PseudoElementFunctionSelector(pseudoName, expr, span) - : new PseudoClassFunctionSelector(pseudoName, expr, span); + ? PseudoElementFunctionSelector(pseudoName, expr, span) + : PseudoClassFunctionSelector(pseudoName, expr, span); } else { _errorExpected("CSS expression"); return null; @@ -1645,9 +1640,9 @@ class _Parser { // Treat CSS2.1 pseudo-elements defined with pseudo class syntax as pseudo- // elements for backwards compatibility. return pseudoElement || _legacyPseudoElements.contains(name) - ? new PseudoElementSelector(pseudoName, _makeSpan(start), + ? PseudoElementSelector(pseudoName, _makeSpan(start), isLegacy: !pseudoElement) - : new PseudoClassSelector(pseudoName, _makeSpan(start)); + : PseudoClassSelector(pseudoName, _makeSpan(start)); } /// In CSS3, the expressions are identifiers, strings, or of the form "an+b". @@ -1672,12 +1667,12 @@ class _Parser { case TokenKind.PLUS: start = _peekToken.span; termToken = _next(); - expressions.add(new OperatorPlus(_makeSpan(start))); + expressions.add(OperatorPlus(_makeSpan(start))); break; case TokenKind.MINUS: start = _peekToken.span; termToken = _next(); - expressions.add(new OperatorMinus(_makeSpan(start))); + expressions.add(OperatorMinus(_makeSpan(start))); break; case TokenKind.INTEGER: termToken = _next(); @@ -1690,11 +1685,11 @@ class _Parser { case TokenKind.SINGLE_QUOTE: value = processQuotedString(false); value = "'${_escapeString(value, single: true)}'"; - return new LiteralTerm(value, value, _makeSpan(start)); + return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.DOUBLE_QUOTE: value = processQuotedString(false); value = '"${_escapeString(value)}"'; - return new LiteralTerm(value, value, _makeSpan(start)); + return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.IDENTIFIER: value = identifier(); // Snarf up the ident we'll remap, maybe. break; @@ -1709,7 +1704,7 @@ class _Parser { unitTerm = processDimension(termToken, value, _makeSpan(start)); } if (unitTerm == null) { - unitTerm = new LiteralTerm(value, value.name, _makeSpan(start)); + unitTerm = LiteralTerm(value, value.name, _makeSpan(start)); } expressions.add(unitTerm); @@ -1717,7 +1712,7 @@ class _Parser { } } - return new SelectorExpression(expressions, _makeSpan(start)); + return SelectorExpression(expressions, _makeSpan(start)); } // Attribute grammar: @@ -1774,7 +1769,7 @@ class _Parser { _eat(TokenKind.RBRACK); - return new AttributeSelector(attrName, op, value, _makeSpan(start)); + return AttributeSelector(attrName, op, value, _makeSpan(start)); } return null; } @@ -1817,8 +1812,7 @@ class _Parser { // Handle !important (prio) var importantPriority = _maybeEat(TokenKind.IMPORTANT); - decl = new Declaration( - propertyIdent, exprs, dartComposite, _makeSpan(start), + decl = Declaration(propertyIdent, exprs, dartComposite, _makeSpan(start), important: importantPriority, ie7: ie7); } else if (_peekToken.kind == TokenKind.VAR_DEFINITION) { _next(); @@ -1829,12 +1823,12 @@ class _Parser { Expressions exprs = processExpr(); - decl = new VarDefinition(definedName, exprs, _makeSpan(start)); + decl = VarDefinition(definedName, exprs, _makeSpan(start)); } else if (_peekToken.kind == TokenKind.DIRECTIVE_INCLUDE) { // @include mixinName in the declaration area. var span = _makeSpan(start); var include = processInclude(span, eatSemiColon: false); - decl = new IncludeMixinAtDeclaration(include, span); + decl = IncludeMixinAtDeclaration(include, span); } else if (_peekToken.kind == TokenKind.DIRECTIVE_EXTEND) { var simpleSequences = []; @@ -1855,7 +1849,7 @@ class _Parser { _warning("not a valid selector", span); } } - decl = new ExtendDeclaration(simpleSequences, span); + decl = ExtendDeclaration(simpleSequences, span); } return decl; @@ -1892,7 +1886,7 @@ class _Parser { static const int _paddingPartRight = 27; static const int _paddingPartBottom = 28; - static const Map _stylesToDart = const { + static const Map _stylesToDart = { 'font': _fontPartFont, 'font-family': _fontPartFamily, 'font-size': _fontPartSize, @@ -1924,7 +1918,7 @@ class _Parser { 'padding-bottom': _paddingPartBottom }; - static const Map _nameToFontWeight = const { + static const Map _nameToFontWeight = { 'bold': FontWeight.bold, 'normal': FontWeight.normal }; @@ -1945,7 +1939,7 @@ class _Parser { // Merge all font styles for this class selector. for (var dartStyle in dartStyles) { if (dartStyle.isFont) { - fontExpr = new FontExpression.merge(dartStyle, fontExpr); + fontExpr = FontExpression.merge(dartStyle, fontExpr); } } @@ -1962,10 +1956,10 @@ class _Parser { // The font-size and font-family values are required. If other values are // missing; a default, if it exist, will be used. case _fontPartFont: - var processor = new ExpressionsProcessor(exprs); + var processor = ExpressionsProcessor(exprs); return _mergeFontStyles(processor.processFont(), dartStyles); case _fontPartFamily: - var processor = new ExpressionsProcessor(exprs); + var processor = ExpressionsProcessor(exprs); try { return _mergeFontStyles(processor.processFontFamily(), dartStyles); @@ -1974,7 +1968,7 @@ class _Parser { } break; case _fontPartSize: - var processor = new ExpressionsProcessor(exprs); + var processor = ExpressionsProcessor(exprs); return _mergeFontStyles(processor.processFontSize(), dartStyles); case _fontPartStyle: // Possible style values: @@ -2007,12 +2001,12 @@ class _Parser { // https://github.com/dart-lang/csslib/issues/1 var expr = exprs.expressions[0]; if (expr is NumberTerm) { - var fontExpr = new FontExpression(expr.span, weight: expr.value); + var fontExpr = FontExpression(expr.span, weight: expr.value); return _mergeFontStyles(fontExpr, dartStyles); } else if (expr is LiteralTerm) { int weight = _nameToFontWeight[expr.value.toString()]; if (weight != null) { - var fontExpr = new FontExpression(expr.span, weight: weight); + var fontExpr = FontExpression(expr.span, weight: weight); return _mergeFontStyles(fontExpr, dartStyles); } } @@ -2026,15 +2020,15 @@ class _Parser { // See https://github.com/dart-lang/csslib/issues/2. if (unitTerm.unit == TokenKind.UNIT_LENGTH_PX || unitTerm.unit == TokenKind.UNIT_LENGTH_PT) { - var fontExpr = new FontExpression(expr.span, - lineHeight: new LineHeight(expr.value, inPixels: true)); + var fontExpr = FontExpression(expr.span, + lineHeight: LineHeight(expr.value, inPixels: true)); return _mergeFontStyles(fontExpr, dartStyles); } else if (isChecked) { _warning("Unexpected unit for line-height", expr.span); } } else if (expr is NumberTerm) { - var fontExpr = new FontExpression(expr.span, - lineHeight: new LineHeight(expr.value, inPixels: false)); + var fontExpr = FontExpression(expr.span, + lineHeight: LineHeight(expr.value, inPixels: false)); return _mergeFontStyles(fontExpr, dartStyles); } else if (isChecked) { _warning("Unexpected value for line-height", expr.span); @@ -2042,26 +2036,25 @@ class _Parser { } break; case _marginPartMargin: - return new MarginExpression.boxEdge(exprs.span, processFourNums(exprs)); + return MarginExpression.boxEdge(exprs.span, processFourNums(exprs)); case _borderPartBorder: for (var expr in exprs.expressions) { var v = marginValue(expr); if (v != null) { - final box = new BoxEdge.uniform(v); - return new BorderExpression.boxEdge(exprs.span, box); + final box = BoxEdge.uniform(v); + return BorderExpression.boxEdge(exprs.span, box); } } break; case _borderPartWidth: var v = marginValue(exprs.expressions[0]); if (v != null) { - final box = new BoxEdge.uniform(v); - return new BorderExpression.boxEdge(exprs.span, box); + final box = BoxEdge.uniform(v); + return BorderExpression.boxEdge(exprs.span, box); } break; case _paddingPartPadding: - return new PaddingExpression.boxEdge( - exprs.span, processFourNums(exprs)); + return PaddingExpression.boxEdge(exprs.span, processFourNums(exprs)); case _marginPartLeft: case _marginPartTop: case _marginPartRight: @@ -2080,7 +2073,7 @@ class _Parser { case _paddingPartTop: case _paddingPartRight: case _paddingPartBottom: - if (exprs.expressions.length > 0) { + if (exprs.expressions.isNotEmpty) { return processOneNumber(exprs, styleType); } break; @@ -2095,37 +2088,37 @@ class _Parser { if (value != null) { switch (part) { case _marginPartLeft: - return new MarginExpression(exprs.span, left: value); + return MarginExpression(exprs.span, left: value); case _marginPartTop: - return new MarginExpression(exprs.span, top: value); + return MarginExpression(exprs.span, top: value); case _marginPartRight: - return new MarginExpression(exprs.span, right: value); + return MarginExpression(exprs.span, right: value); case _marginPartBottom: - return new MarginExpression(exprs.span, bottom: value); + return MarginExpression(exprs.span, bottom: value); case _borderPartLeft: case _borderPartLeftWidth: - return new BorderExpression(exprs.span, left: value); + return BorderExpression(exprs.span, left: value); case _borderPartTop: case _borderPartTopWidth: - return new BorderExpression(exprs.span, top: value); + return BorderExpression(exprs.span, top: value); case _borderPartRight: case _borderPartRightWidth: - return new BorderExpression(exprs.span, right: value); + return BorderExpression(exprs.span, right: value); case _borderPartBottom: case _borderPartBottomWidth: - return new BorderExpression(exprs.span, bottom: value); + return BorderExpression(exprs.span, bottom: value); case _heightPart: - return new HeightExpression(exprs.span, value); + return HeightExpression(exprs.span, value); case _widthPart: - return new WidthExpression(exprs.span, value); + return WidthExpression(exprs.span, value); case _paddingPartLeft: - return new PaddingExpression(exprs.span, left: value); + return PaddingExpression(exprs.span, left: value); case _paddingPartTop: - return new PaddingExpression(exprs.span, top: value); + return PaddingExpression(exprs.span, top: value); case _paddingPartRight: - return new PaddingExpression(exprs.span, right: value); + return PaddingExpression(exprs.span, right: value); case _paddingPartBottom: - return new PaddingExpression(exprs.span, bottom: value); + return PaddingExpression(exprs.span, bottom: value); } } return null; @@ -2175,7 +2168,7 @@ class _Parser { return null; } - return new BoxEdge.clockwiseFromTop(top, right, bottom, left); + return BoxEdge.clockwiseFromTop(top, right, bottom, left); } // TODO(terry): Need to handle auto. @@ -2196,7 +2189,7 @@ class _Parser { // term: (see processTerm) Expressions processExpr([bool ieFilter = false]) { var start = _peekToken.span; - var expressions = new Expressions(_makeSpan(start)); + var expressions = Expressions(_makeSpan(start)); var keepGoing = true; var expr; @@ -2207,10 +2200,10 @@ class _Parser { switch (_peek()) { case TokenKind.SLASH: - op = new OperatorSlash(_makeSpan(opStart)); + op = OperatorSlash(_makeSpan(opStart)); break; case TokenKind.COMMA: - op = new OperatorComma(_makeSpan(opStart)); + op = OperatorComma(_makeSpan(opStart)); break; case TokenKind.BACKSLASH: // Backslash outside of string; detected IE8 or older signaled by \9 @@ -2222,7 +2215,7 @@ class _Parser { var numToken = _next(); var value = int.parse(numToken.text); if (value == 9) { - op = new IE8Term(_makeSpan(ie8Start)); + op = IE8Term(_makeSpan(ie8Start)); } else if (isChecked) { _warning( "\$value is not valid in an expression", _makeSpan(start)); @@ -2324,15 +2317,15 @@ class _Parser { case TokenKind.SINGLE_QUOTE: value = processQuotedString(false); value = "'${_escapeString(value, single: true)}'"; - return new LiteralTerm(value, value, _makeSpan(start)); + return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.DOUBLE_QUOTE: value = processQuotedString(false); value = '"${_escapeString(value)}"'; - return new LiteralTerm(value, value, _makeSpan(start)); + return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.LPAREN: _next(); - GroupTerm group = new GroupTerm(_makeSpan(start)); + GroupTerm group = GroupTerm(_makeSpan(start)); dynamic /* Expression | List | ... */ term; do { @@ -2355,7 +2348,7 @@ class _Parser { _eat(TokenKind.RBRACK); - return new ItemTerm(term.value, term.text, _makeSpan(start)); + return ItemTerm(term.value, term.text, _makeSpan(start)); case TokenKind.IDENTIFIER: var nameValue = identifier(); // Snarf up the ident we'll remap, maybe. @@ -2380,7 +2373,7 @@ class _Parser { // TODO(terry): Need to have a list of known identifiers today only // 'from' is special. if (nameValue.name == 'from') { - return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); + return LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); } // What kind of identifier is it, named color? @@ -2393,7 +2386,7 @@ class _Parser { : "Unknown property value ${propName}"; _warning(errMsg, _makeSpan(start)); } - return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); + return LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); } // Yes, process the color as an RGB value. @@ -2430,7 +2423,7 @@ class _Parser { first = _previousToken.text; } - return new UnicodeRangeTerm(first, second, _makeSpan(start)); + return UnicodeRangeTerm(first, second, _makeSpan(start)); case TokenKind.AT: if (messages.options.lessSupport) { _next(); @@ -2442,7 +2435,7 @@ class _Parser { var param = expr.expressions[0]; var varUsage = - new VarUsage((param as LiteralTerm).text, [], _makeSpan(start)); + VarUsage((param as LiteralTerm).text, [], _makeSpan(start)); expr.expressions[0] = varUsage; return expr.expressions; } @@ -2459,11 +2452,11 @@ class _Parser { switch (unitType) { case TokenKind.UNIT_EM: - term = new EmTerm(value, t.text, span); + term = EmTerm(value, t.text, span); _next(); // Skip the unit break; case TokenKind.UNIT_EX: - term = new ExTerm(value, t.text, span); + term = ExTerm(value, t.text, span); _next(); // Skip the unit break; case TokenKind.UNIT_LENGTH_PX: @@ -2472,60 +2465,60 @@ class _Parser { case TokenKind.UNIT_LENGTH_IN: case TokenKind.UNIT_LENGTH_PT: case TokenKind.UNIT_LENGTH_PC: - term = new LengthTerm(value, t.text, span, unitType); + term = LengthTerm(value, t.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_ANGLE_DEG: case TokenKind.UNIT_ANGLE_RAD: case TokenKind.UNIT_ANGLE_GRAD: case TokenKind.UNIT_ANGLE_TURN: - term = new AngleTerm(value, t.text, span, unitType); + term = AngleTerm(value, t.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_TIME_MS: case TokenKind.UNIT_TIME_S: - term = new TimeTerm(value, t.text, span, unitType); + term = TimeTerm(value, t.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_FREQ_HZ: case TokenKind.UNIT_FREQ_KHZ: - term = new FreqTerm(value, t.text, span, unitType); + term = FreqTerm(value, t.text, span, unitType); _next(); // Skip the unit break; case TokenKind.PERCENT: - term = new PercentageTerm(value, t.text, span); + term = PercentageTerm(value, t.text, span); _next(); // Skip the % break; case TokenKind.UNIT_FRACTION: - term = new FractionTerm(value, t.text, span); + term = FractionTerm(value, t.text, span); _next(); // Skip the unit break; case TokenKind.UNIT_RESOLUTION_DPI: case TokenKind.UNIT_RESOLUTION_DPCM: case TokenKind.UNIT_RESOLUTION_DPPX: - term = new ResolutionTerm(value, t.text, span, unitType); + term = ResolutionTerm(value, t.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_CH: - term = new ChTerm(value, t.text, span, unitType); + term = ChTerm(value, t.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_REM: - term = new RemTerm(value, t.text, span, unitType); + term = RemTerm(value, t.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_VIEWPORT_VW: case TokenKind.UNIT_VIEWPORT_VH: case TokenKind.UNIT_VIEWPORT_VMIN: case TokenKind.UNIT_VIEWPORT_VMAX: - term = new ViewportTerm(value, t.text, span, unitType); + term = ViewportTerm(value, t.text, span, unitType); _next(); // Skip the unit break; default: if (value != null && t != null) { term = (value is Identifier) - ? new LiteralTerm(value, value.name, span) - : new NumberTerm(value, t.text, span); + ? LiteralTerm(value, value.name, span) + : NumberTerm(value, t.text, span); } break; } @@ -2569,7 +2562,7 @@ class _Parser { } // Gobble up everything until we hit our stop token. - var stringValue = new StringBuffer(); + var stringValue = StringBuffer(); while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) { stringValue.write(_next().text); } @@ -2598,7 +2591,7 @@ class _Parser { if (kind == TokenKind.SEMICOLON || kind == TokenKind.RBRACE) { var tok = tokenizer.makeIEFilter( startAfterProgidColon.start.offset, _peekToken.start); - return new LiteralTerm(tok.text, tok.text, tok.span); + return LiteralTerm(tok.text, tok.text, tok.span); } var parens = 0; @@ -2613,7 +2606,7 @@ class _Parser { if (--parens == 0) { var tok = tokenizer.makeIEFilter( startAfterProgidColon.start.offset, _peekToken.start); - return new LiteralTerm(tok.text, tok.text, tok.span); + return LiteralTerm(tok.text, tok.text, tok.span); } break; default: @@ -2638,7 +2631,7 @@ class _Parser { tokenizer._inString = false; // Gobble up everything until we hit our stop token. - var stringValue = new StringBuffer(); + var stringValue = StringBuffer(); var left = 1; var matchingParens = false; while (_peek() != TokenKind.END_OF_FILE && !matchingParens) { @@ -2667,13 +2660,13 @@ class _Parser { if (name == 'calc' || name == '-webkit-calc' || name == '-moz-calc') { // TODO(terry): Implement expression parsing properly. String expression = processCalcExpression(); - var calcExpr = new LiteralTerm(expression, expression, _makeSpan(start)); + var calcExpr = LiteralTerm(expression, expression, _makeSpan(start)); if (!_maybeEat(TokenKind.RPAREN)) { _error("problem parsing function expected ), ", _peekToken.span); } - return new CalcTerm(name, name, calcExpr, _makeSpan(start)); + return CalcTerm(name, name, calcExpr, _makeSpan(start)); } return null; @@ -2702,7 +2695,7 @@ class _Parser { _next(); } - return new UriTerm(urlParam, _makeSpan(start)); + return UriTerm(urlParam, _makeSpan(start)); case 'var': // TODO(terry): Consider handling var in IE specific filter/progid. // This will require parsing entire IE specific syntax @@ -2727,14 +2720,14 @@ class _Parser { var defaultValues = expr.expressions.length >= 3 ? expr.expressions.sublist(2) : []; - return new VarUsage(paramName, defaultValues, _makeSpan(start)); + return VarUsage(paramName, defaultValues, _makeSpan(start)); default: var expr = processExpr(); if (!_maybeEat(TokenKind.RPAREN)) { _error("problem parsing function expected ), ", _peekToken.span); } - return new FunctionTerm(name, name, expr, _makeSpan(start)); + return FunctionTerm(name, name, expr, _makeSpan(start)); } } @@ -2746,10 +2739,10 @@ class _Parser { if (isChecked) { _warning('expected identifier, but found $tok', tok.span); } - return new Identifier("", _makeSpan(tok.span)); + return Identifier("", _makeSpan(tok.span)); } - return new Identifier(tok.text, _makeSpan(tok.span)); + return Identifier(tok.text, _makeSpan(tok.span)); } // TODO(terry): Move this to base <= 36 and into shared code. @@ -2772,7 +2765,7 @@ class _Parser { var digit = _hexDigit(hexText.codeUnitAt(i)); if (digit < 0) { _warning('Bad hex number', span); - return new HexColorTerm(new BAD_HEX_VALUE(), hexText, span); + return HexColorTerm(BAD_HEX_VALUE(), hexText, span); } hexValue = (hexValue << 4) + digit; } @@ -2792,7 +2785,7 @@ class _Parser { } else if (hexText.length == 2 && hexText[0] == hexText[1]) { hexText = '${hexText[0]}'; } - return new HexColorTerm(hexValue, hexText, span); + return HexColorTerm(hexValue, hexText, span); } } @@ -2832,7 +2825,7 @@ class ExpressionsProcessor { nextIsLineHeight = true; } else if (nextIsLineHeight && expr is LengthTerm) { assert(expr.unit == TokenKind.UNIT_LENGTH_PX); - lineHt = new LineHeight(expr.value, inPixels: true); + lineHt = LineHeight(expr.value, inPixels: true); nextIsLineHeight = false; _index++; break; @@ -2844,7 +2837,7 @@ class ExpressionsProcessor { } } - return new FontExpression(_exprs.span, size: size, lineHeight: lineHt); + return FontExpression(_exprs.span, size: size, lineHeight: lineHt); } FontExpression processFontFamily() { @@ -2858,21 +2851,21 @@ class ExpressionsProcessor { for (; _index < _exprs.expressions.length; _index++) { Expression expr = _exprs.expressions[_index]; if (expr is LiteralTerm) { - if (family.length == 0 || moreFamilies) { + if (family.isEmpty || moreFamilies) { // It's font-family now. family.add(expr.toString()); moreFamilies = false; } else if (isChecked) { messages.warning('Only font-family can be a list', _exprs.span); } - } else if (expr is OperatorComma && family.length > 0) { + } else if (expr is OperatorComma && family.isNotEmpty) { moreFamilies = true; } else { break; } } - return new FontExpression(_exprs.span, family: family); + return FontExpression(_exprs.span, family: family); } FontExpression processFont() { @@ -2893,7 +2886,7 @@ class ExpressionsProcessor { // https://github.com/dart-lang/csslib/issues/5 } - return new FontExpression(_exprs.span, + return FontExpression(_exprs.span, size: fontSize.font.size, lineHeight: fontSize.font.lineHeight, family: fontFamily.font.family); @@ -2902,12 +2895,12 @@ class ExpressionsProcessor { /// Escapes [text] for use in a CSS string. /// [single] specifies single quote `'` vs double quote `"`. -String _escapeString(String text, {bool single: false}) { - StringBuffer result = null; +String _escapeString(String text, {bool single = false}) { + StringBuffer result; for (int i = 0; i < text.length; i++) { var code = text.codeUnitAt(i); - String replace = null; + String replace; switch (code) { case 34 /*'"'*/ : if (!single) replace = r'\"'; @@ -2918,7 +2911,7 @@ String _escapeString(String text, {bool single: false}) { } if (replace != null && result == null) { - result = new StringBuffer(text.substring(0, i)); + result = StringBuffer(text.substring(0, i)); } if (result != null) result.write(replace != null ? replace : text[i]); diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index e6bb0eba6..6421c6e4a 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -43,14 +43,14 @@ class Analyzer { // Expand any nested selectors using selector desendant combinator to // signal CSS inheritance notation. - _styleSheets.forEach((styleSheet) => new ExpandNestedSelectors() + _styleSheets.forEach((styleSheet) => ExpandNestedSelectors() ..visitStyleSheet(styleSheet) ..flatten(styleSheet)); // Expand any @extend. _styleSheets.forEach((styleSheet) { - var allExtends = new AllExtends()..visitStyleSheet(styleSheet); - new InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet); + var allExtends = AllExtends()..visitStyleSheet(styleSheet); + InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet); }); } } @@ -186,7 +186,7 @@ class ExpandNestedSelectors extends Visitor { List _expandedRuleSets = []; /// Maping of a nested rule set to the fully expanded list of RuleSet(s). - final Map> _expansions = new Map(); + final Map> _expansions = Map(); void visitRuleSet(RuleSet node) { final oldParent = _parentRuleSet; @@ -196,7 +196,7 @@ class ExpandNestedSelectors extends Visitor { if (_nestedSelectorGroup == null) { // Create top-level selector (may have nested rules). final newSelectors = node.selectorGroup.selectors.toList(); - _topLevelSelectorGroup = new SelectorGroup(newSelectors, node.span); + _topLevelSelectorGroup = SelectorGroup(newSelectors, node.span); _nestedSelectorGroup = _topLevelSelectorGroup; } else { // Generate new selector groups from the nested rules. @@ -242,11 +242,11 @@ class ExpandNestedSelectors extends Visitor { for (Selector nestedSelector in nestedSelectors) { var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences, selector.simpleSelectorSequences); - newSelectors.add(new Selector(seq, node.span)); + newSelectors.add(Selector(seq, node.span)); } } - return new SelectorGroup(newSelectors, node.span); + return SelectorGroup(newSelectors, node.span); } /// Merge the nested selector sequences [current] to the [parent] sequences or @@ -293,7 +293,7 @@ class ExpandNestedSelectors extends Visitor { var newSequences = []; var first = sequences.first; - newSequences.add(new SimpleSelectorSequence( + newSequences.add(SimpleSelectorSequence( first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT)); newSequences.addAll(sequences.skip(1)); @@ -303,7 +303,7 @@ class ExpandNestedSelectors extends Visitor { void visitDeclarationGroup(DeclarationGroup node) { var span = node.span; - var currentGroup = new DeclarationGroup([], span); + var currentGroup = DeclarationGroup([], span); var oldGroup = _flatDeclarationGroup; _flatDeclarationGroup = currentGroup; @@ -325,7 +325,7 @@ class ExpandNestedSelectors extends Visitor { var selectorGroup = _nestedSelectorGroup; // Build new rule set from the nested selectors and declarations. - var newRuleSet = new RuleSet(selectorGroup, currentGroup, span); + var newRuleSet = RuleSet(selectorGroup, currentGroup, span); // Place in order so outer-most rule is first. if (expandedLength == _expandedRuleSets.length) { @@ -395,7 +395,7 @@ class _MediaRulesReplacer extends Visitor { /// true. static bool replace( StyleSheet styleSheet, RuleSet ruleSet, List newRules) { - var visitor = new _MediaRulesReplacer(ruleSet, newRules); + var visitor = _MediaRulesReplacer(ruleSet, newRules); visitor.visitStyleSheet(styleSheet); return visitor._foundAndReplaced; } @@ -418,11 +418,11 @@ class TopLevelIncludes extends Visitor { final Messages _messages; /// Map of variable name key to it's definition. - final Map map = new Map(); + final Map map = Map(); MixinDefinition currDef; static void expand(Messages messages, List styleSheets) { - new TopLevelIncludes(messages, styleSheets); + TopLevelIncludes(messages, styleSheets); } bool _anyRulesets(MixinRulesetDirective def) => @@ -503,7 +503,7 @@ class _TopLevelIncludeReplacer extends Visitor { /// true. static bool replace(Messages messages, StyleSheet styleSheet, IncludeDirective include, List newRules) { - var visitor = new _TopLevelIncludeReplacer(messages, include, newRules); + var visitor = _TopLevelIncludeReplacer(messages, include, newRules); visitor.visitStyleSheet(styleSheet); return visitor._foundAndReplaced; } @@ -514,7 +514,7 @@ class _TopLevelIncludeReplacer extends Visitor { var index = node.topLevels.indexOf(_include); if (index != -1) { node.topLevels.insertAll(index + 1, _newRules); - node.topLevels.replaceRange(index, index + 1, [new NoOp()]); + node.topLevels.replaceRange(index, index + 1, [NoOp()]); _foundAndReplaced = true; } super.visitStyleSheet(node); @@ -525,7 +525,7 @@ class _TopLevelIncludeReplacer extends Visitor { if (index != -1) { node.rulesets.insertAll(index + 1, _newRules); // Only the resolve the @include once. - node.rulesets.replaceRange(index, index + 1, [new NoOp()]); + node.rulesets.replaceRange(index, index + 1, [NoOp()]); _foundAndReplaced = true; } super.visitMixinRulesetDirective(node); @@ -556,7 +556,7 @@ class CallMixin extends Visitor { Expressions _currExpressions; int _currIndex = -1; - final varUsages = new Map>>(); + final varUsages = Map>>(); /// Only var defs with more than one expression (comma separated). final Map varDefs; @@ -636,7 +636,7 @@ class CallMixin extends Visitor { } void _addExpression(Map> expressions) { - var indexSet = new Set(); + var indexSet = Set(); indexSet.add(_currIndex); expressions[_currExpressions] = indexSet; } @@ -653,7 +653,7 @@ class CallMixin extends Visitor { allIndexes.add(_currIndex); } } else { - var newExpressions = new Map>(); + var newExpressions = Map>(); _addExpression(newExpressions); varUsages[node.name] = newExpressions; } @@ -677,18 +677,18 @@ class DeclarationIncludes extends Visitor { final Messages _messages; /// Map of variable name key to it's definition. - final Map map = new Map(); + final Map map = Map(); /// Cache of mixin called with parameters. - final Map callMap = new Map(); + final Map callMap = Map(); MixinDefinition currDef; DeclarationGroup currDeclGroup; /// Var definitions with more than 1 expression. - final Map varDefs = new Map(); + final Map varDefs = Map(); static void expand(Messages messages, List styleSheets) { - new DeclarationIncludes(messages, styleSheets); + DeclarationIncludes(messages, styleSheets); } DeclarationIncludes(this._messages, List styleSheets) { @@ -702,7 +702,7 @@ class DeclarationIncludes extends Visitor { CallMixin _createCallDeclMixin(MixinDefinition mixinDef) { callMap.putIfAbsent(mixinDef.name, - () => callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs)); + () => callMap[mixinDef.name] = CallMixin(mixinDef, varDefs)); return callMap[mixinDef.name]; } @@ -727,8 +727,7 @@ class DeclarationIncludes extends Visitor { if (!_allIncludes(mixinDef.rulesets) && currDeclGroup != null) { var index = _findInclude(currDeclGroup.declarations, node); if (index != -1) { - currDeclGroup.declarations - .replaceRange(index, index + 1, [new NoOp()]); + currDeclGroup.declarations.replaceRange(index, index + 1, [NoOp()]); } _messages.warning( "Using top-level mixin ${node.include.name} as a declaration", @@ -740,7 +739,7 @@ class DeclarationIncludes extends Visitor { var rulesets = []; if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) { origRulesets.forEach((ruleset) { - rulesets.add(new IncludeMixinAtDeclaration( + rulesets.add(IncludeMixinAtDeclaration( ruleset as IncludeDirective, ruleset.span)); }); _IncludeReplacer.replace(_styleSheet, node, rulesets); @@ -748,7 +747,7 @@ class DeclarationIncludes extends Visitor { } } - if (mixinDef.definedArgs.length > 0 && node.include.args.length > 0) { + if (mixinDef.definedArgs.isNotEmpty && node.include.args.isNotEmpty) { var callMixin = _createCallDeclMixin(mixinDef); mixinDef = callMixin.transform(node.include.args); } @@ -776,7 +775,7 @@ class DeclarationIncludes extends Visitor { (currDef as MixinDeclarationDirective).declarations.declarations; var index = _findInclude(decls, node); if (index != -1) { - decls.replaceRange(index, index + 1, [new NoOp()]); + decls.replaceRange(index, index + 1, [NoOp()]); } } } @@ -829,7 +828,7 @@ class _IncludeReplacer extends Visitor { /// with the [newRules]. static void replace( StyleSheet ss, var include, List newDeclarations) { - var visitor = new _IncludeReplacer(include, newDeclarations); + var visitor = _IncludeReplacer(include, newDeclarations); visitor.visitStyleSheet(ss); } @@ -840,7 +839,7 @@ class _IncludeReplacer extends Visitor { if (index != -1) { node.declarations.insertAll(index + 1, _newDeclarations); // Change @include to NoOp so it's processed only once. - node.declarations.replaceRange(index, index + 1, [new NoOp()]); + node.declarations.replaceRange(index, index + 1, [NoOp()]); _foundAndReplaced = true; } super.visitDeclarationGroup(node); @@ -851,7 +850,7 @@ class _IncludeReplacer extends Visitor { /// @include. class MixinsAndIncludes extends Visitor { static void remove(StyleSheet styleSheet) { - new MixinsAndIncludes()..visitStyleSheet(styleSheet); + MixinsAndIncludes()..visitStyleSheet(styleSheet); } bool _nodesToRemove(node) => @@ -881,7 +880,7 @@ class MixinsAndIncludes extends Visitor { /// Find all @extend to create inheritance. class AllExtends extends Visitor { final Map> inherits = - new Map>(); + Map>(); SelectorGroup _currSelectorGroup; int _currDeclIndex; diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index a8d5b4a0e..552f25e3d 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -6,14 +6,14 @@ part of csslib.visitor; /// Visitor that produces a formatted string representation of the CSS tree. class CssPrinter extends Visitor { - StringBuffer _buff = new StringBuffer(); + StringBuffer _buff = StringBuffer(); bool prettyPrint = true; /// Walk the [tree] Stylesheet. [pretty] if true emits line breaks, extra /// spaces, friendly property values, etc., if false emits compacted output. - void visitTree(StyleSheet tree, {bool pretty: false}) { + void visitTree(StyleSheet tree, {bool pretty = false}) { prettyPrint = pretty; - _buff = new StringBuffer(); + _buff = StringBuffer(); visitStyleSheet(tree); } @@ -177,7 +177,7 @@ class CssPrinter extends Visitor { } void visitImportDirective(ImportDirective node) { - bool isStartingQuote(String ch) => ('\'"'.indexOf(ch[0]) >= 0); + bool isStartingQuote(String ch) => ('\'"'.contains(ch[0])); if (_isTesting) { // Emit assuming url() was parsed; most suite tests use url function. @@ -223,7 +223,7 @@ class CssPrinter extends Visitor { } void visitNamespaceDirective(NamespaceDirective node) { - bool isStartingQuote(String ch) => ('\'"'.indexOf(ch) >= 0); + bool isStartingQuote(String ch) => ('\'"'.contains(ch)); if (isStartingQuote(node._uri)) { emit(' @namespace ${node.prefix}"${node._uri}"'); diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 3fe079bba..17d1acf7f 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -23,7 +23,7 @@ final String NO_COLOR = '\u001b[0m'; /// Map between error levels and their display color. final Map _ERROR_COLORS = (() { - var colorsMap = new Map(); + var colorsMap = Map(); colorsMap[Level.SEVERE] = RED_COLOR; colorsMap[Level.WARNING] = MAGENTA_COLOR; colorsMap[Level.INFO] = GREEN_COLOR; @@ -32,7 +32,7 @@ final Map _ERROR_COLORS = (() { /// Map between error levels and their friendly name. final Map _ERROR_LABEL = (() { - var labels = new Map(); + var labels = Map(); labels[Level.SEVERE] = 'error'; labels[Level.WARNING] = 'warning'; labels[Level.INFO] = 'info'; @@ -46,12 +46,12 @@ class Message { final SourceSpan span; final bool useColors; - Message(this.level, this.message, {SourceSpan span, bool useColors: false}) + Message(this.level, this.message, {SourceSpan span, bool useColors = false}) : this.span = span, this.useColors = useColors; String toString() { - var output = new StringBuffer(); + var output = StringBuffer(); bool colors = useColors && _ERROR_COLORS.containsKey(level); var levelColor = colors ? _ERROR_COLORS[level] : null; if (colors) output.write(levelColor); @@ -69,7 +69,7 @@ class Message { } } -typedef void PrintHandler(Message obj); +typedef PrintHandler = void Function(Message obj); /// This class tracks and prints information, warnings, and errors emitted by /// the compiler. @@ -81,12 +81,12 @@ class Messages { final List messages = []; - Messages({PreprocessorOptions options, this.printHandler: print}) - : options = options != null ? options : new PreprocessorOptions(); + Messages({PreprocessorOptions options, this.printHandler = print}) + : options = options != null ? options : PreprocessorOptions(); /// Report a compile-time CSS error. void error(String message, SourceSpan span) { - var msg = new Message(Level.SEVERE, message, + var msg = Message(Level.SEVERE, message, span: span, useColors: options.useColors); messages.add(msg); @@ -99,7 +99,7 @@ class Messages { if (options.warningsAsErrors) { error(message, span); } else { - var msg = new Message(Level.WARNING, message, + var msg = Message(Level.WARNING, message, span: span, useColors: options.useColors); messages.add(msg); @@ -108,8 +108,8 @@ class Messages { /// Report and informational message about what the compiler is doing. void info(String message, SourceSpan span) { - var msg = new Message(Level.INFO, message, - span: span, useColors: options.useColors); + var msg = + Message(Level.INFO, message, span: span, useColors: options.useColors); messages.add(msg); diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/options.dart index 19130feb8..3300cf610 100644 --- a/pkgs/csslib/lib/src/options.dart +++ b/pkgs/csslib/lib/src/options.dart @@ -37,13 +37,13 @@ class PreprocessorOptions { final String inputFile; const PreprocessorOptions( - {this.verbose: false, - this.checked: false, - this.lessSupport: true, - this.warningsAsErrors: false, - this.throwOnErrors: false, - this.throwOnWarnings: false, - this.useColors: true, - this.polyfill: false, + {this.verbose = false, + this.checked = false, + this.lessSupport = true, + this.warningsAsErrors = false, + this.throwOnErrors = false, + this.throwOnWarnings = false, + this.useColors = true, + this.polyfill = false, this.inputFile}); } diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index fc6cc5f9a..c8a01f1a9 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -8,10 +8,9 @@ part of csslib.parser; /// understand (var, calc, etc.). class PolyFill { final Messages _messages; - Map _allVarDefinitions = - new Map(); + Map _allVarDefinitions = Map(); - Set allStyleSheets = new Set(); + Set allStyleSheets = Set(); /// [_pseudoElements] list of known pseudo attributes found in HTML, any /// CSS pseudo-elements 'name::custom-element' is mapped to the manged name @@ -20,20 +19,20 @@ class PolyFill { /// Run the analyzer on every file that is a style sheet or any component that /// has a style tag. - void process(StyleSheet styleSheet, {List includes: null}) { + void process(StyleSheet styleSheet, {List includes}) { if (includes != null) { processVarDefinitions(includes); } processVars(styleSheet); // Remove all var definitions for this style sheet. - new _RemoveVarDefinitions().visitTree(styleSheet); + _RemoveVarDefinitions().visitTree(styleSheet); } /// Process all includes looking for var definitions. void processVarDefinitions(List includes) { for (var include in includes) { - _allVarDefinitions = (new _VarDefinitionsIncludes(_allVarDefinitions) + _allVarDefinitions = (_VarDefinitionsIncludes(_allVarDefinitions) ..visitTree(include)) .varDefs; } @@ -42,7 +41,7 @@ class PolyFill { void processVars(StyleSheet styleSheet) { // Build list of all var definitions. var mainStyleSheetVarDefs = - (new _VarDefAndUsage(this._messages, _allVarDefinitions) + (_VarDefAndUsage(this._messages, _allVarDefinitions) ..visitTree(styleSheet)) .varDefs; @@ -82,7 +81,7 @@ class _VarDefinitionsIncludes extends Visitor { class _VarDefAndUsage extends Visitor { final Messages _messages; final Map _knownVarDefs; - final Map varDefs = new Map(); + final Map varDefs = Map(); VarDefinition currVarDefinition; List currentExpressions; diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index cf614fe79..de7476078 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -87,7 +87,7 @@ class Color implements _StyleProperty, ColorBase { /// foreground). Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent, [num alpha]) - : this._argb = new Hsla( + : this._argb = Hsla( Color._clamp(hueDegree, 0, 360) / 360, Color._clamp(saturationPercent, 0, 100) / 100, Color._clamp(lightnessPercent, 0, 100) / 100, @@ -108,7 +108,7 @@ class Color implements _StyleProperty, ColorBase { /// completely transparent foreground and 1 is a completely /// opaque foreground. Color.hslaRaw(num hue, num saturation, num lightness, [num alpha]) - : this._argb = new Hsla( + : this._argb = Hsla( Color._clamp(hue, 0, 1), Color._clamp(saturation, 0, 1), Color._clamp(lightness, 0, 1), @@ -154,10 +154,10 @@ class Color implements _StyleProperty, ColorBase { int g = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); nextIndex += 2; int b = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); - return new Rgba(r, g, b, a); + return Rgba(r, g, b, a); } - Hsla get hsla => new Hsla.fromRgba(rgba); + Hsla get hsla => Hsla.fromRgba(rgba); int get argbValue => Color.hexToInt(_argb); @@ -167,12 +167,12 @@ class Color implements _StyleProperty, ColorBase { Color darker(num amount) { Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, -amount); - return new Color.hex("${newRgba.toHexArgbString()}"); + return Color.hex("${newRgba.toHexArgbString()}"); } Color lighter(num amount) { Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, amount); - return new Color.hex("${newRgba.toHexArgbString()}"); + return Color.hex("${newRgba.toHexArgbString()}"); } static bool equal(ColorBase curr, other) { @@ -224,7 +224,7 @@ class Color implements _StyleProperty, ColorBase { String v = color.substring(1); Color.hexToInt(v); // Valid hexadecimal, throws if not. return v; - } else if (color.length > 0 && color[color.length - 1] == ')') { + } else if (color.isNotEmpty && color[color.length - 1] == ')') { int type; if (color.indexOf("rgb(") == 0 || color.indexOf("RGB(") == 0) { color = color.substring(4); @@ -239,7 +239,7 @@ class Color implements _StyleProperty, ColorBase { type = _hslaCss; color = color.substring(5); } else { - throw new UnsupportedError('CSS property not implemented'); + throw UnsupportedError('CSS property not implemented'); } color = color.substring(0, color.length - 1); // Strip close paren. @@ -255,9 +255,9 @@ class Color implements _StyleProperty, ColorBase { case _rgbaCss: return Color.convertToHexString(args[0], args[1], args[2], args[3]); case _hslCss: - return new Hsla(args[0], args[1], args[2]).toHexArgbString(); + return Hsla(args[0], args[1], args[2]).toHexArgbString(); case _hslaCss: - return new Hsla(args[0], args[1], args[2], args[3]).toHexArgbString(); + return Hsla(args[0], args[1], args[2], args[3]).toHexArgbString(); default: // Type not defined UnsupportedOperationException should have thrown. assert(false); @@ -321,7 +321,7 @@ class Color implements _StyleProperty, ColorBase { g = Color._changeTintShadeColor(rgba.g, tintShade).round().toInt(); b = Color._changeTintShadeColor(rgba.b, tintShade).round().toInt(); } - return new Rgba(r, g, b, rgba.a); + return Rgba(r, g, b, rgba.a); } // TODO(terry): This does an okay lighter/darker; better would be convert to @@ -500,12 +500,12 @@ class Rgba implements _StyleProperty, ColorBase { this.a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; factory Rgba.fromString(String hexValue) => - new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; + Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; factory Rgba.fromColor(Color color) => color.rgba; factory Rgba.fromArgbValue(num value) { - return new Rgba( + return Rgba( ((value.toInt() & 0xff000000) >> 0x18), // a ((value.toInt() & 0xff0000) >> 0x10), // r ((value.toInt() & 0xff00) >> 8), // g @@ -545,7 +545,7 @@ class Rgba implements _StyleProperty, ColorBase { b = (255 * Rgba._hueToRGB(var1, var2, h - (1 / 3))).round().toInt(); } - return new Rgba(r, g, b, a); + return Rgba(r, g, b, a); } static num _hueToRGB(num v1, num v2, num vH) { @@ -595,8 +595,8 @@ class Rgba implements _StyleProperty, ColorBase { return value; } - Color get color => new Color.createRgba(r, g, b, a); - Hsla get hsla => new Hsla.fromRgba(this); + Color get color => Color.createRgba(r, g, b, a); + Hsla get hsla => Hsla.fromRgba(this); Rgba darker(num amount) => Color._createNewTintShadeFromRgba(this, -amount); Rgba lighter(num amount) => Color._createNewTintShadeFromRgba(this, amount); @@ -625,7 +625,7 @@ class Hsla implements _StyleProperty, ColorBase { this._a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; factory Hsla.fromString(String hexValue) { - Rgba rgba = new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; + Rgba rgba = Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; return _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a); } @@ -668,7 +668,7 @@ class Hsla implements _StyleProperty, ColorBase { num maxRgb = math.max(r, math.max(g, b)); l = (maxRgb + minRgb) / 2; if (l <= 0) { - return new Hsla(0, 0, l); // Black; + return Hsla(0, 0, l); // Black; } num vm = maxRgb - minRgb; @@ -676,7 +676,7 @@ class Hsla implements _StyleProperty, ColorBase { if (s > 0) { s /= (l < 0.5) ? (maxRgb + minRgb) : (2 - maxRgb - minRgb); } else { - return new Hsla(0, 0, l); // White + return Hsla(0, 0, l); // White } num r2, g2, b2; @@ -692,7 +692,7 @@ class Hsla implements _StyleProperty, ColorBase { } h /= 6; - return new Hsla(h, s, l, a); + return Hsla(h, s, l, a); } /// Returns 0..1 fraction (ratio of 360°, e.g. 1° == 1/360). @@ -722,18 +722,17 @@ class Hsla implements _StyleProperty, ColorBase { ? "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)" : "hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)"; - String toHexArgbString() => new Rgba.fromHsla(this).toHexArgbString(); + String toHexArgbString() => Rgba.fromHsla(this).toHexArgbString(); int get argbValue => Color.hexToInt(this.toHexArgbString()); - Color get color => new Color.createHsla(_h, _s, _l, _a); - Rgba get rgba => new Rgba.fromHsla(this); + Color get color => Color.createHsla(_h, _s, _l, _a); + Rgba get rgba => Rgba.fromHsla(this); - Hsla darker(num amount) => - new Hsla.fromRgba(new Rgba.fromHsla(this).darker(amount)); + Hsla darker(num amount) => Hsla.fromRgba(Rgba.fromHsla(this).darker(amount)); Hsla lighter(num amount) => - new Hsla.fromRgba(new Rgba.fromHsla(this).lighter(amount)); + Hsla.fromRgba(Rgba.fromHsla(this).lighter(amount)); int get hashCode => toHexArgbString().hashCode; } @@ -773,9 +772,9 @@ class Border implements _StyleProperty { return (top == left && bottom == right && top == right) ? "${left}px" : "${top != null ? '$top' : '0'}px " - "${right != null ? '$right' : '0'}px " - "${bottom != null ? '$bottom' : '0'}px " - "${left != null ? '$left' : '0'}px"; + "${right != null ? '$right' : '0'}px " + "${bottom != null ? '$bottom' : '0'}px " + "${left != null ? '$left' : '0'}px"; } } @@ -901,14 +900,14 @@ class FontFamily { class LineHeight { final num height; final bool inPixels; - const LineHeight(this.height, {this.inPixels: true}); + const LineHeight(this.height, {this.inPixels = true}); } // TODO(terry): Support @font-face fule. /// Font style support for size, family, weight, style, variant, and lineheight. class Font implements _StyleProperty { /// Collection of most common sans-serif fonts in order. - static const List sansSerif = const [ + static const List sansSerif = [ FontFamily.arial, FontFamily.verdana, FontFamily.geneva, @@ -917,7 +916,7 @@ class Font implements _StyleProperty { ]; /// Collection of most common serif fonts in order. - static const List serif = const [ + static const List serif = [ FontFamily.georgia, FontFamily.timesNewRoman, FontFamily.times, @@ -925,14 +924,14 @@ class Font implements _StyleProperty { ]; /// Collection of most common monospace fonts in order. - static const List monospace = const [ + static const List monospace = [ FontFamily.courierNew, FontFamily.courier, FontGeneric.monospace ]; /// Collection of most common cursive fonts in order. - static const List cursive = const [ + static const List cursive = [ FontFamily.textile, FontFamily.appleChancery, FontFamily.zaphChancery, @@ -940,7 +939,7 @@ class Font implements _StyleProperty { ]; /// Collection of most common fantasy fonts in order. - static const List fantasy = const [ + static const List fantasy = [ FontFamily.comicSansMs, FontFamily.impact, FontFamily.webdings, @@ -1001,7 +1000,7 @@ class Font implements _StyleProperty { factory Font.merge(Font a, Font b) { if (a == null) return b; if (b == null) return a; - return new Font._merge(a, b); + return Font._merge(a, b); } Font._merge(Font a, Font b) @@ -1031,7 +1030,7 @@ class Font implements _StyleProperty { return '${size}px $_fontsAsString'; } - Font scale(num ratio) => new Font( + Font scale(num ratio) => Font( size: size * ratio, family: family, weight: weight, @@ -1148,7 +1147,7 @@ class BoxEdge { make = true; bottom = 0; } - return make ? new BoxEdge(left, top, right, bottom) : other; + return make ? BoxEdge(left, top, right, bottom) : other; } /// Merge the two box edge sizes and return the result. See [Style.merge] for @@ -1156,7 +1155,7 @@ class BoxEdge { factory BoxEdge.merge(BoxEdge x, BoxEdge y) { if (x == null) return y; if (y == null) return x; - return new BoxEdge._merge(x, y); + return BoxEdge._merge(x, y); } BoxEdge._merge(BoxEdge x, BoxEdge y) diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index a4ca215a0..a09e306bd 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -18,7 +18,7 @@ class Tokenizer extends TokenizerBase { Tokenizer(SourceFile file, String text, bool skipWhitespace, [int index = 0]) : super(file, text, skipWhitespace, index); - Token next({bool unicodeRange: false}) { + Token next({bool unicodeRange = false}) { // keep track of our starting position _startIndex = _index; @@ -241,7 +241,7 @@ class Tokenizer extends TokenizerBase { (_peekChar() == '-'.codeUnitAt(0)); } - Token _errorToken([String message = null]) { + Token _errorToken([String message]) { return _finishToken(TokenKind.ERROR); } @@ -314,9 +314,9 @@ class Tokenizer extends TokenizerBase { } var span = _file.span(_startIndex, _index); - var text = new String.fromCharCodes(chars); + var text = String.fromCharCodes(chars); - return new IdentifierToken(text, getIdentifierKind(), span); + return IdentifierToken(text, getIdentifierKind(), span); } Token finishNumber() { diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index 07aee793a..a8567273a 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -55,7 +55,7 @@ abstract class TokenizerBase { int getIdentifierKind(); /// Snapshot of Tokenizer scanning state. - TokenizerState get mark => new TokenizerState(this); + TokenizerState get mark => TokenizerState(this); /// Restore Tokenizer scanning state. void restore(TokenizerState markedData) { @@ -106,11 +106,11 @@ abstract class TokenizerBase { } Token _finishToken(int kind) { - return new Token(kind, _file.span(_startIndex, _index)); + return Token(kind, _file.span(_startIndex, _index)); } - Token _errorToken([String message = null]) { - return new ErrorToken( + Token _errorToken([String message]) { + return ErrorToken( TokenKind.ERROR, _file.span(_startIndex, _index), message); } @@ -248,14 +248,14 @@ abstract class TokenizerBase { } Token _makeStringToken(List buf, bool isPart) { - final s = new String.fromCharCodes(buf); + final s = String.fromCharCodes(buf); final kind = isPart ? TokenKind.STRING_PART : TokenKind.STRING; - return new LiteralToken(kind, _file.span(_startIndex, _index), s); + return LiteralToken(kind, _file.span(_startIndex, _index), s); } Token makeIEFilter(int start, int end) { var filter = _text.substring(start, end); - return new LiteralToken(TokenKind.STRING, _file.span(start, end), filter); + return LiteralToken(TokenKind.STRING, _file.span(start, end), filter); } Token _makeRawStringToken(bool isMultiline) { @@ -268,8 +268,7 @@ abstract class TokenizerBase { } else { s = _text.substring(_startIndex + 2, _index - 1); } - return new LiteralToken( - TokenKind.STRING, _file.span(_startIndex, _index), s); + return LiteralToken(TokenKind.STRING, _file.span(_startIndex, _index), s); } Token finishMultilineString(int quote) { @@ -306,7 +305,7 @@ abstract class TokenizerBase { _maybeEatChar(TokenChar.NEWLINE); return finishMultilineString(quote); } else { - return _makeStringToken(new List(), false); + return _makeStringToken(List(), false); } } return finishStringBody(quote); @@ -342,7 +341,7 @@ abstract class TokenizerBase { } Token finishStringBody(int quote) { - var buf = new List(); + var buf = List(); while (true) { int ch = _nextChar(); if (ch == quote) { diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/tokenkind.dart index 1afbe4e9c..af6233e31 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/tokenkind.dart @@ -198,121 +198,97 @@ class TokenKind { static const int PSEUDO_CLASS_NAME = 705; // :pseudoClass static const int NEGATION = 706; // NOT - static const List> _DIRECTIVES = const [ - const {'type': TokenKind.DIRECTIVE_IMPORT, 'value': 'import'}, - const {'type': TokenKind.DIRECTIVE_MEDIA, 'value': 'media'}, - const {'type': TokenKind.DIRECTIVE_PAGE, 'value': 'page'}, - const {'type': TokenKind.DIRECTIVE_CHARSET, 'value': 'charset'}, - const {'type': TokenKind.DIRECTIVE_STYLET, 'value': 'stylet'}, - const {'type': TokenKind.DIRECTIVE_KEYFRAMES, 'value': 'keyframes'}, - const { + static const List> _DIRECTIVES = [ + {'type': TokenKind.DIRECTIVE_IMPORT, 'value': 'import'}, + {'type': TokenKind.DIRECTIVE_MEDIA, 'value': 'media'}, + {'type': TokenKind.DIRECTIVE_PAGE, 'value': 'page'}, + {'type': TokenKind.DIRECTIVE_CHARSET, 'value': 'charset'}, + {'type': TokenKind.DIRECTIVE_STYLET, 'value': 'stylet'}, + {'type': TokenKind.DIRECTIVE_KEYFRAMES, 'value': 'keyframes'}, + { 'type': TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES, 'value': '-webkit-keyframes' }, - const { - 'type': TokenKind.DIRECTIVE_MOZ_KEYFRAMES, - 'value': '-moz-keyframes' - }, - const {'type': TokenKind.DIRECTIVE_MS_KEYFRAMES, 'value': '-ms-keyframes'}, - const {'type': TokenKind.DIRECTIVE_O_KEYFRAMES, 'value': '-o-keyframes'}, - const {'type': TokenKind.DIRECTIVE_FONTFACE, 'value': 'font-face'}, - const {'type': TokenKind.DIRECTIVE_NAMESPACE, 'value': 'namespace'}, - const {'type': TokenKind.DIRECTIVE_HOST, 'value': 'host'}, - const {'type': TokenKind.DIRECTIVE_MIXIN, 'value': 'mixin'}, - const {'type': TokenKind.DIRECTIVE_INCLUDE, 'value': 'include'}, - const {'type': TokenKind.DIRECTIVE_CONTENT, 'value': 'content'}, - const {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'}, - const {'type': TokenKind.DIRECTIVE_MOZ_DOCUMENT, 'value': '-moz-document'}, - const {'type': TokenKind.DIRECTIVE_SUPPORTS, 'value': 'supports'}, - const {'type': TokenKind.DIRECTIVE_VIEWPORT, 'value': 'viewport'}, - const {'type': TokenKind.DIRECTIVE_MS_VIEWPORT, 'value': '-ms-viewport'}, + {'type': TokenKind.DIRECTIVE_MOZ_KEYFRAMES, 'value': '-moz-keyframes'}, + {'type': TokenKind.DIRECTIVE_MS_KEYFRAMES, 'value': '-ms-keyframes'}, + {'type': TokenKind.DIRECTIVE_O_KEYFRAMES, 'value': '-o-keyframes'}, + {'type': TokenKind.DIRECTIVE_FONTFACE, 'value': 'font-face'}, + {'type': TokenKind.DIRECTIVE_NAMESPACE, 'value': 'namespace'}, + {'type': TokenKind.DIRECTIVE_HOST, 'value': 'host'}, + {'type': TokenKind.DIRECTIVE_MIXIN, 'value': 'mixin'}, + {'type': TokenKind.DIRECTIVE_INCLUDE, 'value': 'include'}, + {'type': TokenKind.DIRECTIVE_CONTENT, 'value': 'content'}, + {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'}, + {'type': TokenKind.DIRECTIVE_MOZ_DOCUMENT, 'value': '-moz-document'}, + {'type': TokenKind.DIRECTIVE_SUPPORTS, 'value': 'supports'}, + {'type': TokenKind.DIRECTIVE_VIEWPORT, 'value': 'viewport'}, + {'type': TokenKind.DIRECTIVE_MS_VIEWPORT, 'value': '-ms-viewport'}, ]; - static const List> MEDIA_OPERATORS = const [ - const {'type': TokenKind.MEDIA_OP_ONLY, 'value': 'only'}, - const {'type': TokenKind.MEDIA_OP_NOT, 'value': 'not'}, - const {'type': TokenKind.MEDIA_OP_AND, 'value': 'and'}, + static const List> MEDIA_OPERATORS = [ + {'type': TokenKind.MEDIA_OP_ONLY, 'value': 'only'}, + {'type': TokenKind.MEDIA_OP_NOT, 'value': 'not'}, + {'type': TokenKind.MEDIA_OP_AND, 'value': 'and'}, ]; - static const List> MARGIN_DIRECTIVES = const [ - const { + static const List> MARGIN_DIRECTIVES = [ + { 'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFTCORNER, 'value': 'top-left-corner' }, - const {'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFT, 'value': 'top-left'}, - const {'type': TokenKind.MARGIN_DIRECTIVE_TOPCENTER, 'value': 'top-center'}, - const {'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHT, 'value': 'top-right'}, - const { + {'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFT, 'value': 'top-left'}, + {'type': TokenKind.MARGIN_DIRECTIVE_TOPCENTER, 'value': 'top-center'}, + {'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHT, 'value': 'top-right'}, + { 'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHTCORNER, 'value': 'top-right-corner' }, - const { + { 'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFTCORNER, 'value': 'bottom-left-corner' }, - const { - 'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFT, - 'value': 'bottom-left' - }, - const { - 'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMCENTER, - 'value': 'bottom-center' - }, - const { - 'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHT, - 'value': 'bottom-right' - }, - const { + {'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFT, 'value': 'bottom-left'}, + {'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMCENTER, 'value': 'bottom-center'}, + {'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHT, 'value': 'bottom-right'}, + { 'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHTCORNER, 'value': 'bottom-right-corner' }, - const {'type': TokenKind.MARGIN_DIRECTIVE_LEFTTOP, 'value': 'left-top'}, - const { - 'type': TokenKind.MARGIN_DIRECTIVE_LEFTMIDDLE, - 'value': 'left-middle' - }, - const { - 'type': TokenKind.MARGIN_DIRECTIVE_LEFTBOTTOM, - 'value': 'right-bottom' - }, - const {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTTOP, 'value': 'right-top'}, - const { - 'type': TokenKind.MARGIN_DIRECTIVE_RIGHTMIDDLE, - 'value': 'right-middle' - }, - const { - 'type': TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM, - 'value': 'right-bottom' - }, + {'type': TokenKind.MARGIN_DIRECTIVE_LEFTTOP, 'value': 'left-top'}, + {'type': TokenKind.MARGIN_DIRECTIVE_LEFTMIDDLE, 'value': 'left-middle'}, + {'type': TokenKind.MARGIN_DIRECTIVE_LEFTBOTTOM, 'value': 'right-bottom'}, + {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTTOP, 'value': 'right-top'}, + {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTMIDDLE, 'value': 'right-middle'}, + {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM, 'value': 'right-bottom'}, ]; - static const List _UNITS = const [ - const {'unit': TokenKind.UNIT_EM, 'value': 'em'}, - const {'unit': TokenKind.UNIT_EX, 'value': 'ex'}, - const {'unit': TokenKind.UNIT_LENGTH_PX, 'value': 'px'}, - const {'unit': TokenKind.UNIT_LENGTH_CM, 'value': 'cm'}, - const {'unit': TokenKind.UNIT_LENGTH_MM, 'value': 'mm'}, - const {'unit': TokenKind.UNIT_LENGTH_IN, 'value': 'in'}, - const {'unit': TokenKind.UNIT_LENGTH_PT, 'value': 'pt'}, - const {'unit': TokenKind.UNIT_LENGTH_PC, 'value': 'pc'}, - const {'unit': TokenKind.UNIT_ANGLE_DEG, 'value': 'deg'}, - const {'unit': TokenKind.UNIT_ANGLE_RAD, 'value': 'rad'}, - const {'unit': TokenKind.UNIT_ANGLE_GRAD, 'value': 'grad'}, - const {'unit': TokenKind.UNIT_ANGLE_TURN, 'value': 'turn'}, - const {'unit': TokenKind.UNIT_TIME_MS, 'value': 'ms'}, - const {'unit': TokenKind.UNIT_TIME_S, 'value': 's'}, - const {'unit': TokenKind.UNIT_FREQ_HZ, 'value': 'hz'}, - const {'unit': TokenKind.UNIT_FREQ_KHZ, 'value': 'khz'}, - const {'unit': TokenKind.UNIT_FRACTION, 'value': 'fr'}, - const {'unit': TokenKind.UNIT_RESOLUTION_DPI, 'value': 'dpi'}, - const {'unit': TokenKind.UNIT_RESOLUTION_DPCM, 'value': 'dpcm'}, - const {'unit': TokenKind.UNIT_RESOLUTION_DPPX, 'value': 'dppx'}, - const {'unit': TokenKind.UNIT_CH, 'value': 'ch'}, - const {'unit': TokenKind.UNIT_REM, 'value': 'rem'}, - const {'unit': TokenKind.UNIT_VIEWPORT_VW, 'value': 'vw'}, - const {'unit': TokenKind.UNIT_VIEWPORT_VH, 'value': 'vh'}, - const {'unit': TokenKind.UNIT_VIEWPORT_VMIN, 'value': 'vmin'}, - const {'unit': TokenKind.UNIT_VIEWPORT_VMAX, 'value': 'vmax'}, + static const List _UNITS = [ + {'unit': TokenKind.UNIT_EM, 'value': 'em'}, + {'unit': TokenKind.UNIT_EX, 'value': 'ex'}, + {'unit': TokenKind.UNIT_LENGTH_PX, 'value': 'px'}, + {'unit': TokenKind.UNIT_LENGTH_CM, 'value': 'cm'}, + {'unit': TokenKind.UNIT_LENGTH_MM, 'value': 'mm'}, + {'unit': TokenKind.UNIT_LENGTH_IN, 'value': 'in'}, + {'unit': TokenKind.UNIT_LENGTH_PT, 'value': 'pt'}, + {'unit': TokenKind.UNIT_LENGTH_PC, 'value': 'pc'}, + {'unit': TokenKind.UNIT_ANGLE_DEG, 'value': 'deg'}, + {'unit': TokenKind.UNIT_ANGLE_RAD, 'value': 'rad'}, + {'unit': TokenKind.UNIT_ANGLE_GRAD, 'value': 'grad'}, + {'unit': TokenKind.UNIT_ANGLE_TURN, 'value': 'turn'}, + {'unit': TokenKind.UNIT_TIME_MS, 'value': 'ms'}, + {'unit': TokenKind.UNIT_TIME_S, 'value': 's'}, + {'unit': TokenKind.UNIT_FREQ_HZ, 'value': 'hz'}, + {'unit': TokenKind.UNIT_FREQ_KHZ, 'value': 'khz'}, + {'unit': TokenKind.UNIT_FRACTION, 'value': 'fr'}, + {'unit': TokenKind.UNIT_RESOLUTION_DPI, 'value': 'dpi'}, + {'unit': TokenKind.UNIT_RESOLUTION_DPCM, 'value': 'dpcm'}, + {'unit': TokenKind.UNIT_RESOLUTION_DPPX, 'value': 'dppx'}, + {'unit': TokenKind.UNIT_CH, 'value': 'ch'}, + {'unit': TokenKind.UNIT_REM, 'value': 'rem'}, + {'unit': TokenKind.UNIT_VIEWPORT_VW, 'value': 'vw'}, + {'unit': TokenKind.UNIT_VIEWPORT_VH, 'value': 'vh'}, + {'unit': TokenKind.UNIT_VIEWPORT_VMIN, 'value': 'vmin'}, + {'unit': TokenKind.UNIT_VIEWPORT_VMAX, 'value': 'vmax'}, ]; // Some more constants: @@ -320,154 +296,154 @@ class TokenKind { static const int ASCII_UPPER_Z = 90; // ASCII value for uppercase Z // Extended color keywords: - static const List _EXTENDED_COLOR_NAMES = const [ - const {'name': 'aliceblue', 'value': 0xF08FF}, - const {'name': 'antiquewhite', 'value': 0xFAEBD7}, - const {'name': 'aqua', 'value': 0x00FFFF}, - const {'name': 'aquamarine', 'value': 0x7FFFD4}, - const {'name': 'azure', 'value': 0xF0FFFF}, - const {'name': 'beige', 'value': 0xF5F5DC}, - const {'name': 'bisque', 'value': 0xFFE4C4}, - const {'name': 'black', 'value': 0x000000}, - const {'name': 'blanchedalmond', 'value': 0xFFEBCD}, - const {'name': 'blue', 'value': 0x0000FF}, - const {'name': 'blueviolet', 'value': 0x8A2BE2}, - const {'name': 'brown', 'value': 0xA52A2A}, - const {'name': 'burlywood', 'value': 0xDEB887}, - const {'name': 'cadetblue', 'value': 0x5F9EA0}, - const {'name': 'chartreuse', 'value': 0x7FFF00}, - const {'name': 'chocolate', 'value': 0xD2691E}, - const {'name': 'coral', 'value': 0xFF7F50}, - const {'name': 'cornflowerblue', 'value': 0x6495ED}, - const {'name': 'cornsilk', 'value': 0xFFF8DC}, - const {'name': 'crimson', 'value': 0xDC143C}, - const {'name': 'cyan', 'value': 0x00FFFF}, - const {'name': 'darkblue', 'value': 0x00008B}, - const {'name': 'darkcyan', 'value': 0x008B8B}, - const {'name': 'darkgoldenrod', 'value': 0xB8860B}, - const {'name': 'darkgray', 'value': 0xA9A9A9}, - const {'name': 'darkgreen', 'value': 0x006400}, - const {'name': 'darkgrey', 'value': 0xA9A9A9}, - const {'name': 'darkkhaki', 'value': 0xBDB76B}, - const {'name': 'darkmagenta', 'value': 0x8B008B}, - const {'name': 'darkolivegreen', 'value': 0x556B2F}, - const {'name': 'darkorange', 'value': 0xFF8C00}, - const {'name': 'darkorchid', 'value': 0x9932CC}, - const {'name': 'darkred', 'value': 0x8B0000}, - const {'name': 'darksalmon', 'value': 0xE9967A}, - const {'name': 'darkseagreen', 'value': 0x8FBC8F}, - const {'name': 'darkslateblue', 'value': 0x483D8B}, - const {'name': 'darkslategray', 'value': 0x2F4F4F}, - const {'name': 'darkslategrey', 'value': 0x2F4F4F}, - const {'name': 'darkturquoise', 'value': 0x00CED1}, - const {'name': 'darkviolet', 'value': 0x9400D3}, - const {'name': 'deeppink', 'value': 0xFF1493}, - const {'name': 'deepskyblue', 'value': 0x00BFFF}, - const {'name': 'dimgray', 'value': 0x696969}, - const {'name': 'dimgrey', 'value': 0x696969}, - const {'name': 'dodgerblue', 'value': 0x1E90FF}, - const {'name': 'firebrick', 'value': 0xB22222}, - const {'name': 'floralwhite', 'value': 0xFFFAF0}, - const {'name': 'forestgreen', 'value': 0x228B22}, - const {'name': 'fuchsia', 'value': 0xFF00FF}, - const {'name': 'gainsboro', 'value': 0xDCDCDC}, - const {'name': 'ghostwhite', 'value': 0xF8F8FF}, - const {'name': 'gold', 'value': 0xFFD700}, - const {'name': 'goldenrod', 'value': 0xDAA520}, - const {'name': 'gray', 'value': 0x808080}, - const {'name': 'green', 'value': 0x008000}, - const {'name': 'greenyellow', 'value': 0xADFF2F}, - const {'name': 'grey', 'value': 0x808080}, - const {'name': 'honeydew', 'value': 0xF0FFF0}, - const {'name': 'hotpink', 'value': 0xFF69B4}, - const {'name': 'indianred', 'value': 0xCD5C5C}, - const {'name': 'indigo', 'value': 0x4B0082}, - const {'name': 'ivory', 'value': 0xFFFFF0}, - const {'name': 'khaki', 'value': 0xF0E68C}, - const {'name': 'lavender', 'value': 0xE6E6FA}, - const {'name': 'lavenderblush', 'value': 0xFFF0F5}, - const {'name': 'lawngreen', 'value': 0x7CFC00}, - const {'name': 'lemonchiffon', 'value': 0xFFFACD}, - const {'name': 'lightblue', 'value': 0xADD8E6}, - const {'name': 'lightcoral', 'value': 0xF08080}, - const {'name': 'lightcyan', 'value': 0xE0FFFF}, - const {'name': 'lightgoldenrodyellow', 'value': 0xFAFAD2}, - const {'name': 'lightgray', 'value': 0xD3D3D3}, - const {'name': 'lightgreen', 'value': 0x90EE90}, - const {'name': 'lightgrey', 'value': 0xD3D3D3}, - const {'name': 'lightpink', 'value': 0xFFB6C1}, - const {'name': 'lightsalmon', 'value': 0xFFA07A}, - const {'name': 'lightseagreen', 'value': 0x20B2AA}, - const {'name': 'lightskyblue', 'value': 0x87CEFA}, - const {'name': 'lightslategray', 'value': 0x778899}, - const {'name': 'lightslategrey', 'value': 0x778899}, - const {'name': 'lightsteelblue', 'value': 0xB0C4DE}, - const {'name': 'lightyellow', 'value': 0xFFFFE0}, - const {'name': 'lime', 'value': 0x00FF00}, - const {'name': 'limegreen', 'value': 0x32CD32}, - const {'name': 'linen', 'value': 0xFAF0E6}, - const {'name': 'magenta', 'value': 0xFF00FF}, - const {'name': 'maroon', 'value': 0x800000}, - const {'name': 'mediumaquamarine', 'value': 0x66CDAA}, - const {'name': 'mediumblue', 'value': 0x0000CD}, - const {'name': 'mediumorchid', 'value': 0xBA55D3}, - const {'name': 'mediumpurple', 'value': 0x9370DB}, - const {'name': 'mediumseagreen', 'value': 0x3CB371}, - const {'name': 'mediumslateblue', 'value': 0x7B68EE}, - const {'name': 'mediumspringgreen', 'value': 0x00FA9A}, - const {'name': 'mediumturquoise', 'value': 0x48D1CC}, - const {'name': 'mediumvioletred', 'value': 0xC71585}, - const {'name': 'midnightblue', 'value': 0x191970}, - const {'name': 'mintcream', 'value': 0xF5FFFA}, - const {'name': 'mistyrose', 'value': 0xFFE4E1}, - const {'name': 'moccasin', 'value': 0xFFE4B5}, - const {'name': 'navajowhite', 'value': 0xFFDEAD}, - const {'name': 'navy', 'value': 0x000080}, - const {'name': 'oldlace', 'value': 0xFDF5E6}, - const {'name': 'olive', 'value': 0x808000}, - const {'name': 'olivedrab', 'value': 0x6B8E23}, - const {'name': 'orange', 'value': 0xFFA500}, - const {'name': 'orangered', 'value': 0xFF4500}, - const {'name': 'orchid', 'value': 0xDA70D6}, - const {'name': 'palegoldenrod', 'value': 0xEEE8AA}, - const {'name': 'palegreen', 'value': 0x98FB98}, - const {'name': 'paleturquoise', 'value': 0xAFEEEE}, - const {'name': 'palevioletred', 'value': 0xDB7093}, - const {'name': 'papayawhip', 'value': 0xFFEFD5}, - const {'name': 'peachpuff', 'value': 0xFFDAB9}, - const {'name': 'peru', 'value': 0xCD853F}, - const {'name': 'pink', 'value': 0xFFC0CB}, - const {'name': 'plum', 'value': 0xDDA0DD}, - const {'name': 'powderblue', 'value': 0xB0E0E6}, - const {'name': 'purple', 'value': 0x800080}, - const {'name': 'red', 'value': 0xFF0000}, - const {'name': 'rosybrown', 'value': 0xBC8F8F}, - const {'name': 'royalblue', 'value': 0x4169E1}, - const {'name': 'saddlebrown', 'value': 0x8B4513}, - const {'name': 'salmon', 'value': 0xFA8072}, - const {'name': 'sandybrown', 'value': 0xF4A460}, - const {'name': 'seagreen', 'value': 0x2E8B57}, - const {'name': 'seashell', 'value': 0xFFF5EE}, - const {'name': 'sienna', 'value': 0xA0522D}, - const {'name': 'silver', 'value': 0xC0C0C0}, - const {'name': 'skyblue', 'value': 0x87CEEB}, - const {'name': 'slateblue', 'value': 0x6A5ACD}, - const {'name': 'slategray', 'value': 0x708090}, - const {'name': 'slategrey', 'value': 0x708090}, - const {'name': 'snow', 'value': 0xFFFAFA}, - const {'name': 'springgreen', 'value': 0x00FF7F}, - const {'name': 'steelblue', 'value': 0x4682B4}, - const {'name': 'tan', 'value': 0xD2B48C}, - const {'name': 'teal', 'value': 0x008080}, - const {'name': 'thistle', 'value': 0xD8BFD8}, - const {'name': 'tomato', 'value': 0xFF6347}, - const {'name': 'turquoise', 'value': 0x40E0D0}, - const {'name': 'violet', 'value': 0xEE82EE}, - const {'name': 'wheat', 'value': 0xF5DEB3}, - const {'name': 'white', 'value': 0xFFFFFF}, - const {'name': 'whitesmoke', 'value': 0xF5F5F5}, - const {'name': 'yellow', 'value': 0xFFFF00}, - const {'name': 'yellowgreen', 'value': 0x9ACD32}, + static const List _EXTENDED_COLOR_NAMES = [ + {'name': 'aliceblue', 'value': 0xF08FF}, + {'name': 'antiquewhite', 'value': 0xFAEBD7}, + {'name': 'aqua', 'value': 0x00FFFF}, + {'name': 'aquamarine', 'value': 0x7FFFD4}, + {'name': 'azure', 'value': 0xF0FFFF}, + {'name': 'beige', 'value': 0xF5F5DC}, + {'name': 'bisque', 'value': 0xFFE4C4}, + {'name': 'black', 'value': 0x000000}, + {'name': 'blanchedalmond', 'value': 0xFFEBCD}, + {'name': 'blue', 'value': 0x0000FF}, + {'name': 'blueviolet', 'value': 0x8A2BE2}, + {'name': 'brown', 'value': 0xA52A2A}, + {'name': 'burlywood', 'value': 0xDEB887}, + {'name': 'cadetblue', 'value': 0x5F9EA0}, + {'name': 'chartreuse', 'value': 0x7FFF00}, + {'name': 'chocolate', 'value': 0xD2691E}, + {'name': 'coral', 'value': 0xFF7F50}, + {'name': 'cornflowerblue', 'value': 0x6495ED}, + {'name': 'cornsilk', 'value': 0xFFF8DC}, + {'name': 'crimson', 'value': 0xDC143C}, + {'name': 'cyan', 'value': 0x00FFFF}, + {'name': 'darkblue', 'value': 0x00008B}, + {'name': 'darkcyan', 'value': 0x008B8B}, + {'name': 'darkgoldenrod', 'value': 0xB8860B}, + {'name': 'darkgray', 'value': 0xA9A9A9}, + {'name': 'darkgreen', 'value': 0x006400}, + {'name': 'darkgrey', 'value': 0xA9A9A9}, + {'name': 'darkkhaki', 'value': 0xBDB76B}, + {'name': 'darkmagenta', 'value': 0x8B008B}, + {'name': 'darkolivegreen', 'value': 0x556B2F}, + {'name': 'darkorange', 'value': 0xFF8C00}, + {'name': 'darkorchid', 'value': 0x9932CC}, + {'name': 'darkred', 'value': 0x8B0000}, + {'name': 'darksalmon', 'value': 0xE9967A}, + {'name': 'darkseagreen', 'value': 0x8FBC8F}, + {'name': 'darkslateblue', 'value': 0x483D8B}, + {'name': 'darkslategray', 'value': 0x2F4F4F}, + {'name': 'darkslategrey', 'value': 0x2F4F4F}, + {'name': 'darkturquoise', 'value': 0x00CED1}, + {'name': 'darkviolet', 'value': 0x9400D3}, + {'name': 'deeppink', 'value': 0xFF1493}, + {'name': 'deepskyblue', 'value': 0x00BFFF}, + {'name': 'dimgray', 'value': 0x696969}, + {'name': 'dimgrey', 'value': 0x696969}, + {'name': 'dodgerblue', 'value': 0x1E90FF}, + {'name': 'firebrick', 'value': 0xB22222}, + {'name': 'floralwhite', 'value': 0xFFFAF0}, + {'name': 'forestgreen', 'value': 0x228B22}, + {'name': 'fuchsia', 'value': 0xFF00FF}, + {'name': 'gainsboro', 'value': 0xDCDCDC}, + {'name': 'ghostwhite', 'value': 0xF8F8FF}, + {'name': 'gold', 'value': 0xFFD700}, + {'name': 'goldenrod', 'value': 0xDAA520}, + {'name': 'gray', 'value': 0x808080}, + {'name': 'green', 'value': 0x008000}, + {'name': 'greenyellow', 'value': 0xADFF2F}, + {'name': 'grey', 'value': 0x808080}, + {'name': 'honeydew', 'value': 0xF0FFF0}, + {'name': 'hotpink', 'value': 0xFF69B4}, + {'name': 'indianred', 'value': 0xCD5C5C}, + {'name': 'indigo', 'value': 0x4B0082}, + {'name': 'ivory', 'value': 0xFFFFF0}, + {'name': 'khaki', 'value': 0xF0E68C}, + {'name': 'lavender', 'value': 0xE6E6FA}, + {'name': 'lavenderblush', 'value': 0xFFF0F5}, + {'name': 'lawngreen', 'value': 0x7CFC00}, + {'name': 'lemonchiffon', 'value': 0xFFFACD}, + {'name': 'lightblue', 'value': 0xADD8E6}, + {'name': 'lightcoral', 'value': 0xF08080}, + {'name': 'lightcyan', 'value': 0xE0FFFF}, + {'name': 'lightgoldenrodyellow', 'value': 0xFAFAD2}, + {'name': 'lightgray', 'value': 0xD3D3D3}, + {'name': 'lightgreen', 'value': 0x90EE90}, + {'name': 'lightgrey', 'value': 0xD3D3D3}, + {'name': 'lightpink', 'value': 0xFFB6C1}, + {'name': 'lightsalmon', 'value': 0xFFA07A}, + {'name': 'lightseagreen', 'value': 0x20B2AA}, + {'name': 'lightskyblue', 'value': 0x87CEFA}, + {'name': 'lightslategray', 'value': 0x778899}, + {'name': 'lightslategrey', 'value': 0x778899}, + {'name': 'lightsteelblue', 'value': 0xB0C4DE}, + {'name': 'lightyellow', 'value': 0xFFFFE0}, + {'name': 'lime', 'value': 0x00FF00}, + {'name': 'limegreen', 'value': 0x32CD32}, + {'name': 'linen', 'value': 0xFAF0E6}, + {'name': 'magenta', 'value': 0xFF00FF}, + {'name': 'maroon', 'value': 0x800000}, + {'name': 'mediumaquamarine', 'value': 0x66CDAA}, + {'name': 'mediumblue', 'value': 0x0000CD}, + {'name': 'mediumorchid', 'value': 0xBA55D3}, + {'name': 'mediumpurple', 'value': 0x9370DB}, + {'name': 'mediumseagreen', 'value': 0x3CB371}, + {'name': 'mediumslateblue', 'value': 0x7B68EE}, + {'name': 'mediumspringgreen', 'value': 0x00FA9A}, + {'name': 'mediumturquoise', 'value': 0x48D1CC}, + {'name': 'mediumvioletred', 'value': 0xC71585}, + {'name': 'midnightblue', 'value': 0x191970}, + {'name': 'mintcream', 'value': 0xF5FFFA}, + {'name': 'mistyrose', 'value': 0xFFE4E1}, + {'name': 'moccasin', 'value': 0xFFE4B5}, + {'name': 'navajowhite', 'value': 0xFFDEAD}, + {'name': 'navy', 'value': 0x000080}, + {'name': 'oldlace', 'value': 0xFDF5E6}, + {'name': 'olive', 'value': 0x808000}, + {'name': 'olivedrab', 'value': 0x6B8E23}, + {'name': 'orange', 'value': 0xFFA500}, + {'name': 'orangered', 'value': 0xFF4500}, + {'name': 'orchid', 'value': 0xDA70D6}, + {'name': 'palegoldenrod', 'value': 0xEEE8AA}, + {'name': 'palegreen', 'value': 0x98FB98}, + {'name': 'paleturquoise', 'value': 0xAFEEEE}, + {'name': 'palevioletred', 'value': 0xDB7093}, + {'name': 'papayawhip', 'value': 0xFFEFD5}, + {'name': 'peachpuff', 'value': 0xFFDAB9}, + {'name': 'peru', 'value': 0xCD853F}, + {'name': 'pink', 'value': 0xFFC0CB}, + {'name': 'plum', 'value': 0xDDA0DD}, + {'name': 'powderblue', 'value': 0xB0E0E6}, + {'name': 'purple', 'value': 0x800080}, + {'name': 'red', 'value': 0xFF0000}, + {'name': 'rosybrown', 'value': 0xBC8F8F}, + {'name': 'royalblue', 'value': 0x4169E1}, + {'name': 'saddlebrown', 'value': 0x8B4513}, + {'name': 'salmon', 'value': 0xFA8072}, + {'name': 'sandybrown', 'value': 0xF4A460}, + {'name': 'seagreen', 'value': 0x2E8B57}, + {'name': 'seashell', 'value': 0xFFF5EE}, + {'name': 'sienna', 'value': 0xA0522D}, + {'name': 'silver', 'value': 0xC0C0C0}, + {'name': 'skyblue', 'value': 0x87CEEB}, + {'name': 'slateblue', 'value': 0x6A5ACD}, + {'name': 'slategray', 'value': 0x708090}, + {'name': 'slategrey', 'value': 0x708090}, + {'name': 'snow', 'value': 0xFFFAFA}, + {'name': 'springgreen', 'value': 0x00FF7F}, + {'name': 'steelblue', 'value': 0x4682B4}, + {'name': 'tan', 'value': 0xD2B48C}, + {'name': 'teal', 'value': 0x008080}, + {'name': 'thistle', 'value': 0xD8BFD8}, + {'name': 'tomato', 'value': 0xFF6347}, + {'name': 'turquoise', 'value': 0x40E0D0}, + {'name': 'violet', 'value': 0xEE82EE}, + {'name': 'wheat', 'value': 0xF5DEB3}, + {'name': 'white', 'value': 0xFFFFFF}, + {'name': 'whitesmoke', 'value': 0xF5F5F5}, + {'name': 'yellow', 'value': 0xFFFF00}, + {'name': 'yellowgreen', 'value': 0x9ACD32}, ]; // TODO(terry): Should used Dart mirroring for parameter values and types @@ -597,7 +573,7 @@ class TokenKind { static String decimalToHex(int number, [int minDigits = 1]) { final String _HEX_DIGITS = '0123456789abcdef'; - List result = new List(); + List result = List(); int dividend = number >> 4; int remain = number % 16; @@ -608,7 +584,7 @@ class TokenKind { result.add(_HEX_DIGITS[remain]); } - StringBuffer invertResult = new StringBuffer(); + StringBuffer invertResult = StringBuffer(); int paddings = minDigits - result.length; while (paddings-- > 0) { invertResult.write('0'); diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index f68c8798f..fa6642269 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -13,7 +13,7 @@ class Identifier extends TreeNode { Identifier(this.name, SourceSpan span) : super(span); - Identifier clone() => new Identifier(name, span); + Identifier clone() => Identifier(name, span); visit(VisitorBase visitor) => visitor.visitIdentifier(this); @@ -22,7 +22,7 @@ class Identifier extends TreeNode { class Wildcard extends TreeNode { Wildcard(SourceSpan span) : super(span); - Wildcard clone() => new Wildcard(span); + Wildcard clone() => Wildcard(span); visit(VisitorBase visitor) => visitor.visitWildcard(this); String get name => '*'; @@ -30,7 +30,7 @@ class Wildcard extends TreeNode { class ThisOperator extends TreeNode { ThisOperator(SourceSpan span) : super(span); - ThisOperator clone() => new ThisOperator(span); + ThisOperator clone() => ThisOperator(span); visit(VisitorBase visitor) => visitor.visitThisOperator(this); String get name => '&'; @@ -38,7 +38,7 @@ class ThisOperator extends TreeNode { class Negation extends TreeNode { Negation(SourceSpan span) : super(span); - Negation clone() => new Negation(span); + Negation clone() => Negation(span); visit(VisitorBase visitor) => visitor.visitNegation(this); String get name => 'not'; @@ -53,7 +53,7 @@ class CalcTerm extends LiteralTerm { CalcTerm(var value, String t, this.expr, SourceSpan span) : super(value, t, span); - CalcTerm clone() => new CalcTerm(value, text, expr.clone(), span); + CalcTerm clone() => CalcTerm(value, text, expr.clone(), span); visit(VisitorBase visitor) => visitor.visitCalcTerm(this); String toString() => "$text($expr)"; @@ -64,14 +64,14 @@ class CssComment extends TreeNode { final String comment; CssComment(this.comment, SourceSpan span) : super(span); - CssComment clone() => new CssComment(comment, span); + CssComment clone() => CssComment(comment, span); visit(VisitorBase visitor) => visitor.visitCssComment(this); } // CDO/CDC (Comment Definition Open ). class CommentDefinition extends CssComment { CommentDefinition(String comment, SourceSpan span) : super(comment, span); - CommentDefinition clone() => new CommentDefinition(comment, span); + CommentDefinition clone() => CommentDefinition(comment, span); visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); } @@ -80,7 +80,7 @@ class SelectorGroup extends TreeNode { SelectorGroup(this.selectors, SourceSpan span) : super(span); - SelectorGroup clone() => new SelectorGroup(selectors, span); + SelectorGroup clone() => SelectorGroup(selectors, span); visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); } @@ -98,7 +98,7 @@ class Selector extends TreeNode { var simpleSequences = simpleSelectorSequences.map((ss) => ss.clone()).toList(); - return new Selector(simpleSequences, span); + return Selector(simpleSequences, span); } visit(VisitorBase visitor) => visitor.visitSelector(this); @@ -144,7 +144,7 @@ class SimpleSelectorSequence extends TreeNode { } SimpleSelectorSequence clone() => - new SimpleSelectorSequence(simpleSelector, span, combinator); + SimpleSelectorSequence(simpleSelector, span, combinator); visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); @@ -172,7 +172,7 @@ class ElementSelector extends SimpleSelector { ElementSelector(name, SourceSpan span) : super(name, span); visit(VisitorBase visitor) => visitor.visitElementSelector(this); - ElementSelector clone() => new ElementSelector(_name, span); + ElementSelector clone() => ElementSelector(_name, span); String toString() => name; } @@ -191,7 +191,7 @@ class NamespaceSelector extends SimpleSelector { SimpleSelector get nameAsSimpleSelector => _name; - NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span); + NamespaceSelector clone() => NamespaceSelector(_namespace, "", span); visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); @@ -261,7 +261,7 @@ class AttributeSelector extends SimpleSelector { } } - AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span); + AttributeSelector clone() => AttributeSelector(_name, _op, _value, span); visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); @@ -271,7 +271,7 @@ class AttributeSelector extends SimpleSelector { // #id class IdSelector extends SimpleSelector { IdSelector(Identifier name, SourceSpan span) : super(name, span); - IdSelector clone() => new IdSelector(_name, span); + IdSelector clone() => IdSelector(_name, span); visit(VisitorBase visitor) => visitor.visitIdSelector(this); String toString() => "#$_name"; @@ -280,7 +280,7 @@ class IdSelector extends SimpleSelector { // .class class ClassSelector extends SimpleSelector { ClassSelector(Identifier name, SourceSpan span) : super(name, span); - ClassSelector clone() => new ClassSelector(_name, span); + ClassSelector clone() => ClassSelector(_name, span); visit(VisitorBase visitor) => visitor.visitClassSelector(this); String toString() => ".$_name"; @@ -291,7 +291,7 @@ class PseudoClassSelector extends SimpleSelector { PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span); visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); - PseudoClassSelector clone() => new PseudoClassSelector(_name, span); + PseudoClassSelector clone() => PseudoClassSelector(_name, span); String toString() => ":$name"; } @@ -302,11 +302,11 @@ class PseudoElementSelector extends SimpleSelector { final bool isLegacy; PseudoElementSelector(Identifier name, SourceSpan span, - {this.isLegacy: false}) + {this.isLegacy = false}) : super(name, span); visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); - PseudoElementSelector clone() => new PseudoElementSelector(_name, span); + PseudoElementSelector clone() => PseudoElementSelector(_name, span); String toString() => "${isLegacy ? ':' : '::'}$name"; } @@ -319,7 +319,7 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { : super(name, span); PseudoClassFunctionSelector clone() => - new PseudoClassFunctionSelector(_name, _argument, span); + PseudoClassFunctionSelector(_name, _argument, span); TreeNode get argument => _argument; Selector get selector => _argument as Selector; @@ -337,7 +337,7 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { : super(name, span); PseudoElementFunctionSelector clone() => - new PseudoElementFunctionSelector(_name, expression, span); + PseudoElementFunctionSelector(_name, expression, span); visit(VisitorBase visitor) => visitor.visitPseudoElementFunctionSelector(this); @@ -349,8 +349,7 @@ class SelectorExpression extends TreeNode { SelectorExpression(this.expressions, SourceSpan span) : super(span); SelectorExpression clone() { - return new SelectorExpression( - expressions.map((e) => e.clone()).toList(), span); + return SelectorExpression(expressions.map((e) => e.clone()).toList(), span); } visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); @@ -361,9 +360,9 @@ class NegationSelector extends SimpleSelector { final SimpleSelector negationArg; NegationSelector(this.negationArg, SourceSpan span) - : super(new Negation(span), span); + : super(Negation(span), span); - NegationSelector clone() => new NegationSelector(negationArg, span); + NegationSelector clone() => NegationSelector(negationArg, span); visit(VisitorBase visitor) => visitor.visitNegationSelector(this); } @@ -371,7 +370,7 @@ class NegationSelector extends SimpleSelector { class NoOp extends TreeNode { NoOp() : super(null); - NoOp clone() => new NoOp(); + NoOp clone() => NoOp(); visit(VisitorBase visitor) => visitor.visitNoOp(this); } @@ -391,7 +390,7 @@ class StyleSheet extends TreeNode { StyleSheet clone() { var clonedTopLevels = topLevels.map((e) => e.clone()).toList(); - return new StyleSheet(clonedTopLevels, span); + return StyleSheet(clonedTopLevels, span); } visit(VisitorBase visitor) => visitor.visitStyleSheet(this); @@ -399,7 +398,7 @@ class StyleSheet extends TreeNode { class TopLevelProduction extends TreeNode { TopLevelProduction(SourceSpan span) : super(span); - TopLevelProduction clone() => new TopLevelProduction(span); + TopLevelProduction clone() => TopLevelProduction(span); visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); } @@ -416,7 +415,7 @@ class RuleSet extends TopLevelProduction { RuleSet clone() { var cloneSelectorGroup = _selectorGroup.clone(); var cloneDeclarationGroup = _declarationGroup.clone(); - return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); + return RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); } visit(VisitorBase visitor) => visitor.visitRuleSet(this); @@ -428,7 +427,7 @@ class Directive extends TreeNode { bool get isBuiltIn => true; // Known CSS directive? bool get isExtension => false; // SCSS extension? - Directive clone() => new Directive(span); + Directive clone() => Directive(span); visit(VisitorBase visitor) => visitor.visitDirective(this); } @@ -448,7 +447,7 @@ class DocumentDirective extends Directive { for (var rule in groupRuleBody) { clonedGroupRuleBody.add(rule.clone()); } - return new DocumentDirective(clonedFunctions, clonedGroupRuleBody, span); + return DocumentDirective(clonedFunctions, clonedGroupRuleBody, span); } visit(VisitorBase visitor) => visitor.visitDocumentDirective(this); @@ -467,7 +466,7 @@ class SupportsDirective extends Directive { for (var rule in groupRuleBody) { clonedGroupRuleBody.add(rule.clone()); } - return new SupportsDirective(clonedCondition, clonedGroupRuleBody, span); + return SupportsDirective(clonedCondition, clonedGroupRuleBody, span); } visit(VisitorBase visitor) => visitor.visitSupportsDirective(this); @@ -490,7 +489,7 @@ class SupportsConditionInParens extends SupportsCondition { super(span); SupportsConditionInParens clone() => - new SupportsConditionInParens(condition.clone(), span); + SupportsConditionInParens(condition.clone(), span); visit(VisitorBase visitor) => visitor.visitSupportsConditionInParens(this); } @@ -500,7 +499,7 @@ class SupportsNegation extends SupportsCondition { SupportsNegation(this.condition, SourceSpan span) : super(span); - SupportsNegation clone() => new SupportsNegation(condition.clone(), span); + SupportsNegation clone() => SupportsNegation(condition.clone(), span); visit(VisitorBase visitor) => visitor.visitSupportsNegation(this); } @@ -515,7 +514,7 @@ class SupportsConjunction extends SupportsCondition { for (var condition in conditions) { clonedConditions.add(condition.clone()); } - return new SupportsConjunction(clonedConditions, span); + return SupportsConjunction(clonedConditions, span); } visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this); @@ -531,7 +530,7 @@ class SupportsDisjunction extends SupportsCondition { for (var condition in conditions) { clonedConditions.add(condition.clone()); } - return new SupportsDisjunction(clonedConditions, span); + return SupportsDisjunction(clonedConditions, span); } visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this); @@ -545,7 +544,7 @@ class ViewportDirective extends Directive { : super(span); ViewportDirective clone() => - new ViewportDirective(name, declarations.clone(), span); + ViewportDirective(name, declarations.clone(), span); visit(VisitorBase visitor) => visitor.visitViewportDirective(this); } @@ -565,7 +564,7 @@ class ImportDirective extends Directive { for (var mediaQuery in mediaQueries) { cloneMediaQueries.add(mediaQuery.clone()); } - return new ImportDirective(import, cloneMediaQueries, span); + return ImportDirective(import, cloneMediaQueries, span); } visit(VisitorBase visitor) => visitor.visitImportDirective(this); @@ -587,7 +586,7 @@ class MediaExpression extends TreeNode { MediaExpression clone() { var clonedExprs = exprs.clone(); - return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span); + return MediaExpression(andOperator, _mediaFeature, clonedExprs, span); } visit(VisitorBase visitor) => visitor.visitMediaExpression(this); @@ -625,7 +624,7 @@ class MediaQuery extends TreeNode { for (var expr in expressions) { cloneExpressions.add(expr.clone()); } - return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); + return MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); } visit(VisitorBase visitor) => visitor.visitMediaQuery(this); @@ -646,7 +645,7 @@ class MediaDirective extends Directive { for (var rule in rules) { cloneRules.add(rule.clone()); } - return new MediaDirective(cloneQueries, cloneRules, span); + return MediaDirective(cloneQueries, cloneRules, span); } visit(VisitorBase visitor) => visitor.visitMediaDirective(this); @@ -662,7 +661,7 @@ class HostDirective extends Directive { for (var rule in rules) { cloneRules.add(rule.clone()); } - return new HostDirective(cloneRules, span); + return HostDirective(cloneRules, span); } visit(VisitorBase visitor) => visitor.visitHostDirective(this); @@ -682,20 +681,20 @@ class PageDirective extends Directive { for (var declMargin in _declsMargin) { cloneDeclsMargin.add(declMargin.clone()); } - return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span); + return PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span); } visit(VisitorBase visitor) => visitor.visitPageDirective(this); - bool get hasIdent => _ident != null && _ident.length > 0; - bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0; + bool get hasIdent => _ident != null && _ident.isNotEmpty; + bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.isNotEmpty; } class CharsetDirective extends Directive { final String charEncoding; CharsetDirective(this.charEncoding, SourceSpan span) : super(span); - CharsetDirective clone() => new CharsetDirective(charEncoding, span); + CharsetDirective clone() => CharsetDirective(charEncoding, span); visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); } @@ -747,7 +746,7 @@ class KeyFrameBlock extends Expression { : super(span); KeyFrameBlock clone() => - new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); + KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); } @@ -756,8 +755,7 @@ class FontFaceDirective extends Directive { FontFaceDirective(this._declarations, SourceSpan span) : super(span); - FontFaceDirective clone() => - new FontFaceDirective(_declarations.clone(), span); + FontFaceDirective clone() => FontFaceDirective(_declarations.clone(), span); visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); } @@ -776,7 +774,7 @@ class StyletDirective extends Directive { for (var rule in rules) { cloneRules.add(rule.clone()); } - return new StyletDirective(dartClassName, cloneRules, span); + return StyletDirective(dartClassName, cloneRules, span); } visit(VisitorBase visitor) => visitor.visitStyletDirective(this); @@ -791,11 +789,11 @@ class NamespaceDirective extends Directive { NamespaceDirective(this._prefix, this._uri, SourceSpan span) : super(span); - NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); + NamespaceDirective clone() => NamespaceDirective(_prefix, _uri, span); visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); - String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; + String get prefix => _prefix.isNotEmpty ? '$_prefix ' : ''; } /// To support Less syntax @name: expression @@ -804,8 +802,7 @@ class VarDefinitionDirective extends Directive { VarDefinitionDirective(this.def, SourceSpan span) : super(span); - VarDefinitionDirective clone() => - new VarDefinitionDirective(def.clone(), span); + VarDefinitionDirective clone() => VarDefinitionDirective(def.clone(), span); visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); } @@ -823,7 +820,7 @@ class MixinDefinition extends Directive { for (var definedArg in definedArgs) { cloneDefinedArgs.add(definedArg.clone()); } - return new MixinDefinition(name, cloneDefinedArgs, varArgs, span); + return MixinDefinition(name, cloneDefinedArgs, varArgs, span); } visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); @@ -846,7 +843,7 @@ class MixinRulesetDirective extends MixinDefinition { for (var ruleset in rulesets) { clonedRulesets.add(ruleset.clone()); } - return new MixinRulesetDirective( + return MixinRulesetDirective( name, clonedArgs, varArgs, clonedRulesets, span); } @@ -865,7 +862,7 @@ class MixinDeclarationDirective extends MixinDefinition { for (var arg in definedArgs) { clonedArgs.add(arg.clone()); } - return new MixinDeclarationDirective( + return MixinDeclarationDirective( name, clonedArgs, varArgs, declarations.clone(), span); } @@ -884,7 +881,7 @@ class IncludeDirective extends Directive { for (var arg in args) { cloneArgs.add(arg.map((term) => term.clone()).toList()); } - return new IncludeDirective(name, cloneArgs, span); + return IncludeDirective(name, cloneArgs, span); } visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); @@ -915,7 +912,7 @@ class Declaration extends TreeNode { final bool isIE7; Declaration(this._property, this._expression, this.dartStyle, SourceSpan span, - {bool important: false, bool ie7: false}) + {bool important = false, bool ie7 = false}) : this.important = important, this.isIE7 = ie7, super(span); @@ -926,7 +923,7 @@ class Declaration extends TreeNode { bool get hasDartStyle => dartStyle != null; Declaration clone() => - new Declaration(_property.clone(), _expression.clone(), dartStyle, span, + Declaration(_property.clone(), _expression.clone(), dartStyle, span, important: important); visit(VisitorBase visitor) => visitor.visitDeclaration(this); @@ -946,7 +943,7 @@ class VarDefinition extends Declaration { String get definedName => _property.name; - VarDefinition clone() => new VarDefinition( + VarDefinition clone() => VarDefinition( _property.clone(), expression != null ? expression.clone() : null, span); visit(VisitorBase visitor) => visitor.visitVarDefinition(this); @@ -965,7 +962,7 @@ class IncludeMixinAtDeclaration extends Declaration { : super(null, null, null, span); IncludeMixinAtDeclaration clone() => - new IncludeMixinAtDeclaration(include.clone(), span); + IncludeMixinAtDeclaration(include.clone(), span); visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this); } @@ -978,7 +975,7 @@ class ExtendDeclaration extends Declaration { ExtendDeclaration clone() { var newSelector = selectors.map((s) => s.clone()).toList(); - return new ExtendDeclaration(newSelector, span); + return ExtendDeclaration(newSelector, span); } visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); @@ -992,7 +989,7 @@ class DeclarationGroup extends TreeNode { DeclarationGroup clone() { var clonedDecls = declarations.map((d) => d.clone()).toList(); - return new DeclarationGroup(clonedDecls, span); + return DeclarationGroup(clonedDecls, span); } visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); @@ -1004,7 +1001,7 @@ class MarginGroup extends DeclarationGroup { MarginGroup(this.margin_sym, List decls, SourceSpan span) : super(decls, span); MarginGroup clone() => - new MarginGroup(margin_sym, super.clone().declarations, span); + MarginGroup(margin_sym, super.clone().declarations, span); visit(VisitorBase visitor) => visitor.visitMarginGroup(this); } @@ -1019,7 +1016,7 @@ class VarUsage extends Expression { for (var expr in defaultValues) { clonedValues.add(expr.clone()); } - return new VarUsage(name, clonedValues, span); + return VarUsage(name, clonedValues, span); } visit(VisitorBase visitor) => visitor.visitVarUsage(this); @@ -1027,25 +1024,25 @@ class VarUsage extends Expression { class OperatorSlash extends Expression { OperatorSlash(SourceSpan span) : super(span); - OperatorSlash clone() => new OperatorSlash(span); + OperatorSlash clone() => OperatorSlash(span); visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); } class OperatorComma extends Expression { OperatorComma(SourceSpan span) : super(span); - OperatorComma clone() => new OperatorComma(span); + OperatorComma clone() => OperatorComma(span); visit(VisitorBase visitor) => visitor.visitOperatorComma(this); } class OperatorPlus extends Expression { OperatorPlus(SourceSpan span) : super(span); - OperatorPlus clone() => new OperatorPlus(span); + OperatorPlus clone() => OperatorPlus(span); visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); } class OperatorMinus extends Expression { OperatorMinus(SourceSpan span) : super(span); - OperatorMinus clone() => new OperatorMinus(span); + OperatorMinus clone() => OperatorMinus(span); visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); } @@ -1057,7 +1054,7 @@ class UnicodeRangeTerm extends Expression { bool get hasSecond => second != null; - UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span); + UnicodeRangeTerm clone() => UnicodeRangeTerm(first, second, span); visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); } @@ -1071,14 +1068,14 @@ class LiteralTerm extends Expression { LiteralTerm(this.value, this.text, SourceSpan span) : super(span); - LiteralTerm clone() => new LiteralTerm(value, text, span); + LiteralTerm clone() => LiteralTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); } class NumberTerm extends LiteralTerm { NumberTerm(value, String t, SourceSpan span) : super(value, t, span); - NumberTerm clone() => new NumberTerm(value, text, span); + NumberTerm clone() => NumberTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitNumberTerm(this); } @@ -1087,7 +1084,7 @@ class UnitTerm extends LiteralTerm { UnitTerm(value, String t, SourceSpan span, this.unit) : super(value, t, span); - UnitTerm clone() => new UnitTerm(value, text, span, unit); + UnitTerm clone() => UnitTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitUnitTerm(this); @@ -1107,25 +1104,25 @@ class LengthTerm extends UnitTerm { this.unit == TokenKind.UNIT_LENGTH_PT || this.unit == TokenKind.UNIT_LENGTH_PC); } - LengthTerm clone() => new LengthTerm(value, text, span, unit); + LengthTerm clone() => LengthTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitLengthTerm(this); } class PercentageTerm extends LiteralTerm { PercentageTerm(value, String t, SourceSpan span) : super(value, t, span); - PercentageTerm clone() => new PercentageTerm(value, text, span); + PercentageTerm clone() => PercentageTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); } class EmTerm extends LiteralTerm { EmTerm(value, String t, SourceSpan span) : super(value, t, span); - EmTerm clone() => new EmTerm(value, text, span); + EmTerm clone() => EmTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitEmTerm(this); } class ExTerm extends LiteralTerm { ExTerm(value, String t, SourceSpan span) : super(value, t, span); - ExTerm clone() => new ExTerm(value, text, span); + ExTerm clone() => ExTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitExTerm(this); } @@ -1139,7 +1136,7 @@ class AngleTerm extends UnitTerm { this.unit == TokenKind.UNIT_ANGLE_TURN); } - AngleTerm clone() => new AngleTerm(value, text, span, unit); + AngleTerm clone() => AngleTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitAngleTerm(this); } @@ -1152,7 +1149,7 @@ class TimeTerm extends UnitTerm { this.unit == TokenKind.UNIT_TIME_S); } - TimeTerm clone() => new TimeTerm(value, text, span, unit); + TimeTerm clone() => TimeTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitTimeTerm(this); } @@ -1163,21 +1160,21 @@ class FreqTerm extends UnitTerm { assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); } - FreqTerm clone() => new FreqTerm(value, text, span, unit); + FreqTerm clone() => FreqTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitFreqTerm(this); } class FractionTerm extends LiteralTerm { FractionTerm(var value, String t, SourceSpan span) : super(value, t, span); - FractionTerm clone() => new FractionTerm(value, text, span); + FractionTerm clone() => FractionTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitFractionTerm(this); } class UriTerm extends LiteralTerm { UriTerm(String value, SourceSpan span) : super(value, value, span); - UriTerm clone() => new UriTerm(value, span); + UriTerm clone() => UriTerm(value, span); visit(VisitorBase visitor) => visitor.visitUriTerm(this); } @@ -1190,7 +1187,7 @@ class ResolutionTerm extends UnitTerm { unit == TokenKind.UNIT_RESOLUTION_DPPX); } - ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); + ResolutionTerm clone() => ResolutionTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); } @@ -1201,7 +1198,7 @@ class ChTerm extends UnitTerm { assert(unit == TokenKind.UNIT_CH); } - ChTerm clone() => new ChTerm(value, text, span, unit); + ChTerm clone() => ChTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitChTerm(this); } @@ -1212,7 +1209,7 @@ class RemTerm extends UnitTerm { assert(unit == TokenKind.UNIT_REM); } - RemTerm clone() => new RemTerm(value, text, span, unit); + RemTerm clone() => RemTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitRemTerm(this); } @@ -1226,7 +1223,7 @@ class ViewportTerm extends UnitTerm { unit == TokenKind.UNIT_VIEWPORT_VMAX); } - ViewportTerm clone() => new ViewportTerm(value, text, span, unit); + ViewportTerm clone() => ViewportTerm(value, text, span, unit); visit(VisitorBase visitor) => visitor.visitViewportTerm(this); } @@ -1236,7 +1233,7 @@ class BAD_HEX_VALUE {} class HexColorTerm extends LiteralTerm { HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span); - HexColorTerm clone() => new HexColorTerm(value, text, span); + HexColorTerm clone() => HexColorTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); } @@ -1246,7 +1243,7 @@ class FunctionTerm extends LiteralTerm { FunctionTerm(var value, String t, this._params, SourceSpan span) : super(value, t, span); - FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span); + FunctionTerm clone() => FunctionTerm(value, text, _params.clone(), span); visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); } @@ -1255,7 +1252,7 @@ class FunctionTerm extends LiteralTerm { /// browsers. class IE8Term extends LiteralTerm { IE8Term(SourceSpan span) : super('\\9', '\\9', span); - IE8Term clone() => new IE8Term(span); + IE8Term clone() => IE8Term(span); visit(VisitorBase visitor) => visitor.visitIE8Term(this); } @@ -1270,14 +1267,14 @@ class GroupTerm extends Expression { _terms.add(term); } - GroupTerm clone() => new GroupTerm(span); + GroupTerm clone() => GroupTerm(span); visit(VisitorBase visitor) => visitor.visitGroupTerm(this); } class ItemTerm extends NumberTerm { ItemTerm(dynamic value, String t, SourceSpan span) : super(value, t, span); - ItemTerm clone() => new ItemTerm(value, text, span); + ItemTerm clone() => ItemTerm(value, text, span); visit(VisitorBase visitor) => visitor.visitItemTerm(this); } @@ -1291,7 +1288,7 @@ class Expressions extends Expression { } Expressions clone() { - var clonedExprs = new Expressions(span); + var clonedExprs = Expressions(span); for (var expr in expressions) { clonedExprs.add(expr.clone()); } @@ -1308,8 +1305,7 @@ class BinaryExpression extends Expression { BinaryExpression(this.op, this.x, this.y, SourceSpan span) : super(span); - BinaryExpression clone() => - new BinaryExpression(op, x.clone(), y.clone(), span); + BinaryExpression clone() => BinaryExpression(op, x.clone(), y.clone(), span); visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); } @@ -1319,7 +1315,7 @@ class UnaryExpression extends Expression { UnaryExpression(this.op, this.self, SourceSpan span) : super(span); - UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); + UnaryExpression clone() => UnaryExpression(op, self.clone(), span); visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); } @@ -1369,7 +1365,7 @@ class FontExpression extends DartStyleExpression { String style, String variant, LineHeight lineHeight}) - : font = new Font( + : font = Font( size: size is LengthTerm ? size.value : size as num, family: family, weight: weight, @@ -1380,21 +1376,21 @@ class FontExpression extends DartStyleExpression { FontExpression merged(DartStyleExpression newFontExpr) { if (newFontExpr is FontExpression && this.isFont && newFontExpr.isFont) { - return new FontExpression.merge(this, newFontExpr); + return FontExpression.merge(this, newFontExpr); } return null; } /// Merge the two FontExpression and return the result. factory FontExpression.merge(FontExpression x, FontExpression y) { - return new FontExpression._merge(x, y, y.span); + return FontExpression._merge(x, y, y.span); } FontExpression._merge(FontExpression x, FontExpression y, SourceSpan span) - : font = new Font.merge(x.font, y.font), + : font = Font.merge(x.font, y.font), super(DartStyleExpression.fontStyle, span); - FontExpression clone() => new FontExpression(span, + FontExpression clone() => FontExpression(span, size: font.size, family: font.family, weight: font.weight, @@ -1431,7 +1427,7 @@ class MarginExpression extends BoxExpression { /// Margin expression ripped apart. MarginExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.marginStyle, span, - new BoxEdge(left, top, right, bottom)); + BoxEdge(left, top, right, bottom)); MarginExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.marginStyle, span, box); @@ -1440,7 +1436,7 @@ class MarginExpression extends BoxExpression { if (newMarginExpr is MarginExpression && this.isMargin && newMarginExpr.isMargin) { - return new MarginExpression.merge(this, newMarginExpr); + return MarginExpression.merge(this, newMarginExpr); } return null; @@ -1448,14 +1444,14 @@ class MarginExpression extends BoxExpression { /// Merge the two MarginExpressions and return the result. factory MarginExpression.merge(MarginExpression x, MarginExpression y) { - return new MarginExpression._merge(x, y, y.span); + return MarginExpression._merge(x, y, y.span); } MarginExpression._merge( MarginExpression x, MarginExpression y, SourceSpan span) - : super(x._styleType, span, new BoxEdge.merge(x.box, y.box)); + : super(x._styleType, span, BoxEdge.merge(x.box, y.box)); - MarginExpression clone() => new MarginExpression(span, + MarginExpression clone() => MarginExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); visit(VisitorBase visitor) => visitor.visitMarginExpression(this); @@ -1465,7 +1461,7 @@ class BorderExpression extends BoxExpression { /// Border expression ripped apart. BorderExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.borderStyle, span, - new BoxEdge(left, top, right, bottom)); + BoxEdge(left, top, right, bottom)); BorderExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.borderStyle, span, box); @@ -1474,7 +1470,7 @@ class BorderExpression extends BoxExpression { if (newBorderExpr is BorderExpression && this.isBorder && newBorderExpr.isBorder) { - return new BorderExpression.merge(this, newBorderExpr); + return BorderExpression.merge(this, newBorderExpr); } return null; @@ -1482,15 +1478,15 @@ class BorderExpression extends BoxExpression { /// Merge the two BorderExpression and return the result. factory BorderExpression.merge(BorderExpression x, BorderExpression y) { - return new BorderExpression._merge(x, y, y.span); + return BorderExpression._merge(x, y, y.span); } BorderExpression._merge( BorderExpression x, BorderExpression y, SourceSpan span) - : super(DartStyleExpression.borderStyle, span, - new BoxEdge.merge(x.box, y.box)); + : super( + DartStyleExpression.borderStyle, span, BoxEdge.merge(x.box, y.box)); - BorderExpression clone() => new BorderExpression(span, + BorderExpression clone() => BorderExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); visit(VisitorBase visitor) => visitor.visitBorderExpression(this); @@ -1512,7 +1508,7 @@ class HeightExpression extends DartStyleExpression { return null; } - HeightExpression clone() => new HeightExpression(span, height); + HeightExpression clone() => HeightExpression(span, height); visit(VisitorBase visitor) => visitor.visitHeightExpression(this); } @@ -1532,7 +1528,7 @@ class WidthExpression extends DartStyleExpression { return null; } - WidthExpression clone() => new WidthExpression(span, width); + WidthExpression clone() => WidthExpression(span, width); visit(VisitorBase visitor) => visitor.visitWidthExpression(this); } @@ -1540,7 +1536,7 @@ class PaddingExpression extends BoxExpression { /// Padding expression ripped apart. PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left}) : super(DartStyleExpression.paddingStyle, span, - new BoxEdge(left, top, right, bottom)); + BoxEdge(left, top, right, bottom)); PaddingExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.paddingStyle, span, box); @@ -1549,7 +1545,7 @@ class PaddingExpression extends BoxExpression { if (newPaddingExpr is PaddingExpression && this.isPadding && newPaddingExpr.isPadding) { - return new PaddingExpression.merge(this, newPaddingExpr); + return PaddingExpression.merge(this, newPaddingExpr); } return null; @@ -1557,15 +1553,15 @@ class PaddingExpression extends BoxExpression { /// Merge the two PaddingExpression and return the result. factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) { - return new PaddingExpression._merge(x, y, y.span); + return PaddingExpression._merge(x, y, y.span); } PaddingExpression._merge( PaddingExpression x, PaddingExpression y, SourceSpan span) : super(DartStyleExpression.paddingStyle, span, - new BoxEdge.merge(x.box, y.box)); + BoxEdge.merge(x.box, y.box)); - PaddingExpression clone() => new PaddingExpression(span, + PaddingExpression clone() => PaddingExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); } diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index f662a7cc5..8338ad3ee 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -18,8 +18,8 @@ abstract class TreeNode { /// A multiline string showing the node and its children. String toDebugString() { - var to = new TreeOutput(); - var tp = new _TreePrinter(to, true); + var to = TreeOutput(); + var tp = _TreePrinter(to, true); this.visit(tp); return to.buf.toString(); } @@ -33,7 +33,7 @@ abstract class Expression extends TreeNode { /// Simple class to provide a textual dump of trees for debugging. class TreeOutput { int depth = 0; - final StringBuffer buf = new StringBuffer(); + final StringBuffer buf = StringBuffer(); VisitorBase printer; void write(String s) { diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 6aad40c65..23710153f 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -8,8 +8,8 @@ part of csslib.visitor; /// Helper function to dump the CSS AST. String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) { - var to = new TreeOutput(); - new _TreePrinter(to, useSpan)..visitTree(styleSheet); + var to = TreeOutput(); + _TreePrinter(to, useSpan)..visitTree(styleSheet); return to.toString(); } diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index 72f14e0ed..6e903b64f 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -22,7 +22,7 @@ class Validate { (selector.isCombinatorNone && matches == 0)) { if (matches < 0) { String tooMany = selector.simpleSelector.toString(); - throw new CssSelectorException( + throw CssSelectorException( 'Can not mix Id selector with class selector(s). Id ' 'selector must be singleton too many starting at $tooMany'); } @@ -30,7 +30,7 @@ class Validate { return matches + 1; } else { String error = selector.toString(); - throw new CssSelectorException( + throw CssSelectorException( 'Selectors can not have combinators (>, +, or ~) before $error'); } } @@ -41,11 +41,11 @@ class Validate { return -1; } else if (selector.isCombinatorDescendant) { String tooMany = selector.simpleSelector.toString(); - throw new CssSelectorException( + throw CssSelectorException( 'Use of Id selector must be singleton starting at $tooMany'); } else { String error = selector.simpleSelector.toString(); - throw new CssSelectorException( + throw CssSelectorException( 'Selectors can not have combinators (>, +, or ~) before $error'); } } @@ -105,13 +105,12 @@ class Validate { } } else { String badSelector = simpleSelector.toString(); - throw new CssSelectorException( - 'Invalid template selector $badSelector'); + throw CssSelectorException('Invalid template selector $badSelector'); } if (!found) { String unknownName = simpleSelector.toString(); - throw new CssSelectorException('Unknown selector name $unknownName'); + throw CssSelectorException('Unknown selector name $unknownName'); } } } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index e2f1f044c..7b411cde3 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -436,12 +436,12 @@ class Visitor implements VisitorBase { visitBinaryExpression(BinaryExpression node) { // TODO(terry): TBD - throw new UnimplementedError(); + throw UnimplementedError(); } visitUnaryExpression(UnaryExpression node) { // TODO(terry): TBD - throw new UnimplementedError(); + throw UnimplementedError(); } visitIdentifier(Identifier node) {} @@ -456,36 +456,36 @@ class Visitor implements VisitorBase { visitFontExpression(FontExpression node) { // TODO(terry): TBD - throw new UnimplementedError(); + throw UnimplementedError(); } visitBoxExpression(BoxExpression node) { // TODO(terry): TBD - throw new UnimplementedError(); + throw UnimplementedError(); } visitMarginExpression(MarginExpression node) { // TODO(terry): TBD - throw new UnimplementedError(); + throw UnimplementedError(); } visitBorderExpression(BorderExpression node) { // TODO(terry): TBD - throw new UnimplementedError(); + throw UnimplementedError(); } visitHeightExpression(HeightExpression node) { // TODO(terry): TB - throw new UnimplementedError(); + throw UnimplementedError(); } visitPaddingExpression(PaddingExpression node) { // TODO(terry): TBD - throw new UnimplementedError(); + throw UnimplementedError(); } visitWidthExpression(WidthExpression node) { // TODO(terry): TBD - throw new UnimplementedError(); + throw UnimplementedError(); } } diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 4f6a9e26f..c928dbd61 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -6,7 +6,7 @@ author: Dart Team homepage: https://github.com/dart-lang/csslib environment: - sdk: '>=2.0.0-dev.17.0 <3.0.0' + sdk: '>=2.0.0 <3.0.0' dependencies: args: ^1.4.3 @@ -15,4 +15,5 @@ dependencies: source_span: ^1.4.0 dev_dependencies: + pedantic: ^1.0.0 test: ^1.2.0 diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index 7df68c577..78c29940b 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -199,13 +199,13 @@ input.second + label { } ''', '.btn > .btn, ' - 'input.second + label > .btn, ' - '.btn > input.second + label, ' - 'input.second + label > input.second + label, ' - 'input.second + label > input.second + label {\n' - ' margin-left: 5px;\n}\n' - 'input.second + label {\n' - '}'); + 'input.second + label > .btn, ' + '.btn > input.second + label, ' + 'input.second + label > input.second + label, ' + 'input.second + label > input.second + label {\n' + ' margin-left: 5px;\n}\n' + 'input.second + label {\n' + '}'); // TODO(terry): Optimize merge selectors would be: // @@ -226,13 +226,13 @@ input.second + label { } ''', '.btn + .btn, ' - 'input.second + label + .btn, ' - '.btn + input.second + label, ' - 'input.second + label + input.second + label, ' - 'input.second + label + input.second + label {\n' - ' margin-left: 5px;\n}\n' - 'input.second + label {\n' - ' color: #00f;\n}'); + 'input.second + label + .btn, ' + '.btn + input.second + label, ' + 'input.second + label + input.second + label, ' + 'input.second + label + input.second + label {\n' + ' margin-left: 5px;\n}\n' + 'input.second + label {\n' + ' color: #00f;\n}'); } main() { diff --git a/pkgs/csslib/test/samples_test.dart b/pkgs/csslib/test/samples_test.dart index 4607a0503..40595432d 100644 --- a/pkgs/csslib/test/samples_test.dart +++ b/pkgs/csslib/test/samples_test.dart @@ -7,7 +7,7 @@ import 'dart:mirrors'; import 'package:test/test.dart'; import 'package:csslib/parser.dart'; -const testOptions = const PreprocessorOptions( +const testOptions = PreprocessorOptions( useColors: false, checked: false, warningsAsErrors: true, @@ -24,7 +24,7 @@ void testCSSFile(File cssFile) { main() { final libraryUri = currentMirrorSystem().findLibrary(#samples_test).uri; - final cssDir = new Directory.fromUri(libraryUri.resolve('examples')); + final cssDir = Directory.fromUri(libraryUri.resolve('examples')); for (var element in cssDir.listSync()) if (element is File && element.uri.pathSegments.last.endsWith('.css')) { test(element.uri.pathSegments.last, () => testCSSFile(element)); diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 33dbe7c7c..28b707dbc 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -12,16 +12,16 @@ import 'package:csslib/src/options.dart'; export 'package:csslib/src/options.dart'; -const simpleOptionsWithCheckedAndWarningsAsErrors = const PreprocessorOptions( +const simpleOptionsWithCheckedAndWarningsAsErrors = PreprocessorOptions( useColors: false, checked: true, warningsAsErrors: true, inputFile: 'memory'); const simpleOptions = - const PreprocessorOptions(useColors: false, inputFile: 'memory'); + PreprocessorOptions(useColors: false, inputFile: 'memory'); -const options = const PreprocessorOptions( +const options = PreprocessorOptions( useColors: false, warningsAsErrors: true, inputFile: 'memory'); /// Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, @@ -40,8 +40,8 @@ StyleSheet parseCss(String cssInput, StyleSheet compileCss(String cssInput, {List errors, PreprocessorOptions opts, - bool polyfill: false, - List includes: null}) => + bool polyfill = false, + List includes}) => compile(cssInput, errors: errors, options: @@ -54,10 +54,10 @@ StyleSheet polyFillCompileCss(input, compileCss(input, errors: errors, polyfill: true, opts: opts); /// CSS emitter walks the style sheet tree and emits readable CSS. -final _emitCss = new CssPrinter(); +final _emitCss = CssPrinter(); /// Simple Visitor does nothing but walk tree. -final _cssVisitor = new Visitor(); +final _cssVisitor = Visitor(); /// Pretty printer for CSS. String prettyPrint(StyleSheet ss) { diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index 02784c404..b82ac6bcd 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -12,7 +12,7 @@ import 'testing.dart'; class ClassVisitor extends Visitor { final List expectedClasses; - final Set foundClasses = new Set(); + final Set foundClasses = Set(); ClassVisitor(this.expectedClasses); @@ -42,7 +42,7 @@ void testClassVisitors() { expect(s != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - var clsVisits = new ClassVisitor(['foobar'])..visitTree(s); + var clsVisits = ClassVisitor(['foobar'])..visitTree(s); expect(clsVisits.matches, true); in1 = ''' @@ -56,8 +56,7 @@ void testClassVisitors() { expect(s != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - clsVisits = new ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello']) - ..visitTree(s); + clsVisits = ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello'])..visitTree(s); expect(clsVisits.matches, true); expect(prettyPrint(s), r''' @@ -82,7 +81,7 @@ class PolyfillEmitter extends CssPrinter { } String polyfillPrint(String prefix, StyleSheet ss) => - (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString(); + (PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString(); void testPolyFill() { var errors = []; From b7779524d5a3269690c07024f525129630ba467f Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 10 Apr 2019 12:56:09 -0700 Subject: [PATCH 137/245] Remove args and logging deps, along with other cleanup (dart-lang/csslib#90) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove args, logging, path deps – along with binary and lib Related to https://github.com/dart-lang/sdk/issues/35802 * require a more recent Dart SDK --- pkgs/csslib/.travis.yml | 4 +- pkgs/csslib/CHANGELOG.md | 9 ++ pkgs/csslib/bin/css.dart | 9 -- pkgs/csslib/lib/css.dart | 146 ------------------ pkgs/csslib/lib/parser.dart | 12 +- pkgs/csslib/lib/src/analyzer.dart | 2 +- pkgs/csslib/lib/src/css_printer.dart | 2 +- pkgs/csslib/lib/src/messages.dart | 64 ++++---- pkgs/csslib/lib/src/polyfill.dart | 2 +- ...options.dart => preprocessor_options.dart} | 2 - pkgs/csslib/lib/src/property.dart | 2 +- pkgs/csslib/lib/src/token.dart | 2 +- .../src/{tokenkind.dart => token_kind.dart} | 2 +- pkgs/csslib/lib/src/tokenizer.dart | 2 +- pkgs/csslib/lib/src/tokenizer_base.dart | 2 +- pkgs/csslib/lib/src/tree.dart | 2 +- pkgs/csslib/lib/src/tree_base.dart | 2 +- pkgs/csslib/lib/src/tree_printer.dart | 2 +- pkgs/csslib/lib/src/validate.dart | 2 - pkgs/csslib/lib/visitor.dart | 2 - pkgs/csslib/pubspec.yaml | 7 +- pkgs/csslib/test/testing.dart | 4 +- 22 files changed, 60 insertions(+), 223 deletions(-) delete mode 100644 pkgs/csslib/bin/css.dart delete mode 100644 pkgs/csslib/lib/css.dart rename pkgs/csslib/lib/src/{options.dart => preprocessor_options.dart} (98%) rename pkgs/csslib/lib/src/{tokenkind.dart => token_kind.dart} (99%) diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml index 8681e297d..f6e2d7b89 100644 --- a/pkgs/csslib/.travis.yml +++ b/pkgs/csslib/.travis.yml @@ -1,7 +1,7 @@ language: dart dart: - - 2.0.0 + - 2.1.0 - dev dart_task: @@ -12,7 +12,7 @@ matrix: include: - dart: dev dartanalyzer: --fatal-infos --fatal-warnings . - - dart: stable + - dart: 2.1.0 dartanalyzer: --fatal-warnings . - dart: dev dart_task: dartfmt diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 381b38a33..bb8ea795c 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,12 @@ +## 0.15.0 + +- **BREAKING** + - Removed `css` executable from `bin` directory. + - Removed the deprecated `css.dart` library. + - `Message.level` is now of type `MessageLevel` defined in this package. +- Removed dependencies on `package:args` and `package:logging`. +- Require Dart SDK `>=2.1.0`. + ## 0.14.6 * Removed whitespace between comma-delimited expressions in compact output. diff --git a/pkgs/csslib/bin/css.dart b/pkgs/csslib/bin/css.dart deleted file mode 100644 index 1aae7a835..000000000 --- a/pkgs/csslib/bin/css.dart +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env dart -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// ignore: deprecated_member_use_from_same_package -import 'package:csslib/css.dart' as css; - -void main(List args) => css.main(args); diff --git a/pkgs/csslib/lib/css.dart b/pkgs/csslib/lib/css.dart deleted file mode 100644 index ac6510b7b..000000000 --- a/pkgs/csslib/lib/css.dart +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -@Deprecated('Will be removed in v0.15.0') -library css; - -import 'dart:io'; - -import 'package:args/args.dart'; -import 'package:path/path.dart' as path; -import 'package:source_span/source_span.dart'; - -import 'parser.dart'; -import 'src/messages.dart'; -import 'visitor.dart'; - -void main(List arguments) { - // TODO(jmesserly): fix this to return a proper exit code - var options = _parseOptions(arguments); - if (options == null) return; - - messages = Messages(options: options); - - _time('Total time spent on ${options.inputFile}', () { - _compile(options.inputFile, options.verbose); - }, true); -} - -void _compile(String inputPath, bool verbose) { - var ext = path.extension(inputPath); - if (ext != '.css' && ext != '.scss') { - messages.error("Please provide a CSS/Sass file", null); - return; - } - try { - // Read the file. - var filename = path.basename(inputPath); - var contents = File(inputPath).readAsStringSync(); - var file = SourceFile.fromString(contents, url: path.toUri(inputPath)); - - // Parse the CSS. - StyleSheet tree = - _time('Parse $filename', () => Parser(file, contents).parse(), verbose); - - _time('Analyzer $filename', () => Analyzer([tree], messages), verbose) - .run(); - - // Emit the processed CSS. - var emitter = CssPrinter(); - _time('Codegen $filename', () => emitter.visitTree(tree, pretty: true), - verbose); - - // Write the contents to a file. - var outPath = path.join(path.dirname(inputPath), '_$filename'); - File(outPath).writeAsStringSync(emitter.toString()); - } catch (e) { - messages.error('error processing $inputPath. Original message:\n $e', null); - } -} - -T _time(String message, T Function() callback, bool printTime) { - if (!printTime) return callback(); - final watch = Stopwatch(); - watch.start(); - var result = callback(); - watch.stop(); - final duration = watch.elapsedMilliseconds; - _printMessage(message, duration); - return result; -} - -void _printMessage(String message, int duration) { - var buf = StringBuffer(); - buf.write(message); - for (int i = message.length; i < 60; i++) buf.write(' '); - buf.write(' -- '); - if (duration < 10) buf.write(' '); - if (duration < 100) buf.write(' '); - buf..write(duration)..write(' ms'); - print(buf.toString()); -} - -PreprocessorOptions _fromArgs(ArgResults args) => PreprocessorOptions( - warningsAsErrors: args['warnings_as_errors'], - throwOnWarnings: args['throw_on_warnings'], - throwOnErrors: args['throw_on_errors'], - verbose: args['verbose'], - checked: args['checked'], - lessSupport: args['less'], - useColors: args['colors'], - polyfill: args['polyfill'], - inputFile: args.rest.isNotEmpty ? args.rest[0] : null); - -// tool.dart [options...] -PreprocessorOptions _parseOptions(List arguments) { - var parser = ArgParser() - ..addFlag('verbose', - abbr: 'v', - defaultsTo: false, - negatable: false, - help: 'Display detail info') - ..addFlag('checked', - defaultsTo: false, - negatable: false, - help: 'Validate CSS values invalid value display a warning message') - ..addFlag('less', - defaultsTo: true, - negatable: true, - help: 'Supports subset of Less syntax') - ..addFlag('suppress_warnings', - defaultsTo: true, help: 'Warnings not displayed') - ..addFlag('warnings_as_errors', - defaultsTo: false, help: 'Warning handled as errors') - ..addFlag('throw_on_errors', - defaultsTo: false, help: 'Throw on errors encountered') - ..addFlag('throw_on_warnings', - defaultsTo: false, help: 'Throw on warnings encountered') - ..addFlag('colors', - defaultsTo: true, help: 'Display errors/warnings in colored text') - ..addFlag('polyfill', - defaultsTo: false, help: 'Generate polyfill for new CSS features') - ..addFlag('help', - abbr: 'h', - defaultsTo: false, - negatable: false, - help: 'Displays this help message'); - - try { - var results = parser.parse(arguments); - if (results['help'] || results.rest.isEmpty) { - _showUsage(parser); - return null; - } - return _fromArgs(results); - } on FormatException catch (e) { - print(e.message); - _showUsage(parser); - return null; - } -} - -void _showUsage(ArgParser parser) { - print('Usage: css [options...] input.css'); - print(parser.usage); -} diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 768068304..5fca9105a 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2,26 +2,24 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library csslib.parser; - import 'dart:math' as math; import 'package:source_span/source_span.dart'; import 'src/messages.dart'; -import 'src/options.dart'; +import 'src/preprocessor_options.dart'; import 'visitor.dart'; -export 'src/messages.dart' show Message; -export 'src/options.dart'; +export 'src/messages.dart' show Message, MessageLevel; +export 'src/preprocessor_options.dart'; part 'src/analyzer.dart'; part 'src/polyfill.dart'; part 'src/property.dart'; part 'src/token.dart'; -part 'src/tokenizer_base.dart'; +part 'src/token_kind.dart'; part 'src/tokenizer.dart'; -part 'src/tokenkind.dart'; +part 'src/tokenizer_base.dart'; enum ClauseType { none, diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 6421c6e4a..5f34da546 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of csslib.parser; +part of '../parser.dart'; // TODO(terry): Add optimizing phase to remove duplicated selectors in the same // selector group (e.g., .btn, .btn { color: red; }). Also, look diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 552f25e3d..a95fa342f 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of csslib.visitor; +part of '../visitor.dart'; /// Visitor that produces a formatted string representation of the CSS tree. class CssPrinter extends Visitor { diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 17d1acf7f..edc72d89e 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -2,12 +2,11 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library csslib.src.messages; - -import 'package:logging/logging.dart' show Level; import 'package:source_span/source_span.dart'; -import 'options.dart'; +import 'preprocessor_options.dart'; + +enum MessageLevel { info, warning, severe } // TODO(terry): Remove the global messages, use some object that tracks // compilation state. @@ -16,32 +15,28 @@ import 'options.dart'; Messages messages; // Color constants used for generating messages. -final String GREEN_COLOR = '\u001b[32m'; -final String RED_COLOR = '\u001b[31m'; -final String MAGENTA_COLOR = '\u001b[35m'; -final String NO_COLOR = '\u001b[0m'; +const _greenColor = '\u001b[32m'; +const _redColor = '\u001b[31m'; +const _magentaColor = '\u001b[35m'; +const _noColor = '\u001b[0m'; /// Map between error levels and their display color. -final Map _ERROR_COLORS = (() { - var colorsMap = Map(); - colorsMap[Level.SEVERE] = RED_COLOR; - colorsMap[Level.WARNING] = MAGENTA_COLOR; - colorsMap[Level.INFO] = GREEN_COLOR; - return colorsMap; -})(); +const Map _errorColors = { + MessageLevel.severe: _redColor, + MessageLevel.warning: _magentaColor, + MessageLevel.info: _greenColor, +}; /// Map between error levels and their friendly name. -final Map _ERROR_LABEL = (() { - var labels = Map(); - labels[Level.SEVERE] = 'error'; - labels[Level.WARNING] = 'warning'; - labels[Level.INFO] = 'info'; - return labels; -})(); +const Map _errorLabel = { + MessageLevel.severe: 'error', + MessageLevel.warning: 'warning', + MessageLevel.info: 'info', +}; /// A single message from the compiler. class Message { - final Level level; + final MessageLevel level; final String message; final SourceSpan span; final bool useColors; @@ -52,11 +47,11 @@ class Message { String toString() { var output = StringBuffer(); - bool colors = useColors && _ERROR_COLORS.containsKey(level); - var levelColor = colors ? _ERROR_COLORS[level] : null; + bool colors = useColors && _errorColors.containsKey(level); + var levelColor = colors ? _errorColors[level] : null; if (colors) output.write(levelColor); - output..write(_ERROR_LABEL[level])..write(' '); - if (colors) output.write(NO_COLOR); + output..write(_errorLabel[level])..write(' '); + if (colors) output.write(_noColor); if (span == null) { output.write(message); @@ -69,13 +64,11 @@ class Message { } } -typedef PrintHandler = void Function(Message obj); - /// This class tracks and prints information, warnings, and errors emitted by /// the compiler. class Messages { /// Called on every error. Set to blank function to supress printing. - final PrintHandler printHandler; + final void Function(Message obj) printHandler; final PreprocessorOptions options; @@ -86,7 +79,7 @@ class Messages { /// Report a compile-time CSS error. void error(String message, SourceSpan span) { - var msg = Message(Level.SEVERE, message, + var msg = Message(MessageLevel.severe, message, span: span, useColors: options.useColors); messages.add(msg); @@ -99,7 +92,7 @@ class Messages { if (options.warningsAsErrors) { error(message, span); } else { - var msg = Message(Level.WARNING, message, + var msg = Message(MessageLevel.warning, message, span: span, useColors: options.useColors); messages.add(msg); @@ -108,8 +101,8 @@ class Messages { /// Report and informational message about what the compiler is doing. void info(String message, SourceSpan span) { - var msg = - Message(Level.INFO, message, span: span, useColors: options.useColors); + var msg = Message(MessageLevel.info, message, + span: span, useColors: options.useColors); messages.add(msg); @@ -120,7 +113,8 @@ class Messages { void mergeMessages(Messages newMessages) { messages.addAll(newMessages.messages); newMessages.messages - .where((message) => message.level == Level.SEVERE || options.verbose) + .where((message) => + message.level == MessageLevel.severe || options.verbose) .forEach(printHandler); } } diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index c8a01f1a9..d9c1b736b 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of csslib.parser; +part of '../parser.dart'; /// CSS polyfill emits CSS to be understood by older parsers that which do not /// understand (var, calc, etc.). diff --git a/pkgs/csslib/lib/src/options.dart b/pkgs/csslib/lib/src/preprocessor_options.dart similarity index 98% rename from pkgs/csslib/lib/src/options.dart rename to pkgs/csslib/lib/src/preprocessor_options.dart index 3300cf610..8df2680f9 100644 --- a/pkgs/csslib/lib/src/options.dart +++ b/pkgs/csslib/lib/src/preprocessor_options.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library csslib.src.options; - class PreprocessorOptions { /// Generate polyfill code (e.g., var, etc.) final bool polyfill; diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index de7476078..01fc96bb7 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -4,7 +4,7 @@ /// Representations of CSS styles. -part of csslib.parser; +part of '../parser.dart'; // TODO(terry): Prune down this file we do need some of the code in this file // for darker, lighter, how to represent a Font, etc but alot of diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index 873c217ef..f29850fff 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of csslib.parser; +part of '../parser.dart'; /// A single token in the Dart language. class Token { diff --git a/pkgs/csslib/lib/src/tokenkind.dart b/pkgs/csslib/lib/src/token_kind.dart similarity index 99% rename from pkgs/csslib/lib/src/tokenkind.dart rename to pkgs/csslib/lib/src/token_kind.dart index af6233e31..ec92170c9 100644 --- a/pkgs/csslib/lib/src/tokenkind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of csslib.parser; +part of '../parser.dart'; // TODO(terry): Need to be consistent with tokens either they're ASCII tokens // e.g., ASTERISK or they're CSS e.g., PSEUDO, COMBINATOR_*. diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index a09e306bd..724f5b7ac 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of csslib.parser; +part of '../parser.dart'; class Tokenizer extends TokenizerBase { /// U+ prefix for unicode characters. diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index a8567273a..a12471d89 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. // Generated by scripts/tokenizer_gen.py. -part of csslib.parser; +part of '../parser.dart'; /// Tokenizer state to support look ahead for Less' nested selectors. class TokenizerState { diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index fa6642269..be5aff150 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of csslib.visitor; +part of '../visitor.dart'; ///////////////////////////////////////////////////////////////////////// // CSS specific types: diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 8338ad3ee..d8fee1d70 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of csslib.visitor; +part of '../visitor.dart'; /// The base type for all nodes in a CSS abstract syntax tree. abstract class TreeNode { diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 23710153f..6ed6962d0 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -2,7 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of csslib.visitor; +part of '../visitor.dart'; // TODO(terry): Enable class for debug only; when conditional imports enabled. diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index 6e903b64f..e6d66f24a 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library csslib.src.validate; - import 'package:csslib/visitor.dart'; import 'package:source_span/source_span.dart'; diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 7b411cde3..e21cff7c9 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library csslib.visitor; - import 'package:source_span/source_span.dart'; import 'parser.dart'; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index c928dbd61..2922e0b24 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,17 +1,14 @@ name: csslib -version: 0.14.6 +version: 0.15.0-dev description: A library for parsing CSS. author: Dart Team homepage: https://github.com/dart-lang/csslib environment: - sdk: '>=2.0.0 <3.0.0' + sdk: '>=2.1.0 <3.0.0' dependencies: - args: ^1.4.3 - logging: ^0.11.3 - path: ^1.6.1 source_span: ^1.4.0 dev_dependencies: diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 28b707dbc..345e5b63f 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -8,9 +8,9 @@ library testing; import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; import 'package:csslib/src/messages.dart'; -import 'package:csslib/src/options.dart'; +import 'package:csslib/src/preprocessor_options.dart'; -export 'package:csslib/src/options.dart'; +export 'package:csslib/src/preprocessor_options.dart'; const simpleOptionsWithCheckedAndWarningsAsErrors = PreprocessorOptions( useColors: false, From c886dea401f98f22013d6a165b08ce4958966c91 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 10 Apr 2019 17:03:32 -0700 Subject: [PATCH 138/245] prepare to publish --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 2922e0b24..b2802bab0 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.15.0-dev +version: 0.15.0 description: A library for parsing CSS. author: Dart Team From a0a41bda191b0eebbc630b590bf47e2240dec2ed Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 10 Apr 2019 17:31:31 -0700 Subject: [PATCH 139/245] Fix readme --- pkgs/csslib/README.md | 34 ++++------------------------------ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 31 deletions(-) diff --git a/pkgs/csslib/README.md b/pkgs/csslib/README.md index 8a71da492..9bbb2e561 100644 --- a/pkgs/csslib/README.md +++ b/pkgs/csslib/README.md @@ -1,17 +1,9 @@ -CSS parser library for Dart -========================== +A Dart [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) parser. -This is a [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) parser written entirely in [Dart][dart]. -It can be used in the client/server/command line. - -This package is installed with [Pub][pub], see: -[install instructions](https://pub.dartlang.org/packages/csslib#installing) -for this package. - -Usage ------ +## Usage Parsing CSS is easy! + ```dart import 'package:csslib/parser.dart'; @@ -22,22 +14,4 @@ main() { } ``` -You can pass a String or list of bytes to `parse`. - - -Running Tests -------------- - -Basic tests can be found in this repository: -```bash -pub run test -``` - -The full CSS test suite can be found in https://github.com/dart-lang/csslib-test-suite -```bash -cd ../csslib-test-suite -./run.sh -``` - -[dart]: http://www.dartlang.org/ -[pub]: http://www.dartlang.org/docs/pub-package-manager/ +You can pass a `String` or `List` to `parse`. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index b2802bab0..1459b6acc 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.15.0 +version: 0.15.1-dev description: A library for parsing CSS. author: Dart Team From 7784f79284c8578649a8accc5c44eeb6cfbc39ba Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 24 Apr 2019 13:35:00 -0700 Subject: [PATCH 140/245] Remove support for shadow-piercing combinators The parser no longer supports the `/deep/` and `>>>` combinators that were historically used to pierce shadow boundaries. These combinators have since been removed from the Shadow DOM specification. --- pkgs/csslib/CHANGELOG.md | 5 +++++ pkgs/csslib/lib/parser.dart | 19 +------------------ pkgs/csslib/lib/src/token_kind.dart | 4 +--- pkgs/csslib/lib/src/tree.dart | 7 ------- pkgs/csslib/lib/src/tree_printer.dart | 4 ---- pkgs/csslib/test/selector_test.dart | 8 -------- 6 files changed, 7 insertions(+), 40 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index bb8ea795c..162975fa1 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.16.0 + +- Removed support for the shadow-piercing comibnators `/deep/` and `>>>`. These + were dropped from the Shadow DOM specification. + ## 0.15.0 - **BREAKING** diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 5fca9105a..72e6e885c 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1374,30 +1374,13 @@ class _Parser { combinatorType = TokenKind.COMBINATOR_PLUS; break; case TokenKind.GREATER: - // Parse > or >>> _eat(TokenKind.GREATER); - if (_maybeEat(TokenKind.GREATER)) { - _eat(TokenKind.GREATER); - combinatorType = TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT; - } else { - combinatorType = TokenKind.COMBINATOR_GREATER; - } + combinatorType = TokenKind.COMBINATOR_GREATER; break; case TokenKind.TILDE: _eat(TokenKind.TILDE); combinatorType = TokenKind.COMBINATOR_TILDE; break; - case TokenKind.SLASH: - // Parse /deep/ - _eat(TokenKind.SLASH); - var ate = _maybeEat(TokenKind.IDENTIFIER); - var tok = ate ? _previousToken : _peekToken; - if (!(ate && tok.text == 'deep')) { - _error('expected deep, but found ${tok.text}', tok.span); - } - _eat(TokenKind.SLASH); - combinatorType = TokenKind.COMBINATOR_DEEP; - break; case TokenKind.AMPERSAND: _eat(TokenKind.AMPERSAND); thisOperator = true; diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index ec92170c9..f9e6da0b3 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -100,10 +100,8 @@ class TokenKind { static const int COMBINATOR_PLUS = 515; // + combinator static const int COMBINATOR_GREATER = 516; // > combinator static const int COMBINATOR_TILDE = 517; // ~ combinator - static const int COMBINATOR_SHADOW_PIERCING_DESCENDANT = 518; // >>> - static const int COMBINATOR_DEEP = 519; // /deep/ (aliases >>>) - static const int UNARY_OP_NONE = 520; // No unary operator present. + static const int UNARY_OP_NONE = 518; // No unary operator present. // Attribute match types: static const int INCLUDES = 530; // '~=' diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index be5aff150..9c2e38569 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -120,16 +120,9 @@ class SimpleSelectorSequence extends TreeNode { bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE; bool get isCombinatorDescendant => combinator == TokenKind.COMBINATOR_DESCENDANT; - bool get isCombinatorDeep => combinator == TokenKind.COMBINATOR_DEEP; - bool get isCombinatorShadowPiercingDescendant => - combinator == TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT; String get _combinatorToString { switch (combinator) { - case TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT: - return ' >>> '; - case TokenKind.COMBINATOR_DEEP: - return ' /deep/ '; case TokenKind.COMBINATOR_DESCENDANT: return ' '; case TokenKind.COMBINATOR_GREATER: diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 6ed6962d0..d8d4962cc 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -320,10 +320,6 @@ class _TreePrinter extends Visitor { output.writeValue('combinator', ">"); } else if (node.isCombinatorTilde) { output.writeValue('combinator', "~"); - } else if (node.isCombinatorShadowPiercingDescendant) { - output.writeValue('combinator', '>>>'); - } else if (node.isCombinatorDeep) { - output.writeValue('combinator', '/deep/'); } else { output.writeValue('combinator', "ERROR UNKNOWN"); } diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index 7a740af5d..a64b8d44c 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -58,14 +58,6 @@ void testSelectorSuccesses() { selectorAst = selector(':host-context(.foo)', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); expect(compactOuptut(selectorAst), ':host-context(.foo)'); - - selectorAst = selector('.a /deep/ .b', errors: errors..clear()); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(selectorAst), '.a /deep/ .b'); - - selectorAst = selector('.x >>> .y', errors: errors..clear()); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(selectorAst), '.x >>> .y'); } // TODO(terry): Move this failure case to a failure_test.dart when the analyzer From 787c4e332792a06cc392f7ee7f49aca1a3a85dc1 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 24 Apr 2019 13:36:24 -0700 Subject: [PATCH 141/245] Prevent infinite loop when parsing an invalid selector --- pkgs/csslib/lib/parser.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 72e6e885c..fbf291c7d 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -225,6 +225,8 @@ class _Parser { var selector = processSelector(); if (selector != null) { productions.add(selector); + } else { + break; // Prevent infinite loop if we can't parse something. } } From eb5c62ac9d4e5d17f940542bffae9bade7c3c231 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 24 Apr 2019 13:42:34 -0700 Subject: [PATCH 142/245] Update version for release --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 1459b6acc..8ce1c796f 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.15.1-dev +version: 0.16.0 description: A library for parsing CSS. author: Dart Team From 5bf82c37d60bc6f146034585f54c35a9c8b14738 Mon Sep 17 00:00:00 2001 From: Stanislav Zhbanov Date: Mon, 1 Jul 2019 14:33:59 +0300 Subject: [PATCH 143/245] fixed expressions parsing --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/lib/parser.dart | 21 ++++++++------------- pkgs/csslib/test/compiler_test.dart | 22 ++++++++++++++++++++++ pkgs/csslib/test/var_test.dart | 5 +++++ 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 162975fa1..783393d60 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.16.1 + +- Fixed a crash caused by parsing certain calc() expressions and variables names that contain numbers. + ## 0.16.0 - Removed support for the shadow-piercing comibnators `/deep/` and `>>>`. These diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index fbf291c7d..d8ba671a6 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1681,14 +1681,8 @@ class _Parser { } if (keepParsing && value != null) { - LiteralTerm unitTerm; - // Don't process the dimension if MINUS or PLUS is next. - if (_peek() != TokenKind.MINUS && _peek() != TokenKind.PLUS) { - unitTerm = processDimension(termToken, value, _makeSpan(start)); - } - if (unitTerm == null) { - unitTerm = LiteralTerm(value, value.name, _makeSpan(start)); - } + LiteralTerm unitTerm = + processDimension(termToken, value, _makeSpan(start)); expressions.add(unitTerm); value = null; @@ -2498,12 +2492,13 @@ class _Parser { _next(); // Skip the unit break; default: - if (value != null && t != null) { - term = (value is Identifier) - ? LiteralTerm(value, value.name, span) - : NumberTerm(value, t.text, span); + if (value != null) { + if (value is Identifier) { + term = LiteralTerm(value, value.name, span); + } else if (t != null) { + term = NumberTerm(value, t.text, span); + } } - break; } return term; diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index 3e1852a13..c9e837535 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -727,6 +727,27 @@ void testEmitter() { }'''); } +void testExpressionParsing() { + var errors = []; + var input = r''' +.foobar { + border-radius: calc(0 - 1px); + border-width: calc(0 + 1px); +}'''; + var stylesheet = parseCss(input, errors: errors); + + expect(stylesheet != null, true); + expect(errors.isEmpty, true, reason: errors.toString()); + + walkTree(stylesheet); + + expect(prettyPrint(stylesheet), r''' +.foobar { + border-radius: calc(0 - 1px); + border-width: calc(0 + 1px); +}'''); +} + main() { test('Classes', testClass); test('Classes 2', testClass2); @@ -744,4 +765,5 @@ main() { test('stringEscape', testStringEscape); test('Parse List as input', testArrayOfChars); test('Simple Emitter', testEmitter); + test('Expression parsing', testExpressionParsing); } diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 4d6edf675..d1e689e81 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -34,10 +34,12 @@ void simpleVar() { var-c: #00ff00; var-b: var(c); var-a: var(b); + var-level-1-normal: 1px; } .testIt { color: var(color-foreground); background: var(color-background); + border-radius: var(level-1-normal); } '''; @@ -48,10 +50,12 @@ void simpleVar() { var-c: #0f0; var-b: var(c); var-a: var(b); + var-level-1-normal: 1px; } .testIt { color: var(color-foreground); background: var(color-background); + border-radius: var(level-1-normal); }'''; final generatedPolyfill = ''' @@ -60,6 +64,7 @@ void simpleVar() { .testIt { color: #00f; background: #f00; + border-radius: 1px; }'''; compileAndValidate(input, generated); From 38fcb2b8df2d64dae01998d284f9ac3fe8f1552f Mon Sep 17 00:00:00 2001 From: Stanislav Zhbanov Date: Mon, 1 Jul 2019 14:41:22 +0300 Subject: [PATCH 144/245] fix analyzer warnings: curly braces needed --- pkgs/csslib/lib/src/tree_base.dart | 12 +++++++----- pkgs/csslib/test/samples_test.dart | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index d8fee1d70..5011f3da4 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -57,21 +57,23 @@ class TreeOutput { } String toValue(value) { - if (value == null) + if (value == null) { return 'null'; - else if (value is Identifier) + } else if (value is Identifier) { return value.name; - else + } else { return value.toString(); + } } void writeNode(String label, TreeNode node) { write('${label}: '); depth += 1; - if (node != null) + if (node != null) { node.visit(printer); - else + } else { writeln('null'); + } depth -= 1; } diff --git a/pkgs/csslib/test/samples_test.dart b/pkgs/csslib/test/samples_test.dart index 40595432d..afba1470b 100644 --- a/pkgs/csslib/test/samples_test.dart +++ b/pkgs/csslib/test/samples_test.dart @@ -25,8 +25,9 @@ void testCSSFile(File cssFile) { main() { final libraryUri = currentMirrorSystem().findLibrary(#samples_test).uri; final cssDir = Directory.fromUri(libraryUri.resolve('examples')); - for (var element in cssDir.listSync()) + for (var element in cssDir.listSync()) { if (element is File && element.uri.pathSegments.last.endsWith('.css')) { test(element.uri.pathSegments.last, () => testCSSFile(element)); } + } } From 8d70b8601050f9032948ca3340b4455e5d2ceb14 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Mon, 8 Jul 2019 10:48:18 -0700 Subject: [PATCH 145/245] Update version for release --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 8ce1c796f..f4c6d832f 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.16.0 +version: 0.16.1 description: A library for parsing CSS. author: Dart Team From b28b765c6e21a8e175af475b8ee5fd8717a86e6b Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 31 Jul 2019 21:13:51 -0700 Subject: [PATCH 146/245] Delete codereview.settings --- pkgs/csslib/codereview.settings | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 pkgs/csslib/codereview.settings diff --git a/pkgs/csslib/codereview.settings b/pkgs/csslib/codereview.settings deleted file mode 100644 index 904dba15a..000000000 --- a/pkgs/csslib/codereview.settings +++ /dev/null @@ -1,3 +0,0 @@ -CODE_REVIEW_SERVER: http://codereview.chromium.org/ -VIEW_VC: https://github.com/dart-lang/csslib/commit/ -CC_LIST: reviews@dartlang.org \ No newline at end of file From c83b3c55cc73840b426346dfb9f3340449292e1a Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 27 Dec 2019 14:31:34 -0800 Subject: [PATCH 147/245] Fix a number of lints, disable a couple of lints that cannot be easily fixed (dart-lang/csslib#97) --- pkgs/csslib/.travis.yml | 4 +- pkgs/csslib/analysis_options.yaml | 5 + pkgs/csslib/example/call_parser.dart | 13 +- pkgs/csslib/lib/parser.dart | 183 ++++---- pkgs/csslib/lib/src/analyzer.dart | 91 ++-- pkgs/csslib/lib/src/css_printer.dart | 109 ++++- pkgs/csslib/lib/src/messages.dart | 9 +- pkgs/csslib/lib/src/polyfill.dart | 26 +- pkgs/csslib/lib/src/property.dart | 535 ++++++++++++------------ pkgs/csslib/lib/src/token.dart | 2 + pkgs/csslib/lib/src/token_kind.dart | 78 ++-- pkgs/csslib/lib/src/tokenizer.dart | 27 +- pkgs/csslib/lib/src/tokenizer_base.dart | 26 +- pkgs/csslib/lib/src/tree.dart | 250 ++++++++++- pkgs/csslib/lib/src/tree_base.dart | 5 +- pkgs/csslib/lib/src/tree_printer.dart | 101 ++++- pkgs/csslib/lib/src/validate.dart | 18 +- pkgs/csslib/lib/visitor.dart | 96 +++++ pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/big_1_test.dart | 2 +- pkgs/csslib/test/compiler_test.dart | 112 ++--- pkgs/csslib/test/debug_test.dart | 2 +- pkgs/csslib/test/declaration_test.dart | 82 ++-- pkgs/csslib/test/error_test.dart | 26 +- pkgs/csslib/test/extend_test.dart | 16 +- pkgs/csslib/test/mixin_test.dart | 2 +- pkgs/csslib/test/nested_test.dart | 4 +- pkgs/csslib/test/samples_test.dart | 2 +- pkgs/csslib/test/selector_test.dart | 2 +- pkgs/csslib/test/testing.dart | 6 +- pkgs/csslib/test/var_test.dart | 8 +- pkgs/csslib/test/visitor_test.dart | 8 +- 32 files changed, 1186 insertions(+), 666 deletions(-) diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml index f6e2d7b89..df7d18646 100644 --- a/pkgs/csslib/.travis.yml +++ b/pkgs/csslib/.travis.yml @@ -1,7 +1,7 @@ language: dart dart: - - 2.1.0 + - 2.2.0 - dev dart_task: @@ -12,7 +12,7 @@ matrix: include: - dart: dev dartanalyzer: --fatal-infos --fatal-warnings . - - dart: 2.1.0 + - dart: 2.2.0 dartanalyzer: --fatal-warnings . - dart: dev dart_task: dartfmt diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index 9d142917a..b8036fad8 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -1,5 +1,10 @@ include: package:pedantic/analysis_options.yaml +analyzer: + errors: + always_declare_return_types: ignore # 318 + omit_local_variable_types: ignore # 48 + linter: rules: - prefer_equal_for_default_values diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index fc299d93a..60adf6139 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -15,8 +15,7 @@ const _default = css.PreprocessorOptions( /// tests (by default) will ensure that the CSS is really valid. StyleSheet parseCss(String cssInput, {List errors, css.PreprocessorOptions opts}) { - return css.parse(cssInput, - errors: errors, options: opts == null ? _default : opts); + return css.parse(cssInput, errors: errors, options: opts ?? _default); } // Pretty printer for CSS. @@ -24,7 +23,7 @@ var emitCss = CssPrinter(); String prettyPrint(StyleSheet ss) => (emitCss..visitTree(ss, pretty: true)).toString(); -main() { +void main() { var errors = []; // Parse a simple stylesheet. @@ -42,7 +41,7 @@ main() { errors: errors); if (errors.isNotEmpty) { - print("Got ${errors.length} errors.\n"); + print('Got ${errors.length} errors.\n'); for (var error in errors) { print(error); } @@ -60,7 +59,7 @@ main() { errors: errors); if (errors.isNotEmpty) { - print("Got ${errors.length} errors.\n"); + print('Got ${errors.length} errors.\n'); for (var error in errors) { print(error); } @@ -74,7 +73,7 @@ main() { stylesheetError = parseCss('# div1 { color: red; }', errors: errors); if (errors.isNotEmpty) { - print("Detected ${errors.length} problem in checked mode.\n"); + print('Detected ${errors.length} problem in checked mode.\n'); for (var error in errors) { print(error); } @@ -87,7 +86,7 @@ main() { print(' ======================'); var selectorAst = css.selector('#div .foo', errors: errors); if (errors.isNotEmpty) { - print("Got ${errors.length} errors.\n"); + print('Got ${errors.length} errors.\n'); for (var error in errors) { print(error); } diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index d8ba671a6..e9402ab25 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -38,11 +38,9 @@ class ParserState extends TokenizerState { // TODO(jmesserly): this should not be global void _createMessages({List errors, PreprocessorOptions options}) { - if (errors == null) errors = []; + errors ??= []; - if (options == null) { - options = PreprocessorOptions(useColors: false, inputFile: 'memory'); - } + options ??= PreprocessorOptions(useColors: false, inputFile: 'memory'); messages = Messages(options: options, printHandler: errors.add); } @@ -58,9 +56,7 @@ StyleSheet compile(input, bool nested = true, bool polyfill = false, List includes}) { - if (includes == null) { - includes = []; - } + includes ??= []; var source = _inputAsString(input); @@ -150,8 +146,8 @@ String _inputAsString(input) { } else { // TODO(terry): Support RandomAccessFile using console. throw ArgumentError("'source' must be a String or " - "List (of bytes). RandomAccessFile not supported from this " - "simple interface"); + 'List (of bytes). RandomAccessFile not supported from this ' + 'simple interface'); } return source; @@ -172,12 +168,12 @@ class Parser { } // CSS2.1 pseudo-elements which were defined with a single ':'. -final _legacyPseudoElements = Set.from(const [ +const _legacyPseudoElements = { 'after', 'before', 'first-letter', 'first-line', -]); +}; /// A simple recursive descent parser for CSS. class _Parser { @@ -190,15 +186,14 @@ class _Parser { Token _previousToken; Token _peekToken; - _Parser(SourceFile file, String text, {int start = 0}) - : this.file = file, - tokenizer = Tokenizer(file, text, true, start) { + _Parser(this.file, String text, {int start = 0}) + : tokenizer = Tokenizer(file, text, true, start) { _peekToken = tokenizer.next(); } /// Main entry point for parsing an entire CSS file. StyleSheet parse() { - List productions = []; + var productions = []; var start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) { @@ -218,7 +213,7 @@ class _Parser { /// Main entry point for parsing a simple selector sequence. StyleSheet parseSelector() { - List productions = []; + var productions = []; var start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) { @@ -316,16 +311,12 @@ class _Parser { } void _error(String message, SourceSpan location) { - if (location == null) { - location = _peekToken.span; - } + location ??= _peekToken.span; messages.error(message, location); } void _warning(String message, SourceSpan location) { - if (location == null) { - location = _peekToken.span; - } + location ??= _peekToken.span; messages.warning(message, location); } @@ -386,7 +377,7 @@ class _Parser { if (isChecked) { if (unaryOp != TokenKind.MEDIA_OP_NOT || unaryOp != TokenKind.MEDIA_OP_ONLY) { - _warning("Only the unary operators NOT and ONLY allowed", + _warning('Only the unary operators NOT and ONLY allowed', _makeSpan(start)); } } @@ -439,11 +430,11 @@ class _Parser { return MediaExpression(andOperator, feature, exprs, _makeSpan(start)); } else if (isChecked) { _warning( - "Missing parenthesis around media expression", _makeSpan(start)); + 'Missing parenthesis around media expression', _makeSpan(start)); return null; } } else if (isChecked) { - _warning("Missing media feature in media expression", _makeSpan(start)); + _warning('Missing media feature in media expression', _makeSpan(start)); } } return null; @@ -505,7 +496,7 @@ class _Parser { // Any medias? var media = processMediaQueryList(); - List rules = []; + var rules = []; if (_maybeEat(TokenKind.LBRACE)) { while (!_maybeEat(TokenKind.END_OF_FILE)) { final rule = processRule(); @@ -524,7 +515,7 @@ class _Parser { case TokenKind.DIRECTIVE_HOST: _next(); - List rules = []; + var rules = []; if (_maybeEat(TokenKind.LBRACE)) { while (!_maybeEat(TokenKind.END_OF_FILE)) { final rule = processRule(); @@ -574,14 +565,14 @@ class _Parser { pseudoPage.name == 'right' || pseudoPage.name == 'first')) { _warning( - "Pseudo page must be left, top or first", pseudoPage.span); + 'Pseudo page must be left, top or first', pseudoPage.span); return null; } } } - String pseudoName = pseudoPage is Identifier ? pseudoPage.name : ''; - String ident = name is Identifier ? name.name : ''; + var pseudoName = pseudoPage is Identifier ? pseudoPage.name : ''; + var ident = name is Identifier ? name.name : ''; return PageDirective( ident, pseudoName, processMarginsDeclarations(), _makeSpan(start)); @@ -647,7 +638,7 @@ class _Parser { var keyframe = KeyFrameDirective(tokId, name, _makeSpan(start)); do { - Expressions selectors = Expressions(_makeSpan(start)); + var selectors = Expressions(_makeSpan(start)); do { var term = processTerm(); @@ -682,7 +673,7 @@ class _Parser { _eat(TokenKind.LBRACE); - List productions = []; + var productions = []; start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE)) { @@ -740,7 +731,7 @@ class _Parser { return processInclude(_makeSpan(start)); case TokenKind.DIRECTIVE_CONTENT: // TODO(terry): TBD - _warning("@content not implemented.", _makeSpan(start)); + _warning('@content not implemented.', _makeSpan(start)); return null; case TokenKind.DIRECTIVE_MOZ_DOCUMENT: return processDocumentDirective(); @@ -776,7 +767,7 @@ class _Parser { if (varDef is VarDefinitionDirective || varDef is VarDefinition) { params.add(varDef); } else if (mustHaveParam) { - _warning("Expecting parameter", _makeSpan(_peekToken.span)); + _warning('Expecting parameter', _makeSpan(_peekToken.span)); keepGoing = false; } if (_maybeEat(TokenKind.COMMA)) { @@ -811,7 +802,7 @@ class _Parser { if (include is IncludeDirective) { newDecls.add(IncludeMixinAtDeclaration(include, include.span)); } else { - _warning("Error mixing of top-level vs declarations mixins", + _warning('Error mixing of top-level vs declarations mixins', _makeSpan(include.span)); } }); @@ -1143,13 +1134,13 @@ class _Parser { /// Return [:null:] if no selector or [SelectorGroup] if a selector was /// parsed. SelectorGroup _nestedSelector() { - Messages oldMessages = messages; + var oldMessages = messages; _createMessages(); var markedData = _mark; // Look a head do we have a nested selector instead of a declaration? - SelectorGroup selGroup = processSelectorGroup(); + var selGroup = processSelectorGroup(); var nestedSelector = selGroup != null && _peekKind(TokenKind.LBRACE) && @@ -1186,13 +1177,13 @@ class _Parser { selectorGroup = _nestedSelector(); } - Declaration decl = processDeclaration(dartStyles); + var decl = processDeclaration(dartStyles); if (decl != null) { if (decl.hasDartStyle) { var newDartStyle = decl.dartStyle; // Replace or add latest Dart style. - bool replaced = false; + var replaced = false; for (var i = 0; i < dartStyles.length; i++) { var dartStyle = dartStyles[i]; if (dartStyle.isSame(newDartStyle)) { @@ -1270,13 +1261,13 @@ class _Parser { } break; default: - Declaration decl = processDeclaration(dartStyles); + var decl = processDeclaration(dartStyles); if (decl != null) { if (decl.hasDartStyle) { var newDartStyle = decl.dartStyle; // Replace or add latest Dart style. - bool replaced = false; + var replaced = false; for (var i = 0; i < dartStyles.length; i++) { var dartStyle = dartStyles[i]; if (dartStyle.isSame(newDartStyle)) { @@ -1313,11 +1304,11 @@ class _Parser { } SelectorGroup processSelectorGroup() { - List selectors = []; + var selectors = []; var start = _peekToken.span; do { - Selector selector = processSelector(); + var selector = processSelector(); if (selector != null) { selectors.add(selector); } @@ -1391,8 +1382,7 @@ class _Parser { // Check if WHITESPACE existed between tokens if so we're descendent. if (combinatorType == TokenKind.COMBINATOR_NONE && !forceCombinatorNone) { - if (this._previousToken != null && - this._previousToken.end != this._peekToken.start) { + if (_previousToken != null && _previousToken.end != _peekToken.start) { combinatorType = TokenKind.COMBINATOR_DESCENDANT; } } @@ -1411,7 +1401,7 @@ class _Parser { // .foo&:hover combinator before & is NONE // .foo & combinator before & is DESCDENDANT // .foo > & combinator before & is GREATER - simpleSel = ElementSelector(Identifier("", span), span); + simpleSel = ElementSelector(Identifier('', span), span); } if (simpleSel != null) { return SimpleSelectorSequence(simpleSel, span, combinatorType); @@ -1513,14 +1503,14 @@ class _Parser { var hasWhiteSpace = false; if (_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) { - _warning("Not a valid ID selector expected #id", _makeSpan(start)); + _warning('Not a valid ID selector expected #id', _makeSpan(start)); hasWhiteSpace = true; } if (_peekIdentifier()) { var id = identifier(); if (hasWhiteSpace) { // Generate bad selector id (normalized). - id.name = " ${id.name}"; + id.name = ' ${id.name}'; } return IdSelector(id, _makeSpan(start)); } @@ -1528,16 +1518,16 @@ class _Parser { case TokenKind.DOT: _eat(TokenKind.DOT); - bool hasWhiteSpace = false; + var hasWhiteSpace = false; if (_anyWhiteSpaceBeforePeekToken(TokenKind.DOT)) { - _warning("Not a valid class selector expected .className", + _warning('Not a valid class selector expected .className', _makeSpan(start)); hasWhiteSpace = true; } var id = identifier(); if (hasWhiteSpace) { // Generate bad selector class (normalized). - id.name = " ${id.name}"; + id.name = ' ${id.name}'; } return ClassSelector(id, _makeSpan(start)); case TokenKind.COLON: @@ -1614,7 +1604,7 @@ class _Parser { ? PseudoElementFunctionSelector(pseudoName, expr, span) : PseudoClassFunctionSelector(pseudoName, expr, span); } else { - _errorExpected("CSS expression"); + _errorExpected('CSS expression'); return null; } } @@ -1681,8 +1671,7 @@ class _Parser { } if (keepParsing && value != null) { - LiteralTerm unitTerm = - processDimension(termToken, value, _makeSpan(start)); + var unitTerm = processDimension(termToken, value, _makeSpan(start)); expressions.add(unitTerm); value = null; @@ -1782,7 +1771,7 @@ class _Parser { _eat(TokenKind.COLON); - Expressions exprs = processExpr(ieFilterProperty); + var exprs = processExpr(ieFilterProperty); var dartComposite = _styleForDart(propertyIdent, exprs, dartStyles); @@ -1798,7 +1787,7 @@ class _Parser { _eat(TokenKind.COLON); - Expressions exprs = processExpr(); + var exprs = processExpr(); decl = VarDefinition(definedName, exprs, _makeSpan(start)); } else if (_peekToken.kind == TokenKind.DIRECTIVE_INCLUDE) { @@ -1813,7 +1802,7 @@ class _Parser { var span = _makeSpan(start); var selector = simpleSelector(); if (selector == null) { - _warning("@extends expecting simple selector name", span); + _warning('@extends expecting simple selector name', span); } else { simpleSequences.add(selector); } @@ -1823,7 +1812,7 @@ class _Parser { pseudoSelector is PseudoClassSelector) { simpleSequences.add(pseudoSelector); } else { - _warning("not a valid selector", span); + _warning('not a valid selector', span); } } decl = ExtendDeclaration(simpleSequences, span); @@ -1981,7 +1970,7 @@ class _Parser { var fontExpr = FontExpression(expr.span, weight: expr.value); return _mergeFontStyles(fontExpr, dartStyles); } else if (expr is LiteralTerm) { - int weight = _nameToFontWeight[expr.value.toString()]; + var weight = _nameToFontWeight[expr.value.toString()]; if (weight != null) { var fontExpr = FontExpression(expr.span, weight: weight); return _mergeFontStyles(fontExpr, dartStyles); @@ -1992,7 +1981,7 @@ class _Parser { if (exprs.expressions.length == 1) { var expr = exprs.expressions[0]; if (expr is UnitTerm) { - UnitTerm unitTerm = expr; + var unitTerm = expr; // TODO(terry): Need to handle other units and LiteralTerm normal // See https://github.com/dart-lang/csslib/issues/2. if (unitTerm.unit == TokenKind.UNIT_LENGTH_PX || @@ -2001,14 +1990,14 @@ class _Parser { lineHeight: LineHeight(expr.value, inPixels: true)); return _mergeFontStyles(fontExpr, dartStyles); } else if (isChecked) { - _warning("Unexpected unit for line-height", expr.span); + _warning('Unexpected unit for line-height', expr.span); } } else if (expr is NumberTerm) { var fontExpr = FontExpression(expr.span, lineHeight: LineHeight(expr.value, inPixels: false)); return _mergeFontStyles(fontExpr, dartStyles); } else if (isChecked) { - _warning("Unexpected value for line-height", expr.span); + _warning('Unexpected value for line-height', expr.span); } } break; @@ -2115,7 +2104,7 @@ class _Parser { num bottom; num left; - int totalExprs = exprs.expressions.length; + var totalExprs = exprs.expressions.length; switch (totalExprs) { case 1: top = marginValue(exprs.expressions[0]); @@ -2195,7 +2184,7 @@ class _Parser { op = IE8Term(_makeSpan(ie8Start)); } else if (isChecked) { _warning( - "\$value is not valid in an expression", _makeSpan(start)); + '\$value is not valid in an expression', _makeSpan(start)); } } break; @@ -2255,14 +2244,14 @@ class _Parser { Token t; // token for term's value var value; // value of term (numeric values) - var unary = ""; + var unary = ''; switch (_peek()) { case TokenKind.HASH: - this._eat(TokenKind.HASH); + _eat(TokenKind.HASH); if (!_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) { String hexText; if (_peekKind(TokenKind.INTEGER)) { - String hexText1 = _peekToken.text; + var hexText1 = _peekToken.text; _next(); // Append identifier only if there's no delimiting whitespace. if (_peekIdentifier() && _previousToken.end == _peekToken.start) { @@ -2279,17 +2268,17 @@ class _Parser { } if (isChecked) { - _warning("Expected hex number", _makeSpan(start)); + _warning('Expected hex number', _makeSpan(start)); } // Construct the bad hex value with a #number. - return _parseHex(" ${processTerm().text}", _makeSpan(start)); + return _parseHex(' ${processTerm().text}', _makeSpan(start)); case TokenKind.INTEGER: t = _next(); - value = int.parse("${unary}${t.text}"); + value = int.parse('${unary}${t.text}'); break; case TokenKind.DOUBLE: t = _next(); - value = double.parse("${unary}${t.text}"); + value = double.parse('${unary}${t.text}'); break; case TokenKind.SINGLE_QUOTE: value = processQuotedString(false); @@ -2302,7 +2291,7 @@ class _Parser { case TokenKind.LPAREN: _next(); - GroupTerm group = GroupTerm(_makeSpan(start)); + var group = GroupTerm(_makeSpan(start)); dynamic /* Expression | List | ... */ term; do { @@ -2359,8 +2348,8 @@ class _Parser { if (isChecked) { var propName = nameValue.name; var errMsg = TokenKind.isPredefinedName(propName) - ? "Improper use of property value ${propName}" - : "Unknown property value ${propName}"; + ? 'Improper use of property value ${propName}' + : 'Unknown property value ${propName}'; _warning(errMsg, _makeSpan(start)); } return LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); @@ -2380,7 +2369,7 @@ class _Parser { first = _previousToken.text; firstNumber = int.parse('0x$first'); if (firstNumber > MAX_UNICODE) { - _error("unicode range must be less than 10FFFF", _makeSpan(start)); + _error('unicode range must be less than 10FFFF', _makeSpan(start)); } if (_maybeEat(TokenKind.MINUS, unicodeRange: true)) { if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { @@ -2388,10 +2377,10 @@ class _Parser { secondNumber = int.parse('0x$second'); if (secondNumber > MAX_UNICODE) { _error( - "unicode range must be less than 10FFFF", _makeSpan(start)); + 'unicode range must be less than 10FFFF', _makeSpan(start)); } if (firstNumber > secondNumber) { - _error("unicode first range can not be greater than last", + _error('unicode first range can not be greater than last', _makeSpan(start)); } } @@ -2407,7 +2396,7 @@ class _Parser { var expr = processExpr(); if (isChecked && expr.expressions.length > 1) { - _error("only @name for Less syntax", _peekToken.span); + _error('only @name for Less syntax', _peekToken.span); } var param = expr.expressions[0]; @@ -2425,7 +2414,7 @@ class _Parser { /// Process all dimension units. LiteralTerm processDimension(Token t, var value, SourceSpan span) { LiteralTerm term; - var unitType = this._peek(); + var unitType = _peek(); switch (unitType) { case TokenKind.UNIT_EM: @@ -2614,16 +2603,16 @@ class _Parser { var matchingParens = false; while (_peek() != TokenKind.END_OF_FILE && !matchingParens) { var token = _peek(); - if (token == TokenKind.LPAREN) + if (token == TokenKind.LPAREN) { left++; - else if (token == TokenKind.RPAREN) left--; + } else if (token == TokenKind.RPAREN) left--; matchingParens = left == 0; if (!matchingParens) stringValue.write(_next().text); } if (!matchingParens) { - _error("problem parsing function expected ), ", _peekToken.span); + _error('problem parsing function expected ), ', _peekToken.span); } tokenizer._inString = inString; @@ -2637,11 +2626,11 @@ class _Parser { var name = func.name; if (name == 'calc' || name == '-webkit-calc' || name == '-moz-calc') { // TODO(terry): Implement expression parsing properly. - String expression = processCalcExpression(); + var expression = processCalcExpression(); var calcExpr = LiteralTerm(expression, expression, _makeSpan(start)); if (!_maybeEat(TokenKind.RPAREN)) { - _error("problem parsing function expected ), ", _peekToken.span); + _error('problem parsing function expected ), ', _peekToken.span); } return CalcTerm(name, name, calcExpr, _makeSpan(start)); @@ -2666,7 +2655,7 @@ class _Parser { // TODO(terry): Better error message and checking for mismatched quotes. if (_peek() == TokenKind.END_OF_FILE) { - _error("problem parsing URI", _peekToken.span); + _error('problem parsing URI', _peekToken.span); } if (_peek() == TokenKind.RPAREN) { @@ -2685,11 +2674,11 @@ class _Parser { // (GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670'); var expr = processExpr(); if (!_maybeEat(TokenKind.RPAREN)) { - _error("problem parsing var expected ), ", _peekToken.span); + _error('problem parsing var expected ), ', _peekToken.span); } if (isChecked && - expr.expressions.where((e) => e is OperatorComma).length > 1) { - _error("too many parameters to var()", _peekToken.span); + expr.expressions.whereType().length > 1) { + _error('too many parameters to var()', _peekToken.span); } var paramName = (expr.expressions[0] as LiteralTerm).text; @@ -2702,7 +2691,7 @@ class _Parser { default: var expr = processExpr(); if (!_maybeEat(TokenKind.RPAREN)) { - _error("problem parsing function expected ), ", _peekToken.span); + _error('problem parsing function expected ), ', _peekToken.span); } return FunctionTerm(name, name, expr, _makeSpan(start)); @@ -2717,7 +2706,7 @@ class _Parser { if (isChecked) { _warning('expected identifier, but found $tok', tok.span); } - return Identifier("", _makeSpan(tok.span)); + return Identifier('', _makeSpan(tok.span)); } return Identifier(tok.text, _makeSpan(tok.span)); @@ -2827,7 +2816,7 @@ class ExpressionsProcessor { var moreFamilies = false; for (; _index < _exprs.expressions.length; _index++) { - Expression expr = _exprs.expressions[_index]; + var expr = _exprs.expressions[_index]; if (expr is LiteralTerm) { if (family.isEmpty || moreFamilies) { // It's font-family now. @@ -2852,12 +2841,8 @@ class ExpressionsProcessor { FontExpression fontFamily; for (; _index < _exprs.expressions.length; _index++) { // Order is font-size font-family - if (fontSize == null) { - fontSize = processFontSize(); - } - if (fontFamily == null) { - fontFamily = processFontFamily(); - } + fontSize ??= processFontSize(); + fontFamily ??= processFontFamily(); //TODO(terry): Handle font-weight, font-style, and font-variant. See // https://github.com/dart-lang/csslib/issues/3 // https://github.com/dart-lang/csslib/issues/4 @@ -2876,7 +2861,7 @@ class ExpressionsProcessor { String _escapeString(String text, {bool single = false}) { StringBuffer result; - for (int i = 0; i < text.length; i++) { + for (var i = 0; i < text.length; i++) { var code = text.codeUnitAt(i); String replace; switch (code) { @@ -2892,7 +2877,7 @@ String _escapeString(String text, {bool single = false}) { result = StringBuffer(text.substring(0, i)); } - if (result != null) result.write(replace != null ? replace : text[i]); + if (result != null) result.write(replace ?? text[i]); } return result == null ? text : result.toString(); diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 5f34da546..0b121ad1a 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -186,8 +186,9 @@ class ExpandNestedSelectors extends Visitor { List _expandedRuleSets = []; /// Maping of a nested rule set to the fully expanded list of RuleSet(s). - final Map> _expansions = Map(); + final _expansions = >{}; + @override void visitRuleSet(RuleSet node) { final oldParent = _parentRuleSet; @@ -238,8 +239,8 @@ class ExpandNestedSelectors extends Visitor { // Create a merged set of previous parent selectors and current selectors. var newSelectors = []; - for (Selector selector in selectors) { - for (Selector nestedSelector in nestedSelectors) { + for (var selector in selectors) { + for (var nestedSelector in nestedSelectors) { var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences, selector.simpleSelectorSequences); newSelectors.add(Selector(seq, node.span)); @@ -300,6 +301,7 @@ class ExpandNestedSelectors extends Visitor { return newSequences; } + @override void visitDeclarationGroup(DeclarationGroup node) { var span = node.span; @@ -338,6 +340,7 @@ class ExpandNestedSelectors extends Visitor { // Record all declarations in a nested selector (Declaration, VarDefinition // and MarginGroup) but not the nested rule in the Declaration. + @override void visitDeclaration(Declaration node) { if (_parentRuleSet != null) { _flatDeclarationGroup.declarations.add(node); @@ -345,6 +348,7 @@ class ExpandNestedSelectors extends Visitor { super.visitDeclaration(node); } + @override void visitVarDefinition(VarDefinition node) { if (_parentRuleSet != null) { _flatDeclarationGroup.declarations.add(node); @@ -352,6 +356,7 @@ class ExpandNestedSelectors extends Visitor { super.visitVarDefinition(node); } + @override void visitExtendDeclaration(ExtendDeclaration node) { if (_parentRuleSet != null) { _flatDeclarationGroup.declarations.add(node); @@ -359,6 +364,7 @@ class ExpandNestedSelectors extends Visitor { super.visitExtendDeclaration(node); } + @override void visitMarginGroup(MarginGroup node) { if (_parentRuleSet != null) { _flatDeclarationGroup.declarations.add(node); @@ -386,8 +392,8 @@ class ExpandNestedSelectors extends Visitor { } class _MediaRulesReplacer extends Visitor { - RuleSet _ruleSet; - List _newRules; + final RuleSet _ruleSet; + final List _newRules; bool _foundAndReplaced = false; /// Look for the [ruleSet] inside of an @media directive; if found then @@ -402,6 +408,7 @@ class _MediaRulesReplacer extends Visitor { _MediaRulesReplacer(this._ruleSet, this._newRules); + @override visitMediaDirective(MediaDirective node) { var index = node.rules.indexOf(_ruleSet); if (index != -1) { @@ -418,7 +425,7 @@ class TopLevelIncludes extends Visitor { final Messages _messages; /// Map of variable name key to it's definition. - final Map map = Map(); + final map = {}; MixinDefinition currDef; static void expand(Messages messages, List styleSheets) { @@ -434,12 +441,14 @@ class TopLevelIncludes extends Visitor { } } + @override void visitStyleSheet(StyleSheet ss) { _styleSheet = ss; super.visitStyleSheet(ss); _styleSheet = null; } + @override void visitIncludeDirective(IncludeDirective node) { if (map.containsKey(node.name)) { var mixinDef = map[node.name]; @@ -449,7 +458,7 @@ class TopLevelIncludes extends Visitor { } else if (currDef is MixinRulesetDirective && _anyRulesets(currDef)) { // currDef is MixinRulesetDirective MixinRulesetDirective mixinRuleset = currDef; - int index = mixinRuleset.rulesets.indexOf(node); + var index = mixinRuleset.rulesets.indexOf(node); mixinRuleset.rulesets.removeAt(index); _messages.warning( 'Using declaration mixin ${node.name} as top-level mixin', @@ -457,7 +466,7 @@ class TopLevelIncludes extends Visitor { } } else { if (currDef is MixinRulesetDirective) { - MixinRulesetDirective rulesetDirect = currDef as MixinRulesetDirective; + var rulesetDirect = currDef as MixinRulesetDirective; rulesetDirect.rulesets.removeWhere((entry) { if (entry == node) { _messages.warning('Undefined mixin ${node.name}', node.span); @@ -470,6 +479,7 @@ class TopLevelIncludes extends Visitor { super.visitIncludeDirective(node); } + @override void visitMixinRulesetDirective(MixinRulesetDirective node) { currDef = node; @@ -480,6 +490,7 @@ class TopLevelIncludes extends Visitor { currDef = null; } + @override void visitMixinDeclarationDirective(MixinDeclarationDirective node) { currDef = node; @@ -493,7 +504,6 @@ class TopLevelIncludes extends Visitor { /// @include as a top-level with ruleset(s). class _TopLevelIncludeReplacer extends Visitor { - final Messages _messages; final IncludeDirective _include; final List _newRules; bool _foundAndReplaced = false; @@ -503,13 +513,14 @@ class _TopLevelIncludeReplacer extends Visitor { /// true. static bool replace(Messages messages, StyleSheet styleSheet, IncludeDirective include, List newRules) { - var visitor = _TopLevelIncludeReplacer(messages, include, newRules); + var visitor = _TopLevelIncludeReplacer(include, newRules); visitor.visitStyleSheet(styleSheet); return visitor._foundAndReplaced; } - _TopLevelIncludeReplacer(this._messages, this._include, this._newRules); + _TopLevelIncludeReplacer(this._include, this._newRules); + @override visitStyleSheet(StyleSheet node) { var index = node.topLevels.indexOf(_include); if (index != -1) { @@ -520,6 +531,7 @@ class _TopLevelIncludeReplacer extends Visitor { super.visitStyleSheet(node); } + @override void visitMixinRulesetDirective(MixinRulesetDirective node) { var index = node.rulesets.indexOf(_include as dynamic); if (index != -1) { @@ -556,7 +568,7 @@ class CallMixin extends Visitor { Expressions _currExpressions; int _currIndex = -1; - final varUsages = Map>>(); + final varUsages = >>{}; /// Only var defs with more than one expression (comma separated). final Map varDefs; @@ -580,7 +592,7 @@ class CallMixin extends Visitor { if (definedArg is VarDefinition) { varDef = definedArg; } else if (definedArg is VarDefinitionDirective) { - VarDefinitionDirective varDirective = definedArg; + var varDirective = definedArg; varDef = varDirective.def; } var callArg = callArgs[index]; @@ -622,6 +634,7 @@ class CallMixin extends Visitor { return defArgs; } + @override void visitExpressions(Expressions node) { var oldExpressions = _currExpressions; var oldIndex = _currIndex; @@ -636,35 +649,38 @@ class CallMixin extends Visitor { } void _addExpression(Map> expressions) { - var indexSet = Set(); + var indexSet = {}; indexSet.add(_currIndex); expressions[_currExpressions] = indexSet; } + @override void visitVarUsage(VarUsage node) { assert(_currIndex != -1); assert(_currExpressions != null); if (varUsages.containsKey(node.name)) { - Map> expressions = varUsages[node.name]; - Set allIndexes = expressions[_currExpressions]; + var expressions = varUsages[node.name]; + var allIndexes = expressions[_currExpressions]; if (allIndexes == null) { _addExpression(expressions); } else { allIndexes.add(_currIndex); } } else { - var newExpressions = Map>(); + var newExpressions = >{}; _addExpression(newExpressions); varUsages[node.name] = newExpressions; } super.visitVarUsage(node); } + @override void visitMixinDeclarationDirective(MixinDeclarationDirective node) { _definedArgs = node.definedArgs; super.visitMixinDeclarationDirective(node); } + @override void visitMixinRulesetDirective(MixinRulesetDirective node) { _definedArgs = node.definedArgs; super.visitMixinRulesetDirective(node); @@ -677,15 +693,15 @@ class DeclarationIncludes extends Visitor { final Messages _messages; /// Map of variable name key to it's definition. - final Map map = Map(); + final Map map = {}; /// Cache of mixin called with parameters. - final Map callMap = Map(); + final Map callMap = {}; MixinDefinition currDef; DeclarationGroup currDeclGroup; /// Var definitions with more than 1 expression. - final Map varDefs = Map(); + final varDefs = {}; static void expand(Messages messages, List styleSheets) { DeclarationIncludes(messages, styleSheets); @@ -706,18 +722,21 @@ class DeclarationIncludes extends Visitor { return callMap[mixinDef.name]; } + @override void visitStyleSheet(StyleSheet ss) { _styleSheet = ss; super.visitStyleSheet(ss); _styleSheet = null; } + @override void visitDeclarationGroup(DeclarationGroup node) { currDeclGroup = node; super.visitDeclarationGroup(node); currDeclGroup = null; } + @override void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { if (map.containsKey(node.include.name)) { var mixinDef = map[node.include.name]; @@ -730,7 +749,7 @@ class DeclarationIncludes extends Visitor { currDeclGroup.declarations.replaceRange(index, index + 1, [NoOp()]); } _messages.warning( - "Using top-level mixin ${node.include.name} as a declaration", + 'Using top-level mixin ${node.include.name} as a declaration', node.span); } else { // We're a list of @include(s) inside of a mixin ruleset - convert @@ -757,12 +776,13 @@ class DeclarationIncludes extends Visitor { _styleSheet, node, mixinDef.declarations.declarations); } } else { - _messages.warning("Undefined mixin ${node.include.name}", node.span); + _messages.warning('Undefined mixin ${node.include.name}', node.span); } super.visitIncludeMixinAtDeclaration(node); } + @override void visitIncludeDirective(IncludeDirective node) { if (map.containsKey(node.name)) { var mixinDef = map[node.name]; @@ -783,6 +803,7 @@ class DeclarationIncludes extends Visitor { super.visitIncludeDirective(node); } + @override void visitMixinRulesetDirective(MixinRulesetDirective node) { currDef = node; @@ -793,6 +814,7 @@ class DeclarationIncludes extends Visitor { currDef = null; } + @override void visitMixinDeclarationDirective(MixinDeclarationDirective node) { currDef = node; @@ -803,6 +825,7 @@ class DeclarationIncludes extends Visitor { currDef = null; } + @override void visitVarDefinition(VarDefinition node) { // Only record var definitions that have multiple expressions (comma // separated for mixin parameter substitution. @@ -813,6 +836,7 @@ class DeclarationIncludes extends Visitor { super.visitVarDefinition(node); } + @override void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); } @@ -822,7 +846,6 @@ class DeclarationIncludes extends Visitor { class _IncludeReplacer extends Visitor { final _include; final List _newDeclarations; - bool _foundAndReplaced = false; /// Look for the [ruleSet] inside of a @media directive; if found then replace /// with the [newRules]. @@ -834,13 +857,13 @@ class _IncludeReplacer extends Visitor { _IncludeReplacer(this._include, this._newDeclarations); + @override void visitDeclarationGroup(DeclarationGroup node) { var index = _findInclude(node.declarations, _include); if (index != -1) { node.declarations.insertAll(index + 1, _newDeclarations); // Change @include to NoOp so it's processed only once. node.declarations.replaceRange(index, index + 1, [NoOp()]); - _foundAndReplaced = true; } super.visitDeclarationGroup(node); } @@ -856,6 +879,7 @@ class MixinsAndIncludes extends Visitor { bool _nodesToRemove(node) => node is IncludeDirective || node is MixinDefinition || node is NoOp; + @override void visitStyleSheet(StyleSheet ss) { var index = ss.topLevels.length; while (--index >= 0) { @@ -866,6 +890,7 @@ class MixinsAndIncludes extends Visitor { super.visitStyleSheet(ss); } + @override void visitDeclarationGroup(DeclarationGroup node) { var index = node.declarations.length; while (--index >= 0) { @@ -879,13 +904,13 @@ class MixinsAndIncludes extends Visitor { /// Find all @extend to create inheritance. class AllExtends extends Visitor { - final Map> inherits = - Map>(); + final inherits = >{}; SelectorGroup _currSelectorGroup; int _currDeclIndex; - final List _extendsToRemove = []; + final _extendsToRemove = []; + @override void visitRuleSet(RuleSet node) { var oldSelectorGroup = _currSelectorGroup; _currSelectorGroup = node.selectorGroup; @@ -895,8 +920,9 @@ class AllExtends extends Visitor { _currSelectorGroup = oldSelectorGroup; } + @override void visitExtendDeclaration(ExtendDeclaration node) { - var inheritName = ""; + var inheritName = ''; for (var selector in node.selectors) { inheritName += selector.toString(); } @@ -912,6 +938,7 @@ class AllExtends extends Visitor { super.visitExtendDeclaration(node); } + @override void visitDeclarationGroup(DeclarationGroup node) { var oldDeclIndex = _currDeclIndex; @@ -937,25 +964,25 @@ class AllExtends extends Visitor { // TODO(terry): Need to handle !optional glag. /// Changes any selector that matches @extend. class InheritExtends extends Visitor { - final Messages _messages; final AllExtends _allExtends; - InheritExtends(this._messages, this._allExtends); + InheritExtends(Messages messages, this._allExtends); + @override void visitSelectorGroup(SelectorGroup node) { for (var selectorsIndex = 0; selectorsIndex < node.selectors.length; selectorsIndex++) { var selectors = node.selectors[selectorsIndex]; var isLastNone = false; - var selectorName = ""; + var selectorName = ''; for (var index = 0; index < selectors.simpleSelectorSequences.length; index++) { var simpleSeq = selectors.simpleSelectorSequences[index]; var namePart = simpleSeq.simpleSelector.toString(); selectorName = (isLastNone) ? (selectorName + namePart) : namePart; - List matches = _allExtends.inherits[selectorName]; + var matches = _allExtends.inherits[selectorName]; if (matches != null) { for (var match in matches) { // Create a new group. diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index a95fa342f..039929653 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -11,6 +11,7 @@ class CssPrinter extends Visitor { /// Walk the [tree] Stylesheet. [pretty] if true emits line breaks, extra /// spaces, friendly property values, etc., if false emits compacted output. + @override void visitTree(StyleSheet tree, {bool pretty = false}) { prettyPrint = pretty; _buff = StringBuffer(); @@ -23,6 +24,7 @@ class CssPrinter extends Visitor { } /// Returns the output buffer. + @override String toString() => _buff.toString().trim(); String get _newLine => prettyPrint ? '\n' : ''; @@ -34,20 +36,24 @@ class CssPrinter extends Visitor { // flag for obfuscation. bool get _isTesting => !prettyPrint; + @override void visitCalcTerm(CalcTerm node) { emit('${node.text}('); node.expr.visit(this); emit(')'); } + @override void visitCssComment(CssComment node) { emit('/* ${node.comment} */'); } + @override void visitCommentDefinition(CommentDefinition node) { emit(''); } + @override void visitMediaExpression(MediaExpression node) { emit(node.andOperator ? ' AND ' : ' '); emit('(${node.mediaFeature}'); @@ -58,6 +64,7 @@ class CssPrinter extends Visitor { emit(')'); } + @override void visitMediaQuery(MediaQuery query) { var unary = query.hasUnary ? ' ${query.unary}' : ''; var mediaType = query.hasMediaType ? ' ${query.mediaType}' : ''; @@ -76,6 +83,7 @@ class CssPrinter extends Visitor { } } + @override void visitDocumentDirective(DocumentDirective node) { emit('$_newLine@-moz-document '); node.functions.first.visit(this); @@ -90,6 +98,7 @@ class CssPrinter extends Visitor { emit('$_newLine}'); } + @override void visitSupportsDirective(SupportsDirective node) { emit('$_newLine@supports '); node.condition.visit(this); @@ -100,17 +109,20 @@ class CssPrinter extends Visitor { emit('$_newLine}'); } + @override void visitSupportsConditionInParens(SupportsConditionInParens node) { emit('('); node.condition.visit(this); emit(')'); } + @override void visitSupportsNegation(SupportsNegation node) { emit('not$_sp'); node.condition.visit(this); } + @override void visitSupportsConjunction(SupportsConjunction node) { node.conditions.first.visit(this); for (var condition in node.conditions.skip(1)) { @@ -119,6 +131,7 @@ class CssPrinter extends Visitor { } } + @override void visitSupportsDisjunction(SupportsDisjunction node) { node.conditions.first.visit(this); for (var condition in node.conditions.skip(1)) { @@ -127,12 +140,14 @@ class CssPrinter extends Visitor { } } + @override void visitViewportDirective(ViewportDirective node) { emit('@${node.name}$_sp{$_newLine'); node.declarations.visit(this); emit('}'); } + @override void visitMediaDirective(MediaDirective node) { emit('$_newLine@media'); emitMediaQueries(node.mediaQueries); @@ -143,6 +158,7 @@ class CssPrinter extends Visitor { emit('$_newLine}'); } + @override void visitHostDirective(HostDirective node) { emit('$_newLine@host$_sp{'); for (var ruleset in node.rules) { @@ -154,6 +170,7 @@ class CssPrinter extends Visitor { /// @page : pseudoPage { /// decls /// } + @override void visitPageDirective(PageDirective node) { emit('$_newLine@page'); if (node.hasIdent || node.hasPseudoPage) { @@ -172,10 +189,12 @@ class CssPrinter extends Visitor { } /// @charset "charset encoding" + @override void visitCharsetDirective(CharsetDirective node) { emit('$_newLine@charset "${node.charEncoding}";'); } + @override void visitImportDirective(ImportDirective node) { bool isStartingQuote(String ch) => ('\'"'.contains(ch[0])); @@ -193,6 +212,7 @@ class CssPrinter extends Visitor { emit(';'); } + @override void visitKeyFrameDirective(KeyFrameDirective node) { emit('$_newLine${node.keyFrameName} '); node.name.visit(this); @@ -203,6 +223,7 @@ class CssPrinter extends Visitor { emit('}'); } + @override void visitFontFaceDirective(FontFaceDirective node) { emit('$_newLine@font-face '); emit('$_sp{$_newLine'); @@ -210,6 +231,7 @@ class CssPrinter extends Visitor { emit('}'); } + @override void visitKeyFrameBlock(KeyFrameBlock node) { emit('$_sp$_sp'); node._blockSelectors.visit(this); @@ -218,10 +240,12 @@ class CssPrinter extends Visitor { emit('$_sp$_sp}$_newLine'); } + @override void visitStyletDirective(StyletDirective node) { emit('/* @stylet export as ${node.dartClassName} */\n'); } + @override void visitNamespaceDirective(NamespaceDirective node) { bool isStartingQuote(String ch) => ('\'"'.contains(ch)); @@ -240,11 +264,13 @@ class CssPrinter extends Visitor { emit(';'); } + @override void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); emit(';$_newLine'); } + @override void visitMixinRulesetDirective(MixinRulesetDirective node) { emit('@mixin ${node.name} {'); for (var ruleset in node.rulesets) { @@ -253,6 +279,7 @@ class CssPrinter extends Visitor { emit('}'); } + @override void visitMixinDeclarationDirective(MixinDeclarationDirective node) { emit('@mixin ${node.name} {\n'); visitDeclarationGroup(node.declarations); @@ -261,30 +288,34 @@ class CssPrinter extends Visitor { /// Added optional newLine for handling @include at top-level vs/ inside of /// a declaration group. + @override void visitIncludeDirective(IncludeDirective node, [bool topLevel = true]) { if (topLevel) emit(_newLine); emit('@include ${node.name}'); emit(';'); } + @override void visitContentDirective(ContentDirective node) { // TODO(terry): TBD } + @override void visitRuleSet(RuleSet node) { - emit("$_newLine"); + emit('$_newLine'); node._selectorGroup.visit(this); - emit("$_sp{$_newLine"); + emit('$_sp{$_newLine'); node._declarationGroup.visit(this); - emit("}"); + emit('}'); } + @override void visitDeclarationGroup(DeclarationGroup node) { var declarations = node.declarations; var declarationsLength = declarations.length; for (var i = 0; i < declarationsLength; i++) { if (i > 0) emit(_newLine); - emit("$_sp$_sp"); + emit('$_sp$_sp'); declarations[i].visit(this); // Don't emit the last semicolon in compact mode. if (prettyPrint || i < declarationsLength - 1) { @@ -294,17 +325,19 @@ class CssPrinter extends Visitor { if (declarationsLength > 0) emit(_newLine); } + @override void visitMarginGroup(MarginGroup node) { var margin_sym_name = TokenKind.idToValue(TokenKind.MARGIN_DIRECTIVES, node.margin_sym); - emit("@$margin_sym_name$_sp{$_newLine"); + emit('@$margin_sym_name$_sp{$_newLine'); visitDeclarationGroup(node); - emit("}$_newLine"); + emit('}$_newLine'); } + @override void visitDeclaration(Declaration node) { emit('${node.property}:$_sp'); node._expression.visit(this); @@ -313,23 +346,27 @@ class CssPrinter extends Visitor { } } + @override void visitVarDefinition(VarDefinition node) { - emit("var-${node.definedName}: "); + emit('var-${node.definedName}: '); node._expression.visit(this); } + @override void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { // Don't emit a new line we're inside of a declaration group. visitIncludeDirective(node.include, false); } + @override void visitExtendDeclaration(ExtendDeclaration node) { - emit("@extend "); + emit('@extend '); for (var selector in node.selectors) { selector.visit(this); } } + @override void visitSelectorGroup(SelectorGroup node) { var selectors = node.selectors; var selectorsLength = selectors.length; @@ -339,61 +376,74 @@ class CssPrinter extends Visitor { } } + @override void visitSimpleSelectorSequence(SimpleSelectorSequence node) { emit('${node._combinatorToString}'); node.simpleSelector.visit(this); } + @override void visitSimpleSelector(SimpleSelector node) { emit(node.name); } + @override void visitNamespaceSelector(NamespaceSelector node) { emit(node.toString()); } + @override void visitElementSelector(ElementSelector node) { emit(node.toString()); } + @override void visitAttributeSelector(AttributeSelector node) { emit(node.toString()); } + @override void visitIdSelector(IdSelector node) { emit(node.toString()); } + @override void visitClassSelector(ClassSelector node) { emit(node.toString()); } + @override void visitPseudoClassSelector(PseudoClassSelector node) { emit(node.toString()); } + @override void visitPseudoElementSelector(PseudoElementSelector node) { emit(node.toString()); } + @override void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { - emit(":${node.name}("); + emit(':${node.name}('); node.argument.visit(this); emit(')'); } + @override void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) { - emit("::${node.name}("); + emit('::${node.name}('); node.expression.visit(this); emit(')'); } + @override void visitNegationSelector(NegationSelector node) { emit(':not('); node.negationArg.visit(this); emit(')'); } + @override void visitSelectorExpression(SelectorExpression node) { var expressions = node.expressions; var expressionsLength = expressions.length; @@ -404,82 +454,97 @@ class CssPrinter extends Visitor { } } + @override void visitUnicodeRangeTerm(UnicodeRangeTerm node) { if (node.hasSecond) { - emit("U+${node.first}-${node.second}"); + emit('U+${node.first}-${node.second}'); } else { - emit("U+${node.first}"); + emit('U+${node.first}'); } } + @override void visitLiteralTerm(LiteralTerm node) { emit(node.text); } + @override void visitHexColorTerm(HexColorTerm node) { String mappedName; if (_isTesting && (node.value is! BAD_HEX_VALUE)) { mappedName = TokenKind.hexToColorName(node.value); } - if (mappedName == null) { - mappedName = '#${node.text}'; - } + mappedName ??= '#${node.text}'; emit(mappedName); } + @override void visitNumberTerm(NumberTerm node) { visitLiteralTerm(node); } + @override void visitUnitTerm(UnitTerm node) { emit(node.toString()); } + @override void visitLengthTerm(LengthTerm node) { emit(node.toString()); } + @override void visitPercentageTerm(PercentageTerm node) { emit('${node.text}%'); } + @override void visitEmTerm(EmTerm node) { emit('${node.text}em'); } + @override void visitExTerm(ExTerm node) { emit('${node.text}ex'); } + @override void visitAngleTerm(AngleTerm node) { emit(node.toString()); } + @override void visitTimeTerm(TimeTerm node) { emit(node.toString()); } + @override void visitFreqTerm(FreqTerm node) { emit(node.toString()); } + @override void visitFractionTerm(FractionTerm node) { emit('${node.text}fr'); } + @override void visitUriTerm(UriTerm node) { emit('url("${node.text}")'); } + @override void visitResolutionTerm(ResolutionTerm node) { emit(node.toString()); } + @override void visitViewportTerm(ViewportTerm node) { emit(node.toString()); } + @override void visitFunctionTerm(FunctionTerm node) { // TODO(terry): Optimize rgb to a hexcolor. emit('${node.text}('); @@ -487,6 +552,7 @@ class CssPrinter extends Visitor { emit(')'); } + @override void visitGroupTerm(GroupTerm node) { emit('('); var terms = node._terms; @@ -498,30 +564,37 @@ class CssPrinter extends Visitor { emit(')'); } + @override void visitItemTerm(ItemTerm node) { emit('[${node.text}]'); } + @override void visitIE8Term(IE8Term node) { visitLiteralTerm(node); } + @override void visitOperatorSlash(OperatorSlash node) { emit('/'); } + @override void visitOperatorComma(OperatorComma node) { emit(','); } + @override void visitOperatorPlus(OperatorPlus node) { emit('+'); } + @override void visitOperatorMinus(OperatorMinus node) { emit('-'); } + @override void visitVarUsage(VarUsage node) { emit('var(${node.name}'); if (node.defaultValues.isNotEmpty) { @@ -534,6 +607,7 @@ class CssPrinter extends Visitor { emit(')'); } + @override void visitExpressions(Expressions node) { var expressions = node.expressions; var expressionsLength = expressions.length; @@ -558,24 +632,29 @@ class CssPrinter extends Visitor { } } + @override void visitBinaryExpression(BinaryExpression node) { // TODO(terry): TBD throw UnimplementedError; } + @override void visitUnaryExpression(UnaryExpression node) { // TODO(terry): TBD throw UnimplementedError; } + @override void visitIdentifier(Identifier node) { emit(node.name); } + @override void visitWildcard(Wildcard node) { emit('*'); } + @override void visitDartStyleExpression(DartStyleExpression node) { // TODO(terry): TBD throw UnimplementedError; diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index edc72d89e..b93a554ae 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -41,13 +41,12 @@ class Message { final SourceSpan span; final bool useColors; - Message(this.level, this.message, {SourceSpan span, bool useColors = false}) - : this.span = span, - this.useColors = useColors; + Message(this.level, this.message, {this.span, this.useColors = false}); + @override String toString() { var output = StringBuffer(); - bool colors = useColors && _errorColors.containsKey(level); + var colors = useColors && _errorColors.containsKey(level); var levelColor = colors ? _errorColors[level] : null; if (colors) output.write(levelColor); output..write(_errorLabel[level])..write(' '); @@ -75,7 +74,7 @@ class Messages { final List messages = []; Messages({PreprocessorOptions options, this.printHandler = print}) - : options = options != null ? options : PreprocessorOptions(); + : options = options ?? PreprocessorOptions(); /// Report a compile-time CSS error. void error(String message, SourceSpan span) { diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index d9c1b736b..fa1a22adc 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -8,9 +8,9 @@ part of '../parser.dart'; /// understand (var, calc, etc.). class PolyFill { final Messages _messages; - Map _allVarDefinitions = Map(); + Map _allVarDefinitions = {}; - Set allStyleSheets = Set(); + Set allStyleSheets = {}; /// [_pseudoElements] list of known pseudo attributes found in HTML, any /// CSS pseudo-elements 'name::custom-element' is mapped to the manged name @@ -40,10 +40,9 @@ class PolyFill { void processVars(StyleSheet styleSheet) { // Build list of all var definitions. - var mainStyleSheetVarDefs = - (_VarDefAndUsage(this._messages, _allVarDefinitions) - ..visitTree(styleSheet)) - .varDefs; + var mainStyleSheetVarDefs = (_VarDefAndUsage(_messages, _allVarDefinitions) + ..visitTree(styleSheet)) + .varDefs; // Resolve all definitions to a non-VarUsage (terminal expression). mainStyleSheetVarDefs.forEach((key, value) { @@ -61,16 +60,19 @@ class _VarDefinitionsIncludes extends Visitor { _VarDefinitionsIncludes(this.varDefs); + @override void visitTree(StyleSheet tree) { visitStyleSheet(tree); } + @override visitVarDefinition(VarDefinition node) { // Replace with latest variable definition. varDefs[node.definedName] = node; super.visitVarDefinition(node); } + @override void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); } @@ -81,17 +83,19 @@ class _VarDefinitionsIncludes extends Visitor { class _VarDefAndUsage extends Visitor { final Messages _messages; final Map _knownVarDefs; - final Map varDefs = Map(); + final varDefs = {}; VarDefinition currVarDefinition; List currentExpressions; _VarDefAndUsage(this._messages, this._knownVarDefs); + @override void visitTree(StyleSheet tree) { visitStyleSheet(tree); } + @override visitVarDefinition(VarDefinition node) { // Replace with latest variable definition. currVarDefinition = node; @@ -104,16 +108,19 @@ class _VarDefAndUsage extends Visitor { currVarDefinition = null; } + @override void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); } + @override void visitExpressions(Expressions node) { currentExpressions = node.expressions; super.visitExpressions(node); currentExpressions = null; } + @override void visitVarUsage(VarUsage node) { if (currVarDefinition != null && currVarDefinition.badUsage) return; @@ -154,7 +161,7 @@ class _VarDefAndUsage extends Visitor { } // Remove var usage that points at an undefined definition. expressions.removeAt(index); - _messages.warning("Variable is not defined.", node.span); + _messages.warning('Variable is not defined.', node.span); } var oldExpressions = currentExpressions; @@ -199,15 +206,18 @@ class _VarDefAndUsage extends Visitor { /// Remove all var definitions. class _RemoveVarDefinitions extends Visitor { + @override void visitTree(StyleSheet tree) { visitStyleSheet(tree); } + @override void visitStyleSheet(StyleSheet ss) { ss.topLevels.removeWhere((e) => e is VarDefinitionDirective); super.visitStyleSheet(ss); } + @override void visitDeclarationGroup(DeclarationGroup node) { node.declarations.removeWhere((e) => e is VarDefinition); super.visitDeclarationGroup(node); diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 01fc96bb7..0fb79fb38 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -52,7 +52,7 @@ class Color implements _StyleProperty, ColorBase { /// The [rgb] value of 0xffd700 would map to #ffd700 or the constant /// Color.gold, where ff is red intensity, d7 is green intensity, and 00 is /// blue intensity. - Color(int rgb, [num alpha]) : this._argb = Color._rgbToArgbString(rgb, alpha); + Color(int rgb, [num alpha]) : _argb = Color._rgbToArgbString(rgb, alpha); /// RGB takes three values. The [red], [green], and [blue] parameters are /// the intensity of those components where '0' is the least and '256' is the @@ -63,7 +63,7 @@ class Color implements _StyleProperty, ColorBase { /// internally be mapped to an int between '0' and '255' like the other color /// components. Color.createRgba(int red, int green, int blue, [num alpha]) - : this._argb = Color.convertToHexString( + : _argb = Color.convertToHexString( Color._clamp(red, 0, 255), Color._clamp(green, 0, 255), Color._clamp(blue, 0, 255), @@ -71,7 +71,7 @@ class Color implements _StyleProperty, ColorBase { /// Creates a new color from a CSS color string. For more information, see /// . - Color.css(String color) : this._argb = Color._convertCssToArgb(color); + Color.css(String color) : _argb = Color._convertCssToArgb(color); // TODO(jmesserly): I found the use of percents a bit suprising. /// HSL takes three values. The [hueDegree] degree on the color wheel; '0' is @@ -87,7 +87,7 @@ class Color implements _StyleProperty, ColorBase { /// foreground). Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent, [num alpha]) - : this._argb = Hsla( + : _argb = Hsla( Color._clamp(hueDegree, 0, 360) / 360, Color._clamp(saturationPercent, 0, 100) / 100, Color._clamp(lightnessPercent, 0, 100) / 100, @@ -108,7 +108,7 @@ class Color implements _StyleProperty, ColorBase { /// completely transparent foreground and 1 is a completely /// opaque foreground. Color.hslaRaw(num hue, num saturation, num lightness, [num alpha]) - : this._argb = Hsla( + : _argb = Hsla( Color._clamp(hue, 0, 1), Color._clamp(saturation, 0, 1), Color._clamp(lightness, 0, 1), @@ -119,6 +119,7 @@ class Color implements _StyleProperty, ColorBase { const Color.hex(this._argb); // TODO(jmesserly): this is needed by the example so leave it exposed for now. + @override String toString() => cssExpression; // TODO(terry): Regardless of how color is set (rgb, num, css or hsl) we'll @@ -126,70 +127,75 @@ class Color implements _StyleProperty, ColorBase { // CSS if user uses hsl and would like to edit as hsl, etc. If // this is an issue we should keep the original value and not re- // create the CSS from the normalized value. + @override String get cssExpression { if (_argb.length == 6) { - return "#$_argb"; // RGB only, no alpha blending. + return '#$_argb'; // RGB only, no alpha blending. } else { num alpha = Color.hexToInt(_argb.substring(0, 2)); - String a = (alpha / 255).toStringAsPrecision(2); - int r = Color.hexToInt(_argb.substring(2, 4)); - int g = Color.hexToInt(_argb.substring(4, 6)); - int b = Color.hexToInt(_argb.substring(6, 8)); - return "rgba($r,$g,$b,$a)"; + var a = (alpha / 255).toStringAsPrecision(2); + var r = Color.hexToInt(_argb.substring(2, 4)); + var g = Color.hexToInt(_argb.substring(4, 6)); + var b = Color.hexToInt(_argb.substring(6, 8)); + return 'rgba($r,$g,$b,$a)'; } } Rgba get rgba { - int nextIndex = 0; + var nextIndex = 0; num a; if (_argb.length == 8) { // Get alpha blending value 0..255 - int alpha = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); + var alpha = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); // Convert to value from 0..1 a = double.parse((alpha / 255).toStringAsPrecision(2)); nextIndex += 2; } - int r = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); + var r = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); nextIndex += 2; - int g = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); + var g = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); nextIndex += 2; - int b = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); + var b = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); return Rgba(r, g, b, a); } Hsla get hsla => Hsla.fromRgba(rgba); + @override int get argbValue => Color.hexToInt(_argb); + @override bool operator ==(other) => Color.equal(this, other); + @override String toHexArgbString() => _argb; Color darker(num amount) { - Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, -amount); - return Color.hex("${newRgba.toHexArgbString()}"); + var newRgba = Color._createNewTintShadeFromRgba(rgba, -amount); + return Color.hex('${newRgba.toHexArgbString()}'); } Color lighter(num amount) { - Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, amount); - return Color.hex("${newRgba.toHexArgbString()}"); + var newRgba = Color._createNewTintShadeFromRgba(rgba, amount); + return Color.hex('${newRgba.toHexArgbString()}'); } static bool equal(ColorBase curr, other) { if (other is Color) { - Color o = other; + var o = other; return o.toHexArgbString() == curr.toHexArgbString(); } else if (other is Rgba) { - Rgba rgb = other; + var rgb = other; return rgb.toHexArgbString() == curr.toHexArgbString(); } else if (other is Hsla) { - Hsla hsla = other; + var hsla = other; return hsla.toHexArgbString() == curr.toHexArgbString(); } else { return false; } } + @override int get hashCode => _argb.hashCode; // Conversion routines: @@ -202,9 +208,9 @@ class Color implements _StyleProperty, ColorBase { a = (Color._clamp(alpha, 0, 1) * 255).round(); } - int r = (rgba & 0xff0000) >> 0x10; - int g = (rgba & 0xff00) >> 8; - int b = rgba & 0xff; + var r = (rgba & 0xff0000) >> 0x10; + var g = (rgba & 0xff00) >> 8; + var b = rgba & 0xff; return Color.convertToHexString(r, g, b, a); } @@ -219,23 +225,23 @@ class Color implements _StyleProperty, ColorBase { /// convert to argb. static String _convertCssToArgb(String value) { // TODO(terry): Better parser/regex for converting CSS properties. - String color = value.trim().replaceAll("\\s", ""); + var color = value.trim().replaceAll('\\s', ''); if (color[0] == '#') { - String v = color.substring(1); + var v = color.substring(1); Color.hexToInt(v); // Valid hexadecimal, throws if not. return v; } else if (color.isNotEmpty && color[color.length - 1] == ')') { int type; - if (color.indexOf("rgb(") == 0 || color.indexOf("RGB(") == 0) { + if (color.indexOf('rgb(') == 0 || color.indexOf('RGB(') == 0) { color = color.substring(4); type = _rgbCss; - } else if (color.indexOf("rgba(") == 0 || color.indexOf("RGBA(") == 0) { + } else if (color.indexOf('rgba(') == 0 || color.indexOf('RGBA(') == 0) { type = _rgbaCss; color = color.substring(5); - } else if (color.indexOf("hsl(") == 0 || color.indexOf("HSL(") == 0) { + } else if (color.indexOf('hsl(') == 0 || color.indexOf('HSL(') == 0) { type = _hslCss; color = color.substring(4); - } else if (color.indexOf("hsla(") == 0 || color.indexOf("HSLA(") == 0) { + } else if (color.indexOf('hsla(') == 0 || color.indexOf('HSLA(') == 0) { type = _hslaCss; color = color.substring(5); } else { @@ -245,8 +251,8 @@ class Color implements _StyleProperty, ColorBase { color = color.substring(0, color.length - 1); // Strip close paren. var args = []; - List params = color.split(","); - for (String param in params) { + var params = color.split(','); + for (var param in params) { args.add(double.parse(param)); } switch (type) { @@ -270,24 +276,24 @@ class Color implements _StyleProperty, ColorBase { static int hexToInt(String hex) => int.parse(hex, radix: 16); static String convertToHexString(int r, int g, int b, [num a]) { - String rHex = Color._numAs2DigitHex(Color._clamp(r, 0, 255)); - String gHex = Color._numAs2DigitHex(Color._clamp(g, 0, 255)); - String bHex = Color._numAs2DigitHex(Color._clamp(b, 0, 255)); - String aHex = (a != null) + var rHex = Color._numAs2DigitHex(Color._clamp(r, 0, 255)); + var gHex = Color._numAs2DigitHex(Color._clamp(g, 0, 255)); + var bHex = Color._numAs2DigitHex(Color._clamp(b, 0, 255)); + var aHex = (a != null) ? Color._numAs2DigitHex((Color._clamp(a, 0, 1) * 255).round()) - : ""; + : ''; // TODO(terry) 15.toRadixString(16) return 'F' on Dartium not f as in JS. // bug: - return "$aHex$rHex$gHex$bHex".toLowerCase(); + return '$aHex$rHex$gHex$bHex'.toLowerCase(); } static String _numAs2DigitHex(num v) { // TODO(terry): v.toInt().toRadixString instead of v.toRadixString // Bug . - String hex = v.toInt().toRadixString(16); + var hex = v.toInt().toRadixString(16); if (hex.length == 1) { - hex = "0${hex}"; + hex = '0${hex}'; } return hex; } @@ -306,7 +312,7 @@ class Color implements _StyleProperty, ColorBase { /// the color #ffffff (white). static Rgba _createNewTintShadeFromRgba(Rgba rgba, num amount) { int r, g, b; - num tintShade = Color._clamp(amount, -1, 1); + var tintShade = Color._clamp(amount, -1, 1); if (amount < 0 && rgba.r == 255 && rgba.g == 255 && rgba.b == 255) { // TODO(terry): See TODO in _changeTintShadeColor; eliminate this test // by converting to HSL and adjust lightness although this @@ -334,154 +340,154 @@ class Color implements _StyleProperty, ColorBase { Color._clamp(((1 - delta) * v + (delta * 255)).round(), 0, 255); // Predefined CSS colors see - static final Color transparent = const Color.hex("00ffffff"); // Alpha 0.0 - static final Color aliceBlue = const Color.hex("0f08ff"); - static final Color antiqueWhite = const Color.hex("0faebd7"); - static final Color aqua = const Color.hex("00ffff"); - static final Color aquaMarine = const Color.hex("7fffd4"); - static final Color azure = const Color.hex("f0ffff"); - static final Color beige = const Color.hex("f5f5dc"); - static final Color bisque = const Color.hex("ffe4c4"); - static final Color black = const Color.hex("000000"); - static final Color blanchedAlmond = const Color.hex("ffebcd"); - static final Color blue = const Color.hex("0000ff"); - static final Color blueViolet = const Color.hex("8a2be2"); - static final Color brown = const Color.hex("a52a2a"); - static final Color burlyWood = const Color.hex("deb887"); - static final Color cadetBlue = const Color.hex("5f9ea0"); - static final Color chartreuse = const Color.hex("7fff00"); - static final Color chocolate = const Color.hex("d2691e"); - static final Color coral = const Color.hex("ff7f50"); - static final Color cornFlowerBlue = const Color.hex("6495ed"); - static final Color cornSilk = const Color.hex("fff8dc"); - static final Color crimson = const Color.hex("dc143c"); - static final Color cyan = const Color.hex("00ffff"); - static final Color darkBlue = const Color.hex("00008b"); - static final Color darkCyan = const Color.hex("008b8b"); - static final Color darkGoldenRod = const Color.hex("b8860b"); - static final Color darkGray = const Color.hex("a9a9a9"); - static final Color darkGreen = const Color.hex("006400"); - static final Color darkGrey = const Color.hex("a9a9a9"); - static final Color darkKhaki = const Color.hex("bdb76b"); - static final Color darkMagenta = const Color.hex("8b008b"); - static final Color darkOliveGreen = const Color.hex("556b2f"); - static final Color darkOrange = const Color.hex("ff8c00"); - static final Color darkOrchid = const Color.hex("9932cc"); - static final Color darkRed = const Color.hex("8b0000"); - static final Color darkSalmon = const Color.hex("e9967a"); - static final Color darkSeaGreen = const Color.hex("8fbc8f"); - static final Color darkSlateBlue = const Color.hex("483d8b"); - static final Color darkSlateGray = const Color.hex("2f4f4f"); - static final Color darkSlateGrey = const Color.hex("2f4f4f"); - static final Color darkTurquoise = const Color.hex("00ced1"); - static final Color darkViolet = const Color.hex("9400d3"); - static final Color deepPink = const Color.hex("ff1493"); - static final Color deepSkyBlue = const Color.hex("00bfff"); - static final Color dimGray = const Color.hex("696969"); - static final Color dimGrey = const Color.hex("696969"); - static final Color dodgerBlue = const Color.hex("1e90ff"); - static final Color fireBrick = const Color.hex("b22222"); - static final Color floralWhite = const Color.hex("fffaf0"); - static final Color forestGreen = const Color.hex("228b22"); - static final Color fuchsia = const Color.hex("ff00ff"); - static final Color gainsboro = const Color.hex("dcdcdc"); - static final Color ghostWhite = const Color.hex("f8f8ff"); - static final Color gold = const Color.hex("ffd700"); - static final Color goldenRod = const Color.hex("daa520"); - static final Color gray = const Color.hex("808080"); - static final Color green = const Color.hex("008000"); - static final Color greenYellow = const Color.hex("adff2f"); - static final Color grey = const Color.hex("808080"); - static final Color honeydew = const Color.hex("f0fff0"); - static final Color hotPink = const Color.hex("ff69b4"); - static final Color indianRed = const Color.hex("cd5c5c"); - static final Color indigo = const Color.hex("4b0082"); - static final Color ivory = const Color.hex("fffff0"); - static final Color khaki = const Color.hex("f0e68c"); - static final Color lavender = const Color.hex("e6e6fa"); - static final Color lavenderBlush = const Color.hex("fff0f5"); - static final Color lawnGreen = const Color.hex("7cfc00"); - static final Color lemonChiffon = const Color.hex("fffacd"); - static final Color lightBlue = const Color.hex("add8e6"); - static final Color lightCoral = const Color.hex("f08080"); - static final Color lightCyan = const Color.hex("e0ffff"); - static final Color lightGoldenRodYellow = const Color.hex("fafad2"); - static final Color lightGray = const Color.hex("d3d3d3"); - static final Color lightGreen = const Color.hex("90ee90"); - static final Color lightGrey = const Color.hex("d3d3d3"); - static final Color lightPink = const Color.hex("ffb6c1"); - static final Color lightSalmon = const Color.hex("ffa07a"); - static final Color lightSeaGreen = const Color.hex("20b2aa"); - static final Color lightSkyBlue = const Color.hex("87cefa"); - static final Color lightSlateGray = const Color.hex("778899"); - static final Color lightSlateGrey = const Color.hex("778899"); - static final Color lightSteelBlue = const Color.hex("b0c4de"); - static final Color lightYellow = const Color.hex("ffffe0"); - static final Color lime = const Color.hex("00ff00"); - static final Color limeGreen = const Color.hex("32cd32"); - static final Color linen = const Color.hex("faf0e6"); - static final Color magenta = const Color.hex("ff00ff"); - static final Color maroon = const Color.hex("800000"); - static final Color mediumAquaMarine = const Color.hex("66cdaa"); - static final Color mediumBlue = const Color.hex("0000cd"); - static final Color mediumOrchid = const Color.hex("ba55d3"); - static final Color mediumPurple = const Color.hex("9370db"); - static final Color mediumSeaGreen = const Color.hex("3cb371"); - static final Color mediumSlateBlue = const Color.hex("7b68ee"); - static final Color mediumSpringGreen = const Color.hex("00fa9a"); - static final Color mediumTurquoise = const Color.hex("48d1cc"); - static final Color mediumVioletRed = const Color.hex("c71585"); - static final Color midnightBlue = const Color.hex("191970"); - static final Color mintCream = const Color.hex("f5fffa"); - static final Color mistyRose = const Color.hex("ffe4e1"); - static final Color moccasin = const Color.hex("ffe4b5"); - static final Color navajoWhite = const Color.hex("ffdead"); - static final Color navy = const Color.hex("000080"); - static final Color oldLace = const Color.hex("fdf5e6"); - static final Color olive = const Color.hex("808000"); - static final Color oliveDrab = const Color.hex("6b8e23"); - static final Color orange = const Color.hex("ffa500"); - static final Color orangeRed = const Color.hex("ff4500"); - static final Color orchid = const Color.hex("da70d6"); - static final Color paleGoldenRod = const Color.hex("eee8aa"); - static final Color paleGreen = const Color.hex("98fb98"); - static final Color paleTurquoise = const Color.hex("afeeee"); - static final Color paleVioletRed = const Color.hex("db7093"); - static final Color papayaWhip = const Color.hex("ffefd5"); - static final Color peachPuff = const Color.hex("ffdab9"); - static final Color peru = const Color.hex("cd85ef"); - static final Color pink = const Color.hex("ffc0cb"); - static final Color plum = const Color.hex("dda0dd"); - static final Color powderBlue = const Color.hex("b0e0e6"); - static final Color purple = const Color.hex("800080"); - static final Color red = const Color.hex("ff0000"); - static final Color rosyBrown = const Color.hex("bc8f8f"); - static final Color royalBlue = const Color.hex("4169e1"); - static final Color saddleBrown = const Color.hex("8b4513"); - static final Color salmon = const Color.hex("fa8072"); - static final Color sandyBrown = const Color.hex("f4a460"); - static final Color seaGreen = const Color.hex("2e8b57"); - static final Color seashell = const Color.hex("fff5ee"); - static final Color sienna = const Color.hex("a0522d"); - static final Color silver = const Color.hex("c0c0c0"); - static final Color skyBlue = const Color.hex("87ceeb"); - static final Color slateBlue = const Color.hex("6a5acd"); - static final Color slateGray = const Color.hex("708090"); - static final Color slateGrey = const Color.hex("708090"); - static final Color snow = const Color.hex("fffafa"); - static final Color springGreen = const Color.hex("00ff7f"); - static final Color steelBlue = const Color.hex("4682b4"); - static final Color tan = const Color.hex("d2b48c"); - static final Color teal = const Color.hex("008080"); - static final Color thistle = const Color.hex("d8bfd8"); - static final Color tomato = const Color.hex("ff6347"); - static final Color turquoise = const Color.hex("40e0d0"); - static final Color violet = const Color.hex("ee82ee"); - static final Color wheat = const Color.hex("f5deb3"); - static final Color white = const Color.hex("ffffff"); - static final Color whiteSmoke = const Color.hex("f5f5f5"); - static final Color yellow = const Color.hex("ffff00"); - static final Color yellowGreen = const Color.hex("9acd32"); + static final Color transparent = const Color.hex('00ffffff'); // Alpha 0.0 + static final Color aliceBlue = const Color.hex('0f08ff'); + static final Color antiqueWhite = const Color.hex('0faebd7'); + static final Color aqua = const Color.hex('00ffff'); + static final Color aquaMarine = const Color.hex('7fffd4'); + static final Color azure = const Color.hex('f0ffff'); + static final Color beige = const Color.hex('f5f5dc'); + static final Color bisque = const Color.hex('ffe4c4'); + static final Color black = const Color.hex('000000'); + static final Color blanchedAlmond = const Color.hex('ffebcd'); + static final Color blue = const Color.hex('0000ff'); + static final Color blueViolet = const Color.hex('8a2be2'); + static final Color brown = const Color.hex('a52a2a'); + static final Color burlyWood = const Color.hex('deb887'); + static final Color cadetBlue = const Color.hex('5f9ea0'); + static final Color chartreuse = const Color.hex('7fff00'); + static final Color chocolate = const Color.hex('d2691e'); + static final Color coral = const Color.hex('ff7f50'); + static final Color cornFlowerBlue = const Color.hex('6495ed'); + static final Color cornSilk = const Color.hex('fff8dc'); + static final Color crimson = const Color.hex('dc143c'); + static final Color cyan = const Color.hex('00ffff'); + static final Color darkBlue = const Color.hex('00008b'); + static final Color darkCyan = const Color.hex('008b8b'); + static final Color darkGoldenRod = const Color.hex('b8860b'); + static final Color darkGray = const Color.hex('a9a9a9'); + static final Color darkGreen = const Color.hex('006400'); + static final Color darkGrey = const Color.hex('a9a9a9'); + static final Color darkKhaki = const Color.hex('bdb76b'); + static final Color darkMagenta = const Color.hex('8b008b'); + static final Color darkOliveGreen = const Color.hex('556b2f'); + static final Color darkOrange = const Color.hex('ff8c00'); + static final Color darkOrchid = const Color.hex('9932cc'); + static final Color darkRed = const Color.hex('8b0000'); + static final Color darkSalmon = const Color.hex('e9967a'); + static final Color darkSeaGreen = const Color.hex('8fbc8f'); + static final Color darkSlateBlue = const Color.hex('483d8b'); + static final Color darkSlateGray = const Color.hex('2f4f4f'); + static final Color darkSlateGrey = const Color.hex('2f4f4f'); + static final Color darkTurquoise = const Color.hex('00ced1'); + static final Color darkViolet = const Color.hex('9400d3'); + static final Color deepPink = const Color.hex('ff1493'); + static final Color deepSkyBlue = const Color.hex('00bfff'); + static final Color dimGray = const Color.hex('696969'); + static final Color dimGrey = const Color.hex('696969'); + static final Color dodgerBlue = const Color.hex('1e90ff'); + static final Color fireBrick = const Color.hex('b22222'); + static final Color floralWhite = const Color.hex('fffaf0'); + static final Color forestGreen = const Color.hex('228b22'); + static final Color fuchsia = const Color.hex('ff00ff'); + static final Color gainsboro = const Color.hex('dcdcdc'); + static final Color ghostWhite = const Color.hex('f8f8ff'); + static final Color gold = const Color.hex('ffd700'); + static final Color goldenRod = const Color.hex('daa520'); + static final Color gray = const Color.hex('808080'); + static final Color green = const Color.hex('008000'); + static final Color greenYellow = const Color.hex('adff2f'); + static final Color grey = const Color.hex('808080'); + static final Color honeydew = const Color.hex('f0fff0'); + static final Color hotPink = const Color.hex('ff69b4'); + static final Color indianRed = const Color.hex('cd5c5c'); + static final Color indigo = const Color.hex('4b0082'); + static final Color ivory = const Color.hex('fffff0'); + static final Color khaki = const Color.hex('f0e68c'); + static final Color lavender = const Color.hex('e6e6fa'); + static final Color lavenderBlush = const Color.hex('fff0f5'); + static final Color lawnGreen = const Color.hex('7cfc00'); + static final Color lemonChiffon = const Color.hex('fffacd'); + static final Color lightBlue = const Color.hex('add8e6'); + static final Color lightCoral = const Color.hex('f08080'); + static final Color lightCyan = const Color.hex('e0ffff'); + static final Color lightGoldenRodYellow = const Color.hex('fafad2'); + static final Color lightGray = const Color.hex('d3d3d3'); + static final Color lightGreen = const Color.hex('90ee90'); + static final Color lightGrey = const Color.hex('d3d3d3'); + static final Color lightPink = const Color.hex('ffb6c1'); + static final Color lightSalmon = const Color.hex('ffa07a'); + static final Color lightSeaGreen = const Color.hex('20b2aa'); + static final Color lightSkyBlue = const Color.hex('87cefa'); + static final Color lightSlateGray = const Color.hex('778899'); + static final Color lightSlateGrey = const Color.hex('778899'); + static final Color lightSteelBlue = const Color.hex('b0c4de'); + static final Color lightYellow = const Color.hex('ffffe0'); + static final Color lime = const Color.hex('00ff00'); + static final Color limeGreen = const Color.hex('32cd32'); + static final Color linen = const Color.hex('faf0e6'); + static final Color magenta = const Color.hex('ff00ff'); + static final Color maroon = const Color.hex('800000'); + static final Color mediumAquaMarine = const Color.hex('66cdaa'); + static final Color mediumBlue = const Color.hex('0000cd'); + static final Color mediumOrchid = const Color.hex('ba55d3'); + static final Color mediumPurple = const Color.hex('9370db'); + static final Color mediumSeaGreen = const Color.hex('3cb371'); + static final Color mediumSlateBlue = const Color.hex('7b68ee'); + static final Color mediumSpringGreen = const Color.hex('00fa9a'); + static final Color mediumTurquoise = const Color.hex('48d1cc'); + static final Color mediumVioletRed = const Color.hex('c71585'); + static final Color midnightBlue = const Color.hex('191970'); + static final Color mintCream = const Color.hex('f5fffa'); + static final Color mistyRose = const Color.hex('ffe4e1'); + static final Color moccasin = const Color.hex('ffe4b5'); + static final Color navajoWhite = const Color.hex('ffdead'); + static final Color navy = const Color.hex('000080'); + static final Color oldLace = const Color.hex('fdf5e6'); + static final Color olive = const Color.hex('808000'); + static final Color oliveDrab = const Color.hex('6b8e23'); + static final Color orange = const Color.hex('ffa500'); + static final Color orangeRed = const Color.hex('ff4500'); + static final Color orchid = const Color.hex('da70d6'); + static final Color paleGoldenRod = const Color.hex('eee8aa'); + static final Color paleGreen = const Color.hex('98fb98'); + static final Color paleTurquoise = const Color.hex('afeeee'); + static final Color paleVioletRed = const Color.hex('db7093'); + static final Color papayaWhip = const Color.hex('ffefd5'); + static final Color peachPuff = const Color.hex('ffdab9'); + static final Color peru = const Color.hex('cd85ef'); + static final Color pink = const Color.hex('ffc0cb'); + static final Color plum = const Color.hex('dda0dd'); + static final Color powderBlue = const Color.hex('b0e0e6'); + static final Color purple = const Color.hex('800080'); + static final Color red = const Color.hex('ff0000'); + static final Color rosyBrown = const Color.hex('bc8f8f'); + static final Color royalBlue = const Color.hex('4169e1'); + static final Color saddleBrown = const Color.hex('8b4513'); + static final Color salmon = const Color.hex('fa8072'); + static final Color sandyBrown = const Color.hex('f4a460'); + static final Color seaGreen = const Color.hex('2e8b57'); + static final Color seashell = const Color.hex('fff5ee'); + static final Color sienna = const Color.hex('a0522d'); + static final Color silver = const Color.hex('c0c0c0'); + static final Color skyBlue = const Color.hex('87ceeb'); + static final Color slateBlue = const Color.hex('6a5acd'); + static final Color slateGray = const Color.hex('708090'); + static final Color slateGrey = const Color.hex('708090'); + static final Color snow = const Color.hex('fffafa'); + static final Color springGreen = const Color.hex('00ff7f'); + static final Color steelBlue = const Color.hex('4682b4'); + static final Color tan = const Color.hex('d2b48c'); + static final Color teal = const Color.hex('008080'); + static final Color thistle = const Color.hex('d8bfd8'); + static final Color tomato = const Color.hex('ff6347'); + static final Color turquoise = const Color.hex('40e0d0'); + static final Color violet = const Color.hex('ee82ee'); + static final Color wheat = const Color.hex('f5deb3'); + static final Color white = const Color.hex('ffffff'); + static final Color whiteSmoke = const Color.hex('f5f5f5'); + static final Color yellow = const Color.hex('ffff00'); + static final Color yellowGreen = const Color.hex('9acd32'); } /// Rgba class for users that want to interact with a color as a RGBA value. @@ -494,13 +500,13 @@ class Rgba implements _StyleProperty, ColorBase { final num a; Rgba(int red, int green, int blue, [num alpha]) - : this.r = Color._clamp(red, 0, 255), - this.g = Color._clamp(green, 0, 255), - this.b = Color._clamp(blue, 0, 255), - this.a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; + : r = Color._clamp(red, 0, 255), + g = Color._clamp(green, 0, 255), + b = Color._clamp(blue, 0, 255), + a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; factory Rgba.fromString(String hexValue) => - Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; + Color.css('#${Color._convertCssToArgb(hexValue)}').rgba; factory Rgba.fromColor(Color color) => color.rgba; @@ -517,10 +523,10 @@ class Rgba implements _StyleProperty, ColorBase { // See site for good documentation // and color conversion routines. - num h = hsla.hue; - num s = hsla.saturation; - num l = hsla.lightness; - num a = hsla.alpha; + var h = hsla.hue; + var s = hsla.saturation; + var l = hsla.lightness; + var a = hsla.alpha; int r; int g; @@ -538,7 +544,7 @@ class Rgba implements _StyleProperty, ColorBase { } else { var2 = (l + s) - (s * l); } - num var1 = 2 * l - var2; + var var1 = 2 * l - var2; r = (255 * Rgba._hueToRGB(var1, var2, h + (1 / 3))).round().toInt(); g = (255 * Rgba._hueToRGB(var1, var2, h)).round().toInt(); @@ -572,20 +578,24 @@ class Rgba implements _StyleProperty, ColorBase { return v1; } + @override bool operator ==(other) => Color.equal(this, other); + @override String get cssExpression { if (a == null) { - return "#${Color.convertToHexString(r, g, b)}"; + return '#${Color.convertToHexString(r, g, b)}'; } else { - return "rgba($r,$g,$b,$a)"; + return 'rgba($r,$g,$b,$a)'; } } + @override String toHexArgbString() => Color.convertToHexString(r, g, b, a); + @override int get argbValue { - int value = 0; + var value = 0; if (a != null) { value = (a.toInt() << 0x18); } @@ -601,6 +611,7 @@ class Rgba implements _StyleProperty, ColorBase { Rgba darker(num amount) => Color._createNewTintShadeFromRgba(this, -amount); Rgba lighter(num amount) => Color._createNewTintShadeFromRgba(this, amount); + @override int get hashCode => toHexArgbString().hashCode; } @@ -619,26 +630,26 @@ class Hsla implements _StyleProperty, ColorBase { /// [lightness] is a 0..1 fraction (100% == 1). /// [alpha] is a 0..1 fraction, alpha blending between 0..1, 1 == 100% opaque. Hsla(num hue, num saturation, num lightness, [num alpha]) - : this._h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1), - this._s = Color._clamp(saturation, 0, 1), - this._l = Color._clamp(lightness, 0, 1), - this._a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; + : _h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1), + _s = Color._clamp(saturation, 0, 1), + _l = Color._clamp(lightness, 0, 1), + _a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha; factory Hsla.fromString(String hexValue) { - Rgba rgba = Color.css("#${Color._convertCssToArgb(hexValue)}").rgba; + var rgba = Color.css('#${Color._convertCssToArgb(hexValue)}').rgba; return _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a); } factory Hsla.fromColor(Color color) { - Rgba rgba = color.rgba; + var rgba = color.rgba; return _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a); } factory Hsla.fromArgbValue(num value) { num a = (value.toInt() & 0xff000000) >> 0x18; - int r = (value.toInt() & 0xff0000) >> 0x10; - int g = (value.toInt() & 0xff00) >> 8; - int b = value.toInt() & 0xff; + var r = (value.toInt() & 0xff0000) >> 0x10; + var g = (value.toInt() & 0xff00) >> 8; + var b = value.toInt() & 0xff; // Convert alpha to 0..1 from (0..255). if (a != null) { @@ -664,14 +675,14 @@ class Hsla implements _StyleProperty, ColorBase { num s; num l; - num minRgb = math.min(r, math.min(g, b)); - num maxRgb = math.max(r, math.max(g, b)); + var minRgb = math.min(r, math.min(g, b)); + var maxRgb = math.max(r, math.max(g, b)); l = (maxRgb + minRgb) / 2; if (l <= 0) { return Hsla(0, 0, l); // Black; } - num vm = maxRgb - minRgb; + var vm = maxRgb - minRgb; s = vm; if (s > 0) { s /= (l < 0.5) ? (maxRgb + minRgb) : (2 - maxRgb - minRgb); @@ -716,15 +727,19 @@ class Hsla implements _StyleProperty, ColorBase { /// Returns number as 0..1 num get alpha => _a; + @override bool operator ==(other) => Color.equal(this, other); + @override String get cssExpression => (_a == null) - ? "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)" - : "hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)"; + ? 'hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)' + : 'hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)'; + @override String toHexArgbString() => Rgba.fromHsla(this).toHexArgbString(); - int get argbValue => Color.hexToInt(this.toHexArgbString()); + @override + int get argbValue => Color.hexToInt(toHexArgbString()); Color get color => Color.createHsla(_h, _s, _l, _a); Rgba get rgba => Rgba.fromHsla(this); @@ -734,6 +749,7 @@ class Hsla implements _StyleProperty, ColorBase { Hsla lighter(num amount) => Hsla.fromRgba(Rgba.fromHsla(this).lighter(amount)); + @override int get hashCode => toHexArgbString().hashCode; } @@ -742,6 +758,7 @@ class PointXY implements _StyleProperty { final num x, y; const PointXY(this.x, this.y); + @override String get cssExpression { // TODO(terry): TBD return null; @@ -768,9 +785,10 @@ class Border implements _StyleProperty { int get width => left + right; int get height => top + bottom; + @override String get cssExpression { return (top == left && bottom == right && top == right) - ? "${left}px" + ? '${left}px' : "${top != null ? '$top' : '0'}px " "${right != null ? '$right' : '0'}px " "${bottom != null ? '$bottom' : '0'}px " @@ -781,24 +799,24 @@ class Border implements _StyleProperty { /// Font style constants. class FontStyle { /// Font style [normal] default. - static const String normal = "normal"; + static const String normal = 'normal'; /// Font style [italic] use explicity crafted italic font otherwise inclined /// on the fly like oblique. - static const String italic = "italic"; + static const String italic = 'italic'; /// Font style [oblique] is rarely used. The normal style of a font is /// inclined on the fly to the right by 8-12 degrees. - static const String oblique = "oblique"; + static const String oblique = 'oblique'; } /// Font variant constants. class FontVariant { /// Font style [normal] default. - static const String normal = "normal"; + static const String normal = 'normal'; /// Font variant [smallCaps]. - static const String smallCaps = "small-caps"; + static const String smallCaps = 'small-caps'; } /// Font weight constants values 100, 200, 300, 400, 500, 600, 700, 800, 900. @@ -823,19 +841,19 @@ class FontWeight { /// Generic font family names. class FontGeneric { /// Generic family sans-serif font (w/o serifs). - static const String sansSerif = "sans-serif"; + static const String sansSerif = 'sans-serif'; /// Generic family serif font. - static const String serif = "serif"; + static const String serif = 'serif'; /// Generic family fixed-width font. - static const monospace = "monospace"; + static const monospace = 'monospace'; /// Generic family emulate handwriting font. - static const String cursive = "cursive"; + static const String cursive = 'cursive'; /// Generic family decorative font. - static const String fantasy = "fantasy"; + static const String fantasy = 'fantasy'; } /// List of most common font families across different platforms. Use the @@ -846,55 +864,55 @@ class FontGeneric { /// description of fonts available between platforms and browsers. class FontFamily { /// Sans-Serif font for Windows similar to Helvetica on Mac bold/italic. - static const String arial = "arial"; + static const String arial = 'arial'; /// Sans-Serif font for Windows less common already bolded. - static const String arialBlack = "arial black"; + static const String arialBlack = 'arial black'; /// Sans-Serif font for Mac since 1984, similar to Arial/Helvetica. - static const String geneva = "geneva"; + static const String geneva = 'geneva'; /// Sans-Serif font for Windows most readable sans-serif font for displays. - static const String verdana = "verdana"; + static const String verdana = 'verdana'; /// Sans-Serif font for Mac since 1984 is identical to Arial. - static const String helvetica = "helvetica"; + static const String helvetica = 'helvetica'; /// Serif font for Windows traditional font with “old-style” numerals. - static const String georgia = "georgia"; + static const String georgia = 'georgia'; /// Serif font for Mac. PCs may have the non-scalable Times use Times New /// Roman instead. Times is more compact than Times New Roman. - static const String times = "times"; + static const String times = 'times'; /// Serif font for Windows most common serif font and default serif font for /// most browsers. - static const String timesNewRoman = "times new roman"; + static const String timesNewRoman = 'times new roman'; /// Monospace font for Mac/Windows most common. Scalable on Mac not scalable /// on Windows. - static const String courier = "courier"; + static const String courier = 'courier'; /// Monospace font for Mac/Windows scalable on both platforms. - static const String courierNew = "courier new"; + static const String courierNew = 'courier new'; /// Cursive font for Windows and default cursive font for IE. - static const String comicSansMs = "comic sans ms"; + static const String comicSansMs = 'comic sans ms'; /// Cursive font for Mac on Macs 2000 and newer. - static const String textile = "textile"; + static const String textile = 'textile'; /// Cursive font for older Macs. - static const String appleChancery = "apple chancery"; + static const String appleChancery = 'apple chancery'; /// Cursive font for some PCs. - static const String zaphChancery = "zaph chancery"; + static const String zaphChancery = 'zaph chancery'; /// Fantasy font on most Mac/Windows/Linux platforms. - static const String impact = "impact"; + static const String impact = 'impact'; /// Fantasy font for Windows. - static const String webdings = "webdings"; + static const String webdings = 'webdings'; } class LineHeight { @@ -1017,12 +1035,13 @@ class Font implements _StyleProperty { /// /// The font-size and font-family values are required. If any of the other /// values are missing the default value is used. + @override String get cssExpression { // TODO(jimhug): include variant, style, other options if (weight != null) { // TODO(jacobr): is this really correct for lineHeight? if (lineHeight != null) { - return "$weight ${size}px/$lineHeightInPixels $_fontsAsString"; + return '$weight ${size}px/$lineHeightInPixels $_fontsAsString'; } return '$weight ${size}px $_fontsAsString'; } @@ -1056,11 +1075,13 @@ class Font implements _StyleProperty { } } + @override int get hashCode { // TODO(jimhug): Lot's of potential collisions here. List of fonts, etc. return size.toInt() % family[0].hashCode; } + @override bool operator ==(other) { if (other is! Font) return false; Font o = other; @@ -1076,8 +1097,8 @@ class Font implements _StyleProperty { // of fonts construction the font-family string. /// Return fonts as a comma seperated list sans the square brackets. String get _fontsAsString { - String fonts = family.toString(); - return fonts.length > 2 ? fonts.substring(1, fonts.length - 1) : ""; + var fonts = family.toString(); + return fonts.length > 2 ? fonts.substring(1, fonts.length - 1) : ''; } } @@ -1126,11 +1147,11 @@ class BoxEdge { /// them in with 0 instead. factory BoxEdge.nonNull(BoxEdge other) { if (other == null) return const BoxEdge(0, 0, 0, 0); - num left = other.left; - num top = other.top; - num right = other.right; - num bottom = other.bottom; - bool make = false; + var left = other.left; + var top = other.top; + var right = other.right; + var bottom = other.bottom; + var make = false; if (left == null) { make = true; left = 0; @@ -1166,11 +1187,11 @@ class BoxEdge { /// The total size of the horizontal edges. Equal to [left] + [right], where /// null is interpreted as 0px. - num get width => (left != null ? left : 0) + (right != null ? right : 0); + num get width => (left ?? 0) + (right ?? 0); /// The total size of the vertical edges. Equal to [top] + [bottom], where /// null is interpreted as 0px. - num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0); + num get height => (top ?? 0) + (bottom ?? 0); } -T _mergeVal(T x, T y) => y != null ? y : x; +T _mergeVal(T x, T y) => y ?? x; diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index f29850fff..7c5ef6568 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -24,6 +24,7 @@ class Token { Token(this.kind, this.span); /// Returns a pretty representation of this token for error messages. + @override String toString() { var kindText = TokenKind.kindToString(kind); var actualText = text.trim(); @@ -55,6 +56,7 @@ class ErrorToken extends Token { /// See and /// . class IdentifierToken extends Token { + @override final String text; IdentifierToken(this.text, int kind, FileSpan span) : super(kind, span); diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index f9e6da0b3..b0b60ebae 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -473,11 +473,11 @@ class TokenKind { String ident = entry['value']; if (length == ident.length) { - int idx = offset; - bool match = true; - for (int i = 0; i < ident.length; i++) { - int identChar = ident.codeUnitAt(i); - int char = text.codeUnitAt(idx++); + var idx = offset; + var match = true; + for (var i = 0; i < ident.length; i++) { + var identChar = ident.codeUnitAt(i); + var char = text.codeUnitAt(idx++); // Compare lowercase to lowercase then check if char is uppercase. match = match && (char == identChar || @@ -571,10 +571,10 @@ class TokenKind { static String decimalToHex(int number, [int minDigits = 1]) { final String _HEX_DIGITS = '0123456789abcdef'; - List result = List(); + var result = []; - int dividend = number >> 4; - int remain = number % 16; + var dividend = number >> 4; + var remain = number % 16; result.add(_HEX_DIGITS[remain]); while (dividend != 0) { remain = dividend % 16; @@ -582,12 +582,12 @@ class TokenKind { result.add(_HEX_DIGITS[remain]); } - StringBuffer invertResult = StringBuffer(); - int paddings = minDigits - result.length; + var invertResult = StringBuffer(); + var paddings = minDigits - result.length; while (paddings-- > 0) { invertResult.write('0'); } - for (int i = result.length - 1; i >= 0; i--) { + for (var i = result.length - 1; i >= 0; i--) { invertResult.write(result[i]); } @@ -597,61 +597,61 @@ class TokenKind { static String kindToString(int kind) { switch (kind) { case TokenKind.UNUSED: - return "ERROR"; + return 'ERROR'; case TokenKind.END_OF_FILE: - return "end of file"; + return 'end of file'; case TokenKind.LPAREN: - return "("; + return '('; case TokenKind.RPAREN: - return ")"; + return ')'; case TokenKind.LBRACK: - return "["; + return '['; case TokenKind.RBRACK: - return "]"; + return ']'; case TokenKind.LBRACE: - return "{"; + return '{'; case TokenKind.RBRACE: - return "}"; + return '}'; case TokenKind.DOT: - return "."; + return '.'; case TokenKind.SEMICOLON: - return ";"; + return ';'; case TokenKind.AT: - return "@"; + return '@'; case TokenKind.HASH: - return "#"; + return '#'; case TokenKind.PLUS: - return "+"; + return '+'; case TokenKind.GREATER: - return ">"; + return '>'; case TokenKind.TILDE: - return "~"; + return '~'; case TokenKind.ASTERISK: - return "*"; + return '*'; case TokenKind.NAMESPACE: - return "|"; + return '|'; case TokenKind.COLON: - return ":"; + return ':'; case TokenKind.PRIVATE_NAME: - return "_"; + return '_'; case TokenKind.COMMA: - return ","; + return ','; case TokenKind.SPACE: - return " "; + return ' '; case TokenKind.TAB: - return "\t"; + return '\t'; case TokenKind.NEWLINE: - return "\n"; + return '\n'; case TokenKind.RETURN: - return "\r"; + return '\r'; case TokenKind.PERCENT: - return "%"; + return '%'; case TokenKind.SINGLE_QUOTE: return "'"; case TokenKind.DOUBLE_QUOTE: - return "\""; + return '\"'; case TokenKind.SLASH: - return "/"; + return '/'; case TokenKind.EQUALS: return '='; case TokenKind.CARET: @@ -667,7 +667,7 @@ class TokenKind { case TokenKind.BACKSLASH: return '\\'; default: - throw "Unknown TOKEN"; + throw 'Unknown TOKEN'; } } diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 724f5b7ac..de28cb35d 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -18,6 +18,7 @@ class Tokenizer extends TokenizerBase { Tokenizer(SourceFile file, String text, bool skipWhitespace, [int index = 0]) : super(file, text, skipWhitespace, index); + @override Token next({bool unicodeRange = false}) { // keep track of our starting position _startIndex = _index; @@ -33,7 +34,7 @@ class Tokenizer extends TokenizerBase { case TokenChar.END_OF_FILE: return _finishToken(TokenKind.END_OF_FILE); case TokenChar.AT: - int peekCh = _peekChar(); + var peekCh = _peekChar(); if (TokenizerHelpers.isIdentifierStart(peekCh)) { var oldIndex = _index; var oldStartIndex = _startIndex; @@ -43,7 +44,7 @@ class Tokenizer extends TokenizerBase { finishIdentifier(); // Is it a directive? - int tokId = TokenKind.matchDirectives( + var tokId = TokenKind.matchDirectives( _text, _startIndex, _index - _startIndex); if (tokId == -1) { // No, is it a margin directive? @@ -62,10 +63,10 @@ class Tokenizer extends TokenizerBase { } return _finishToken(TokenKind.AT); case TokenChar.DOT: - int start = _startIndex; // Start where the dot started. + var start = _startIndex; // Start where the dot started. if (maybeEatDigit()) { // looks like a number dot followed by digit(s). - Token number = finishNumber(); + var number = finishNumber(); if (number.kind == TokenKind.INTEGER) { // It's a number but it's preceeded by a dot, so make it a double. _startIndex = start; @@ -175,7 +176,7 @@ class Tokenizer extends TokenizerBase { } return _finishToken(TokenKind.DOLLAR); case TokenChar.BANG: - Token tok = finishIdentifier(); + var tok = finishIdentifier(); return (tok == null) ? _finishToken(TokenKind.BANG) : tok; default: // TODO(jmesserly): this is used for IE8 detection; I'm not sure it's @@ -241,13 +242,15 @@ class Tokenizer extends TokenizerBase { (_peekChar() == '-'.codeUnitAt(0)); } + @override Token _errorToken([String message]) { return _finishToken(TokenKind.ERROR); } + @override int getIdentifierKind() { // Is the identifier a unit type? - int tokId = -1; + var tokId = -1; // Don't match units in selectors or selector expressions. if (!inSelectorExpression && !inSelector) { @@ -268,10 +271,10 @@ class Tokenizer extends TokenizerBase { var chars = []; // backup so we can start with the first character - int validateFrom = _index; + var validateFrom = _index; _index = _startIndex; while (_index < _text.length) { - int ch = _text.codeUnitAt(_index); + var ch = _text.codeUnitAt(_index); // If the previous character was "\" we need to escape. T // http://www.w3.org/TR/CSS21/syndata.html#characters @@ -279,7 +282,7 @@ class Tokenizer extends TokenizerBase { // otherwise, include the character in the identifier and don't treat it // specially. if (ch == 92 /*\*/ && _inString) { - int startHex = ++_index; + var startHex = ++_index; eatHexDigits(startHex + 6); if (_index != startHex) { // Parse the hex digits and add that character. @@ -319,6 +322,7 @@ class Tokenizer extends TokenizerBase { return IdentifierToken(text, getIdentifierKind(), span); } + @override Token finishNumber() { eatDigits(); @@ -395,7 +399,7 @@ class Tokenizer extends TokenizerBase { Token finishHtmlComment() { while (true) { - int ch = _nextChar(); + var ch = _nextChar(); if (ch == 0) { return _finishToken(TokenKind.INCOMPLETE_COMMENT); } else if (ch == TokenChar.MINUS) { @@ -413,9 +417,10 @@ class Tokenizer extends TokenizerBase { } } + @override Token finishMultiLineComment() { while (true) { - int ch = _nextChar(); + var ch = _nextChar(); if (ch == 0) { return _finishToken(TokenKind.INCOMPLETE_COMMENT); } else if (ch == 42 /*'*'*/) { diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index a12471d89..a648e62a4 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -25,6 +25,8 @@ abstract class TokenizerBase { final SourceFile _file; final String _text; + // TODO: this seems like a bug – this field *is* used + // ignore: prefer_final_fields bool _inString; /// Changes tokenization when in a pseudo function expression. If true then @@ -139,9 +141,9 @@ abstract class TokenizerBase { } Token finishMultiLineComment() { - int nesting = 1; + var nesting = 1; do { - int ch = _nextChar(); + var ch = _nextChar(); if (ch == 0) { return _errorToken(); } else if (ch == TokenChar.ASTERISK) { @@ -241,7 +243,7 @@ abstract class TokenizerBase { } if (_peekChar() != 0 && TokenizerHelpers.isIdentifierStart(_peekChar())) { _nextChar(); - return _errorToken("illegal character in number"); + return _errorToken('illegal character in number'); } return _finishToken(kind); @@ -262,7 +264,7 @@ abstract class TokenizerBase { var s; if (isMultiline) { // Skip initial newline in multiline strings - int start = _startIndex + 4; + var start = _startIndex + 4; if (_text[start] == '\n') start++; s = _text.substring(start, _index - 3); } else { @@ -274,7 +276,7 @@ abstract class TokenizerBase { Token finishMultilineString(int quote) { var buf = []; while (true) { - int ch = _nextChar(); + var ch = _nextChar(); if (ch == 0) { return _errorToken(); } else if (ch == quote) { @@ -288,7 +290,7 @@ abstract class TokenizerBase { } else if (ch == TokenChar.BACKSLASH) { var escapeVal = readEscapeSequence(); if (escapeVal == -1) { - return _errorToken("invalid hex escape sequence"); + return _errorToken('invalid hex escape sequence'); } else { buf.add(escapeVal); } @@ -305,7 +307,7 @@ abstract class TokenizerBase { _maybeEatChar(TokenChar.NEWLINE); return finishMultilineString(quote); } else { - return _makeStringToken(List(), false); + return _makeStringToken([], false); } } return finishStringBody(quote); @@ -320,7 +322,7 @@ abstract class TokenizerBase { } } while (true) { - int ch = _nextChar(); + var ch = _nextChar(); if (ch == quote) { return _makeRawStringToken(false); } else if (ch == 0) { @@ -331,7 +333,7 @@ abstract class TokenizerBase { Token finishMultilineRawString(int quote) { while (true) { - int ch = _nextChar(); + var ch = _nextChar(); if (ch == 0) { return _errorToken(); } else if (ch == quote && _maybeEatChar(quote) && _maybeEatChar(quote)) { @@ -341,9 +343,9 @@ abstract class TokenizerBase { } Token finishStringBody(int quote) { - var buf = List(); + var buf = []; while (true) { - int ch = _nextChar(); + var ch = _nextChar(); if (ch == quote) { return _makeStringToken(buf, false); } else if (ch == 0) { @@ -351,7 +353,7 @@ abstract class TokenizerBase { } else if (ch == TokenChar.BACKSLASH) { var escapeVal = readEscapeSequence(); if (escapeVal == -1) { - return _errorToken("invalid hex escape sequence"); + return _errorToken('invalid hex escape sequence'); } else { buf.add(escapeVal); } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 9c2e38569..4aca2c9ab 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -13,16 +13,21 @@ class Identifier extends TreeNode { Identifier(this.name, SourceSpan span) : super(span); + @override Identifier clone() => Identifier(name, span); + @override visit(VisitorBase visitor) => visitor.visitIdentifier(this); + @override String toString() => name; } class Wildcard extends TreeNode { Wildcard(SourceSpan span) : super(span); + @override Wildcard clone() => Wildcard(span); + @override visit(VisitorBase visitor) => visitor.visitWildcard(this); String get name => '*'; @@ -30,7 +35,9 @@ class Wildcard extends TreeNode { class ThisOperator extends TreeNode { ThisOperator(SourceSpan span) : super(span); + @override ThisOperator clone() => ThisOperator(span); + @override visit(VisitorBase visitor) => visitor.visitThisOperator(this); String get name => '&'; @@ -38,7 +45,9 @@ class ThisOperator extends TreeNode { class Negation extends TreeNode { Negation(SourceSpan span) : super(span); + @override Negation clone() => Negation(span); + @override visit(VisitorBase visitor) => visitor.visitNegation(this); String get name => 'not'; @@ -53,10 +62,13 @@ class CalcTerm extends LiteralTerm { CalcTerm(var value, String t, this.expr, SourceSpan span) : super(value, t, span); + @override CalcTerm clone() => CalcTerm(value, text, expr.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitCalcTerm(this); - String toString() => "$text($expr)"; + @override + String toString() => '$text($expr)'; } // /* .... */ @@ -64,14 +76,18 @@ class CssComment extends TreeNode { final String comment; CssComment(this.comment, SourceSpan span) : super(span); + @override CssComment clone() => CssComment(comment, span); + @override visit(VisitorBase visitor) => visitor.visitCssComment(this); } // CDO/CDC (Comment Definition Open ). class CommentDefinition extends CssComment { CommentDefinition(String comment, SourceSpan span) : super(comment, span); + @override CommentDefinition clone() => CommentDefinition(comment, span); + @override visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); } @@ -80,8 +96,10 @@ class SelectorGroup extends TreeNode { SelectorGroup(this.selectors, SourceSpan span) : super(span); + @override SelectorGroup clone() => SelectorGroup(selectors, span); + @override visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); } @@ -94,6 +112,7 @@ class Selector extends TreeNode { int get length => simpleSelectorSequences.length; + @override Selector clone() { var simpleSequences = simpleSelectorSequences.map((ss) => ss.clone()).toList(); @@ -101,6 +120,7 @@ class Selector extends TreeNode { return Selector(simpleSequences, span); } + @override visit(VisitorBase visitor) => visitor.visitSelector(this); } @@ -136,11 +156,14 @@ class SimpleSelectorSequence extends TreeNode { } } + @override SimpleSelectorSequence clone() => SimpleSelectorSequence(simpleSelector, span, combinator); + @override visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); + @override String toString() => simpleSelector.name; } @@ -157,16 +180,20 @@ abstract class SimpleSelector extends TreeNode { bool get isThis => _name is ThisOperator; + @override visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); } // element name class ElementSelector extends SimpleSelector { ElementSelector(name, SourceSpan span) : super(name, span); + @override visit(VisitorBase visitor) => visitor.visitElementSelector(this); + @override ElementSelector clone() => ElementSelector(_name, span); + @override String toString() => name; } @@ -184,11 +211,14 @@ class NamespaceSelector extends SimpleSelector { SimpleSelector get nameAsSimpleSelector => _name; - NamespaceSelector clone() => NamespaceSelector(_namespace, "", span); + @override + NamespaceSelector clone() => NamespaceSelector(_namespace, '', span); + @override visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); - String toString() => "$namespace|${nameAsSimpleSelector.name}"; + @override + String toString() => '$namespace|${nameAsSimpleSelector.name}'; } // [attr op value] @@ -254,39 +284,51 @@ class AttributeSelector extends SimpleSelector { } } + @override AttributeSelector clone() => AttributeSelector(_name, _op, _value, span); + @override visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); - String toString() => "[$name${matchOperator()}${valueToString()}]"; + @override + String toString() => '[$name${matchOperator()}${valueToString()}]'; } // #id class IdSelector extends SimpleSelector { IdSelector(Identifier name, SourceSpan span) : super(name, span); + @override IdSelector clone() => IdSelector(_name, span); + @override visit(VisitorBase visitor) => visitor.visitIdSelector(this); - String toString() => "#$_name"; + @override + String toString() => '#$_name'; } // .class class ClassSelector extends SimpleSelector { ClassSelector(Identifier name, SourceSpan span) : super(name, span); + @override ClassSelector clone() => ClassSelector(_name, span); + @override visit(VisitorBase visitor) => visitor.visitClassSelector(this); - String toString() => ".$_name"; + @override + String toString() => '.$_name'; } // :pseudoClass class PseudoClassSelector extends SimpleSelector { PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span); + @override visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); + @override PseudoClassSelector clone() => PseudoClassSelector(_name, span); - String toString() => ":$name"; + @override + String toString() => ':$name'; } // ::pseudoElement @@ -297,10 +339,13 @@ class PseudoElementSelector extends SimpleSelector { PseudoElementSelector(Identifier name, SourceSpan span, {this.isLegacy = false}) : super(name, span); + @override visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); + @override PseudoElementSelector clone() => PseudoElementSelector(_name, span); + @override String toString() => "${isLegacy ? ':' : '::'}$name"; } @@ -311,6 +356,7 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { PseudoClassFunctionSelector(Identifier name, this._argument, SourceSpan span) : super(name, span); + @override PseudoClassFunctionSelector clone() => PseudoClassFunctionSelector(_name, _argument, span); @@ -318,6 +364,7 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { Selector get selector => _argument as Selector; SelectorExpression get expression => _argument as SelectorExpression; + @override visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); } @@ -329,9 +376,11 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { Identifier name, this.expression, SourceSpan span) : super(name, span); + @override PseudoElementFunctionSelector clone() => PseudoElementFunctionSelector(_name, expression, span); + @override visit(VisitorBase visitor) => visitor.visitPseudoElementFunctionSelector(this); } @@ -341,10 +390,12 @@ class SelectorExpression extends TreeNode { SelectorExpression(this.expressions, SourceSpan span) : super(span); + @override SelectorExpression clone() { return SelectorExpression(expressions.map((e) => e.clone()).toList(), span); } + @override visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); } @@ -355,16 +406,20 @@ class NegationSelector extends SimpleSelector { NegationSelector(this.negationArg, SourceSpan span) : super(Negation(span), span); + @override NegationSelector clone() => NegationSelector(negationArg, span); + @override visit(VisitorBase visitor) => visitor.visitNegationSelector(this); } class NoOp extends TreeNode { NoOp() : super(null); + @override NoOp clone() => NoOp(); + @override visit(VisitorBase visitor) => visitor.visitNoOp(this); } @@ -381,17 +436,21 @@ class StyleSheet extends TreeNode { /// Selectors only in this tree. StyleSheet.selector(this.topLevels, SourceSpan span) : super(span); + @override StyleSheet clone() { var clonedTopLevels = topLevels.map((e) => e.clone()).toList(); return StyleSheet(clonedTopLevels, span); } + @override visit(VisitorBase visitor) => visitor.visitStyleSheet(this); } class TopLevelProduction extends TreeNode { TopLevelProduction(SourceSpan span) : super(span); + @override TopLevelProduction clone() => TopLevelProduction(span); + @override visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); } @@ -405,12 +464,14 @@ class RuleSet extends TopLevelProduction { SelectorGroup get selectorGroup => _selectorGroup; DeclarationGroup get declarationGroup => _declarationGroup; + @override RuleSet clone() { var cloneSelectorGroup = _selectorGroup.clone(); var cloneDeclarationGroup = _declarationGroup.clone(); return RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); } + @override visit(VisitorBase visitor) => visitor.visitRuleSet(this); } @@ -420,7 +481,9 @@ class Directive extends TreeNode { bool get isBuiltIn => true; // Known CSS directive? bool get isExtension => false; // SCSS extension? + @override Directive clone() => Directive(span); + @override visit(VisitorBase visitor) => visitor.visitDirective(this); } @@ -431,6 +494,7 @@ class DocumentDirective extends Directive { DocumentDirective(this.functions, this.groupRuleBody, SourceSpan span) : super(span); + @override DocumentDirective clone() { var clonedFunctions = []; for (var function in functions) { @@ -443,6 +507,7 @@ class DocumentDirective extends Directive { return DocumentDirective(clonedFunctions, clonedGroupRuleBody, span); } + @override visit(VisitorBase visitor) => visitor.visitDocumentDirective(this); } @@ -453,6 +518,7 @@ class SupportsDirective extends Directive { SupportsDirective(this.condition, this.groupRuleBody, SourceSpan span) : super(span); + @override SupportsDirective clone() { var clonedCondition = condition.clone(); var clonedGroupRuleBody = []; @@ -462,6 +528,7 @@ class SupportsDirective extends Directive { return SupportsDirective(clonedCondition, clonedGroupRuleBody, span); } + @override visit(VisitorBase visitor) => visitor.visitSupportsDirective(this); } @@ -481,9 +548,11 @@ class SupportsConditionInParens extends SupportsCondition { : condition = condition, super(span); + @override SupportsConditionInParens clone() => SupportsConditionInParens(condition.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitSupportsConditionInParens(this); } @@ -492,8 +561,10 @@ class SupportsNegation extends SupportsCondition { SupportsNegation(this.condition, SourceSpan span) : super(span); + @override SupportsNegation clone() => SupportsNegation(condition.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitSupportsNegation(this); } @@ -502,6 +573,7 @@ class SupportsConjunction extends SupportsCondition { SupportsConjunction(this.conditions, SourceSpan span) : super(span); + @override SupportsConjunction clone() { var clonedConditions = []; for (var condition in conditions) { @@ -510,6 +582,7 @@ class SupportsConjunction extends SupportsCondition { return SupportsConjunction(clonedConditions, span); } + @override visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this); } @@ -518,6 +591,7 @@ class SupportsDisjunction extends SupportsCondition { SupportsDisjunction(this.conditions, SourceSpan span) : super(span); + @override SupportsDisjunction clone() { var clonedConditions = []; for (var condition in conditions) { @@ -526,6 +600,7 @@ class SupportsDisjunction extends SupportsCondition { return SupportsDisjunction(clonedConditions, span); } + @override visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this); } @@ -536,9 +611,11 @@ class ViewportDirective extends Directive { ViewportDirective(this.name, this.declarations, SourceSpan span) : super(span); + @override ViewportDirective clone() => ViewportDirective(name, declarations.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitViewportDirective(this); } @@ -552,6 +629,7 @@ class ImportDirective extends Directive { ImportDirective(this.import, this.mediaQueries, SourceSpan span) : super(span); + @override ImportDirective clone() { var cloneMediaQueries = []; for (var mediaQuery in mediaQueries) { @@ -560,6 +638,7 @@ class ImportDirective extends Directive { return ImportDirective(import, cloneMediaQueries, span); } + @override visit(VisitorBase visitor) => visitor.visitImportDirective(this); } @@ -577,11 +656,13 @@ class MediaExpression extends TreeNode { String get mediaFeature => _mediaFeature.name; + @override MediaExpression clone() { var clonedExprs = exprs.clone(); return MediaExpression(andOperator, _mediaFeature, clonedExprs, span); } + @override visit(VisitorBase visitor) => visitor.visitMediaExpression(this); } @@ -612,6 +693,7 @@ class MediaQuery extends TreeNode { String get unary => TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); + @override MediaQuery clone() { var cloneExpressions = []; for (var expr in expressions) { @@ -620,6 +702,7 @@ class MediaQuery extends TreeNode { return MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); } + @override visit(VisitorBase visitor) => visitor.visitMediaQuery(this); } @@ -629,6 +712,7 @@ class MediaDirective extends Directive { MediaDirective(this.mediaQueries, this.rules, SourceSpan span) : super(span); + @override MediaDirective clone() { var cloneQueries = []; for (var mediaQuery in mediaQueries) { @@ -641,6 +725,7 @@ class MediaDirective extends Directive { return MediaDirective(cloneQueries, cloneRules, span); } + @override visit(VisitorBase visitor) => visitor.visitMediaDirective(this); } @@ -649,6 +734,7 @@ class HostDirective extends Directive { HostDirective(this.rules, SourceSpan span) : super(span); + @override HostDirective clone() { var cloneRules = []; for (var rule in rules) { @@ -657,6 +743,7 @@ class HostDirective extends Directive { return HostDirective(cloneRules, span); } + @override visit(VisitorBase visitor) => visitor.visitHostDirective(this); } @@ -669,6 +756,7 @@ class PageDirective extends Directive { this._ident, this._pseudoPage, this._declsMargin, SourceSpan span) : super(span); + @override PageDirective clone() { var cloneDeclsMargin = []; for (var declMargin in _declsMargin) { @@ -677,6 +765,7 @@ class PageDirective extends Directive { return PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span); } + @override visit(VisitorBase visitor) => visitor.visitPageDirective(this); bool get hasIdent => _ident != null && _ident.isNotEmpty; @@ -687,7 +776,9 @@ class CharsetDirective extends Directive { final String charEncoding; CharsetDirective(this.charEncoding, SourceSpan span) : super(span); + @override CharsetDirective clone() => CharsetDirective(charEncoding, span); + @override visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); } @@ -720,6 +811,7 @@ class KeyFrameDirective extends Directive { return null; } + @override KeyFrameDirective clone() { var directive = KeyFrameDirective(_keyframeName, name.clone(), span); for (var block in _blocks) { @@ -728,6 +820,7 @@ class KeyFrameDirective extends Directive { return directive; } + @override visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); } @@ -738,8 +831,10 @@ class KeyFrameBlock extends Expression { KeyFrameBlock(this._blockSelectors, this._declarations, SourceSpan span) : super(span); + @override KeyFrameBlock clone() => KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); } @@ -748,7 +843,9 @@ class FontFaceDirective extends Directive { FontFaceDirective(this._declarations, SourceSpan span) : super(span); + @override FontFaceDirective clone() => FontFaceDirective(_declarations.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); } @@ -759,9 +856,12 @@ class StyletDirective extends Directive { StyletDirective(this.dartClassName, this.rules, SourceSpan span) : super(span); + @override bool get isBuiltIn => false; + @override bool get isExtension => true; + @override StyletDirective clone() { var cloneRules = []; for (var rule in rules) { @@ -770,6 +870,7 @@ class StyletDirective extends Directive { return StyletDirective(dartClassName, cloneRules, span); } + @override visit(VisitorBase visitor) => visitor.visitStyletDirective(this); } @@ -782,8 +883,10 @@ class NamespaceDirective extends Directive { NamespaceDirective(this._prefix, this._uri, SourceSpan span) : super(span); + @override NamespaceDirective clone() => NamespaceDirective(_prefix, _uri, span); + @override visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); String get prefix => _prefix.isNotEmpty ? '$_prefix ' : ''; @@ -795,8 +898,10 @@ class VarDefinitionDirective extends Directive { VarDefinitionDirective(this.def, SourceSpan span) : super(span); + @override VarDefinitionDirective clone() => VarDefinitionDirective(def.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); } @@ -808,6 +913,7 @@ class MixinDefinition extends Directive { MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span) : super(span); + @override MixinDefinition clone() { var cloneDefinedArgs = []; for (var definedArg in definedArgs) { @@ -816,6 +922,7 @@ class MixinDefinition extends Directive { return MixinDefinition(name, cloneDefinedArgs, varArgs, span); } + @override visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); } @@ -827,6 +934,7 @@ class MixinRulesetDirective extends MixinDefinition { this.rulesets, SourceSpan span) : super(name, args, varArgs, span); + @override MixinRulesetDirective clone() { var clonedArgs = []; for (var arg in definedArgs) { @@ -840,6 +948,7 @@ class MixinRulesetDirective extends MixinDefinition { name, clonedArgs, varArgs, clonedRulesets, span); } + @override visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); } @@ -850,6 +959,7 @@ class MixinDeclarationDirective extends MixinDefinition { this.declarations, SourceSpan span) : super(name, args, varArgs, span); + @override MixinDeclarationDirective clone() { var clonedArgs = []; for (var arg in definedArgs) { @@ -859,6 +969,7 @@ class MixinDeclarationDirective extends MixinDefinition { name, clonedArgs, varArgs, declarations.clone(), span); } + @override visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); } @@ -869,6 +980,7 @@ class IncludeDirective extends Directive { IncludeDirective(this.name, this.args, SourceSpan span) : super(span); + @override IncludeDirective clone() { var cloneArgs = >[]; for (var arg in args) { @@ -877,6 +989,7 @@ class IncludeDirective extends Directive { return IncludeDirective(name, cloneArgs, span); } + @override visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); } @@ -884,6 +997,7 @@ class IncludeDirective extends Directive { class ContentDirective extends Directive { ContentDirective(SourceSpan span) : super(span); + @override visit(VisitorBase visitor) => visitor.visitContentDirective(this); } @@ -905,9 +1019,8 @@ class Declaration extends TreeNode { final bool isIE7; Declaration(this._property, this._expression, this.dartStyle, SourceSpan span, - {bool important = false, bool ie7 = false}) - : this.important = important, - this.isIE7 = ie7, + {this.important = false, bool ie7 = false}) + : isIE7 = ie7, super(span); String get property => isIE7 ? '*${_property.name}' : _property.name; @@ -915,10 +1028,12 @@ class Declaration extends TreeNode { bool get hasDartStyle => dartStyle != null; + @override Declaration clone() => Declaration(_property.clone(), _expression.clone(), dartStyle, span, important: important); + @override visit(VisitorBase visitor) => visitor.visitDeclaration(this); } @@ -936,9 +1051,11 @@ class VarDefinition extends Declaration { String get definedName => _property.name; + @override VarDefinition clone() => VarDefinition( _property.clone(), expression != null ? expression.clone() : null, span); + @override visit(VisitorBase visitor) => visitor.visitVarDefinition(this); } @@ -954,9 +1071,11 @@ class IncludeMixinAtDeclaration extends Declaration { IncludeMixinAtDeclaration(this.include, SourceSpan span) : super(null, null, null, span); + @override IncludeMixinAtDeclaration clone() => IncludeMixinAtDeclaration(include.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this); } @@ -966,11 +1085,13 @@ class ExtendDeclaration extends Declaration { ExtendDeclaration(this.selectors, SourceSpan span) : super(null, null, null, span); + @override ExtendDeclaration clone() { var newSelector = selectors.map((s) => s.clone()).toList(); return ExtendDeclaration(newSelector, span); } + @override visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); } @@ -980,11 +1101,13 @@ class DeclarationGroup extends TreeNode { DeclarationGroup(this.declarations, SourceSpan span) : super(span); + @override DeclarationGroup clone() { var clonedDecls = declarations.map((d) => d.clone()).toList(); return DeclarationGroup(clonedDecls, span); } + @override visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); } @@ -993,8 +1116,10 @@ class MarginGroup extends DeclarationGroup { MarginGroup(this.margin_sym, List decls, SourceSpan span) : super(decls, span); + @override MarginGroup clone() => MarginGroup(margin_sym, super.clone().declarations, span); + @override visit(VisitorBase visitor) => visitor.visitMarginGroup(this); } @@ -1004,6 +1129,7 @@ class VarUsage extends Expression { VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span); + @override VarUsage clone() { var clonedValues = []; for (var expr in defaultValues) { @@ -1012,30 +1138,39 @@ class VarUsage extends Expression { return VarUsage(name, clonedValues, span); } + @override visit(VisitorBase visitor) => visitor.visitVarUsage(this); } class OperatorSlash extends Expression { OperatorSlash(SourceSpan span) : super(span); + @override OperatorSlash clone() => OperatorSlash(span); + @override visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); } class OperatorComma extends Expression { OperatorComma(SourceSpan span) : super(span); + @override OperatorComma clone() => OperatorComma(span); + @override visit(VisitorBase visitor) => visitor.visitOperatorComma(this); } class OperatorPlus extends Expression { OperatorPlus(SourceSpan span) : super(span); + @override OperatorPlus clone() => OperatorPlus(span); + @override visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); } class OperatorMinus extends Expression { OperatorMinus(SourceSpan span) : super(span); + @override OperatorMinus clone() => OperatorMinus(span); + @override visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); } @@ -1047,8 +1182,10 @@ class UnicodeRangeTerm extends Expression { bool get hasSecond => second != null; + @override UnicodeRangeTerm clone() => UnicodeRangeTerm(first, second, span); + @override visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); } @@ -1061,14 +1198,18 @@ class LiteralTerm extends Expression { LiteralTerm(this.value, this.text, SourceSpan span) : super(span); + @override LiteralTerm clone() => LiteralTerm(value, text, span); + @override visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); } class NumberTerm extends LiteralTerm { NumberTerm(value, String t, SourceSpan span) : super(value, t, span); + @override NumberTerm clone() => NumberTerm(value, text, span); + @override visit(VisitorBase visitor) => visitor.visitNumberTerm(this); } @@ -1077,12 +1218,15 @@ class UnitTerm extends LiteralTerm { UnitTerm(value, String t, SourceSpan span, this.unit) : super(value, t, span); + @override UnitTerm clone() => UnitTerm(value, text, span, unit); + @override visit(VisitorBase visitor) => visitor.visitUnitTerm(this); String unitToString() => TokenKind.unitToString(unit); + @override String toString() => '$text${unitToString()}'; } @@ -1097,25 +1241,33 @@ class LengthTerm extends UnitTerm { this.unit == TokenKind.UNIT_LENGTH_PT || this.unit == TokenKind.UNIT_LENGTH_PC); } + @override LengthTerm clone() => LengthTerm(value, text, span, unit); + @override visit(VisitorBase visitor) => visitor.visitLengthTerm(this); } class PercentageTerm extends LiteralTerm { PercentageTerm(value, String t, SourceSpan span) : super(value, t, span); + @override PercentageTerm clone() => PercentageTerm(value, text, span); + @override visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); } class EmTerm extends LiteralTerm { EmTerm(value, String t, SourceSpan span) : super(value, t, span); + @override EmTerm clone() => EmTerm(value, text, span); + @override visit(VisitorBase visitor) => visitor.visitEmTerm(this); } class ExTerm extends LiteralTerm { ExTerm(value, String t, SourceSpan span) : super(value, t, span); + @override ExTerm clone() => ExTerm(value, text, span); + @override visit(VisitorBase visitor) => visitor.visitExTerm(this); } @@ -1129,7 +1281,9 @@ class AngleTerm extends UnitTerm { this.unit == TokenKind.UNIT_ANGLE_TURN); } + @override AngleTerm clone() => AngleTerm(value, text, span, unit); + @override visit(VisitorBase visitor) => visitor.visitAngleTerm(this); } @@ -1142,7 +1296,9 @@ class TimeTerm extends UnitTerm { this.unit == TokenKind.UNIT_TIME_S); } + @override TimeTerm clone() => TimeTerm(value, text, span, unit); + @override visit(VisitorBase visitor) => visitor.visitTimeTerm(this); } @@ -1153,21 +1309,27 @@ class FreqTerm extends UnitTerm { assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); } + @override FreqTerm clone() => FreqTerm(value, text, span, unit); + @override visit(VisitorBase visitor) => visitor.visitFreqTerm(this); } class FractionTerm extends LiteralTerm { FractionTerm(var value, String t, SourceSpan span) : super(value, t, span); + @override FractionTerm clone() => FractionTerm(value, text, span); + @override visit(VisitorBase visitor) => visitor.visitFractionTerm(this); } class UriTerm extends LiteralTerm { UriTerm(String value, SourceSpan span) : super(value, value, span); + @override UriTerm clone() => UriTerm(value, span); + @override visit(VisitorBase visitor) => visitor.visitUriTerm(this); } @@ -1180,7 +1342,9 @@ class ResolutionTerm extends UnitTerm { unit == TokenKind.UNIT_RESOLUTION_DPPX); } + @override ResolutionTerm clone() => ResolutionTerm(value, text, span, unit); + @override visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); } @@ -1191,7 +1355,9 @@ class ChTerm extends UnitTerm { assert(unit == TokenKind.UNIT_CH); } + @override ChTerm clone() => ChTerm(value, text, span, unit); + @override visit(VisitorBase visitor) => visitor.visitChTerm(this); } @@ -1202,7 +1368,9 @@ class RemTerm extends UnitTerm { assert(unit == TokenKind.UNIT_REM); } + @override RemTerm clone() => RemTerm(value, text, span, unit); + @override visit(VisitorBase visitor) => visitor.visitRemTerm(this); } @@ -1216,7 +1384,9 @@ class ViewportTerm extends UnitTerm { unit == TokenKind.UNIT_VIEWPORT_VMAX); } + @override ViewportTerm clone() => ViewportTerm(value, text, span, unit); + @override visit(VisitorBase visitor) => visitor.visitViewportTerm(this); } @@ -1226,7 +1396,9 @@ class BAD_HEX_VALUE {} class HexColorTerm extends LiteralTerm { HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span); + @override HexColorTerm clone() => HexColorTerm(value, text, span); + @override visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); } @@ -1236,7 +1408,9 @@ class FunctionTerm extends LiteralTerm { FunctionTerm(var value, String t, this._params, SourceSpan span) : super(value, t, span); + @override FunctionTerm clone() => FunctionTerm(value, text, _params.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); } @@ -1245,7 +1419,9 @@ class FunctionTerm extends LiteralTerm { /// browsers. class IE8Term extends LiteralTerm { IE8Term(SourceSpan span) : super('\\9', '\\9', span); + @override IE8Term clone() => IE8Term(span); + @override visit(VisitorBase visitor) => visitor.visitIE8Term(this); } @@ -1260,14 +1436,18 @@ class GroupTerm extends Expression { _terms.add(term); } + @override GroupTerm clone() => GroupTerm(span); + @override visit(VisitorBase visitor) => visitor.visitGroupTerm(this); } class ItemTerm extends NumberTerm { ItemTerm(dynamic value, String t, SourceSpan span) : super(value, t, span); + @override ItemTerm clone() => ItemTerm(value, text, span); + @override visit(VisitorBase visitor) => visitor.visitItemTerm(this); } @@ -1280,6 +1460,7 @@ class Expressions extends Expression { expressions.add(expression); } + @override Expressions clone() { var clonedExprs = Expressions(span); for (var expr in expressions) { @@ -1288,6 +1469,7 @@ class Expressions extends Expression { return clonedExprs; } + @override visit(VisitorBase visitor) => visitor.visitExpressions(this); } @@ -1298,7 +1480,9 @@ class BinaryExpression extends Expression { BinaryExpression(this.op, this.x, this.y, SourceSpan span) : super(span); + @override BinaryExpression clone() => BinaryExpression(op, x.clone(), y.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); } @@ -1308,7 +1492,9 @@ class UnaryExpression extends Expression { UnaryExpression(this.op, this.self, SourceSpan span) : super(span); + @override UnaryExpression clone() => UnaryExpression(op, self.clone(), span); + @override visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); } @@ -1340,8 +1526,9 @@ abstract class DartStyleExpression extends TreeNode { bool get isWidth => _styleType == widthStyle; bool get isBoxExpression => isMargin || isBorder || isPadding; - bool isSame(DartStyleExpression other) => this._styleType == other._styleType; + bool isSame(DartStyleExpression other) => _styleType == other._styleType; + @override visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); } @@ -1367,8 +1554,9 @@ class FontExpression extends DartStyleExpression { lineHeight: lineHeight), super(DartStyleExpression.fontStyle, span); + @override FontExpression merged(DartStyleExpression newFontExpr) { - if (newFontExpr is FontExpression && this.isFont && newFontExpr.isFont) { + if (newFontExpr is FontExpression && isFont && newFontExpr.isFont) { return FontExpression.merge(this, newFontExpr); } return null; @@ -1383,6 +1571,7 @@ class FontExpression extends DartStyleExpression { : font = Font.merge(x.font, y.font), super(DartStyleExpression.fontStyle, span); + @override FontExpression clone() => FontExpression(span, size: font.size, family: font.family, @@ -1391,6 +1580,7 @@ class FontExpression extends DartStyleExpression { variant: font.variant, lineHeight: font.lineHeight); + @override visit(VisitorBase visitor) => visitor.visitFontExpression(this); } @@ -1400,16 +1590,17 @@ abstract class BoxExpression extends DartStyleExpression { BoxExpression(int styleType, SourceSpan span, this.box) : super(styleType, span); + @override visit(VisitorBase visitor) => visitor.visitBoxExpression(this); String get formattedBoxEdge { if (box.top == box.left && box.top == box.bottom && box.top == box.right) { return '.uniform(${box.top})'; } else { - var left = box.left == null ? 0 : box.left; - var top = box.top == null ? 0 : box.top; - var right = box.right == null ? 0 : box.right; - var bottom = box.bottom == null ? 0 : box.bottom; + var left = box.left ?? 0; + var top = box.top ?? 0; + var right = box.right ?? 0; + var bottom = box.bottom ?? 0; return '.clockwiseFromTop($top,$right,$bottom,$left)'; } } @@ -1425,9 +1616,10 @@ class MarginExpression extends BoxExpression { MarginExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.marginStyle, span, box); + @override merged(DartStyleExpression newMarginExpr) { if (newMarginExpr is MarginExpression && - this.isMargin && + isMargin && newMarginExpr.isMargin) { return MarginExpression.merge(this, newMarginExpr); } @@ -1444,9 +1636,11 @@ class MarginExpression extends BoxExpression { MarginExpression x, MarginExpression y, SourceSpan span) : super(x._styleType, span, BoxEdge.merge(x.box, y.box)); + @override MarginExpression clone() => MarginExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); + @override visit(VisitorBase visitor) => visitor.visitMarginExpression(this); } @@ -1459,9 +1653,10 @@ class BorderExpression extends BoxExpression { BorderExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.borderStyle, span, box); + @override merged(DartStyleExpression newBorderExpr) { if (newBorderExpr is BorderExpression && - this.isBorder && + isBorder && newBorderExpr.isBorder) { return BorderExpression.merge(this, newBorderExpr); } @@ -1479,9 +1674,11 @@ class BorderExpression extends BoxExpression { : super( DartStyleExpression.borderStyle, span, BoxEdge.merge(x.box, y.box)); + @override BorderExpression clone() => BorderExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); + @override visit(VisitorBase visitor) => visitor.visitBorderExpression(this); } @@ -1491,9 +1688,10 @@ class HeightExpression extends DartStyleExpression { HeightExpression(SourceSpan span, this.height) : super(DartStyleExpression.heightStyle, span); + @override merged(DartStyleExpression newHeightExpr) { if (newHeightExpr is DartStyleExpression && - this.isHeight && + isHeight && newHeightExpr.isHeight) { return newHeightExpr; } @@ -1501,7 +1699,9 @@ class HeightExpression extends DartStyleExpression { return null; } + @override HeightExpression clone() => HeightExpression(span, height); + @override visit(VisitorBase visitor) => visitor.visitHeightExpression(this); } @@ -1511,17 +1711,18 @@ class WidthExpression extends DartStyleExpression { WidthExpression(SourceSpan span, this.width) : super(DartStyleExpression.widthStyle, span); + @override merged(DartStyleExpression newWidthExpr) { - if (newWidthExpr is WidthExpression && - this.isWidth && - newWidthExpr.isWidth) { + if (newWidthExpr is WidthExpression && isWidth && newWidthExpr.isWidth) { return newWidthExpr; } return null; } + @override WidthExpression clone() => WidthExpression(span, width); + @override visit(VisitorBase visitor) => visitor.visitWidthExpression(this); } @@ -1534,9 +1735,10 @@ class PaddingExpression extends BoxExpression { PaddingExpression.boxEdge(SourceSpan span, BoxEdge box) : super(DartStyleExpression.paddingStyle, span, box); + @override merged(DartStyleExpression newPaddingExpr) { if (newPaddingExpr is PaddingExpression && - this.isPadding && + isPadding && newPaddingExpr.isPadding) { return PaddingExpression.merge(this, newPaddingExpr); } @@ -1554,7 +1756,9 @@ class PaddingExpression extends BoxExpression { : super(DartStyleExpression.paddingStyle, span, BoxEdge.merge(x.box, y.box)); + @override PaddingExpression clone() => PaddingExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); + @override visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); } diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 5011f3da4..ef157cd89 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -20,7 +20,7 @@ abstract class TreeNode { String toDebugString() { var to = TreeOutput(); var tp = _TreePrinter(to, true); - this.visit(tp); + visit(tp); return to.buf.toString(); } } @@ -37,7 +37,7 @@ class TreeOutput { VisitorBase printer; void write(String s) { - for (int i = 0; i < depth; i++) { + for (var i = 0; i < depth; i++) { buf.write(' '); } buf.write(s); @@ -98,5 +98,6 @@ class TreeOutput { } } + @override String toString() => buf.toString(); } diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index d8d4962cc..8aa585289 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -21,6 +21,7 @@ class _TreePrinter extends Visitor { output.printer = this; } + @override void visitTree(StyleSheet tree) => visitStylesheet(tree); void heading(String heading, node) { @@ -38,14 +39,17 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitTopLevelProduction(TopLevelProduction node) { heading('TopLevelProduction', node); } + @override void visitDirective(Directive node) { heading('Directive', node); } + @override void visitCalcTerm(CalcTerm node) { heading('CalcTerm', node); output.depth++; @@ -53,6 +57,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitCssComment(CssComment node) { heading('Comment', node); output.depth++; @@ -60,6 +65,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitCommentDefinition(CommentDefinition node) { heading('CommentDefinition (CDO/CDC)', node); output.depth++; @@ -67,6 +73,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitMediaExpression(MediaExpression node) { heading('MediaExpression', node); output.writeValue('feature', node.mediaFeature); @@ -81,6 +88,7 @@ class _TreePrinter extends Visitor { output.writeNodeList('media expressions', query.expressions); } + @override void visitMediaDirective(MediaDirective node) { heading('MediaDirective', node); output.depth++; @@ -90,6 +98,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitDocumentDirective(DocumentDirective node) { heading('DocumentDirective', node); output.depth++; @@ -98,6 +107,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitSupportsDirective(SupportsDirective node) { heading('SupportsDirective', node); output.depth++; @@ -106,6 +116,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitSupportsConditionInParens(SupportsConditionInParens node) { heading('SupportsConditionInParens', node); output.depth++; @@ -113,6 +124,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitSupportsNegation(SupportsNegation node) { heading('SupportsNegation', node); output.depth++; @@ -120,6 +132,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitSupportsConjunction(SupportsConjunction node) { heading('SupportsConjunction', node); output.depth++; @@ -127,6 +140,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitSupportsDisjunction(SupportsDisjunction node) { heading('SupportsDisjunction', node); output.depth++; @@ -134,6 +148,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitViewportDirective(ViewportDirective node) { heading('ViewportDirective', node); output.depth++; @@ -141,6 +156,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitPageDirective(PageDirective node) { heading('PageDirective', node); output.depth++; @@ -149,11 +165,13 @@ class _TreePrinter extends Visitor { output.depth; } + @override void visitCharsetDirective(CharsetDirective node) { heading('Charset Directive', node); output.writeValue('charset encoding', node.charEncoding); } + @override void visitImportDirective(ImportDirective node) { heading('ImportDirective', node); output.depth++; @@ -163,10 +181,12 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitContentDirective(ContentDirective node) { - print("ContentDirective not implemented"); + print('ContentDirective not implemented'); } + @override void visitKeyFrameDirective(KeyFrameDirective node) { heading('KeyFrameDirective', node); output.depth++; @@ -176,6 +196,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitKeyFrameBlock(KeyFrameBlock node) { heading('KeyFrameBlock', node); output.depth++; @@ -183,10 +204,12 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitFontFaceDirective(FontFaceDirective node) { // TODO(terry): To Be Implemented } + @override void visitStyletDirective(StyletDirective node) { heading('StyletDirective', node); output.writeValue('dartClassName', node.dartClassName); @@ -195,6 +218,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitNamespaceDirective(NamespaceDirective node) { heading('NamespaceDirective', node); output.depth++; @@ -203,6 +227,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitVarDefinitionDirective(VarDefinitionDirective node) { heading('Less variable definition', node); output.depth++; @@ -210,6 +235,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitMixinRulesetDirective(MixinRulesetDirective node) { heading('Mixin top-level ${node.name}', node); output.writeNodeList('parameters', node.definedArgs); @@ -218,6 +244,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitMixinDeclarationDirective(MixinDeclarationDirective node) { heading('Mixin declaration ${node.name}', node); output.writeNodeList('parameters', node.definedArgs); @@ -228,12 +255,14 @@ class _TreePrinter extends Visitor { /// Added optional newLine for handling @include at top-level vs/ inside of /// a declaration group. + @override void visitIncludeDirective(IncludeDirective node) { heading('IncludeDirective ${node.name}', node); var flattened = node.args.expand((e) => e).toList(); output.writeNodeList('parameters', flattened); } + @override void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { heading('IncludeMixinAtDeclaration ${node.include.name}', node); output.depth++; @@ -241,6 +270,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitExtendDeclaration(ExtendDeclaration node) { heading('ExtendDeclaration', node); output.depth++; @@ -248,6 +278,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitRuleSet(RuleSet node) { heading('Ruleset', node); output.depth++; @@ -255,6 +286,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitDeclarationGroup(DeclarationGroup node) { heading('DeclarationGroup', node); output.depth++; @@ -262,6 +294,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitMarginGroup(MarginGroup node) { heading('MarginGroup', node); output.depth++; @@ -270,6 +303,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitDeclaration(Declaration node) { heading('Declaration', node); output.depth++; @@ -283,6 +317,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitVarDefinition(VarDefinition node) { heading('Var', node); output.depth++; @@ -292,6 +327,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitSelectorGroup(SelectorGroup node) { heading('Selector Group', node); output.depth++; @@ -299,6 +335,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitSelector(Selector node) { heading('Selector', node); output.depth++; @@ -307,21 +344,22 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitSimpleSelectorSequence(SimpleSelectorSequence node) { heading('SimpleSelectorSequence', node); output.depth++; if (node.isCombinatorNone) { - output.writeValue('combinator', "NONE"); + output.writeValue('combinator', 'NONE'); } else if (node.isCombinatorDescendant) { - output.writeValue('combinator', "descendant"); + output.writeValue('combinator', 'descendant'); } else if (node.isCombinatorPlus) { - output.writeValue('combinator', "+"); + output.writeValue('combinator', '+'); } else if (node.isCombinatorGreater) { - output.writeValue('combinator', ">"); + output.writeValue('combinator', '>'); } else if (node.isCombinatorTilde) { - output.writeValue('combinator', "~"); + output.writeValue('combinator', '~'); } else { - output.writeValue('combinator', "ERROR UNKNOWN"); + output.writeValue('combinator', 'ERROR UNKNOWN'); } super.visitSimpleSelectorSequence(node); @@ -329,6 +367,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitNamespaceSelector(NamespaceSelector node) { heading('Namespace Selector', node); output.depth++; @@ -339,6 +378,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitElementSelector(ElementSelector node) { heading('Element Selector', node); output.depth++; @@ -346,16 +386,18 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitAttributeSelector(AttributeSelector node) { heading('AttributeSelector', node); output.depth++; super.visitAttributeSelector(node); - String tokenStr = node.matchOperatorAsTokenString(); + var tokenStr = node.matchOperatorAsTokenString(); output.writeValue('operator', '${node.matchOperator()} (${tokenStr})'); output.writeValue('value', node.valueToString()); output.depth--; } + @override void visitIdSelector(IdSelector node) { heading('Id Selector', node); output.depth++; @@ -363,6 +405,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitClassSelector(ClassSelector node) { heading('Class Selector', node); output.depth++; @@ -370,6 +413,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitPseudoClassSelector(PseudoClassSelector node) { heading('Pseudo Class Selector', node); output.depth++; @@ -377,6 +421,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitPseudoElementSelector(PseudoElementSelector node) { heading('Pseudo Element Selector', node); output.depth++; @@ -384,6 +429,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { heading('Pseudo Class Function Selector', node); output.depth++; @@ -392,6 +438,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) { heading('Pseudo Element Function Selector', node); output.depth++; @@ -400,6 +447,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitSelectorExpression(SelectorExpression node) { heading('Selector Expression', node); output.depth++; @@ -407,6 +455,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitNegationSelector(NegationSelector node) { super.visitNegationSelector(node); output.depth++; @@ -415,6 +464,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitUnicodeRangeTerm(UnicodeRangeTerm node) { heading('UnicodeRangeTerm', node); output.depth++; @@ -423,6 +473,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitLiteralTerm(LiteralTerm node) { heading('LiteralTerm', node); output.depth++; @@ -430,6 +481,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitHexColorTerm(HexColorTerm node) { heading('HexColorTerm', node); output.depth++; @@ -438,6 +490,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitNumberTerm(NumberTerm node) { heading('NumberTerm', node); output.depth++; @@ -445,6 +498,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitUnitTerm(UnitTerm node) { output.depth++; output.writeValue('value', node.text); @@ -452,11 +506,13 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitLengthTerm(LengthTerm node) { heading('LengthTerm', node); super.visitLengthTerm(node); } + @override void visitPercentageTerm(PercentageTerm node) { heading('PercentageTerm', node); output.depth++; @@ -464,6 +520,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitEmTerm(EmTerm node) { heading('EmTerm', node); output.depth++; @@ -471,6 +528,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitExTerm(ExTerm node) { heading('ExTerm', node); output.depth++; @@ -478,21 +536,25 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitAngleTerm(AngleTerm node) { heading('AngleTerm', node); super.visitAngleTerm(node); } + @override void visitTimeTerm(TimeTerm node) { heading('TimeTerm', node); super.visitTimeTerm(node); } + @override void visitFreqTerm(FreqTerm node) { heading('FreqTerm', node); super.visitFreqTerm(node); } + @override void visitFractionTerm(FractionTerm node) { heading('FractionTerm', node); output.depth++; @@ -500,6 +562,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitUriTerm(UriTerm node) { heading('UriTerm', node); output.depth++; @@ -507,6 +570,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitFunctionTerm(FunctionTerm node) { heading('FunctionTerm', node); output.depth++; @@ -514,6 +578,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitGroupTerm(GroupTerm node) { heading('GroupTerm', node); output.depth++; @@ -521,32 +586,39 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitItemTerm(ItemTerm node) { heading('ItemTerm', node); super.visitItemTerm(node); } + @override void visitIE8Term(IE8Term node) { heading('IE8Term', node); visitLiteralTerm(node); } + @override void visitOperatorSlash(OperatorSlash node) { heading('OperatorSlash', node); } + @override void visitOperatorComma(OperatorComma node) { heading('OperatorComma', node); } + @override void visitOperatorPlus(OperatorPlus node) { heading('OperatorPlus', node); } + @override void visitOperatorMinus(OperatorMinus node) { heading('OperatorMinus', node); } + @override void visitVarUsage(VarUsage node) { heading('Var', node); output.depth++; @@ -555,6 +627,7 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitExpressions(Expressions node) { heading('Expressions', node); output.depth++; @@ -562,52 +635,64 @@ class _TreePrinter extends Visitor { output.depth--; } + @override void visitBinaryExpression(BinaryExpression node) { heading('BinaryExpression', node); // TODO(terry): TBD } + @override void visitUnaryExpression(UnaryExpression node) { heading('UnaryExpression', node); // TODO(terry): TBD } + @override void visitIdentifier(Identifier node) { heading('Identifier(${output.toValue(node.name)})', node); } + @override void visitWildcard(Wildcard node) { heading('Wildcard(*)', node); } + @override void visitDartStyleExpression(DartStyleExpression node) { heading('DartStyleExpression', node); } + @override void visitFontExpression(FontExpression node) { heading('Dart Style FontExpression', node); } + @override void visitBoxExpression(BoxExpression node) { heading('Dart Style BoxExpression', node); } + @override void visitMarginExpression(MarginExpression node) { heading('Dart Style MarginExpression', node); } + @override void visitBorderExpression(BorderExpression node) { heading('Dart Style BorderExpression', node); } + @override void visitHeightExpression(HeightExpression node) { heading('Dart Style HeightExpression', node); } + @override void visitPaddingExpression(PaddingExpression node) { heading('Dart Style PaddingExpression', node); } + @override void visitWidthExpression(WidthExpression node) { heading('Dart Style WidthExpression', node); } diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index e6d66f24a..fe18e0568 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -19,7 +19,7 @@ class Validate { if (selector.isCombinatorDescendant || (selector.isCombinatorNone && matches == 0)) { if (matches < 0) { - String tooMany = selector.simpleSelector.toString(); + var tooMany = selector.simpleSelector.toString(); throw CssSelectorException( 'Can not mix Id selector with class selector(s). Id ' 'selector must be singleton too many starting at $tooMany'); @@ -27,7 +27,7 @@ class Validate { return matches + 1; } else { - String error = selector.toString(); + var error = selector.toString(); throw CssSelectorException( 'Selectors can not have combinators (>, +, or ~) before $error'); } @@ -38,11 +38,11 @@ class Validate { // Perfect just one element id returns matches of -1. return -1; } else if (selector.isCombinatorDescendant) { - String tooMany = selector.simpleSelector.toString(); + var tooMany = selector.simpleSelector.toString(); throw CssSelectorException( 'Use of Id selector must be singleton starting at $tooMany'); } else { - String error = selector.simpleSelector.toString(); + var error = selector.simpleSelector.toString(); throw CssSelectorException( 'Selectors can not have combinators (>, +, or ~) before $error'); } @@ -51,8 +51,8 @@ class Validate { // Validate the @{css expression} only .class and #elementId are valid inside // of @{...}. static template(List selectors) { - bool found = false; // signal if a selector is matched. - int matches = 0; // < 0 IdSelectors, > 0 ClassSelector + var found = false; // signal if a selector is matched. + var matches = 0; // < 0 IdSelectors, > 0 ClassSelector // At most one selector group (any number of simple selector sequences). assert(selectors.length <= 1); @@ -102,19 +102,19 @@ class Validate { found = true; // #_id are always okay } } else { - String badSelector = simpleSelector.toString(); + var badSelector = simpleSelector.toString(); throw CssSelectorException('Invalid template selector $badSelector'); } if (!found) { - String unknownName = simpleSelector.toString(); + var unknownName = simpleSelector.toString(); throw CssSelectorException('Unknown selector name $unknownName'); } } } // Every selector must match. - Selector selector = selectors[0]; + var selector = selectors[0]; assert((matches >= 0 ? matches : -matches) == selector.simpleSelectorSequences.length); } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index e21cff7c9..2ccd8ff88 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -128,74 +128,93 @@ class Visitor implements VisitorBase { visitTree(StyleSheet tree) => visitStyleSheet(tree); + @override visitStyleSheet(StyleSheet ss) { _visitNodeList(ss.topLevels); } + @override visitNoOp(NoOp node) {} + @override visitTopLevelProduction(TopLevelProduction node) {} + @override visitDirective(Directive node) {} + @override visitCalcTerm(CalcTerm node) { visitLiteralTerm(node); visitLiteralTerm(node.expr); } + @override visitCssComment(CssComment node) {} + @override visitCommentDefinition(CommentDefinition node) {} + @override visitMediaExpression(MediaExpression node) { visitExpressions(node.exprs); } + @override visitMediaQuery(MediaQuery node) { for (var mediaExpr in node.expressions) { visitMediaExpression(mediaExpr); } } + @override visitDocumentDirective(DocumentDirective node) { _visitNodeList(node.functions); _visitNodeList(node.groupRuleBody); } + @override visitSupportsDirective(SupportsDirective node) { node.condition.visit(this); _visitNodeList(node.groupRuleBody); } + @override visitSupportsConditionInParens(SupportsConditionInParens node) { node.condition.visit(this); } + @override visitSupportsNegation(SupportsNegation node) { node.condition.visit(this); } + @override visitSupportsConjunction(SupportsConjunction node) { _visitNodeList(node.conditions); } + @override visitSupportsDisjunction(SupportsDisjunction node) { _visitNodeList(node.conditions); } + @override visitViewportDirective(ViewportDirective node) { node.declarations.visit(this); } + @override visitMediaDirective(MediaDirective node) { _visitNodeList(node.mediaQueries); _visitNodeList(node.rules); } + @override visitHostDirective(HostDirective node) { _visitNodeList(node.rules); } + @override visitPageDirective(PageDirective node) { for (var declGroup in node._declsMargin) { if (declGroup is MarginGroup) { @@ -206,48 +225,60 @@ class Visitor implements VisitorBase { } } + @override visitCharsetDirective(CharsetDirective node) {} + @override visitImportDirective(ImportDirective node) { for (var mediaQuery in node.mediaQueries) { visitMediaQuery(mediaQuery); } } + @override visitKeyFrameDirective(KeyFrameDirective node) { visitIdentifier(node.name); _visitNodeList(node._blocks); } + @override visitKeyFrameBlock(KeyFrameBlock node) { visitExpressions(node._blockSelectors); visitDeclarationGroup(node._declarations); } + @override visitFontFaceDirective(FontFaceDirective node) { visitDeclarationGroup(node._declarations); } + @override visitStyletDirective(StyletDirective node) { _visitNodeList(node.rules); } + @override visitNamespaceDirective(NamespaceDirective node) {} + @override visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); } + @override visitMixinRulesetDirective(MixinRulesetDirective node) { _visitNodeList(node.rulesets); } + @override visitMixinDefinition(MixinDefinition node) {} + @override visitMixinDeclarationDirective(MixinDeclarationDirective node) { visitDeclarationGroup(node.declarations); } + @override visitIncludeDirective(IncludeDirective node) { for (var index = 0; index < node.args.length; index++) { var param = node.args[index]; @@ -255,53 +286,66 @@ class Visitor implements VisitorBase { } } + @override visitContentDirective(ContentDirective node) { // TODO(terry): TBD } + @override visitRuleSet(RuleSet node) { visitSelectorGroup(node._selectorGroup); visitDeclarationGroup(node._declarationGroup); } + @override visitDeclarationGroup(DeclarationGroup node) { _visitNodeList(node.declarations); } + @override visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); + @override visitDeclaration(Declaration node) { visitIdentifier(node._property); if (node._expression != null) node._expression.visit(this); } + @override visitVarDefinition(VarDefinition node) { visitIdentifier(node._property); if (node._expression != null) node._expression.visit(this); } + @override visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { visitIncludeDirective(node.include); } + @override visitExtendDeclaration(ExtendDeclaration node) { _visitNodeList(node.selectors); } + @override visitSelectorGroup(SelectorGroup node) { _visitNodeList(node.selectors); } + @override visitSelector(Selector node) { _visitNodeList(node.simpleSelectorSequences); } + @override visitSimpleSelectorSequence(SimpleSelectorSequence node) { node.simpleSelector.visit(this); } + @override visitSimpleSelector(SimpleSelector node) => node._name.visit(this); + @override visitNamespaceSelector(NamespaceSelector node) { if (node._namespace != null) node._namespace.visit(this); if (node.nameAsSimpleSelector != null) { @@ -309,179 +353,231 @@ class Visitor implements VisitorBase { } } + @override visitElementSelector(ElementSelector node) => visitSimpleSelector(node); + @override visitAttributeSelector(AttributeSelector node) { visitSimpleSelector(node); } + @override visitIdSelector(IdSelector node) => visitSimpleSelector(node); + @override visitClassSelector(ClassSelector node) => visitSimpleSelector(node); + @override visitPseudoClassSelector(PseudoClassSelector node) => visitSimpleSelector(node); + @override visitPseudoElementSelector(PseudoElementSelector node) => visitSimpleSelector(node); + @override visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) => visitSimpleSelector(node); + @override visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) => visitSimpleSelector(node); + @override visitNegationSelector(NegationSelector node) => visitSimpleSelector(node); + @override visitSelectorExpression(SelectorExpression node) { _visitNodeList(node.expressions); } + @override visitUnicodeRangeTerm(UnicodeRangeTerm node) {} + @override visitLiteralTerm(LiteralTerm node) {} + @override visitHexColorTerm(HexColorTerm node) {} + @override visitNumberTerm(NumberTerm node) {} + @override visitUnitTerm(UnitTerm node) {} + @override visitLengthTerm(LengthTerm node) { visitUnitTerm(node); } + @override visitPercentageTerm(PercentageTerm node) { visitLiteralTerm(node); } + @override visitEmTerm(EmTerm node) { visitLiteralTerm(node); } + @override visitExTerm(ExTerm node) { visitLiteralTerm(node); } + @override visitAngleTerm(AngleTerm node) { visitUnitTerm(node); } + @override visitTimeTerm(TimeTerm node) { visitUnitTerm(node); } + @override visitFreqTerm(FreqTerm node) { visitUnitTerm(node); } + @override visitFractionTerm(FractionTerm node) { visitLiteralTerm(node); } + @override visitUriTerm(UriTerm node) { visitLiteralTerm(node); } + @override visitResolutionTerm(ResolutionTerm node) { visitUnitTerm(node); } + @override visitChTerm(ChTerm node) { visitUnitTerm(node); } + @override visitRemTerm(RemTerm node) { visitUnitTerm(node); } + @override visitViewportTerm(ViewportTerm node) { visitUnitTerm(node); } + @override visitFunctionTerm(FunctionTerm node) { visitLiteralTerm(node); visitExpressions(node._params); } + @override visitGroupTerm(GroupTerm node) { for (var term in node._terms) { term.visit(this); } } + @override visitItemTerm(ItemTerm node) { visitNumberTerm(node); } + @override visitIE8Term(IE8Term node) {} + @override visitOperatorSlash(OperatorSlash node) {} + @override visitOperatorComma(OperatorComma node) {} + @override visitOperatorPlus(OperatorPlus node) {} + @override visitOperatorMinus(OperatorMinus node) {} + @override visitVarUsage(VarUsage node) { _visitNodeList(node.defaultValues); } + @override visitExpressions(Expressions node) { _visitNodeList(node.expressions); } + @override visitBinaryExpression(BinaryExpression node) { // TODO(terry): TBD throw UnimplementedError(); } + @override visitUnaryExpression(UnaryExpression node) { // TODO(terry): TBD throw UnimplementedError(); } + @override visitIdentifier(Identifier node) {} + @override visitWildcard(Wildcard node) {} + @override visitThisOperator(ThisOperator node) {} + @override visitNegation(Negation node) {} + @override visitDartStyleExpression(DartStyleExpression node) {} + @override visitFontExpression(FontExpression node) { // TODO(terry): TBD throw UnimplementedError(); } + @override visitBoxExpression(BoxExpression node) { // TODO(terry): TBD throw UnimplementedError(); } + @override visitMarginExpression(MarginExpression node) { // TODO(terry): TBD throw UnimplementedError(); } + @override visitBorderExpression(BorderExpression node) { // TODO(terry): TBD throw UnimplementedError(); } + @override visitHeightExpression(HeightExpression node) { // TODO(terry): TB throw UnimplementedError(); } + @override visitPaddingExpression(PaddingExpression node) { // TODO(terry): TBD throw UnimplementedError(); } + @override visitWidthExpression(WidthExpression node) { // TODO(terry): TBD throw UnimplementedError(); diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index f4c6d832f..ae2288dda 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -6,7 +6,7 @@ author: Dart Team homepage: https://github.com/dart-lang/csslib environment: - sdk: '>=2.1.0 <3.0.0' + sdk: '>=2.2.0 <3.0.0' dependencies: source_span: ^1.4.0 diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart index 9a6a584c0..5df5b45c0 100644 --- a/pkgs/csslib/test/big_1_test.dart +++ b/pkgs/csslib/test/big_1_test.dart @@ -1162,6 +1162,6 @@ li.dropdown-menudivider { compilePolyfillAndValidate(input, generated); } -main() { +void main() { test('big #1', big_test); } diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index c9e837535..a692a64f4 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -13,7 +13,7 @@ import 'testing.dart'; void testClass() { var errors = []; - var input = ".foobar {}"; + var input = '.foobar {}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); @@ -34,12 +34,12 @@ void testClass() { final simpSelector = selectorSeqs[0].simpleSelector; expect(simpSelector is ClassSelector, true); expect(selectorSeqs[0].isCombinatorNone, true); - expect(simpSelector.name, "foobar"); + expect(simpSelector.name, 'foobar'); } void testClass2() { var errors = []; - var input = ".foobar .bar .no-story {}"; + var input = '.foobar .bar .no-story {}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); @@ -60,22 +60,22 @@ void testClass2() { var simpSelector0 = simpleSeqs[0].simpleSelector; expect(simpSelector0 is ClassSelector, true); expect(simpleSeqs[0].isCombinatorNone, true); - expect(simpSelector0.name, "foobar"); + expect(simpSelector0.name, 'foobar'); var simpSelector1 = simpleSeqs[1].simpleSelector; expect(simpSelector1 is ClassSelector, true); expect(simpleSeqs[1].isCombinatorDescendant, true); - expect(simpSelector1.name, "bar"); + expect(simpSelector1.name, 'bar'); var simpSelector2 = simpleSeqs[2].simpleSelector; expect(simpSelector2 is ClassSelector, true); expect(simpleSeqs[2].isCombinatorDescendant, true); - expect(simpSelector2.name, "no-story"); + expect(simpSelector2.name, 'no-story'); } void testId() { var errors = []; - var input = "#elemId {}"; + var input = '#elemId {}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); @@ -96,12 +96,12 @@ void testId() { var simpSelector = simpleSeqs[0].simpleSelector; expect(simpSelector is IdSelector, true); expect(simpleSeqs[0].isCombinatorNone, true); - expect(simpSelector.name, "elemId"); + expect(simpSelector.name, 'elemId'); } void testElement() { var errors = []; - var input = "div {}"; + var input = 'div {}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); @@ -123,9 +123,9 @@ void testElement() { final simpSelector = simpleSeqs[0].simpleSelector; expect(simpSelector is ElementSelector, true); expect(simpleSeqs[0].isCombinatorNone, true); - expect(simpSelector.name, "div"); + expect(simpSelector.name, 'div'); - input = "div div span {}"; + input = 'div div span {}'; stylesheet = parseCss(input, errors: errors..clear()); expect(stylesheet != null, true); @@ -147,22 +147,22 @@ void testElement() { var simpSelector0 = simpleSeqs[0].simpleSelector; expect(simpSelector0 is ElementSelector, true); expect(simpleSeqs[0].isCombinatorNone, true); - expect(simpSelector0.name, "div"); + expect(simpSelector0.name, 'div'); var simpSelector1 = simpleSeqs[1].simpleSelector; expect(simpSelector1 is ElementSelector, true); expect(simpleSeqs[1].isCombinatorDescendant, true); - expect(simpSelector1.name, "div"); + expect(simpSelector1.name, 'div'); var simpSelector2 = simpleSeqs[2].simpleSelector; expect(simpSelector2 is ElementSelector, true); expect(simpleSeqs[2].isCombinatorDescendant, true); - expect(simpSelector2.name, "span"); + expect(simpSelector2.name, 'span'); } void testNamespace() { var errors = []; - var input = "ns1|div {}"; + var input = 'ns1|div {}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); @@ -184,16 +184,16 @@ void testNamespace() { var simpSelector = simpleSeqs[0].simpleSelector as NamespaceSelector; expect(simpleSeqs[0].isCombinatorNone, true); expect(simpSelector.isNamespaceWildcard, false); - expect(simpSelector.namespace, "ns1"); + expect(simpSelector.namespace, 'ns1'); var elementSelector = simpSelector.nameAsSimpleSelector; expect(elementSelector is ElementSelector, true); expect(elementSelector.isWildcard, false); - expect(elementSelector.name, "div"); + expect(elementSelector.name, 'div'); } void testNamespace2() { var errors = []; - var input = "ns1|div div ns2|span .foobar {}"; + var input = 'ns1|div div ns2|span .foobar {}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); @@ -215,36 +215,36 @@ void testNamespace2() { expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true); var simpSelector0 = simpleSeqs[0].simpleSelector as NamespaceSelector; expect(simpleSeqs[0].isCombinatorNone, true); - expect(simpSelector0.namespace, "ns1"); + expect(simpSelector0.namespace, 'ns1'); var elementSelector0 = simpSelector0.nameAsSimpleSelector; expect(elementSelector0 is ElementSelector, true); expect(elementSelector0.isWildcard, false); - expect(elementSelector0.name, "div"); + expect(elementSelector0.name, 'div'); var simpSelector1 = simpleSeqs[1].simpleSelector; expect(simpSelector1 is ElementSelector, true); expect(simpleSeqs[1].isCombinatorDescendant, true); - expect(simpSelector1.name, "div"); + expect(simpSelector1.name, 'div'); expect(simpleSeqs[2].simpleSelector is NamespaceSelector, true); var simpSelector2 = simpleSeqs[2].simpleSelector as NamespaceSelector; expect(simpleSeqs[2].isCombinatorDescendant, true); - expect(simpSelector2.namespace, "ns2"); + expect(simpSelector2.namespace, 'ns2'); var elementSelector2 = simpSelector2.nameAsSimpleSelector; expect(elementSelector2 is ElementSelector, true); expect(elementSelector2.isWildcard, false); - expect(elementSelector2.name, "span"); + expect(elementSelector2.name, 'span'); var simpSelector3 = simpleSeqs[3].simpleSelector; expect(simpSelector3 is ClassSelector, true); expect(simpleSeqs[3].isCombinatorDescendant, true); - expect(simpSelector3.name, "foobar"); + expect(simpSelector3.name, 'foobar'); } void testSelectorGroups() { var errors = []; var input = - "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}"; + 'div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); @@ -265,7 +265,7 @@ void testSelectorGroups() { var simpleSelector0 = selector0.simpleSelector; expect(simpleSelector0 is ElementSelector, true); expect(selector0.isCombinatorNone, true); - expect(simpleSelector0.name, "div"); + expect(simpleSelector0.name, 'div'); var groupSelector1 = ruleset.selectorGroup.selectors[1]; expect(groupSelector1.simpleSelectorSequences.length, 1); @@ -273,7 +273,7 @@ void testSelectorGroups() { var simpleSelector1 = selector1.simpleSelector; expect(simpleSelector1 is ClassSelector, true); expect(selector1.isCombinatorNone, true); - expect(simpleSelector1.name, "foobar"); + expect(simpleSelector1.name, 'foobar'); var groupSelector2 = ruleset.selectorGroup.selectors[2]; expect(groupSelector2.simpleSelectorSequences.length, 1); @@ -281,7 +281,7 @@ void testSelectorGroups() { var simpleSelector2 = selector2.simpleSelector; expect(simpleSelector2 is IdSelector, true); expect(selector2.isCombinatorNone, true); - expect(simpleSelector2.name, "elemId"); + expect(simpleSelector2.name, 'elemId'); var groupSelector3 = ruleset.selectorGroup.selectors[3]; expect(groupSelector3.simpleSelectorSequences.length, 2); @@ -290,13 +290,13 @@ void testSelectorGroups() { var simpleSelector30 = selector30.simpleSelector; expect(simpleSelector30 is ClassSelector, true); expect(selector30.isCombinatorNone, true); - expect(simpleSelector30.name, "xyzzy"); + expect(simpleSelector30.name, 'xyzzy'); var selector31 = groupSelector3.simpleSelectorSequences[1]; var simpleSelector31 = selector31.simpleSelector; expect(simpleSelector31 is ClassSelector, true); expect(selector31.isCombinatorDescendant, true); - expect(simpleSelector31.name, "test"); + expect(simpleSelector31.name, 'test'); var groupSelector4 = ruleset.selectorGroup.selectors[4]; expect(groupSelector4.simpleSelectorSequences.length, 4); @@ -305,33 +305,33 @@ void testSelectorGroups() { expect(selector40.simpleSelector is NamespaceSelector, true); var simpleSelector40 = selector40.simpleSelector as NamespaceSelector; expect(selector40.isCombinatorNone, true); - expect(simpleSelector40.namespace, "ns1"); + expect(simpleSelector40.namespace, 'ns1'); var elementSelector = simpleSelector40.nameAsSimpleSelector; expect(elementSelector is ElementSelector, true); expect(elementSelector.isWildcard, false); - expect(elementSelector.name, "div"); + expect(elementSelector.name, 'div'); var selector41 = groupSelector4.simpleSelectorSequences[1]; var simpleSelector41 = selector41.simpleSelector; expect(simpleSelector41 is ElementSelector, true); expect(selector41.isCombinatorDescendant, true); - expect(simpleSelector41.name, "div"); + expect(simpleSelector41.name, 'div'); var selector42 = groupSelector4.simpleSelectorSequences[2]; var simpleSelector42 = selector42.simpleSelector; expect(simpleSelector42 is IdSelector, true); expect(selector42.isCombinatorDescendant, true); - expect(simpleSelector42.name, "elemId"); + expect(simpleSelector42.name, 'elemId'); var selector43 = groupSelector4.simpleSelectorSequences[3]; var simpleSelector43 = selector43.simpleSelector; expect(selector43.isCombinatorDescendant, true); - expect(simpleSelector43.name, "foobar"); + expect(simpleSelector43.name, 'foobar'); } void testCombinator() { var errors = []; - var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}"; + var input = '.foobar > .bar + .no-story ~ myNs|div #elemId {}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); @@ -354,40 +354,40 @@ void testCombinator() { var simpleSelector0 = selector0.simpleSelector; expect(simpleSelector0 is ClassSelector, true); expect(selector0.isCombinatorNone, true); - expect(simpleSelector0.name, "foobar"); + expect(simpleSelector0.name, 'foobar'); var selector1 = simpleSeqs[1]; var simpleSelector1 = selector1.simpleSelector; expect(simpleSelector1 is ClassSelector, true); expect(selector1.isCombinatorGreater, true); - expect(simpleSelector1.name, "bar"); + expect(simpleSelector1.name, 'bar'); var selector2 = simpleSeqs[2]; var simpleSelector2 = selector2.simpleSelector; expect(simpleSelector2 is ClassSelector, true); expect(selector2.isCombinatorPlus, true); - expect(simpleSelector2.name, "no-story"); + expect(simpleSelector2.name, 'no-story'); var selector3 = simpleSeqs[3]; expect(selector3.simpleSelector is NamespaceSelector, true); var simpleSelector3 = selector3.simpleSelector as NamespaceSelector; expect(selector3.isCombinatorTilde, true); - expect(simpleSelector3.namespace, "myNs"); + expect(simpleSelector3.namespace, 'myNs'); var elementSelector = simpleSelector3.nameAsSimpleSelector; expect(elementSelector is ElementSelector, true); expect(elementSelector.isWildcard, false); - expect(elementSelector.name, "div"); + expect(elementSelector.name, 'div'); var selector4 = simpleSeqs[4]; var simpleSelector4 = selector4.simpleSelector; expect(simpleSelector4 is IdSelector, true); expect(selector4.isCombinatorDescendant, true); - expect(simpleSelector4.name, "elemId"); + expect(simpleSelector4.name, 'elemId'); } void testWildcard() { var errors = []; - var input = "* {}"; + var input = '* {}'; var stylesheet = parseCss(input, errors: errors); expect(stylesheet != null, true); @@ -409,9 +409,9 @@ void testWildcard() { expect(simpSelector is ElementSelector, true); expect(simpleSeqs[0].isCombinatorNone, true); expect(simpSelector.isWildcard, true); - expect(simpSelector.name, "*"); + expect(simpSelector.name, '*'); - input = "*.foobar {}"; + input = '*.foobar {}'; stylesheet = parseCss(input, errors: errors..clear()); expect(stylesheet != null, true); @@ -436,16 +436,16 @@ void testWildcard() { expect(simpleSelector0 is ElementSelector, true); expect(selector0.isCombinatorNone, true); expect(simpleSelector0.isWildcard, true); - expect(simpleSelector0.name, "*"); + expect(simpleSelector0.name, '*'); } var selector1 = simpleSeqs[1]; var simpleSelector1 = selector1.simpleSelector; expect(simpleSelector1 is ClassSelector, true); expect(selector1.isCombinatorNone, true); - expect(simpleSelector1.name, "foobar"); + expect(simpleSelector1.name, 'foobar'); - input = "myNs|*.foobar {}"; + input = 'myNs|*.foobar {}'; stylesheet = parseCss(input, errors: errors..clear()); expect(stylesheet != null, true); @@ -471,18 +471,18 @@ void testWildcard() { expect(selector0.isCombinatorNone, true); expect(simpleSelector0.isNamespaceWildcard, false); var elementSelector = simpleSelector0.nameAsSimpleSelector; - expect("myNs", simpleSelector0.namespace); + expect('myNs', simpleSelector0.namespace); expect(elementSelector.isWildcard, true); - expect("*", elementSelector.name); + expect('*', elementSelector.name); } selector1 = simpleSeqs[1]; simpleSelector1 = selector1.simpleSelector; expect(simpleSelector1 is ClassSelector, true); expect(selector1.isCombinatorNone, true); - expect("foobar", simpleSelector1.name); + expect('foobar', simpleSelector1.name); - input = "*|*.foobar {}"; + input = '*|*.foobar {}'; stylesheet = parseCss(input, errors: errors..clear()); expect(stylesheet != null, true); @@ -505,17 +505,17 @@ void testWildcard() { var simpleSelector0 = selector0.simpleSelector as NamespaceSelector; expect(selector0.isCombinatorNone, true); expect(simpleSelector0.isNamespaceWildcard, true); - expect("*", simpleSelector0.namespace); + expect('*', simpleSelector0.namespace); var elementSelector = simpleSelector0.nameAsSimpleSelector; expect(elementSelector.isWildcard, true); - expect("*", elementSelector.name); + expect('*', elementSelector.name); } selector1 = simpleSeqs[1]; simpleSelector1 = selector1.simpleSelector; expect(simpleSelector1 is ClassSelector, true); expect(selector1.isCombinatorNone, true); - expect("foobar", simpleSelector1.name); + expect('foobar', simpleSelector1.name); } /// Test List as input to parser. @@ -748,7 +748,7 @@ void testExpressionParsing() { }'''); } -main() { +void main() { test('Classes', testClass); test('Classes 2', testClass2); test('Ids', testId); diff --git a/pkgs/csslib/test/debug_test.dart b/pkgs/csslib/test/debug_test.dart index 94898eb29..6f1cee2b0 100644 --- a/pkgs/csslib/test/debug_test.dart +++ b/pkgs/csslib/test/debug_test.dart @@ -4,7 +4,7 @@ import 'package:test/test.dart'; import 'testing.dart'; void main() { - test("excercise debug", () { + test('excercise debug', () { var style = parseCss(_input); var debugValue = style.toDebugString(); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 1cbceb9ab..d943b08c4 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -346,7 +346,7 @@ void testNewerCss() { void testMediaQueries() { var errors = []; - String input = ''' + var input = ''' @media screen and (-webkit-min-device-pixel-ratio:0) { .todo-item .toggle { background: none; @@ -355,7 +355,7 @@ void testMediaQueries() { height: 40px; } }'''; - String generated = ''' + var generated = ''' @media screen AND (-webkit-min-device-pixel-ratio:0) { .todo-item .toggle { background: none; @@ -556,15 +556,15 @@ div { expect(prettyPrint(styleSheet), expected); // Test all document functions combined. - css = '@-moz-document ' + - 'url(http://www.w3.org/), ' + - "url-prefix('http://www.w3.org/Style/'), " + - 'domain("google.com"), ' + + css = '@-moz-document ' + 'url(http://www.w3.org/), ' + "url-prefix('http://www.w3.org/Style/'), " + 'domain("google.com"), ' 'regexp("https:.*") { div { color: #000; } }'; - expected = '@-moz-document ' + - 'url("http://www.w3.org/"), ' + - 'url-prefix("http://www.w3.org/Style/"), ' + - 'domain("google.com"), ' + + expected = '@-moz-document ' + 'url("http://www.w3.org/"), ' + 'url-prefix("http://www.w3.org/Style/"), ' + 'domain("google.com"), ' 'regexp("https:.*") {\ndiv {\n color: #000;\n}\n}'; styleSheet = parseCss(css, errors: errors); expect(styleSheet, isNotNull); @@ -609,13 +609,13 @@ body { box-shadow: 0 0 2px black inset; } }'''; - expected = '@supports (box-shadow: 0 0 2px #000 inset) or ' + - '(-moz-box-shadow: 0 0 2px #000 inset) or ' + - '(-webkit-box-shadow: 0 0 2px #000 inset) or ' + - '(-o-box-shadow: 0 0 2px #000 inset) {\n' + - '.box {\n' + - ' box-shadow: 0 0 2px #000 inset;\n' + - '}\n' + + expected = '@supports (box-shadow: 0 0 2px #000 inset) or ' + '(-moz-box-shadow: 0 0 2px #000 inset) or ' + '(-webkit-box-shadow: 0 0 2px #000 inset) or ' + '(-o-box-shadow: 0 0 2px #000 inset) {\n' + '.box {\n' + ' box-shadow: 0 0 2px #000 inset;\n' + '}\n' '}'; expectCss(css, expected); @@ -629,13 +629,13 @@ body { } }'''; - expected = '@supports ' + - '((transition-property: color) or (animation-name: foo)) and ' + - '(transform: rotate(10deg)) {\n' + - 'div {\n' + - ' transition-property: color;\n' + - ' transform: rotate(10deg);\n' + - '}\n' + + expected = '@supports ' + '((transition-property: color) or (animation-name: foo)) and ' + '(transform: rotate(10deg)) {\n' + 'div {\n' + ' transition-property: color;\n' + ' transform: rotate(10deg);\n' + '}\n' '}'; expectCss(css, expected); @@ -893,8 +893,8 @@ div { expect(compactOuptut(stylesheet), generated); // Check namespace directive compactly emitted. - final String input2 = "@namespace a url(http://www.example.org/a);"; - final String generated2 = "@namespace a url(http://www.example.org/a);"; + final String input2 = '@namespace a url(http://www.example.org/a);'; + final String generated2 = '@namespace a url(http://www.example.org/a);'; var stylesheet2 = parseCss(input2, errors: errors..clear()); @@ -995,14 +995,14 @@ html|*:not(:link):not(:visited) { void testIE() { var errors = []; - final String input = ".test {\n" - " filter: progid:DXImageTransform.Microsoft.gradient" + final String input = '.test {\n' + ' filter: progid:DXImageTransform.Microsoft.gradient' "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" - "}"; - final String generated = ".test {\n" - " filter: progid:DXImageTransform.Microsoft.gradient" + '}'; + final String generated = '.test {\n' + ' filter: progid:DXImageTransform.Microsoft.gradient' "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" - "}"; + '}'; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); @@ -1010,17 +1010,17 @@ void testIE() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); - final String input2 = ".test {\n" - " filter: progid:DXImageTransform.Microsoft.gradient" + final String input2 = '.test {\n' + ' filter: progid:DXImageTransform.Microsoft.gradient' "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" - " progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n" - "}"; + ' progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n' + '}'; - final String generated2 = ".test {\n" - " filter: progid:DXImageTransform.Microsoft.gradient" + final String generated2 = '.test {\n' + ' filter: progid:DXImageTransform.Microsoft.gradient' "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" - " progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n" - "}"; + ' progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n' + '}'; stylesheet = parseCss(input2, errors: errors..clear(), opts: simpleOptions); @@ -1391,7 +1391,7 @@ void vendorPrefixedCalc() { expectCss(css, css); } -main() { +void main() { test('Simple Terms', testSimpleTerms); test('Declarations', testDeclarations); test('Identifiers', testIdentifiers); diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 67af07e23..f4ec960e8 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -15,7 +15,7 @@ void testUnsupportedFontWeights() { // TODO(terry): Need to support bolder. // font-weight value bolder. - var input = ".foobar { font-weight: bolder; }"; + var input = '.foobar { font-weight: bolder; }'; var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); @@ -34,7 +34,7 @@ error on line 1, column 24: Unknown property value bolder // TODO(terry): Need to support lighter. // font-weight value lighter. - input = ".foobar { font-weight: lighter; }"; + input = '.foobar { font-weight: lighter; }'; stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); @@ -52,7 +52,7 @@ error on line 1, column 24: Unknown property value lighter // TODO(terry): Need to support inherit. // font-weight value inherit. - input = ".foobar { font-weight: inherit; }"; + input = '.foobar { font-weight: inherit; }'; stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); @@ -75,7 +75,7 @@ void testUnsupportedLineHeights() { var errors = []; // line-height value in percentge unit. - var input = ".foobar { line-height: 120%; }"; + var input = '.foobar { line-height: 120%; }'; var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); @@ -93,7 +93,7 @@ error on line 1, column 24: Unexpected value for line-height // TODO(terry): Need to support all units. // line-height value in cm unit. - input = ".foobar { line-height: 20cm; }"; + input = '.foobar { line-height: 20cm; }'; stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); @@ -111,7 +111,7 @@ error on line 1, column 24: Unexpected unit for line-height // TODO(terry): Need to support inherit. // line-height value inherit. - input = ".foobar { line-height: inherit; }"; + input = '.foobar { line-height: inherit; }'; stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); @@ -133,7 +133,7 @@ void testBadSelectors() { var errors = []; // Invalid id selector. - var input = "# foo { color: #ff00ff; }"; + var input = '# foo { color: #ff00ff; }'; var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); @@ -150,7 +150,7 @@ error on line 1, column 1: Not a valid ID selector expected #id }'''); // Invalid class selector. - input = ". foo { color: #ff00ff; }"; + input = '. foo { color: #ff00ff; }'; stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); @@ -172,7 +172,7 @@ void testBadHexValues() { var errors = []; // Invalid hex value. - var input = ".foobar { color: #AH787; }"; + var input = '.foobar { color: #AH787; }'; var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); @@ -189,7 +189,7 @@ error on line 1, column 18: Bad hex number }'''); // Bad color constant. - input = ".foobar { color: redder; }"; + input = '.foobar { color: redder; }'; stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); @@ -207,7 +207,7 @@ error on line 1, column 18: Unknown property value redder }'''); // Bad hex color #ffffff. - input = ".foobar { color: # ffffff; }"; + input = '.foobar { color: # ffffff; }'; stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); @@ -225,7 +225,7 @@ error on line 1, column 18: Expected hex number }'''); // Bad hex color #123fff. - input = ".foobar { color: # 123fff; }"; + input = '.foobar { color: # 123fff; }'; stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); @@ -370,7 +370,7 @@ div { expect(errorMessage.span.text, '\n'); } -main() { +void main() { test('font-weight value errors', testUnsupportedFontWeights); test('line-height value errors', testUnsupportedLineHeights); test('bad selectors', testBadSelectors); diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index 78c29940b..ed5904f4d 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -235,12 +235,12 @@ input.second + label { ' color: #00f;\n}'); } -main() { - test("Simple Extend", simpleExtend); - test("complex", complexSelectors); - test("multiple", multipleExtends); - test("chaining", chaining); - test("nested selectors", nestedSelectors); - test("nested many selector sequences", nestedMulty); - test("N-way extends", nWayExtends); +void main() { + test('Simple Extend', simpleExtend); + test('complex', complexSelectors); + test('multiple', multipleExtends); + test('chaining', chaining); + test('nested selectors', nestedSelectors); + test('nested many selector sequences', nestedMulty); + test('N-way extends', nWayExtends); } diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index e5d3ae7b8..dec66512b 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -640,7 +640,7 @@ foo { expect(error.span.end.offset, 56); } -main() { +void main() { group('Basic mixin', () { test('include grammar', includeGrammar); test('empty mixin content', emptyMixin); diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index a5cadaba0..b8ef9ebbf 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -620,13 +620,13 @@ input.second + label { compileAndValidate(input, generated); } -main() { +void main() { test('Selector and Nested Variations', selectorVariations); test('Simple nesting', simpleNest); test('Complex nesting', complexNest); test('@media nesting', mediaNesting); test('Simple &', simpleThis); - test("Variations &", variationsThis); + test('Variations &', variationsThis); test('Complex &', complexThis); test('& with + selector', thisCombinator); } diff --git a/pkgs/csslib/test/samples_test.dart b/pkgs/csslib/test/samples_test.dart index afba1470b..b90613115 100644 --- a/pkgs/csslib/test/samples_test.dart +++ b/pkgs/csslib/test/samples_test.dart @@ -22,7 +22,7 @@ void testCSSFile(File cssFile) { expect(errors, isEmpty, reason: errors.toString()); } -main() { +void main() { final libraryUri = currentMirrorSystem().findLibrary(#samples_test).uri; final cssDir = Directory.fromUri(libraryUri.resolve('examples')); for (var element in cssDir.listSync()) { diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index a64b8d44c..df52be6a0 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -87,7 +87,7 @@ void testSelectorFailures() { ' ╵'); } -main() { +void main() { test('Valid Selectors', testSelectorSuccesses); test('Invalid Selectors', testSelectorFailures); } diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 345e5b63f..471697e19 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -31,8 +31,7 @@ StyleSheet parseCss(String cssInput, {List errors, PreprocessorOptions opts}) => parse(cssInput, errors: errors, - options: - opts == null ? simpleOptionsWithCheckedAndWarningsAsErrors : opts); + options: opts ?? simpleOptionsWithCheckedAndWarningsAsErrors); /// Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, /// CSS will allow any property/value pairs regardless of validity; all of our @@ -44,8 +43,7 @@ StyleSheet compileCss(String cssInput, List includes}) => compile(cssInput, errors: errors, - options: - opts == null ? simpleOptionsWithCheckedAndWarningsAsErrors : opts, + options: opts ?? simpleOptionsWithCheckedAndWarningsAsErrors, polyfill: polyfill, includes: includes); diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index d1e689e81..db03b25b3 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -469,7 +469,7 @@ void undefinedVars() { color: var(one); background: var(six); }'''; - int testBitMap = 0; + var testBitMap = 0; compileAndValidate(input, generated); @@ -484,13 +484,13 @@ void undefinedVars() { outer: for (var error in errors) { var errorString = error.toString(); - for (int i = 0; i < errorStrings.length; i++) { + for (var i = 0; i < errorStrings.length; i++) { if (errorString == errorStrings[i]) { testBitMap |= 1 << i; continue outer; } } - fail("Unexpected error string: $errorString"); + fail('Unexpected error string: $errorString'); } expect(testBitMap, equals((1 << errorStrings.length) - 1)); expect(prettyPrint(stylesheet), generatedPolyfill); @@ -955,7 +955,7 @@ void includes() { expect(prettyPrint(stylesheet2), generated2); } -main() { +void main() { test('Simple var', simpleVar); test('Expressions var', expressionsVar); test('Default value in var()', defaultVar); diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index b82ac6bcd..958db30fd 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -12,16 +12,17 @@ import 'testing.dart'; class ClassVisitor extends Visitor { final List expectedClasses; - final Set foundClasses = Set(); + final foundClasses = {}; ClassVisitor(this.expectedClasses); + @override void visitClassSelector(ClassSelector node) { foundClasses.add(node.name); } bool get matches { - bool match = true; + var match = true; foundClasses.forEach((value) { match = match && expectedClasses.contains(value); }); @@ -75,6 +76,7 @@ class PolyfillEmitter extends CssPrinter { PolyfillEmitter(this._prefix); + @override void visitClassSelector(ClassSelector node) { emit('.${_prefix}_${node.name}'); } @@ -107,7 +109,7 @@ div.myComponent_xyzzy { expect(emitted, generated); } -main() { +void main() { test('Class Visitors', testClassVisitors); test('Polyfill', testPolyFill); } From 699bcabac0974a2026e1420e36a5adf7e173dcfc Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Fri, 27 Dec 2019 15:54:33 -0800 Subject: [PATCH 148/245] Add return types and remove local variable types (dart-lang/csslib#98) The return types do, in some cases, change the interface of a public API, but only to make it more descriptive of behavior. Only code that would have had runtime errors should be statically impacted by the change. --- pkgs/csslib/analysis_options.yaml | 5 - pkgs/csslib/lib/parser.dart | 2 +- pkgs/csslib/lib/src/analyzer.dart | 4 +- pkgs/csslib/lib/src/polyfill.dart | 7 +- pkgs/csslib/lib/src/token_kind.dart | 2 +- pkgs/csslib/lib/src/tree.dart | 226 +++++++------- pkgs/csslib/lib/src/tree_base.dart | 2 +- pkgs/csslib/lib/src/validate.dart | 2 +- pkgs/csslib/lib/visitor.dart | 397 +++++++++++++------------ pkgs/csslib/pubspec.yaml | 3 +- pkgs/csslib/test/big_1_test.dart | 2 +- pkgs/csslib/test/declaration_test.dart | 85 +++--- pkgs/csslib/test/error_test.dart | 10 +- pkgs/csslib/test/extend_test.dart | 2 +- pkgs/csslib/test/mixin_test.dart | 4 +- pkgs/csslib/test/nested_test.dart | 8 +- pkgs/csslib/test/var_test.dart | 10 +- 17 files changed, 384 insertions(+), 387 deletions(-) diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index b8036fad8..9d142917a 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -1,10 +1,5 @@ include: package:pedantic/analysis_options.yaml -analyzer: - errors: - always_declare_return_types: ignore # 318 - omit_local_variable_types: ignore # 48 - linter: rules: - prefer_equal_for_default_values diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index e9402ab25..1f3d185a0 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2552,7 +2552,7 @@ class _Parser { /// /// We'll just parse everything after the 'progid:' look for the left paren /// then parse to the right paren ignoring everything in between. - processIEFilter(FileSpan startAfterProgidColon) { + dynamic processIEFilter(FileSpan startAfterProgidColon) { // Support non-functional filters (i.e. filter: FlipH) var kind = _peek(); if (kind == TokenKind.SEMICOLON || kind == TokenKind.RBRACE) { diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 0b121ad1a..e9fd7c981 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -409,7 +409,7 @@ class _MediaRulesReplacer extends Visitor { _MediaRulesReplacer(this._ruleSet, this._newRules); @override - visitMediaDirective(MediaDirective node) { + void visitMediaDirective(MediaDirective node) { var index = node.rules.indexOf(_ruleSet); if (index != -1) { node.rules.insertAll(index + 1, _newRules); @@ -521,7 +521,7 @@ class _TopLevelIncludeReplacer extends Visitor { _TopLevelIncludeReplacer(this._include, this._newRules); @override - visitStyleSheet(StyleSheet node) { + void visitStyleSheet(StyleSheet node) { var index = node.topLevels.indexOf(_include); if (index != -1) { node.topLevels.insertAll(index + 1, _newRules); diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index fa1a22adc..2582bae18 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -66,7 +66,7 @@ class _VarDefinitionsIncludes extends Visitor { } @override - visitVarDefinition(VarDefinition node) { + void visitVarDefinition(VarDefinition node) { // Replace with latest variable definition. varDefs[node.definedName] = node; super.visitVarDefinition(node); @@ -96,7 +96,7 @@ class _VarDefAndUsage extends Visitor { } @override - visitVarDefinition(VarDefinition node) { + void visitVarDefinition(VarDefinition node) { // Replace with latest variable definition. currVarDefinition = node; @@ -198,7 +198,8 @@ class _VarDefAndUsage extends Visitor { return result; } - _resolveVarUsage(List expressions, int index, VarDefinition def) { + void _resolveVarUsage( + List expressions, int index, VarDefinition def) { var defExpressions = (def.expression as Expressions).expressions; expressions.replaceRange(index, index + 1, defExpressions); } diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index b0b60ebae..492800ee2 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -569,7 +569,7 @@ class TokenKind { } static String decimalToHex(int number, [int minDigits = 1]) { - final String _HEX_DIGITS = '0123456789abcdef'; + final _HEX_DIGITS = '0123456789abcdef'; var result = []; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 4aca2c9ab..81f26bfdd 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -17,7 +17,7 @@ class Identifier extends TreeNode { Identifier clone() => Identifier(name, span); @override - visit(VisitorBase visitor) => visitor.visitIdentifier(this); + void visit(VisitorBase visitor) => visitor.visitIdentifier(this); @override String toString() => name; @@ -28,7 +28,7 @@ class Wildcard extends TreeNode { @override Wildcard clone() => Wildcard(span); @override - visit(VisitorBase visitor) => visitor.visitWildcard(this); + void visit(VisitorBase visitor) => visitor.visitWildcard(this); String get name => '*'; } @@ -38,7 +38,7 @@ class ThisOperator extends TreeNode { @override ThisOperator clone() => ThisOperator(span); @override - visit(VisitorBase visitor) => visitor.visitThisOperator(this); + void visit(VisitorBase visitor) => visitor.visitThisOperator(this); String get name => '&'; } @@ -48,7 +48,7 @@ class Negation extends TreeNode { @override Negation clone() => Negation(span); @override - visit(VisitorBase visitor) => visitor.visitNegation(this); + void visit(VisitorBase visitor) => visitor.visitNegation(this); String get name => 'not'; } @@ -65,7 +65,7 @@ class CalcTerm extends LiteralTerm { @override CalcTerm clone() => CalcTerm(value, text, expr.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitCalcTerm(this); + void visit(VisitorBase visitor) => visitor.visitCalcTerm(this); @override String toString() => '$text($expr)'; @@ -79,7 +79,7 @@ class CssComment extends TreeNode { @override CssComment clone() => CssComment(comment, span); @override - visit(VisitorBase visitor) => visitor.visitCssComment(this); + void visit(VisitorBase visitor) => visitor.visitCssComment(this); } // CDO/CDC (Comment Definition Open ). @@ -88,7 +88,7 @@ class CommentDefinition extends CssComment { @override CommentDefinition clone() => CommentDefinition(comment, span); @override - visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); + void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); } class SelectorGroup extends TreeNode { @@ -100,7 +100,7 @@ class SelectorGroup extends TreeNode { SelectorGroup clone() => SelectorGroup(selectors, span); @override - visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); + void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); } class Selector extends TreeNode { @@ -121,7 +121,7 @@ class Selector extends TreeNode { } @override - visit(VisitorBase visitor) => visitor.visitSelector(this); + void visit(VisitorBase visitor) => visitor.visitSelector(this); } class SimpleSelectorSequence extends TreeNode { @@ -161,7 +161,7 @@ class SimpleSelectorSequence extends TreeNode { SimpleSelectorSequence(simpleSelector, span, combinator); @override - visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); + void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); @override String toString() => simpleSelector.name; @@ -181,14 +181,14 @@ abstract class SimpleSelector extends TreeNode { bool get isThis => _name is ThisOperator; @override - visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); + void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); } // element name class ElementSelector extends SimpleSelector { ElementSelector(name, SourceSpan span) : super(name, span); @override - visit(VisitorBase visitor) => visitor.visitElementSelector(this); + void visit(VisitorBase visitor) => visitor.visitElementSelector(this); @override ElementSelector clone() => ElementSelector(_name, span); @@ -215,7 +215,7 @@ class NamespaceSelector extends SimpleSelector { NamespaceSelector clone() => NamespaceSelector(_namespace, '', span); @override - visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); + void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); @override String toString() => '$namespace|${nameAsSimpleSelector.name}'; @@ -224,15 +224,13 @@ class NamespaceSelector extends SimpleSelector { // [attr op value] class AttributeSelector extends SimpleSelector { final int _op; - final _value; + final dynamic value; - AttributeSelector(Identifier name, this._op, this._value, SourceSpan span) + AttributeSelector(Identifier name, this._op, this.value, SourceSpan span) : super(name, span); int get operatorKind => _op; - get value => _value; - String matchOperator() { switch (_op) { case TokenKind.EQUALS: @@ -273,11 +271,11 @@ class AttributeSelector extends SimpleSelector { } String valueToString() { - if (_value != null) { - if (_value is Identifier) { - return _value.name; + if (value != null) { + if (value is Identifier) { + return value.name; } else { - return '"${_value}"'; + return '"$value"'; } } else { return ''; @@ -285,10 +283,10 @@ class AttributeSelector extends SimpleSelector { } @override - AttributeSelector clone() => AttributeSelector(_name, _op, _value, span); + AttributeSelector clone() => AttributeSelector(_name, _op, value, span); @override - visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); + void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); @override String toString() => '[$name${matchOperator()}${valueToString()}]'; @@ -300,7 +298,7 @@ class IdSelector extends SimpleSelector { @override IdSelector clone() => IdSelector(_name, span); @override - visit(VisitorBase visitor) => visitor.visitIdSelector(this); + void visit(VisitorBase visitor) => visitor.visitIdSelector(this); @override String toString() => '#$_name'; @@ -312,7 +310,7 @@ class ClassSelector extends SimpleSelector { @override ClassSelector clone() => ClassSelector(_name, span); @override - visit(VisitorBase visitor) => visitor.visitClassSelector(this); + void visit(VisitorBase visitor) => visitor.visitClassSelector(this); @override String toString() => '.$_name'; @@ -322,7 +320,7 @@ class ClassSelector extends SimpleSelector { class PseudoClassSelector extends SimpleSelector { PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span); @override - visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); + void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); @override PseudoClassSelector clone() => PseudoClassSelector(_name, span); @@ -340,7 +338,7 @@ class PseudoElementSelector extends SimpleSelector { {this.isLegacy = false}) : super(name, span); @override - visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); + void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); @override PseudoElementSelector clone() => PseudoElementSelector(_name, span); @@ -365,7 +363,8 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { SelectorExpression get expression => _argument as SelectorExpression; @override - visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); + void visit(VisitorBase visitor) => + visitor.visitPseudoClassFunctionSelector(this); } // ::pseudoElementFunction(expression) @@ -381,7 +380,7 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { PseudoElementFunctionSelector(_name, expression, span); @override - visit(VisitorBase visitor) => + void visit(VisitorBase visitor) => visitor.visitPseudoElementFunctionSelector(this); } @@ -396,7 +395,7 @@ class SelectorExpression extends TreeNode { } @override - visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); + void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); } // :NOT(negation_arg) @@ -410,7 +409,7 @@ class NegationSelector extends SimpleSelector { NegationSelector clone() => NegationSelector(negationArg, span); @override - visit(VisitorBase visitor) => visitor.visitNegationSelector(this); + void visit(VisitorBase visitor) => visitor.visitNegationSelector(this); } class NoOp extends TreeNode { @@ -420,7 +419,7 @@ class NoOp extends TreeNode { NoOp clone() => NoOp(); @override - visit(VisitorBase visitor) => visitor.visitNoOp(this); + void visit(VisitorBase visitor) => visitor.visitNoOp(this); } class StyleSheet extends TreeNode { @@ -443,7 +442,7 @@ class StyleSheet extends TreeNode { } @override - visit(VisitorBase visitor) => visitor.visitStyleSheet(this); + void visit(VisitorBase visitor) => visitor.visitStyleSheet(this); } class TopLevelProduction extends TreeNode { @@ -451,7 +450,7 @@ class TopLevelProduction extends TreeNode { @override TopLevelProduction clone() => TopLevelProduction(span); @override - visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); + void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); } class RuleSet extends TopLevelProduction { @@ -472,7 +471,7 @@ class RuleSet extends TopLevelProduction { } @override - visit(VisitorBase visitor) => visitor.visitRuleSet(this); + void visit(VisitorBase visitor) => visitor.visitRuleSet(this); } class Directive extends TreeNode { @@ -484,7 +483,7 @@ class Directive extends TreeNode { @override Directive clone() => Directive(span); @override - visit(VisitorBase visitor) => visitor.visitDirective(this); + void visit(VisitorBase visitor) => visitor.visitDirective(this); } class DocumentDirective extends Directive { @@ -508,7 +507,7 @@ class DocumentDirective extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitDocumentDirective(this); + void visit(VisitorBase visitor) => visitor.visitDocumentDirective(this); } class SupportsDirective extends Directive { @@ -529,7 +528,7 @@ class SupportsDirective extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitSupportsDirective(this); + void visit(VisitorBase visitor) => visitor.visitSupportsDirective(this); } abstract class SupportsCondition extends TreeNode { @@ -553,7 +552,8 @@ class SupportsConditionInParens extends SupportsCondition { SupportsConditionInParens(condition.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitSupportsConditionInParens(this); + void visit(VisitorBase visitor) => + visitor.visitSupportsConditionInParens(this); } class SupportsNegation extends SupportsCondition { @@ -565,7 +565,7 @@ class SupportsNegation extends SupportsCondition { SupportsNegation clone() => SupportsNegation(condition.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitSupportsNegation(this); + void visit(VisitorBase visitor) => visitor.visitSupportsNegation(this); } class SupportsConjunction extends SupportsCondition { @@ -583,7 +583,7 @@ class SupportsConjunction extends SupportsCondition { } @override - visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this); + void visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this); } class SupportsDisjunction extends SupportsCondition { @@ -601,7 +601,7 @@ class SupportsDisjunction extends SupportsCondition { } @override - visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this); + void visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this); } class ViewportDirective extends Directive { @@ -616,7 +616,7 @@ class ViewportDirective extends Directive { ViewportDirective(name, declarations.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitViewportDirective(this); + void visit(VisitorBase visitor) => visitor.visitViewportDirective(this); } class ImportDirective extends Directive { @@ -639,7 +639,7 @@ class ImportDirective extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitImportDirective(this); + void visit(VisitorBase visitor) => visitor.visitImportDirective(this); } /// MediaExpression grammar: @@ -663,7 +663,7 @@ class MediaExpression extends TreeNode { } @override - visit(VisitorBase visitor) => visitor.visitMediaExpression(this); + void visit(VisitorBase visitor) => visitor.visitMediaExpression(this); } /// MediaQuery grammar: @@ -703,7 +703,7 @@ class MediaQuery extends TreeNode { } @override - visit(VisitorBase visitor) => visitor.visitMediaQuery(this); + void visit(VisitorBase visitor) => visitor.visitMediaQuery(this); } class MediaDirective extends Directive { @@ -726,7 +726,7 @@ class MediaDirective extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitMediaDirective(this); + void visit(VisitorBase visitor) => visitor.visitMediaDirective(this); } class HostDirective extends Directive { @@ -744,7 +744,7 @@ class HostDirective extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitHostDirective(this); + void visit(VisitorBase visitor) => visitor.visitHostDirective(this); } class PageDirective extends Directive { @@ -766,7 +766,7 @@ class PageDirective extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitPageDirective(this); + void visit(VisitorBase visitor) => visitor.visitPageDirective(this); bool get hasIdent => _ident != null && _ident.isNotEmpty; bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.isNotEmpty; @@ -779,7 +779,7 @@ class CharsetDirective extends Directive { @override CharsetDirective clone() => CharsetDirective(charEncoding, span); @override - visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); + void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); } class KeyFrameDirective extends Directive { @@ -792,7 +792,7 @@ class KeyFrameDirective extends Directive { : _blocks = [], super(span); - add(KeyFrameBlock block) { + void add(KeyFrameBlock block) { _blocks.add(block); } @@ -821,7 +821,7 @@ class KeyFrameDirective extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); + void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); } class KeyFrameBlock extends Expression { @@ -835,7 +835,7 @@ class KeyFrameBlock extends Expression { KeyFrameBlock clone() => KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); + void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); } class FontFaceDirective extends Directive { @@ -846,7 +846,7 @@ class FontFaceDirective extends Directive { @override FontFaceDirective clone() => FontFaceDirective(_declarations.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); + void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); } class StyletDirective extends Directive { @@ -871,7 +871,7 @@ class StyletDirective extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitStyletDirective(this); + void visit(VisitorBase visitor) => visitor.visitStyletDirective(this); } class NamespaceDirective extends Directive { @@ -887,7 +887,7 @@ class NamespaceDirective extends Directive { NamespaceDirective clone() => NamespaceDirective(_prefix, _uri, span); @override - visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); + void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); String get prefix => _prefix.isNotEmpty ? '$_prefix ' : ''; } @@ -902,7 +902,7 @@ class VarDefinitionDirective extends Directive { VarDefinitionDirective clone() => VarDefinitionDirective(def.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); + void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); } class MixinDefinition extends Directive { @@ -923,7 +923,7 @@ class MixinDefinition extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); + void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); } /// Support a Sass @mixin. See http://sass-lang.com for description. @@ -949,7 +949,7 @@ class MixinRulesetDirective extends MixinDefinition { } @override - visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); + void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); } class MixinDeclarationDirective extends MixinDefinition { @@ -970,7 +970,8 @@ class MixinDeclarationDirective extends MixinDefinition { } @override - visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); + void visit(VisitorBase visitor) => + visitor.visitMixinDeclarationDirective(this); } /// To support consuming a Sass mixin @include. @@ -990,7 +991,7 @@ class IncludeDirective extends Directive { } @override - visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); + void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); } /// To support Sass @content. @@ -998,7 +999,7 @@ class ContentDirective extends Directive { ContentDirective(SourceSpan span) : super(span); @override - visit(VisitorBase visitor) => visitor.visitContentDirective(this); + void visit(VisitorBase visitor) => visitor.visitContentDirective(this); } class Declaration extends TreeNode { @@ -1034,7 +1035,7 @@ class Declaration extends TreeNode { important: important); @override - visit(VisitorBase visitor) => visitor.visitDeclaration(this); + void visit(VisitorBase visitor) => visitor.visitDeclaration(this); } // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and @@ -1056,7 +1057,7 @@ class VarDefinition extends Declaration { _property.clone(), expression != null ? expression.clone() : null, span); @override - visit(VisitorBase visitor) => visitor.visitVarDefinition(this); + void visit(VisitorBase visitor) => visitor.visitVarDefinition(this); } /// Node for usage of @include mixin[(args,...)] found in a declaration group @@ -1076,7 +1077,8 @@ class IncludeMixinAtDeclaration extends Declaration { IncludeMixinAtDeclaration(include.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this); + void visit(VisitorBase visitor) => + visitor.visitIncludeMixinAtDeclaration(this); } class ExtendDeclaration extends Declaration { @@ -1092,7 +1094,7 @@ class ExtendDeclaration extends Declaration { } @override - visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); + void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); } class DeclarationGroup extends TreeNode { @@ -1108,7 +1110,7 @@ class DeclarationGroup extends TreeNode { } @override - visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); + void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); } class MarginGroup extends DeclarationGroup { @@ -1120,7 +1122,7 @@ class MarginGroup extends DeclarationGroup { MarginGroup clone() => MarginGroup(margin_sym, super.clone().declarations, span); @override - visit(VisitorBase visitor) => visitor.visitMarginGroup(this); + void visit(VisitorBase visitor) => visitor.visitMarginGroup(this); } class VarUsage extends Expression { @@ -1139,7 +1141,7 @@ class VarUsage extends Expression { } @override - visit(VisitorBase visitor) => visitor.visitVarUsage(this); + void visit(VisitorBase visitor) => visitor.visitVarUsage(this); } class OperatorSlash extends Expression { @@ -1147,7 +1149,7 @@ class OperatorSlash extends Expression { @override OperatorSlash clone() => OperatorSlash(span); @override - visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); + void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); } class OperatorComma extends Expression { @@ -1155,7 +1157,7 @@ class OperatorComma extends Expression { @override OperatorComma clone() => OperatorComma(span); @override - visit(VisitorBase visitor) => visitor.visitOperatorComma(this); + void visit(VisitorBase visitor) => visitor.visitOperatorComma(this); } class OperatorPlus extends Expression { @@ -1163,7 +1165,7 @@ class OperatorPlus extends Expression { @override OperatorPlus clone() => OperatorPlus(span); @override - visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); + void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); } class OperatorMinus extends Expression { @@ -1171,7 +1173,7 @@ class OperatorMinus extends Expression { @override OperatorMinus clone() => OperatorMinus(span); @override - visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); + void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); } class UnicodeRangeTerm extends Expression { @@ -1186,7 +1188,7 @@ class UnicodeRangeTerm extends Expression { UnicodeRangeTerm clone() => UnicodeRangeTerm(first, second, span); @override - visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); + void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); } class LiteralTerm extends Expression { @@ -1202,7 +1204,7 @@ class LiteralTerm extends Expression { LiteralTerm clone() => LiteralTerm(value, text, span); @override - visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); + void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); } class NumberTerm extends LiteralTerm { @@ -1210,7 +1212,7 @@ class NumberTerm extends LiteralTerm { @override NumberTerm clone() => NumberTerm(value, text, span); @override - visit(VisitorBase visitor) => visitor.visitNumberTerm(this); + void visit(VisitorBase visitor) => visitor.visitNumberTerm(this); } class UnitTerm extends LiteralTerm { @@ -1222,7 +1224,7 @@ class UnitTerm extends LiteralTerm { UnitTerm clone() => UnitTerm(value, text, span, unit); @override - visit(VisitorBase visitor) => visitor.visitUnitTerm(this); + void visit(VisitorBase visitor) => visitor.visitUnitTerm(this); String unitToString() => TokenKind.unitToString(unit); @@ -1244,7 +1246,7 @@ class LengthTerm extends UnitTerm { @override LengthTerm clone() => LengthTerm(value, text, span, unit); @override - visit(VisitorBase visitor) => visitor.visitLengthTerm(this); + void visit(VisitorBase visitor) => visitor.visitLengthTerm(this); } class PercentageTerm extends LiteralTerm { @@ -1252,7 +1254,7 @@ class PercentageTerm extends LiteralTerm { @override PercentageTerm clone() => PercentageTerm(value, text, span); @override - visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); + void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); } class EmTerm extends LiteralTerm { @@ -1260,7 +1262,7 @@ class EmTerm extends LiteralTerm { @override EmTerm clone() => EmTerm(value, text, span); @override - visit(VisitorBase visitor) => visitor.visitEmTerm(this); + void visit(VisitorBase visitor) => visitor.visitEmTerm(this); } class ExTerm extends LiteralTerm { @@ -1268,7 +1270,7 @@ class ExTerm extends LiteralTerm { @override ExTerm clone() => ExTerm(value, text, span); @override - visit(VisitorBase visitor) => visitor.visitExTerm(this); + void visit(VisitorBase visitor) => visitor.visitExTerm(this); } class AngleTerm extends UnitTerm { @@ -1284,7 +1286,7 @@ class AngleTerm extends UnitTerm { @override AngleTerm clone() => AngleTerm(value, text, span, unit); @override - visit(VisitorBase visitor) => visitor.visitAngleTerm(this); + void visit(VisitorBase visitor) => visitor.visitAngleTerm(this); } class TimeTerm extends UnitTerm { @@ -1299,7 +1301,7 @@ class TimeTerm extends UnitTerm { @override TimeTerm clone() => TimeTerm(value, text, span, unit); @override - visit(VisitorBase visitor) => visitor.visitTimeTerm(this); + void visit(VisitorBase visitor) => visitor.visitTimeTerm(this); } class FreqTerm extends UnitTerm { @@ -1312,7 +1314,7 @@ class FreqTerm extends UnitTerm { @override FreqTerm clone() => FreqTerm(value, text, span, unit); @override - visit(VisitorBase visitor) => visitor.visitFreqTerm(this); + void visit(VisitorBase visitor) => visitor.visitFreqTerm(this); } class FractionTerm extends LiteralTerm { @@ -1321,7 +1323,7 @@ class FractionTerm extends LiteralTerm { @override FractionTerm clone() => FractionTerm(value, text, span); @override - visit(VisitorBase visitor) => visitor.visitFractionTerm(this); + void visit(VisitorBase visitor) => visitor.visitFractionTerm(this); } class UriTerm extends LiteralTerm { @@ -1330,7 +1332,7 @@ class UriTerm extends LiteralTerm { @override UriTerm clone() => UriTerm(value, span); @override - visit(VisitorBase visitor) => visitor.visitUriTerm(this); + void visit(VisitorBase visitor) => visitor.visitUriTerm(this); } class ResolutionTerm extends UnitTerm { @@ -1345,7 +1347,7 @@ class ResolutionTerm extends UnitTerm { @override ResolutionTerm clone() => ResolutionTerm(value, text, span, unit); @override - visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); + void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); } class ChTerm extends UnitTerm { @@ -1358,7 +1360,7 @@ class ChTerm extends UnitTerm { @override ChTerm clone() => ChTerm(value, text, span, unit); @override - visit(VisitorBase visitor) => visitor.visitChTerm(this); + void visit(VisitorBase visitor) => visitor.visitChTerm(this); } class RemTerm extends UnitTerm { @@ -1371,7 +1373,7 @@ class RemTerm extends UnitTerm { @override RemTerm clone() => RemTerm(value, text, span, unit); @override - visit(VisitorBase visitor) => visitor.visitRemTerm(this); + void visit(VisitorBase visitor) => visitor.visitRemTerm(this); } class ViewportTerm extends UnitTerm { @@ -1387,7 +1389,7 @@ class ViewportTerm extends UnitTerm { @override ViewportTerm clone() => ViewportTerm(value, text, span, unit); @override - visit(VisitorBase visitor) => visitor.visitViewportTerm(this); + void visit(VisitorBase visitor) => visitor.visitViewportTerm(this); } /// Type to signal a bad hex value for HexColorTerm.value. @@ -1399,7 +1401,7 @@ class HexColorTerm extends LiteralTerm { @override HexColorTerm clone() => HexColorTerm(value, text, span); @override - visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); + void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); } class FunctionTerm extends LiteralTerm { @@ -1411,7 +1413,7 @@ class FunctionTerm extends LiteralTerm { @override FunctionTerm clone() => FunctionTerm(value, text, _params.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); + void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); } /// A "\9" was encountered at the end of the expression and before a semi-colon. @@ -1422,7 +1424,7 @@ class IE8Term extends LiteralTerm { @override IE8Term clone() => IE8Term(span); @override - visit(VisitorBase visitor) => visitor.visitIE8Term(this); + void visit(VisitorBase visitor) => visitor.visitIE8Term(this); } class GroupTerm extends Expression { @@ -1439,7 +1441,7 @@ class GroupTerm extends Expression { @override GroupTerm clone() => GroupTerm(span); @override - visit(VisitorBase visitor) => visitor.visitGroupTerm(this); + void visit(VisitorBase visitor) => visitor.visitGroupTerm(this); } class ItemTerm extends NumberTerm { @@ -1448,7 +1450,7 @@ class ItemTerm extends NumberTerm { @override ItemTerm clone() => ItemTerm(value, text, span); @override - visit(VisitorBase visitor) => visitor.visitItemTerm(this); + void visit(VisitorBase visitor) => visitor.visitItemTerm(this); } class Expressions extends Expression { @@ -1470,7 +1472,7 @@ class Expressions extends Expression { } @override - visit(VisitorBase visitor) => visitor.visitExpressions(this); + void visit(VisitorBase visitor) => visitor.visitExpressions(this); } class BinaryExpression extends Expression { @@ -1483,7 +1485,7 @@ class BinaryExpression extends Expression { @override BinaryExpression clone() => BinaryExpression(op, x.clone(), y.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); + void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); } class UnaryExpression extends Expression { @@ -1495,7 +1497,7 @@ class UnaryExpression extends Expression { @override UnaryExpression clone() => UnaryExpression(op, self.clone(), span); @override - visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); + void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); } abstract class DartStyleExpression extends TreeNode { @@ -1515,7 +1517,7 @@ abstract class DartStyleExpression extends TreeNode { // Merges give 2 DartStyleExpression (or derived from DartStyleExpression, // e.g., FontExpression, etc.) will merge if the two expressions are of the // same property name (implies same exact type e.g, FontExpression). - merged(DartStyleExpression newDartExpr); + DartStyleExpression merged(DartStyleExpression newDartExpr); bool get isUnknown => _styleType == 0 || _styleType == null; bool get isFont => _styleType == fontStyle; @@ -1529,7 +1531,7 @@ abstract class DartStyleExpression extends TreeNode { bool isSame(DartStyleExpression other) => _styleType == other._styleType; @override - visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); + void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); } class FontExpression extends DartStyleExpression { @@ -1581,7 +1583,7 @@ class FontExpression extends DartStyleExpression { lineHeight: font.lineHeight); @override - visit(VisitorBase visitor) => visitor.visitFontExpression(this); + void visit(VisitorBase visitor) => visitor.visitFontExpression(this); } abstract class BoxExpression extends DartStyleExpression { @@ -1591,7 +1593,7 @@ abstract class BoxExpression extends DartStyleExpression { : super(styleType, span); @override - visit(VisitorBase visitor) => visitor.visitBoxExpression(this); + void visit(VisitorBase visitor) => visitor.visitBoxExpression(this); String get formattedBoxEdge { if (box.top == box.left && box.top == box.bottom && box.top == box.right) { @@ -1617,7 +1619,7 @@ class MarginExpression extends BoxExpression { : super(DartStyleExpression.marginStyle, span, box); @override - merged(DartStyleExpression newMarginExpr) { + MarginExpression merged(DartStyleExpression newMarginExpr) { if (newMarginExpr is MarginExpression && isMargin && newMarginExpr.isMargin) { @@ -1641,7 +1643,7 @@ class MarginExpression extends BoxExpression { top: box.top, right: box.right, bottom: box.bottom, left: box.left); @override - visit(VisitorBase visitor) => visitor.visitMarginExpression(this); + void visit(VisitorBase visitor) => visitor.visitMarginExpression(this); } class BorderExpression extends BoxExpression { @@ -1654,7 +1656,7 @@ class BorderExpression extends BoxExpression { : super(DartStyleExpression.borderStyle, span, box); @override - merged(DartStyleExpression newBorderExpr) { + BorderExpression merged(DartStyleExpression newBorderExpr) { if (newBorderExpr is BorderExpression && isBorder && newBorderExpr.isBorder) { @@ -1679,7 +1681,7 @@ class BorderExpression extends BoxExpression { top: box.top, right: box.right, bottom: box.bottom, left: box.left); @override - visit(VisitorBase visitor) => visitor.visitBorderExpression(this); + void visit(VisitorBase visitor) => visitor.visitBorderExpression(this); } class HeightExpression extends DartStyleExpression { @@ -1689,7 +1691,7 @@ class HeightExpression extends DartStyleExpression { : super(DartStyleExpression.heightStyle, span); @override - merged(DartStyleExpression newHeightExpr) { + HeightExpression merged(DartStyleExpression newHeightExpr) { if (newHeightExpr is DartStyleExpression && isHeight && newHeightExpr.isHeight) { @@ -1702,7 +1704,7 @@ class HeightExpression extends DartStyleExpression { @override HeightExpression clone() => HeightExpression(span, height); @override - visit(VisitorBase visitor) => visitor.visitHeightExpression(this); + void visit(VisitorBase visitor) => visitor.visitHeightExpression(this); } class WidthExpression extends DartStyleExpression { @@ -1712,7 +1714,7 @@ class WidthExpression extends DartStyleExpression { : super(DartStyleExpression.widthStyle, span); @override - merged(DartStyleExpression newWidthExpr) { + WidthExpression merged(DartStyleExpression newWidthExpr) { if (newWidthExpr is WidthExpression && isWidth && newWidthExpr.isWidth) { return newWidthExpr; } @@ -1723,7 +1725,7 @@ class WidthExpression extends DartStyleExpression { @override WidthExpression clone() => WidthExpression(span, width); @override - visit(VisitorBase visitor) => visitor.visitWidthExpression(this); + void visit(VisitorBase visitor) => visitor.visitWidthExpression(this); } class PaddingExpression extends BoxExpression { @@ -1736,7 +1738,7 @@ class PaddingExpression extends BoxExpression { : super(DartStyleExpression.paddingStyle, span, box); @override - merged(DartStyleExpression newPaddingExpr) { + PaddingExpression merged(DartStyleExpression newPaddingExpr) { if (newPaddingExpr is PaddingExpression && isPadding && newPaddingExpr.isPadding) { @@ -1760,5 +1762,5 @@ class PaddingExpression extends BoxExpression { PaddingExpression clone() => PaddingExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); @override - visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); + void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); } diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index ef157cd89..6f2f442ba 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -14,7 +14,7 @@ abstract class TreeNode { TreeNode clone(); /// Classic double-dispatch visitor for implementing passes. - visit(VisitorBase visitor); + void visit(VisitorBase visitor); /// A multiline string showing the node and its children. String toDebugString() { diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index fe18e0568..4d255e235 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -50,7 +50,7 @@ class Validate { // Validate the @{css expression} only .class and #elementId are valid inside // of @{...}. - static template(List selectors) { + static void template(List selectors) { var found = false; // signal if a selector is matched. var matches = 0; // < 0 IdSelectors, > 0 ClassSelector diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 2ccd8ff88..ceda80c95 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -11,107 +11,107 @@ part 'src/tree_base.dart'; part 'src/tree_printer.dart'; abstract class VisitorBase { - visitCalcTerm(CalcTerm node); - visitCssComment(CssComment node); - visitCommentDefinition(CommentDefinition node); - visitStyleSheet(StyleSheet node); - visitNoOp(NoOp node); - visitTopLevelProduction(TopLevelProduction node); - visitDirective(Directive node); - visitDocumentDirective(DocumentDirective node); - visitSupportsDirective(SupportsDirective node); - visitSupportsConditionInParens(SupportsConditionInParens node); - visitSupportsNegation(SupportsNegation node); - visitSupportsConjunction(SupportsConjunction node); - visitSupportsDisjunction(SupportsDisjunction node); - visitViewportDirective(ViewportDirective node); - visitMediaExpression(MediaExpression node); - visitMediaQuery(MediaQuery node); - visitMediaDirective(MediaDirective node); - visitHostDirective(HostDirective node); - visitPageDirective(PageDirective node); - visitCharsetDirective(CharsetDirective node); - visitImportDirective(ImportDirective node); - visitKeyFrameDirective(KeyFrameDirective node); - visitKeyFrameBlock(KeyFrameBlock node); - visitFontFaceDirective(FontFaceDirective node); - visitStyletDirective(StyletDirective node); - visitNamespaceDirective(NamespaceDirective node); - visitVarDefinitionDirective(VarDefinitionDirective node); - visitMixinDefinition(MixinDefinition node); - visitMixinRulesetDirective(MixinRulesetDirective node); - visitMixinDeclarationDirective(MixinDeclarationDirective node); - visitIncludeDirective(IncludeDirective node); - visitContentDirective(ContentDirective node); - - visitRuleSet(RuleSet node); - visitDeclarationGroup(DeclarationGroup node); - visitMarginGroup(MarginGroup node); - visitDeclaration(Declaration node); - visitVarDefinition(VarDefinition node); - visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node); - visitExtendDeclaration(ExtendDeclaration node); - visitSelectorGroup(SelectorGroup node); - visitSelector(Selector node); - visitSimpleSelectorSequence(SimpleSelectorSequence node); - visitSimpleSelector(SimpleSelector node); - visitElementSelector(ElementSelector node); - visitNamespaceSelector(NamespaceSelector node); - visitAttributeSelector(AttributeSelector node); - visitIdSelector(IdSelector node); - visitClassSelector(ClassSelector node); - visitPseudoClassSelector(PseudoClassSelector node); - visitPseudoElementSelector(PseudoElementSelector node); - visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node); - visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node); - visitNegationSelector(NegationSelector node); - visitSelectorExpression(SelectorExpression node); - - visitUnicodeRangeTerm(UnicodeRangeTerm node); - visitLiteralTerm(LiteralTerm node); - visitHexColorTerm(HexColorTerm node); - visitNumberTerm(NumberTerm node); - visitUnitTerm(UnitTerm node); - visitLengthTerm(LengthTerm node); - visitPercentageTerm(PercentageTerm node); - visitEmTerm(EmTerm node); - visitExTerm(ExTerm node); - visitAngleTerm(AngleTerm node); - visitTimeTerm(TimeTerm node); - visitFreqTerm(FreqTerm node); - visitFractionTerm(FractionTerm node); - visitUriTerm(UriTerm node); - visitResolutionTerm(ResolutionTerm node); - visitChTerm(ChTerm node); - visitRemTerm(RemTerm node); - visitViewportTerm(ViewportTerm node); - visitFunctionTerm(FunctionTerm node); - visitGroupTerm(GroupTerm node); - visitItemTerm(ItemTerm node); - visitIE8Term(IE8Term node); - visitOperatorSlash(OperatorSlash node); - visitOperatorComma(OperatorComma node); - visitOperatorPlus(OperatorPlus node); - visitOperatorMinus(OperatorMinus node); - visitVarUsage(VarUsage node); - - visitExpressions(Expressions node); - visitBinaryExpression(BinaryExpression node); - visitUnaryExpression(UnaryExpression node); - - visitIdentifier(Identifier node); - visitWildcard(Wildcard node); - visitThisOperator(ThisOperator node); - visitNegation(Negation node); - - visitDartStyleExpression(DartStyleExpression node); - visitFontExpression(FontExpression node); - visitBoxExpression(BoxExpression node); - visitMarginExpression(MarginExpression node); - visitBorderExpression(BorderExpression node); - visitHeightExpression(HeightExpression node); - visitPaddingExpression(PaddingExpression node); - visitWidthExpression(WidthExpression node); + void visitCalcTerm(CalcTerm node); + void visitCssComment(CssComment node); + void visitCommentDefinition(CommentDefinition node); + void visitStyleSheet(StyleSheet node); + void visitNoOp(NoOp node); + void visitTopLevelProduction(TopLevelProduction node); + void visitDirective(Directive node); + void visitDocumentDirective(DocumentDirective node); + void visitSupportsDirective(SupportsDirective node); + void visitSupportsConditionInParens(SupportsConditionInParens node); + void visitSupportsNegation(SupportsNegation node); + void visitSupportsConjunction(SupportsConjunction node); + void visitSupportsDisjunction(SupportsDisjunction node); + void visitViewportDirective(ViewportDirective node); + void visitMediaExpression(MediaExpression node); + void visitMediaQuery(MediaQuery node); + void visitMediaDirective(MediaDirective node); + void visitHostDirective(HostDirective node); + void visitPageDirective(PageDirective node); + void visitCharsetDirective(CharsetDirective node); + void visitImportDirective(ImportDirective node); + void visitKeyFrameDirective(KeyFrameDirective node); + void visitKeyFrameBlock(KeyFrameBlock node); + void visitFontFaceDirective(FontFaceDirective node); + void visitStyletDirective(StyletDirective node); + void visitNamespaceDirective(NamespaceDirective node); + void visitVarDefinitionDirective(VarDefinitionDirective node); + void visitMixinDefinition(MixinDefinition node); + void visitMixinRulesetDirective(MixinRulesetDirective node); + void visitMixinDeclarationDirective(MixinDeclarationDirective node); + void visitIncludeDirective(IncludeDirective node); + void visitContentDirective(ContentDirective node); + + void visitRuleSet(RuleSet node); + void visitDeclarationGroup(DeclarationGroup node); + void visitMarginGroup(MarginGroup node); + void visitDeclaration(Declaration node); + void visitVarDefinition(VarDefinition node); + void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node); + void visitExtendDeclaration(ExtendDeclaration node); + void visitSelectorGroup(SelectorGroup node); + void visitSelector(Selector node); + void visitSimpleSelectorSequence(SimpleSelectorSequence node); + void visitSimpleSelector(SimpleSelector node); + void visitElementSelector(ElementSelector node); + void visitNamespaceSelector(NamespaceSelector node); + void visitAttributeSelector(AttributeSelector node); + void visitIdSelector(IdSelector node); + void visitClassSelector(ClassSelector node); + void visitPseudoClassSelector(PseudoClassSelector node); + void visitPseudoElementSelector(PseudoElementSelector node); + void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node); + void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node); + void visitNegationSelector(NegationSelector node); + void visitSelectorExpression(SelectorExpression node); + + void visitUnicodeRangeTerm(UnicodeRangeTerm node); + void visitLiteralTerm(LiteralTerm node); + void visitHexColorTerm(HexColorTerm node); + void visitNumberTerm(NumberTerm node); + void visitUnitTerm(UnitTerm node); + void visitLengthTerm(LengthTerm node); + void visitPercentageTerm(PercentageTerm node); + void visitEmTerm(EmTerm node); + void visitExTerm(ExTerm node); + void visitAngleTerm(AngleTerm node); + void visitTimeTerm(TimeTerm node); + void visitFreqTerm(FreqTerm node); + void visitFractionTerm(FractionTerm node); + void visitUriTerm(UriTerm node); + void visitResolutionTerm(ResolutionTerm node); + void visitChTerm(ChTerm node); + void visitRemTerm(RemTerm node); + void visitViewportTerm(ViewportTerm node); + void visitFunctionTerm(FunctionTerm node); + void visitGroupTerm(GroupTerm node); + void visitItemTerm(ItemTerm node); + void visitIE8Term(IE8Term node); + void visitOperatorSlash(OperatorSlash node); + void visitOperatorComma(OperatorComma node); + void visitOperatorPlus(OperatorPlus node); + void visitOperatorMinus(OperatorMinus node); + void visitVarUsage(VarUsage node); + + void visitExpressions(Expressions node); + void visitBinaryExpression(BinaryExpression node); + void visitUnaryExpression(UnaryExpression node); + + void visitIdentifier(Identifier node); + void visitWildcard(Wildcard node); + void visitThisOperator(ThisOperator node); + void visitNegation(Negation node); + + void visitDartStyleExpression(DartStyleExpression node); + void visitFontExpression(FontExpression node); + void visitBoxExpression(BoxExpression node); + void visitMarginExpression(MarginExpression node); + void visitBorderExpression(BorderExpression node); + void visitHeightExpression(HeightExpression node); + void visitPaddingExpression(PaddingExpression node); + void visitWidthExpression(WidthExpression node); } /// Base vistor class for the style sheet AST. @@ -126,96 +126,96 @@ class Visitor implements VisitorBase { } } - visitTree(StyleSheet tree) => visitStyleSheet(tree); + void visitTree(StyleSheet tree) => visitStyleSheet(tree); @override - visitStyleSheet(StyleSheet ss) { + void visitStyleSheet(StyleSheet ss) { _visitNodeList(ss.topLevels); } @override - visitNoOp(NoOp node) {} + void visitNoOp(NoOp node) {} @override - visitTopLevelProduction(TopLevelProduction node) {} + void visitTopLevelProduction(TopLevelProduction node) {} @override - visitDirective(Directive node) {} + void visitDirective(Directive node) {} @override - visitCalcTerm(CalcTerm node) { + void visitCalcTerm(CalcTerm node) { visitLiteralTerm(node); visitLiteralTerm(node.expr); } @override - visitCssComment(CssComment node) {} + void visitCssComment(CssComment node) {} @override - visitCommentDefinition(CommentDefinition node) {} + void visitCommentDefinition(CommentDefinition node) {} @override - visitMediaExpression(MediaExpression node) { + void visitMediaExpression(MediaExpression node) { visitExpressions(node.exprs); } @override - visitMediaQuery(MediaQuery node) { + void visitMediaQuery(MediaQuery node) { for (var mediaExpr in node.expressions) { visitMediaExpression(mediaExpr); } } @override - visitDocumentDirective(DocumentDirective node) { + void visitDocumentDirective(DocumentDirective node) { _visitNodeList(node.functions); _visitNodeList(node.groupRuleBody); } @override - visitSupportsDirective(SupportsDirective node) { + void visitSupportsDirective(SupportsDirective node) { node.condition.visit(this); _visitNodeList(node.groupRuleBody); } @override - visitSupportsConditionInParens(SupportsConditionInParens node) { + void visitSupportsConditionInParens(SupportsConditionInParens node) { node.condition.visit(this); } @override - visitSupportsNegation(SupportsNegation node) { + void visitSupportsNegation(SupportsNegation node) { node.condition.visit(this); } @override - visitSupportsConjunction(SupportsConjunction node) { + void visitSupportsConjunction(SupportsConjunction node) { _visitNodeList(node.conditions); } @override - visitSupportsDisjunction(SupportsDisjunction node) { + void visitSupportsDisjunction(SupportsDisjunction node) { _visitNodeList(node.conditions); } @override - visitViewportDirective(ViewportDirective node) { + void visitViewportDirective(ViewportDirective node) { node.declarations.visit(this); } @override - visitMediaDirective(MediaDirective node) { + void visitMediaDirective(MediaDirective node) { _visitNodeList(node.mediaQueries); _visitNodeList(node.rules); } @override - visitHostDirective(HostDirective node) { + void visitHostDirective(HostDirective node) { _visitNodeList(node.rules); } @override - visitPageDirective(PageDirective node) { + void visitPageDirective(PageDirective node) { for (var declGroup in node._declsMargin) { if (declGroup is MarginGroup) { visitMarginGroup(declGroup); @@ -226,60 +226,60 @@ class Visitor implements VisitorBase { } @override - visitCharsetDirective(CharsetDirective node) {} + void visitCharsetDirective(CharsetDirective node) {} @override - visitImportDirective(ImportDirective node) { + void visitImportDirective(ImportDirective node) { for (var mediaQuery in node.mediaQueries) { visitMediaQuery(mediaQuery); } } @override - visitKeyFrameDirective(KeyFrameDirective node) { + void visitKeyFrameDirective(KeyFrameDirective node) { visitIdentifier(node.name); _visitNodeList(node._blocks); } @override - visitKeyFrameBlock(KeyFrameBlock node) { + void visitKeyFrameBlock(KeyFrameBlock node) { visitExpressions(node._blockSelectors); visitDeclarationGroup(node._declarations); } @override - visitFontFaceDirective(FontFaceDirective node) { + void visitFontFaceDirective(FontFaceDirective node) { visitDeclarationGroup(node._declarations); } @override - visitStyletDirective(StyletDirective node) { + void visitStyletDirective(StyletDirective node) { _visitNodeList(node.rules); } @override - visitNamespaceDirective(NamespaceDirective node) {} + void visitNamespaceDirective(NamespaceDirective node) {} @override - visitVarDefinitionDirective(VarDefinitionDirective node) { + void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); } @override - visitMixinRulesetDirective(MixinRulesetDirective node) { + void visitMixinRulesetDirective(MixinRulesetDirective node) { _visitNodeList(node.rulesets); } @override - visitMixinDefinition(MixinDefinition node) {} + void visitMixinDefinition(MixinDefinition node) {} @override - visitMixinDeclarationDirective(MixinDeclarationDirective node) { + void visitMixinDeclarationDirective(MixinDeclarationDirective node) { visitDeclarationGroup(node.declarations); } @override - visitIncludeDirective(IncludeDirective node) { + void visitIncludeDirective(IncludeDirective node) { for (var index = 0; index < node.args.length; index++) { var param = node.args[index]; _visitNodeList(param); @@ -287,66 +287,66 @@ class Visitor implements VisitorBase { } @override - visitContentDirective(ContentDirective node) { + void visitContentDirective(ContentDirective node) { // TODO(terry): TBD } @override - visitRuleSet(RuleSet node) { + void visitRuleSet(RuleSet node) { visitSelectorGroup(node._selectorGroup); visitDeclarationGroup(node._declarationGroup); } @override - visitDeclarationGroup(DeclarationGroup node) { + void visitDeclarationGroup(DeclarationGroup node) { _visitNodeList(node.declarations); } @override - visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); + void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); @override - visitDeclaration(Declaration node) { + void visitDeclaration(Declaration node) { visitIdentifier(node._property); if (node._expression != null) node._expression.visit(this); } @override - visitVarDefinition(VarDefinition node) { + void visitVarDefinition(VarDefinition node) { visitIdentifier(node._property); if (node._expression != null) node._expression.visit(this); } @override - visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { + void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { visitIncludeDirective(node.include); } @override - visitExtendDeclaration(ExtendDeclaration node) { + void visitExtendDeclaration(ExtendDeclaration node) { _visitNodeList(node.selectors); } @override - visitSelectorGroup(SelectorGroup node) { + void visitSelectorGroup(SelectorGroup node) { _visitNodeList(node.selectors); } @override - visitSelector(Selector node) { + void visitSelector(Selector node) { _visitNodeList(node.simpleSelectorSequences); } @override - visitSimpleSelectorSequence(SimpleSelectorSequence node) { + void visitSimpleSelectorSequence(SimpleSelectorSequence node) { node.simpleSelector.visit(this); } @override - visitSimpleSelector(SimpleSelector node) => node._name.visit(this); + void visitSimpleSelector(SimpleSelector node) => node._name.visit(this); @override - visitNamespaceSelector(NamespaceSelector node) { + void visitNamespaceSelector(NamespaceSelector node) { if (node._namespace != null) node._namespace.visit(this); if (node.nameAsSimpleSelector != null) { node.nameAsSimpleSelector.visit(this); @@ -354,231 +354,232 @@ class Visitor implements VisitorBase { } @override - visitElementSelector(ElementSelector node) => visitSimpleSelector(node); + void visitElementSelector(ElementSelector node) => visitSimpleSelector(node); @override - visitAttributeSelector(AttributeSelector node) { + void visitAttributeSelector(AttributeSelector node) { visitSimpleSelector(node); } @override - visitIdSelector(IdSelector node) => visitSimpleSelector(node); + void visitIdSelector(IdSelector node) => visitSimpleSelector(node); @override - visitClassSelector(ClassSelector node) => visitSimpleSelector(node); + void visitClassSelector(ClassSelector node) => visitSimpleSelector(node); @override - visitPseudoClassSelector(PseudoClassSelector node) => + void visitPseudoClassSelector(PseudoClassSelector node) => visitSimpleSelector(node); @override - visitPseudoElementSelector(PseudoElementSelector node) => + void visitPseudoElementSelector(PseudoElementSelector node) => visitSimpleSelector(node); @override - visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) => + void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) => visitSimpleSelector(node); @override - visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) => + void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) => visitSimpleSelector(node); @override - visitNegationSelector(NegationSelector node) => visitSimpleSelector(node); + void visitNegationSelector(NegationSelector node) => + visitSimpleSelector(node); @override - visitSelectorExpression(SelectorExpression node) { + void visitSelectorExpression(SelectorExpression node) { _visitNodeList(node.expressions); } @override - visitUnicodeRangeTerm(UnicodeRangeTerm node) {} + void visitUnicodeRangeTerm(UnicodeRangeTerm node) {} @override - visitLiteralTerm(LiteralTerm node) {} + void visitLiteralTerm(LiteralTerm node) {} @override - visitHexColorTerm(HexColorTerm node) {} + void visitHexColorTerm(HexColorTerm node) {} @override - visitNumberTerm(NumberTerm node) {} + void visitNumberTerm(NumberTerm node) {} @override - visitUnitTerm(UnitTerm node) {} + void visitUnitTerm(UnitTerm node) {} @override - visitLengthTerm(LengthTerm node) { + void visitLengthTerm(LengthTerm node) { visitUnitTerm(node); } @override - visitPercentageTerm(PercentageTerm node) { + void visitPercentageTerm(PercentageTerm node) { visitLiteralTerm(node); } @override - visitEmTerm(EmTerm node) { + void visitEmTerm(EmTerm node) { visitLiteralTerm(node); } @override - visitExTerm(ExTerm node) { + void visitExTerm(ExTerm node) { visitLiteralTerm(node); } @override - visitAngleTerm(AngleTerm node) { + void visitAngleTerm(AngleTerm node) { visitUnitTerm(node); } @override - visitTimeTerm(TimeTerm node) { + void visitTimeTerm(TimeTerm node) { visitUnitTerm(node); } @override - visitFreqTerm(FreqTerm node) { + void visitFreqTerm(FreqTerm node) { visitUnitTerm(node); } @override - visitFractionTerm(FractionTerm node) { + void visitFractionTerm(FractionTerm node) { visitLiteralTerm(node); } @override - visitUriTerm(UriTerm node) { + void visitUriTerm(UriTerm node) { visitLiteralTerm(node); } @override - visitResolutionTerm(ResolutionTerm node) { + void visitResolutionTerm(ResolutionTerm node) { visitUnitTerm(node); } @override - visitChTerm(ChTerm node) { + void visitChTerm(ChTerm node) { visitUnitTerm(node); } @override - visitRemTerm(RemTerm node) { + void visitRemTerm(RemTerm node) { visitUnitTerm(node); } @override - visitViewportTerm(ViewportTerm node) { + void visitViewportTerm(ViewportTerm node) { visitUnitTerm(node); } @override - visitFunctionTerm(FunctionTerm node) { + void visitFunctionTerm(FunctionTerm node) { visitLiteralTerm(node); visitExpressions(node._params); } @override - visitGroupTerm(GroupTerm node) { + void visitGroupTerm(GroupTerm node) { for (var term in node._terms) { term.visit(this); } } @override - visitItemTerm(ItemTerm node) { + void visitItemTerm(ItemTerm node) { visitNumberTerm(node); } @override - visitIE8Term(IE8Term node) {} + void visitIE8Term(IE8Term node) {} @override - visitOperatorSlash(OperatorSlash node) {} + void visitOperatorSlash(OperatorSlash node) {} @override - visitOperatorComma(OperatorComma node) {} + void visitOperatorComma(OperatorComma node) {} @override - visitOperatorPlus(OperatorPlus node) {} + void visitOperatorPlus(OperatorPlus node) {} @override - visitOperatorMinus(OperatorMinus node) {} + void visitOperatorMinus(OperatorMinus node) {} @override - visitVarUsage(VarUsage node) { + void visitVarUsage(VarUsage node) { _visitNodeList(node.defaultValues); } @override - visitExpressions(Expressions node) { + void visitExpressions(Expressions node) { _visitNodeList(node.expressions); } @override - visitBinaryExpression(BinaryExpression node) { + void visitBinaryExpression(BinaryExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - visitUnaryExpression(UnaryExpression node) { + void visitUnaryExpression(UnaryExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - visitIdentifier(Identifier node) {} + void visitIdentifier(Identifier node) {} @override - visitWildcard(Wildcard node) {} + void visitWildcard(Wildcard node) {} @override - visitThisOperator(ThisOperator node) {} + void visitThisOperator(ThisOperator node) {} @override - visitNegation(Negation node) {} + void visitNegation(Negation node) {} @override - visitDartStyleExpression(DartStyleExpression node) {} + void visitDartStyleExpression(DartStyleExpression node) {} @override - visitFontExpression(FontExpression node) { + void visitFontExpression(FontExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - visitBoxExpression(BoxExpression node) { + void visitBoxExpression(BoxExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - visitMarginExpression(MarginExpression node) { + void visitMarginExpression(MarginExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - visitBorderExpression(BorderExpression node) { + void visitBorderExpression(BorderExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - visitHeightExpression(HeightExpression node) { + void visitHeightExpression(HeightExpression node) { // TODO(terry): TB throw UnimplementedError(); } @override - visitPaddingExpression(PaddingExpression node) { + void visitPaddingExpression(PaddingExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - visitWidthExpression(WidthExpression node) { + void visitWidthExpression(WidthExpression node) { // TODO(terry): TBD throw UnimplementedError(); } diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index ae2288dda..207348ddd 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,8 +1,7 @@ name: csslib -version: 0.16.1 +version: 0.16.2-dev description: A library for parsing CSS. -author: Dart Team homepage: https://github.com/dart-lang/csslib environment: diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart index 5df5b45c0..000177752 100644 --- a/pkgs/csslib/test/big_1_test.dart +++ b/pkgs/csslib/test/big_1_test.dart @@ -8,7 +8,7 @@ import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; import 'testing.dart'; -compilePolyfillAndValidate(String input, String generated) { +void compilePolyfillAndValidate(String input, String generated) { var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index d943b08c4..709aa7b34 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -20,7 +20,7 @@ void expectCss(String css, String expected) { void testSimpleTerms() { var errors = []; - final String input = r''' + final input = r''' @ import url("test.css"); .foo { background-color: #191919; @@ -34,7 +34,7 @@ void testSimpleTerms() { length: 1.2in; -web-stuff: -10Px; }'''; - final String generated = r''' + final generated = r''' @import "test.css"; .foo { background-color: #191919; @@ -55,11 +55,11 @@ void testSimpleTerms() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); - final String input2 = r''' + final input2 = r''' * { border-color: green; }'''; - final String generated2 = r''' + final generated2 = r''' * { border-color: #008000; }'''; @@ -86,7 +86,7 @@ void testSimpleTerms() { /// no quotes. Hex values with # and letters, and functions (rgba, url, etc.) void testDeclarations() { var errors = []; - final String input = r''' + final input = r''' .more { color: white; color: black; @@ -100,7 +100,7 @@ void testDeclarations() { color: rgba(10,20,255); color: #123aef; /* hex # part integer and part identifier */ }'''; - final String generated = r''' + final generated = r''' .more { color: #fff; color: #000; @@ -124,7 +124,7 @@ void testDeclarations() { void testIdentifiers() { var errors = []; - final String input = r''' + final input = r''' #da { height: 100px; } @@ -133,7 +133,7 @@ void testIdentifiers() { color: #ff00cc; } '''; - final String generated = r''' + final generated = r''' #da { height: 100px; } @@ -151,7 +151,7 @@ void testIdentifiers() { void testComposites() { var errors = []; - final String input = r''' + final input = r''' .xyzzy { border: 10px 80px 90px 100px; width: 99%; @@ -161,7 +161,7 @@ void testComposites() { -webkit-transform: translate3d(0, 0, 0) scale(1.0); } }'''; - final String generated = r''' + final generated = r''' .xyzzy { border: 10px 80px 90px 100px; width: 99%; @@ -180,7 +180,7 @@ void testComposites() { void testUnits() { var errors = []; - final String input = r''' + final input = r''' #id-1 { transition: color 0.4s; animation-duration: 500ms; @@ -218,7 +218,7 @@ void testUnits() { } '''; - final String generated = r''' + final generated = r''' #id-1 { transition: color 0.4s; animation-duration: 500ms; @@ -264,7 +264,7 @@ void testUnits() { void testUnicode() { var errors = []; - final String input = r''' + final input = r''' .toggle:after { content: '✔'; line-height: 43px; @@ -274,7 +274,7 @@ void testUnicode() { } '''; - final String generated = r''' + final generated = r''' .toggle:after { content: '✔'; line-height: 43px; @@ -292,7 +292,7 @@ void testUnicode() { void testNewerCss() { var errors = []; - final String input = r''' + final input = r''' @media screen,print { .foobar_screen { width: 10px; @@ -310,7 +310,7 @@ void testNewerCss() { @charset "ISO-8859-1"; @charset 'ASCII';'''; - final String generated = r''' + final generated = r''' @media screen, print { .foobar_screen { width: 10px; @@ -683,13 +683,13 @@ void testViewport() { void testFontFace() { var errors = []; - final String input = ''' + final input = ''' @font-face { font-family: BBCBengali; src: url(fonts/BBCBengali.ttf) format("opentype"); unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; }'''; - final String generated = '''@font-face { + final generated = '''@font-face { font-family: BBCBengali; src: url("fonts/BBCBengali.ttf") format("opentype"); unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; @@ -700,13 +700,13 @@ void testFontFace() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); - final String input1 = ''' + final input1 = ''' @font-face { font-family: Gentium; src: url(http://example.com/fonts/Gentium.ttf); src: url(http://example.com/fonts/Gentium.ttf); }'''; - final String generated1 = '''@font-face { + final generated1 = '''@font-face { font-family: Gentium; src: url("http://example.com/fonts/Gentium.ttf"); src: url("http://example.com/fonts/Gentium.ttf"); @@ -718,13 +718,13 @@ void testFontFace() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated1); - final String input2 = ''' + final input2 = ''' @font-face { src: url(ideal-sans-serif.woff) format("woff"), url(basic-sans-serif.ttf) format("opentype"), local(Gentium Bold); }'''; - final String generated2 = '@font-face {\n' + final generated2 = '@font-face {\n' ' src: url("ideal-sans-serif.woff") ' 'format("woff"), url("basic-sans-serif.ttf") ' 'format("opentype"), local(Gentium Bold);\n}'; @@ -735,14 +735,14 @@ src: url(ideal-sans-serif.woff) format("woff"), expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); - final String input3 = '''@font-face { + final input3 = '''@font-face { font-family: MyGentium Text Ornaments; src: local(Gentium Bold), /* full font name */ local(Gentium-Bold), /* Postscript name */ url(GentiumBold.ttf); /* otherwise, download it */ font-weight: bold; }'''; - final String generated3 = '''@font-face { + final generated3 = '''@font-face { font-family: MyGentium Text Ornaments; src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); font-weight: bold; @@ -754,13 +754,13 @@ src: url(ideal-sans-serif.woff) format("woff"), expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated3); - final String input4 = ''' + final input4 = ''' @font-face { font-family: STIXGeneral; src: local(STIXGeneral), url(/stixfonts/STIXGeneral.otf); unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; }'''; - final String generated4 = '''@font-face { + final generated4 = '''@font-face { font-family: STIXGeneral; src: local(STIXGeneral), url("/stixfonts/STIXGeneral.otf"); unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; @@ -774,7 +774,7 @@ src: url(ideal-sans-serif.woff) format("woff"), void testCssFile() { var errors = []; - final String input = r''' + final input = r''' @import 'simple.css' @import "test.css" print @import url(test.css) screen, print @@ -809,7 +809,7 @@ div[href^='test'] { } '''; - final String generated = '@import "simple.css"; ' + final generated = '@import "simple.css"; ' '@import "test.css" print; ' '@import "test.css" screen, print; ' '@import "http://google.com/maps/maps.css";\n' @@ -847,7 +847,7 @@ void testCompactEmitter() { var errors = []; // Check !import compactly emitted. - final String input = r''' + final input = r''' div { color: green !important; background: red blue green; @@ -876,8 +876,7 @@ div { color: rgba(0, 0, 0, 0.2); } '''; - final String generated = - 'div{color:green!important;background:red blue green}' + final generated = 'div{color:green!important;background:red blue green}' '.foo p[bar]{color:blue}' '@page{@top-left{color:red}}' '@page:first{}' @@ -893,8 +892,8 @@ div { expect(compactOuptut(stylesheet), generated); // Check namespace directive compactly emitted. - final String input2 = '@namespace a url(http://www.example.org/a);'; - final String generated2 = '@namespace a url(http://www.example.org/a);'; + final input2 = '@namespace a url(http://www.example.org/a);'; + final generated2 = '@namespace a url(http://www.example.org/a);'; var stylesheet2 = parseCss(input2, errors: errors..clear()); @@ -906,7 +905,7 @@ div { void testNotSelectors() { var errors = []; - final String input = r''' + final input = r''' .details:not(.open-details) x-element, .details:not(.open-details) .summary { overflow: hidden; @@ -951,7 +950,7 @@ html|*:not(:link):not(:visited) { *:not(:not([disabled])) { color: blue; } '''; - final String generated = r''' + final generated = r''' .details:not(.open-details) x-element, .details:not(.open-details) .summary { overflow: hidden; } @@ -995,11 +994,11 @@ html|*:not(:link):not(:visited) { void testIE() { var errors = []; - final String input = '.test {\n' + final input = '.test {\n' ' filter: progid:DXImageTransform.Microsoft.gradient' "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" '}'; - final String generated = '.test {\n' + final generated = '.test {\n' ' filter: progid:DXImageTransform.Microsoft.gradient' "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" '}'; @@ -1010,13 +1009,13 @@ void testIE() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); - final String input2 = '.test {\n' + final input2 = '.test {\n' ' filter: progid:DXImageTransform.Microsoft.gradient' "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" ' progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n' '}'; - final String generated2 = '.test {\n' + final generated2 = '.test {\n' ' filter: progid:DXImageTransform.Microsoft.gradient' "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n" ' progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n' @@ -1028,7 +1027,7 @@ void testIE() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); - final String input3 = ''' + final input3 = ''' div { filter: alpha(opacity=80); /* IE7 and under */ -ms-filter: "Alpha(Opacity=40)"; /* IE8 and newer */ @@ -1042,7 +1041,7 @@ div { Phase=220, Strength=10); } '''; - final String generated3 = 'div {\n filter: alpha(opacity=80);\n' + final generated3 = 'div {\n filter: alpha(opacity=80);\n' ' -ms-filter: "Alpha(Opacity=40)";\n' ' Filter: Blur(Add = 0, Direction = 225, Strength = 10);\n' ' Filter: FlipV;\n Filter: Gray;\n' @@ -1354,7 +1353,7 @@ void twoCalcs() { void selectorWithCalcs() { var errors = []; - final String input = r''' + final input = r''' .foo { width: calc(1em + 5 * 2em); height: calc(1px + 2%) !important; @@ -1362,7 +1361,7 @@ void selectorWithCalcs() { border: calc(5px + 1em) 0px 1px calc(10 + 20 + 1px); margin: 25px calc(50px + (100% / (3 - 1em) - 20%)) calc(10px + 10 * 20) calc(100% - 10px); }'''; - final String generated = r''' + final generated = r''' .foo { width: calc(1em + 5 * 2em); height: calc(1px + 2%) !important; diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index f4ec960e8..d24217683 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -248,7 +248,7 @@ error on line 1, column 18: Expected hex number void testBadUnicode() { var errors = []; - final String input = ''' + final input = ''' @font-face { src: url(fonts/BBCBengali.ttf) format("opentype"); unicode-range: U+400-200; @@ -266,7 +266,7 @@ void testBadUnicode() { ' │ ^^^^^^^\n' ' ╵'); - final String input2 = ''' + final input2 = ''' @font-face { src: url(fonts/BBCBengali.ttf) format("opentype"); unicode-range: U+12FFFF; @@ -288,7 +288,7 @@ void testBadNesting() { var errors = []; // Test for bad declaration in a nested rule. - final String input = ''' + final input = ''' div { width: 20px; span + ul { color: blue; } @@ -309,7 +309,7 @@ div { expect(errorMessage.span.text, '#ffghghgh'); // Test for bad selector syntax. - final String input2 = ''' + final input2 = ''' div { span + ul #aaaa > (3333) { color: #ffghghgh; @@ -347,7 +347,7 @@ div { expect(errorMessage.span.text, '('); // Test for missing close braces and bad declaration. - final String input3 = ''' + final input3 = ''' div { span { color: #green; diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index ed5904f4d..38e0ea0ee 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -9,7 +9,7 @@ import 'package:test/test.dart'; import 'testing.dart'; -compileAndValidate(String input, String generated) { +void compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index dec66512b..f562f380e 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -9,7 +9,7 @@ import 'package:test/test.dart'; import 'testing.dart'; -compileAndValidate(String input, String generated) { +void compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); @@ -17,7 +17,7 @@ compileAndValidate(String input, String generated) { expect(prettyPrint(stylesheet), generated); } -compilePolyfillAndValidate(String input, String generated) { +void compilePolyfillAndValidate(String input, String generated) { var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index b8ef9ebbf..b096fc21c 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -9,7 +9,7 @@ import 'package:test/test.dart'; import 'testing.dart'; -compileAndValidate(String input, String generated) { +void compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: simpleOptions); expect(stylesheet != null, true); @@ -17,7 +17,7 @@ compileAndValidate(String input, String generated) { expect(prettyPrint(stylesheet), generated); } -selectorVariations() { +void selectorVariations() { final input1 = r'''html { color: red; }'''; final generated1 = r'''html { color: #f00; @@ -479,7 +479,7 @@ void complexThis() { compileAndValidate(input2, generated2); } -variationsThis() { +void variationsThis() { final input1 = r''' .textLink { a { @@ -590,7 +590,7 @@ light .leftCol .textLink a { compileAndValidate(input10, generated10); } -thisCombinator() { +void thisCombinator() { var input = r''' .btn { color: red; diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index db03b25b3..1ebd97591 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -9,7 +9,7 @@ import 'package:test/test.dart'; import 'testing.dart'; -compileAndValidate(String input, String generated) { +void compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); @@ -17,7 +17,7 @@ compileAndValidate(String input, String generated) { expect(prettyPrint(stylesheet), generated); } -compilePolyfillAndValidate(String input, String generated) { +void compilePolyfillAndValidate(String input, String generated) { var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); expect(stylesheet != null, true); @@ -496,7 +496,7 @@ void undefinedVars() { expect(prettyPrint(stylesheet), generatedPolyfill); } -parserVar() { +void parserVar() { final input = ''' :root { var-color-background: red; @@ -656,7 +656,7 @@ parserVar() { compilePolyfillAndValidate(input, generatedPolyfill); } -testVar() { +void testVar() { final errors = []; final input = ''' @color-background: red; @@ -711,7 +711,7 @@ var-color-foreground: #00f; compileAndValidate(input2, generated2); } -testLess() { +void testLess() { final errors = []; final input = ''' @color-background: red; From 7289e6bcc5cfdf7201586ad5a2cf027788c9cff0 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Thu, 2 Jan 2020 13:35:40 -0800 Subject: [PATCH 149/245] Use explicit dynamic over void return types (dart-lang/csslib#99) Some implementations are relying on passing values through the visit methods. Make return types explicitly `dynamic` to match their implicit types from before. This highlights that extending the `Visitor` class and expecting to return useful values is inherently risky. Not only will usages fall through to dynamic and have no static errors for things like typos, there are also places where the values will be silently discarded by the implementation in` Visitor`. --- pkgs/csslib/lib/src/tree.dart | 196 +++++++------- pkgs/csslib/lib/src/tree_base.dart | 2 +- pkgs/csslib/lib/visitor.dart | 399 +++++++++++++++-------------- 3 files changed, 302 insertions(+), 295 deletions(-) diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 81f26bfdd..b050442b7 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -17,7 +17,7 @@ class Identifier extends TreeNode { Identifier clone() => Identifier(name, span); @override - void visit(VisitorBase visitor) => visitor.visitIdentifier(this); + dynamic visit(VisitorBase visitor) => visitor.visitIdentifier(this); @override String toString() => name; @@ -28,7 +28,7 @@ class Wildcard extends TreeNode { @override Wildcard clone() => Wildcard(span); @override - void visit(VisitorBase visitor) => visitor.visitWildcard(this); + dynamic visit(VisitorBase visitor) => visitor.visitWildcard(this); String get name => '*'; } @@ -38,7 +38,7 @@ class ThisOperator extends TreeNode { @override ThisOperator clone() => ThisOperator(span); @override - void visit(VisitorBase visitor) => visitor.visitThisOperator(this); + dynamic visit(VisitorBase visitor) => visitor.visitThisOperator(this); String get name => '&'; } @@ -48,7 +48,7 @@ class Negation extends TreeNode { @override Negation clone() => Negation(span); @override - void visit(VisitorBase visitor) => visitor.visitNegation(this); + dynamic visit(VisitorBase visitor) => visitor.visitNegation(this); String get name => 'not'; } @@ -65,7 +65,7 @@ class CalcTerm extends LiteralTerm { @override CalcTerm clone() => CalcTerm(value, text, expr.clone(), span); @override - void visit(VisitorBase visitor) => visitor.visitCalcTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitCalcTerm(this); @override String toString() => '$text($expr)'; @@ -79,7 +79,7 @@ class CssComment extends TreeNode { @override CssComment clone() => CssComment(comment, span); @override - void visit(VisitorBase visitor) => visitor.visitCssComment(this); + dynamic visit(VisitorBase visitor) => visitor.visitCssComment(this); } // CDO/CDC (Comment Definition Open ). @@ -88,7 +88,7 @@ class CommentDefinition extends CssComment { @override CommentDefinition clone() => CommentDefinition(comment, span); @override - void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); + dynamic visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); } class SelectorGroup extends TreeNode { @@ -100,7 +100,7 @@ class SelectorGroup extends TreeNode { SelectorGroup clone() => SelectorGroup(selectors, span); @override - void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); + dynamic visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); } class Selector extends TreeNode { @@ -121,7 +121,7 @@ class Selector extends TreeNode { } @override - void visit(VisitorBase visitor) => visitor.visitSelector(this); + dynamic visit(VisitorBase visitor) => visitor.visitSelector(this); } class SimpleSelectorSequence extends TreeNode { @@ -161,7 +161,8 @@ class SimpleSelectorSequence extends TreeNode { SimpleSelectorSequence(simpleSelector, span, combinator); @override - void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); + dynamic visit(VisitorBase visitor) => + visitor.visitSimpleSelectorSequence(this); @override String toString() => simpleSelector.name; @@ -181,14 +182,14 @@ abstract class SimpleSelector extends TreeNode { bool get isThis => _name is ThisOperator; @override - void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); + dynamic visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); } // element name class ElementSelector extends SimpleSelector { ElementSelector(name, SourceSpan span) : super(name, span); @override - void visit(VisitorBase visitor) => visitor.visitElementSelector(this); + dynamic visit(VisitorBase visitor) => visitor.visitElementSelector(this); @override ElementSelector clone() => ElementSelector(_name, span); @@ -215,7 +216,7 @@ class NamespaceSelector extends SimpleSelector { NamespaceSelector clone() => NamespaceSelector(_namespace, '', span); @override - void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); + dynamic visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); @override String toString() => '$namespace|${nameAsSimpleSelector.name}'; @@ -286,7 +287,7 @@ class AttributeSelector extends SimpleSelector { AttributeSelector clone() => AttributeSelector(_name, _op, value, span); @override - void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); + dynamic visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); @override String toString() => '[$name${matchOperator()}${valueToString()}]'; @@ -298,7 +299,7 @@ class IdSelector extends SimpleSelector { @override IdSelector clone() => IdSelector(_name, span); @override - void visit(VisitorBase visitor) => visitor.visitIdSelector(this); + dynamic visit(VisitorBase visitor) => visitor.visitIdSelector(this); @override String toString() => '#$_name'; @@ -310,7 +311,7 @@ class ClassSelector extends SimpleSelector { @override ClassSelector clone() => ClassSelector(_name, span); @override - void visit(VisitorBase visitor) => visitor.visitClassSelector(this); + dynamic visit(VisitorBase visitor) => visitor.visitClassSelector(this); @override String toString() => '.$_name'; @@ -320,7 +321,7 @@ class ClassSelector extends SimpleSelector { class PseudoClassSelector extends SimpleSelector { PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span); @override - void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); + dynamic visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); @override PseudoClassSelector clone() => PseudoClassSelector(_name, span); @@ -338,7 +339,8 @@ class PseudoElementSelector extends SimpleSelector { {this.isLegacy = false}) : super(name, span); @override - void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); + dynamic visit(VisitorBase visitor) => + visitor.visitPseudoElementSelector(this); @override PseudoElementSelector clone() => PseudoElementSelector(_name, span); @@ -363,7 +365,7 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { SelectorExpression get expression => _argument as SelectorExpression; @override - void visit(VisitorBase visitor) => + dynamic visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); } @@ -380,7 +382,7 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { PseudoElementFunctionSelector(_name, expression, span); @override - void visit(VisitorBase visitor) => + dynamic visit(VisitorBase visitor) => visitor.visitPseudoElementFunctionSelector(this); } @@ -395,7 +397,7 @@ class SelectorExpression extends TreeNode { } @override - void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); } // :NOT(negation_arg) @@ -409,7 +411,7 @@ class NegationSelector extends SimpleSelector { NegationSelector clone() => NegationSelector(negationArg, span); @override - void visit(VisitorBase visitor) => visitor.visitNegationSelector(this); + dynamic visit(VisitorBase visitor) => visitor.visitNegationSelector(this); } class NoOp extends TreeNode { @@ -419,7 +421,7 @@ class NoOp extends TreeNode { NoOp clone() => NoOp(); @override - void visit(VisitorBase visitor) => visitor.visitNoOp(this); + dynamic visit(VisitorBase visitor) => visitor.visitNoOp(this); } class StyleSheet extends TreeNode { @@ -442,7 +444,7 @@ class StyleSheet extends TreeNode { } @override - void visit(VisitorBase visitor) => visitor.visitStyleSheet(this); + dynamic visit(VisitorBase visitor) => visitor.visitStyleSheet(this); } class TopLevelProduction extends TreeNode { @@ -450,7 +452,7 @@ class TopLevelProduction extends TreeNode { @override TopLevelProduction clone() => TopLevelProduction(span); @override - void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); + dynamic visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); } class RuleSet extends TopLevelProduction { @@ -471,7 +473,7 @@ class RuleSet extends TopLevelProduction { } @override - void visit(VisitorBase visitor) => visitor.visitRuleSet(this); + dynamic visit(VisitorBase visitor) => visitor.visitRuleSet(this); } class Directive extends TreeNode { @@ -483,7 +485,7 @@ class Directive extends TreeNode { @override Directive clone() => Directive(span); @override - void visit(VisitorBase visitor) => visitor.visitDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitDirective(this); } class DocumentDirective extends Directive { @@ -507,7 +509,7 @@ class DocumentDirective extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitDocumentDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitDocumentDirective(this); } class SupportsDirective extends Directive { @@ -528,7 +530,7 @@ class SupportsDirective extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitSupportsDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitSupportsDirective(this); } abstract class SupportsCondition extends TreeNode { @@ -552,7 +554,7 @@ class SupportsConditionInParens extends SupportsCondition { SupportsConditionInParens(condition.clone(), span); @override - void visit(VisitorBase visitor) => + dynamic visit(VisitorBase visitor) => visitor.visitSupportsConditionInParens(this); } @@ -565,7 +567,7 @@ class SupportsNegation extends SupportsCondition { SupportsNegation clone() => SupportsNegation(condition.clone(), span); @override - void visit(VisitorBase visitor) => visitor.visitSupportsNegation(this); + dynamic visit(VisitorBase visitor) => visitor.visitSupportsNegation(this); } class SupportsConjunction extends SupportsCondition { @@ -583,7 +585,7 @@ class SupportsConjunction extends SupportsCondition { } @override - void visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this); + dynamic visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this); } class SupportsDisjunction extends SupportsCondition { @@ -601,7 +603,7 @@ class SupportsDisjunction extends SupportsCondition { } @override - void visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this); + dynamic visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this); } class ViewportDirective extends Directive { @@ -616,7 +618,7 @@ class ViewportDirective extends Directive { ViewportDirective(name, declarations.clone(), span); @override - void visit(VisitorBase visitor) => visitor.visitViewportDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitViewportDirective(this); } class ImportDirective extends Directive { @@ -639,7 +641,7 @@ class ImportDirective extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitImportDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitImportDirective(this); } /// MediaExpression grammar: @@ -663,7 +665,7 @@ class MediaExpression extends TreeNode { } @override - void visit(VisitorBase visitor) => visitor.visitMediaExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitMediaExpression(this); } /// MediaQuery grammar: @@ -703,7 +705,7 @@ class MediaQuery extends TreeNode { } @override - void visit(VisitorBase visitor) => visitor.visitMediaQuery(this); + dynamic visit(VisitorBase visitor) => visitor.visitMediaQuery(this); } class MediaDirective extends Directive { @@ -726,7 +728,7 @@ class MediaDirective extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitMediaDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitMediaDirective(this); } class HostDirective extends Directive { @@ -744,7 +746,7 @@ class HostDirective extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitHostDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitHostDirective(this); } class PageDirective extends Directive { @@ -766,7 +768,7 @@ class PageDirective extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitPageDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitPageDirective(this); bool get hasIdent => _ident != null && _ident.isNotEmpty; bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.isNotEmpty; @@ -779,7 +781,7 @@ class CharsetDirective extends Directive { @override CharsetDirective clone() => CharsetDirective(charEncoding, span); @override - void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); } class KeyFrameDirective extends Directive { @@ -821,7 +823,7 @@ class KeyFrameDirective extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); } class KeyFrameBlock extends Expression { @@ -835,7 +837,7 @@ class KeyFrameBlock extends Expression { KeyFrameBlock clone() => KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); @override - void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); + dynamic visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); } class FontFaceDirective extends Directive { @@ -846,7 +848,7 @@ class FontFaceDirective extends Directive { @override FontFaceDirective clone() => FontFaceDirective(_declarations.clone(), span); @override - void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); } class StyletDirective extends Directive { @@ -871,7 +873,7 @@ class StyletDirective extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitStyletDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitStyletDirective(this); } class NamespaceDirective extends Directive { @@ -887,7 +889,7 @@ class NamespaceDirective extends Directive { NamespaceDirective clone() => NamespaceDirective(_prefix, _uri, span); @override - void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); String get prefix => _prefix.isNotEmpty ? '$_prefix ' : ''; } @@ -902,7 +904,8 @@ class VarDefinitionDirective extends Directive { VarDefinitionDirective clone() => VarDefinitionDirective(def.clone(), span); @override - void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); + dynamic visit(VisitorBase visitor) => + visitor.visitVarDefinitionDirective(this); } class MixinDefinition extends Directive { @@ -923,7 +926,7 @@ class MixinDefinition extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); + dynamic visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); } /// Support a Sass @mixin. See http://sass-lang.com for description. @@ -949,7 +952,8 @@ class MixinRulesetDirective extends MixinDefinition { } @override - void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); + dynamic visit(VisitorBase visitor) => + visitor.visitMixinRulesetDirective(this); } class MixinDeclarationDirective extends MixinDefinition { @@ -970,7 +974,7 @@ class MixinDeclarationDirective extends MixinDefinition { } @override - void visit(VisitorBase visitor) => + dynamic visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); } @@ -991,7 +995,7 @@ class IncludeDirective extends Directive { } @override - void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); } /// To support Sass @content. @@ -999,7 +1003,7 @@ class ContentDirective extends Directive { ContentDirective(SourceSpan span) : super(span); @override - void visit(VisitorBase visitor) => visitor.visitContentDirective(this); + dynamic visit(VisitorBase visitor) => visitor.visitContentDirective(this); } class Declaration extends TreeNode { @@ -1035,7 +1039,7 @@ class Declaration extends TreeNode { important: important); @override - void visit(VisitorBase visitor) => visitor.visitDeclaration(this); + dynamic visit(VisitorBase visitor) => visitor.visitDeclaration(this); } // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and @@ -1057,7 +1061,7 @@ class VarDefinition extends Declaration { _property.clone(), expression != null ? expression.clone() : null, span); @override - void visit(VisitorBase visitor) => visitor.visitVarDefinition(this); + dynamic visit(VisitorBase visitor) => visitor.visitVarDefinition(this); } /// Node for usage of @include mixin[(args,...)] found in a declaration group @@ -1077,7 +1081,7 @@ class IncludeMixinAtDeclaration extends Declaration { IncludeMixinAtDeclaration(include.clone(), span); @override - void visit(VisitorBase visitor) => + dynamic visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this); } @@ -1094,7 +1098,7 @@ class ExtendDeclaration extends Declaration { } @override - void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); + dynamic visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); } class DeclarationGroup extends TreeNode { @@ -1110,7 +1114,7 @@ class DeclarationGroup extends TreeNode { } @override - void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); + dynamic visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); } class MarginGroup extends DeclarationGroup { @@ -1122,7 +1126,7 @@ class MarginGroup extends DeclarationGroup { MarginGroup clone() => MarginGroup(margin_sym, super.clone().declarations, span); @override - void visit(VisitorBase visitor) => visitor.visitMarginGroup(this); + dynamic visit(VisitorBase visitor) => visitor.visitMarginGroup(this); } class VarUsage extends Expression { @@ -1141,7 +1145,7 @@ class VarUsage extends Expression { } @override - void visit(VisitorBase visitor) => visitor.visitVarUsage(this); + dynamic visit(VisitorBase visitor) => visitor.visitVarUsage(this); } class OperatorSlash extends Expression { @@ -1149,7 +1153,7 @@ class OperatorSlash extends Expression { @override OperatorSlash clone() => OperatorSlash(span); @override - void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); + dynamic visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); } class OperatorComma extends Expression { @@ -1157,7 +1161,7 @@ class OperatorComma extends Expression { @override OperatorComma clone() => OperatorComma(span); @override - void visit(VisitorBase visitor) => visitor.visitOperatorComma(this); + dynamic visit(VisitorBase visitor) => visitor.visitOperatorComma(this); } class OperatorPlus extends Expression { @@ -1165,7 +1169,7 @@ class OperatorPlus extends Expression { @override OperatorPlus clone() => OperatorPlus(span); @override - void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); + dynamic visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); } class OperatorMinus extends Expression { @@ -1173,7 +1177,7 @@ class OperatorMinus extends Expression { @override OperatorMinus clone() => OperatorMinus(span); @override - void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); + dynamic visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); } class UnicodeRangeTerm extends Expression { @@ -1188,7 +1192,7 @@ class UnicodeRangeTerm extends Expression { UnicodeRangeTerm clone() => UnicodeRangeTerm(first, second, span); @override - void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); } class LiteralTerm extends Expression { @@ -1204,7 +1208,7 @@ class LiteralTerm extends Expression { LiteralTerm clone() => LiteralTerm(value, text, span); @override - void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); } class NumberTerm extends LiteralTerm { @@ -1212,7 +1216,7 @@ class NumberTerm extends LiteralTerm { @override NumberTerm clone() => NumberTerm(value, text, span); @override - void visit(VisitorBase visitor) => visitor.visitNumberTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitNumberTerm(this); } class UnitTerm extends LiteralTerm { @@ -1224,7 +1228,7 @@ class UnitTerm extends LiteralTerm { UnitTerm clone() => UnitTerm(value, text, span, unit); @override - void visit(VisitorBase visitor) => visitor.visitUnitTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitUnitTerm(this); String unitToString() => TokenKind.unitToString(unit); @@ -1246,7 +1250,7 @@ class LengthTerm extends UnitTerm { @override LengthTerm clone() => LengthTerm(value, text, span, unit); @override - void visit(VisitorBase visitor) => visitor.visitLengthTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitLengthTerm(this); } class PercentageTerm extends LiteralTerm { @@ -1254,7 +1258,7 @@ class PercentageTerm extends LiteralTerm { @override PercentageTerm clone() => PercentageTerm(value, text, span); @override - void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); } class EmTerm extends LiteralTerm { @@ -1262,7 +1266,7 @@ class EmTerm extends LiteralTerm { @override EmTerm clone() => EmTerm(value, text, span); @override - void visit(VisitorBase visitor) => visitor.visitEmTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitEmTerm(this); } class ExTerm extends LiteralTerm { @@ -1270,7 +1274,7 @@ class ExTerm extends LiteralTerm { @override ExTerm clone() => ExTerm(value, text, span); @override - void visit(VisitorBase visitor) => visitor.visitExTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitExTerm(this); } class AngleTerm extends UnitTerm { @@ -1286,7 +1290,7 @@ class AngleTerm extends UnitTerm { @override AngleTerm clone() => AngleTerm(value, text, span, unit); @override - void visit(VisitorBase visitor) => visitor.visitAngleTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitAngleTerm(this); } class TimeTerm extends UnitTerm { @@ -1301,7 +1305,7 @@ class TimeTerm extends UnitTerm { @override TimeTerm clone() => TimeTerm(value, text, span, unit); @override - void visit(VisitorBase visitor) => visitor.visitTimeTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitTimeTerm(this); } class FreqTerm extends UnitTerm { @@ -1314,7 +1318,7 @@ class FreqTerm extends UnitTerm { @override FreqTerm clone() => FreqTerm(value, text, span, unit); @override - void visit(VisitorBase visitor) => visitor.visitFreqTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitFreqTerm(this); } class FractionTerm extends LiteralTerm { @@ -1323,7 +1327,7 @@ class FractionTerm extends LiteralTerm { @override FractionTerm clone() => FractionTerm(value, text, span); @override - void visit(VisitorBase visitor) => visitor.visitFractionTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitFractionTerm(this); } class UriTerm extends LiteralTerm { @@ -1332,7 +1336,7 @@ class UriTerm extends LiteralTerm { @override UriTerm clone() => UriTerm(value, span); @override - void visit(VisitorBase visitor) => visitor.visitUriTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitUriTerm(this); } class ResolutionTerm extends UnitTerm { @@ -1347,7 +1351,7 @@ class ResolutionTerm extends UnitTerm { @override ResolutionTerm clone() => ResolutionTerm(value, text, span, unit); @override - void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); } class ChTerm extends UnitTerm { @@ -1360,7 +1364,7 @@ class ChTerm extends UnitTerm { @override ChTerm clone() => ChTerm(value, text, span, unit); @override - void visit(VisitorBase visitor) => visitor.visitChTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitChTerm(this); } class RemTerm extends UnitTerm { @@ -1373,7 +1377,7 @@ class RemTerm extends UnitTerm { @override RemTerm clone() => RemTerm(value, text, span, unit); @override - void visit(VisitorBase visitor) => visitor.visitRemTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitRemTerm(this); } class ViewportTerm extends UnitTerm { @@ -1389,7 +1393,7 @@ class ViewportTerm extends UnitTerm { @override ViewportTerm clone() => ViewportTerm(value, text, span, unit); @override - void visit(VisitorBase visitor) => visitor.visitViewportTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitViewportTerm(this); } /// Type to signal a bad hex value for HexColorTerm.value. @@ -1401,7 +1405,7 @@ class HexColorTerm extends LiteralTerm { @override HexColorTerm clone() => HexColorTerm(value, text, span); @override - void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); } class FunctionTerm extends LiteralTerm { @@ -1413,7 +1417,7 @@ class FunctionTerm extends LiteralTerm { @override FunctionTerm clone() => FunctionTerm(value, text, _params.clone(), span); @override - void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); } /// A "\9" was encountered at the end of the expression and before a semi-colon. @@ -1424,7 +1428,7 @@ class IE8Term extends LiteralTerm { @override IE8Term clone() => IE8Term(span); @override - void visit(VisitorBase visitor) => visitor.visitIE8Term(this); + dynamic visit(VisitorBase visitor) => visitor.visitIE8Term(this); } class GroupTerm extends Expression { @@ -1441,7 +1445,7 @@ class GroupTerm extends Expression { @override GroupTerm clone() => GroupTerm(span); @override - void visit(VisitorBase visitor) => visitor.visitGroupTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitGroupTerm(this); } class ItemTerm extends NumberTerm { @@ -1450,7 +1454,7 @@ class ItemTerm extends NumberTerm { @override ItemTerm clone() => ItemTerm(value, text, span); @override - void visit(VisitorBase visitor) => visitor.visitItemTerm(this); + dynamic visit(VisitorBase visitor) => visitor.visitItemTerm(this); } class Expressions extends Expression { @@ -1472,7 +1476,7 @@ class Expressions extends Expression { } @override - void visit(VisitorBase visitor) => visitor.visitExpressions(this); + dynamic visit(VisitorBase visitor) => visitor.visitExpressions(this); } class BinaryExpression extends Expression { @@ -1485,7 +1489,7 @@ class BinaryExpression extends Expression { @override BinaryExpression clone() => BinaryExpression(op, x.clone(), y.clone(), span); @override - void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); } class UnaryExpression extends Expression { @@ -1497,7 +1501,7 @@ class UnaryExpression extends Expression { @override UnaryExpression clone() => UnaryExpression(op, self.clone(), span); @override - void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); } abstract class DartStyleExpression extends TreeNode { @@ -1531,7 +1535,7 @@ abstract class DartStyleExpression extends TreeNode { bool isSame(DartStyleExpression other) => _styleType == other._styleType; @override - void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); } class FontExpression extends DartStyleExpression { @@ -1583,7 +1587,7 @@ class FontExpression extends DartStyleExpression { lineHeight: font.lineHeight); @override - void visit(VisitorBase visitor) => visitor.visitFontExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitFontExpression(this); } abstract class BoxExpression extends DartStyleExpression { @@ -1593,7 +1597,7 @@ abstract class BoxExpression extends DartStyleExpression { : super(styleType, span); @override - void visit(VisitorBase visitor) => visitor.visitBoxExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitBoxExpression(this); String get formattedBoxEdge { if (box.top == box.left && box.top == box.bottom && box.top == box.right) { @@ -1643,7 +1647,7 @@ class MarginExpression extends BoxExpression { top: box.top, right: box.right, bottom: box.bottom, left: box.left); @override - void visit(VisitorBase visitor) => visitor.visitMarginExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitMarginExpression(this); } class BorderExpression extends BoxExpression { @@ -1681,7 +1685,7 @@ class BorderExpression extends BoxExpression { top: box.top, right: box.right, bottom: box.bottom, left: box.left); @override - void visit(VisitorBase visitor) => visitor.visitBorderExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitBorderExpression(this); } class HeightExpression extends DartStyleExpression { @@ -1704,7 +1708,7 @@ class HeightExpression extends DartStyleExpression { @override HeightExpression clone() => HeightExpression(span, height); @override - void visit(VisitorBase visitor) => visitor.visitHeightExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitHeightExpression(this); } class WidthExpression extends DartStyleExpression { @@ -1725,7 +1729,7 @@ class WidthExpression extends DartStyleExpression { @override WidthExpression clone() => WidthExpression(span, width); @override - void visit(VisitorBase visitor) => visitor.visitWidthExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitWidthExpression(this); } class PaddingExpression extends BoxExpression { @@ -1762,5 +1766,5 @@ class PaddingExpression extends BoxExpression { PaddingExpression clone() => PaddingExpression(span, top: box.top, right: box.right, bottom: box.bottom, left: box.left); @override - void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); + dynamic visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); } diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index 6f2f442ba..eef1849d2 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -14,7 +14,7 @@ abstract class TreeNode { TreeNode clone(); /// Classic double-dispatch visitor for implementing passes. - void visit(VisitorBase visitor); + dynamic visit(VisitorBase visitor); /// A multiline string showing the node and its children. String toDebugString() { diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index ceda80c95..9fff5684f 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -11,107 +11,108 @@ part 'src/tree_base.dart'; part 'src/tree_printer.dart'; abstract class VisitorBase { - void visitCalcTerm(CalcTerm node); - void visitCssComment(CssComment node); - void visitCommentDefinition(CommentDefinition node); - void visitStyleSheet(StyleSheet node); - void visitNoOp(NoOp node); - void visitTopLevelProduction(TopLevelProduction node); - void visitDirective(Directive node); - void visitDocumentDirective(DocumentDirective node); - void visitSupportsDirective(SupportsDirective node); - void visitSupportsConditionInParens(SupportsConditionInParens node); - void visitSupportsNegation(SupportsNegation node); - void visitSupportsConjunction(SupportsConjunction node); - void visitSupportsDisjunction(SupportsDisjunction node); - void visitViewportDirective(ViewportDirective node); - void visitMediaExpression(MediaExpression node); - void visitMediaQuery(MediaQuery node); - void visitMediaDirective(MediaDirective node); - void visitHostDirective(HostDirective node); - void visitPageDirective(PageDirective node); - void visitCharsetDirective(CharsetDirective node); - void visitImportDirective(ImportDirective node); - void visitKeyFrameDirective(KeyFrameDirective node); - void visitKeyFrameBlock(KeyFrameBlock node); - void visitFontFaceDirective(FontFaceDirective node); - void visitStyletDirective(StyletDirective node); - void visitNamespaceDirective(NamespaceDirective node); - void visitVarDefinitionDirective(VarDefinitionDirective node); - void visitMixinDefinition(MixinDefinition node); - void visitMixinRulesetDirective(MixinRulesetDirective node); - void visitMixinDeclarationDirective(MixinDeclarationDirective node); - void visitIncludeDirective(IncludeDirective node); - void visitContentDirective(ContentDirective node); - - void visitRuleSet(RuleSet node); - void visitDeclarationGroup(DeclarationGroup node); - void visitMarginGroup(MarginGroup node); - void visitDeclaration(Declaration node); - void visitVarDefinition(VarDefinition node); - void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node); - void visitExtendDeclaration(ExtendDeclaration node); - void visitSelectorGroup(SelectorGroup node); - void visitSelector(Selector node); - void visitSimpleSelectorSequence(SimpleSelectorSequence node); - void visitSimpleSelector(SimpleSelector node); - void visitElementSelector(ElementSelector node); - void visitNamespaceSelector(NamespaceSelector node); - void visitAttributeSelector(AttributeSelector node); - void visitIdSelector(IdSelector node); - void visitClassSelector(ClassSelector node); - void visitPseudoClassSelector(PseudoClassSelector node); - void visitPseudoElementSelector(PseudoElementSelector node); - void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node); - void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node); - void visitNegationSelector(NegationSelector node); - void visitSelectorExpression(SelectorExpression node); - - void visitUnicodeRangeTerm(UnicodeRangeTerm node); - void visitLiteralTerm(LiteralTerm node); - void visitHexColorTerm(HexColorTerm node); - void visitNumberTerm(NumberTerm node); - void visitUnitTerm(UnitTerm node); - void visitLengthTerm(LengthTerm node); - void visitPercentageTerm(PercentageTerm node); - void visitEmTerm(EmTerm node); - void visitExTerm(ExTerm node); - void visitAngleTerm(AngleTerm node); - void visitTimeTerm(TimeTerm node); - void visitFreqTerm(FreqTerm node); - void visitFractionTerm(FractionTerm node); - void visitUriTerm(UriTerm node); - void visitResolutionTerm(ResolutionTerm node); - void visitChTerm(ChTerm node); - void visitRemTerm(RemTerm node); - void visitViewportTerm(ViewportTerm node); - void visitFunctionTerm(FunctionTerm node); - void visitGroupTerm(GroupTerm node); - void visitItemTerm(ItemTerm node); - void visitIE8Term(IE8Term node); - void visitOperatorSlash(OperatorSlash node); - void visitOperatorComma(OperatorComma node); - void visitOperatorPlus(OperatorPlus node); - void visitOperatorMinus(OperatorMinus node); - void visitVarUsage(VarUsage node); - - void visitExpressions(Expressions node); - void visitBinaryExpression(BinaryExpression node); - void visitUnaryExpression(UnaryExpression node); - - void visitIdentifier(Identifier node); - void visitWildcard(Wildcard node); - void visitThisOperator(ThisOperator node); - void visitNegation(Negation node); - - void visitDartStyleExpression(DartStyleExpression node); - void visitFontExpression(FontExpression node); - void visitBoxExpression(BoxExpression node); - void visitMarginExpression(MarginExpression node); - void visitBorderExpression(BorderExpression node); - void visitHeightExpression(HeightExpression node); - void visitPaddingExpression(PaddingExpression node); - void visitWidthExpression(WidthExpression node); + dynamic visitCalcTerm(CalcTerm node); + dynamic visitCssComment(CssComment node); + dynamic visitCommentDefinition(CommentDefinition node); + dynamic visitStyleSheet(StyleSheet node); + dynamic visitNoOp(NoOp node); + dynamic visitTopLevelProduction(TopLevelProduction node); + dynamic visitDirective(Directive node); + dynamic visitDocumentDirective(DocumentDirective node); + dynamic visitSupportsDirective(SupportsDirective node); + dynamic visitSupportsConditionInParens(SupportsConditionInParens node); + dynamic visitSupportsNegation(SupportsNegation node); + dynamic visitSupportsConjunction(SupportsConjunction node); + dynamic visitSupportsDisjunction(SupportsDisjunction node); + dynamic visitViewportDirective(ViewportDirective node); + dynamic visitMediaExpression(MediaExpression node); + dynamic visitMediaQuery(MediaQuery node); + dynamic visitMediaDirective(MediaDirective node); + dynamic visitHostDirective(HostDirective node); + dynamic visitPageDirective(PageDirective node); + dynamic visitCharsetDirective(CharsetDirective node); + dynamic visitImportDirective(ImportDirective node); + dynamic visitKeyFrameDirective(KeyFrameDirective node); + dynamic visitKeyFrameBlock(KeyFrameBlock node); + dynamic visitFontFaceDirective(FontFaceDirective node); + dynamic visitStyletDirective(StyletDirective node); + dynamic visitNamespaceDirective(NamespaceDirective node); + dynamic visitVarDefinitionDirective(VarDefinitionDirective node); + dynamic visitMixinDefinition(MixinDefinition node); + dynamic visitMixinRulesetDirective(MixinRulesetDirective node); + dynamic visitMixinDeclarationDirective(MixinDeclarationDirective node); + dynamic visitIncludeDirective(IncludeDirective node); + dynamic visitContentDirective(ContentDirective node); + + dynamic visitRuleSet(RuleSet node); + dynamic visitDeclarationGroup(DeclarationGroup node); + dynamic visitMarginGroup(MarginGroup node); + dynamic visitDeclaration(Declaration node); + dynamic visitVarDefinition(VarDefinition node); + dynamic visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node); + dynamic visitExtendDeclaration(ExtendDeclaration node); + dynamic visitSelectorGroup(SelectorGroup node); + dynamic visitSelector(Selector node); + dynamic visitSimpleSelectorSequence(SimpleSelectorSequence node); + dynamic visitSimpleSelector(SimpleSelector node); + dynamic visitElementSelector(ElementSelector node); + dynamic visitNamespaceSelector(NamespaceSelector node); + dynamic visitAttributeSelector(AttributeSelector node); + dynamic visitIdSelector(IdSelector node); + dynamic visitClassSelector(ClassSelector node); + dynamic visitPseudoClassSelector(PseudoClassSelector node); + dynamic visitPseudoElementSelector(PseudoElementSelector node); + dynamic visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node); + dynamic visitPseudoElementFunctionSelector( + PseudoElementFunctionSelector node); + dynamic visitNegationSelector(NegationSelector node); + dynamic visitSelectorExpression(SelectorExpression node); + + dynamic visitUnicodeRangeTerm(UnicodeRangeTerm node); + dynamic visitLiteralTerm(LiteralTerm node); + dynamic visitHexColorTerm(HexColorTerm node); + dynamic visitNumberTerm(NumberTerm node); + dynamic visitUnitTerm(UnitTerm node); + dynamic visitLengthTerm(LengthTerm node); + dynamic visitPercentageTerm(PercentageTerm node); + dynamic visitEmTerm(EmTerm node); + dynamic visitExTerm(ExTerm node); + dynamic visitAngleTerm(AngleTerm node); + dynamic visitTimeTerm(TimeTerm node); + dynamic visitFreqTerm(FreqTerm node); + dynamic visitFractionTerm(FractionTerm node); + dynamic visitUriTerm(UriTerm node); + dynamic visitResolutionTerm(ResolutionTerm node); + dynamic visitChTerm(ChTerm node); + dynamic visitRemTerm(RemTerm node); + dynamic visitViewportTerm(ViewportTerm node); + dynamic visitFunctionTerm(FunctionTerm node); + dynamic visitGroupTerm(GroupTerm node); + dynamic visitItemTerm(ItemTerm node); + dynamic visitIE8Term(IE8Term node); + dynamic visitOperatorSlash(OperatorSlash node); + dynamic visitOperatorComma(OperatorComma node); + dynamic visitOperatorPlus(OperatorPlus node); + dynamic visitOperatorMinus(OperatorMinus node); + dynamic visitVarUsage(VarUsage node); + + dynamic visitExpressions(Expressions node); + dynamic visitBinaryExpression(BinaryExpression node); + dynamic visitUnaryExpression(UnaryExpression node); + + dynamic visitIdentifier(Identifier node); + dynamic visitWildcard(Wildcard node); + dynamic visitThisOperator(ThisOperator node); + dynamic visitNegation(Negation node); + + dynamic visitDartStyleExpression(DartStyleExpression node); + dynamic visitFontExpression(FontExpression node); + dynamic visitBoxExpression(BoxExpression node); + dynamic visitMarginExpression(MarginExpression node); + dynamic visitBorderExpression(BorderExpression node); + dynamic visitHeightExpression(HeightExpression node); + dynamic visitPaddingExpression(PaddingExpression node); + dynamic visitWidthExpression(WidthExpression node); } /// Base vistor class for the style sheet AST. @@ -126,96 +127,96 @@ class Visitor implements VisitorBase { } } - void visitTree(StyleSheet tree) => visitStyleSheet(tree); + dynamic visitTree(StyleSheet tree) => visitStyleSheet(tree); @override - void visitStyleSheet(StyleSheet ss) { + dynamic visitStyleSheet(StyleSheet ss) { _visitNodeList(ss.topLevels); } @override - void visitNoOp(NoOp node) {} + dynamic visitNoOp(NoOp node) {} @override - void visitTopLevelProduction(TopLevelProduction node) {} + dynamic visitTopLevelProduction(TopLevelProduction node) {} @override - void visitDirective(Directive node) {} + dynamic visitDirective(Directive node) {} @override - void visitCalcTerm(CalcTerm node) { + dynamic visitCalcTerm(CalcTerm node) { visitLiteralTerm(node); visitLiteralTerm(node.expr); } @override - void visitCssComment(CssComment node) {} + dynamic visitCssComment(CssComment node) {} @override - void visitCommentDefinition(CommentDefinition node) {} + dynamic visitCommentDefinition(CommentDefinition node) {} @override - void visitMediaExpression(MediaExpression node) { + dynamic visitMediaExpression(MediaExpression node) { visitExpressions(node.exprs); } @override - void visitMediaQuery(MediaQuery node) { + dynamic visitMediaQuery(MediaQuery node) { for (var mediaExpr in node.expressions) { visitMediaExpression(mediaExpr); } } @override - void visitDocumentDirective(DocumentDirective node) { + dynamic visitDocumentDirective(DocumentDirective node) { _visitNodeList(node.functions); _visitNodeList(node.groupRuleBody); } @override - void visitSupportsDirective(SupportsDirective node) { + dynamic visitSupportsDirective(SupportsDirective node) { node.condition.visit(this); _visitNodeList(node.groupRuleBody); } @override - void visitSupportsConditionInParens(SupportsConditionInParens node) { + dynamic visitSupportsConditionInParens(SupportsConditionInParens node) { node.condition.visit(this); } @override - void visitSupportsNegation(SupportsNegation node) { + dynamic visitSupportsNegation(SupportsNegation node) { node.condition.visit(this); } @override - void visitSupportsConjunction(SupportsConjunction node) { + dynamic visitSupportsConjunction(SupportsConjunction node) { _visitNodeList(node.conditions); } @override - void visitSupportsDisjunction(SupportsDisjunction node) { + dynamic visitSupportsDisjunction(SupportsDisjunction node) { _visitNodeList(node.conditions); } @override - void visitViewportDirective(ViewportDirective node) { + dynamic visitViewportDirective(ViewportDirective node) { node.declarations.visit(this); } @override - void visitMediaDirective(MediaDirective node) { + dynamic visitMediaDirective(MediaDirective node) { _visitNodeList(node.mediaQueries); _visitNodeList(node.rules); } @override - void visitHostDirective(HostDirective node) { + dynamic visitHostDirective(HostDirective node) { _visitNodeList(node.rules); } @override - void visitPageDirective(PageDirective node) { + dynamic visitPageDirective(PageDirective node) { for (var declGroup in node._declsMargin) { if (declGroup is MarginGroup) { visitMarginGroup(declGroup); @@ -226,60 +227,60 @@ class Visitor implements VisitorBase { } @override - void visitCharsetDirective(CharsetDirective node) {} + dynamic visitCharsetDirective(CharsetDirective node) {} @override - void visitImportDirective(ImportDirective node) { + dynamic visitImportDirective(ImportDirective node) { for (var mediaQuery in node.mediaQueries) { visitMediaQuery(mediaQuery); } } @override - void visitKeyFrameDirective(KeyFrameDirective node) { + dynamic visitKeyFrameDirective(KeyFrameDirective node) { visitIdentifier(node.name); _visitNodeList(node._blocks); } @override - void visitKeyFrameBlock(KeyFrameBlock node) { + dynamic visitKeyFrameBlock(KeyFrameBlock node) { visitExpressions(node._blockSelectors); visitDeclarationGroup(node._declarations); } @override - void visitFontFaceDirective(FontFaceDirective node) { + dynamic visitFontFaceDirective(FontFaceDirective node) { visitDeclarationGroup(node._declarations); } @override - void visitStyletDirective(StyletDirective node) { + dynamic visitStyletDirective(StyletDirective node) { _visitNodeList(node.rules); } @override - void visitNamespaceDirective(NamespaceDirective node) {} + dynamic visitNamespaceDirective(NamespaceDirective node) {} @override - void visitVarDefinitionDirective(VarDefinitionDirective node) { + dynamic visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); } @override - void visitMixinRulesetDirective(MixinRulesetDirective node) { + dynamic visitMixinRulesetDirective(MixinRulesetDirective node) { _visitNodeList(node.rulesets); } @override - void visitMixinDefinition(MixinDefinition node) {} + dynamic visitMixinDefinition(MixinDefinition node) {} @override - void visitMixinDeclarationDirective(MixinDeclarationDirective node) { + dynamic visitMixinDeclarationDirective(MixinDeclarationDirective node) { visitDeclarationGroup(node.declarations); } @override - void visitIncludeDirective(IncludeDirective node) { + dynamic visitIncludeDirective(IncludeDirective node) { for (var index = 0; index < node.args.length; index++) { var param = node.args[index]; _visitNodeList(param); @@ -287,66 +288,66 @@ class Visitor implements VisitorBase { } @override - void visitContentDirective(ContentDirective node) { + dynamic visitContentDirective(ContentDirective node) { // TODO(terry): TBD } @override - void visitRuleSet(RuleSet node) { + dynamic visitRuleSet(RuleSet node) { visitSelectorGroup(node._selectorGroup); visitDeclarationGroup(node._declarationGroup); } @override - void visitDeclarationGroup(DeclarationGroup node) { + dynamic visitDeclarationGroup(DeclarationGroup node) { _visitNodeList(node.declarations); } @override - void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); + dynamic visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); @override - void visitDeclaration(Declaration node) { + dynamic visitDeclaration(Declaration node) { visitIdentifier(node._property); if (node._expression != null) node._expression.visit(this); } @override - void visitVarDefinition(VarDefinition node) { + dynamic visitVarDefinition(VarDefinition node) { visitIdentifier(node._property); if (node._expression != null) node._expression.visit(this); } @override - void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { + dynamic visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { visitIncludeDirective(node.include); } @override - void visitExtendDeclaration(ExtendDeclaration node) { + dynamic visitExtendDeclaration(ExtendDeclaration node) { _visitNodeList(node.selectors); } @override - void visitSelectorGroup(SelectorGroup node) { + dynamic visitSelectorGroup(SelectorGroup node) { _visitNodeList(node.selectors); } @override - void visitSelector(Selector node) { + dynamic visitSelector(Selector node) { _visitNodeList(node.simpleSelectorSequences); } @override - void visitSimpleSelectorSequence(SimpleSelectorSequence node) { + dynamic visitSimpleSelectorSequence(SimpleSelectorSequence node) { node.simpleSelector.visit(this); } @override - void visitSimpleSelector(SimpleSelector node) => node._name.visit(this); + dynamic visitSimpleSelector(SimpleSelector node) => node._name.visit(this); @override - void visitNamespaceSelector(NamespaceSelector node) { + dynamic visitNamespaceSelector(NamespaceSelector node) { if (node._namespace != null) node._namespace.visit(this); if (node.nameAsSimpleSelector != null) { node.nameAsSimpleSelector.visit(this); @@ -354,232 +355,234 @@ class Visitor implements VisitorBase { } @override - void visitElementSelector(ElementSelector node) => visitSimpleSelector(node); + dynamic visitElementSelector(ElementSelector node) => + visitSimpleSelector(node); @override - void visitAttributeSelector(AttributeSelector node) { + dynamic visitAttributeSelector(AttributeSelector node) { visitSimpleSelector(node); } @override - void visitIdSelector(IdSelector node) => visitSimpleSelector(node); + dynamic visitIdSelector(IdSelector node) => visitSimpleSelector(node); @override - void visitClassSelector(ClassSelector node) => visitSimpleSelector(node); + dynamic visitClassSelector(ClassSelector node) => visitSimpleSelector(node); @override - void visitPseudoClassSelector(PseudoClassSelector node) => + dynamic visitPseudoClassSelector(PseudoClassSelector node) => visitSimpleSelector(node); @override - void visitPseudoElementSelector(PseudoElementSelector node) => + dynamic visitPseudoElementSelector(PseudoElementSelector node) => visitSimpleSelector(node); @override - void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) => + dynamic visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) => visitSimpleSelector(node); @override - void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) => + dynamic visitPseudoElementFunctionSelector( + PseudoElementFunctionSelector node) => visitSimpleSelector(node); @override - void visitNegationSelector(NegationSelector node) => + dynamic visitNegationSelector(NegationSelector node) => visitSimpleSelector(node); @override - void visitSelectorExpression(SelectorExpression node) { + dynamic visitSelectorExpression(SelectorExpression node) { _visitNodeList(node.expressions); } @override - void visitUnicodeRangeTerm(UnicodeRangeTerm node) {} + dynamic visitUnicodeRangeTerm(UnicodeRangeTerm node) {} @override - void visitLiteralTerm(LiteralTerm node) {} + dynamic visitLiteralTerm(LiteralTerm node) {} @override - void visitHexColorTerm(HexColorTerm node) {} + dynamic visitHexColorTerm(HexColorTerm node) {} @override - void visitNumberTerm(NumberTerm node) {} + dynamic visitNumberTerm(NumberTerm node) {} @override - void visitUnitTerm(UnitTerm node) {} + dynamic visitUnitTerm(UnitTerm node) {} @override - void visitLengthTerm(LengthTerm node) { + dynamic visitLengthTerm(LengthTerm node) { visitUnitTerm(node); } @override - void visitPercentageTerm(PercentageTerm node) { + dynamic visitPercentageTerm(PercentageTerm node) { visitLiteralTerm(node); } @override - void visitEmTerm(EmTerm node) { + dynamic visitEmTerm(EmTerm node) { visitLiteralTerm(node); } @override - void visitExTerm(ExTerm node) { + dynamic visitExTerm(ExTerm node) { visitLiteralTerm(node); } @override - void visitAngleTerm(AngleTerm node) { + dynamic visitAngleTerm(AngleTerm node) { visitUnitTerm(node); } @override - void visitTimeTerm(TimeTerm node) { + dynamic visitTimeTerm(TimeTerm node) { visitUnitTerm(node); } @override - void visitFreqTerm(FreqTerm node) { + dynamic visitFreqTerm(FreqTerm node) { visitUnitTerm(node); } @override - void visitFractionTerm(FractionTerm node) { + dynamic visitFractionTerm(FractionTerm node) { visitLiteralTerm(node); } @override - void visitUriTerm(UriTerm node) { + dynamic visitUriTerm(UriTerm node) { visitLiteralTerm(node); } @override - void visitResolutionTerm(ResolutionTerm node) { + dynamic visitResolutionTerm(ResolutionTerm node) { visitUnitTerm(node); } @override - void visitChTerm(ChTerm node) { + dynamic visitChTerm(ChTerm node) { visitUnitTerm(node); } @override - void visitRemTerm(RemTerm node) { + dynamic visitRemTerm(RemTerm node) { visitUnitTerm(node); } @override - void visitViewportTerm(ViewportTerm node) { + dynamic visitViewportTerm(ViewportTerm node) { visitUnitTerm(node); } @override - void visitFunctionTerm(FunctionTerm node) { + dynamic visitFunctionTerm(FunctionTerm node) { visitLiteralTerm(node); visitExpressions(node._params); } @override - void visitGroupTerm(GroupTerm node) { + dynamic visitGroupTerm(GroupTerm node) { for (var term in node._terms) { term.visit(this); } } @override - void visitItemTerm(ItemTerm node) { + dynamic visitItemTerm(ItemTerm node) { visitNumberTerm(node); } @override - void visitIE8Term(IE8Term node) {} + dynamic visitIE8Term(IE8Term node) {} @override - void visitOperatorSlash(OperatorSlash node) {} + dynamic visitOperatorSlash(OperatorSlash node) {} @override - void visitOperatorComma(OperatorComma node) {} + dynamic visitOperatorComma(OperatorComma node) {} @override - void visitOperatorPlus(OperatorPlus node) {} + dynamic visitOperatorPlus(OperatorPlus node) {} @override - void visitOperatorMinus(OperatorMinus node) {} + dynamic visitOperatorMinus(OperatorMinus node) {} @override - void visitVarUsage(VarUsage node) { + dynamic visitVarUsage(VarUsage node) { _visitNodeList(node.defaultValues); } @override - void visitExpressions(Expressions node) { + dynamic visitExpressions(Expressions node) { _visitNodeList(node.expressions); } @override - void visitBinaryExpression(BinaryExpression node) { + dynamic visitBinaryExpression(BinaryExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - void visitUnaryExpression(UnaryExpression node) { + dynamic visitUnaryExpression(UnaryExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - void visitIdentifier(Identifier node) {} + dynamic visitIdentifier(Identifier node) {} @override - void visitWildcard(Wildcard node) {} + dynamic visitWildcard(Wildcard node) {} @override - void visitThisOperator(ThisOperator node) {} + dynamic visitThisOperator(ThisOperator node) {} @override - void visitNegation(Negation node) {} + dynamic visitNegation(Negation node) {} @override - void visitDartStyleExpression(DartStyleExpression node) {} + dynamic visitDartStyleExpression(DartStyleExpression node) {} @override - void visitFontExpression(FontExpression node) { + dynamic visitFontExpression(FontExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - void visitBoxExpression(BoxExpression node) { + dynamic visitBoxExpression(BoxExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - void visitMarginExpression(MarginExpression node) { + dynamic visitMarginExpression(MarginExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - void visitBorderExpression(BorderExpression node) { + dynamic visitBorderExpression(BorderExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - void visitHeightExpression(HeightExpression node) { + dynamic visitHeightExpression(HeightExpression node) { // TODO(terry): TB throw UnimplementedError(); } @override - void visitPaddingExpression(PaddingExpression node) { + dynamic visitPaddingExpression(PaddingExpression node) { // TODO(terry): TBD throw UnimplementedError(); } @override - void visitWidthExpression(WidthExpression node) { + dynamic visitWidthExpression(WidthExpression node) { // TODO(terry): TBD throw UnimplementedError(); } From 8d8f6b8eb99f58943dff1f2e591f2a9e3164b2cf Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Thu, 2 Jan 2020 17:03:18 -0800 Subject: [PATCH 150/245] Enforce and fix prefer_typing_uninitialized_variables (dart-lang/csslib#100) --- pkgs/csslib/analysis_options.yaml | 1 + pkgs/csslib/lib/parser.dart | 22 +++++++++++----------- pkgs/csslib/lib/src/analyzer.dart | 6 +++--- pkgs/csslib/lib/src/polyfill.dart | 2 +- pkgs/csslib/lib/src/token.dart | 2 +- pkgs/csslib/lib/src/tokenizer_base.dart | 2 +- pkgs/csslib/lib/src/tree.dart | 8 ++++---- 7 files changed, 22 insertions(+), 21 deletions(-) diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index 9d142917a..a20ed4930 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -4,6 +4,7 @@ linter: rules: - prefer_equal_for_default_values - prefer_generic_function_type_aliases + - prefer_typing_uninitialized_variables - slash_for_doc_comments - unnecessary_const - unnecessary_new diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 1f3d185a0..ca1f465bb 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -549,7 +549,7 @@ class _Parser { _next(); // Page name - var name; + Identifier name; if (_peekIdentifier()) { name = identifier(); } @@ -666,7 +666,7 @@ class _Parser { // '}' _next(); - var name; + dynamic name; if (_peekIdentifier()) { name = identifier(); } @@ -897,7 +897,7 @@ class _Parser { } } else if (mixinParameter && _peekToken.kind == TokenKind.VAR_DEFINITION) { _next(); - var definedName; + Identifier definedName; if (_peekIdentifier()) definedName = identifier(); Expressions exprs; @@ -917,7 +917,7 @@ class _Parser { // @include IDENT [(args,...)]; _next(); - var name; + Identifier name; if (_peekIdentifier()) { name = identifier(); } @@ -931,7 +931,7 @@ class _Parser { // the first has 3 terms and the second has 1 term. if (_maybeEat(TokenKind.LPAREN)) { var terms = []; - var expr; + dynamic expr; var keepGoing = true; while (keepGoing && (expr = processTerm()) != null) { // VarUsage is returns as a list @@ -960,7 +960,7 @@ class _Parser { _next(); // '@-moz-document' var functions = []; do { - var function; + LiteralTerm function; // Consume function token: IDENT '(' var ident = identifier(); @@ -1431,7 +1431,7 @@ class _Parser { // than the error message for element. Should consolidate the // code. // TODO(terry): Need to handle attribute namespace too. - var first; + dynamic first; var start = _peekToken.span; switch (_peek()) { case TokenKind.ASTERISK: @@ -1632,7 +1632,7 @@ class _Parser { var expressions = []; Token termToken; - var value; + dynamic value; var keepParsing = true; while (keepParsing) { @@ -1719,7 +1719,7 @@ class _Parser { op = TokenKind.NO_MATCH; } - var value; + dynamic value; if (op != TokenKind.NO_MATCH) { // Operator hit so we require a value too. if (_peekIdentifier()) { @@ -2158,7 +2158,7 @@ class _Parser { var expressions = Expressions(_makeSpan(start)); var keepGoing = true; - var expr; + dynamic expr; while (keepGoing && (expr = processTerm(ieFilter)) != null) { Expression op; @@ -2242,7 +2242,7 @@ class _Parser { [bool ieFilter = false]) { var start = _peekToken.span; Token t; // token for term's value - var value; // value of term (numeric values) + dynamic value; // value of term (numeric values) var unary = ''; switch (_peek()) { diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index e9fd7c981..2f6d449a9 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -547,7 +547,7 @@ class _TopLevelIncludeReplacer extends Visitor { /// Utility function to match an include to a list of either Declarations or /// RuleSets, depending on type of mixin (ruleset or declaration). The include /// can be an include in a declaration or an include directive (top-level). -int _findInclude(List list, var node) { +int _findInclude(List list, TreeNode node) { IncludeDirective matchNode = (node is IncludeMixinAtDeclaration) ? node.include : node; @@ -844,13 +844,13 @@ class DeclarationIncludes extends Visitor { /// @include as a top-level with ruleset(s). class _IncludeReplacer extends Visitor { - final _include; + final TreeNode _include; final List _newDeclarations; /// Look for the [ruleSet] inside of a @media directive; if found then replace /// with the [newRules]. static void replace( - StyleSheet ss, var include, List newDeclarations) { + StyleSheet ss, TreeNode include, List newDeclarations) { var visitor = _IncludeReplacer(include, newDeclarations); visitor.visitStyleSheet(ss); } diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index 2582bae18..0c2ef04b3 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -174,7 +174,7 @@ class _VarDefAndUsage extends Visitor { var result = []; var varDef = _knownVarDefs[usage.name]; - var expressions; + List expressions; if (varDef == null) { // VarDefinition not found try the defaultValues. expressions = usage.defaultValues; diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index 7c5ef6568..444b8ee54 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -41,7 +41,7 @@ class Token { /// A token containing a parsed literal value. class LiteralToken extends Token { - var value; + dynamic value; LiteralToken(int kind, FileSpan span, this.value) : super(kind, span); } diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index a648e62a4..5f221120a 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -261,7 +261,7 @@ abstract class TokenizerBase { } Token _makeRawStringToken(bool isMultiline) { - var s; + String s; if (isMultiline) { // Skip initial newline in multiline strings var start = _startIndex + 4; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index b050442b7..8a17b5349 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -171,7 +171,7 @@ class SimpleSelectorSequence extends TreeNode { // All other selectors (element, #id, .class, attribute, pseudo, negation, // namespace, *) are derived from this selector. abstract class SimpleSelector extends TreeNode { - final _name; // Wildcard, ThisOperator, Identifier, Negation, others? + final dynamic _name; // Wildcard, ThisOperator, Identifier, Negation, others? SimpleSelector(this._name, SourceSpan span) : super(span); @@ -200,7 +200,7 @@ class ElementSelector extends SimpleSelector { // namespace|element class NamespaceSelector extends SimpleSelector { - final _namespace; // null, Wildcard or Identifier + final dynamic _namespace; // null, Wildcard or Identifier NamespaceSelector(this._namespace, var name, SourceSpan span) : super(name, span); @@ -1689,7 +1689,7 @@ class BorderExpression extends BoxExpression { } class HeightExpression extends DartStyleExpression { - final height; + final dynamic height; HeightExpression(SourceSpan span, this.height) : super(DartStyleExpression.heightStyle, span); @@ -1712,7 +1712,7 @@ class HeightExpression extends DartStyleExpression { } class WidthExpression extends DartStyleExpression { - final width; + final dynamic width; WidthExpression(SourceSpan span, this.width) : super(DartStyleExpression.widthStyle, span); From 436a79dd23b962d52ef508907bb0df0ec35605e4 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 26 Mar 2020 12:30:38 -0700 Subject: [PATCH 151/245] Travis: merge test tasks, use Chrome instead of firefox (dart-lang/csslib#103) Chrome seems a bit less flaky --- pkgs/csslib/.travis.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml index df7d18646..07d647d3d 100644 --- a/pkgs/csslib/.travis.yml +++ b/pkgs/csslib/.travis.yml @@ -5,15 +5,16 @@ dart: - dev dart_task: - - test: --platform vm - - test: --platform firefox -j 1 + - test: --platform vm,chrome matrix: include: - dart: dev - dartanalyzer: --fatal-infos --fatal-warnings . + dart_task: + dartanalyzer: --fatal-infos --fatal-warnings . - dart: 2.2.0 - dartanalyzer: --fatal-warnings . + dart_task: + dartanalyzer: --fatal-warnings . - dart: dev dart_task: dartfmt From 84dd126a1d094187b98d543d2b30e7346ff6f2f1 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 24 Jul 2020 14:56:33 -0700 Subject: [PATCH 152/245] Support parsing identifiers with escape codes in them The output of `CssPrinter` will now also retain escape codes in identifiers. This ensures they remain valid identifiers, as the escaped values may not parse as valid identifiers. The parser will also no longer accept an ID or class selector with space between the first token (`#` or `.` respectively) and the identifier. The parser will now fail immediately on these selector errors instead of attempting to recover. Recovering in a robust manner is difficult given that this parser immediately attempts to parse at the selector granularity, rather than first parsing the style sheet into rules as described [here][parse-rule]. [parse-rule]: https://www.w3.org/TR/css-syntax-3/#consume-a-qualified-rule Fixes https://github.com/dart-lang/csslib/issues/58. --- pkgs/csslib/lib/parser.dart | 29 +++++++------------------ pkgs/csslib/lib/src/tree.dart | 9 ++++++-- pkgs/csslib/test/error_test.dart | 18 ++++----------- pkgs/csslib/test/escape_codes_test.dart | 28 ++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 37 deletions(-) create mode 100644 pkgs/csslib/test/escape_codes_test.dart diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index ca1f465bb..099240d9a 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1307,12 +1307,14 @@ class _Parser { var selectors = []; var start = _peekToken.span; + tokenizer.inSelector = true; do { var selector = processSelector(); if (selector != null) { selectors.add(selector); } } while (_maybeEat(TokenKind.COMMA)); + tokenizer.inSelector = false; if (selectors.isNotEmpty) { return SelectorGroup(selectors, _makeSpan(start)); @@ -1501,35 +1503,20 @@ class _Parser { case TokenKind.HASH: _eat(TokenKind.HASH); - var hasWhiteSpace = false; if (_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) { - _warning('Not a valid ID selector expected #id', _makeSpan(start)); - hasWhiteSpace = true; - } - if (_peekIdentifier()) { - var id = identifier(); - if (hasWhiteSpace) { - // Generate bad selector id (normalized). - id.name = ' ${id.name}'; - } - return IdSelector(id, _makeSpan(start)); + _error('Not a valid ID selector expected #id', _makeSpan(start)); + return null; } - return null; + return IdSelector(identifier(), _makeSpan(start)); case TokenKind.DOT: _eat(TokenKind.DOT); - var hasWhiteSpace = false; if (_anyWhiteSpaceBeforePeekToken(TokenKind.DOT)) { - _warning('Not a valid class selector expected .className', + _error('Not a valid class selector expected .className', _makeSpan(start)); - hasWhiteSpace = true; - } - var id = identifier(); - if (hasWhiteSpace) { - // Generate bad selector class (normalized). - id.name = ' ${id.name}'; + return null; } - return ClassSelector(id, _makeSpan(start)); + return ClassSelector(identifier(), _makeSpan(start)); case TokenKind.COLON: // :pseudo-class ::pseudo-element return processPseudoSelector(start); diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 8a17b5349..2961b6fee 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -20,7 +20,12 @@ class Identifier extends TreeNode { dynamic visit(VisitorBase visitor) => visitor.visitIdentifier(this); @override - String toString() => name; + String toString() { + // Try to use the identifier's original lexeme to preserve any escape codes + // as authored. The name, which may include escaped values, may no longer be + // a valid identifier. + return span?.text ?? name; + } } class Wildcard extends TreeNode { @@ -274,7 +279,7 @@ class AttributeSelector extends SimpleSelector { String valueToString() { if (value != null) { if (value is Identifier) { - return value.name; + return value.toString(); } else { return '"$value"'; } diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index d24217683..5822c4c13 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -134,37 +134,27 @@ void testBadSelectors() { // Invalid id selector. var input = '# foo { color: #ff00ff; }'; - var stylesheet = parseCss(input, errors: errors); + parseCss(input, errors: errors); - expect(errors.isEmpty, false); + expect(errors, isNotEmpty); expect(errors[0].toString(), r''' error on line 1, column 1: Not a valid ID selector expected #id ╷ 1 │ # foo { color: #ff00ff; } │ ^ ╵'''); - expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' -# foo { - color: #f0f; -}'''); // Invalid class selector. input = '. foo { color: #ff00ff; }'; - stylesheet = parseCss(input, errors: errors..clear()); + parseCss(input, errors: errors..clear()); - expect(errors.isEmpty, false); + expect(errors, isNotEmpty); expect(errors[0].toString(), r''' error on line 1, column 1: Not a valid class selector expected .className ╷ 1 │ . foo { color: #ff00ff; } │ ^ ╵'''); - expect(stylesheet != null, true); - expect(prettyPrint(stylesheet), r''' -. foo { - color: #f0f; -}'''); } /// Test for bad hex values. diff --git a/pkgs/csslib/test/escape_codes_test.dart b/pkgs/csslib/test/escape_codes_test.dart new file mode 100644 index 000000000..af66469bb --- /dev/null +++ b/pkgs/csslib/test/escape_codes_test.dart @@ -0,0 +1,28 @@ +import 'package:csslib/parser.dart'; +import 'package:test/test.dart'; + +import 'testing.dart'; + +void main() { + final errors = []; + + tearDown(() { + errors.clear(); + }); + + group('handles escape codes', () { + group('in an identifier', () { + test('with trailing space', () { + final selectorAst = selector(r'.\35 00px', errors: errors); + expect(errors, isEmpty); + expect(compactOuptut(selectorAst), r'.\35 00px'); + }); + + test('in an attribute selector value', () { + final selectorAst = selector(r'[elevation=\31]', errors: errors); + expect(errors, isEmpty); + expect(compactOuptut(selectorAst), r'[elevation=\31]'); + }); + }); + }); +} From c362cc43043d3b2bedf25e7a696aa085bf300e2f Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Fri, 24 Jul 2020 14:58:35 -0700 Subject: [PATCH 153/245] Fix typo --- pkgs/csslib/test/declaration_test.dart | 4 ++-- pkgs/csslib/test/escape_codes_test.dart | 4 ++-- pkgs/csslib/test/selector_test.dart | 22 +++++++++++----------- pkgs/csslib/test/testing.dart | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 709aa7b34..61f04f5f5 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -889,7 +889,7 @@ div { expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(stylesheet), generated); + expect(compactOutput(stylesheet), generated); // Check namespace directive compactly emitted. final input2 = '@namespace a url(http://www.example.org/a);'; @@ -899,7 +899,7 @@ div { expect(stylesheet2 != null, true); expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(stylesheet2), generated2); + expect(compactOutput(stylesheet2), generated2); } void testNotSelectors() { diff --git a/pkgs/csslib/test/escape_codes_test.dart b/pkgs/csslib/test/escape_codes_test.dart index af66469bb..9ed749619 100644 --- a/pkgs/csslib/test/escape_codes_test.dart +++ b/pkgs/csslib/test/escape_codes_test.dart @@ -15,13 +15,13 @@ void main() { test('with trailing space', () { final selectorAst = selector(r'.\35 00px', errors: errors); expect(errors, isEmpty); - expect(compactOuptut(selectorAst), r'.\35 00px'); + expect(compactOutput(selectorAst), r'.\35 00px'); }); test('in an attribute selector value', () { final selectorAst = selector(r'[elevation=\31]', errors: errors); expect(errors, isEmpty); - expect(compactOuptut(selectorAst), r'[elevation=\31]'); + expect(compactOutput(selectorAst), r'[elevation=\31]'); }); }); }); diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index df52be6a0..ed01a354e 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -14,50 +14,50 @@ void testSelectorSuccesses() { var errors = []; var selectorAst = selector('#div .foo', errors: errors); expect(errors.isEmpty, true, reason: errors.toString()); - expect('#div .foo', compactOuptut(selectorAst)); + expect('#div .foo', compactOutput(selectorAst)); // Valid selectors for class names. selectorAst = selector('.foo', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect('.foo', compactOuptut(selectorAst)); + expect('.foo', compactOutput(selectorAst)); selectorAst = selector('.foobar .xyzzy', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect('.foobar .xyzzy', compactOuptut(selectorAst)); + expect('.foobar .xyzzy', compactOutput(selectorAst)); selectorAst = selector('.foobar .a-story .xyzzy', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect('.foobar .a-story .xyzzy', compactOuptut(selectorAst)); + expect('.foobar .a-story .xyzzy', compactOutput(selectorAst)); selectorAst = selector('.foobar .xyzzy .a-story .b-story', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect('.foobar .xyzzy .a-story .b-story', compactOuptut(selectorAst)); + expect('.foobar .xyzzy .a-story .b-story', compactOutput(selectorAst)); // Valid selectors for element IDs. selectorAst = selector('#id1', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect('#id1', compactOuptut(selectorAst)); + expect('#id1', compactOutput(selectorAst)); selectorAst = selector('#id-number-3', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect('#id-number-3', compactOuptut(selectorAst)); + expect('#id-number-3', compactOutput(selectorAst)); selectorAst = selector('#_privateId', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect('#_privateId', compactOuptut(selectorAst)); + expect('#_privateId', compactOutput(selectorAst)); selectorAst = selector(':host', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(selectorAst), ':host'); + expect(compactOutput(selectorAst), ':host'); selectorAst = selector(':host(.foo)', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(selectorAst), ':host(.foo)'); + expect(compactOutput(selectorAst), ':host(.foo)'); selectorAst = selector(':host-context(.foo)', errors: errors..clear()); expect(errors.isEmpty, true, reason: errors.toString()); - expect(compactOuptut(selectorAst), ':host-context(.foo)'); + expect(compactOutput(selectorAst), ':host-context(.foo)'); } // TODO(terry): Move this failure case to a failure_test.dart when the analyzer diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 471697e19..5c8cc55f2 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -67,7 +67,7 @@ String prettyPrint(StyleSheet ss) { /// Helper function to emit compact (non-pretty printed) CSS for suite test /// comparsions. Spaces, new lines, etc. are reduced for easier comparsions of /// expected suite test results. -String compactOuptut(StyleSheet ss) { +String compactOutput(StyleSheet ss) { walkTree(ss); return (_emitCss..visitTree(ss, pretty: false)).toString(); } From 87d53a33b05af89b9d91fd3f8641cd6dedbc63cc Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Mon, 27 Jul 2020 10:47:12 -0700 Subject: [PATCH 154/245] Update changelog and version for release --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 783393d60..e02e0ff3c 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.16.2 + +- Added support for escape codes in identifiers. + ## 0.16.1 - Fixed a crash caused by parsing certain calc() expressions and variables names that contain numbers. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 207348ddd..7af656620 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.16.2-dev +version: 0.16.2 description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From b20251d3659a73b264e23d47865962eeb43c787b Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Mon, 17 Aug 2020 17:02:23 -0700 Subject: [PATCH 155/245] Refactor some private final files with a getter (dart-lang/csslib#108) When a field is `final` it is not necessary to make it private with a forwarding getter. --- pkgs/csslib/CHANGELOG.md | 2 ++ pkgs/csslib/lib/src/css_printer.dart | 8 +++---- pkgs/csslib/lib/src/tree.dart | 31 +++++++++++---------------- pkgs/csslib/lib/src/tree_printer.dart | 4 ++-- pkgs/csslib/lib/visitor.dart | 8 +++---- pkgs/csslib/pubspec.yaml | 2 +- 6 files changed, 26 insertions(+), 29 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index e02e0ff3c..a43bf56da 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,5 @@ +## 0.16.3-dev + ## 0.16.2 - Added support for escape codes in identifiers. diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 039929653..e7298dcfa 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -303,9 +303,9 @@ class CssPrinter extends Visitor { @override void visitRuleSet(RuleSet node) { emit('$_newLine'); - node._selectorGroup.visit(this); + node.selectorGroup.visit(this); emit('$_sp{$_newLine'); - node._declarationGroup.visit(this); + node.declarationGroup.visit(this); emit('}'); } @@ -340,7 +340,7 @@ class CssPrinter extends Visitor { @override void visitDeclaration(Declaration node) { emit('${node.property}:$_sp'); - node._expression.visit(this); + node.expression.visit(this); if (node.important) { emit('$_sp!important'); } @@ -349,7 +349,7 @@ class CssPrinter extends Visitor { @override void visitVarDefinition(VarDefinition node) { emit('var-${node.definedName}: '); - node._expression.visit(this); + node.expression.visit(this); } @override diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 2961b6fee..d1c330f31 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -356,18 +356,17 @@ class PseudoElementSelector extends SimpleSelector { // :pseudoClassFunction(argument) class PseudoClassFunctionSelector extends PseudoClassSelector { - final TreeNode _argument; // Selector, SelectorExpression + final TreeNode argument; // Selector, SelectorExpression - PseudoClassFunctionSelector(Identifier name, this._argument, SourceSpan span) + PseudoClassFunctionSelector(Identifier name, this.argument, SourceSpan span) : super(name, span); @override PseudoClassFunctionSelector clone() => - PseudoClassFunctionSelector(_name, _argument, span); + PseudoClassFunctionSelector(_name, argument, span); - TreeNode get argument => _argument; - Selector get selector => _argument as Selector; - SelectorExpression get expression => _argument as SelectorExpression; + Selector get selector => argument as Selector; + SelectorExpression get expression => argument as SelectorExpression; @override dynamic visit(VisitorBase visitor) => @@ -461,19 +460,16 @@ class TopLevelProduction extends TreeNode { } class RuleSet extends TopLevelProduction { - final SelectorGroup _selectorGroup; - final DeclarationGroup _declarationGroup; + final SelectorGroup selectorGroup; + final DeclarationGroup declarationGroup; - RuleSet(this._selectorGroup, this._declarationGroup, SourceSpan span) + RuleSet(this.selectorGroup, this.declarationGroup, SourceSpan span) : super(span); - SelectorGroup get selectorGroup => _selectorGroup; - DeclarationGroup get declarationGroup => _declarationGroup; - @override RuleSet clone() { - var cloneSelectorGroup = _selectorGroup.clone(); - var cloneDeclarationGroup = _declarationGroup.clone(); + var cloneSelectorGroup = selectorGroup.clone(); + var cloneDeclarationGroup = declarationGroup.clone(); return RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); } @@ -1013,7 +1009,7 @@ class ContentDirective extends Directive { class Declaration extends TreeNode { final Identifier _property; - final Expression _expression; + final Expression expression; /// Style exposed to Dart. DartStyleExpression dartStyle; @@ -1028,19 +1024,18 @@ class Declaration extends TreeNode { /// since an ident can start with underscore (e.g., `_background: red;`) final bool isIE7; - Declaration(this._property, this._expression, this.dartStyle, SourceSpan span, + Declaration(this._property, this.expression, this.dartStyle, SourceSpan span, {this.important = false, bool ie7 = false}) : isIE7 = ie7, super(span); String get property => isIE7 ? '*${_property.name}' : _property.name; - Expression get expression => _expression; bool get hasDartStyle => dartStyle != null; @override Declaration clone() => - Declaration(_property.clone(), _expression.clone(), dartStyle, span, + Declaration(_property.clone(), expression.clone(), dartStyle, span, important: important); @override diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 8aa585289..b53f21460 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -310,7 +310,7 @@ class _TreePrinter extends Visitor { if (node.isIE7) output.write('IE7 property'); output.write('property'); super.visitDeclaration(node); - output.writeNode('expression', node._expression); + output.writeNode('expression', node.expression); if (node.important) { output.writeValue('!important', 'true'); } @@ -323,7 +323,7 @@ class _TreePrinter extends Visitor { output.depth++; output.write('defintion'); super.visitVarDefinition(node); - output.writeNode('expression', node._expression); + output.writeNode('expression', node.expression); output.depth--; } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 9fff5684f..d88081bf9 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -294,8 +294,8 @@ class Visitor implements VisitorBase { @override dynamic visitRuleSet(RuleSet node) { - visitSelectorGroup(node._selectorGroup); - visitDeclarationGroup(node._declarationGroup); + visitSelectorGroup(node.selectorGroup); + visitDeclarationGroup(node.declarationGroup); } @override @@ -309,13 +309,13 @@ class Visitor implements VisitorBase { @override dynamic visitDeclaration(Declaration node) { visitIdentifier(node._property); - if (node._expression != null) node._expression.visit(this); + if (node.expression != null) node.expression.visit(this); } @override dynamic visitVarDefinition(VarDefinition node) { visitIdentifier(node._property); - if (node._expression != null) node._expression.visit(this); + if (node.expression != null) node.expression.visit(this); } @override diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 7af656620..62773b9cf 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.16.2 +version: 0.16.3-dev description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From 950b92b579de00663f476dbca340ce6aceddb43a Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Thu, 27 Aug 2020 08:44:09 -0700 Subject: [PATCH 156/245] Correct a misused putIfAbsent call (dart-lang/csslib#109) There is no need to assign within the callback for a `putIfAbsent` default. Refactor to the most idiomatic version today which is to use `??=` (since we don't ever assign a null value so we don't care about the distinction between a missing key and a key assigned to null) and return the value directly rather than putting it in the Map and then pulling it back out. --- pkgs/csslib/lib/src/analyzer.dart | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 2f6d449a9..7ed553fc8 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -716,11 +716,8 @@ class DeclarationIncludes extends Visitor { bool _allIncludes(rulesets) => rulesets.every((rule) => rule is IncludeDirective || rule is NoOp); - CallMixin _createCallDeclMixin(MixinDefinition mixinDef) { - callMap.putIfAbsent(mixinDef.name, - () => callMap[mixinDef.name] = CallMixin(mixinDef, varDefs)); - return callMap[mixinDef.name]; - } + CallMixin _createCallDeclMixin(MixinDefinition mixinDef) => + callMap[mixinDef.name] ??= CallMixin(mixinDef, varDefs); @override void visitStyleSheet(StyleSheet ss) { From 8c30da2c404600ab44b535a0c7789169dea32100 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Fri, 28 Aug 2020 08:39:52 -0700 Subject: [PATCH 157/245] Migrate to null safety (dart-lang/csslib#110) - *Breaking* The `Font.merge` and `BoxEdge.merge` factory constructors are now static methods since a factory constructor can't return null, but that was the entire point of these constructors. - Add nullable return types on methods that have a branch returning `null`. - Add a lot of `?` on parameters that can't provably be non-null. - Add a lot of `!`. - Add overrides of `TreeNode.clone` to tighten the return type in a few places and allow some skipped explicit casts. - Remove some dead code on conditional branches that never would have been followed, even before the migration, but weren't obvious statically. - Add explicit casts. --- pkgs/csslib/CHANGELOG.md | 7 +- pkgs/csslib/example/call_parser.dart | 2 +- pkgs/csslib/lib/parser.dart | 245 ++++++------ pkgs/csslib/lib/src/analyzer.dart | 102 ++--- pkgs/csslib/lib/src/css_printer.dart | 22 +- pkgs/csslib/lib/src/messages.dart | 12 +- pkgs/csslib/lib/src/polyfill.dart | 18 +- pkgs/csslib/lib/src/preprocessor_options.dart | 2 +- pkgs/csslib/lib/src/property.dart | 111 +++--- pkgs/csslib/lib/src/token.dart | 2 +- pkgs/csslib/lib/src/token_kind.dart | 13 +- pkgs/csslib/lib/src/tokenizer.dart | 5 +- pkgs/csslib/lib/src/tokenizer_base.dart | 4 +- pkgs/csslib/lib/src/tree.dart | 366 ++++++++++-------- pkgs/csslib/lib/src/tree_base.dart | 20 +- pkgs/csslib/lib/src/tree_printer.dart | 2 +- pkgs/csslib/lib/src/validate.dart | 2 +- pkgs/csslib/lib/visitor.dart | 18 +- pkgs/csslib/pubspec.yaml | 14 +- pkgs/csslib/test/big_1_test.dart | 1 - pkgs/csslib/test/compiler_test.dart | 102 ++--- pkgs/csslib/test/declaration_test.dart | 75 ++-- pkgs/csslib/test/error_test.dart | 53 +-- pkgs/csslib/test/extend_test.dart | 1 - pkgs/csslib/test/mixin_test.dart | 60 ++- pkgs/csslib/test/nested_test.dart | 1 - pkgs/csslib/test/samples_test.dart | 2 +- pkgs/csslib/test/testing.dart | 10 +- pkgs/csslib/test/var_test.dart | 13 - pkgs/csslib/test/visitor_test.dart | 3 - 30 files changed, 617 insertions(+), 671 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index a43bf56da..c4c3b8bdf 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,11 +1,14 @@ -## 0.16.3-dev +## 0.17.0-nullsafety-dev + +- `Font.merge` and `BoxEdge.merge` are now static methods instead of factory + constructors. ## 0.16.2 - Added support for escape codes in identifiers. ## 0.16.1 - + - Fixed a crash caused by parsing certain calc() expressions and variables names that contain numbers. ## 0.16.0 diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index 60adf6139..1f4efe804 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -14,7 +14,7 @@ const _default = css.PreprocessorOptions( /// CSS will allow any property/value pairs regardless of validity; all of our /// tests (by default) will ensure that the CSS is really valid. StyleSheet parseCss(String cssInput, - {List errors, css.PreprocessorOptions opts}) { + {List? errors, css.PreprocessorOptions? opts}) { return css.parse(cssInput, errors: errors, options: opts ?? _default); } diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 099240d9a..5b3164dc5 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -30,14 +30,14 @@ enum ClauseType { /// Used for parser lookup ahead (used for nested selectors Less support). class ParserState extends TokenizerState { final Token peekToken; - final Token previousToken; + final Token? previousToken; ParserState(this.peekToken, this.previousToken, Tokenizer tokenizer) : super(tokenizer); } // TODO(jmesserly): this should not be global -void _createMessages({List errors, PreprocessorOptions options}) { +void _createMessages({List? errors, PreprocessorOptions? options}) { errors ??= []; options ??= PreprocessorOptions(useColors: false, inputFile: 'memory'); @@ -51,11 +51,11 @@ bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. /// Parse and analyze the CSS file. StyleSheet compile(input, - {List errors, - PreprocessorOptions options, + {List? errors, + PreprocessorOptions? options, bool nested = true, bool polyfill = false, - List includes}) { + List? includes}) { includes ??= []; var source = _inputAsString(input); @@ -78,7 +78,7 @@ StyleSheet compile(input, /// Analyze the CSS file. void analyze(List styleSheets, - {List errors, PreprocessorOptions options}) { + {List? errors, PreprocessorOptions? options}) { _createMessages(errors: errors, options: options); Analyzer(styleSheets, messages).run(); } @@ -86,7 +86,7 @@ void analyze(List styleSheets, /// Parse the [input] CSS stylesheet into a tree. The [input] can be a [String], /// or [List] of bytes and returns a [StyleSheet] AST. The optional /// [errors] list will contain each error/warning as a [Message]. -StyleSheet parse(input, {List errors, PreprocessorOptions options}) { +StyleSheet parse(input, {List? errors, PreprocessorOptions? options}) { var source = _inputAsString(input); _createMessages(errors: errors, options: options); @@ -99,7 +99,7 @@ StyleSheet parse(input, {List errors, PreprocessorOptions options}) { /// or [List] of bytes and returns a [StyleSheet] AST. The optional /// [errors] list will contain each error/warning as a [Message]. // TODO(jmesserly): should rename "parseSelector" and return Selector -StyleSheet selector(input, {List errors}) { +StyleSheet selector(input, {List? errors}) { var source = _inputAsString(input); _createMessages(errors: errors); @@ -108,7 +108,7 @@ StyleSheet selector(input, {List errors}) { return (_Parser(file, source)..tokenizer.inSelector = true).parseSelector(); } -SelectorGroup parseSelectorGroup(input, {List errors}) { +SelectorGroup? parseSelectorGroup(input, {List? errors}) { var source = _inputAsString(input); _createMessages(errors: errors); @@ -161,7 +161,7 @@ class Parser { // TODO(jmesserly): having file and text is redundant. // TODO(rnystrom): baseUrl isn't used. Remove from API. - Parser(SourceFile file, String text, {int start = 0, String baseUrl}) + Parser(SourceFile file, String text, {int start = 0, String? baseUrl}) : _parser = _Parser(file, text, start: start); StyleSheet parse() => _parser.parse(); @@ -183,8 +183,8 @@ class _Parser { /// source-span locations. final SourceFile file; - Token _previousToken; - Token _peekToken; + Token? _previousToken; + late Token _peekToken; _Parser(this.file, String text, {int start = 0}) : tokenizer = Tokenizer(file, text, true, start) { @@ -259,9 +259,9 @@ class _Parser { } Token _next({bool unicodeRange = false}) { - _previousToken = _peekToken; + final next = _previousToken = _peekToken; _peekToken = tokenizer.next(unicodeRange: unicodeRange); - return _previousToken; + return next; } bool _peekKind(int kind) { @@ -310,12 +310,12 @@ class _Parser { _error(message, tok.span); } - void _error(String message, SourceSpan location) { + void _error(String message, SourceSpan? location) { location ??= _peekToken.span; messages.error(message, location); } - void _warning(String message, SourceSpan location) { + void _warning(String message, SourceSpan? location) { location ??= _peekToken.span; messages.warning(message, location); } @@ -324,10 +324,10 @@ class _Parser { // TODO(terry): there are places where we are creating spans before we eat // the tokens, so using _previousToken is not always valid. // TODO(nweiz): use < rather than compareTo when SourceSpan supports it. - if (_previousToken == null || _previousToken.span.compareTo(start) < 0) { + if (_previousToken == null || _previousToken!.span.compareTo(start) < 0) { return start; } - return start.expand(_previousToken.span); + return start.expand(_previousToken!.span); } /////////////////////////////////////////////////////////////////// @@ -363,7 +363,7 @@ class _Parser { return mediaQueries; } - MediaQuery processMediaQuery() { + MediaQuery? processMediaQuery() { // Grammar: [ONLY | NOT]? S* media_type S* // [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]* @@ -385,7 +385,7 @@ class _Parser { start = _peekToken.span; } - Identifier type; + Identifier? type; // Get the media type. if (_peekIdentifier()) type = identifier(); @@ -416,7 +416,7 @@ class _Parser { return null; } - MediaExpression processMediaExpression([bool andOperator = false]) { + MediaExpression? processMediaExpression([bool andOperator = false]) { var start = _peekToken.span; // Grammar: '(' S* media_feature S* [ ':' S* expr ]? ')' S* @@ -460,7 +460,7 @@ class _Parser { /// declarations /// '}' /// supports: '@supports' supports_condition group_rule_body - Directive processDirective() { + Directive? processDirective() { var start = _peekToken.span; var tokId = processVariableOrDirective(); @@ -471,7 +471,7 @@ class _Parser { // @import "uri_string" or @import url("uri_string") are identical; only // a url can follow an @import. - String importStr; + String? importStr; if (_peekIdentifier()) { var func = processFunction(identifier()); if (func is UriTerm) { @@ -488,7 +488,7 @@ class _Parser { _error('missing import string', _peekToken.span); } - return ImportDirective(importStr.trim(), medias, _makeSpan(start)); + return ImportDirective(importStr!.trim(), medias, _makeSpan(start)); case TokenKind.DIRECTIVE_MEDIA: _next(); @@ -549,13 +549,13 @@ class _Parser { _next(); // Page name - Identifier name; + Identifier? name; if (_peekIdentifier()) { name = identifier(); } // Any pseudo page? - Identifier pseudoPage; + Identifier? pseudoPage; if (_maybeEat(TokenKind.COLON)) { if (_peekIdentifier()) { pseudoPage = identifier(); @@ -581,11 +581,6 @@ class _Parser { _next(); var charEncoding = processQuotedString(false); - if (isChecked && charEncoding == null) { - // Missing character encoding. - _warning('missing character encoding string', _makeSpan(start)); - } - return CharsetDirective(charEncoding, _makeSpan(start)); // TODO(terry): Workaround Dart2js bug continue not implemented in switch @@ -628,7 +623,7 @@ class _Parser { // ['from'|'to'|PERCENTAGE] [',' ['from'|'to'|PERCENTAGE] ]* ; _next(); - Identifier name; + Identifier? name; if (_peekIdentifier()) { name = identifier(); } @@ -695,14 +690,14 @@ class _Parser { // namespace_prefix : IDENT _next(); - Identifier prefix; + Identifier? prefix; if (_peekIdentifier()) { prefix = identifier(); } // The namespace URI can be either a quoted string url("uri_string") // are identical. - String namespaceUri; + String? namespaceUri; if (_peekIdentifier()) { var func = processFunction(identifier()); if (func is UriTerm) { @@ -722,7 +717,7 @@ class _Parser { } return NamespaceDirective( - prefix != null ? prefix.name : '', namespaceUri, _makeSpan(start)); + prefix?.name ?? '', namespaceUri, _makeSpan(start)); case TokenKind.DIRECTIVE_MIXIN: return processMixin(); @@ -752,7 +747,7 @@ class _Parser { /// @mixin IDENT [(args,...)] '{' /// [ruleset | property | directive]* /// '}' - MixinDefinition processMixin() { + MixinDefinition? processMixin() { _next(); var name = identifier(); @@ -781,7 +776,7 @@ class _Parser { _eat(TokenKind.LBRACE); var productions = []; - MixinDefinition mixinDirective; + MixinDefinition? mixinDirective; var start = _peekToken.span; while (!_maybeEat(TokenKind.END_OF_FILE)) { @@ -803,7 +798,7 @@ class _Parser { newDecls.add(IncludeMixinAtDeclaration(include, include.span)); } else { _warning('Error mixing of top-level vs declarations mixins', - _makeSpan(include.span)); + _makeSpan(include.span as FileSpan)); } }); declGroup.declarations.insertAll(0, newDecls); @@ -876,12 +871,12 @@ class _Parser { // Less compatibility: // @name: value; => var-name: value; (VarDefinition) // property: @name; => property: var(name); (VarUsage) - Identifier name; + Identifier? name; if (_peekIdentifier()) { name = identifier(); } - Expressions exprs; + Expressions? exprs; if (mixinParameter && _maybeEat(TokenKind.COLON)) { exprs = processExpr(); } else if (!mixinParameter) { @@ -897,10 +892,10 @@ class _Parser { } } else if (mixinParameter && _peekToken.kind == TokenKind.VAR_DEFINITION) { _next(); - Identifier definedName; + Identifier? definedName; if (_peekIdentifier()) definedName = identifier(); - Expressions exprs; + Expressions? exprs; if (_maybeEat(TokenKind.COLON)) { exprs = processExpr(); } @@ -917,7 +912,7 @@ class _Parser { // @include IDENT [(args,...)]; _next(); - Identifier name; + Identifier? name; if (_peekIdentifier()) { name = identifier(); } @@ -952,7 +947,7 @@ class _Parser { _eat(TokenKind.SEMICOLON); } - return IncludeDirective(name.name, params, span); + return IncludeDirective(name!.name, params, span); } DocumentDirective processDocumentDirective() { @@ -982,12 +977,12 @@ class _Parser { _eat(TokenKind.RPAREN); - var arguments = Expressions(_makeSpan(argumentSpan)) + var arguments = Expressions(_makeSpan(argumentSpan as FileSpan)) ..add(LiteralTerm(argument, argument, argumentSpan)); - function = FunctionTerm( - ident.name, ident.name, arguments, _makeSpan(ident.span)); + function = FunctionTerm(ident.name, ident.name, arguments, + _makeSpan(ident.span as FileSpan)); } else { - function = processFunction(ident); + function = processFunction(ident) as LiteralTerm; } functions.add(function); @@ -1009,7 +1004,7 @@ class _Parser { return SupportsDirective(condition, groupRuleBody, _makeSpan(start)); } - SupportsCondition processSupportsCondition() { + SupportsCondition? processSupportsCondition() { if (_peekKind(TokenKind.IDENTIFIER)) { return processSupportsNegation(); } @@ -1052,7 +1047,7 @@ class _Parser { } } - SupportsNegation processSupportsNegation() { + SupportsNegation? processSupportsNegation() { var start = _peekToken.span; var text = _peekToken.text.toLowerCase(); if (text != 'not') return null; @@ -1083,7 +1078,7 @@ class _Parser { return ViewportDirective(name, declarations, _makeSpan(start)); } - TreeNode processRule([SelectorGroup selectorGroup]) { + TreeNode? processRule([SelectorGroup? selectorGroup]) { if (selectorGroup == null) { final directive = processDirective(); if (directive != null) { @@ -1133,7 +1128,7 @@ class _Parser { /// /// Return [:null:] if no selector or [SelectorGroup] if a selector was /// parsed. - SelectorGroup _nestedSelector() { + SelectorGroup? _nestedSelector() { var oldMessages = messages; _createMessages(); @@ -1172,7 +1167,7 @@ class _Parser { var selectorGroup = _nestedSelector(); while (selectorGroup != null) { // Nested selector so process as a ruleset. - var ruleset = processRule(selectorGroup); + var ruleset = processRule(selectorGroup)!; decls.add(ruleset); selectorGroup = _nestedSelector(); } @@ -1180,7 +1175,7 @@ class _Parser { var decl = processDeclaration(dartStyles); if (decl != null) { if (decl.hasDartStyle) { - var newDartStyle = decl.dartStyle; + var newDartStyle = decl.dartStyle!; // Replace or add latest Dart style. var replaced = false; @@ -1255,16 +1250,14 @@ class _Parser { _next(); var declGroup = processDeclarations(); - if (declGroup != null) { - groups.add(MarginGroup( - marginSym, declGroup.declarations, _makeSpan(start))); - } + groups.add( + MarginGroup(marginSym, declGroup.declarations, _makeSpan(start))); break; default: var decl = processDeclaration(dartStyles); if (decl != null) { if (decl.hasDartStyle) { - var newDartStyle = decl.dartStyle; + var newDartStyle = decl.dartStyle!; // Replace or add latest Dart style. var replaced = false; @@ -1303,7 +1296,7 @@ class _Parser { return groups; } - SelectorGroup processSelectorGroup() { + SelectorGroup? processSelectorGroup() { var selectors = []; var start = _peekToken.span; @@ -1323,7 +1316,7 @@ class _Parser { } /// Return list of selectors - Selector processSelector() { + Selector? processSelector() { var simpleSequences = []; var start = _peekToken.span; while (true) { @@ -1346,7 +1339,7 @@ class _Parser { /// This is a quick fix for parsing until the parser /// supports Selector Level 4 grammar: /// https://drafts.csswg.org/selectors-4/#typedef-compound-selector - Selector processCompoundSelector() { + Selector? processCompoundSelector() { var selector = processSelector(); if (selector != null) { for (var sequence in selector.simpleSelectorSequences) { @@ -1358,7 +1351,7 @@ class _Parser { return selector; } - SimpleSelectorSequence simpleSelectorSequence(bool forceCombinatorNone) { + SimpleSelectorSequence? simpleSelectorSequence(bool forceCombinatorNone) { var start = _peekToken.span; var combinatorType = TokenKind.COMBINATOR_NONE; var thisOperator = false; @@ -1384,7 +1377,7 @@ class _Parser { // Check if WHITESPACE existed between tokens if so we're descendent. if (combinatorType == TokenKind.COMBINATOR_NONE && !forceCombinatorNone) { - if (_previousToken != null && _previousToken.end != _peekToken.start) { + if (_previousToken != null && _previousToken!.end != _peekToken.start) { combinatorType = TokenKind.COMBINATOR_DESCENDANT; } } @@ -1427,7 +1420,7 @@ class _Parser { /// : [ namespace_prefix ]? '*' /// class /// : '.' IDENT - SimpleSelector simpleSelector() { + SimpleSelector? simpleSelector() { // TODO(terry): Natalie makes a good point parsing of namespace and element // are essentially the same (asterisk or identifier) other // than the error message for element. Should consolidate the @@ -1457,7 +1450,7 @@ class _Parser { } if (_maybeEat(TokenKind.NAMESPACE)) { - TreeNode element; + TreeNode? element; switch (_peek()) { case TokenKind.ASTERISK: // Mark as universal element @@ -1474,7 +1467,7 @@ class _Parser { } return NamespaceSelector( - first, ElementSelector(element, element.span), _makeSpan(start)); + first, ElementSelector(element, element!.span!), _makeSpan(start)); } else if (first != null) { return ElementSelector(first, _makeSpan(start)); } else { @@ -1484,19 +1477,17 @@ class _Parser { } bool _anyWhiteSpaceBeforePeekToken(int kind) { - if (_previousToken != null && - _peekToken != null && - _previousToken.kind == kind) { + if (_previousToken != null && _previousToken!.kind == kind) { // If end of previous token isn't same as the start of peek token then // there's something between these tokens probably whitespace. - return _previousToken.end != _peekToken.start; + return _previousToken!.end != _peekToken.start; } return false; } /// type_selector | universal | HASH | class | attrib | pseudo - SimpleSelector simpleSelectorTail() { + SimpleSelector? simpleSelectorTail() { // Check for HASH | class | attrib | pseudo | negation var start = _peekToken.span; switch (_peek()) { @@ -1531,7 +1522,7 @@ class _Parser { return null; } - SimpleSelector processPseudoSelector(FileSpan start) { + SimpleSelector? processPseudoSelector(FileSpan start) { // :pseudo-class ::pseudo-element // TODO(terry): '::' should be token. _eat(TokenKind.COLON); @@ -1618,7 +1609,7 @@ class _Parser { var expressions = []; - Token termToken; + Token? termToken; dynamic value; var keepParsing = true; @@ -1685,7 +1676,7 @@ class _Parser { // SUFFIXMATCH: '$=' // // SUBSTRMATCH: '*=' - AttributeSelector processAttribute() { + AttributeSelector? processAttribute() { var start = _peekToken.span; if (_maybeEat(TokenKind.LBRACK)) { @@ -1739,8 +1730,8 @@ class _Parser { // property: expr prio? \9; - IE8 and below property, /9 before semi-colon // *IDENT - IE7 or below // _IDENT - IE6 property (automatically a valid ident) - Declaration processDeclaration(List dartStyles) { - Declaration decl; + Declaration? processDeclaration(List dartStyles) { + Declaration? decl; var start = _peekToken.span; @@ -1769,7 +1760,7 @@ class _Parser { important: importantPriority, ie7: ie7); } else if (_peekToken.kind == TokenKind.VAR_DEFINITION) { _next(); - Identifier definedName; + Identifier? definedName; if (_peekIdentifier()) definedName = identifier(); _eat(TokenKind.COLON); @@ -1797,7 +1788,7 @@ class _Parser { var pseudoSelector = processPseudoSelector(_peekToken.span); if (pseudoSelector is PseudoElementSelector || pseudoSelector is PseudoClassSelector) { - simpleSequences.add(pseudoSelector); + simpleSequences.add(pseudoSelector!); } else { _warning('not a valid selector', span); } @@ -1876,9 +1867,9 @@ class _Parser { 'normal': FontWeight.normal }; - static int _findStyle(String styleName) => _stylesToDart[styleName]; + static int? _findStyle(String styleName) => _stylesToDart[styleName]; - DartStyleExpression _styleForDart(Identifier property, Expressions exprs, + DartStyleExpression? _styleForDart(Identifier property, Expressions exprs, List dartStyles) { var styleType = _findStyle(property.name.toLowerCase()); if (styleType != null) { @@ -1892,14 +1883,14 @@ class _Parser { // Merge all font styles for this class selector. for (var dartStyle in dartStyles) { if (dartStyle.isFont) { - fontExpr = FontExpression.merge(dartStyle, fontExpr); + fontExpr = FontExpression.merge(dartStyle as FontExpression, fontExpr); } } return fontExpr; } - DartStyleExpression buildDartStyleNode( + DartStyleExpression? buildDartStyleNode( int styleType, Expressions exprs, List dartStyles) { switch (styleType) { // Properties in order: @@ -1917,7 +1908,7 @@ class _Parser { try { return _mergeFontStyles(processor.processFontFamily(), dartStyles); } catch (fontException) { - _error(fontException, _peekToken.span); + _error('$fontException', _peekToken.span); } break; case _fontPartSize: @@ -2036,7 +2027,7 @@ class _Parser { // TODO(terry): Look at handling width of thin, thick, etc. any none numbers // to convert to a number. - DartStyleExpression processOneNumber(Expressions exprs, int part) { + DartStyleExpression? processOneNumber(Expressions exprs, int part) { var value = marginValue(exprs.expressions[0]); if (value != null) { switch (part) { @@ -2085,11 +2076,11 @@ class _Parser { /// * top/right/bottom/left (1 parameter) /// /// The values of the margins can be a unit or unitless or auto. - BoxEdge processFourNums(Expressions exprs) { - num top; - num right; - num bottom; - num left; + BoxEdge? processFourNums(Expressions exprs) { + num? top; + num? right; + num? bottom; + num? left; var totalExprs = exprs.expressions.length; switch (totalExprs) { @@ -2125,7 +2116,7 @@ class _Parser { } // TODO(terry): Need to handle auto. - num marginValue(Expression exprTerm) { + num? marginValue(Expression exprTerm) { if (exprTerm is UnitTerm) { return exprTerm.value as num; } else if (exprTerm is NumberTerm) { @@ -2147,7 +2138,7 @@ class _Parser { var keepGoing = true; dynamic expr; while (keepGoing && (expr = processTerm(ieFilter)) != null) { - Expression op; + Expression? op; var opStart = _peekToken.span; @@ -2228,7 +2219,7 @@ class _Parser { dynamic /* Expression | List | ... */ processTerm( [bool ieFilter = false]) { var start = _peekToken.span; - Token t; // token for term's value + Token? t; // token for term's value dynamic value; // value of term (numeric values) var unary = ''; @@ -2236,12 +2227,12 @@ class _Parser { case TokenKind.HASH: _eat(TokenKind.HASH); if (!_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) { - String hexText; + String? hexText; if (_peekKind(TokenKind.INTEGER)) { var hexText1 = _peekToken.text; _next(); // Append identifier only if there's no delimiting whitespace. - if (_peekIdentifier() && _previousToken.end == _peekToken.start) { + if (_peekIdentifier() && _previousToken!.end == _peekToken.start) { hexText = '$hexText1${identifier().name}'; } else { hexText = hexText1; @@ -2347,20 +2338,20 @@ class _Parser { TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6); return _parseHex(rgbColor, _makeSpan(start)); case TokenKind.UNICODE_RANGE: - String first; - String second; + String? first; + String? second; int firstNumber; int secondNumber; _eat(TokenKind.UNICODE_RANGE, unicodeRange: true); if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { - first = _previousToken.text; + first = _previousToken!.text; firstNumber = int.parse('0x$first'); if (firstNumber > MAX_UNICODE) { _error('unicode range must be less than 10FFFF', _makeSpan(start)); } if (_maybeEat(TokenKind.MINUS, unicodeRange: true)) { if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) { - second = _previousToken.text; + second = _previousToken!.text; secondNumber = int.parse('0x$second'); if (secondNumber > MAX_UNICODE) { _error( @@ -2373,7 +2364,7 @@ class _Parser { } } } else if (_maybeEat(TokenKind.HEX_RANGE, unicodeRange: true)) { - first = _previousToken.text; + first = _previousToken!.text; } return UnicodeRangeTerm(first, second, _makeSpan(start)); @@ -2399,17 +2390,17 @@ class _Parser { } /// Process all dimension units. - LiteralTerm processDimension(Token t, var value, SourceSpan span) { + LiteralTerm processDimension(Token? t, Object value, SourceSpan span) { LiteralTerm term; var unitType = _peek(); switch (unitType) { case TokenKind.UNIT_EM: - term = EmTerm(value, t.text, span); + term = EmTerm(value, t!.text, span); _next(); // Skip the unit break; case TokenKind.UNIT_EX: - term = ExTerm(value, t.text, span); + term = ExTerm(value, t!.text, span); _next(); // Skip the unit break; case TokenKind.UNIT_LENGTH_PX: @@ -2418,62 +2409,60 @@ class _Parser { case TokenKind.UNIT_LENGTH_IN: case TokenKind.UNIT_LENGTH_PT: case TokenKind.UNIT_LENGTH_PC: - term = LengthTerm(value, t.text, span, unitType); + term = LengthTerm(value, t!.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_ANGLE_DEG: case TokenKind.UNIT_ANGLE_RAD: case TokenKind.UNIT_ANGLE_GRAD: case TokenKind.UNIT_ANGLE_TURN: - term = AngleTerm(value, t.text, span, unitType); + term = AngleTerm(value, t!.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_TIME_MS: case TokenKind.UNIT_TIME_S: - term = TimeTerm(value, t.text, span, unitType); + term = TimeTerm(value, t!.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_FREQ_HZ: case TokenKind.UNIT_FREQ_KHZ: - term = FreqTerm(value, t.text, span, unitType); + term = FreqTerm(value, t!.text, span, unitType); _next(); // Skip the unit break; case TokenKind.PERCENT: - term = PercentageTerm(value, t.text, span); + term = PercentageTerm(value, t!.text, span); _next(); // Skip the % break; case TokenKind.UNIT_FRACTION: - term = FractionTerm(value, t.text, span); + term = FractionTerm(value, t!.text, span); _next(); // Skip the unit break; case TokenKind.UNIT_RESOLUTION_DPI: case TokenKind.UNIT_RESOLUTION_DPCM: case TokenKind.UNIT_RESOLUTION_DPPX: - term = ResolutionTerm(value, t.text, span, unitType); + term = ResolutionTerm(value, t!.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_CH: - term = ChTerm(value, t.text, span, unitType); + term = ChTerm(value, t!.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_REM: - term = RemTerm(value, t.text, span, unitType); + term = RemTerm(value, t!.text, span, unitType); _next(); // Skip the unit break; case TokenKind.UNIT_VIEWPORT_VW: case TokenKind.UNIT_VIEWPORT_VH: case TokenKind.UNIT_VIEWPORT_VMIN: case TokenKind.UNIT_VIEWPORT_VMAX: - term = ViewportTerm(value, t.text, span, unitType); + term = ViewportTerm(value, t!.text, span, unitType); _next(); // Skip the unit break; default: - if (value != null) { - if (value is Identifier) { - term = LiteralTerm(value, value.name, span); - } else if (t != null) { - term = NumberTerm(value, t.text, span); - } + if (value is Identifier) { + term = LiteralTerm(value, value.name, span); + } else { + term = NumberTerm(value, t!.text, span); } } @@ -2607,7 +2596,7 @@ class _Parser { return stringValue.toString(); } - CalcTerm processCalc(Identifier func) { + CalcTerm? processCalc(Identifier func) { var start = _peekToken.span; var name = func.name; @@ -2765,8 +2754,8 @@ class ExpressionsProcessor { // * ##length in px, pt, etc. // * ##%, percent of parent elem's font-size // * inherit - LengthTerm size; - LineHeight lineHt; + LengthTerm? size; + LineHeight? lineHt; var nextIsLineHeight = false; for (; _index < _exprs.expressions.length; _index++) { var expr = _exprs.expressions[_index]; @@ -2824,8 +2813,8 @@ class ExpressionsProcessor { FontExpression processFont() { // Process all parts of the font expression. - FontExpression fontSize; - FontExpression fontFamily; + FontExpression? fontSize; + FontExpression? fontFamily; for (; _index < _exprs.expressions.length; _index++) { // Order is font-size font-family fontSize ??= processFontSize(); @@ -2837,20 +2826,20 @@ class ExpressionsProcessor { } return FontExpression(_exprs.span, - size: fontSize.font.size, + size: fontSize!.font.size, lineHeight: fontSize.font.lineHeight, - family: fontFamily.font.family); + family: fontFamily!.font.family); } } /// Escapes [text] for use in a CSS string. /// [single] specifies single quote `'` vs double quote `"`. String _escapeString(String text, {bool single = false}) { - StringBuffer result; + StringBuffer? result; for (var i = 0; i < text.length; i++) { var code = text.codeUnitAt(i); - String replace; + String? replace; switch (code) { case 34 /*'"'*/ : if (!single) replace = r'\"'; diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 7ed553fc8..f685a2bfb 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -171,16 +171,16 @@ class Analyzer { /// expanded. class ExpandNestedSelectors extends Visitor { /// Parent [RuleSet] if a nested rule otherwise [:null:]. - RuleSet _parentRuleSet; + RuleSet? _parentRuleSet; /// Top-most rule if nested rules. - SelectorGroup _topLevelSelectorGroup; + SelectorGroup? _topLevelSelectorGroup; /// SelectorGroup at each nesting level. - SelectorGroup _nestedSelectorGroup; + SelectorGroup? _nestedSelectorGroup; /// Declaration (sans the nested selectors). - DeclarationGroup _flatDeclarationGroup; + DeclarationGroup? _flatDeclarationGroup; /// Each nested selector get's a flatten RuleSet. List _expandedRuleSets = []; @@ -196,7 +196,7 @@ class ExpandNestedSelectors extends Visitor { if (_nestedSelectorGroup == null) { // Create top-level selector (may have nested rules). - final newSelectors = node.selectorGroup.selectors.toList(); + final newSelectors = node.selectorGroup!.selectors.toList(); _topLevelSelectorGroup = SelectorGroup(newSelectors, node.span); _nestedSelectorGroup = _topLevelSelectorGroup; } else { @@ -234,8 +234,8 @@ class ExpandNestedSelectors extends Visitor { /// the [_nestedSelectorGroup]. SelectorGroup _mergeToFlatten(RuleSet node) { // Create a new SelectorGroup for this nesting level. - var nestedSelectors = _nestedSelectorGroup.selectors; - var selectors = node.selectorGroup.selectors; + var nestedSelectors = _nestedSelectorGroup!.selectors; + var selectors = node.selectorGroup!.selectors; // Create a merged set of previous parent selectors and current selectors. var newSelectors = []; @@ -343,7 +343,7 @@ class ExpandNestedSelectors extends Visitor { @override void visitDeclaration(Declaration node) { if (_parentRuleSet != null) { - _flatDeclarationGroup.declarations.add(node); + _flatDeclarationGroup!.declarations.add(node); } super.visitDeclaration(node); } @@ -351,7 +351,7 @@ class ExpandNestedSelectors extends Visitor { @override void visitVarDefinition(VarDefinition node) { if (_parentRuleSet != null) { - _flatDeclarationGroup.declarations.add(node); + _flatDeclarationGroup!.declarations.add(node); } super.visitVarDefinition(node); } @@ -359,7 +359,7 @@ class ExpandNestedSelectors extends Visitor { @override void visitExtendDeclaration(ExtendDeclaration node) { if (_parentRuleSet != null) { - _flatDeclarationGroup.declarations.add(node); + _flatDeclarationGroup!.declarations.add(node); } super.visitExtendDeclaration(node); } @@ -367,7 +367,7 @@ class ExpandNestedSelectors extends Visitor { @override void visitMarginGroup(MarginGroup node) { if (_parentRuleSet != null) { - _flatDeclarationGroup.declarations.add(node); + _flatDeclarationGroup!.declarations.add(node); } super.visitMarginGroup(node); } @@ -421,12 +421,12 @@ class _MediaRulesReplacer extends Visitor { /// Expand all @include at the top-level the ruleset(s) associated with the /// mixin. class TopLevelIncludes extends Visitor { - StyleSheet _styleSheet; + StyleSheet? _styleSheet; final Messages _messages; /// Map of variable name key to it's definition. final map = {}; - MixinDefinition currDef; + MixinDefinition? currDef; static void expand(Messages messages, List styleSheets) { TopLevelIncludes(messages, styleSheets); @@ -450,14 +450,14 @@ class TopLevelIncludes extends Visitor { @override void visitIncludeDirective(IncludeDirective node) { + final currDef = this.currDef; if (map.containsKey(node.name)) { var mixinDef = map[node.name]; if (mixinDef is MixinRulesetDirective) { _TopLevelIncludeReplacer.replace( - _messages, _styleSheet, node, mixinDef.rulesets); + _messages, _styleSheet!, node, mixinDef.rulesets); } else if (currDef is MixinRulesetDirective && _anyRulesets(currDef)) { - // currDef is MixinRulesetDirective - MixinRulesetDirective mixinRuleset = currDef; + final mixinRuleset = currDef; var index = mixinRuleset.rulesets.indexOf(node); mixinRuleset.rulesets.removeAt(index); _messages.warning( @@ -466,7 +466,7 @@ class TopLevelIncludes extends Visitor { } } else { if (currDef is MixinRulesetDirective) { - var rulesetDirect = currDef as MixinRulesetDirective; + var rulesetDirect = currDef; rulesetDirect.rulesets.removeWhere((entry) { if (entry == node) { _messages.warning('Undefined mixin ${node.name}', node.span); @@ -548,8 +548,9 @@ class _TopLevelIncludeReplacer extends Visitor { /// RuleSets, depending on type of mixin (ruleset or declaration). The include /// can be an include in a declaration or an include directive (top-level). int _findInclude(List list, TreeNode node) { - IncludeDirective matchNode = - (node is IncludeMixinAtDeclaration) ? node.include : node; + final matchNode = (node is IncludeMixinAtDeclaration) + ? node.include + : node as IncludeDirective; var index = 0; for (var item in list) { @@ -564,20 +565,20 @@ int _findInclude(List list, TreeNode node) { /// parameters. class CallMixin extends Visitor { final MixinDefinition mixinDef; - List _definedArgs; - Expressions _currExpressions; + List? _definedArgs; + Expressions? _currExpressions; int _currIndex = -1; final varUsages = >>{}; /// Only var defs with more than one expression (comma separated). - final Map varDefs; + final Map? varDefs; CallMixin(this.mixinDef, [this.varDefs]) { if (mixinDef is MixinRulesetDirective) { - visitMixinRulesetDirective(mixinDef); + visitMixinRulesetDirective(mixinDef as MixinRulesetDirective); } else { - visitMixinDeclarationDirective(mixinDef); + visitMixinDeclarationDirective(mixinDef as MixinDeclarationDirective); } } @@ -586,9 +587,9 @@ class CallMixin extends Visitor { MixinDefinition transform(List> callArgs) { // TODO(terry): Handle default arguments and varArgs. // Transform mixin with callArgs. - for (var index = 0; index < _definedArgs.length; index++) { - var definedArg = _definedArgs[index]; - VarDefinition varDef; + for (var index = 0; index < _definedArgs!.length; index++) { + var definedArg = _definedArgs![index]; + VarDefinition? varDef; if (definedArg is VarDefinition) { varDef = definedArg; } else if (definedArg is VarDefinitionDirective) { @@ -606,8 +607,8 @@ class CallMixin extends Visitor { callArg = callArgs[index]; } - var expressions = varUsages[varDef.definedName]; - expressions.forEach((k, v) { + var expressions = varUsages[varDef!.definedName]; + expressions!.forEach((k, v) { for (var usagesIndex in v) { k.expressions.replaceRange(usagesIndex, usagesIndex + 1, callArg); } @@ -622,8 +623,8 @@ class CallMixin extends Visitor { List> _varDefsAsCallArgs(var callArg) { var defArgs = >[]; if (callArg is List && callArg[0] is VarUsage) { - var varDef = varDefs[callArg[0].name]; - var expressions = (varDef.expression as Expressions).expressions; + var varDef = varDefs![callArg[0].name]; + var expressions = (varDef!.expression as Expressions).expressions; assert(expressions.length > 1); for (var expr in expressions) { if (expr is! OperatorComma) { @@ -651,7 +652,7 @@ class CallMixin extends Visitor { void _addExpression(Map> expressions) { var indexSet = {}; indexSet.add(_currIndex); - expressions[_currExpressions] = indexSet; + expressions[_currExpressions!] = indexSet; } @override @@ -660,7 +661,7 @@ class CallMixin extends Visitor { assert(_currExpressions != null); if (varUsages.containsKey(node.name)) { var expressions = varUsages[node.name]; - var allIndexes = expressions[_currExpressions]; + var allIndexes = expressions![_currExpressions]; if (allIndexes == null) { _addExpression(expressions); } else { @@ -689,7 +690,7 @@ class CallMixin extends Visitor { /// Expand all @include inside of a declaration associated with a mixin. class DeclarationIncludes extends Visitor { - StyleSheet _styleSheet; + StyleSheet? _styleSheet; final Messages _messages; /// Map of variable name key to it's definition. @@ -697,8 +698,8 @@ class DeclarationIncludes extends Visitor { /// Cache of mixin called with parameters. final Map callMap = {}; - MixinDefinition currDef; - DeclarationGroup currDeclGroup; + MixinDefinition? currDef; + DeclarationGroup? currDeclGroup; /// Var definitions with more than 1 expression. final varDefs = {}; @@ -741,9 +742,10 @@ class DeclarationIncludes extends Visitor { // Fix up any mixin that is really a Declaration but has includes. if (mixinDef is MixinRulesetDirective) { if (!_allIncludes(mixinDef.rulesets) && currDeclGroup != null) { - var index = _findInclude(currDeclGroup.declarations, node); + var index = _findInclude(currDeclGroup!.declarations, node); if (index != -1) { - currDeclGroup.declarations.replaceRange(index, index + 1, [NoOp()]); + currDeclGroup!.declarations + .replaceRange(index, index + 1, [NoOp()]); } _messages.warning( 'Using top-level mixin ${node.include.name} as a declaration', @@ -758,19 +760,19 @@ class DeclarationIncludes extends Visitor { rulesets.add(IncludeMixinAtDeclaration( ruleset as IncludeDirective, ruleset.span)); }); - _IncludeReplacer.replace(_styleSheet, node, rulesets); + _IncludeReplacer.replace(_styleSheet!, node, rulesets); } } } - if (mixinDef.definedArgs.isNotEmpty && node.include.args.isNotEmpty) { + if (mixinDef!.definedArgs.isNotEmpty && node.include.args.isNotEmpty) { var callMixin = _createCallDeclMixin(mixinDef); mixinDef = callMixin.transform(node.include.args); } if (mixinDef is MixinDeclarationDirective) { _IncludeReplacer.replace( - _styleSheet, node, mixinDef.declarations.declarations); + _styleSheet!, node, mixinDef.declarations.declarations); } } else { _messages.warning('Undefined mixin ${node.include.name}', node.span); @@ -786,7 +788,7 @@ class DeclarationIncludes extends Visitor { if (currDef is MixinDeclarationDirective && mixinDef is MixinDeclarationDirective) { _IncludeReplacer.replace( - _styleSheet, node, mixinDef.declarations.declarations); + _styleSheet!, node, mixinDef.declarations.declarations); } else if (currDef is MixinDeclarationDirective) { var decls = (currDef as MixinDeclarationDirective).declarations.declarations; @@ -903,8 +905,8 @@ class MixinsAndIncludes extends Visitor { class AllExtends extends Visitor { final inherits = >{}; - SelectorGroup _currSelectorGroup; - int _currDeclIndex; + SelectorGroup? _currSelectorGroup; + int? _currDeclIndex; final _extendsToRemove = []; @override @@ -924,13 +926,13 @@ class AllExtends extends Visitor { inheritName += selector.toString(); } if (inherits.containsKey(inheritName)) { - inherits[inheritName].add(_currSelectorGroup); + inherits[inheritName]!.add(_currSelectorGroup!); } else { - inherits[inheritName] = [_currSelectorGroup]; + inherits[inheritName] = [_currSelectorGroup!]; } // Remove this @extend - _extendsToRemove.add(_currDeclIndex); + _extendsToRemove.add(_currDeclIndex!); super.visitExtendDeclaration(node); } @@ -940,8 +942,10 @@ class AllExtends extends Visitor { var oldDeclIndex = _currDeclIndex; var decls = node.declarations; - for (_currDeclIndex = 0; _currDeclIndex < decls.length; _currDeclIndex++) { - decls[_currDeclIndex].visit(this); + for (_currDeclIndex = 0; + _currDeclIndex! < decls.length; + _currDeclIndex = _currDeclIndex! + 1) { + decls[_currDeclIndex!].visit(this); } if (_extendsToRemove.isNotEmpty) { diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index e7298dcfa..0f5b82272 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -101,7 +101,7 @@ class CssPrinter extends Visitor { @override void visitSupportsDirective(SupportsDirective node) { emit('$_newLine@supports '); - node.condition.visit(this); + node.condition!.visit(this); emit('$_sp{'); for (var rule in node.groupRuleBody) { rule.visit(this); @@ -112,7 +112,7 @@ class CssPrinter extends Visitor { @override void visitSupportsConditionInParens(SupportsConditionInParens node) { emit('('); - node.condition.visit(this); + node.condition!.visit(this); emit(')'); } @@ -150,7 +150,7 @@ class CssPrinter extends Visitor { @override void visitMediaDirective(MediaDirective node) { emit('$_newLine@media'); - emitMediaQueries(node.mediaQueries); + emitMediaQueries(node.mediaQueries.cast()); emit('$_sp{'); for (var ruleset in node.rules) { ruleset.visit(this); @@ -175,7 +175,7 @@ class CssPrinter extends Visitor { emit('$_newLine@page'); if (node.hasIdent || node.hasPseudoPage) { if (node.hasIdent) emit(' '); - emit(node._ident); + emit(node._ident!); emit(node.hasPseudoPage ? ':${node._pseudoPage}' : ''); } @@ -215,7 +215,7 @@ class CssPrinter extends Visitor { @override void visitKeyFrameDirective(KeyFrameDirective node) { emit('$_newLine${node.keyFrameName} '); - node.name.visit(this); + node.name!.visit(this); emit('$_sp{$_newLine'); for (final block in node._blocks) { block.visit(this); @@ -249,7 +249,7 @@ class CssPrinter extends Visitor { void visitNamespaceDirective(NamespaceDirective node) { bool isStartingQuote(String ch) => ('\'"'.contains(ch)); - if (isStartingQuote(node._uri)) { + if (isStartingQuote(node._uri!)) { emit(' @namespace ${node.prefix}"${node._uri}"'); } else { if (_isTesting) { @@ -303,7 +303,7 @@ class CssPrinter extends Visitor { @override void visitRuleSet(RuleSet node) { emit('$_newLine'); - node.selectorGroup.visit(this); + node.selectorGroup!.visit(this); emit('$_sp{$_newLine'); node.declarationGroup.visit(this); emit('}'); @@ -340,7 +340,7 @@ class CssPrinter extends Visitor { @override void visitDeclaration(Declaration node) { emit('${node.property}:$_sp'); - node.expression.visit(this); + node.expression!.visit(this); if (node.important) { emit('$_sp!important'); } @@ -349,7 +349,7 @@ class CssPrinter extends Visitor { @override void visitVarDefinition(VarDefinition node) { emit('var-${node.definedName}: '); - node.expression.visit(this); + node.expression!.visit(this); } @override @@ -439,7 +439,7 @@ class CssPrinter extends Visitor { @override void visitNegationSelector(NegationSelector node) { emit(':not('); - node.negationArg.visit(this); + node.negationArg!.visit(this); emit(')'); } @@ -470,7 +470,7 @@ class CssPrinter extends Visitor { @override void visitHexColorTerm(HexColorTerm node) { - String mappedName; + String? mappedName; if (_isTesting && (node.value is! BAD_HEX_VALUE)) { mappedName = TokenKind.hexToColorName(node.value); } diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index b93a554ae..0f4ff4dc1 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -12,7 +12,7 @@ enum MessageLevel { info, warning, severe } // compilation state. /// The global [Messages] for tracking info/warnings/messages. -Messages messages; +late Messages messages; // Color constants used for generating messages. const _greenColor = '\u001b[32m'; @@ -38,7 +38,7 @@ const Map _errorLabel = { class Message { final MessageLevel level; final String message; - final SourceSpan span; + final SourceSpan? span; final bool useColors; Message(this.level, this.message, {this.span, this.useColors = false}); @@ -56,7 +56,7 @@ class Message { output.write(message); } else { output.write('on '); - output.write(span.message(message, color: levelColor)); + output.write(span!.message(message, color: levelColor)); } return output.toString(); @@ -73,11 +73,11 @@ class Messages { final List messages = []; - Messages({PreprocessorOptions options, this.printHandler = print}) + Messages({PreprocessorOptions? options, this.printHandler = print}) : options = options ?? PreprocessorOptions(); /// Report a compile-time CSS error. - void error(String message, SourceSpan span) { + void error(String message, SourceSpan? span) { var msg = Message(MessageLevel.severe, message, span: span, useColors: options.useColors); @@ -87,7 +87,7 @@ class Messages { } /// Report a compile-time CSS warning. - void warning(String message, SourceSpan span) { + void warning(String message, SourceSpan? span) { if (options.warningsAsErrors) { error(message, span); } else { diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index 0c2ef04b3..389b89cec 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -19,7 +19,7 @@ class PolyFill { /// Run the analyzer on every file that is a style sheet or any component that /// has a style tag. - void process(StyleSheet styleSheet, {List includes}) { + void process(StyleSheet styleSheet, {List? includes}) { if (includes != null) { processVarDefinitions(includes); } @@ -85,8 +85,8 @@ class _VarDefAndUsage extends Visitor { final Map _knownVarDefs; final varDefs = {}; - VarDefinition currVarDefinition; - List currentExpressions; + VarDefinition? currVarDefinition; + List? currentExpressions; _VarDefAndUsage(this._messages, this._knownVarDefs); @@ -122,14 +122,14 @@ class _VarDefAndUsage extends Visitor { @override void visitVarUsage(VarUsage node) { - if (currVarDefinition != null && currVarDefinition.badUsage) return; + if (currVarDefinition != null && currVarDefinition!.badUsage) return; // Don't process other var() inside of a varUsage. That implies that the // default is a var() too. Also, don't process any var() inside of a // varDefinition (they're just place holders until we've resolved all real // usages. var expressions = currentExpressions; - var index = expressions.indexOf(node); + var index = expressions!.indexOf(node); assert(index >= 0); var def = _knownVarDefs[node.name]; if (def != null) { @@ -138,14 +138,14 @@ class _VarDefAndUsage extends Visitor { expressions.removeAt(index); return; } - _resolveVarUsage(currentExpressions, index, + _resolveVarUsage(currentExpressions!, index, _findTerminalVarDefinition(_knownVarDefs, def)); } else if (node.defaultValues.any((e) => e is VarUsage)) { // Don't have a VarDefinition need to use default values resolve all // default values. var terminalDefaults = []; for (var defaultValue in node.defaultValues) { - terminalDefaults.addAll(resolveUsageTerminal(defaultValue)); + terminalDefaults.addAll(resolveUsageTerminal(defaultValue as VarUsage)); } expressions.replaceRange(index, index + 1, terminalDefaults); } else if (node.defaultValues.isNotEmpty) { @@ -153,10 +153,10 @@ class _VarDefAndUsage extends Visitor { expressions.replaceRange(index, index + 1, node.defaultValues); } else { if (currVarDefinition != null) { - currVarDefinition.badUsage = true; + currVarDefinition!.badUsage = true; var mainStyleSheetDef = varDefs[node.name]; if (mainStyleSheetDef != null) { - varDefs.remove(currVarDefinition.property); + varDefs.remove(currVarDefinition!.property); } } // Remove var usage that points at an undefined definition. diff --git a/pkgs/csslib/lib/src/preprocessor_options.dart b/pkgs/csslib/lib/src/preprocessor_options.dart index 8df2680f9..2ca67dcc8 100644 --- a/pkgs/csslib/lib/src/preprocessor_options.dart +++ b/pkgs/csslib/lib/src/preprocessor_options.dart @@ -32,7 +32,7 @@ class PreprocessorOptions { final bool useColors; /// File to process by the compiler. - final String inputFile; + final String? inputFile; const PreprocessorOptions( {this.verbose = false, diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 0fb79fb38..a8c3c8087 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -22,7 +22,7 @@ abstract class _StyleProperty { /// /// then _cssExpression would return 'rgba(255,255,0)'. See /// - String get cssExpression; + String? get cssExpression; } /// Base interface for Color, HSL and RGB. @@ -52,7 +52,7 @@ class Color implements _StyleProperty, ColorBase { /// The [rgb] value of 0xffd700 would map to #ffd700 or the constant /// Color.gold, where ff is red intensity, d7 is green intensity, and 00 is /// blue intensity. - Color(int rgb, [num alpha]) : _argb = Color._rgbToArgbString(rgb, alpha); + Color(int rgb, [num? alpha]) : _argb = Color._rgbToArgbString(rgb, alpha); /// RGB takes three values. The [red], [green], and [blue] parameters are /// the intensity of those components where '0' is the least and '256' is the @@ -62,7 +62,7 @@ class Color implements _StyleProperty, ColorBase { /// '0' (completely transparent) to '1.0' (completely opaque). It will /// internally be mapped to an int between '0' and '255' like the other color /// components. - Color.createRgba(int red, int green, int blue, [num alpha]) + Color.createRgba(int red, int green, int blue, [num? alpha]) : _argb = Color.convertToHexString( Color._clamp(red, 0, 255), Color._clamp(green, 0, 255), @@ -71,7 +71,7 @@ class Color implements _StyleProperty, ColorBase { /// Creates a new color from a CSS color string. For more information, see /// . - Color.css(String color) : _argb = Color._convertCssToArgb(color); + Color.css(String color) : _argb = Color._convertCssToArgb(color)!; // TODO(jmesserly): I found the use of percents a bit suprising. /// HSL takes three values. The [hueDegree] degree on the color wheel; '0' is @@ -86,7 +86,7 @@ class Color implements _StyleProperty, ColorBase { /// '0' (completely transparent foreground) to '1.0' (completely opaque /// foreground). Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent, - [num alpha]) + [num? alpha]) : _argb = Hsla( Color._clamp(hueDegree, 0, 360) / 360, Color._clamp(saturationPercent, 0, 100) / 100, @@ -107,7 +107,7 @@ class Color implements _StyleProperty, ColorBase { /// [alpha] level of translucency range of values is 0..1, zero is a /// completely transparent foreground and 1 is a completely /// opaque foreground. - Color.hslaRaw(num hue, num saturation, num lightness, [num alpha]) + Color.hslaRaw(num hue, num saturation, num lightness, [num? alpha]) : _argb = Hsla( Color._clamp(hue, 0, 1), Color._clamp(saturation, 0, 1), @@ -143,7 +143,7 @@ class Color implements _StyleProperty, ColorBase { Rgba get rgba { var nextIndex = 0; - num a; + num? a; if (_argb.length == 8) { // Get alpha blending value 0..255 var alpha = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2)); @@ -200,8 +200,8 @@ class Color implements _StyleProperty, ColorBase { // Conversion routines: - static String _rgbToArgbString(int rgba, num alpha) { - int a; + static String _rgbToArgbString(int rgba, num? alpha) { + num? a; // If alpha is defined then adjust from 0..1 to 0..255 value, if not set // then a is left as undefined and passed to convertToHexString. if (alpha != null) { @@ -223,7 +223,7 @@ class Color implements _StyleProperty, ColorBase { /// Parse CSS expressions of the from #rgb, rgb(r,g,b), rgba(r,g,b,a), /// hsl(h,s,l), hsla(h,s,l,a) and SVG colors (e.g., darkSlateblue, etc.) and /// convert to argb. - static String _convertCssToArgb(String value) { + static String? _convertCssToArgb(String value) { // TODO(terry): Better parser/regex for converting CSS properties. var color = value.trim().replaceAll('\\s', ''); if (color[0] == '#') { @@ -257,9 +257,11 @@ class Color implements _StyleProperty, ColorBase { } switch (type) { case _rgbCss: - return Color.convertToHexString(args[0], args[1], args[2]); + return Color.convertToHexString( + args[0] as int, args[1] as int, args[2] as int); case _rgbaCss: - return Color.convertToHexString(args[0], args[1], args[2], args[3]); + return Color.convertToHexString( + args[0] as int, args[1] as int, args[2] as int, args[3]); case _hslCss: return Hsla(args[0], args[1], args[2]).toHexArgbString(); case _hslaCss: @@ -275,7 +277,7 @@ class Color implements _StyleProperty, ColorBase { static int hexToInt(String hex) => int.parse(hex, radix: 16); - static String convertToHexString(int r, int g, int b, [num a]) { + static String convertToHexString(int r, int g, int b, [num? a]) { var rHex = Color._numAs2DigitHex(Color._clamp(r, 0, 255)); var gHex = Color._numAs2DigitHex(Color._clamp(g, 0, 255)); var bHex = Color._numAs2DigitHex(Color._clamp(b, 0, 255)); @@ -298,7 +300,7 @@ class Color implements _StyleProperty, ColorBase { return hex; } - static num _clamp(num value, num min, num max) => + static T _clamp(T value, T min, T max) => math.max(math.min(max, value), min); /// Change the tint (make color lighter) or shade (make color darker) of all @@ -497,9 +499,9 @@ class Rgba implements _StyleProperty, ColorBase { final int r; final int g; final int b; - final num a; + final num? a; - Rgba(int red, int green, int blue, [num alpha]) + Rgba(int red, int green, int blue, [num? alpha]) : r = Color._clamp(red, 0, 255), g = Color._clamp(green, 0, 255), b = Color._clamp(blue, 0, 255), @@ -597,7 +599,7 @@ class Rgba implements _StyleProperty, ColorBase { int get argbValue { var value = 0; if (a != null) { - value = (a.toInt() << 0x18); + value = (a!.toInt() << 0x18); } value += (r << 0x10); value += (g << 0x08); @@ -623,13 +625,13 @@ class Hsla implements _StyleProperty, ColorBase { final num _h; // Value from 0..1 final num _s; // Value from 0..1 final num _l; // Value from 0..1 - final num _a; // Value from 0..1 + final num? _a; // Value from 0..1 /// [hue] is a 0..1 fraction of 360 degrees (360 == 0). /// [saturation] is a 0..1 fraction (100% == 1). /// [lightness] is a 0..1 fraction (100% == 1). /// [alpha] is a 0..1 fraction, alpha blending between 0..1, 1 == 100% opaque. - Hsla(num hue, num saturation, num lightness, [num alpha]) + Hsla(num hue, num saturation, num lightness, [num? alpha]) : _h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1), _s = Color._clamp(saturation, 0, 1), _l = Color._clamp(lightness, 0, 1), @@ -652,9 +654,7 @@ class Hsla implements _StyleProperty, ColorBase { var b = value.toInt() & 0xff; // Convert alpha to 0..1 from (0..255). - if (a != null) { - a = double.parse((a / 255).toStringAsPrecision(2)); - } + a = double.parse((a / 255).toStringAsPrecision(2)); return _createFromRgba(r, g, b, a); } @@ -662,7 +662,7 @@ class Hsla implements _StyleProperty, ColorBase { factory Hsla.fromRgba(Rgba rgba) => _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a); - static Hsla _createFromRgba(num r, num g, num b, num a) { + static Hsla _createFromRgba(num r, num g, num b, num? a) { // Convert RGB to hsl. // See site for good documentation // and color conversion routines. @@ -725,7 +725,7 @@ class Hsla implements _StyleProperty, ColorBase { num get lightnessPercentage => (_l * 100).round(); /// Returns number as 0..1 - num get alpha => _a; + num? get alpha => _a; @override bool operator ==(other) => Color.equal(this, other); @@ -759,7 +759,7 @@ class PointXY implements _StyleProperty { const PointXY(this.x, this.y); @override - String get cssExpression { + String? get cssExpression { // TODO(terry): TBD return null; } @@ -768,7 +768,7 @@ class PointXY implements _StyleProperty { // TODO(terry): Implement style and color. /// Supports border for measuring with layout. class Border implements _StyleProperty { - final int top, left, bottom, right; + final int? top, left, bottom, right; // TODO(terry): Just like CSS, 1-arg -> set all properties, 2-args -> top and // bottom are first arg, left and right are second, 3-args, and @@ -776,14 +776,14 @@ class Border implements _StyleProperty { const Border([this.top, this.left, this.bottom, this.right]); // TODO(terry): Consider using Size or width and height. - Border.uniform(num amount) + Border.uniform(int amount) : top = amount, left = amount, bottom = amount, right = amount; - int get width => left + right; - int get height => top + bottom; + int get width => left! + right!; + int get height => top! + bottom!; @override String get cssExpression { @@ -967,7 +967,7 @@ class Font implements _StyleProperty { // TODO(terry): Should support the values xx-small, small, large, xx-large, // etc. (mapped to a pixel sized font)? /// Font size in pixels. - final num size; + final num? size; // TODO(terry): _family should be an immutable list, wrapper class to do this // should exist in Dart. @@ -975,20 +975,20 @@ class Font implements _StyleProperty { /// the first known/supported font. There are two types of font families the /// family-name (e.g., arial, times, courier, etc) or the generic-family /// (e.g., serif, sans-seric, etc.) - final List family; + final List? family; /// Font weight from 100, 200, 300, 400, 500, 600, 700, 800, 900 - final int weight; + final int? weight; /// Style of a font normal, italic, oblique. - final String style; + final String? style; /// Font variant NORMAL (default) or SMALL_CAPS. Different set of font glyph /// lower case letters designed to have to fit within the font-height and /// weight of the corresponding lowercase letters. - final String variant; + final String? variant; - final LineHeight lineHeight; + final LineHeight? lineHeight; // TODO(terry): Size and computedLineHeight are in pixels. Need to figure out // how to handle in other units (specified in other units) like @@ -1015,7 +1015,7 @@ class Font implements _StyleProperty { /// Merge the two fonts and return the result. See [Style.merge] for /// more information. - factory Font.merge(Font a, Font b) { + static Font? merge(Font? a, Font? b) { if (a == null) return b; if (b == null) return a; return Font._merge(a, b); @@ -1050,7 +1050,7 @@ class Font implements _StyleProperty { } Font scale(num ratio) => Font( - size: size * ratio, + size: size! * ratio, family: family, weight: weight, style: style, @@ -1063,34 +1063,33 @@ class Font implements _StyleProperty { /// ~1.2, and CSS suggest a ration from 1 to 1.2 of the font-size when /// computing line-height. The Font class constructor has the computation for /// _lineHeight. - num get lineHeightInPixels { + num? get lineHeightInPixels { if (lineHeight != null) { - if (lineHeight.inPixels) { - return lineHeight.height; + if (lineHeight!.inPixels) { + return lineHeight!.height; } else { - return (size != null) ? lineHeight.height * size : null; + return (size != null) ? lineHeight!.height * size! : null; } } else { - return (size != null) ? size * 1.2 : null; + return (size != null) ? size! * 1.2 : null; } } @override int get hashCode { // TODO(jimhug): Lot's of potential collisions here. List of fonts, etc. - return size.toInt() % family[0].hashCode; + return size!.toInt() % family![0].hashCode; } @override bool operator ==(other) { if (other is! Font) return false; - Font o = other; - return o.size == size && - o.family == family && - o.weight == weight && - o.lineHeight == lineHeight && - o.style == style && - o.variant == variant; + return other.size == size && + other.family == family && + other.weight == weight && + other.lineHeight == lineHeight && + other.style == style && + other.variant == variant; } // TODO(terry): This is fragile should probably just iterate through the list @@ -1113,16 +1112,16 @@ class Font implements _StyleProperty { /// [box model]: https://developer.mozilla.org/en/CSS/box_model class BoxEdge { /// The size of the left edge, or null if the style has no edge. - final num left; + final num? left; /// The size of the top edge, or null if the style has no edge. - final num top; + final num? top; /// The size of the right edge, or null if the style has no edge. - final num right; + final num? right; /// The size of the bottom edge, or null if the style has no edge. - final num bottom; + final num? bottom; /// Creates a box edge with the specified [left], [top], [right], and /// [bottom] width. @@ -1145,7 +1144,7 @@ class BoxEdge { /// Takes a possibly null box edge, with possibly null metrics, and fills /// them in with 0 instead. - factory BoxEdge.nonNull(BoxEdge other) { + factory BoxEdge.nonNull(BoxEdge? other) { if (other == null) return const BoxEdge(0, 0, 0, 0); var left = other.left; var top = other.top; @@ -1173,7 +1172,7 @@ class BoxEdge { /// Merge the two box edge sizes and return the result. See [Style.merge] for /// more information. - factory BoxEdge.merge(BoxEdge x, BoxEdge y) { + static BoxEdge? merge(BoxEdge? x, BoxEdge? y) { if (x == null) return y; if (y == null) return x; return BoxEdge._merge(x, y); diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index 444b8ee54..f3a2885a2 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -47,7 +47,7 @@ class LiteralToken extends Token { /// A token containing error information. class ErrorToken extends Token { - String message; + String? message; ErrorToken(int kind, FileSpan span, this.message) : super(kind, span); } diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index 492800ee2..32cbd69ba 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -518,7 +518,7 @@ class TokenKind { return matchList(MEDIA_OPERATORS, 'type', text, offset, length); } - static String idToValue(var identList, int tokenId) { + static String? idToValue(var identList, int tokenId) { for (var entry in identList) { if (tokenId == entry['type']) { return entry['value']; @@ -546,19 +546,20 @@ class TokenKind { /// Match color name, case insensitive match and return the associated color /// entry from _EXTENDED_COLOR_NAMES list, return [:null:] if not found. - static Map matchColorName(String text) { + static Map? matchColorName(String text) { var name = text.toLowerCase(); - return _EXTENDED_COLOR_NAMES.firstWhere((e) => e['name'] == name, - orElse: () => null); + for (var color in _EXTENDED_COLOR_NAMES) { + if (color['name'] == name) return color; + } + return null; } /// Return RGB value as [int] from a color entry in _EXTENDED_COLOR_NAMES. static int colorValue(Map entry) { - assert(entry != null); return entry['value']; } - static String hexToColorName(hexValue) { + static String? hexToColorName(hexValue) { for (final entry in _EXTENDED_COLOR_NAMES) { if (entry['value'] == hexValue) { return entry['name']; diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index de28cb35d..07316be79 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -176,8 +176,7 @@ class Tokenizer extends TokenizerBase { } return _finishToken(TokenKind.DOLLAR); case TokenChar.BANG: - var tok = finishIdentifier(); - return (tok == null) ? _finishToken(TokenKind.BANG) : tok; + return finishIdentifier(); default: // TODO(jmesserly): this is used for IE8 detection; I'm not sure it's // appropriate outside of a few specific places; certainly shouldn't @@ -243,7 +242,7 @@ class Tokenizer extends TokenizerBase { } @override - Token _errorToken([String message]) { + Token _errorToken([String? message]) { return _finishToken(TokenKind.ERROR); } diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index 5f221120a..bb44fee59 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -111,7 +111,7 @@ abstract class TokenizerBase { return Token(kind, _file.span(_startIndex, _index)); } - Token _errorToken([String message]) { + Token _errorToken([String? message]) { return ErrorToken( TokenKind.ERROR, _file.span(_startIndex, _index), message); } @@ -186,7 +186,7 @@ abstract class TokenizerBase { } } - int readHex([int hexLength]) { + int readHex([int? hexLength]) { int maxIndex; if (hexLength == null) { maxIndex = _text.length - 1; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index d1c330f31..2e987ce94 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -11,7 +11,7 @@ part of '../visitor.dart'; class Identifier extends TreeNode { String name; - Identifier(this.name, SourceSpan span) : super(span); + Identifier(this.name, SourceSpan? span) : super(span); @override Identifier clone() => Identifier(name, span); @@ -29,7 +29,7 @@ class Identifier extends TreeNode { } class Wildcard extends TreeNode { - Wildcard(SourceSpan span) : super(span); + Wildcard(SourceSpan? span) : super(span); @override Wildcard clone() => Wildcard(span); @override @@ -39,7 +39,7 @@ class Wildcard extends TreeNode { } class ThisOperator extends TreeNode { - ThisOperator(SourceSpan span) : super(span); + ThisOperator(SourceSpan? span) : super(span); @override ThisOperator clone() => ThisOperator(span); @override @@ -49,7 +49,7 @@ class ThisOperator extends TreeNode { } class Negation extends TreeNode { - Negation(SourceSpan span) : super(span); + Negation(SourceSpan? span) : super(span); @override Negation clone() => Negation(span); @override @@ -64,7 +64,7 @@ class Negation extends TreeNode { class CalcTerm extends LiteralTerm { final LiteralTerm expr; - CalcTerm(var value, String t, this.expr, SourceSpan span) + CalcTerm(var value, String t, this.expr, SourceSpan? span) : super(value, t, span); @override @@ -80,7 +80,7 @@ class CalcTerm extends LiteralTerm { class CssComment extends TreeNode { final String comment; - CssComment(this.comment, SourceSpan span) : super(span); + CssComment(this.comment, SourceSpan? span) : super(span); @override CssComment clone() => CssComment(comment, span); @override @@ -89,7 +89,7 @@ class CssComment extends TreeNode { // CDO/CDC (Comment Definition Open ). class CommentDefinition extends CssComment { - CommentDefinition(String comment, SourceSpan span) : super(comment, span); + CommentDefinition(String comment, SourceSpan? span) : super(comment, span); @override CommentDefinition clone() => CommentDefinition(comment, span); @override @@ -99,7 +99,7 @@ class CommentDefinition extends CssComment { class SelectorGroup extends TreeNode { final List selectors; - SelectorGroup(this.selectors, SourceSpan span) : super(span); + SelectorGroup(this.selectors, SourceSpan? span) : super(span); @override SelectorGroup clone() => SelectorGroup(selectors, span); @@ -111,7 +111,7 @@ class SelectorGroup extends TreeNode { class Selector extends TreeNode { final List simpleSelectorSequences; - Selector(this.simpleSelectorSequences, SourceSpan span) : super(span); + Selector(this.simpleSelectorSequences, SourceSpan? span) : super(span); void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq); @@ -134,7 +134,7 @@ class SimpleSelectorSequence extends TreeNode { int combinator; final SimpleSelector simpleSelector; - SimpleSelectorSequence(this.simpleSelector, SourceSpan span, + SimpleSelectorSequence(this.simpleSelector, SourceSpan? span, [int combinator = TokenKind.COMBINATOR_NONE]) : combinator = combinator, super(span); @@ -178,7 +178,7 @@ class SimpleSelectorSequence extends TreeNode { abstract class SimpleSelector extends TreeNode { final dynamic _name; // Wildcard, ThisOperator, Identifier, Negation, others? - SimpleSelector(this._name, SourceSpan span) : super(span); + SimpleSelector(this._name, SourceSpan? span) : super(span); String get name => _name.name; @@ -192,7 +192,7 @@ abstract class SimpleSelector extends TreeNode { // element name class ElementSelector extends SimpleSelector { - ElementSelector(name, SourceSpan span) : super(name, span); + ElementSelector(name, SourceSpan? span) : super(name, span); @override dynamic visit(VisitorBase visitor) => visitor.visitElementSelector(this); @@ -207,7 +207,7 @@ class ElementSelector extends SimpleSelector { class NamespaceSelector extends SimpleSelector { final dynamic _namespace; // null, Wildcard or Identifier - NamespaceSelector(this._namespace, var name, SourceSpan span) + NamespaceSelector(this._namespace, var name, SourceSpan? span) : super(name, span); String get namespace => @@ -215,7 +215,7 @@ class NamespaceSelector extends SimpleSelector { bool get isNamespaceWildcard => _namespace is Wildcard; - SimpleSelector get nameAsSimpleSelector => _name; + SimpleSelector? get nameAsSimpleSelector => _name; @override NamespaceSelector clone() => NamespaceSelector(_namespace, '', span); @@ -224,7 +224,7 @@ class NamespaceSelector extends SimpleSelector { dynamic visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); @override - String toString() => '$namespace|${nameAsSimpleSelector.name}'; + String toString() => '$namespace|${nameAsSimpleSelector!.name}'; } // [attr op value] @@ -232,12 +232,12 @@ class AttributeSelector extends SimpleSelector { final int _op; final dynamic value; - AttributeSelector(Identifier name, this._op, this.value, SourceSpan span) + AttributeSelector(Identifier name, this._op, this.value, SourceSpan? span) : super(name, span); int get operatorKind => _op; - String matchOperator() { + String? matchOperator() { switch (_op) { case TokenKind.EQUALS: return '='; @@ -258,7 +258,7 @@ class AttributeSelector extends SimpleSelector { } // Return the TokenKind for operator used by visitAttributeSelector. - String matchOperatorAsTokenString() { + String? matchOperatorAsTokenString() { switch (_op) { case TokenKind.EQUALS: return 'EQUALS'; @@ -300,7 +300,7 @@ class AttributeSelector extends SimpleSelector { // #id class IdSelector extends SimpleSelector { - IdSelector(Identifier name, SourceSpan span) : super(name, span); + IdSelector(Identifier name, SourceSpan? span) : super(name, span); @override IdSelector clone() => IdSelector(_name, span); @override @@ -312,7 +312,7 @@ class IdSelector extends SimpleSelector { // .class class ClassSelector extends SimpleSelector { - ClassSelector(Identifier name, SourceSpan span) : super(name, span); + ClassSelector(Identifier name, SourceSpan? span) : super(name, span); @override ClassSelector clone() => ClassSelector(_name, span); @override @@ -324,7 +324,7 @@ class ClassSelector extends SimpleSelector { // :pseudoClass class PseudoClassSelector extends SimpleSelector { - PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span); + PseudoClassSelector(Identifier name, SourceSpan? span) : super(name, span); @override dynamic visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); @@ -340,7 +340,7 @@ class PseudoElementSelector extends SimpleSelector { // If true, this is a CSS2.1 pseudo-element with only a single ':'. final bool isLegacy; - PseudoElementSelector(Identifier name, SourceSpan span, + PseudoElementSelector(Identifier name, SourceSpan? span, {this.isLegacy = false}) : super(name, span); @override @@ -358,7 +358,7 @@ class PseudoElementSelector extends SimpleSelector { class PseudoClassFunctionSelector extends PseudoClassSelector { final TreeNode argument; // Selector, SelectorExpression - PseudoClassFunctionSelector(Identifier name, this.argument, SourceSpan span) + PseudoClassFunctionSelector(Identifier name, this.argument, SourceSpan? span) : super(name, span); @override @@ -378,7 +378,7 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { final SelectorExpression expression; PseudoElementFunctionSelector( - Identifier name, this.expression, SourceSpan span) + Identifier name, this.expression, SourceSpan? span) : super(name, span); @override @@ -393,7 +393,10 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { class SelectorExpression extends TreeNode { final List expressions; - SelectorExpression(this.expressions, SourceSpan span) : super(span); + SelectorExpression(this.expressions, SourceSpan? span) : super(span); + + @override + SourceSpan get span => super.span!; @override SelectorExpression clone() { @@ -406,9 +409,9 @@ class SelectorExpression extends TreeNode { // :NOT(negation_arg) class NegationSelector extends SimpleSelector { - final SimpleSelector negationArg; + final SimpleSelector? negationArg; - NegationSelector(this.negationArg, SourceSpan span) + NegationSelector(this.negationArg, SourceSpan? span) : super(Negation(span), span); @override @@ -432,14 +435,17 @@ class StyleSheet extends TreeNode { /// Contains charset, ruleset, directives (media, page, etc.), and selectors. final List topLevels; - StyleSheet(this.topLevels, SourceSpan span) : super(span) { + StyleSheet(this.topLevels, SourceSpan? span) : super(span) { for (final node in topLevels) { assert(node is TopLevelProduction || node is Directive); } } /// Selectors only in this tree. - StyleSheet.selector(this.topLevels, SourceSpan span) : super(span); + StyleSheet.selector(this.topLevels, SourceSpan? span) : super(span); + + @override + SourceSpan get span => super.span!; @override StyleSheet clone() { @@ -452,7 +458,9 @@ class StyleSheet extends TreeNode { } class TopLevelProduction extends TreeNode { - TopLevelProduction(SourceSpan span) : super(span); + TopLevelProduction(SourceSpan? span) : super(span); + @override + SourceSpan get span => super.span!; @override TopLevelProduction clone() => TopLevelProduction(span); @override @@ -460,15 +468,15 @@ class TopLevelProduction extends TreeNode { } class RuleSet extends TopLevelProduction { - final SelectorGroup selectorGroup; + final SelectorGroup? selectorGroup; final DeclarationGroup declarationGroup; - RuleSet(this.selectorGroup, this.declarationGroup, SourceSpan span) + RuleSet(this.selectorGroup, this.declarationGroup, SourceSpan? span) : super(span); @override RuleSet clone() { - var cloneSelectorGroup = selectorGroup.clone(); + var cloneSelectorGroup = selectorGroup!.clone(); var cloneDeclarationGroup = declarationGroup.clone(); return RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); } @@ -478,11 +486,14 @@ class RuleSet extends TopLevelProduction { } class Directive extends TreeNode { - Directive(SourceSpan span) : super(span); + Directive(SourceSpan? span) : super(span); bool get isBuiltIn => true; // Known CSS directive? bool get isExtension => false; // SCSS extension? + @override + SourceSpan get span => super.span!; + @override Directive clone() => Directive(span); @override @@ -493,7 +504,7 @@ class DocumentDirective extends Directive { final List functions; final List groupRuleBody; - DocumentDirective(this.functions, this.groupRuleBody, SourceSpan span) + DocumentDirective(this.functions, this.groupRuleBody, SourceSpan? span) : super(span); @override @@ -514,15 +525,15 @@ class DocumentDirective extends Directive { } class SupportsDirective extends Directive { - final SupportsCondition condition; + final SupportsCondition? condition; final List groupRuleBody; - SupportsDirective(this.condition, this.groupRuleBody, SourceSpan span) + SupportsDirective(this.condition, this.groupRuleBody, SourceSpan? span) : super(span); @override SupportsDirective clone() { - var clonedCondition = condition.clone(); + var clonedCondition = condition!.clone() as SupportsCondition; var clonedGroupRuleBody = []; for (var rule in groupRuleBody) { clonedGroupRuleBody.add(rule.clone()); @@ -535,24 +546,27 @@ class SupportsDirective extends Directive { } abstract class SupportsCondition extends TreeNode { - SupportsCondition(SourceSpan span) : super(span); + SupportsCondition(SourceSpan? span) : super(span); + @override + SourceSpan get span => super.span!; } class SupportsConditionInParens extends SupportsCondition { /// A [Declaration] or nested [SupportsCondition]. - final TreeNode condition; + final TreeNode? condition; - SupportsConditionInParens(Declaration declaration, SourceSpan span) + SupportsConditionInParens(Declaration? declaration, SourceSpan? span) : condition = declaration, super(span); - SupportsConditionInParens.nested(SupportsCondition condition, SourceSpan span) + SupportsConditionInParens.nested( + SupportsCondition condition, SourceSpan? span) : condition = condition, super(span); @override SupportsConditionInParens clone() => - SupportsConditionInParens(condition.clone(), span); + SupportsConditionInParens(condition!.clone() as Declaration, span); @override dynamic visit(VisitorBase visitor) => @@ -562,7 +576,7 @@ class SupportsConditionInParens extends SupportsCondition { class SupportsNegation extends SupportsCondition { final SupportsConditionInParens condition; - SupportsNegation(this.condition, SourceSpan span) : super(span); + SupportsNegation(this.condition, SourceSpan? span) : super(span); @override SupportsNegation clone() => SupportsNegation(condition.clone(), span); @@ -574,7 +588,7 @@ class SupportsNegation extends SupportsCondition { class SupportsConjunction extends SupportsCondition { final List conditions; - SupportsConjunction(this.conditions, SourceSpan span) : super(span); + SupportsConjunction(this.conditions, SourceSpan? span) : super(span); @override SupportsConjunction clone() { @@ -592,7 +606,7 @@ class SupportsConjunction extends SupportsCondition { class SupportsDisjunction extends SupportsCondition { final List conditions; - SupportsDisjunction(this.conditions, SourceSpan span) : super(span); + SupportsDisjunction(this.conditions, SourceSpan? span) : super(span); @override SupportsDisjunction clone() { @@ -611,7 +625,7 @@ class ViewportDirective extends Directive { final String name; final DeclarationGroup declarations; - ViewportDirective(this.name, this.declarations, SourceSpan span) + ViewportDirective(this.name, this.declarations, SourceSpan? span) : super(span); @override @@ -629,7 +643,7 @@ class ImportDirective extends Directive { /// Any media queries for this import. final List mediaQueries; - ImportDirective(this.import, this.mediaQueries, SourceSpan span) + ImportDirective(this.import, this.mediaQueries, SourceSpan? span) : super(span); @override @@ -654,11 +668,14 @@ class MediaExpression extends TreeNode { final Expressions exprs; MediaExpression( - this.andOperator, this._mediaFeature, this.exprs, SourceSpan span) + this.andOperator, this._mediaFeature, this.exprs, SourceSpan? span) : super(span); String get mediaFeature => _mediaFeature.name; + @override + SourceSpan get span => super.span!; + @override MediaExpression clone() { var clonedExprs = exprs.clone(); @@ -682,19 +699,23 @@ class MediaExpression extends TreeNode { class MediaQuery extends TreeNode { /// not, only or no operator. final int _mediaUnary; - final Identifier _mediaType; + final Identifier? _mediaType; final List expressions; MediaQuery( - this._mediaUnary, this._mediaType, this.expressions, SourceSpan span) + this._mediaUnary, this._mediaType, this.expressions, SourceSpan? span) : super(span); bool get hasMediaType => _mediaType != null; - String get mediaType => _mediaType.name; + String get mediaType => _mediaType!.name; bool get hasUnary => _mediaUnary != -1; String get unary => - TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); + TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary)! + .toUpperCase(); + + @override + SourceSpan get span => super.span!; @override MediaQuery clone() { @@ -713,7 +734,7 @@ class MediaDirective extends Directive { final List mediaQueries; final List rules; - MediaDirective(this.mediaQueries, this.rules, SourceSpan span) : super(span); + MediaDirective(this.mediaQueries, this.rules, SourceSpan? span) : super(span); @override MediaDirective clone() { @@ -735,7 +756,7 @@ class MediaDirective extends Directive { class HostDirective extends Directive { final List rules; - HostDirective(this.rules, SourceSpan span) : super(span); + HostDirective(this.rules, SourceSpan? span) : super(span); @override HostDirective clone() { @@ -751,12 +772,12 @@ class HostDirective extends Directive { } class PageDirective extends Directive { - final String _ident; - final String _pseudoPage; + final String? _ident; + final String? _pseudoPage; final List _declsMargin; PageDirective( - this._ident, this._pseudoPage, this._declsMargin, SourceSpan span) + this._ident, this._pseudoPage, this._declsMargin, SourceSpan? span) : super(span); @override @@ -771,14 +792,14 @@ class PageDirective extends Directive { @override dynamic visit(VisitorBase visitor) => visitor.visitPageDirective(this); - bool get hasIdent => _ident != null && _ident.isNotEmpty; - bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.isNotEmpty; + bool get hasIdent => _ident?.isNotEmpty ?? false; + bool get hasPseudoPage => _pseudoPage?.isNotEmpty ?? false; } class CharsetDirective extends Directive { final String charEncoding; - CharsetDirective(this.charEncoding, SourceSpan span) : super(span); + CharsetDirective(this.charEncoding, SourceSpan? span) : super(span); @override CharsetDirective clone() => CharsetDirective(charEncoding, span); @override @@ -788,10 +809,10 @@ class CharsetDirective extends Directive { class KeyFrameDirective extends Directive { // Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-. final int _keyframeName; - final Identifier name; + final Identifier? name; final List _blocks; - KeyFrameDirective(this._keyframeName, this.name, SourceSpan span) + KeyFrameDirective(this._keyframeName, this.name, SourceSpan? span) : _blocks = [], super(span); @@ -799,7 +820,7 @@ class KeyFrameDirective extends Directive { _blocks.add(block); } - String get keyFrameName { + String? get keyFrameName { switch (_keyframeName) { case TokenKind.DIRECTIVE_KEYFRAMES: case TokenKind.DIRECTIVE_MS_KEYFRAMES: @@ -816,7 +837,7 @@ class KeyFrameDirective extends Directive { @override KeyFrameDirective clone() { - var directive = KeyFrameDirective(_keyframeName, name.clone(), span); + var directive = KeyFrameDirective(_keyframeName, name!.clone(), span); for (var block in _blocks) { directive.add(block.clone()); } @@ -831,7 +852,7 @@ class KeyFrameBlock extends Expression { final Expressions _blockSelectors; final DeclarationGroup _declarations; - KeyFrameBlock(this._blockSelectors, this._declarations, SourceSpan span) + KeyFrameBlock(this._blockSelectors, this._declarations, SourceSpan? span) : super(span); @override @@ -844,7 +865,7 @@ class KeyFrameBlock extends Expression { class FontFaceDirective extends Directive { final DeclarationGroup _declarations; - FontFaceDirective(this._declarations, SourceSpan span) : super(span); + FontFaceDirective(this._declarations, SourceSpan? span) : super(span); @override FontFaceDirective clone() => FontFaceDirective(_declarations.clone(), span); @@ -856,7 +877,7 @@ class StyletDirective extends Directive { final String dartClassName; final List rules; - StyletDirective(this.dartClassName, this.rules, SourceSpan span) + StyletDirective(this.dartClassName, this.rules, SourceSpan? span) : super(span); @override @@ -882,9 +903,9 @@ class NamespaceDirective extends Directive { final String _prefix; /// URI associated with this namespace. - final String _uri; + final String? _uri; - NamespaceDirective(this._prefix, this._uri, SourceSpan span) : super(span); + NamespaceDirective(this._prefix, this._uri, SourceSpan? span) : super(span); @override NamespaceDirective clone() => NamespaceDirective(_prefix, _uri, span); @@ -899,7 +920,7 @@ class NamespaceDirective extends Directive { class VarDefinitionDirective extends Directive { final VarDefinition def; - VarDefinitionDirective(this.def, SourceSpan span) : super(span); + VarDefinitionDirective(this.def, SourceSpan? span) : super(span); @override VarDefinitionDirective clone() => VarDefinitionDirective(def.clone(), span); @@ -914,7 +935,7 @@ class MixinDefinition extends Directive { final List definedArgs; final bool varArgs; - MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span) + MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan? span) : super(span); @override @@ -935,14 +956,14 @@ class MixinRulesetDirective extends MixinDefinition { final List rulesets; MixinRulesetDirective(String name, List args, bool varArgs, - this.rulesets, SourceSpan span) + this.rulesets, SourceSpan? span) : super(name, args, varArgs, span); @override MixinRulesetDirective clone() { var clonedArgs = []; for (var arg in definedArgs) { - clonedArgs.add(arg.clone()); + clonedArgs.add(arg.clone() as VarDefinition); } var clonedRulesets = []; for (var ruleset in rulesets) { @@ -961,7 +982,7 @@ class MixinDeclarationDirective extends MixinDefinition { final DeclarationGroup declarations; MixinDeclarationDirective(String name, List args, bool varArgs, - this.declarations, SourceSpan span) + this.declarations, SourceSpan? span) : super(name, args, varArgs, span); @override @@ -984,7 +1005,7 @@ class IncludeDirective extends Directive { final String name; final List> args; - IncludeDirective(this.name, this.args, SourceSpan span) : super(span); + IncludeDirective(this.name, this.args, SourceSpan? span) : super(span); @override IncludeDirective clone() { @@ -1001,18 +1022,18 @@ class IncludeDirective extends Directive { /// To support Sass @content. class ContentDirective extends Directive { - ContentDirective(SourceSpan span) : super(span); + ContentDirective(SourceSpan? span) : super(span); @override dynamic visit(VisitorBase visitor) => visitor.visitContentDirective(this); } class Declaration extends TreeNode { - final Identifier _property; - final Expression expression; + final Identifier? _property; + final Expression? expression; /// Style exposed to Dart. - DartStyleExpression dartStyle; + DartStyleExpression? dartStyle; final bool important; /// IE CSS hacks that can only be read by a particular IE version. @@ -1024,18 +1045,21 @@ class Declaration extends TreeNode { /// since an ident can start with underscore (e.g., `_background: red;`) final bool isIE7; - Declaration(this._property, this.expression, this.dartStyle, SourceSpan span, + Declaration(this._property, this.expression, this.dartStyle, SourceSpan? span, {this.important = false, bool ie7 = false}) : isIE7 = ie7, super(span); - String get property => isIE7 ? '*${_property.name}' : _property.name; + String get property => isIE7 ? '*${_property!.name}' : _property!.name; bool get hasDartStyle => dartStyle != null; + @override + SourceSpan get span => super.span!; + @override Declaration clone() => - Declaration(_property.clone(), expression.clone(), dartStyle, span, + Declaration(_property!.clone(), expression!.clone(), dartStyle, span, important: important); @override @@ -1051,14 +1075,14 @@ class Declaration extends TreeNode { class VarDefinition extends Declaration { bool badUsage = false; - VarDefinition(Identifier definedName, Expression expr, SourceSpan span) + VarDefinition(Identifier? definedName, Expression? expr, SourceSpan? span) : super(definedName, expr, null, span); - String get definedName => _property.name; + String get definedName => _property!.name; @override - VarDefinition clone() => VarDefinition( - _property.clone(), expression != null ? expression.clone() : null, span); + VarDefinition clone() => + VarDefinition(_property!.clone(), expression?.clone(), span); @override dynamic visit(VisitorBase visitor) => visitor.visitVarDefinition(this); @@ -1073,7 +1097,7 @@ class VarDefinition extends Declaration { class IncludeMixinAtDeclaration extends Declaration { final IncludeDirective include; - IncludeMixinAtDeclaration(this.include, SourceSpan span) + IncludeMixinAtDeclaration(this.include, SourceSpan? span) : super(null, null, null, span); @override @@ -1088,7 +1112,7 @@ class IncludeMixinAtDeclaration extends Declaration { class ExtendDeclaration extends Declaration { final List selectors; - ExtendDeclaration(this.selectors, SourceSpan span) + ExtendDeclaration(this.selectors, SourceSpan? span) : super(null, null, null, span); @override @@ -1105,7 +1129,10 @@ class DeclarationGroup extends TreeNode { /// Can be either Declaration or RuleSet (if nested selector). final List declarations; - DeclarationGroup(this.declarations, SourceSpan span) : super(span); + DeclarationGroup(this.declarations, SourceSpan? span) : super(span); + + @override + SourceSpan get span => super.span!; @override DeclarationGroup clone() { @@ -1120,7 +1147,7 @@ class DeclarationGroup extends TreeNode { class MarginGroup extends DeclarationGroup { final int margin_sym; // TokenType for for @margin sym. - MarginGroup(this.margin_sym, List decls, SourceSpan span) + MarginGroup(this.margin_sym, List decls, SourceSpan? span) : super(decls, span); @override MarginGroup clone() => @@ -1133,7 +1160,7 @@ class VarUsage extends Expression { final String name; final List defaultValues; - VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span); + VarUsage(this.name, this.defaultValues, SourceSpan? span) : super(span); @override VarUsage clone() { @@ -1149,7 +1176,7 @@ class VarUsage extends Expression { } class OperatorSlash extends Expression { - OperatorSlash(SourceSpan span) : super(span); + OperatorSlash(SourceSpan? span) : super(span); @override OperatorSlash clone() => OperatorSlash(span); @override @@ -1157,7 +1184,7 @@ class OperatorSlash extends Expression { } class OperatorComma extends Expression { - OperatorComma(SourceSpan span) : super(span); + OperatorComma(SourceSpan? span) : super(span); @override OperatorComma clone() => OperatorComma(span); @override @@ -1165,7 +1192,7 @@ class OperatorComma extends Expression { } class OperatorPlus extends Expression { - OperatorPlus(SourceSpan span) : super(span); + OperatorPlus(SourceSpan? span) : super(span); @override OperatorPlus clone() => OperatorPlus(span); @override @@ -1173,7 +1200,7 @@ class OperatorPlus extends Expression { } class OperatorMinus extends Expression { - OperatorMinus(SourceSpan span) : super(span); + OperatorMinus(SourceSpan? span) : super(span); @override OperatorMinus clone() => OperatorMinus(span); @override @@ -1181,10 +1208,10 @@ class OperatorMinus extends Expression { } class UnicodeRangeTerm extends Expression { - final String first; - final String second; + final String? first; + final String? second; - UnicodeRangeTerm(this.first, this.second, SourceSpan span) : super(span); + UnicodeRangeTerm(this.first, this.second, SourceSpan? span) : super(span); bool get hasSecond => second != null; @@ -1202,7 +1229,7 @@ class LiteralTerm extends Expression { dynamic value; String text; - LiteralTerm(this.value, this.text, SourceSpan span) : super(span); + LiteralTerm(this.value, this.text, SourceSpan? span) : super(span); @override LiteralTerm clone() => LiteralTerm(value, text, span); @@ -1212,7 +1239,7 @@ class LiteralTerm extends Expression { } class NumberTerm extends LiteralTerm { - NumberTerm(value, String t, SourceSpan span) : super(value, t, span); + NumberTerm(value, String t, SourceSpan? span) : super(value, t, span); @override NumberTerm clone() => NumberTerm(value, text, span); @override @@ -1222,7 +1249,8 @@ class NumberTerm extends LiteralTerm { class UnitTerm extends LiteralTerm { final int unit; - UnitTerm(value, String t, SourceSpan span, this.unit) : super(value, t, span); + UnitTerm(value, String t, SourceSpan? span, this.unit) + : super(value, t, span); @override UnitTerm clone() => UnitTerm(value, text, span, unit); @@ -1237,7 +1265,7 @@ class UnitTerm extends LiteralTerm { } class LengthTerm extends UnitTerm { - LengthTerm(value, String t, SourceSpan span, + LengthTerm(value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(this.unit == TokenKind.UNIT_LENGTH_PX || @@ -1254,7 +1282,7 @@ class LengthTerm extends UnitTerm { } class PercentageTerm extends LiteralTerm { - PercentageTerm(value, String t, SourceSpan span) : super(value, t, span); + PercentageTerm(value, String t, SourceSpan? span) : super(value, t, span); @override PercentageTerm clone() => PercentageTerm(value, text, span); @override @@ -1262,7 +1290,7 @@ class PercentageTerm extends LiteralTerm { } class EmTerm extends LiteralTerm { - EmTerm(value, String t, SourceSpan span) : super(value, t, span); + EmTerm(value, String t, SourceSpan? span) : super(value, t, span); @override EmTerm clone() => EmTerm(value, text, span); @override @@ -1270,7 +1298,7 @@ class EmTerm extends LiteralTerm { } class ExTerm extends LiteralTerm { - ExTerm(value, String t, SourceSpan span) : super(value, t, span); + ExTerm(value, String t, SourceSpan? span) : super(value, t, span); @override ExTerm clone() => ExTerm(value, text, span); @override @@ -1278,7 +1306,7 @@ class ExTerm extends LiteralTerm { } class AngleTerm extends UnitTerm { - AngleTerm(var value, String t, SourceSpan span, + AngleTerm(var value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(this.unit == TokenKind.UNIT_ANGLE_DEG || @@ -1294,7 +1322,7 @@ class AngleTerm extends UnitTerm { } class TimeTerm extends UnitTerm { - TimeTerm(var value, String t, SourceSpan span, + TimeTerm(var value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(this.unit == TokenKind.UNIT_ANGLE_DEG || @@ -1309,7 +1337,7 @@ class TimeTerm extends UnitTerm { } class FreqTerm extends UnitTerm { - FreqTerm(var value, String t, SourceSpan span, + FreqTerm(var value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); @@ -1322,7 +1350,7 @@ class FreqTerm extends UnitTerm { } class FractionTerm extends LiteralTerm { - FractionTerm(var value, String t, SourceSpan span) : super(value, t, span); + FractionTerm(var value, String t, SourceSpan? span) : super(value, t, span); @override FractionTerm clone() => FractionTerm(value, text, span); @@ -1331,7 +1359,7 @@ class FractionTerm extends LiteralTerm { } class UriTerm extends LiteralTerm { - UriTerm(String value, SourceSpan span) : super(value, value, span); + UriTerm(String value, SourceSpan? span) : super(value, value, span); @override UriTerm clone() => UriTerm(value, span); @@ -1340,7 +1368,7 @@ class UriTerm extends LiteralTerm { } class ResolutionTerm extends UnitTerm { - ResolutionTerm(var value, String t, SourceSpan span, + ResolutionTerm(var value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_RESOLUTION_DPI || @@ -1355,7 +1383,7 @@ class ResolutionTerm extends UnitTerm { } class ChTerm extends UnitTerm { - ChTerm(var value, String t, SourceSpan span, + ChTerm(var value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_CH); @@ -1368,7 +1396,7 @@ class ChTerm extends UnitTerm { } class RemTerm extends UnitTerm { - RemTerm(var value, String t, SourceSpan span, + RemTerm(var value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_REM); @@ -1381,7 +1409,7 @@ class RemTerm extends UnitTerm { } class ViewportTerm extends UnitTerm { - ViewportTerm(var value, String t, SourceSpan span, + ViewportTerm(var value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_VIEWPORT_VW || @@ -1400,7 +1428,7 @@ class ViewportTerm extends UnitTerm { class BAD_HEX_VALUE {} class HexColorTerm extends LiteralTerm { - HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span); + HexColorTerm(var value, String t, SourceSpan? span) : super(value, t, span); @override HexColorTerm clone() => HexColorTerm(value, text, span); @@ -1411,7 +1439,7 @@ class HexColorTerm extends LiteralTerm { class FunctionTerm extends LiteralTerm { final Expressions _params; - FunctionTerm(var value, String t, this._params, SourceSpan span) + FunctionTerm(var value, String t, this._params, SourceSpan? span) : super(value, t, span); @override @@ -1424,7 +1452,7 @@ class FunctionTerm extends LiteralTerm { /// This is an IE trick to ignore a property or value except by IE 8 and older /// browsers. class IE8Term extends LiteralTerm { - IE8Term(SourceSpan span) : super('\\9', '\\9', span); + IE8Term(SourceSpan? span) : super('\\9', '\\9', span); @override IE8Term clone() => IE8Term(span); @override @@ -1434,7 +1462,7 @@ class IE8Term extends LiteralTerm { class GroupTerm extends Expression { final List _terms; - GroupTerm(SourceSpan span) + GroupTerm(SourceSpan? span) : _terms = [], super(span); @@ -1449,7 +1477,7 @@ class GroupTerm extends Expression { } class ItemTerm extends NumberTerm { - ItemTerm(dynamic value, String t, SourceSpan span) : super(value, t, span); + ItemTerm(dynamic value, String t, SourceSpan? span) : super(value, t, span); @override ItemTerm clone() => ItemTerm(value, text, span); @@ -1460,7 +1488,7 @@ class ItemTerm extends NumberTerm { class Expressions extends Expression { final List expressions = []; - Expressions(SourceSpan span) : super(span); + Expressions(SourceSpan? span) : super(span); void add(Expression expression) { expressions.add(expression); @@ -1484,7 +1512,7 @@ class BinaryExpression extends Expression { final Expression x; final Expression y; - BinaryExpression(this.op, this.x, this.y, SourceSpan span) : super(span); + BinaryExpression(this.op, this.x, this.y, SourceSpan? span) : super(span); @override BinaryExpression clone() => BinaryExpression(op, x.clone(), y.clone(), span); @@ -1496,7 +1524,7 @@ class UnaryExpression extends Expression { final Token op; final Expression self; - UnaryExpression(this.op, this.self, SourceSpan span) : super(span); + UnaryExpression(this.op, this.self, SourceSpan? span) : super(span); @override UnaryExpression clone() => UnaryExpression(op, self.clone(), span); @@ -1513,15 +1541,15 @@ abstract class DartStyleExpression extends TreeNode { static const int heightStyle = 5; static const int widthStyle = 6; - final int _styleType; - int priority; + final int? _styleType; + int? priority; - DartStyleExpression(this._styleType, SourceSpan span) : super(span); + DartStyleExpression(this._styleType, SourceSpan? span) : super(span); // Merges give 2 DartStyleExpression (or derived from DartStyleExpression, // e.g., FontExpression, etc.) will merge if the two expressions are of the // same property name (implies same exact type e.g, FontExpression). - DartStyleExpression merged(DartStyleExpression newDartExpr); + DartStyleExpression? merged(DartStyleExpression newDartExpr); bool get isUnknown => _styleType == 0 || _styleType == null; bool get isFont => _styleType == fontStyle; @@ -1534,6 +1562,9 @@ abstract class DartStyleExpression extends TreeNode { bool isSame(DartStyleExpression other) => _styleType == other._styleType; + @override + SourceSpan get span => super.span!; + @override dynamic visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); } @@ -1544,13 +1575,13 @@ class FontExpression extends DartStyleExpression { // font-style font-variant font-weight font-size/line-height font-family // TODO(terry): Only px/pt for now need to handle all possible units to // support calc expressions on units. - FontExpression(SourceSpan span, - {Object /* LengthTerm | num */ size, - List family, - int weight, - String style, - String variant, - LineHeight lineHeight}) + FontExpression(SourceSpan? span, + {Object? /* LengthTerm | num */ size, + List? family, + int? weight, + String? style, + String? variant, + LineHeight? lineHeight}) : font = Font( size: size is LengthTerm ? size.value : size as num, family: family, @@ -1561,7 +1592,7 @@ class FontExpression extends DartStyleExpression { super(DartStyleExpression.fontStyle, span); @override - FontExpression merged(DartStyleExpression newFontExpr) { + FontExpression? merged(DartStyleExpression newFontExpr) { if (newFontExpr is FontExpression && isFont && newFontExpr.isFont) { return FontExpression.merge(this, newFontExpr); } @@ -1573,8 +1604,8 @@ class FontExpression extends DartStyleExpression { return FontExpression._merge(x, y, y.span); } - FontExpression._merge(FontExpression x, FontExpression y, SourceSpan span) - : font = Font.merge(x.font, y.font), + FontExpression._merge(FontExpression x, FontExpression y, SourceSpan? span) + : font = Font.merge(x.font, y.font)!, super(DartStyleExpression.fontStyle, span); @override @@ -1591,22 +1622,24 @@ class FontExpression extends DartStyleExpression { } abstract class BoxExpression extends DartStyleExpression { - final BoxEdge box; + final BoxEdge? box; - BoxExpression(int styleType, SourceSpan span, this.box) + BoxExpression(int? styleType, SourceSpan? span, this.box) : super(styleType, span); @override dynamic visit(VisitorBase visitor) => visitor.visitBoxExpression(this); String get formattedBoxEdge { - if (box.top == box.left && box.top == box.bottom && box.top == box.right) { - return '.uniform(${box.top})'; + if (box!.top == box!.left && + box!.top == box!.bottom && + box!.top == box!.right) { + return '.uniform(${box!.top})'; } else { - var left = box.left ?? 0; - var top = box.top ?? 0; - var right = box.right ?? 0; - var bottom = box.bottom ?? 0; + var left = box!.left ?? 0; + var top = box!.top ?? 0; + var right = box!.right ?? 0; + var bottom = box!.bottom ?? 0; return '.clockwiseFromTop($top,$right,$bottom,$left)'; } } @@ -1615,15 +1648,16 @@ abstract class BoxExpression extends DartStyleExpression { class MarginExpression extends BoxExpression { // TODO(terry): Does auto for margin need to be exposed to Dart UI framework? /// Margin expression ripped apart. - MarginExpression(SourceSpan span, {num top, num right, num bottom, num left}) + MarginExpression(SourceSpan? span, + {num? top, num? right, num? bottom, num? left}) : super(DartStyleExpression.marginStyle, span, BoxEdge(left, top, right, bottom)); - MarginExpression.boxEdge(SourceSpan span, BoxEdge box) + MarginExpression.boxEdge(SourceSpan? span, BoxEdge? box) : super(DartStyleExpression.marginStyle, span, box); @override - MarginExpression merged(DartStyleExpression newMarginExpr) { + MarginExpression? merged(DartStyleExpression newMarginExpr) { if (newMarginExpr is MarginExpression && isMargin && newMarginExpr.isMargin) { @@ -1639,12 +1673,12 @@ class MarginExpression extends BoxExpression { } MarginExpression._merge( - MarginExpression x, MarginExpression y, SourceSpan span) + MarginExpression x, MarginExpression y, SourceSpan? span) : super(x._styleType, span, BoxEdge.merge(x.box, y.box)); @override MarginExpression clone() => MarginExpression(span, - top: box.top, right: box.right, bottom: box.bottom, left: box.left); + top: box!.top, right: box!.right, bottom: box!.bottom, left: box!.left); @override dynamic visit(VisitorBase visitor) => visitor.visitMarginExpression(this); @@ -1652,15 +1686,16 @@ class MarginExpression extends BoxExpression { class BorderExpression extends BoxExpression { /// Border expression ripped apart. - BorderExpression(SourceSpan span, {num top, num right, num bottom, num left}) + BorderExpression(SourceSpan? span, + {num? top, num? right, num? bottom, num? left}) : super(DartStyleExpression.borderStyle, span, BoxEdge(left, top, right, bottom)); - BorderExpression.boxEdge(SourceSpan span, BoxEdge box) + BorderExpression.boxEdge(SourceSpan? span, BoxEdge box) : super(DartStyleExpression.borderStyle, span, box); @override - BorderExpression merged(DartStyleExpression newBorderExpr) { + BorderExpression? merged(DartStyleExpression newBorderExpr) { if (newBorderExpr is BorderExpression && isBorder && newBorderExpr.isBorder) { @@ -1676,13 +1711,13 @@ class BorderExpression extends BoxExpression { } BorderExpression._merge( - BorderExpression x, BorderExpression y, SourceSpan span) + BorderExpression x, BorderExpression y, SourceSpan? span) : super( DartStyleExpression.borderStyle, span, BoxEdge.merge(x.box, y.box)); @override BorderExpression clone() => BorderExpression(span, - top: box.top, right: box.right, bottom: box.bottom, left: box.left); + top: box!.top, right: box!.right, bottom: box!.bottom, left: box!.left); @override dynamic visit(VisitorBase visitor) => visitor.visitBorderExpression(this); @@ -1691,15 +1726,15 @@ class BorderExpression extends BoxExpression { class HeightExpression extends DartStyleExpression { final dynamic height; - HeightExpression(SourceSpan span, this.height) + HeightExpression(SourceSpan? span, this.height) : super(DartStyleExpression.heightStyle, span); @override - HeightExpression merged(DartStyleExpression newHeightExpr) { + HeightExpression? merged(DartStyleExpression newHeightExpr) { if (newHeightExpr is DartStyleExpression && isHeight && newHeightExpr.isHeight) { - return newHeightExpr; + return newHeightExpr as HeightExpression; } return null; @@ -1714,11 +1749,11 @@ class HeightExpression extends DartStyleExpression { class WidthExpression extends DartStyleExpression { final dynamic width; - WidthExpression(SourceSpan span, this.width) + WidthExpression(SourceSpan? span, this.width) : super(DartStyleExpression.widthStyle, span); @override - WidthExpression merged(DartStyleExpression newWidthExpr) { + WidthExpression? merged(DartStyleExpression newWidthExpr) { if (newWidthExpr is WidthExpression && isWidth && newWidthExpr.isWidth) { return newWidthExpr; } @@ -1734,15 +1769,16 @@ class WidthExpression extends DartStyleExpression { class PaddingExpression extends BoxExpression { /// Padding expression ripped apart. - PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left}) + PaddingExpression(SourceSpan? span, + {num? top, num? right, num? bottom, num? left}) : super(DartStyleExpression.paddingStyle, span, BoxEdge(left, top, right, bottom)); - PaddingExpression.boxEdge(SourceSpan span, BoxEdge box) + PaddingExpression.boxEdge(SourceSpan? span, BoxEdge? box) : super(DartStyleExpression.paddingStyle, span, box); @override - PaddingExpression merged(DartStyleExpression newPaddingExpr) { + PaddingExpression? merged(DartStyleExpression newPaddingExpr) { if (newPaddingExpr is PaddingExpression && isPadding && newPaddingExpr.isPadding) { @@ -1758,13 +1794,13 @@ class PaddingExpression extends BoxExpression { } PaddingExpression._merge( - PaddingExpression x, PaddingExpression y, SourceSpan span) + PaddingExpression x, PaddingExpression y, SourceSpan? span) : super(DartStyleExpression.paddingStyle, span, BoxEdge.merge(x.box, y.box)); @override PaddingExpression clone() => PaddingExpression(span, - top: box.top, right: box.right, bottom: box.bottom, left: box.left); + top: box!.top, right: box!.right, bottom: box!.bottom, left: box!.left); @override dynamic visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); } diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index eef1849d2..dc7aa766b 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -7,7 +7,7 @@ part of '../visitor.dart'; /// The base type for all nodes in a CSS abstract syntax tree. abstract class TreeNode { /// The source code this [TreeNode] represents. - final SourceSpan span; + final SourceSpan? span; TreeNode(this.span); @@ -27,14 +27,16 @@ abstract class TreeNode { /// The base type for expressions. abstract class Expression extends TreeNode { - Expression(SourceSpan span) : super(span); + Expression(SourceSpan? span) : super(span); + @override + Expression clone(); } /// Simple class to provide a textual dump of trees for debugging. class TreeOutput { int depth = 0; final StringBuffer buf = StringBuffer(); - VisitorBase printer; + VisitorBase? printer; void write(String s) { for (var i = 0; i < depth; i++) { @@ -66,11 +68,11 @@ class TreeOutput { } } - void writeNode(String label, TreeNode node) { + void writeNode(String label, TreeNode? node) { write('${label}: '); depth += 1; if (node != null) { - node.visit(printer); + node.visit(printer!); } else { writeln('null'); } @@ -82,16 +84,12 @@ class TreeOutput { writeln('${label}: ${v}'); } - void writeNodeList(String label, List list) { + void writeNodeList(String label, List? list) { writeln('${label} ['); if (list != null) { depth += 1; for (var node in list) { - if (node != null) { - node.visit(printer); - } else { - writeln('null'); - } + node.visit(printer!); } depth -= 1; writeln(']'); diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index b53f21460..72f1223f4 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -374,7 +374,7 @@ class _TreePrinter extends Visitor { super.visitNamespaceSelector(node); - visitSimpleSelector(node.nameAsSimpleSelector); + visitSimpleSelector(node.nameAsSimpleSelector!); output.depth--; } diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index 4d255e235..ec54553bd 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -7,7 +7,7 @@ import 'package:source_span/source_span.dart'; /// Can be thrown on any Css runtime problem includes source location. class CssSelectorException extends SourceSpanException { - CssSelectorException(String message, [SourceSpan span]) + CssSelectorException(String message, [SourceSpan? span]) : super(message, span); } diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index d88081bf9..de30efc41 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -175,13 +175,13 @@ class Visitor implements VisitorBase { @override dynamic visitSupportsDirective(SupportsDirective node) { - node.condition.visit(this); + node.condition!.visit(this); _visitNodeList(node.groupRuleBody); } @override dynamic visitSupportsConditionInParens(SupportsConditionInParens node) { - node.condition.visit(this); + node.condition!.visit(this); } @override @@ -238,7 +238,7 @@ class Visitor implements VisitorBase { @override dynamic visitKeyFrameDirective(KeyFrameDirective node) { - visitIdentifier(node.name); + visitIdentifier(node.name!); _visitNodeList(node._blocks); } @@ -294,7 +294,7 @@ class Visitor implements VisitorBase { @override dynamic visitRuleSet(RuleSet node) { - visitSelectorGroup(node.selectorGroup); + visitSelectorGroup(node.selectorGroup!); visitDeclarationGroup(node.declarationGroup); } @@ -308,14 +308,14 @@ class Visitor implements VisitorBase { @override dynamic visitDeclaration(Declaration node) { - visitIdentifier(node._property); - if (node.expression != null) node.expression.visit(this); + visitIdentifier(node._property!); + if (node.expression != null) node.expression!.visit(this); } @override dynamic visitVarDefinition(VarDefinition node) { - visitIdentifier(node._property); - if (node.expression != null) node.expression.visit(this); + visitIdentifier(node._property!); + if (node.expression != null) node.expression!.visit(this); } @override @@ -350,7 +350,7 @@ class Visitor implements VisitorBase { dynamic visitNamespaceSelector(NamespaceSelector node) { if (node._namespace != null) node._namespace.visit(this); if (node.nameAsSimpleSelector != null) { - node.nameAsSimpleSelector.visit(this); + node.nameAsSimpleSelector!.visit(this); } } diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 62773b9cf..53be25666 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,15 +1,19 @@ name: csslib -version: 0.16.3-dev +version: 0.17.0-nullsafety-dev description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib environment: - sdk: '>=2.2.0 <3.0.0' + sdk: '>=2.10.0-2.0.dev <2.10.0' dependencies: - source_span: ^1.4.0 + source_span: ^1.8.0-nullsafety dev_dependencies: - pedantic: ^1.0.0 - test: ^1.2.0 + pedantic: ^1.10.0-nullsafety + test: ^1.16.0-nullsafety.2 + +dependency_overrides: + analyzer: 0.40.0 + html: 0.14.0+3 diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart index 000177752..75bc910c6 100644 --- a/pkgs/csslib/test/big_1_test.dart +++ b/pkgs/csslib/test/big_1_test.dart @@ -11,7 +11,6 @@ import 'testing.dart'; void compilePolyfillAndValidate(String input, String generated) { var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index a692a64f4..a27bde193 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -16,7 +16,6 @@ void testClass() { var input = '.foobar {}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -26,10 +25,11 @@ void testClass() { expect(stylesheet.topLevels[0] is RuleSet, true); var ruleset = stylesheet.topLevels[0] as RuleSet; - expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - var selectorSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + var selectorSeqs = + ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(selectorSeqs.length, 1); final simpSelector = selectorSeqs[0].simpleSelector; expect(simpSelector is ClassSelector, true); @@ -42,7 +42,6 @@ void testClass2() { var input = '.foobar .bar .no-story {}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -51,10 +50,10 @@ void testClass2() { expect(stylesheet.topLevels[0] is RuleSet, true); var ruleset = stylesheet.topLevels[0] as RuleSet; - expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + var simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 3); var simpSelector0 = simpleSeqs[0].simpleSelector; @@ -78,7 +77,6 @@ void testId() { var input = '#elemId {}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -87,10 +85,10 @@ void testId() { expect(stylesheet.topLevels[0] is RuleSet, true); var ruleset = stylesheet.topLevels[0] as RuleSet; - expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + var simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 1); var simpSelector = simpleSeqs[0].simpleSelector; @@ -104,7 +102,6 @@ void testElement() { var input = 'div {}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -113,10 +110,10 @@ void testElement() { expect(stylesheet.topLevels[0] is RuleSet, true); var ruleset = stylesheet.topLevels[0] as RuleSet; - expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + var simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 1); @@ -128,7 +125,6 @@ void testElement() { input = 'div div span {}'; stylesheet = parseCss(input, errors: errors..clear()); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -136,11 +132,11 @@ void testElement() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - ruleset = stylesheet.topLevels[0]; - expect(ruleset.selectorGroup.selectors.length, 1); + ruleset = stylesheet.topLevels[0] as RuleSet; + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 3); @@ -165,7 +161,6 @@ void testNamespace() { var input = 'ns1|div {}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -174,10 +169,10 @@ void testNamespace() { expect(stylesheet.topLevels[0] is RuleSet, true); var ruleset = stylesheet.topLevels[0] as RuleSet; - expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + var simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 1); expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true); @@ -187,7 +182,7 @@ void testNamespace() { expect(simpSelector.namespace, 'ns1'); var elementSelector = simpSelector.nameAsSimpleSelector; expect(elementSelector is ElementSelector, true); - expect(elementSelector.isWildcard, false); + expect(elementSelector!.isWildcard, false); expect(elementSelector.name, 'div'); } @@ -196,7 +191,6 @@ void testNamespace2() { var input = 'ns1|div div ns2|span .foobar {}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -205,10 +199,10 @@ void testNamespace2() { expect(stylesheet.topLevels[0] is RuleSet, true); var ruleset = stylesheet.topLevels[0] as RuleSet; - expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + var simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 4); @@ -218,7 +212,7 @@ void testNamespace2() { expect(simpSelector0.namespace, 'ns1'); var elementSelector0 = simpSelector0.nameAsSimpleSelector; expect(elementSelector0 is ElementSelector, true); - expect(elementSelector0.isWildcard, false); + expect(elementSelector0!.isWildcard, false); expect(elementSelector0.name, 'div'); var simpSelector1 = simpleSeqs[1].simpleSelector; @@ -232,7 +226,7 @@ void testNamespace2() { expect(simpSelector2.namespace, 'ns2'); var elementSelector2 = simpSelector2.nameAsSimpleSelector; expect(elementSelector2 is ElementSelector, true); - expect(elementSelector2.isWildcard, false); + expect(elementSelector2!.isWildcard, false); expect(elementSelector2.name, 'span'); var simpSelector3 = simpleSeqs[3].simpleSelector; @@ -247,7 +241,6 @@ void testSelectorGroups() { 'div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -256,10 +249,10 @@ void testSelectorGroups() { expect(stylesheet.topLevels[0] is RuleSet, true); var ruleset = stylesheet.topLevels[0] as RuleSet; - expect(ruleset.selectorGroup.selectors.length, 5); + expect(ruleset.selectorGroup!.selectors.length, 5); expect(ruleset.declarationGroup.declarations.length, 0); - var groupSelector0 = ruleset.selectorGroup.selectors[0]; + var groupSelector0 = ruleset.selectorGroup!.selectors[0]; expect(groupSelector0.simpleSelectorSequences.length, 1); var selector0 = groupSelector0.simpleSelectorSequences[0]; var simpleSelector0 = selector0.simpleSelector; @@ -267,7 +260,7 @@ void testSelectorGroups() { expect(selector0.isCombinatorNone, true); expect(simpleSelector0.name, 'div'); - var groupSelector1 = ruleset.selectorGroup.selectors[1]; + var groupSelector1 = ruleset.selectorGroup!.selectors[1]; expect(groupSelector1.simpleSelectorSequences.length, 1); var selector1 = groupSelector1.simpleSelectorSequences[0]; var simpleSelector1 = selector1.simpleSelector; @@ -275,7 +268,7 @@ void testSelectorGroups() { expect(selector1.isCombinatorNone, true); expect(simpleSelector1.name, 'foobar'); - var groupSelector2 = ruleset.selectorGroup.selectors[2]; + var groupSelector2 = ruleset.selectorGroup!.selectors[2]; expect(groupSelector2.simpleSelectorSequences.length, 1); var selector2 = groupSelector2.simpleSelectorSequences[0]; var simpleSelector2 = selector2.simpleSelector; @@ -283,7 +276,7 @@ void testSelectorGroups() { expect(selector2.isCombinatorNone, true); expect(simpleSelector2.name, 'elemId'); - var groupSelector3 = ruleset.selectorGroup.selectors[3]; + var groupSelector3 = ruleset.selectorGroup!.selectors[3]; expect(groupSelector3.simpleSelectorSequences.length, 2); var selector30 = groupSelector3.simpleSelectorSequences[0]; @@ -298,7 +291,7 @@ void testSelectorGroups() { expect(selector31.isCombinatorDescendant, true); expect(simpleSelector31.name, 'test'); - var groupSelector4 = ruleset.selectorGroup.selectors[4]; + var groupSelector4 = ruleset.selectorGroup!.selectors[4]; expect(groupSelector4.simpleSelectorSequences.length, 4); var selector40 = groupSelector4.simpleSelectorSequences[0]; @@ -308,7 +301,7 @@ void testSelectorGroups() { expect(simpleSelector40.namespace, 'ns1'); var elementSelector = simpleSelector40.nameAsSimpleSelector; expect(elementSelector is ElementSelector, true); - expect(elementSelector.isWildcard, false); + expect(elementSelector!.isWildcard, false); expect(elementSelector.name, 'div'); var selector41 = groupSelector4.simpleSelectorSequences[1]; @@ -334,7 +327,6 @@ void testCombinator() { var input = '.foobar > .bar + .no-story ~ myNs|div #elemId {}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -343,10 +335,10 @@ void testCombinator() { expect(stylesheet.topLevels[0] is RuleSet, true); var ruleset = stylesheet.topLevels[0] as RuleSet; - expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + var simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 5); @@ -375,7 +367,7 @@ void testCombinator() { expect(simpleSelector3.namespace, 'myNs'); var elementSelector = simpleSelector3.nameAsSimpleSelector; expect(elementSelector is ElementSelector, true); - expect(elementSelector.isWildcard, false); + expect(elementSelector!.isWildcard, false); expect(elementSelector.name, 'div'); var selector4 = simpleSeqs[4]; @@ -390,7 +382,6 @@ void testWildcard() { var input = '* {}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -399,10 +390,10 @@ void testWildcard() { expect(stylesheet.topLevels[0] is RuleSet, true); var ruleset = stylesheet.topLevels[0] as RuleSet; - expect(ruleset.selectorGroup.selectors.length, 1); + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + var simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 1); var simpSelector = simpleSeqs[0].simpleSelector; @@ -414,7 +405,6 @@ void testWildcard() { input = '*.foobar {}'; stylesheet = parseCss(input, errors: errors..clear()); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -422,11 +412,11 @@ void testWildcard() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - ruleset = stylesheet.topLevels[0]; - expect(ruleset.selectorGroup.selectors.length, 1); + ruleset = stylesheet.topLevels[0] as RuleSet; + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 2); @@ -448,7 +438,6 @@ void testWildcard() { input = 'myNs|*.foobar {}'; stylesheet = parseCss(input, errors: errors..clear()); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -456,11 +445,11 @@ void testWildcard() { expect(stylesheet.topLevels.length, 1); expect(stylesheet.topLevels[0] is RuleSet, true); - ruleset = stylesheet.topLevels[0]; - expect(ruleset.selectorGroup.selectors.length, 1); + ruleset = stylesheet.topLevels[0] as RuleSet; + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 2); @@ -472,7 +461,7 @@ void testWildcard() { expect(simpleSelector0.isNamespaceWildcard, false); var elementSelector = simpleSelector0.nameAsSimpleSelector; expect('myNs', simpleSelector0.namespace); - expect(elementSelector.isWildcard, true); + expect(elementSelector!.isWildcard, true); expect('*', elementSelector.name); } @@ -485,17 +474,16 @@ void testWildcard() { input = '*|*.foobar {}'; stylesheet = parseCss(input, errors: errors..clear()); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); expect(stylesheet.topLevels[0] is RuleSet, true); - ruleset = stylesheet.topLevels[0]; - expect(ruleset.selectorGroup.selectors.length, 1); + ruleset = stylesheet.topLevels[0] as RuleSet; + expect(ruleset.selectorGroup!.selectors.length, 1); expect(ruleset.declarationGroup.declarations.length, 0); - simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; + simpleSeqs = ruleset.selectorGroup!.selectors[0].simpleSelectorSequences; expect(simpleSeqs.length, 2); @@ -507,7 +495,7 @@ void testWildcard() { expect(simpleSelector0.isNamespaceWildcard, true); expect('*', simpleSelector0.namespace); var elementSelector = simpleSelector0.nameAsSimpleSelector; - expect(elementSelector.isWildcard, true); + expect(elementSelector!.isWildcard, true); expect('*', elementSelector.name); } @@ -530,7 +518,6 @@ void testArrayOfChars() { var stylesheet = parse(utf8.encode(input), errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), r''' @@ -593,7 +580,6 @@ div:nth-child(2n) { color : red; } var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), r''' html:lang(fr-ca) { @@ -663,7 +649,6 @@ void testHost() { '}'; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), r''' @host { @@ -688,7 +673,6 @@ void testStringEscape() { var errors = []; var input = r'''a { foo: '{"text" : "a\\\""}' }'''; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), r''' @@ -708,7 +692,6 @@ void testEmitter() { '}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); @@ -736,7 +719,6 @@ void testExpressionParsing() { }'''; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); walkTree(stylesheet); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 61f04f5f5..6cccc9c7a 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -51,7 +51,6 @@ void testSimpleTerms() { var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -66,7 +65,6 @@ void testSimpleTerms() { stylesheet = parseCss(input2, errors: errors..clear()); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); @@ -79,7 +77,7 @@ void testSimpleTerms() { stylesheet = parseCss(css, errors: errors..clear(), opts: simpleOptions); expect(errors, isNotEmpty); expect(errors.first.message, 'expected }, but found %'); - expect(errors.first.span.text, '%'); + expect(errors.first.span!.text, '%'); } /// Declarations with comments, references with single-quotes, double-quotes, @@ -117,7 +115,6 @@ void testDeclarations() { var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -145,7 +142,6 @@ void testIdentifiers() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, true, reason: errors.toString()); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), generated); } @@ -173,7 +169,6 @@ void testComposites() { }'''; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -257,7 +252,6 @@ void testUnits() { var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -285,7 +279,6 @@ void testUnicode() { var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -339,7 +332,6 @@ void testNewerCss() { var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -366,7 +358,6 @@ void testMediaQueries() { }'''; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -414,7 +405,6 @@ void testMediaQueries() { stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -431,7 +421,6 @@ void testMediaQueries() { stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -448,7 +437,6 @@ void testMediaQueries() { stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -459,7 +447,6 @@ void testMediaQueries() { stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -475,7 +462,7 @@ void testMediaQueries() { expect(errors, isNotEmpty); expect( errors.first.message, contains('expected { after media before ruleset')); - expect(errors.first.span.text, '('); + expect(errors.first.span!.text, '('); // Test nested at-rules. input = ''' @@ -647,7 +634,7 @@ body { expect(errors, isNotEmpty); expect(errors.first.message, "Operators can't be mixed without a layer of parentheses"); - expect(errors.first.span.text, 'or'); + expect(errors.first.span!.text, 'or'); } void testViewport() { @@ -696,7 +683,6 @@ void testFontFace() { }'''; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -714,7 +700,6 @@ void testFontFace() { stylesheet = parseCss(input1, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated1); @@ -731,7 +716,6 @@ src: url(ideal-sans-serif.woff) format("woff"), stylesheet = parseCss(input2, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); @@ -750,7 +734,6 @@ src: url(ideal-sans-serif.woff) format("woff"), stylesheet = parseCss(input3, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated3); @@ -767,7 +750,6 @@ src: url(ideal-sans-serif.woff) format("woff"), }'''; stylesheet = parseCss(input4, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated4); } @@ -838,7 +820,6 @@ div[href^='test'] { '}'; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -887,7 +868,6 @@ div { var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(compactOutput(stylesheet), generated); @@ -897,7 +877,6 @@ div { var stylesheet2 = parseCss(input2, errors: errors..clear()); - expect(stylesheet2 != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(compactOutput(stylesheet2), generated2); } @@ -987,7 +966,6 @@ html|*:not(:link):not(:visited) { var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -1005,7 +983,6 @@ void testIE() { var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -1023,7 +1000,6 @@ void testIE() { stylesheet = parseCss(input2, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); @@ -1053,7 +1029,6 @@ div { stylesheet = parseCss(input3, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated3); @@ -1064,7 +1039,6 @@ div { stylesheet = parseCss(input4, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), input4); } @@ -1238,7 +1212,6 @@ input.search-query { }'''; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -1248,31 +1221,30 @@ void testHangs() { // Bad hexvalue had caused a hang in processTerm. final input = r'''#a { color: #ebebeburl(0/IE8+9+); }'''; - var stylesheet = parseCss(input, errors: errors, opts: options); + parseCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.length, 3, reason: errors.toString()); var errorMessage = errors[0]; expect(errorMessage.message, contains('Bad hex number')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 0); - expect(errorMessage.span.start.column, 12); - expect(errorMessage.span.text, '#ebebeburl'); + expect(errorMessage.span!.start.line, 0); + expect(errorMessage.span!.start.column, 12); + expect(errorMessage.span!.text, '#ebebeburl'); errorMessage = errors[1]; expect(errorMessage.message, contains('expected }, but found +')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 0); - expect(errorMessage.span.start.column, 30); - expect(errorMessage.span.text, '+'); + expect(errorMessage.span!.start.line, 0); + expect(errorMessage.span!.start.column, 30); + expect(errorMessage.span!.text, '+'); errorMessage = errors[2]; expect(errorMessage.message, contains('premature end of file unknown CSS')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 0); - expect(errorMessage.span.start.column, 31); - expect(errorMessage.span.text, ')'); + expect(errorMessage.span!.start.line, 0); + expect(errorMessage.span!.start.column, 31); + expect(errorMessage.span!.text, ')'); // Missing closing parenthesis for keyframes. final input2 = r'''@-ms-keyframes progress-bar-stripes { @@ -1284,18 +1256,16 @@ void testHangs() { } '''; - stylesheet = parseCss(input2, errors: errors..clear(), opts: options); - - expect(stylesheet != null, true); + parseCss(input2, errors: errors..clear(), opts: options); expect(errors.length, 1, reason: errors.toString()); errorMessage = errors[0]; expect(errorMessage.message, contains('unexpected end of file')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 7); - expect(errorMessage.span.start.column, 0); - expect(errorMessage.span.text.trim(), ''); + expect(errorMessage.span!.start.line, 7); + expect(errorMessage.span!.start.column, 0); + expect(errorMessage.span!.text.trim(), ''); } void testExpressionSpans() { @@ -1306,9 +1276,9 @@ void testExpressionSpans() { .declarations .single; // This passes - expect(decl.span.text, 'width: 50px'); + expect(decl.span!.text, 'width: 50px'); // This currently fails - expect((decl as Declaration).expression.span.text, '50px'); + expect((decl as Declaration).expression!.span!.text, '50px'); } void testComments() { @@ -1328,7 +1298,7 @@ void simpleCalc() { .declarationGroup .declarations .single; - expect(decl.span.text, 'height: calc(100% - 55px)'); + expect(decl.span!.text, 'height: calc(100% - 55px)'); } void complexCalc() { @@ -1338,7 +1308,7 @@ void complexCalc() { .declarationGroup .declarations .single; - expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)'); + expect(decl.span!.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)'); } void twoCalcs() { @@ -1348,7 +1318,7 @@ void twoCalcs() { .declarationGroup .declarations .single; - expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)'); + expect(decl.span!.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)'); } void selectorWithCalcs() { @@ -1371,7 +1341,6 @@ void selectorWithCalcs() { }'''; var stylesheet = parseCss(input, errors: errors); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 5822c4c13..5b211c2cf 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -25,7 +25,6 @@ error on line 1, column 24: Unknown property value bolder 1 │ .foobar { font-weight: bolder; } │ ^^^^^^ ╵'''); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { @@ -44,7 +43,6 @@ error on line 1, column 24: Unknown property value lighter 1 │ .foobar { font-weight: lighter; } │ ^^^^^^^ ╵'''); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { font-weight: lighter; @@ -62,7 +60,6 @@ error on line 1, column 24: Unknown property value inherit 1 │ .foobar { font-weight: inherit; } │ ^^^^^^^ ╵'''); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { font-weight: inherit; @@ -85,7 +82,6 @@ error on line 1, column 24: Unexpected value for line-height 1 │ .foobar { line-height: 120%; } │ ^^^ ╵'''); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { line-height: 120%; @@ -103,7 +99,6 @@ error on line 1, column 24: Unexpected unit for line-height 1 │ .foobar { line-height: 20cm; } │ ^^ ╵'''); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { line-height: 20cm; @@ -121,7 +116,6 @@ error on line 1, column 24: Unknown property value inherit 1 │ .foobar { line-height: inherit; } │ ^^^^^^^ ╵'''); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { line-height: inherit; @@ -172,7 +166,6 @@ error on line 1, column 18: Bad hex number 1 │ .foobar { color: #AH787; } │ ^^^^^^ ╵'''); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { color: #AH787; @@ -190,7 +183,6 @@ error on line 1, column 18: Unknown property value redder │ ^^^^^^ ╵'''); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { color: redder; @@ -208,7 +200,6 @@ error on line 1, column 18: Expected hex number │ ^ ╵'''); - expect(stylesheet != null, true); expect(prettyPrint(stylesheet), r''' .foobar { color: # ffffff; @@ -226,8 +217,6 @@ error on line 1, column 18: Expected hex number │ ^ ╵'''); - expect(stylesheet != null, true); - // Formating is off with an extra space. However, the entire value is bad // and isn't processed anyway. expect(prettyPrint(stylesheet), r''' @@ -294,9 +283,9 @@ div { var errorMessage = messages.messages[0]; expect(errorMessage.message, contains('Bad hex number')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 4); - expect(errorMessage.span.start.column, 11); - expect(errorMessage.span.text, '#ffghghgh'); + expect(errorMessage.span!.start.line, 4); + expect(errorMessage.span!.start.column, 11); + expect(errorMessage.span!.text, '#ffghghgh'); // Test for bad selector syntax. final input2 = ''' @@ -311,30 +300,30 @@ div { errorMessage = messages.messages[0]; expect(errorMessage.message, contains(':, but found +')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 1); - expect(errorMessage.span.start.column, 7); - expect(errorMessage.span.text, '+'); + expect(errorMessage.span!.start.line, 1); + expect(errorMessage.span!.start.column, 7); + expect(errorMessage.span!.text, '+'); errorMessage = messages.messages[1]; expect(errorMessage.message, contains('Unknown property value ul')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 1); - expect(errorMessage.span.start.column, 9); - expect(errorMessage.span.text, 'ul'); + expect(errorMessage.span!.start.line, 1); + expect(errorMessage.span!.start.column, 9); + expect(errorMessage.span!.text, 'ul'); errorMessage = messages.messages[2]; expect(errorMessage.message, contains('expected }, but found >')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 1); - expect(errorMessage.span.start.column, 18); - expect(errorMessage.span.text, '>'); + expect(errorMessage.span!.start.line, 1); + expect(errorMessage.span!.start.column, 18); + expect(errorMessage.span!.text, '>'); errorMessage = messages.messages[3]; expect(errorMessage.message, contains('premature end of file unknown CSS')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 1); - expect(errorMessage.span.start.column, 20); - expect(errorMessage.span.text, '('); + expect(errorMessage.span!.start.line, 1); + expect(errorMessage.span!.start.column, 20); + expect(errorMessage.span!.text, '('); // Test for missing close braces and bad declaration. final input3 = ''' @@ -348,16 +337,16 @@ div { errorMessage = messages.messages[0]; expect(errorMessage.message, contains('Bad hex number')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 2); - expect(errorMessage.span.start.column, 11); - expect(errorMessage.span.text, '#green'); + expect(errorMessage.span!.start.line, 2); + expect(errorMessage.span!.start.column, 11); + expect(errorMessage.span!.text, '#green'); errorMessage = messages.messages[1]; expect(errorMessage.message, contains('expected }, but found end of file')); expect(errorMessage.span, isNotNull); - expect(errorMessage.span.start.line, 3); - expect(errorMessage.span.start.column, 1); - expect(errorMessage.span.text, '\n'); + expect(errorMessage.span!.start.line, 3); + expect(errorMessage.span!.start.column, 1); + expect(errorMessage.span!.text, '\n'); } void main() { diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index 38e0ea0ee..37b433ab7 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -12,7 +12,6 @@ import 'testing.dart'; void compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index f562f380e..0432b1c05 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -12,7 +12,6 @@ import 'testing.dart'; void compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -20,7 +19,6 @@ void compileAndValidate(String input, String generated) { void compilePolyfillAndValidate(String input, String generated) { var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -442,15 +440,14 @@ void badDeclarationInclude() { @include b; '''; - var stylesheet = compileCss(input, errors: errors, opts: options); + compileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isNotEmpty, true); expect(errors.length, 1, reason: errors.toString()); var error = errors[0]; expect(error.message, 'Using top-level mixin a as a declaration'); - expect(error.span.start.line, 8); - expect(error.span.end.offset, 105); + expect(error.span!.start.line, 8); + expect(error.span!.end.offset, 105); } void badTopInclude() { @@ -470,13 +467,13 @@ void badTopInclude() { @include a; '''; - var stylesheet = compileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); + compileCss(input, errors: errors, opts: options); + expect(errors.length, 1, reason: errors.toString()); var error = errors[0]; expect(error.message, 'Using declaration mixin b as top-level mixin'); - expect(error.span.start.line, 8); - expect(error.span.end.offset, 90); + expect(error.span!.start.line, 8); + expect(error.span!.end.offset, 90); } void emptyMixin() { @@ -500,7 +497,6 @@ div { var stylesheet = compileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -522,15 +518,14 @@ void undefinedTopLevel() { '''; - var stylesheet = compileCss(input, errors: errors, opts: options); + compileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isNotEmpty, true); expect(errors.length, 1, reason: errors.toString()); var error = errors[0]; expect(error.message, 'Undefined mixin b'); - expect(error.span.start.line, 1); - expect(error.span.start.offset, 14); + expect(error.span!.start.line, 1); + expect(error.span!.start.offset, 14); } void undefinedDeclaration() { @@ -548,15 +543,14 @@ div { } '''; - var stylesheet = compileCss(input, errors: errors, opts: options); + compileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isNotEmpty, true); expect(errors.length, 1, reason: errors.toString()); var error = errors[0]; expect(error.message, 'Undefined mixin b'); - expect(error.span.start.line, 1); - expect(error.span.start.offset, 14); + expect(error.span!.start.line, 1); + expect(error.span!.start.offset, 14); } void includeGrammar() { @@ -608,36 +602,34 @@ foo { @include b '''; - var stylesheet = compileCss(input, errors: errors, opts: options); - - expect(stylesheet != null, true); + compileCss(input, errors: errors, opts: options); expect(errors.isNotEmpty, true); expect(errors.length, 6, reason: errors.toString()); var error = errors[0]; expect(error.message, 'parsing error expected ;'); - expect(error.span.start.line, 6); - expect(error.span.end.offset, 69); + expect(error.span!.start.line, 6); + expect(error.span!.end.offset, 69); error = errors[1]; expect(error.message, 'expected :, but found }'); - expect(error.span.start.line, 7); - expect(error.span.end.offset, 73); + expect(error.span!.start.line, 7); + expect(error.span!.end.offset, 73); error = errors[2]; expect(error.message, 'parsing error expected }'); - expect(error.span.start.line, 9); - expect(error.span.end.offset, 83); + expect(error.span!.start.line, 9); + expect(error.span!.end.offset, 83); error = errors[3]; expect(error.message, 'expected {, but found end of file()'); - expect(error.span.start.line, 9); - expect(error.span.end.offset, 86); + expect(error.span!.start.line, 9); + expect(error.span!.end.offset, 86); error = errors[4]; expect(error.message, 'expected }, but found end of file()'); - expect(error.span.start.line, 10); - expect(error.span.end.offset, 86); + expect(error.span!.start.line, 10); + expect(error.span!.end.offset, 86); error = errors[5]; expect(error.message, 'Using top-level mixin a as a declaration'); - expect(error.span.start.line, 5); - expect(error.span.end.offset, 56); + expect(error.span!.start.line, 5); + expect(error.span!.end.offset, 56); } void main() { diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index b096fc21c..a594969ea 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -12,7 +12,6 @@ import 'testing.dart'; void compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } diff --git a/pkgs/csslib/test/samples_test.dart b/pkgs/csslib/test/samples_test.dart index b90613115..5a066a65c 100644 --- a/pkgs/csslib/test/samples_test.dart +++ b/pkgs/csslib/test/samples_test.dart @@ -27,7 +27,7 @@ void main() { final cssDir = Directory.fromUri(libraryUri.resolve('examples')); for (var element in cssDir.listSync()) { if (element is File && element.uri.pathSegments.last.endsWith('.css')) { - test(element.uri.pathSegments.last, () => testCSSFile(element)); + test(element.uri.pathSegments.last, () => testCSSFile(element as File)); } } } diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 5c8cc55f2..66bd815f4 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -28,7 +28,7 @@ const options = PreprocessorOptions( /// CSS will allow any property/value pairs regardless of validity; all of our /// tests (by default) will ensure that the CSS is really valid. StyleSheet parseCss(String cssInput, - {List errors, PreprocessorOptions opts}) => + {List? errors, PreprocessorOptions? opts}) => parse(cssInput, errors: errors, options: opts ?? simpleOptionsWithCheckedAndWarningsAsErrors); @@ -37,10 +37,10 @@ StyleSheet parseCss(String cssInput, /// CSS will allow any property/value pairs regardless of validity; all of our /// tests (by default) will ensure that the CSS is really valid. StyleSheet compileCss(String cssInput, - {List errors, - PreprocessorOptions opts, + {List? errors, + PreprocessorOptions? opts, bool polyfill = false, - List includes}) => + List? includes}) => compile(cssInput, errors: errors, options: opts ?? simpleOptionsWithCheckedAndWarningsAsErrors, @@ -48,7 +48,7 @@ StyleSheet compileCss(String cssInput, includes: includes); StyleSheet polyFillCompileCss(input, - {List errors, PreprocessorOptions opts}) => + {List? errors, PreprocessorOptions? opts}) => compileCss(input, errors: errors, polyfill: true, opts: opts); /// CSS emitter walks the style sheet tree and emits readable CSS. diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 1ebd97591..923d121cb 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -12,7 +12,6 @@ import 'testing.dart'; void compileAndValidate(String input, String generated) { var errors = []; var stylesheet = compileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -20,7 +19,6 @@ void compileAndValidate(String input, String generated) { void compilePolyfillAndValidate(String input, String generated) { var errors = []; var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); } @@ -476,8 +474,6 @@ void undefinedVars() { var stylesheet = polyFillCompileCss(input, errors: errors..clear(), opts: options); - expect(stylesheet != null, true); - expect(errors.length, errorStrings.length, reason: errors.toString()); testBitMap = 0; @@ -678,7 +674,6 @@ var-color-foreground: #00f; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -704,7 +699,6 @@ var-color-foreground: #00f; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); @@ -733,7 +727,6 @@ var-color-foreground: #00f; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated); @@ -759,7 +752,6 @@ var-color-foreground: #00f; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); - expect(stylesheet != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); @@ -874,7 +866,6 @@ void includes() { }'''; var stylesheet1 = compileCss(file1Input, errors: errors, opts: options); - expect(stylesheet1 != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet1), generated1); @@ -891,7 +882,6 @@ void includes() { var stylesheet2 = compileCss(file2Input, includes: [stylesheet1], errors: errors..clear(), opts: options); - expect(stylesheet2 != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet2), generated2); @@ -908,7 +898,6 @@ void includes() { }'''; var styleSheet1Polyfill = compileCss(file1Input, errors: errors..clear(), polyfill: true, opts: options); - expect(styleSheet1Polyfill != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(styleSheet1Polyfill), generatedPolyfill1); @@ -925,7 +914,6 @@ void includes() { errors: errors..clear(), polyfill: true, opts: options); - expect(styleSheet2Polyfill != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(styleSheet2Polyfill), generatedPolyfill2); @@ -946,7 +934,6 @@ void includes() { polyfill: true, opts: options); - expect(stylesheetPolyfill != null, true); expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheetPolyfill), generatedPolyfill); diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index 958db30fd..a5346dd9e 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -40,7 +40,6 @@ void testClassVisitors() { var s = parseCss(in1, errors: errors); - expect(s != null, true); expect(errors.isEmpty, true, reason: errors.toString()); var clsVisits = ClassVisitor(['foobar'])..visitTree(s); @@ -54,7 +53,6 @@ void testClassVisitors() { s = parseCss(in1, errors: errors..clear(), opts: simpleOptions); - expect(s != null, true); expect(errors.isEmpty, true, reason: errors.toString()); clsVisits = ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello'])..visitTree(s); @@ -102,7 +100,6 @@ div.myComponent_xyzzy { }'''; var s = parseCss(input, errors: errors); - expect(s != null, true); expect(errors.isEmpty, true, reason: errors.toString()); final emitted = polyfillPrint('myComponent', s); From 06e518421ce2d1f14c2687939c796f38893db26c Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Fri, 28 Aug 2020 09:15:35 -0700 Subject: [PATCH 158/245] Only test on the dev SDK (dart-lang/csslib#111) --- pkgs/csslib/.travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml index 07d647d3d..6d64d6abf 100644 --- a/pkgs/csslib/.travis.yml +++ b/pkgs/csslib/.travis.yml @@ -1,7 +1,6 @@ language: dart dart: - - 2.2.0 - dev dart_task: @@ -12,9 +11,6 @@ matrix: - dart: dev dart_task: dartanalyzer: --fatal-infos --fatal-warnings . - - dart: 2.2.0 - dart_task: - dartanalyzer: --fatal-warnings . - dart: dev dart_task: dartfmt From 2a9d6adc8ad016e831cf04d43c6fded0b0643f92 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Sat, 29 Aug 2020 12:10:28 -0700 Subject: [PATCH 159/245] Fix cast of nullable argument (dart-lang/csslib#112) The `as num` cast existed before the migration, but in the wrong place so the overall expression was still `dynamic`. Implicit casts from `dynamic` are still allowed, so it wasn't flagged that the cast was in the wrong place - disabling implicit casts from dynamic makes it more obvious that there is a problem, but doesn't fix the entire issue. In addition to the cast being in the wrong place, it also was to the wrong type. Casting to `num` instead of `num?` does not surface any warnings because it's valid to pass the `num` to an argument wanting `num?`. This was not surfaced originally due to a bug in the VM which causes the opt-in state of a package in the experiment allow list to _not_ control the soundness when executing. Add explicit opt in test runs for now. https://github.com/dart-lang/sdk/issues/43243 --- pkgs/csslib/.travis.yml | 1 + pkgs/csslib/lib/src/tree.dart | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml index 6d64d6abf..2e478e740 100644 --- a/pkgs/csslib/.travis.yml +++ b/pkgs/csslib/.travis.yml @@ -5,6 +5,7 @@ dart: dart_task: - test: --platform vm,chrome + - script: pub run --enable-experiment=non-nullable test --platform vm,chrome matrix: include: diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 2e987ce94..ab4092ccd 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -1583,7 +1583,7 @@ class FontExpression extends DartStyleExpression { String? variant, LineHeight? lineHeight}) : font = Font( - size: size is LengthTerm ? size.value : size as num, + size: (size is LengthTerm ? size.value : size) as num?, family: family, weight: weight, style: style, From 4f5e7626ef20e248a4063aaa8fd12d64b1cc62b8 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Mon, 31 Aug 2020 09:22:32 -0700 Subject: [PATCH 160/245] Disable implicit casts from dynamic (dart-lang/csslib#113) This package uses `dynamic` frequently for historical reasons. Disable implicit casts and add explicit casts where necessary to avoid masking the unsafe implementation. --- pkgs/csslib/CHANGELOG.md | 1 + pkgs/csslib/analysis_options.yaml | 3 +++ pkgs/csslib/lib/parser.dart | 42 ++++++++++++++++------------- pkgs/csslib/lib/src/analyzer.dart | 4 +-- pkgs/csslib/lib/src/token_kind.dart | 22 +++++++-------- pkgs/csslib/lib/src/tree.dart | 29 +++++++++++--------- pkgs/csslib/test/testing.dart | 2 +- 7 files changed, 57 insertions(+), 46 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index c4c3b8bdf..8e430ac13 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -2,6 +2,7 @@ - `Font.merge` and `BoxEdge.merge` are now static methods instead of factory constructors. +- Add a type on the `identList` argument to `TokenKind.matchList`. ## 0.16.2 diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index a20ed4930..1df858df0 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -1,4 +1,7 @@ include: package:pedantic/analysis_options.yaml +analyzer: + strong-mode: + implicit-casts: false linter: rules: diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 5b3164dc5..a7a2d3bb1 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -465,7 +465,8 @@ class _Parser { var tokId = processVariableOrDirective(); if (tokId is VarDefinitionDirective) return tokId; - switch (tokId) { + final tokenId = tokId as int; + switch (tokenId) { case TokenKind.DIRECTIVE_IMPORT: _next(); @@ -605,7 +606,7 @@ class _Parser { case TokenKind.DIRECTIVE_O_KEYFRAMES: // TODO(terry): Remove workaround when bug 8270 is fixed. case TokenKind.DIRECTIVE_MS_KEYFRAMES: - if (tokId == TokenKind.DIRECTIVE_MS_KEYFRAMES && isChecked) { + if (tokenId == TokenKind.DIRECTIVE_MS_KEYFRAMES && isChecked) { _warning('@-ms-keyframes should be @keyframes', _makeSpan(start)); } // TODO(terry): End of workaround. @@ -630,13 +631,13 @@ class _Parser { _eat(TokenKind.LBRACE); - var keyframe = KeyFrameDirective(tokId, name, _makeSpan(start)); + var keyframe = KeyFrameDirective(tokenId, name, _makeSpan(start)); do { var selectors = Expressions(_makeSpan(start)); do { - var term = processTerm(); + var term = processTerm() as Expression; // TODO(terry): Only allow from, to and PERCENTAGE ... @@ -681,7 +682,7 @@ class _Parser { _eat(TokenKind.RBRACE); - return StyletDirective(name, productions, _makeSpan(start)); + return StyletDirective(name as String, productions, _makeSpan(start)); case TokenKind.DIRECTIVE_NAMESPACE: // Namespace grammar: @@ -760,7 +761,7 @@ class _Parser { while (keepGoing) { var varDef = processVariableOrDirective(mixinParameter: true); if (varDef is VarDefinitionDirective || varDef is VarDefinition) { - params.add(varDef); + params.add(varDef as TreeNode); } else if (mustHaveParam) { _warning('Expecting parameter', _makeSpan(_peekToken.span)); keepGoing = false; @@ -930,7 +931,7 @@ class _Parser { var keepGoing = true; while (keepGoing && (expr = processTerm()) != null) { // VarUsage is returns as a list - terms.add(expr is List ? expr[0] : expr); + terms.add((expr is List ? expr[0] : expr) as Expression); keepGoing = !_peekKind(TokenKind.RPAREN); if (keepGoing) { if (_maybeEat(TokenKind.COMMA)) { @@ -1635,11 +1636,11 @@ class _Parser { break; case TokenKind.SINGLE_QUOTE: value = processQuotedString(false); - value = "'${_escapeString(value, single: true)}'"; + value = "'${_escapeString(value as String, single: true)}'"; return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.DOUBLE_QUOTE: value = processQuotedString(false); - value = '"${_escapeString(value)}"'; + value = '"${_escapeString(value as String)}"'; return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.IDENTIFIER: value = identifier(); // Snarf up the ident we'll remap, maybe. @@ -1649,7 +1650,8 @@ class _Parser { } if (keepParsing && value != null) { - var unitTerm = processDimension(termToken, value, _makeSpan(start)); + var unitTerm = + processDimension(termToken, value as Object, _makeSpan(start)); expressions.add(unitTerm); value = null; @@ -1945,7 +1947,7 @@ class _Parser { // https://github.com/dart-lang/csslib/issues/1 var expr = exprs.expressions[0]; if (expr is NumberTerm) { - var fontExpr = FontExpression(expr.span, weight: expr.value); + var fontExpr = FontExpression(expr.span, weight: expr.value as int?); return _mergeFontStyles(fontExpr, dartStyles); } else if (expr is LiteralTerm) { var weight = _nameToFontWeight[expr.value.toString()]; @@ -1965,14 +1967,14 @@ class _Parser { if (unitTerm.unit == TokenKind.UNIT_LENGTH_PX || unitTerm.unit == TokenKind.UNIT_LENGTH_PT) { var fontExpr = FontExpression(expr.span, - lineHeight: LineHeight(expr.value, inPixels: true)); + lineHeight: LineHeight(expr.value as num, inPixels: true)); return _mergeFontStyles(fontExpr, dartStyles); } else if (isChecked) { _warning('Unexpected unit for line-height', expr.span); } } else if (expr is NumberTerm) { var fontExpr = FontExpression(expr.span, - lineHeight: LineHeight(expr.value, inPixels: false)); + lineHeight: LineHeight(expr.value as num, inPixels: false)); return _mergeFontStyles(fontExpr, dartStyles); } else if (isChecked) { _warning('Unexpected value for line-height', expr.span); @@ -2174,7 +2176,7 @@ class _Parser { expressions.add(exprItem); } } else { - expressions.add(expr); + expressions.add(expr as Expression); } } else { keepGoing = false; @@ -2260,11 +2262,11 @@ class _Parser { break; case TokenKind.SINGLE_QUOTE: value = processQuotedString(false); - value = "'${_escapeString(value, single: true)}'"; + value = "'${_escapeString(value as String, single: true)}'"; return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.DOUBLE_QUOTE: value = processQuotedString(false); - value = '"${_escapeString(value)}"'; + value = '"${_escapeString(value as String)}"'; return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.LPAREN: _next(); @@ -2292,7 +2294,7 @@ class _Parser { _eat(TokenKind.RBRACK); - return ItemTerm(term.value, term.text, _makeSpan(start)); + return ItemTerm(term.value, term.text as String, _makeSpan(start)); case TokenKind.IDENTIFIER: var nameValue = identifier(); // Snarf up the ident we'll remap, maybe. @@ -2386,7 +2388,9 @@ class _Parser { break; } - return t != null ? processDimension(t, value, _makeSpan(start)) : null; + return t != null + ? processDimension(t, value as Object, _makeSpan(start)) + : null; } /// Process all dimension units. @@ -2768,7 +2772,7 @@ class ExpressionsProcessor { nextIsLineHeight = true; } else if (nextIsLineHeight && expr is LengthTerm) { assert(expr.unit == TokenKind.UNIT_LENGTH_PX); - lineHt = LineHeight(expr.value, inPixels: true); + lineHt = LineHeight(expr.value as num, inPixels: true); nextIsLineHeight = false; _index++; break; diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index f685a2bfb..68997960a 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -533,7 +533,7 @@ class _TopLevelIncludeReplacer extends Visitor { @override void visitMixinRulesetDirective(MixinRulesetDirective node) { - var index = node.rulesets.indexOf(_include as dynamic); + var index = node.rulesets.indexOf(_include); if (index != -1) { node.rulesets.insertAll(index + 1, _newRules); // Only the resolve the @include once. @@ -714,7 +714,7 @@ class DeclarationIncludes extends Visitor { } } - bool _allIncludes(rulesets) => + bool _allIncludes(List rulesets) => rulesets.every((rule) => rule is IncludeDirective || rule is NoOp); CallMixin _createCallDeclMixin(MixinDefinition mixinDef) => diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index 32cbd69ba..148a8354c 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -260,7 +260,7 @@ class TokenKind { {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM, 'value': 'right-bottom'}, ]; - static const List _UNITS = [ + static const List> _UNITS = [ {'unit': TokenKind.UNIT_EM, 'value': 'em'}, {'unit': TokenKind.UNIT_EX, 'value': 'ex'}, {'unit': TokenKind.UNIT_LENGTH_PX, 'value': 'px'}, @@ -467,10 +467,10 @@ class TokenKind { } /// Return the token that matches the unit ident found. - static int matchList( - var identList, String tokenField, String text, int offset, int length) { + static int matchList(Iterable> identList, + String tokenField, String text, int offset, int length) { for (final entry in identList) { - String ident = entry['value']; + final ident = entry['value'] as String; if (length == ident.length) { var idx = offset; @@ -490,7 +490,7 @@ class TokenKind { if (match) { // Completely matched; return the token for this unit. - return entry[tokenField]; + return entry[tokenField] as int; } } } @@ -521,7 +521,7 @@ class TokenKind { static String? idToValue(var identList, int tokenId) { for (var entry in identList) { if (tokenId == entry['type']) { - return entry['value']; + return entry['value'] as String?; } } @@ -529,14 +529,14 @@ class TokenKind { } /// Return the unit token as its pretty name. - static String unitToString(int unitTokenToFind) { + static String? unitToString(int unitTokenToFind) { if (unitTokenToFind == TokenKind.PERCENT) { return '%'; } else { for (final entry in _UNITS) { - int unit = entry['unit']; + final unit = entry['unit'] as int; if (unit == unitTokenToFind) { - return entry['value']; + return entry['value'] as String?; } } } @@ -556,13 +556,13 @@ class TokenKind { /// Return RGB value as [int] from a color entry in _EXTENDED_COLOR_NAMES. static int colorValue(Map entry) { - return entry['value']; + return entry['value'] as int; } static String? hexToColorName(hexValue) { for (final entry in _EXTENDED_COLOR_NAMES) { if (entry['value'] == hexValue) { - return entry['name']; + return entry['name'] as String?; } } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index ab4092ccd..b567f3ce1 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -180,7 +180,7 @@ abstract class SimpleSelector extends TreeNode { SimpleSelector(this._name, SourceSpan? span) : super(span); - String get name => _name.name; + String get name => _name.name as String; bool get isWildcard => _name is Wildcard; @@ -210,12 +210,13 @@ class NamespaceSelector extends SimpleSelector { NamespaceSelector(this._namespace, var name, SourceSpan? span) : super(name, span); - String get namespace => - _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name; + String get namespace => _namespace is Wildcard + ? '*' + : _namespace == null ? '' : _namespace.name as String; bool get isNamespaceWildcard => _namespace is Wildcard; - SimpleSelector? get nameAsSimpleSelector => _name; + SimpleSelector? get nameAsSimpleSelector => _name as SimpleSelector?; @override NamespaceSelector clone() => NamespaceSelector(_namespace, '', span); @@ -289,7 +290,8 @@ class AttributeSelector extends SimpleSelector { } @override - AttributeSelector clone() => AttributeSelector(_name, _op, value, span); + AttributeSelector clone() => + AttributeSelector(_name as Identifier, _op, value, span); @override dynamic visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); @@ -302,7 +304,7 @@ class AttributeSelector extends SimpleSelector { class IdSelector extends SimpleSelector { IdSelector(Identifier name, SourceSpan? span) : super(name, span); @override - IdSelector clone() => IdSelector(_name, span); + IdSelector clone() => IdSelector(_name as Identifier, span); @override dynamic visit(VisitorBase visitor) => visitor.visitIdSelector(this); @@ -314,7 +316,7 @@ class IdSelector extends SimpleSelector { class ClassSelector extends SimpleSelector { ClassSelector(Identifier name, SourceSpan? span) : super(name, span); @override - ClassSelector clone() => ClassSelector(_name, span); + ClassSelector clone() => ClassSelector(_name as Identifier, span); @override dynamic visit(VisitorBase visitor) => visitor.visitClassSelector(this); @@ -329,7 +331,7 @@ class PseudoClassSelector extends SimpleSelector { dynamic visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); @override - PseudoClassSelector clone() => PseudoClassSelector(_name, span); + PseudoClassSelector clone() => PseudoClassSelector(_name as Identifier, span); @override String toString() => ':$name'; @@ -348,7 +350,8 @@ class PseudoElementSelector extends SimpleSelector { visitor.visitPseudoElementSelector(this); @override - PseudoElementSelector clone() => PseudoElementSelector(_name, span); + PseudoElementSelector clone() => + PseudoElementSelector(_name as Identifier, span); @override String toString() => "${isLegacy ? ':' : '::'}$name"; @@ -363,7 +366,7 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { @override PseudoClassFunctionSelector clone() => - PseudoClassFunctionSelector(_name, argument, span); + PseudoClassFunctionSelector(_name as Identifier, argument, span); Selector get selector => argument as Selector; SelectorExpression get expression => argument as SelectorExpression; @@ -383,7 +386,7 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { @override PseudoElementFunctionSelector clone() => - PseudoElementFunctionSelector(_name, expression, span); + PseudoElementFunctionSelector(_name as Identifier, expression, span); @override dynamic visit(VisitorBase visitor) => @@ -1258,7 +1261,7 @@ class UnitTerm extends LiteralTerm { @override dynamic visit(VisitorBase visitor) => visitor.visitUnitTerm(this); - String unitToString() => TokenKind.unitToString(unit); + String? unitToString() => TokenKind.unitToString(unit); @override String toString() => '$text${unitToString()}'; @@ -1362,7 +1365,7 @@ class UriTerm extends LiteralTerm { UriTerm(String value, SourceSpan? span) : super(value, value, span); @override - UriTerm clone() => UriTerm(value, span); + UriTerm clone() => UriTerm(value as String, span); @override dynamic visit(VisitorBase visitor) => visitor.visitUriTerm(this); } diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 66bd815f4..2094420e2 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -49,7 +49,7 @@ StyleSheet compileCss(String cssInput, StyleSheet polyFillCompileCss(input, {List? errors, PreprocessorOptions? opts}) => - compileCss(input, errors: errors, polyfill: true, opts: opts); + compileCss(input as String, errors: errors, polyfill: true, opts: opts); /// CSS emitter walks the style sheet tree and emits readable CSS. final _emitCss = CssPrinter(); From 5c0838ce04aa3580254d946bd46197d358575235 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Tue, 1 Sep 2020 14:23:59 -0700 Subject: [PATCH 161/245] Fix Travis config to run sound tests (dart-lang/csslib#114) The `script` key is not valid under `dart_task:`, but was incorrectly copied from a `jobs:` configuration from another repository. Refactor to the `jobs` and `stages` style configuration. --- pkgs/csslib/.travis.yml | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml index 2e478e740..074faa54b 100644 --- a/pkgs/csslib/.travis.yml +++ b/pkgs/csslib/.travis.yml @@ -1,19 +1,31 @@ language: dart dart: - - dev +- dev -dart_task: - - test: --platform vm,chrome - - script: pub run --enable-experiment=non-nullable test --platform vm,chrome - -matrix: +jobs: include: - - dart: dev - dart_task: - dartanalyzer: --fatal-infos --fatal-warnings . - - dart: dev - dart_task: dartfmt + - stage: analyze_and_format + name: "Analyzer" + os: linux + script: dartanalyzer --fatal-warnings --fatal-infos . + - stage: analyze_and_format + name: "Format" + os: linux + script: dartfmt -n --set-exit-if-changed . + - stage: test + name: "Sound null safety tests" + os: linux + # https://github.com/dart-lang/sdk/issues/43243 + script: pub run --enable-experiment=non-nullable test -p vm + - stage: test + name: "Weak null safety tests" + os: linux + script: pub run test -p vm + +stages: +- analyze_and_format +- test # Only building master means that we don't run two builds for each pull request. branches: @@ -21,4 +33,4 @@ branches: cache: directories: - - $HOME/.pub-cache + - $HOME/.pub-cache From f7a0e19638679bd41abd7978bc50864eb4a2ec67 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 8 Sep 2020 08:49:01 -0700 Subject: [PATCH 162/245] fix formatting (dart-lang/csslib#115) --- pkgs/csslib/lib/src/tree.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index b567f3ce1..83e8b0929 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -212,7 +212,9 @@ class NamespaceSelector extends SimpleSelector { String get namespace => _namespace is Wildcard ? '*' - : _namespace == null ? '' : _namespace.name as String; + : _namespace == null + ? '' + : _namespace.name as String; bool get isNamespaceWildcard => _namespace is Wildcard; From 306760b55bccb08756fdf576ccc520c577b8b16f Mon Sep 17 00:00:00 2001 From: Paul Berry Date: Tue, 29 Sep 2020 14:39:33 -0700 Subject: [PATCH 163/245] Remove unnecessary cast. (dart-lang/csslib#117) This cast was working around https://github.com/dart-lang/sdk/issues/43136. Now that it is fixed, the cast is no longer needed. --- pkgs/csslib/CHANGELOG.md | 2 ++ pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/samples_test.dart | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 8e430ac13..9132b57ca 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -3,6 +3,8 @@ - `Font.merge` and `BoxEdge.merge` are now static methods instead of factory constructors. - Add a type on the `identList` argument to `TokenKind.matchList`. +- Remove workaround for https://github.com/dart-lang/sdk/issues/43136, which is + now fixed. ## 0.16.2 diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 53be25666..4eee8367b 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -5,7 +5,7 @@ description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib environment: - sdk: '>=2.10.0-2.0.dev <2.10.0' + sdk: '>=2.11.0-0.0 <2.11.0' dependencies: source_span: ^1.8.0-nullsafety diff --git a/pkgs/csslib/test/samples_test.dart b/pkgs/csslib/test/samples_test.dart index 5a066a65c..b90613115 100644 --- a/pkgs/csslib/test/samples_test.dart +++ b/pkgs/csslib/test/samples_test.dart @@ -27,7 +27,7 @@ void main() { final cssDir = Directory.fromUri(libraryUri.resolve('examples')); for (var element in cssDir.listSync()) { if (element is File && element.uri.pathSegments.last.endsWith('.css')) { - test(element.uri.pathSegments.last, () => testCSSFile(element as File)); + test(element.uri.pathSegments.last, () => testCSSFile(element)); } } } From c8e19b628b00813901234c76cb6a4fa7c8e80d99 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 4 Nov 2020 19:56:56 -0800 Subject: [PATCH 164/245] Update SDK constraint and remove unneeded dependency overrides (dart-lang/csslib#119) --- pkgs/csslib/pubspec.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 4eee8367b..d83923145 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -5,7 +5,7 @@ description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib environment: - sdk: '>=2.11.0-0.0 <2.11.0' + sdk: '>=2.12.0-0 <3.0.0' dependencies: source_span: ^1.8.0-nullsafety @@ -13,7 +13,3 @@ dependencies: dev_dependencies: pedantic: ^1.10.0-nullsafety test: ^1.16.0-nullsafety.2 - -dependency_overrides: - analyzer: 0.40.0 - html: 0.14.0+3 From 916697afa45e5ebee6e70cf45aad41e8a15b754c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 12 Nov 2020 17:08:50 -0800 Subject: [PATCH 165/245] Delete .test_config --- pkgs/csslib/.test_config | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 pkgs/csslib/.test_config diff --git a/pkgs/csslib/.test_config b/pkgs/csslib/.test_config deleted file mode 100644 index 412fc5c5c..000000000 --- a/pkgs/csslib/.test_config +++ /dev/null @@ -1,3 +0,0 @@ -{ - "test_package": true -} \ No newline at end of file From 0419ffb452c57625d996c7f0ea546cb3526b26de Mon Sep 17 00:00:00 2001 From: Alexander Thomas Date: Mon, 21 Dec 2020 22:27:44 +0100 Subject: [PATCH 166/245] Migrate to GitHub Actions (dart-lang/csslib#121) * Delete .travis.yml --- .../csslib/.github/workflows/test-package.yml | 61 +++++++++++++++++++ pkgs/csslib/.travis.yml | 36 ----------- 2 files changed, 61 insertions(+), 36 deletions(-) create mode 100644 pkgs/csslib/.github/workflows/test-package.yml delete mode 100644 pkgs/csslib/.travis.yml diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml new file mode 100644 index 000000000..1cd8438b6 --- /dev/null +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -0,0 +1,61 @@ +name: Dart CI + +on: + # Run on PRs and pushes to the default branch. + push: + branches: [ master ] + pull_request: + branches: [ master ] + schedule: + - cron: "0 0 * * 0" + +env: + PUB_ENVIRONMENT: bot.github + +jobs: + # Check code formatting and static analysis on a single OS (linux) + # against Dart dev. + analyze: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + sdk: [dev] + steps: + - uses: actions/checkout@v2 + - uses: dart-lang/setup-dart@v0.1 + with: + channel: ${{ matrix.sdk }} + - id: install + name: Install dependencies + run: dart pub get + - name: Check formatting + run: dart format --output=none --set-exit-if-changed . + if: always() && steps.install.outcome == 'success' + - name: Analyze code + run: dart analyze --fatal-infos + if: always() && steps.install.outcome == 'success' + + # Run tests on a matrix consisting of two dimensions: + # 1. OS: ubuntu-latest, (macos-latest, windows-latest) + # 2. release channel: dev + test: + needs: analyze + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + # Add macos-latest and/or windows-latest if relevant for this package. + os: [ubuntu-latest] + sdk: [dev] + steps: + - uses: actions/checkout@v2 + - uses: dart-lang/setup-dart@v0.1 + with: + channel: ${{ matrix.sdk }} + - id: install + name: Install dependencies + run: dart pub get + - name: Run VM tests + run: dart test --platform vm + if: always() && steps.install.outcome == 'success' diff --git a/pkgs/csslib/.travis.yml b/pkgs/csslib/.travis.yml deleted file mode 100644 index 074faa54b..000000000 --- a/pkgs/csslib/.travis.yml +++ /dev/null @@ -1,36 +0,0 @@ -language: dart - -dart: -- dev - -jobs: - include: - - stage: analyze_and_format - name: "Analyzer" - os: linux - script: dartanalyzer --fatal-warnings --fatal-infos . - - stage: analyze_and_format - name: "Format" - os: linux - script: dartfmt -n --set-exit-if-changed . - - stage: test - name: "Sound null safety tests" - os: linux - # https://github.com/dart-lang/sdk/issues/43243 - script: pub run --enable-experiment=non-nullable test -p vm - - stage: test - name: "Weak null safety tests" - os: linux - script: pub run test -p vm - -stages: -- analyze_and_format -- test - -# Only building master means that we don't run two builds for each pull request. -branches: - only: [master] - -cache: - directories: - - $HOME/.pub-cache From 08bf348f66a7e2ca82286af7ba895d9d9ff8581f Mon Sep 17 00:00:00 2001 From: Ted Sander Date: Tue, 22 Dec 2020 10:49:37 -0800 Subject: [PATCH 167/245] Add a psuedo compound selector global-context Add global-context to process it's compound selector. This will be used in the angular.dart framework to handle another encapsulation scenario. --- pkgs/csslib/lib/parser.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index a7a2d3bb1..c5168087c 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1550,7 +1550,10 @@ class _Parser { _eat(TokenKind.RPAREN); return NegationSelector(negArg, _makeSpan(start)); - } else if (!pseudoElement && (name == 'host' || name == 'host-context')) { + } else if (!pseudoElement && + (name == 'host' || + name == 'host-context' || + name == 'global-context')) { _eat(TokenKind.LPAREN); var selector = processCompoundSelector(); if (selector == null) { From 1246ad0a57e426e522535f2c7ec3f182d04204c2 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Mon, 25 Jan 2021 11:15:16 -0800 Subject: [PATCH 168/245] Prepare to publish (dart-lang/csslib#125) --- pkgs/csslib/CHANGELOG.md | 2 +- pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 9132b57ca..64d6cd596 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.17.0-nullsafety-dev +## 0.17.0-nullsafety.0 - `Font.merge` and `BoxEdge.merge` are now static methods instead of factory constructors. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index d83923145..412a235c1 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.17.0-nullsafety-dev +version: 0.17.0-nullsafety.0 description: A library for parsing CSS. homepage: https://github.com/dart-lang/csslib From c988386abb08d6f9e9374013bb8b2ae246f3bdff Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Mon, 25 Jan 2021 11:21:42 -0800 Subject: [PATCH 169/245] Add changelog entry for null safety (dart-lang/csslib#126) --- pkgs/csslib/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 64d6cd596..e05854ea2 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,5 +1,6 @@ ## 0.17.0-nullsafety.0 +- Migrate to null safety. - `Font.merge` and `BoxEdge.merge` are now static methods instead of factory constructors. - Add a type on the `identList` argument to `TokenKind.matchList`. From 9d0f0d28195e612f8d81e978e76754138be898cc Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 10 Feb 2021 16:54:52 -0800 Subject: [PATCH 170/245] prepare for stable, null-safe version (dart-lang/csslib#127) --- pkgs/csslib/CHANGELOG.md | 2 +- pkgs/csslib/pubspec.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index e05854ea2..be212028f 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.17.0-nullsafety.0 +## 0.17.0 - Migrate to null safety. - `Font.merge` and `BoxEdge.merge` are now static methods instead of factory diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 412a235c1..2656efb38 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,15 +1,15 @@ name: csslib -version: 0.17.0-nullsafety.0 +version: 0.17.0 description: A library for parsing CSS. -homepage: https://github.com/dart-lang/csslib +repository: https://github.com/dart-lang/csslib environment: sdk: '>=2.12.0-0 <3.0.0' dependencies: - source_span: ^1.8.0-nullsafety + source_span: ^1.8.0 dev_dependencies: - pedantic: ^1.10.0-nullsafety - test: ^1.16.0-nullsafety.2 + pedantic: ^1.10.0 + test: ^1.16.0 From 7ee4d522b8dbc4c011ff34c0f093a0755895427a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90=C3=A0o=20Ho=C3=A0ng=20S=C6=A1n?= Date: Wed, 24 Feb 2021 00:59:37 +0700 Subject: [PATCH 171/245] Fix crash using `Color.css` with rgb(), rgba(). (dart-lang/csslib#104) Fixes dart-lang/csslib#88 Use `.toInt()` over `as int` to convert `double` to `int`. --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/lib/src/property.dart | 14 +++----------- pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/color_test.dart | 20 ++++++++++++++++++++ 4 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 pkgs/csslib/test/color_test.dart diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index be212028f..a5415ee36 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.17.1-dev + +- Fix `Color.css` constructor when there are double values in the `rgba` string. + ## 0.17.0 - Migrate to null safety. diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index a8c3c8087..c3b74bc97 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -258,10 +258,10 @@ class Color implements _StyleProperty, ColorBase { switch (type) { case _rgbCss: return Color.convertToHexString( - args[0] as int, args[1] as int, args[2] as int); + args[0].toInt(), args[1].toInt(), args[2].toInt()); case _rgbaCss: return Color.convertToHexString( - args[0] as int, args[1] as int, args[2] as int, args[3]); + args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3]); case _hslCss: return Hsla(args[0], args[1], args[2]).toHexArgbString(); case _hslaCss: @@ -290,15 +290,7 @@ class Color implements _StyleProperty, ColorBase { return '$aHex$rHex$gHex$bHex'.toLowerCase(); } - static String _numAs2DigitHex(num v) { - // TODO(terry): v.toInt().toRadixString instead of v.toRadixString - // Bug . - var hex = v.toInt().toRadixString(16); - if (hex.length == 1) { - hex = '0${hex}'; - } - return hex; - } + static String _numAs2DigitHex(int v) => v.toRadixString(16).padLeft(2, '0'); static T _clamp(T value, T min, T max) => math.max(math.min(max, value), min); diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 2656efb38..ed521e985 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.17.0 +version: 0.17.1-dev description: A library for parsing CSS. repository: https://github.com/dart-lang/csslib diff --git a/pkgs/csslib/test/color_test.dart b/pkgs/csslib/test/color_test.dart new file mode 100644 index 000000000..923184873 --- /dev/null +++ b/pkgs/csslib/test/color_test.dart @@ -0,0 +1,20 @@ +// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:csslib/parser.dart'; +import 'package:test/test.dart'; + +void main() { + group('css', () { + test('rgb', () { + final color = Color.css('rgb(0, 0, 255)'); + expect(color, equals(Color(0x0000FF))); + }); + + test('rgba', () { + final color = Color.css('rgba(0, 0, 255, 1.0)'); + expect(color, equals(Color.createRgba(0, 0, 255, 1.0))); + }); + }); +} From 235b350f65f38070c05bceba5e0fb8293226116a Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 11 Mar 2021 13:31:27 -0800 Subject: [PATCH 172/245] Fix latest lints (dart-lang/csslib#128) --- pkgs/csslib/lib/parser.dart | 8 ++++---- pkgs/csslib/lib/src/analyzer.dart | 4 ++-- pkgs/csslib/lib/src/tree_base.dart | 6 +++--- pkgs/csslib/lib/src/tree_printer.dart | 4 ++-- pkgs/csslib/test/testing.dart | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index c5168087c..2e622719a 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2257,11 +2257,11 @@ class _Parser { return _parseHex(' ${processTerm().text}', _makeSpan(start)); case TokenKind.INTEGER: t = _next(); - value = int.parse('${unary}${t.text}'); + value = int.parse('$unary${t.text}'); break; case TokenKind.DOUBLE: t = _next(); - value = double.parse('${unary}${t.text}'); + value = double.parse('$unary${t.text}'); break; case TokenKind.SINGLE_QUOTE: value = processQuotedString(false); @@ -2331,8 +2331,8 @@ class _Parser { if (isChecked) { var propName = nameValue.name; var errMsg = TokenKind.isPredefinedName(propName) - ? 'Improper use of property value ${propName}' - : 'Unknown property value ${propName}'; + ? 'Improper use of property value $propName' + : 'Unknown property value $propName'; _warning(errMsg, _makeSpan(start)); } return LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 68997960a..6d33e2532 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -50,7 +50,7 @@ class Analyzer { // Expand any @extend. _styleSheets.forEach((styleSheet) { var allExtends = AllExtends()..visitStyleSheet(styleSheet); - InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet); + InheritExtends(_messages, allExtends).visitStyleSheet(styleSheet); }); } } @@ -872,7 +872,7 @@ class _IncludeReplacer extends Visitor { /// @include. class MixinsAndIncludes extends Visitor { static void remove(StyleSheet styleSheet) { - MixinsAndIncludes()..visitStyleSheet(styleSheet); + MixinsAndIncludes().visitStyleSheet(styleSheet); } bool _nodesToRemove(node) => diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index dc7aa766b..db3a56c4f 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -69,7 +69,7 @@ class TreeOutput { } void writeNode(String label, TreeNode? node) { - write('${label}: '); + write('$label: '); depth += 1; if (node != null) { node.visit(printer!); @@ -81,11 +81,11 @@ class TreeOutput { void writeValue(String label, value) { var v = toValue(value); - writeln('${label}: ${v}'); + writeln('$label: $v'); } void writeNodeList(String label, List? list) { - writeln('${label} ['); + writeln('$label ['); if (list != null) { depth += 1; for (var node in list) { diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 72f1223f4..0d184006b 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -9,7 +9,7 @@ part of '../visitor.dart'; /// Helper function to dump the CSS AST. String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) { var to = TreeOutput(); - _TreePrinter(to, useSpan)..visitTree(styleSheet); + _TreePrinter(to, useSpan).visitTree(styleSheet); return to.toString(); } @@ -392,7 +392,7 @@ class _TreePrinter extends Visitor { output.depth++; super.visitAttributeSelector(node); var tokenStr = node.matchOperatorAsTokenString(); - output.writeValue('operator', '${node.matchOperator()} (${tokenStr})'); + output.writeValue('operator', '${node.matchOperator()} ($tokenStr)'); output.writeValue('value', node.valueToString()); output.depth--; } diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 2094420e2..e08b30540 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -74,7 +74,7 @@ String compactOutput(StyleSheet ss) { /// Walks the style sheet tree does nothing; insures the basic walker works. void walkTree(StyleSheet ss) { - _cssVisitor..visitTree(ss); + _cssVisitor.visitTree(ss); } String dumpTree(StyleSheet ss) => treeToDebugString(ss); From 767b3dbcfb24c03cd3bebc729b6cb69f6bf573bd Mon Sep 17 00:00:00 2001 From: Franklin Yow <58489007+franklinyow@users.noreply.github.com> Date: Mon, 5 Apr 2021 14:11:48 -0700 Subject: [PATCH 173/245] Update LICENSE Changes to comply with internal review --- pkgs/csslib/LICENSE | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/LICENSE b/pkgs/csslib/LICENSE index ee9993031..ab3bfa014 100644 --- a/pkgs/csslib/LICENSE +++ b/pkgs/csslib/LICENSE @@ -1,4 +1,5 @@ -Copyright 2013, the Dart project authors. All rights reserved. +Copyright 2013, the Dart project authors. + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -9,7 +10,7 @@ met: copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. From 5dd13ed0784def92de7778e28cf5517be95eebe2 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 23 Apr 2021 12:43:51 -0700 Subject: [PATCH 174/245] Latest CI setup, test on oldest supported SDK (dart-lang/csslib#130) --- pkgs/csslib/.github/workflows/test-package.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 1cd8438b6..e47bf6600 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -23,9 +23,9 @@ jobs: sdk: [dev] steps: - uses: actions/checkout@v2 - - uses: dart-lang/setup-dart@v0.1 + - uses: dart-lang/setup-dart@v1.0 with: - channel: ${{ matrix.sdk }} + sdk: ${{ matrix.sdk }} - id: install name: Install dependencies run: dart pub get @@ -47,12 +47,12 @@ jobs: matrix: # Add macos-latest and/or windows-latest if relevant for this package. os: [ubuntu-latest] - sdk: [dev] + sdk: [2.12.0, dev] steps: - uses: actions/checkout@v2 - - uses: dart-lang/setup-dart@v0.1 + - uses: dart-lang/setup-dart@v1.0 with: - channel: ${{ matrix.sdk }} + sdk: ${{ matrix.sdk }} - id: install name: Install dependencies run: dart pub get From a755378d955cb38212dcb88538588eb9d6c679d3 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 24 May 2021 09:11:58 -0700 Subject: [PATCH 175/245] Fix unneeded imports (dart-lang/csslib#131) --- pkgs/csslib/test/compiler_test.dart | 5 +++-- pkgs/csslib/test/selector_test.dart | 1 - pkgs/csslib/test/testing.dart | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index a27bde193..ad0bfd36e 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -5,10 +5,11 @@ library compiler_test; import 'dart:convert'; -import 'package:test/test.dart'; + import 'package:csslib/parser.dart'; -import 'package:csslib/src/messages.dart'; import 'package:csslib/visitor.dart'; +import 'package:test/test.dart'; + import 'testing.dart'; void testClass() { diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index ed01a354e..93c848367 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -5,7 +5,6 @@ library selector_test; import 'package:csslib/parser.dart'; -import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; import 'testing.dart'; diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index e08b30540..2a51fdbd8 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -7,8 +7,6 @@ library testing; import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; -import 'package:csslib/src/messages.dart'; -import 'package:csslib/src/preprocessor_options.dart'; export 'package:csslib/src/preprocessor_options.dart'; From 6c2fd17bebea0f52c769d399659d2f3ace31df45 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Sat, 10 Jul 2021 20:46:08 -0700 Subject: [PATCH 176/245] Dart format with latest SDK (dart-lang/csslib#132) --- pkgs/csslib/lib/src/messages.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 0f4ff4dc1..3145cd284 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -49,7 +49,9 @@ class Message { var colors = useColors && _errorColors.containsKey(level); var levelColor = colors ? _errorColors[level] : null; if (colors) output.write(levelColor); - output..write(_errorLabel[level])..write(' '); + output + ..write(_errorLabel[level]) + ..write(' '); if (colors) output.write(_noColor); if (span == null) { From f294e568452a18b3385ceb11f1c2b95e7ec0b308 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Sat, 31 Jul 2021 17:31:55 -0700 Subject: [PATCH 177/245] Fix updated lints (dart-lang/csslib#133) --- pkgs/csslib/lib/parser.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 2e622719a..6c31d510d 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2588,7 +2588,9 @@ class _Parser { var token = _peek(); if (token == TokenKind.LPAREN) { left++; - } else if (token == TokenKind.RPAREN) left--; + } else if (token == TokenKind.RPAREN) { + left--; + } matchingParens = left == 0; if (!matchingParens) stringValue.write(_next().text); From 3a48a3003a75dc70002878d6e6f7d0515b2130b9 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Wed, 1 Sep 2021 08:34:25 -0700 Subject: [PATCH 178/245] Fix pre-existing HintCode.UNNECESSARY_TYPE_CHECK_TRUE --- pkgs/csslib/lib/src/polyfill.dart | 4 +--- pkgs/csslib/lib/src/tree.dart | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/lib/src/polyfill.dart b/pkgs/csslib/lib/src/polyfill.dart index 389b89cec..b65ec61af 100644 --- a/pkgs/csslib/lib/src/polyfill.dart +++ b/pkgs/csslib/lib/src/polyfill.dart @@ -246,9 +246,7 @@ VarDefinition _findTerminalVarDefinition( replaceExprs.replaceRange(0, 1, defaultValues); return varDef; } - if (foundDef is VarDefinition) { - return _findTerminalVarDefinition(varDefs, foundDef); - } + return _findTerminalVarDefinition(varDefs, foundDef); } else { // Return real CSS property. return varDef; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 83e8b0929..3af71dcdc 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -1736,9 +1736,7 @@ class HeightExpression extends DartStyleExpression { @override HeightExpression? merged(DartStyleExpression newHeightExpr) { - if (newHeightExpr is DartStyleExpression && - isHeight && - newHeightExpr.isHeight) { + if (isHeight && newHeightExpr.isHeight) { return newHeightExpr as HeightExpression; } From 5c111e59b39225f563413b80650b94c78817350a Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Thu, 16 Sep 2021 11:18:15 +0200 Subject: [PATCH 179/245] Remove all third_party files stored in the wrong location --- pkgs/csslib/test/examples/base.css | 2057 ----- pkgs/csslib/test/examples/boilerplate.css | 282 - pkgs/csslib/test/examples/bootstrap.css | 9320 --------------------- pkgs/csslib/test/examples/bulma.css | 7128 ---------------- pkgs/csslib/test/examples/foundation.css | 4398 ---------- pkgs/csslib/test/examples/materialize.css | 8952 -------------------- pkgs/csslib/test/examples/mdc-card.css | 412 - pkgs/csslib/test/examples/mdc-layout.css | 434 - pkgs/csslib/test/examples/pure.css | 1507 ---- pkgs/csslib/test/examples/skeleton.css | 418 - 10 files changed, 34908 deletions(-) delete mode 100644 pkgs/csslib/test/examples/base.css delete mode 100644 pkgs/csslib/test/examples/boilerplate.css delete mode 100644 pkgs/csslib/test/examples/bootstrap.css delete mode 100644 pkgs/csslib/test/examples/bulma.css delete mode 100644 pkgs/csslib/test/examples/foundation.css delete mode 100644 pkgs/csslib/test/examples/materialize.css delete mode 100644 pkgs/csslib/test/examples/mdc-card.css delete mode 100644 pkgs/csslib/test/examples/mdc-layout.css delete mode 100644 pkgs/csslib/test/examples/pure.css delete mode 100644 pkgs/csslib/test/examples/skeleton.css diff --git a/pkgs/csslib/test/examples/base.css b/pkgs/csslib/test/examples/base.css deleted file mode 100644 index d2f27937b..000000000 --- a/pkgs/csslib/test/examples/base.css +++ /dev/null @@ -1,2057 +0,0 @@ -/* ========================================================================== - -// Base Stylesheet - http://getbase.org -// Author: Matthew Hartman - http://www.matthewhartman.com.au/ -// Version: 3.3.0 - Last Updated: May 14, 2017 - -========================================================================== */ -*, *:before, *:after { - box-sizing: border-box; } - -html { - font-family: sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; } - -html, button, input, select, textarea { - font-family: inherit; } - -article, aside, details, figcaption, figure, footer, header, main, menu, nav, section, summary { - display: block; } - -body, form, fieldset, legend, input, select, textarea, button { - margin: 0; } - -audio:not([controls]) { - display: none; - height: 0; } - -audio, canvas, progress, video { - display: inline-block; } - -progress { - vertical-align: baseline; } - -[hidden], template { - display: none; } - -img { - border-style: none; } - -svg:not(:root) { - overflow: hidden; } - -body { - font-family: sans-serif; - font-size: 16px; - font-size: 1rem; - line-height: 22px; - line-height: 1.375rem; - color: #000; - font-weight: 400; - background: #fff; } - -p { - margin: 0 0 20px 0; } - -a { - color: #000; - text-decoration: underline; - background-color: transparent; - -webkit-text-decoration-skip: objects; } - a:active, a:hover { - color: #000; - outline-width: 0; - text-decoration: none; } - -h1, h2, h3, h4, h5, h6 { - font-family: sans-serif; - margin: 0; } - -h1, .fs-1 { - font-size: 32px; - font-size: 2rem; - line-height: 38px; - line-height: 2.375rem; } - -h2, .fs-2 { - font-size: 26px; - font-size: 1.625rem; - line-height: 32px; - line-height: 2rem; } - -h3, .fs-3 { - font-size: 22px; - font-size: 1.375rem; - line-height: 28px; - line-height: 1.75rem; } - -h4, .fs-4 { - font-size: 18px; - font-size: 1.125rem; - line-height: 24px; - line-height: 1.5rem; } - -h5, .fs-5 { - font-size: 16px; - font-size: 1rem; - line-height: 22px; - line-height: 1.375rem; } - -h6, .fs-6 { - font-size: 14px; - font-size: 0.875rem; - line-height: 20px; - line-height: 1.25rem; } - -h1 { - margin-bottom: .5em; - color: #000; - font-weight: 700; } - -h2 { - margin-bottom: .2em; - color: #000; - font-weight: 700; } - -h3 { - margin-bottom: .2em; - color: #000; - font-weight: 700; } - -h4 { - margin-bottom: .2em; - color: #000; - font-weight: 700; } - -h5 { - margin-bottom: .1em; - color: #000; - font-weight: 700; } - -h6 { - margin-bottom: .1em; - color: #000; - font-weight: 700; } - -b, strong, .strong { - font-weight: 700; } - -em, .em { - font-style: italic; } - -abbr[title], .abbr[title] { - border-bottom: none; - text-decoration: underline; - text-decoration: underline dotted; } - -dfn { - font-style: italic; } - -small, .small { - font-size: 13px; - font-size: 0.8125rem; - line-height: 16px; - line-height: 1rem; } - -mark, .mark { - background-color: #ff0; - color: #000; } - -sub, .sub, sup, .sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sub, .sub { - bottom: -0.25em; } - -sup, .sup { - top: -0.5em; } - -del, .del { - text-decoration: line-through; } - -figure { - margin: 1em 40px; } - -hr, .hr { - box-sizing: content-box; - height: 1px; - background: #eee; - border: 0; - margin-top: 20px; - margin-bottom: 20px; } - -ul, ol { - margin: 20px 0; - padding: 0 0 0 40px; } - -dl:before, dl:after { - content: " "; - display: table; } - -dl:after { - clear: both; } - -dl dt { - float: left; - width: 25%; - display: block; - font-weight: 400; } - -dl dd { - overflow: hidden; - display: block; } - -blockquote, -.blockquote { - font-family: sans-serif; - font-weight: 400; - font-style: italic; - margin: 20px 0; } - blockquote p, - .blockquote p { - font-size: 22px; - font-size: 1.375rem; - line-height: 28px; - line-height: 1.75rem; - margin-bottom: 20px; } - blockquote cite, - .blockquote cite { - font-size: 13px; - font-size: 0.8125rem; - line-height: 19px; - line-height: 1.1875rem; - font-weight: 700; - font-style: normal; } - -caption { - font-size: inherit; - line-height: normal; - font-weight: 700; - text-align: left; - padding: 10px; - border-bottom: 1px solid #d7d7d7; } - -table { - font-size: 14px; - font-size: 0.875rem; - border-collapse: collapse; - border-spacing: 0; - width: 100%; - margin: 0; - text-align: left; } - table thead td, - table thead th, - table tbody td, - table tbody th, - table tfoot td, - table tfoot th { - color: #585858; - padding: 10px; - border-bottom: 1px solid #e9e9e9; } - -code, kbd, pre, samp { - font-size: 13px; - font-size: 0.8125rem; - line-height: 18px; - line-height: 1.125rem; - word-wrap: break-word; - font-family: monospace, monospace; - color: #000; - background-color: transparent; - font-weight: normal; - padding: 0; - white-space: pre-wrap; } - -pre { - padding: 10px; - overflow: auto; - border: 1px solid #d7d7d7; } - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; } - -legend { - box-sizing: border-box; - color: inherit; - display: table; - max-width: 100%; - padding: 0; - white-space: normal; } - -label, -button, -input, -optgroup, -select, -textarea { - color: #000; - font: inherit; - margin: 0; } - -[type="text"], -[type="email"], -[type="password"], -[type="tel"], -[type="number"], -[type="date"] { - height: 36px; - padding: 10px; - background-color: #fff; - border: 1px solid #ccc; - -webkit-appearance: none; - -moz-appearance: textfield; - border-radius: 0; } - [type="text"]:focus, - [type="email"]:focus, - [type="password"]:focus, - [type="tel"]:focus, - [type="number"]:focus, - [type="date"]:focus { - background-color: #fff; - border-color: #f7c723; - outline: 0; } - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; } - -[type="date"]::-webkit-inner-spin-button { - display: none; - -webkit-appearance: none; } - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; - padding: 0; } - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; } - -[type="search"] { - -webkit-appearance: textfield; - outline-offset: -2px; } - -[type="search"]::-webkit-search-cancel-button, -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; } - -textarea { - padding: 10px; - background-color: #fff; - border: 1px solid #ccc; - overflow: auto; - border-radius: 0; } - textarea:focus { - background-color: #fff; - border-color: #f7c723; - outline: 0; } - -select { - text-transform: none; - height: 36px; - padding: 0 10px; - background-color: #fff; - border: 1px solid #ccc; } - select:focus { - background-color: #fff; - border-color: #f7c723; - outline: 0; } - -optgroup { - font-weight: 700; } - -button { - border-radius: 0; - overflow: visible; - text-transform: none; - cursor: pointer; } - -button, -html [type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; - border-radius: 0; } - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; } - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; } - -button[disabled], -html input[disabled] { - cursor: not-allowed; } - -input::-webkit-input-placeholder { - color: #999; } - -input:-moz-placeholder { - color: #999; } - -input::-moz-placeholder { - color: #999; } - -input:-ms-input-placeholder { - color: #999; } - -.button { - cursor: pointer; - border: 1px solid #d7d7d7; - background-color: #f3f3f3; - line-height: normal; - padding: 10px 20px; - text-decoration: none; - color: #363636; - display: inline-block; - transition: all 0.3s; } - .button:hover, .button:active { - text-decoration: none; } - .button:hover { - background: #f9f9f9; } - -.button-link { - color: #000; - text-decoration: underline; - border: 0; - background: transparent; - padding: 0; } - .button-link:hover { - text-decoration: none; } - .button-link:active { - outline: 0; } - -.clear:before, .clear:after { - content: " "; - display: table; } - -.clear:after { - clear: both; } - -.row:before, .row:after { - content: ""; - display: table; } - -.row:after { - clear: both; } - -.row { - position: relative; - margin-left: -15px; - margin-right: -15px; } - -@media only screen and (min-width: 740px) { - .row-m { - position: relative; - margin-left: -15px; - margin-right: -15px; } - .row-m:before, .row-m:after { - content: ""; - display: table; } - .row-m:after { - clear: both; } - .clear-m:before, .clear-m:after { - content: ""; - display: table; } - .clear-m:after { - clear: both; } } - -@media only screen and (min-width: 980px) { - .row-l { - position: relative; - margin-left: -15px; - margin-right: -15px; } - .row-l:before, .row-l:after { - content: ""; - display: table; } - .row-l:after { - clear: both; } - .clear-l:before, .clear-l:after { - content: ""; - display: table; } - .clear-l:after { - clear: both; } } - -@media only screen and (min-width: 1140px) { - .row-xl { - position: relative; - margin-left: -15px; - margin-right: -15px; } - .row-xl:before, .row-xl:after { - content: ""; - display: table; } - .row-xl:after { - clear: both; } - .clear-xl:before, .clear-xl:after { - content: ""; - display: table; } - .clear-xl:after { - clear: both; } } - -.container, .container-full { - padding-left: 15px; - padding-right: 15px; - margin-left: auto; - margin-right: auto; } - -@media only screen and (min-width: 740px) { - .container { - width: 720px; } - .container-m, .container-full-m { - padding-left: 15px; - padding-right: 15px; - margin-left: auto; - margin-right: auto; } - .container-m { - width: 720px; } - .container-full-m { - width: auto; } } - -@media only screen and (min-width: 980px) { - .container { - width: 960px; } - .container-l, .container-full-l { - padding-left: 15px; - padding-right: 15px; - margin-left: auto; - margin-right: auto; } - .container-l { - width: 960px; } - .container-full-l { - width: auto; } } - -@media only screen and (min-width: 1140px) { - .container { - width: 1120px; } - .container-xl, .container-full-xl { - padding-left: 15px; - padding-right: 15px; - margin-left: auto; - margin-right: auto; } - .container-xl { - width: 1120px; } - .container-full-xl { - width: auto; } } - -.col-1, -.col-2, -.col-3, -.col-4, -.col-5, -.col-6, -.col-7, -.col-8, -.col-9, -.col-10, -.col-11, -.col-12, -.col-1-2, -.col-1-3, -.col-2-3, -.col-1-4, -.col-3-4, -.col-1-5, -.col-2-5, -.col-3-5, -.col-4-5 { - padding-left: 15px; - padding-right: 15px; - position: relative; - float: left; } - -.col-1 { - width: 8.33333%; } - -.col-2 { - width: 16.66667%; } - -.col-3 { - width: 25%; } - -.col-4 { - width: 33.33333%; } - -.col-5 { - width: 41.66667%; } - -.col-6 { - width: 50%; } - -.col-7 { - width: 58.33333%; } - -.col-8 { - width: 66.66667%; } - -.col-9 { - width: 75%; } - -.col-10 { - width: 83.33333%; } - -.col-11 { - width: 91.66667%; } - -.col-12 { - width: 100%; } - -.col-1-2 { - width: 50%; } - -.col-1-3 { - width: 33.33333%; } - -.col-2-3 { - width: 66.66667%; } - -.col-1-4 { - width: 25%; } - -.col-3-4 { - width: 75%; } - -.col-1-5 { - width: 20%; } - -.col-2-5 { - width: 40%; } - -.col-3-5 { - width: 60%; } - -.col-4-5 { - width: 80%; } - -.col-full { - width: 100%; } - -@media only screen and (min-width: 740px) { - .col-1-m, - .col-2-m, - .col-3-m, - .col-4-m, - .col-5-m, - .col-6-m, - .col-7-m, - .col-8-m, - .col-9-m, - .col-10-m, - .col-11-m, - .col-12-m, - .col-1-2-m, - .col-1-3-m, - .col-2-3-m, - .col-1-4-m, - .col-3-4-m, - .col-1-5-m, - .col-2-5-m, - .col-3-5-m, - .col-4-5-m { - padding-left: 15px; - padding-right: 15px; - position: relative; - float: -91.66667%; } - .col-1-m { - width: 8.33333%; } - .col-2-m { - width: 16.66667%; } - .col-3-m { - width: 25%; } - .col-4-m { - width: 33.33333%; } - .col-5-m { - width: 41.66667%; } - .col-6-m { - width: 50%; } - .col-7-m { - width: 58.33333%; } - .col-8-m { - width: 66.66667%; } - .col-9-m { - width: 75%; } - .col-10-m { - width: 83.33333%; } - .col-11-m { - width: 91.66667%; } - .col-12-m { - width: 100%; } - .col-1-2-m { - width: 50%; } - .col-1-3-m { - width: 33.33333%; } - .col-2-3-m { - width: 66.66667%; } - .col-1-4-m { - width: 25%; } - .col-3-4-m { - width: 75%; } - .col-1-5-m { - width: 20%; } - .col-2-5-m { - width: 40%; } - .col-3-5-m { - width: 60%; } - .col-4-5-m { - width: 80%; } - .col-full-m { - width: 100%; } } - -@media only screen and (min-width: 980px) { - .col-1-l, - .col-2-l, - .col-3-l, - .col-4-l, - .col-5-l, - .col-6-l, - .col-7-l, - .col-8-l, - .col-9-l, - .col-10-l, - .col-11-l, - .col-12-l, - .col-1-2-l, - .col-1-3-l, - .col-2-3-l, - .col-1-4-l, - .col-3-4-l, - .col-1-5-l, - .col-2-5-l, - .col-3-5-l, - .col-4-5-l { - padding-left: 15px; - padding-right: 15px; - position: relative; - float: -91.66667%; } - .col-1-l { - width: 8.33333%; } - .col-2-l { - width: 16.66667%; } - .col-3-l { - width: 25%; } - .col-4-l { - width: 33.33333%; } - .col-5-l { - width: 41.66667%; } - .col-6-l { - width: 50%; } - .col-7-l { - width: 58.33333%; } - .col-8-l { - width: 66.66667%; } - .col-9-l { - width: 75%; } - .col-10-l { - width: 83.33333%; } - .col-11-l { - width: 91.66667%; } - .col-12-l { - width: 100%; } - .col-1-2-l { - width: 50%; } - .col-1-3-l { - width: 33.33333%; } - .col-2-3-l { - width: 66.66667%; } - .col-1-4-l { - width: 25%; } - .col-3-4-l { - width: 75%; } - .col-1-5-l { - width: 20%; } - .col-2-5-l { - width: 40%; } - .col-3-5-l { - width: 60%; } - .col-4-5-l { - width: 80%; } - .col-full-l { - width: 100%; } } - -@media only screen and (min-width: 1140px) { - .col-1-xl, - .col-2-xl, - .col-3-xl, - .col-4-xl, - .col-5-xl, - .col-6-xl, - .col-7-xl, - .col-8-xl, - .col-9-xl, - .col-10-xl, - .col-11-xl, - .col-12-xl, - .col-1-2-xl, - .col-1-3-xl, - .col-2-3-xl, - .col-1-4-xl, - .col-3-4-xl, - .col-1-5-xl, - .col-2-5-xl, - .col-3-5-xl, - .col-4-5-xl { - padding-left: 15px; - padding-right: 15px; - position: relative; - float: -91.66667%; } - .col-1-xl { - width: 8.33333%; } - .col-2-xl { - width: 16.66667%; } - .col-3-xl { - width: 25%; } - .col-4-xl { - width: 33.33333%; } - .col-5-xl { - width: 41.66667%; } - .col-6-xl { - width: 50%; } - .col-7-xl { - width: 58.33333%; } - .col-8-xl { - width: 66.66667%; } - .col-9-xl { - width: 75%; } - .col-10-xl { - width: 83.33333%; } - .col-11-xl { - width: 91.66667%; } - .col-12-xl { - width: 100%; } - .col-1-2-xl { - width: 50%; } - .col-1-3-xl { - width: 33.33333%; } - .col-2-3-xl { - width: 66.66667%; } - .col-1-4-xl { - width: 25%; } - .col-3-4-xl { - width: 75%; } - .col-1-5-xl { - width: 20%; } - .col-2-5-xl { - width: 40%; } - .col-3-5-xl { - width: 60%; } - .col-4-5-xl { - width: 80%; } - .col-full-xl { - width: 100%; } } - -@-webkit-keyframes fadeIn { - 0% { - opacity: 0; } - 100% { - opacity: 1; } } - -@keyframes fadeIn { - 0% { - opacity: 0; } - 100% { - opacity: 1; } } - -.fade-in { - -webkit-animation-name: fadeIn; - animation-name: fadeIn; } - -@-webkit-keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -@keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -.fade-in-down { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown; } - -@-webkit-keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -@keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -.fade-in-down-big { - -webkit-animation-name: fadeInDownBig; - animation-name: fadeInDownBig; } - -@-webkit-keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translate3d(-30px, 0, 0); - transform: translate3d(-30px, 0, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -@keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translate3d(-30px, 0, 0); - transform: translate3d(-30px, 0, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -.fade-in-left { - -webkit-animation-name: fadeInLeft; - animation-name: fadeInLeft; } - -@-webkit-keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -@keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -.fade-in-left-big { - -webkit-animation-name: fadeInLeftBig; - animation-name: fadeInLeftBig; } - -@-webkit-keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translate3d(30px, 0, 0); - transform: translate3d(30px, 0, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -@keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translate3d(30px, 0, 0); - transform: translate3d(30px, 0, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -.fade-in-right { - -webkit-animation-name: fadeInRight; - animation-name: fadeInRight; } - -@-webkit-keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -@keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -.fade-in-right-big { - -webkit-animation-name: fadeInRightBig; - animation-name: fadeInRightBig; } - -@-webkit-keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 30px, 0); - transform: translate3d(0, 30px, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -@keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 30px, 0); - transform: translate3d(0, 30px, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -.fade-in-up { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp; } - -@-webkit-keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -@keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; } } - -.fade-in-up-big { - -webkit-animation-name: fadeInUpBig; - animation-name: fadeInUpBig; } - -@media print { - *, - *:before, - *:after { - background: transparent; - color: #000; - box-shadow: none; - text-shadow: none; } - a, a:visited { - text-decoration: underline; } - a[href]:after { - content: " (" attr(href) ")"; } - a[href^="#"]:after, a[href^="javascript:"]:after { - content: ""; } - pre, blockquote { - page-break-inside: avoid; } - thead { - display: table-header-group; } - tr { - page-break-inside: avoid; } - img { - page-break-inside: avoid; - max-width: 100%; } - p, h2, h3 { - orphans: 3; - widows: 3; } - h2, h3 { - page-break-after: avoid; } - abbr[title]:after { - content: " (" attr(title) ")"; } } - -.no-margin { - margin: 0; } - -.no-padding { - padding: 0; } - -.no-float { - float: none; } - -.no-background { - background: transparent; } - -.no-border { - border: 0; } - -.no-select { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: default; } - -.font-100 { - font-weight: 100; } - -.font-200 { - font-weight: 200; } - -.font-300 { - font-weight: 300; } - -.font-400 { - font-weight: 400; } - -.font-500 { - font-weight: 500; } - -.font-600 { - font-weight: 600; } - -.font-700 { - font-weight: 700; } - -.font-800 { - font-weight: 800; } - -.font-900 { - font-weight: 900; } - -.font-normal { - font-style: normal; } - -.font-italic { - font-style: italic; } - -.uppercase { - text-transform: uppercase; } - -.lowercase { - text-transform: lowercase; } - -.capitalize { - text-transform: capitalize; } - -.text-left { - text-align: left; } - -.text-right { - text-align: right; } - -.text-center { - text-align: center; } - -.text-justify { - text-align: justify; } - -.relative { - position: relative; } - -.absolute { - position: absolute; } - -.static { - position: static; } - -.fixed { - position: fixed; } - -.none { - display: none; } - -.block { - display: block; } - -.inline-block { - display: inline-block; } - -.inline { - display: inline; } - -.flex { - display: -webkit-box; - display: -ms-flexbox; - display: flex; } - -.flex-row { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; } - -.flex-column { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; } - -.flex-space-around { - -ms-flex-pack: distribute; - justify-content: space-around; } - -.flex-space-between { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; } - -.flex-start { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; } - -.flex-center { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; } - -.flex-end { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; } - -.flex-wrap { - -ms-flex-wrap: wrap; - flex-wrap: wrap; } - -.flex-nowrap { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; } - -.left { - float: left; } - -.right { - float: right; } - -.center { - float: none; - margin-left: auto; - margin-right: auto; } - -.pad-top-5 { - padding-top: 5px; } - -.pad-top-10 { - padding-top: 10px; } - -.pad-top-15 { - padding-top: 15px; } - -.pad-top-20 { - padding-top: 20px; } - -.pad-top-25 { - padding-top: 25px; } - -.pad-top-30 { - padding-top: 30px; } - -.pad-top-35 { - padding-top: 35px; } - -.pad-top-40 { - padding-top: 40px; } - -.pad-top-45 { - padding-top: 45px; } - -.pad-top-50 { - padding-top: 50px; } - -.pad-top-55 { - padding-top: 55px; } - -.pad-top-60 { - padding-top: 60px; } - -.pad-bottom-5 { - padding-bottom: 5px; } - -.pad-bottom-10 { - padding-bottom: 10px; } - -.pad-bottom-15 { - padding-bottom: 15px; } - -.pad-bottom-20 { - padding-bottom: 20px; } - -.pad-bottom-25 { - padding-bottom: 25px; } - -.pad-bottom-30 { - padding-bottom: 30px; } - -.pad-bottom-35 { - padding-bottom: 35px; } - -.pad-bottom-40 { - padding-bottom: 40px; } - -.pad-bottom-45 { - padding-bottom: 45px; } - -.pad-bottom-50 { - padding-bottom: 50px; } - -.pad-bottom-55 { - padding-bottom: 55px; } - -.pad-bottom-60 { - padding-bottom: 60px; } - -.pad-5 { - padding: 5px; } - -.pad-10 { - padding: 10px; } - -.pad-15 { - padding: 15px; } - -.pad-20 { - padding: 20px; } - -.pad-25 { - padding: 25px; } - -.pad-30 { - padding: 30px; } - -.pad-35 { - padding: 35px; } - -.pad-40 { - padding: 40px; } - -.pad-45 { - padding: 45px; } - -.pad-50 { - padding: 50px; } - -.pad-55 { - padding: 55px; } - -.pad-60 { - padding: 60px; } - -.sr { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; } - -.list-unstyled { - list-style: none; - margin: 0; - padding: 0; } - .list-unstyled li { - margin: 0; - padding: 0; } - -.list-inline { - list-style: none; - margin: 0; - padding: 0; } - .list-inline li { - margin: 0; - padding: 0; - display: inline-block; } - -.img-fluid { - max-width: 100%; } - -.field { - width: 100%; } - -.form-group { - overflow: hidden; } - .form-group label { - display: inline-block; - padding-top: 8px; } - -.disabled, [disabled] { - pointer-events: none; - cursor: not-allowed; - opacity: .5; } - -.checkbox, -.radio { - display: inline-block; - position: relative; } - .checkbox label, - .radio label { - padding-left: 20px; - padding-top: 0; - display: inline-block; } - .checkbox input[type="checkbox"], - .checkbox input[type="radio"], - .radio input[type="checkbox"], - .radio input[type="radio"] { - position: absolute; - top: 4px; - left: 0; } - -.select { - position: relative; - display: block; } - .select:before { - content: ""; - border: 6px solid transparent; - border-top-color: #676767; - top: 50%; - right: 10px; - margin-top: -3px; - pointer-events: none; - position: absolute; } - .select select { - -webkit-appearance: none; - -moz-appearance: none; - height: 36px; - width: 100%; - padding: 0 10px; - line-height: normal; - border: 1px solid #ccc; - background: #fff; - display: block; } - .select select::-ms-expand { - display: none; } - .select select:focus { - border-color: #f7c723; } - .select select:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 #000; - border-color: #f7c723; } - -.animation { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; } - -.animation-infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; } - -@media only screen and (min-width: 740px) { - .no-float-m { - float: none; } - .no-padding-m { - padding: 0; } - .no-margin-m { - margin: 0; } - .relative-m { - position: relative; } - .absolute-m { - position: absolute; } - .static-m { - position: static; } - .fixed-m { - position: fixed; } - .none-m { - display: none; } - .block-m { - display: block; } - .inline-block-m { - display: inline-block; } - .inline-m { - display: inline; } - .flex-m { - display: -webkit-box; - display: -ms-flexbox; - display: flex; } - .flex-row-m { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; } - .flex-column-m { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; } - .flex-space-around-m { - -ms-flex-pack: distribute; - justify-content: space-around; } - .flex-space-between-m { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; } - .flex-start-m { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; } - .flex-center-m { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; } - .flex-end-m { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; } - .flex-wrap-m { - -ms-flex-wrap: wrap; - flex-wrap: wrap; } - .flex-nowrap-m { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; } - .left-m { - float: left; } - .right-m { - float: right; } - .center-m { - float: none; - margin-left: auto; - margin-right: auto; } - .text-left-m { - text-align: left; } - .text-right-m { - text-align: right; } - .text-center-m { - text-align: center; } - .text-justify-m { - text-align: justify; } - .no-col-m { - width: auto; - float: none; } - .no-push-m, .no-pull-m { - left: 0; } - .pad-top-0-m { - padding-top: 0; } - .pad-top-5-m { - padding-top: 5px; } - .pad-top-10-m { - padding-top: 10px; } - .pad-top-15-m { - padding-top: 15px; } - .pad-top-20-m { - padding-top: 20px; } - .pad-top-25-m { - padding-top: 25px; } - .pad-top-30-m { - padding-top: 30px; } - .pad-top-35-m { - padding-top: 35px; } - .pad-top-40-m { - padding-top: 40px; } - .pad-top-45-m { - padding-top: 45px; } - .pad-top-50-m { - padding-top: 50px; } - .pad-top-55-m { - padding-top: 55px; } - .pad-top-60-m { - padding-top: 60px; } - .pad-bottom-0-m { - padding-bottom: 0; } - .pad-bottom-5-m { - padding-bottom: 5px; } - .pad-bottom-10-m { - padding-bottom: 10px; } - .pad-bottom-15-m { - padding-bottom: 15px; } - .pad-bottom-20-m { - padding-bottom: 20px; } - .pad-bottom-25-m { - padding-bottom: 25px; } - .pad-bottom-30-m { - padding-bottom: 30px; } - .pad-bottom-35-m { - padding-bottom: 35px; } - .pad-bottom-40-m { - padding-bottom: 40px; } - .pad-bottom-45-m { - padding-bottom: 45px; } - .pad-bottom-50-m { - padding-bottom: 50px; } - .pad-bottom-55-m { - padding-bottom: 55px; } - .pad-bottom-60-m { - padding-bottom: 60px; } - .pad-0-m { - padding: 0; } - .pad-5-m { - padding: 5px; } - .pad-10-m { - padding: 10px; } - .pad-15-m { - padding: 15px; } - .pad-20-m { - padding: 20px; } - .pad-25-m { - padding: 25px; } - .pad-30-m { - padding: 30px; } - .pad-35-m { - padding: 35px; } - .pad-40-m { - padding: 40px; } - .pad-45-m { - padding: 45px; } - .pad-50-m { - padding: 50px; } - .pad-55-m { - padding: 55px; } - .pad-60-m { - padding: 60px; } } - -@media only screen and (min-width: 980px) { - .no-float-l { - float: none; } - .no-padding-l { - padding: 0; } - .no-margin-l { - margin: 0; } - .relative-l { - position: relative; } - .absolute-l { - position: absolute; } - .static-l { - position: static; } - .fixed-l { - position: fixed; } - .none-l { - display: none; } - .block-l { - display: block; } - .inline-block-l { - display: inline-block; } - .inline-l { - display: inline; } - .flex-l { - display: -webkit-box; - display: -ms-flexbox; - display: flex; } - .flex-row-l { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; } - .flex-column-l { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; } - .flex-space-around-l { - -ms-flex-pack: distribute; - justify-content: space-around; } - .flex-space-between-l { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; } - .flex-start-l { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; } - .flex-center-l { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; } - .flex-end-l { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; } - .flex-wrap-l { - -ms-flex-wrap: wrap; - flex-wrap: wrap; } - .flex-nowrap-l { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; } - .left-l { - float: left; } - .right-l { - float: right; } - .center-l { - float: none; - margin-left: auto; - margin-right: auto; } - .text-left-l { - text-align: left; } - .text-right-l { - text-align: right; } - .text-center-l { - text-align: center; } - .text-justify-l { - text-align: justify; } - .no-col-l { - width: auto; - float: none; } - .no-push-l, .no-pull-l { - left: 0; } - .pad-top-0-l { - padding-top: 0; } - .pad-top-5-l { - padding-top: 5px; } - .pad-top-10-l { - padding-top: 10px; } - .pad-top-15-l { - padding-top: 15px; } - .pad-top-20-l { - padding-top: 20px; } - .pad-top-25-l { - padding-top: 25px; } - .pad-top-30-l { - padding-top: 30px; } - .pad-top-35-l { - padding-top: 35px; } - .pad-top-40-l { - padding-top: 40px; } - .pad-top-45-l { - padding-top: 45px; } - .pad-top-50-l { - padding-top: 50px; } - .pad-top-55-l { - padding-top: 55px; } - .pad-top-60-l { - padding-top: 60px; } - .pad-bottom-0-l { - padding-bottom: 0; } - .pad-bottom-5-l { - padding-bottom: 5px; } - .pad-bottom-10-l { - padding-bottom: 10px; } - .pad-bottom-15-l { - padding-bottom: 15px; } - .pad-bottom-20-l { - padding-bottom: 20px; } - .pad-bottom-25-l { - padding-bottom: 25px; } - .pad-bottom-30-l { - padding-bottom: 30px; } - .pad-bottom-35-l { - padding-bottom: 35px; } - .pad-bottom-40-l { - padding-bottom: 40px; } - .pad-bottom-45-l { - padding-bottom: 45px; } - .pad-bottom-50-l { - padding-bottom: 50px; } - .pad-bottom-55-l { - padding-bottom: 55px; } - .pad-bottom-60-l { - padding-bottom: 60px; } - .pad-0-l { - padding: 0; } - .pad-5-l { - padding: 5px; } - .pad-10-l { - padding: 10px; } - .pad-15-l { - padding: 15px; } - .pad-20-l { - padding: 20px; } - .pad-25-l { - padding: 25px; } - .pad-30-l { - padding: 30px; } - .pad-35-l { - padding: 35px; } - .pad-40-l { - padding: 40px; } - .pad-45-l { - padding: 45px; } - .pad-50-l { - padding: 50px; } - .pad-55-l { - padding: 55px; } - .pad-60-l { - padding: 60px; } } - -@media only screen and (min-width: 1140px) { - .no-float-xl { - float: none; } - .no-padding-xl { - padding: 0; } - .no-margin-xl { - margin: 0; } - .relative-xl { - position: relative; } - .absolute-xl { - position: absolute; } - .static-xl { - position: static; } - .fixed-xl { - position: fixed; } - .none-xl { - display: none; } - .block-xl { - display: block; } - .inline-block-xl { - display: inline-block; } - .inline-xl { - display: inline; } - .flex-xl { - display: -webkit-box; - display: -ms-flexbox; - display: flex; } - .flex-row-xl { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; } - .flex-column-xl { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; } - .flex-space-around-xl { - -ms-flex-pack: distribute; - justify-content: space-around; } - .flex-space-between-xl { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; } - .flex-start-xl { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; } - .flex-center-xl { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; } - .flex-end-xl { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; } - .flex-wrap-xl { - -ms-flex-wrap: wrap; - flex-wrap: wrap; } - .flex-nowrap-xl { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; } - .left-xl { - float: left; } - .right-xl { - float: right; } - .center-xl { - float: none; - margin-left: auto; - margin-right: auto; } - .text-left-xl { - text-align: left; } - .text-right-xl { - text-align: right; } - .text-center-xl { - text-align: center; } - .text-justify-xl { - text-align: justify; } - .no-col-xl { - width: auto; - float: none; } - .no-push-xl, .no-pull-xl { - left: 0; } - .pad-top-0-xl { - padding-top: 0; } - .pad-top-5-xl { - padding-top: 5px; } - .pad-top-10-xl { - padding-top: 10px; } - .pad-top-15-xl { - padding-top: 15px; } - .pad-top-20-xl { - padding-top: 20px; } - .pad-top-25-xl { - padding-top: 25px; } - .pad-top-30-xl { - padding-top: 30px; } - .pad-top-35-xl { - padding-top: 35px; } - .pad-top-40-xl { - padding-top: 40px; } - .pad-top-45-xl { - padding-top: 45px; } - .pad-top-50-xl { - padding-top: 50px; } - .pad-top-55-xl { - padding-top: 55px; } - .pad-top-60-xl { - padding-top: 60px; } - .pad-bottom-0-xl { - padding-bottom: 0; } - .pad-bottom-5-xl { - padding-bottom: 5px; } - .pad-bottom-10-xl { - padding-bottom: 10px; } - .pad-bottom-15-xl { - padding-bottom: 15px; } - .pad-bottom-20-xl { - padding-bottom: 20px; } - .pad-bottom-25-xl { - padding-bottom: 25px; } - .pad-bottom-30-xl { - padding-bottom: 30px; } - .pad-bottom-35-xl { - padding-bottom: 35px; } - .pad-bottom-40-xl { - padding-bottom: 40px; } - .pad-bottom-45-xl { - padding-bottom: 45px; } - .pad-bottom-50-xl { - padding-bottom: 50px; } - .pad-bottom-55-xl { - padding-bottom: 55px; } - .pad-bottom-60-xl { - padding-bottom: 60px; } - .pad-0-xl { - padding: 0; } - .pad-5-xl { - padding: 5px; } - .pad-10-xl { - padding: 10px; } - .pad-15-xl { - padding: 15px; } - .pad-20-xl { - padding: 20px; } - .pad-25-xl { - padding: 25px; } - .pad-30-xl { - padding: 30px; } - .pad-35-xl { - padding: 35px; } - .pad-40-xl { - padding: 40px; } - .pad-45-xl { - padding: 45px; } - .pad-50-xl { - padding: 50px; } - .pad-55-xl { - padding: 55px; } - .pad-60-xl { - padding: 60px; } } - -@media print { - .no-float-print { - float: none; } - .no-padding-print { - padding: 0; } - .no-margin-print { - margin: 0; } - .none-print { - display: none; } - .block-print { - display: block; } - .inline-block-print { - display: inline-block; } - .inline-print { - display: inline; } - .text-left-print { - text-align: left; } - .text-right-print { - text-align: right; } - .text-center-print { - text-align: center; } - .text-justify-print { - text-align: justify; } - .no-col-print { - width: auto; - float: none; } - .no-push-print, .no-pull-print { - left: 0; } - .pad-top-0-print { - padding-top: 0; } - .pad-top-5-print { - padding-top: 5px; } - .pad-top-10-print { - padding-top: 10px; } - .pad-top-15-print { - padding-top: 15px; } - .pad-top-20-print { - padding-top: 20px; } - .pad-top-25-print { - padding-top: 25px; } - .pad-top-30-print { - padding-top: 30px; } - .pad-top-35-print { - padding-top: 35px; } - .pad-top-40-print { - padding-top: 40px; } - .pad-top-45-print { - padding-top: 45px; } - .pad-top-50-print { - padding-top: 50px; } - .pad-top-55-print { - padding-top: 55px; } - .pad-top-60-print { - padding-top: 60px; } - .pad-bottom-0-print { - padding-bottom: 0; } - .pad-bottom-5-print { - padding-bottom: 5px; } - .pad-bottom-10-print { - padding-bottom: 10px; } - .pad-bottom-15-print { - padding-bottom: 15px; } - .pad-bottom-20-print { - padding-bottom: 20px; } - .pad-bottom-25-print { - padding-bottom: 25px; } - .pad-bottom-30-print { - padding-bottom: 30px; } - .pad-bottom-35-print { - padding-bottom: 35px; } - .pad-bottom-40-print { - padding-bottom: 40px; } - .pad-bottom-45-print { - padding-bottom: 45px; } - .pad-bottom-50-print { - padding-bottom: 50px; } - .pad-bottom-55-print { - padding-bottom: 55px; } - .pad-bottom-60-print { - padding-bottom: 60px; } - .pad-0-print { - padding: 0; } - .pad-5-print { - padding: 5px; } - .pad-10-print { - padding: 10px; } - .pad-15-print { - padding: 15px; } - .pad-20-print { - padding: 20px; } - .pad-25-print { - padding: 25px; } - .pad-30-print { - padding: 30px; } - .pad-35-print { - padding: 35px; } - .pad-40-print { - padding: 40px; } - .pad-45-print { - padding: 45px; } - .pad-50-print { - padding: 50px; } - .pad-55-print { - padding: 55px; } - .pad-60-print { - padding: 60px; } } - -/*# sourceMappingURL=styles.css.map */ diff --git a/pkgs/csslib/test/examples/boilerplate.css b/pkgs/csslib/test/examples/boilerplate.css deleted file mode 100644 index ebd0ebd00..000000000 --- a/pkgs/csslib/test/examples/boilerplate.css +++ /dev/null @@ -1,282 +0,0 @@ -/*! HTML5 Boilerplate v5.3.0 | MIT License | https://html5boilerplate.com/ */ - -/* - * What follows is the result of much research on cross-browser styling. - * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, - * Kroc Camen, and the H5BP dev community and team. - */ - -/* ========================================================================== - Base styles: opinionated defaults - ========================================================================== */ - -html { - color: #222; - font-size: 1em; - line-height: 1.4; -} - -/* - * Remove text-shadow in selection highlight: - * https://twitter.com/miketaylr/status/12228805301 - * - * These selection rule sets have to be separate. - * Customize the background color to match your design. - */ - -::-moz-selection { - background: #b3d4fc; - text-shadow: none; -} - -::selection { - background: #b3d4fc; - text-shadow: none; -} - -/* - * A better looking default horizontal rule - */ - -hr { - display: block; - height: 1px; - border: 0; - border-top: 1px solid #ccc; - margin: 1em 0; - padding: 0; -} - -/* - * Remove the gap between audio, canvas, iframes, - * images, videos and the bottom of their containers: - * https://github.com/h5bp/html5-boilerplate/issues/440 - */ - -audio, -canvas, -iframe, -img, -svg, -video { - vertical-align: middle; -} - -/* - * Remove default fieldset styles. - */ - -fieldset { - border: 0; - margin: 0; - padding: 0; -} - -/* - * Allow only vertical resizing of textareas. - */ - -textarea { - resize: vertical; -} - -/* ========================================================================== - Browser Upgrade Prompt - ========================================================================== */ - -.browserupgrade { - margin: 0.2em 0; - background: #ccc; - color: #000; - padding: 0.2em 0; -} - -/* ========================================================================== - Author's custom styles - ========================================================================== */ - - - - - - - - - - - - - - - - - -/* ========================================================================== - Helper classes - ========================================================================== */ - -/* - * Hide visually and from screen readers - */ - -.hidden { - display: none !important; -} - -/* - * Hide only visually, but have it available for screen readers: - * http://snook.ca/archives/html_and_css/hiding-content-for-accessibility - */ - -.visuallyhidden { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} - -/* - * Extends the .visuallyhidden class to allow the element - * to be focusable when navigated to via the keyboard: - * https://www.drupal.org/node/897638 - */ - -.visuallyhidden.focusable:active, -.visuallyhidden.focusable:focus { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; -} - -/* - * Hide visually and from screen readers, but maintain layout - */ - -.invisible { - visibility: hidden; -} - -/* - * Clearfix: contain floats - * - * For modern browsers - * 1. The space content is one way to avoid an Opera bug when the - * `contenteditable` attribute is included anywhere else in the document. - * Otherwise it causes space to appear at the top and bottom of elements - * that receive the `clearfix` class. - * 2. The use of `table` rather than `block` is only necessary if using - * `:before` to contain the top-margins of child elements. - */ - -.clearfix:before, -.clearfix:after { - content: " "; /* 1 */ - display: table; /* 2 */ -} - -.clearfix:after { - clear: both; -} - -/* ========================================================================== - EXAMPLE Media Queries for Responsive Design. - These examples override the primary ('mobile first') styles. - Modify as content requires. - ========================================================================== */ - -@media only screen and (min-width: 35em) { - /* Style adjustments for viewports that meet the condition */ -} - -@media print, - (-webkit-min-device-pixel-ratio: 1.25), - (min-resolution: 1.25dppx), - (min-resolution: 120dpi) { - /* Style adjustments for high resolution devices */ -} - -/* ========================================================================== - Print styles. - Inlined to avoid the additional HTTP request: - http://www.phpied.com/delay-loading-your-print-css/ - ========================================================================== */ - -@media print { - *, - *:before, - *:after, - *:first-letter, - *:first-line { - background: transparent !important; - color: #000 !important; /* Black prints faster: - http://www.sanbeiji.com/archives/953 */ - box-shadow: none !important; - text-shadow: none !important; - } - - a, - a:visited { - text-decoration: underline; - } - - a[href]:after { - content: " (" attr(href) ")"; - } - - abbr[title]:after { - content: " (" attr(title) ")"; - } - - /* - * Don't show links that are fragment identifiers, - * or use the `javascript:` pseudo protocol - */ - - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; - } - - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - - /* - * Printing Tables: - * http://css-discuss.incutio.com/wiki/Printing_Tables - */ - - thead { - display: table-header-group; - } - - tr, - img { - page-break-inside: avoid; - } - - img { - max-width: 100% !important; - } - - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - - h2, - h3 { - page-break-after: avoid; - } -} diff --git a/pkgs/csslib/test/examples/bootstrap.css b/pkgs/csslib/test/examples/bootstrap.css deleted file mode 100644 index 1038ebcb3..000000000 --- a/pkgs/csslib/test/examples/bootstrap.css +++ /dev/null @@ -1,9320 +0,0 @@ -/*! - * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com) - * Copyright 2011-2017 The Bootstrap Authors - * Copyright 2011-2017 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ -html { - font-family: sans-serif; - line-height: 1.15; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -article, -aside, -footer, -header, -nav, -section { - display: block; -} - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -figcaption, -figure, -main { - display: block; -} - -figure { - margin: 1em 40px; -} - -hr { - -webkit-box-sizing: content-box; - box-sizing: content-box; - height: 0; - overflow: visible; -} - -pre { - font-family: monospace, monospace; - font-size: 1em; -} - -a { - background-color: transparent; - -webkit-text-decoration-skip: objects; -} - -a:active, -a:hover { - outline-width: 0; -} - -abbr[title] { - border-bottom: none; - text-decoration: underline; - text-decoration: underline dotted; -} - -b, -strong { - font-weight: inherit; -} - -b, -strong { - font-weight: bolder; -} - -code, -kbd, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -dfn { - font-style: italic; -} - -mark { - background-color: #ff0; - color: #000; -} - -small { - font-size: 80%; -} - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -audio, -video { - display: inline-block; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -img { - border-style: none; -} - -svg:not(:root) { - overflow: hidden; -} - -button, -input, -optgroup, -select, -textarea { - font-family: sans-serif; - font-size: 100%; - line-height: 1.15; - margin: 0; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -button, -html [type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -legend { - -webkit-box-sizing: border-box; - box-sizing: border-box; - color: inherit; - display: table; - max-width: 100%; - padding: 0; - white-space: normal; -} - -progress { - display: inline-block; - vertical-align: baseline; -} - -textarea { - overflow: auto; -} - -[type="checkbox"], -[type="radio"] { - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -[type="search"] { - -webkit-appearance: textfield; - outline-offset: -2px; -} - -[type="search"]::-webkit-search-cancel-button, -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit; -} - -details, -menu { - display: block; -} - -summary { - display: list-item; -} - -canvas { - display: inline-block; -} - -template { - display: none; -} - -[hidden] { - display: none; -} - -@media print { - *, - *::before, - *::after, - p::first-letter, - div::first-letter, - blockquote::first-letter, - li::first-letter, - p::first-line, - div::first-line, - blockquote::first-line, - li::first-line { - text-shadow: none !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - abbr[title]::after { - content: " (" attr(title) ")"; - } - pre { - white-space: pre-wrap !important; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - .navbar { - display: none; - } - .badge { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} - -html { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} - -*, -*::before, -*::after { - -webkit-box-sizing: inherit; - box-sizing: inherit; -} - -@-ms-viewport { - width: device-width; -} - -html { - -ms-overflow-style: scrollbar; - -webkit-tap-highlight-color: transparent; -} - -body { - font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - font-size: 1rem; - font-weight: normal; - line-height: 1.5; - color: #292b2c; - background-color: #fff; -} - -[tabindex="-1"]:focus { - outline: none !important; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: .5rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: bold; -} - -dd { - margin-bottom: .5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -a { - color: #0275d8; - text-decoration: none; -} - -a:focus, a:hover { - color: #014c8c; - text-decoration: underline; -} - -a:not([href]):not([tabindex]) { - color: inherit; - text-decoration: none; -} - -a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover { - color: inherit; - text-decoration: none; -} - -a:not([href]):not([tabindex]):focus { - outline: 0; -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; -} - -figure { - margin: 0 0 1rem; -} - -img { - vertical-align: middle; -} - -[role="button"] { - cursor: pointer; -} - -a, -area, -button, -[role="button"], -input, -label, -select, -summary, -textarea { - -ms-touch-action: manipulation; - touch-action: manipulation; -} - -table { - border-collapse: collapse; - background-color: transparent; -} - -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: #636c72; - text-align: left; - caption-side: bottom; -} - -th { - text-align: left; -} - -label { - display: inline-block; - margin-bottom: .5rem; -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -input, -button, -select, -textarea { - line-height: inherit; -} - -input[type="radio"]:disabled, -input[type="checkbox"]:disabled { - cursor: not-allowed; -} - -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - -webkit-appearance: listbox; -} - -textarea { - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: .5rem; - font-size: 1.5rem; - line-height: inherit; -} - -input[type="search"] { - -webkit-appearance: none; -} - -output { - display: inline-block; -} - -[hidden] { - display: none !important; -} - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6 { - margin-bottom: 0.5rem; - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} - -h1, .h1 { - font-size: 2.5rem; -} - -h2, .h2 { - font-size: 2rem; -} - -h3, .h3 { - font-size: 1.75rem; -} - -h4, .h4 { - font-size: 1.5rem; -} - -h5, .h5 { - font-size: 1.25rem; -} - -h6, .h6 { - font-size: 1rem; -} - -.lead { - font-size: 1.25rem; - font-weight: 300; -} - -.display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.1; -} - -.display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.1; -} - -.display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.1; -} - -.display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.1; -} - -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0, 0, 0, 0.1); -} - -small, -.small { - font-size: 80%; - font-weight: normal; -} - -mark, -.mark { - padding: 0.2em; - background-color: #fcf8e3; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline-item { - display: inline-block; -} - -.list-inline-item:not(:last-child) { - margin-right: 5px; -} - -.initialism { - font-size: 90%; - text-transform: uppercase; -} - -.blockquote { - padding: 0.5rem 1rem; - margin-bottom: 1rem; - font-size: 1.25rem; - border-left: 0.25rem solid #eceeef; -} - -.blockquote-footer { - display: block; - font-size: 80%; - color: #636c72; -} - -.blockquote-footer::before { - content: "\2014 \00A0"; -} - -.blockquote-reverse { - padding-right: 1rem; - padding-left: 0; - text-align: right; - border-right: 0.25rem solid #eceeef; - border-left: 0; -} - -.blockquote-reverse .blockquote-footer::before { - content: ""; -} - -.blockquote-reverse .blockquote-footer::after { - content: "\00A0 \2014"; -} - -.img-fluid { - max-width: 100%; - height: auto; -} - -.img-thumbnail { - padding: 0.25rem; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 0.25rem; - -webkit-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - max-width: 100%; - height: auto; -} - -.figure { - display: inline-block; -} - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; -} - -.figure-caption { - font-size: 90%; - color: #636c72; -} - -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -code { - padding: 0.2rem 0.4rem; - font-size: 90%; - color: #bd4147; - background-color: #f7f7f9; - border-radius: 0.25rem; -} - -a > code { - padding: 0; - color: inherit; - background-color: inherit; -} - -kbd { - padding: 0.2rem 0.4rem; - font-size: 90%; - color: #fff; - background-color: #292b2c; - border-radius: 0.2rem; -} - -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; -} - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - font-size: 90%; - color: #292b2c; -} - -pre code { - padding: 0; - font-size: inherit; - color: inherit; - background-color: transparent; - border-radius: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container { - position: relative; - margin-left: auto; - margin-right: auto; - padding-right: 15px; - padding-left: 15px; -} - -@media (min-width: 576px) { - .container { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 768px) { - .container { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 992px) { - .container { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 1200px) { - .container { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 576px) { - .container { - width: 540px; - max-width: 100%; - } -} - -@media (min-width: 768px) { - .container { - width: 720px; - max-width: 100%; - } -} - -@media (min-width: 992px) { - .container { - width: 960px; - max-width: 100%; - } -} - -@media (min-width: 1200px) { - .container { - width: 1140px; - max-width: 100%; - } -} - -.container-fluid { - position: relative; - margin-left: auto; - margin-right: auto; - padding-right: 15px; - padding-left: 15px; -} - -@media (min-width: 576px) { - .container-fluid { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 768px) { - .container-fluid { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 992px) { - .container-fluid { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 1200px) { - .container-fluid { - padding-right: 15px; - padding-left: 15px; - } -} - -.row { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin-right: -15px; - margin-left: -15px; -} - -@media (min-width: 576px) { - .row { - margin-right: -15px; - margin-left: -15px; - } -} - -@media (min-width: 768px) { - .row { - margin-right: -15px; - margin-left: -15px; - } -} - -@media (min-width: 992px) { - .row { - margin-right: -15px; - margin-left: -15px; - } -} - -@media (min-width: 1200px) { - .row { - margin-right: -15px; - margin-left: -15px; - } -} - -.no-gutters { - margin-right: 0; - margin-left: 0; -} - -.no-gutters > .col, -.no-gutters > [class*="col-"] { - padding-right: 0; - padding-left: 0; -} - -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { - position: relative; - width: 100%; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} - -@media (min-width: 576px) { - .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 768px) { - .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 992px) { - .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { - padding-right: 15px; - padding-left: 15px; - } -} - -@media (min-width: 1200px) { - .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl { - padding-right: 15px; - padding-left: 15px; - } -} - -.col { - -webkit-flex-basis: 0; - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; -} - -.col-auto { - -webkit-box-flex: 0; - -webkit-flex: 0 0 auto; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; -} - -.col-1 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 8.333333%; - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; -} - -.col-2 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 16.666667%; - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; -} - -.col-3 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 25%; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; -} - -.col-4 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 33.333333%; - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; -} - -.col-5 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 41.666667%; - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; -} - -.col-6 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 50%; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; -} - -.col-7 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 58.333333%; - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; -} - -.col-8 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 66.666667%; - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; -} - -.col-9 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 75%; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; -} - -.col-10 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 83.333333%; - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; -} - -.col-11 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 91.666667%; - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; -} - -.col-12 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 100%; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; -} - -.pull-0 { - right: auto; -} - -.pull-1 { - right: 8.333333%; -} - -.pull-2 { - right: 16.666667%; -} - -.pull-3 { - right: 25%; -} - -.pull-4 { - right: 33.333333%; -} - -.pull-5 { - right: 41.666667%; -} - -.pull-6 { - right: 50%; -} - -.pull-7 { - right: 58.333333%; -} - -.pull-8 { - right: 66.666667%; -} - -.pull-9 { - right: 75%; -} - -.pull-10 { - right: 83.333333%; -} - -.pull-11 { - right: 91.666667%; -} - -.pull-12 { - right: 100%; -} - -.push-0 { - left: auto; -} - -.push-1 { - left: 8.333333%; -} - -.push-2 { - left: 16.666667%; -} - -.push-3 { - left: 25%; -} - -.push-4 { - left: 33.333333%; -} - -.push-5 { - left: 41.666667%; -} - -.push-6 { - left: 50%; -} - -.push-7 { - left: 58.333333%; -} - -.push-8 { - left: 66.666667%; -} - -.push-9 { - left: 75%; -} - -.push-10 { - left: 83.333333%; -} - -.push-11 { - left: 91.666667%; -} - -.push-12 { - left: 100%; -} - -.offset-1 { - margin-left: 8.333333%; -} - -.offset-2 { - margin-left: 16.666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.333333%; -} - -.offset-5 { - margin-left: 41.666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.333333%; -} - -.offset-8 { - margin-left: 66.666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.333333%; -} - -.offset-11 { - margin-left: 91.666667%; -} - -@media (min-width: 576px) { - .col-sm { - -webkit-flex-basis: 0; - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-sm-auto { - -webkit-box-flex: 0; - -webkit-flex: 0 0 auto; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - } - .col-sm-1 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 8.333333%; - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-sm-2 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 16.666667%; - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-sm-3 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 25%; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-sm-4 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 33.333333%; - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-sm-5 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 41.666667%; - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-sm-6 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 50%; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-sm-7 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 58.333333%; - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-sm-8 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 66.666667%; - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-sm-9 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 75%; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-sm-10 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 83.333333%; - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-sm-11 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 91.666667%; - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-sm-12 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 100%; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .pull-sm-0 { - right: auto; - } - .pull-sm-1 { - right: 8.333333%; - } - .pull-sm-2 { - right: 16.666667%; - } - .pull-sm-3 { - right: 25%; - } - .pull-sm-4 { - right: 33.333333%; - } - .pull-sm-5 { - right: 41.666667%; - } - .pull-sm-6 { - right: 50%; - } - .pull-sm-7 { - right: 58.333333%; - } - .pull-sm-8 { - right: 66.666667%; - } - .pull-sm-9 { - right: 75%; - } - .pull-sm-10 { - right: 83.333333%; - } - .pull-sm-11 { - right: 91.666667%; - } - .pull-sm-12 { - right: 100%; - } - .push-sm-0 { - left: auto; - } - .push-sm-1 { - left: 8.333333%; - } - .push-sm-2 { - left: 16.666667%; - } - .push-sm-3 { - left: 25%; - } - .push-sm-4 { - left: 33.333333%; - } - .push-sm-5 { - left: 41.666667%; - } - .push-sm-6 { - left: 50%; - } - .push-sm-7 { - left: 58.333333%; - } - .push-sm-8 { - left: 66.666667%; - } - .push-sm-9 { - left: 75%; - } - .push-sm-10 { - left: 83.333333%; - } - .push-sm-11 { - left: 91.666667%; - } - .push-sm-12 { - left: 100%; - } - .offset-sm-0 { - margin-left: 0%; - } - .offset-sm-1 { - margin-left: 8.333333%; - } - .offset-sm-2 { - margin-left: 16.666667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.333333%; - } - .offset-sm-5 { - margin-left: 41.666667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.333333%; - } - .offset-sm-8 { - margin-left: 66.666667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.333333%; - } - .offset-sm-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 768px) { - .col-md { - -webkit-flex-basis: 0; - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-md-auto { - -webkit-box-flex: 0; - -webkit-flex: 0 0 auto; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - } - .col-md-1 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 8.333333%; - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-md-2 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 16.666667%; - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-md-3 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 25%; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-md-4 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 33.333333%; - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-md-5 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 41.666667%; - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-md-6 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 50%; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-md-7 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 58.333333%; - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-md-8 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 66.666667%; - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-md-9 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 75%; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-md-10 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 83.333333%; - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-md-11 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 91.666667%; - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-md-12 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 100%; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .pull-md-0 { - right: auto; - } - .pull-md-1 { - right: 8.333333%; - } - .pull-md-2 { - right: 16.666667%; - } - .pull-md-3 { - right: 25%; - } - .pull-md-4 { - right: 33.333333%; - } - .pull-md-5 { - right: 41.666667%; - } - .pull-md-6 { - right: 50%; - } - .pull-md-7 { - right: 58.333333%; - } - .pull-md-8 { - right: 66.666667%; - } - .pull-md-9 { - right: 75%; - } - .pull-md-10 { - right: 83.333333%; - } - .pull-md-11 { - right: 91.666667%; - } - .pull-md-12 { - right: 100%; - } - .push-md-0 { - left: auto; - } - .push-md-1 { - left: 8.333333%; - } - .push-md-2 { - left: 16.666667%; - } - .push-md-3 { - left: 25%; - } - .push-md-4 { - left: 33.333333%; - } - .push-md-5 { - left: 41.666667%; - } - .push-md-6 { - left: 50%; - } - .push-md-7 { - left: 58.333333%; - } - .push-md-8 { - left: 66.666667%; - } - .push-md-9 { - left: 75%; - } - .push-md-10 { - left: 83.333333%; - } - .push-md-11 { - left: 91.666667%; - } - .push-md-12 { - left: 100%; - } - .offset-md-0 { - margin-left: 0%; - } - .offset-md-1 { - margin-left: 8.333333%; - } - .offset-md-2 { - margin-left: 16.666667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.333333%; - } - .offset-md-5 { - margin-left: 41.666667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.333333%; - } - .offset-md-8 { - margin-left: 66.666667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.333333%; - } - .offset-md-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 992px) { - .col-lg { - -webkit-flex-basis: 0; - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-lg-auto { - -webkit-box-flex: 0; - -webkit-flex: 0 0 auto; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - } - .col-lg-1 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 8.333333%; - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-lg-2 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 16.666667%; - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-lg-3 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 25%; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-lg-4 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 33.333333%; - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-lg-5 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 41.666667%; - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-lg-6 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 50%; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-lg-7 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 58.333333%; - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-lg-8 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 66.666667%; - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-lg-9 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 75%; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-lg-10 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 83.333333%; - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-lg-11 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 91.666667%; - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-lg-12 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 100%; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .pull-lg-0 { - right: auto; - } - .pull-lg-1 { - right: 8.333333%; - } - .pull-lg-2 { - right: 16.666667%; - } - .pull-lg-3 { - right: 25%; - } - .pull-lg-4 { - right: 33.333333%; - } - .pull-lg-5 { - right: 41.666667%; - } - .pull-lg-6 { - right: 50%; - } - .pull-lg-7 { - right: 58.333333%; - } - .pull-lg-8 { - right: 66.666667%; - } - .pull-lg-9 { - right: 75%; - } - .pull-lg-10 { - right: 83.333333%; - } - .pull-lg-11 { - right: 91.666667%; - } - .pull-lg-12 { - right: 100%; - } - .push-lg-0 { - left: auto; - } - .push-lg-1 { - left: 8.333333%; - } - .push-lg-2 { - left: 16.666667%; - } - .push-lg-3 { - left: 25%; - } - .push-lg-4 { - left: 33.333333%; - } - .push-lg-5 { - left: 41.666667%; - } - .push-lg-6 { - left: 50%; - } - .push-lg-7 { - left: 58.333333%; - } - .push-lg-8 { - left: 66.666667%; - } - .push-lg-9 { - left: 75%; - } - .push-lg-10 { - left: 83.333333%; - } - .push-lg-11 { - left: 91.666667%; - } - .push-lg-12 { - left: 100%; - } - .offset-lg-0 { - margin-left: 0%; - } - .offset-lg-1 { - margin-left: 8.333333%; - } - .offset-lg-2 { - margin-left: 16.666667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.333333%; - } - .offset-lg-5 { - margin-left: 41.666667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.333333%; - } - .offset-lg-8 { - margin-left: 66.666667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.333333%; - } - .offset-lg-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 1200px) { - .col-xl { - -webkit-flex-basis: 0; - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-xl-auto { - -webkit-box-flex: 0; - -webkit-flex: 0 0 auto; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - } - .col-xl-1 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 8.333333%; - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-xl-2 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 16.666667%; - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-xl-3 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 25%; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-xl-4 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 33.333333%; - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-xl-5 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 41.666667%; - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-xl-6 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 50%; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-xl-7 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 58.333333%; - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-xl-8 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 66.666667%; - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-xl-9 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 75%; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-xl-10 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 83.333333%; - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-xl-11 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 91.666667%; - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-xl-12 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 100%; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .pull-xl-0 { - right: auto; - } - .pull-xl-1 { - right: 8.333333%; - } - .pull-xl-2 { - right: 16.666667%; - } - .pull-xl-3 { - right: 25%; - } - .pull-xl-4 { - right: 33.333333%; - } - .pull-xl-5 { - right: 41.666667%; - } - .pull-xl-6 { - right: 50%; - } - .pull-xl-7 { - right: 58.333333%; - } - .pull-xl-8 { - right: 66.666667%; - } - .pull-xl-9 { - right: 75%; - } - .pull-xl-10 { - right: 83.333333%; - } - .pull-xl-11 { - right: 91.666667%; - } - .pull-xl-12 { - right: 100%; - } - .push-xl-0 { - left: auto; - } - .push-xl-1 { - left: 8.333333%; - } - .push-xl-2 { - left: 16.666667%; - } - .push-xl-3 { - left: 25%; - } - .push-xl-4 { - left: 33.333333%; - } - .push-xl-5 { - left: 41.666667%; - } - .push-xl-6 { - left: 50%; - } - .push-xl-7 { - left: 58.333333%; - } - .push-xl-8 { - left: 66.666667%; - } - .push-xl-9 { - left: 75%; - } - .push-xl-10 { - left: 83.333333%; - } - .push-xl-11 { - left: 91.666667%; - } - .push-xl-12 { - left: 100%; - } - .offset-xl-0 { - margin-left: 0%; - } - .offset-xl-1 { - margin-left: 8.333333%; - } - .offset-xl-2 { - margin-left: 16.666667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.333333%; - } - .offset-xl-5 { - margin-left: 41.666667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.333333%; - } - .offset-xl-8 { - margin-left: 66.666667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.333333%; - } - .offset-xl-11 { - margin-left: 91.666667%; - } -} - -.table { - width: 100%; - max-width: 100%; - margin-bottom: 1rem; -} - -.table th, -.table td { - padding: 0.75rem; - vertical-align: top; - border-top: 1px solid #eceeef; -} - -.table thead th { - vertical-align: bottom; - border-bottom: 2px solid #eceeef; -} - -.table tbody + tbody { - border-top: 2px solid #eceeef; -} - -.table .table { - background-color: #fff; -} - -.table-sm th, -.table-sm td { - padding: 0.3rem; -} - -.table-bordered { - border: 1px solid #eceeef; -} - -.table-bordered th, -.table-bordered td { - border: 1px solid #eceeef; -} - -.table-bordered thead th, -.table-bordered thead td { - border-bottom-width: 2px; -} - -.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(0, 0, 0, 0.05); -} - -.table-hover tbody tr:hover { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-active, -.table-active > th, -.table-active > td { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover > td, -.table-hover .table-active:hover > th { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-success, -.table-success > th, -.table-success > td { - background-color: #dff0d8; -} - -.table-hover .table-success:hover { - background-color: #d0e9c6; -} - -.table-hover .table-success:hover > td, -.table-hover .table-success:hover > th { - background-color: #d0e9c6; -} - -.table-info, -.table-info > th, -.table-info > td { - background-color: #d9edf7; -} - -.table-hover .table-info:hover { - background-color: #c4e3f3; -} - -.table-hover .table-info:hover > td, -.table-hover .table-info:hover > th { - background-color: #c4e3f3; -} - -.table-warning, -.table-warning > th, -.table-warning > td { - background-color: #fcf8e3; -} - -.table-hover .table-warning:hover { - background-color: #faf2cc; -} - -.table-hover .table-warning:hover > td, -.table-hover .table-warning:hover > th { - background-color: #faf2cc; -} - -.table-danger, -.table-danger > th, -.table-danger > td { - background-color: #f2dede; -} - -.table-hover .table-danger:hover { - background-color: #ebcccc; -} - -.table-hover .table-danger:hover > td, -.table-hover .table-danger:hover > th { - background-color: #ebcccc; -} - -.thead-inverse th { - color: #fff; - background-color: #292b2c; -} - -.thead-default th { - color: #464a4c; - background-color: #eceeef; -} - -.table-inverse { - color: #fff; - background-color: #292b2c; -} - -.table-inverse th, -.table-inverse td, -.table-inverse thead th { - border-color: #fff; -} - -.table-inverse.table-bordered { - border: 0; -} - -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -ms-overflow-style: -ms-autohiding-scrollbar; -} - -.table-responsive.table-bordered { - border: 0; -} - -.form-control { - display: block; - width: 100%; - padding: 0.5rem 0.75rem; - font-size: 1rem; - line-height: 1.25; - color: #464a4c; - background-color: #fff; - background-image: none; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; - -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; - -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; -} - -.form-control::-ms-expand { - background-color: transparent; - border: 0; -} - -.form-control:focus { - color: #464a4c; - background-color: #fff; - border-color: #5cb3fd; - outline: none; -} - -.form-control::-webkit-input-placeholder { - color: #636c72; - opacity: 1; -} - -.form-control::-moz-placeholder { - color: #636c72; - opacity: 1; -} - -.form-control:-ms-input-placeholder { - color: #636c72; - opacity: 1; -} - -.form-control::placeholder { - color: #636c72; - opacity: 1; -} - -.form-control:disabled, .form-control[readonly] { - background-color: #eceeef; - opacity: 1; -} - -.form-control:disabled { - cursor: not-allowed; -} - -select.form-control:not([size]):not([multiple]) { - height: calc(2.25rem + 2px); -} - -select.form-control:focus::-ms-value { - color: #464a4c; - background-color: #fff; -} - -.form-control-file, -.form-control-range { - display: block; -} - -.col-form-label { - padding-top: calc(0.5rem - 1px * 2); - padding-bottom: calc(0.5rem - 1px * 2); - margin-bottom: 0; -} - -.col-form-label-lg { - padding-top: calc(0.75rem - 1px * 2); - padding-bottom: calc(0.75rem - 1px * 2); - font-size: 1.25rem; -} - -.col-form-label-sm { - padding-top: calc(0.25rem - 1px * 2); - padding-bottom: calc(0.25rem - 1px * 2); - font-size: 0.875rem; -} - -.col-form-legend { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - margin-bottom: 0; - font-size: 1rem; -} - -.form-control-static { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - margin-bottom: 0; - line-height: 1.25; - border: solid transparent; - border-width: 1px 0; -} - -.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control, -.input-group-sm > .form-control-static.input-group-addon, -.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control, -.input-group-lg > .form-control-static.input-group-addon, -.input-group-lg > .input-group-btn > .form-control-static.btn { - padding-right: 0; - padding-left: 0; -} - -.form-control-sm, .input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: 0.2rem; -} - -select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]), -.input-group-sm > select.input-group-addon:not([size]):not([multiple]), -.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) { - height: 1.8125rem; -} - -.form-control-lg, .input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; - border-radius: 0.3rem; -} - -select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]), -.input-group-lg > select.input-group-addon:not([size]):not([multiple]), -.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) { - height: 3.166667rem; -} - -.form-group { - margin-bottom: 1rem; -} - -.form-text { - display: block; - margin-top: 0.25rem; -} - -.form-check { - position: relative; - display: block; - margin-bottom: 0.5rem; -} - -.form-check.disabled .form-check-label { - color: #636c72; - cursor: not-allowed; -} - -.form-check-label { - padding-left: 1.25rem; - margin-bottom: 0; - cursor: pointer; -} - -.form-check-input { - position: absolute; - margin-top: 0.25rem; - margin-left: -1.25rem; -} - -.form-check-input:only-child { - position: static; -} - -.form-check-inline { - display: inline-block; -} - -.form-check-inline .form-check-label { - vertical-align: middle; -} - -.form-check-inline + .form-check-inline { - margin-left: 0.75rem; -} - -.form-control-feedback { - margin-top: 0.25rem; -} - -.form-control-success, -.form-control-warning, -.form-control-danger { - padding-right: 2.25rem; - background-repeat: no-repeat; - background-position: center right 0.5625rem; - -webkit-background-size: 1.125rem 1.125rem; - background-size: 1.125rem 1.125rem; -} - -.has-success .form-control-feedback, -.has-success .form-control-label, -.has-success .col-form-label, -.has-success .form-check-label, -.has-success .custom-control { - color: #5cb85c; -} - -.has-success .form-control { - border-color: #5cb85c; -} - -.has-success .input-group-addon { - color: #5cb85c; - border-color: #5cb85c; - background-color: #eaf6ea; -} - -.has-success .form-control-success { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E"); -} - -.has-warning .form-control-feedback, -.has-warning .form-control-label, -.has-warning .col-form-label, -.has-warning .form-check-label, -.has-warning .custom-control { - color: #f0ad4e; -} - -.has-warning .form-control { - border-color: #f0ad4e; -} - -.has-warning .input-group-addon { - color: #f0ad4e; - border-color: #f0ad4e; - background-color: white; -} - -.has-warning .form-control-warning { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E"); -} - -.has-danger .form-control-feedback, -.has-danger .form-control-label, -.has-danger .col-form-label, -.has-danger .form-check-label, -.has-danger .custom-control { - color: #d9534f; -} - -.has-danger .form-control { - border-color: #d9534f; -} - -.has-danger .input-group-addon { - color: #d9534f; - border-color: #d9534f; - background-color: #fdf7f7; -} - -.has-danger .form-control-danger { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E"); -} - -.form-inline { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: row wrap; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; -} - -.form-inline .form-check { - width: 100%; -} - -@media (min-width: 576px) { - .form-inline label { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - margin-bottom: 0; - } - .form-inline .form-group { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -webkit-flex: 0 0 auto; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - -webkit-flex-flow: row wrap; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - margin-bottom: 0; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - width: auto; - } - .form-inline .form-control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-check { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - width: auto; - margin-top: 0; - margin-bottom: 0; - } - .form-inline .form-check-label { - padding-left: 0; - } - .form-inline .form-check-input { - position: relative; - margin-top: 0; - margin-right: 0.25rem; - margin-left: 0; - } - .form-inline .custom-control { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding-left: 0; - } - .form-inline .custom-control-indicator { - position: static; - display: inline-block; - margin-right: 0.25rem; - vertical-align: text-bottom; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} - -.btn { - display: inline-block; - font-weight: normal; - line-height: 1.25; - text-align: center; - white-space: nowrap; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - border: 1px solid transparent; - padding: 0.5rem 1rem; - font-size: 1rem; - border-radius: 0.25rem; - -webkit-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.btn:focus, .btn:hover { - text-decoration: none; -} - -.btn:focus, .btn.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25); - box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25); -} - -.btn.disabled, .btn:disabled { - cursor: not-allowed; - opacity: .65; -} - -.btn:active, .btn.active { - background-image: none; -} - -a.btn.disabled, -fieldset[disabled] a.btn { - pointer-events: none; -} - -.btn-primary { - color: #fff; - background-color: #0275d8; - border-color: #0275d8; -} - -.btn-primary:hover { - color: #fff; - background-color: #025aa5; - border-color: #01549b; -} - -.btn-primary:focus, .btn-primary.focus { - -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5); - box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5); -} - -.btn-primary.disabled, .btn-primary:disabled { - background-color: #0275d8; - border-color: #0275d8; -} - -.btn-primary:active, .btn-primary.active, -.show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #025aa5; - background-image: none; - border-color: #01549b; -} - -.btn-secondary { - color: #292b2c; - background-color: #fff; - border-color: #ccc; -} - -.btn-secondary:hover { - color: #292b2c; - background-color: #e6e6e6; - border-color: #adadad; -} - -.btn-secondary:focus, .btn-secondary.focus { - -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5); - box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5); -} - -.btn-secondary.disabled, .btn-secondary:disabled { - background-color: #fff; - border-color: #ccc; -} - -.btn-secondary:active, .btn-secondary.active, -.show > .btn-secondary.dropdown-toggle { - color: #292b2c; - background-color: #e6e6e6; - background-image: none; - border-color: #adadad; -} - -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #5bc0de; -} - -.btn-info:hover { - color: #fff; - background-color: #31b0d5; - border-color: #2aabd2; -} - -.btn-info:focus, .btn-info.focus { - -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5); - box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5); -} - -.btn-info.disabled, .btn-info:disabled { - background-color: #5bc0de; - border-color: #5bc0de; -} - -.btn-info:active, .btn-info.active, -.show > .btn-info.dropdown-toggle { - color: #fff; - background-color: #31b0d5; - background-image: none; - border-color: #2aabd2; -} - -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #5cb85c; -} - -.btn-success:hover { - color: #fff; - background-color: #449d44; - border-color: #419641; -} - -.btn-success:focus, .btn-success.focus { - -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5); - box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5); -} - -.btn-success.disabled, .btn-success:disabled { - background-color: #5cb85c; - border-color: #5cb85c; -} - -.btn-success:active, .btn-success.active, -.show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #449d44; - background-image: none; - border-color: #419641; -} - -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.btn-warning:hover { - color: #fff; - background-color: #ec971f; - border-color: #eb9316; -} - -.btn-warning:focus, .btn-warning.focus { - -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5); - box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5); -} - -.btn-warning.disabled, .btn-warning:disabled { - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.btn-warning:active, .btn-warning.active, -.show > .btn-warning.dropdown-toggle { - color: #fff; - background-color: #ec971f; - background-image: none; - border-color: #eb9316; -} - -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d9534f; -} - -.btn-danger:hover { - color: #fff; - background-color: #c9302c; - border-color: #c12e2a; -} - -.btn-danger:focus, .btn-danger.focus { - -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5); - box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5); -} - -.btn-danger.disabled, .btn-danger:disabled { - background-color: #d9534f; - border-color: #d9534f; -} - -.btn-danger:active, .btn-danger.active, -.show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #c9302c; - background-image: none; - border-color: #c12e2a; -} - -.btn-outline-primary { - color: #0275d8; - background-image: none; - background-color: transparent; - border-color: #0275d8; -} - -.btn-outline-primary:hover { - color: #fff; - background-color: #0275d8; - border-color: #0275d8; -} - -.btn-outline-primary:focus, .btn-outline-primary.focus { - -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5); - box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5); -} - -.btn-outline-primary.disabled, .btn-outline-primary:disabled { - color: #0275d8; - background-color: transparent; -} - -.btn-outline-primary:active, .btn-outline-primary.active, -.show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #0275d8; - border-color: #0275d8; -} - -.btn-outline-secondary { - color: #ccc; - background-image: none; - background-color: transparent; - border-color: #ccc; -} - -.btn-outline-secondary:hover { - color: #fff; - background-color: #ccc; - border-color: #ccc; -} - -.btn-outline-secondary:focus, .btn-outline-secondary.focus { - -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5); - box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5); -} - -.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { - color: #ccc; - background-color: transparent; -} - -.btn-outline-secondary:active, .btn-outline-secondary.active, -.show > .btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: #ccc; - border-color: #ccc; -} - -.btn-outline-info { - color: #5bc0de; - background-image: none; - background-color: transparent; - border-color: #5bc0de; -} - -.btn-outline-info:hover { - color: #fff; - background-color: #5bc0de; - border-color: #5bc0de; -} - -.btn-outline-info:focus, .btn-outline-info.focus { - -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5); - box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5); -} - -.btn-outline-info.disabled, .btn-outline-info:disabled { - color: #5bc0de; - background-color: transparent; -} - -.btn-outline-info:active, .btn-outline-info.active, -.show > .btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #5bc0de; - border-color: #5bc0de; -} - -.btn-outline-success { - color: #5cb85c; - background-image: none; - background-color: transparent; - border-color: #5cb85c; -} - -.btn-outline-success:hover { - color: #fff; - background-color: #5cb85c; - border-color: #5cb85c; -} - -.btn-outline-success:focus, .btn-outline-success.focus { - -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5); - box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5); -} - -.btn-outline-success.disabled, .btn-outline-success:disabled { - color: #5cb85c; - background-color: transparent; -} - -.btn-outline-success:active, .btn-outline-success.active, -.show > .btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #5cb85c; - border-color: #5cb85c; -} - -.btn-outline-warning { - color: #f0ad4e; - background-image: none; - background-color: transparent; - border-color: #f0ad4e; -} - -.btn-outline-warning:hover { - color: #fff; - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.btn-outline-warning:focus, .btn-outline-warning.focus { - -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5); - box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5); -} - -.btn-outline-warning.disabled, .btn-outline-warning:disabled { - color: #f0ad4e; - background-color: transparent; -} - -.btn-outline-warning:active, .btn-outline-warning.active, -.show > .btn-outline-warning.dropdown-toggle { - color: #fff; - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.btn-outline-danger { - color: #d9534f; - background-image: none; - background-color: transparent; - border-color: #d9534f; -} - -.btn-outline-danger:hover { - color: #fff; - background-color: #d9534f; - border-color: #d9534f; -} - -.btn-outline-danger:focus, .btn-outline-danger.focus { - -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5); - box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5); -} - -.btn-outline-danger.disabled, .btn-outline-danger:disabled { - color: #d9534f; - background-color: transparent; -} - -.btn-outline-danger:active, .btn-outline-danger.active, -.show > .btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #d9534f; - border-color: #d9534f; -} - -.btn-link { - font-weight: normal; - color: #0275d8; - border-radius: 0; -} - -.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled { - background-color: transparent; -} - -.btn-link, .btn-link:focus, .btn-link:active { - border-color: transparent; -} - -.btn-link:hover { - border-color: transparent; -} - -.btn-link:focus, .btn-link:hover { - color: #014c8c; - text-decoration: underline; - background-color: transparent; -} - -.btn-link:disabled { - color: #636c72; -} - -.btn-link:disabled:focus, .btn-link:disabled:hover { - text-decoration: none; -} - -.btn-lg, .btn-group-lg > .btn { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; - border-radius: 0.3rem; -} - -.btn-sm, .btn-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: 0.2rem; -} - -.btn-block { - display: block; - width: 100%; -} - -.btn-block + .btn-block { - margin-top: 0.5rem; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.show { - opacity: 1; -} - -.collapse { - display: none; -} - -.collapse.show { - display: block; -} - -tr.collapse.show { - display: table-row; -} - -tbody.collapse.show { - display: table-row-group; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle::after { - display: inline-block; - width: 0; - height: 0; - margin-left: 0.3em; - vertical-align: middle; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-left: 0.3em solid transparent; -} - -.dropdown-toggle:focus { - outline: 0; -} - -.dropup .dropdown-toggle::after { - border-top: 0; - border-bottom: 0.3em solid; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: 0.5rem 0; - margin: 0.125rem 0 0; - font-size: 1rem; - color: #292b2c; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; -} - -.dropdown-divider { - height: 1px; - margin: 0.5rem 0; - overflow: hidden; - background-color: #eceeef; -} - -.dropdown-item { - display: block; - width: 100%; - padding: 3px 1.5rem; - clear: both; - font-weight: normal; - color: #292b2c; - text-align: inherit; - white-space: nowrap; - background: none; - border: 0; -} - -.dropdown-item:focus, .dropdown-item:hover { - color: #1d1e1f; - text-decoration: none; - background-color: #f7f7f9; -} - -.dropdown-item.active, .dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #0275d8; -} - -.dropdown-item.disabled, .dropdown-item:disabled { - color: #636c72; - cursor: not-allowed; - background-color: transparent; -} - -.show > .dropdown-menu { - display: block; -} - -.show > a { - outline: 0; -} - -.dropdown-menu-right { - right: 0; - left: auto; -} - -.dropdown-menu-left { - right: auto; - left: 0; -} - -.dropdown-header { - display: block; - padding: 0.5rem 1.5rem; - margin-bottom: 0; - font-size: 0.875rem; - color: #636c72; - white-space: nowrap; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.dropup .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 0.125rem; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - vertical-align: middle; -} - -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - -webkit-box-flex: 0; - -webkit-flex: 0 1 auto; - -ms-flex: 0 1 auto; - flex: 0 1 auto; -} - -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover { - z-index: 2; -} - -.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 2; -} - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group, -.btn-group-vertical .btn + .btn, -.btn-group-vertical .btn + .btn-group, -.btn-group-vertical .btn-group + .btn, -.btn-group-vertical .btn-group + .btn-group { - margin-left: -1px; -} - -.btn-toolbar { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; - justify-content: flex-start; -} - -.btn-toolbar .input-group { - width: auto; -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; -} - -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group > .btn-group { - float: left; -} - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.btn + .dropdown-toggle-split::after { - margin-left: 0; -} - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; -} - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 1.125rem; - padding-left: 1.125rem; -} - -.btn-group-vertical { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-align: start; - -webkit-align-items: flex-start; - -ms-flex-align: start; - align-items: flex-start; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; -} - -.btn-group-vertical .btn, -.btn-group-vertical .btn-group { - width: 100%; -} - -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} - -.input-group { - position: relative; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - width: 100%; -} - -.input-group .form-control { - position: relative; - z-index: 2; - -webkit-box-flex: 1; - -webkit-flex: 1 1 auto; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - width: 1%; - margin-bottom: 0; -} - -.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover { - z-index: 3; -} - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; -} - -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.input-group-addon, -.input-group-btn { - white-space: nowrap; - vertical-align: middle; -} - -.input-group-addon { - padding: 0.5rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - font-weight: normal; - line-height: 1.25; - color: #464a4c; - text-align: center; - background-color: #eceeef; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; -} - -.input-group-addon.form-control-sm, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .input-group-addon.btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: 0.2rem; -} - -.input-group-addon.form-control-lg, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .input-group-addon.btn { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; - border-radius: 0.3rem; -} - -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} - -.input-group .form-control:not(:last-child), -.input-group-addon:not(:last-child), -.input-group-btn:not(:last-child) > .btn, -.input-group-btn:not(:last-child) > .btn-group > .btn, -.input-group-btn:not(:last-child) > .dropdown-toggle, -.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.input-group-addon:not(:last-child) { - border-right: 0; -} - -.input-group .form-control:not(:first-child), -.input-group-addon:not(:first-child), -.input-group-btn:not(:first-child) > .btn, -.input-group-btn:not(:first-child) > .btn-group > .btn, -.input-group-btn:not(:first-child) > .dropdown-toggle, -.input-group-btn:not(:last-child) > .btn:not(:first-child), -.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.form-control + .input-group-addon:not(:first-child) { - border-left: 0; -} - -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} - -.input-group-btn > .btn { - position: relative; - -webkit-box-flex: 1; - -webkit-flex: 1 1 0%; - -ms-flex: 1 1 0%; - flex: 1 1 0%; -} - -.input-group-btn > .btn + .btn { - margin-left: -1px; -} - -.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover { - z-index: 3; -} - -.input-group-btn:not(:last-child) > .btn, -.input-group-btn:not(:last-child) > .btn-group { - margin-right: -1px; -} - -.input-group-btn:not(:first-child) > .btn, -.input-group-btn:not(:first-child) > .btn-group { - z-index: 2; - margin-left: -1px; -} - -.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover, -.input-group-btn:not(:first-child) > .btn-group:focus, -.input-group-btn:not(:first-child) > .btn-group:active, -.input-group-btn:not(:first-child) > .btn-group:hover { - z-index: 3; -} - -.custom-control { - position: relative; - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - min-height: 1.5rem; - padding-left: 1.5rem; - margin-right: 1rem; - cursor: pointer; -} - -.custom-control-input { - position: absolute; - z-index: -1; - opacity: 0; -} - -.custom-control-input:checked ~ .custom-control-indicator { - color: #fff; - background-color: #0275d8; -} - -.custom-control-input:focus ~ .custom-control-indicator { - -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8; - box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8; -} - -.custom-control-input:active ~ .custom-control-indicator { - color: #fff; - background-color: #8fcafe; -} - -.custom-control-input:disabled ~ .custom-control-indicator { - cursor: not-allowed; - background-color: #eceeef; -} - -.custom-control-input:disabled ~ .custom-control-description { - color: #636c72; - cursor: not-allowed; -} - -.custom-control-indicator { - position: absolute; - top: 0.25rem; - left: 0; - display: block; - width: 1rem; - height: 1rem; - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #ddd; - background-repeat: no-repeat; - background-position: center center; - -webkit-background-size: 50% 50%; - background-size: 50% 50%; -} - -.custom-checkbox .custom-control-indicator { - border-radius: 0.25rem; -} - -.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"); -} - -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator { - background-color: #0275d8; - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E"); -} - -.custom-radio .custom-control-indicator { - border-radius: 50%; -} - -.custom-radio .custom-control-input:checked ~ .custom-control-indicator { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E"); -} - -.custom-controls-stacked { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; -} - -.custom-controls-stacked .custom-control { - margin-bottom: 0.25rem; -} - -.custom-controls-stacked .custom-control + .custom-control { - margin-left: 0; -} - -.custom-select { - display: inline-block; - max-width: 100%; - height: calc(2.25rem + 2px); - padding: 0.375rem 1.75rem 0.375rem 0.75rem; - line-height: 1.25; - color: #464a4c; - vertical-align: middle; - background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; - -webkit-background-size: 8px 10px; - background-size: 8px 10px; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; - -moz-appearance: none; - -webkit-appearance: none; -} - -.custom-select:focus { - border-color: #5cb3fd; - outline: none; -} - -.custom-select:focus::-ms-value { - color: #464a4c; - background-color: #fff; -} - -.custom-select:disabled { - color: #636c72; - cursor: not-allowed; - background-color: #eceeef; -} - -.custom-select::-ms-expand { - opacity: 0; -} - -.custom-select-sm { - padding-top: 0.375rem; - padding-bottom: 0.375rem; - font-size: 75%; -} - -.custom-file { - position: relative; - display: inline-block; - max-width: 100%; - height: 2.5rem; - margin-bottom: 0; - cursor: pointer; -} - -.custom-file-input { - min-width: 14rem; - max-width: 100%; - height: 2.5rem; - margin: 0; - filter: alpha(opacity=0); - opacity: 0; -} - -.custom-file-control { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 5; - height: 2.5rem; - padding: 0.5rem 1rem; - line-height: 1.5; - color: #464a4c; - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; -} - -.custom-file-control:lang(en)::after { - content: "Choose file..."; -} - -.custom-file-control::before { - position: absolute; - top: -1px; - right: -1px; - bottom: -1px; - z-index: 6; - display: block; - height: 2.5rem; - padding: 0.5rem 1rem; - line-height: 1.5; - color: #464a4c; - background-color: #eceeef; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0 0.25rem 0.25rem 0; -} - -.custom-file-control:lang(en)::before { - content: "Browse"; -} - -.nav { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: block; - padding: 0.5em 1em; -} - -.nav-link:focus, .nav-link:hover { - text-decoration: none; -} - -.nav-link.disabled { - color: #636c72; - cursor: not-allowed; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs .nav-item { - margin-bottom: -1px; -} - -.nav-tabs .nav-link { - border: 1px solid transparent; - border-top-right-radius: 0.25rem; - border-top-left-radius: 0.25rem; -} - -.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { - border-color: #eceeef #eceeef #ddd; -} - -.nav-tabs .nav-link.disabled { - color: #636c72; - background-color: transparent; - border-color: transparent; -} - -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link { - color: #464a4c; - background-color: #fff; - border-color: #ddd #ddd #fff; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.nav-pills .nav-link { - border-radius: 0.25rem; -} - -.nav-pills .nav-link.active, -.nav-pills .nav-item.show .nav-link { - color: #fff; - cursor: default; - background-color: #0275d8; -} - -.nav-fill .nav-item { - -webkit-box-flex: 1; - -webkit-flex: 1 1 auto; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - text-align: center; -} - -.nav-justified .nav-item { - -webkit-box-flex: 1; - -webkit-flex: 1 1 100%; - -ms-flex: 1 1 100%; - flex: 1 1 100%; - text-align: center; -} - -.tab-content > .tab-pane { - display: none; -} - -.tab-content > .active { - display: block; -} - -.navbar { - position: relative; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - padding: 0.5rem 1rem; -} - -.navbar-brand { - display: inline-block; - padding-top: .25rem; - padding-bottom: .25rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap; -} - -.navbar-brand:focus, .navbar-brand:hover { - text-decoration: none; -} - -.navbar-nav { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} - -.navbar-text { - display: inline-block; - padding-top: .425rem; - padding-bottom: .425rem; -} - -.navbar-toggler { - -webkit-align-self: flex-start; - -ms-flex-item-align: start; - align-self: flex-start; - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background: transparent; - border: 1px solid transparent; - border-radius: 0.25rem; -} - -.navbar-toggler:focus, .navbar-toggler:hover { - text-decoration: none; -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: ""; - background: no-repeat center center; - -webkit-background-size: 100% 100%; - background-size: 100% 100%; -} - -.navbar-toggler-left { - position: absolute; - left: 1rem; -} - -.navbar-toggler-right { - position: absolute; - right: 1rem; -} - -@media (max-width: 575px) { - .navbar-toggleable .navbar-nav .dropdown-menu { - position: static; - float: none; - } - .navbar-toggleable > .container { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 576px) { - .navbar-toggleable { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - } - .navbar-toggleable .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - } - .navbar-toggleable .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; - } - .navbar-toggleable > .container { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - } - .navbar-toggleable .navbar-collapse { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; - width: 100%; - } - .navbar-toggleable .navbar-toggler { - display: none; - } -} - -@media (max-width: 767px) { - .navbar-toggleable-sm .navbar-nav .dropdown-menu { - position: static; - float: none; - } - .navbar-toggleable-sm > .container { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 768px) { - .navbar-toggleable-sm { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - } - .navbar-toggleable-sm .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - } - .navbar-toggleable-sm .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; - } - .navbar-toggleable-sm > .container { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - } - .navbar-toggleable-sm .navbar-collapse { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; - width: 100%; - } - .navbar-toggleable-sm .navbar-toggler { - display: none; - } -} - -@media (max-width: 991px) { - .navbar-toggleable-md .navbar-nav .dropdown-menu { - position: static; - float: none; - } - .navbar-toggleable-md > .container { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 992px) { - .navbar-toggleable-md { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - } - .navbar-toggleable-md .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - } - .navbar-toggleable-md .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; - } - .navbar-toggleable-md > .container { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - } - .navbar-toggleable-md .navbar-collapse { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; - width: 100%; - } - .navbar-toggleable-md .navbar-toggler { - display: none; - } -} - -@media (max-width: 1199px) { - .navbar-toggleable-lg .navbar-nav .dropdown-menu { - position: static; - float: none; - } - .navbar-toggleable-lg > .container { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 1200px) { - .navbar-toggleable-lg { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - } - .navbar-toggleable-lg .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - } - .navbar-toggleable-lg .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; - } - .navbar-toggleable-lg > .container { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - } - .navbar-toggleable-lg .navbar-collapse { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; - width: 100%; - } - .navbar-toggleable-lg .navbar-toggler { - display: none; - } -} - -.navbar-toggleable-xl { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; -} - -.navbar-toggleable-xl .navbar-nav .dropdown-menu { - position: static; - float: none; -} - -.navbar-toggleable-xl > .container { - padding-right: 0; - padding-left: 0; -} - -.navbar-toggleable-xl .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; -} - -.navbar-toggleable-xl .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; -} - -.navbar-toggleable-xl > .container { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; -} - -.navbar-toggleable-xl .navbar-collapse { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; - width: 100%; -} - -.navbar-toggleable-xl .navbar-toggler { - display: none; -} - -.navbar-light .navbar-brand, -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover, -.navbar-light .navbar-toggler:focus, -.navbar-light .navbar-toggler:hover { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.5); -} - -.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover { - color: rgba(0, 0, 0, 0.7); -} - -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} - -.navbar-light .navbar-nav .open > .nav-link, -.navbar-light .navbar-nav .active > .nav-link, -.navbar-light .navbar-nav .nav-link.open, -.navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-toggler { - border-color: rgba(0, 0, 0, 0.1); -} - -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"); -} - -.navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.5); -} - -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-toggler { - color: white; -} - -.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-toggler:focus, -.navbar-inverse .navbar-toggler:hover { - color: white; -} - -.navbar-inverse .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.5); -} - -.navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .nav-link:hover { - color: rgba(255, 255, 255, 0.75); -} - -.navbar-inverse .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} - -.navbar-inverse .navbar-nav .open > .nav-link, -.navbar-inverse .navbar-nav .active > .nav-link, -.navbar-inverse .navbar-nav .nav-link.open, -.navbar-inverse .navbar-nav .nav-link.active { - color: white; -} - -.navbar-inverse .navbar-toggler { - border-color: rgba(255, 255, 255, 0.1); -} - -.navbar-inverse .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"); -} - -.navbar-inverse .navbar-text { - color: rgba(255, 255, 255, 0.5); -} - -.card { - position: relative; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); - border-radius: 0.25rem; -} - -.card-block { - -webkit-box-flex: 1; - -webkit-flex: 1 1 auto; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - padding: 1.25rem; -} - -.card-title { - margin-bottom: 0.75rem; -} - -.card-subtitle { - margin-top: -0.375rem; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link:hover { - text-decoration: none; -} - -.card-link + .card-link { - margin-left: 1.25rem; -} - -.card > .list-group:first-child .list-group-item:first-child { - border-top-right-radius: 0.25rem; - border-top-left-radius: 0.25rem; -} - -.card > .list-group:last-child .list-group-item:last-child { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.card-header { - padding: 0.75rem 1.25rem; - margin-bottom: 0; - background-color: #f7f7f9; - border-bottom: 1px solid rgba(0, 0, 0, 0.125); -} - -.card-header:first-child { - border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; -} - -.card-footer { - padding: 0.75rem 1.25rem; - background-color: #f7f7f9; - border-top: 1px solid rgba(0, 0, 0, 0.125); -} - -.card-footer:last-child { - border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); -} - -.card-header-tabs { - margin-right: -0.625rem; - margin-bottom: -0.75rem; - margin-left: -0.625rem; - border-bottom: 0; -} - -.card-header-pills { - margin-right: -0.625rem; - margin-left: -0.625rem; -} - -.card-primary { - background-color: #0275d8; - border-color: #0275d8; -} - -.card-primary .card-header, -.card-primary .card-footer { - background-color: transparent; -} - -.card-success { - background-color: #5cb85c; - border-color: #5cb85c; -} - -.card-success .card-header, -.card-success .card-footer { - background-color: transparent; -} - -.card-info { - background-color: #5bc0de; - border-color: #5bc0de; -} - -.card-info .card-header, -.card-info .card-footer { - background-color: transparent; -} - -.card-warning { - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.card-warning .card-header, -.card-warning .card-footer { - background-color: transparent; -} - -.card-danger { - background-color: #d9534f; - border-color: #d9534f; -} - -.card-danger .card-header, -.card-danger .card-footer { - background-color: transparent; -} - -.card-outline-primary { - background-color: transparent; - border-color: #0275d8; -} - -.card-outline-secondary { - background-color: transparent; - border-color: #ccc; -} - -.card-outline-info { - background-color: transparent; - border-color: #5bc0de; -} - -.card-outline-success { - background-color: transparent; - border-color: #5cb85c; -} - -.card-outline-warning { - background-color: transparent; - border-color: #f0ad4e; -} - -.card-outline-danger { - background-color: transparent; - border-color: #d9534f; -} - -.card-inverse { - color: rgba(255, 255, 255, 0.65); -} - -.card-inverse .card-header, -.card-inverse .card-footer { - background-color: transparent; - border-color: rgba(255, 255, 255, 0.2); -} - -.card-inverse .card-header, -.card-inverse .card-footer, -.card-inverse .card-title, -.card-inverse .card-blockquote { - color: #fff; -} - -.card-inverse .card-link, -.card-inverse .card-text, -.card-inverse .card-subtitle, -.card-inverse .card-blockquote .blockquote-footer { - color: rgba(255, 255, 255, 0.65); -} - -.card-inverse .card-link:focus, .card-inverse .card-link:hover { - color: #fff; -} - -.card-blockquote { - padding: 0; - margin-bottom: 0; - border-left: 0; -} - -.card-img { - border-radius: calc(0.25rem - 1px); -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem; -} - -.card-img-top { - border-top-right-radius: calc(0.25rem - 1px); - border-top-left-radius: calc(0.25rem - 1px); -} - -.card-img-bottom { - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); -} - -@media (min-width: 576px) { - .card-deck { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: row wrap; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - } - .card-deck .card { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -webkit-flex: 1 0 0%; - -ms-flex: 1 0 0%; - flex: 1 0 0%; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - } - .card-deck .card:not(:first-child) { - margin-left: 15px; - } - .card-deck .card:not(:last-child) { - margin-right: 15px; - } -} - -@media (min-width: 576px) { - .card-group { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: row wrap; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - } - .card-group .card { - -webkit-box-flex: 1; - -webkit-flex: 1 0 0%; - -ms-flex: 1 0 0%; - flex: 1 0 0%; - } - .card-group .card + .card { - margin-left: 0; - border-left: 0; - } - .card-group .card:first-child { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - } - .card-group .card:first-child .card-img-top { - border-top-right-radius: 0; - } - .card-group .card:first-child .card-img-bottom { - border-bottom-right-radius: 0; - } - .card-group .card:last-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; - } - .card-group .card:last-child .card-img-top { - border-top-left-radius: 0; - } - .card-group .card:last-child .card-img-bottom { - border-bottom-left-radius: 0; - } - .card-group .card:not(:first-child):not(:last-child) { - border-radius: 0; - } - .card-group .card:not(:first-child):not(:last-child) .card-img-top, - .card-group .card:not(:first-child):not(:last-child) .card-img-bottom { - border-radius: 0; - } -} - -@media (min-width: 576px) { - .card-columns { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - -webkit-column-gap: 1.25rem; - -moz-column-gap: 1.25rem; - column-gap: 1.25rem; - } - .card-columns .card { - display: inline-block; - width: 100%; - margin-bottom: 0.75rem; - } -} - -.breadcrumb { - padding: 0.75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #eceeef; - border-radius: 0.25rem; -} - -.breadcrumb::after { - display: block; - content: ""; - clear: both; -} - -.breadcrumb-item { - float: left; -} - -.breadcrumb-item + .breadcrumb-item::before { - display: inline-block; - padding-right: 0.5rem; - padding-left: 0.5rem; - color: #636c72; - content: "/"; -} - -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: underline; -} - -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: none; -} - -.breadcrumb-item.active { - color: #636c72; -} - -.pagination { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - padding-left: 0; - list-style: none; - border-radius: 0.25rem; -} - -.page-item:first-child .page-link { - margin-left: 0; - border-bottom-left-radius: 0.25rem; - border-top-left-radius: 0.25rem; -} - -.page-item:last-child .page-link { - border-bottom-right-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} - -.page-item.active .page-link { - z-index: 2; - color: #fff; - background-color: #0275d8; - border-color: #0275d8; -} - -.page-item.disabled .page-link { - color: #636c72; - pointer-events: none; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} - -.page-link { - position: relative; - display: block; - padding: 0.5rem 0.75rem; - margin-left: -1px; - line-height: 1.25; - color: #0275d8; - background-color: #fff; - border: 1px solid #ddd; -} - -.page-link:focus, .page-link:hover { - color: #014c8c; - text-decoration: none; - background-color: #eceeef; - border-color: #ddd; -} - -.pagination-lg .page-link { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; -} - -.pagination-lg .page-item:first-child .page-link { - border-bottom-left-radius: 0.3rem; - border-top-left-radius: 0.3rem; -} - -.pagination-lg .page-item:last-child .page-link { - border-bottom-right-radius: 0.3rem; - border-top-right-radius: 0.3rem; -} - -.pagination-sm .page-link { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; -} - -.pagination-sm .page-item:first-child .page-link { - border-bottom-left-radius: 0.2rem; - border-top-left-radius: 0.2rem; -} - -.pagination-sm .page-item:last-child .page-link { - border-bottom-right-radius: 0.2rem; - border-top-right-radius: 0.2rem; -} - -.badge { - display: inline-block; - padding: 0.25em 0.4em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: 0.25rem; -} - -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -a.badge:focus, a.badge:hover { - color: #fff; - text-decoration: none; - cursor: pointer; -} - -.badge-pill { - padding-right: 0.6em; - padding-left: 0.6em; - border-radius: 10rem; -} - -.badge-default { - background-color: #636c72; -} - -.badge-default[href]:focus, .badge-default[href]:hover { - background-color: #4b5257; -} - -.badge-primary { - background-color: #0275d8; -} - -.badge-primary[href]:focus, .badge-primary[href]:hover { - background-color: #025aa5; -} - -.badge-success { - background-color: #5cb85c; -} - -.badge-success[href]:focus, .badge-success[href]:hover { - background-color: #449d44; -} - -.badge-info { - background-color: #5bc0de; -} - -.badge-info[href]:focus, .badge-info[href]:hover { - background-color: #31b0d5; -} - -.badge-warning { - background-color: #f0ad4e; -} - -.badge-warning[href]:focus, .badge-warning[href]:hover { - background-color: #ec971f; -} - -.badge-danger { - background-color: #d9534f; -} - -.badge-danger[href]:focus, .badge-danger[href]:hover { - background-color: #c9302c; -} - -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #eceeef; - border-radius: 0.3rem; -} - -@media (min-width: 576px) { - .jumbotron { - padding: 4rem 2rem; - } -} - -.jumbotron-hr { - border-top-color: #d0d5d8; -} - -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0; -} - -.alert { - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.25rem; -} - -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: bold; -} - -.alert-dismissible .close { - position: relative; - top: -0.75rem; - right: -1.25rem; - padding: 0.75rem 1.25rem; - color: inherit; -} - -.alert-success { - background-color: #dff0d8; - border-color: #d0e9c6; - color: #3c763d; -} - -.alert-success hr { - border-top-color: #c1e2b3; -} - -.alert-success .alert-link { - color: #2b542c; -} - -.alert-info { - background-color: #d9edf7; - border-color: #bcdff1; - color: #31708f; -} - -.alert-info hr { - border-top-color: #a6d5ec; -} - -.alert-info .alert-link { - color: #245269; -} - -.alert-warning { - background-color: #fcf8e3; - border-color: #faf2cc; - color: #8a6d3b; -} - -.alert-warning hr { - border-top-color: #f7ecb5; -} - -.alert-warning .alert-link { - color: #66512c; -} - -.alert-danger { - background-color: #f2dede; - border-color: #ebcccc; - color: #a94442; -} - -.alert-danger hr { - border-top-color: #e4b9b9; -} - -.alert-danger .alert-link { - color: #843534; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -.progress { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - overflow: hidden; - font-size: 0.75rem; - line-height: 1rem; - text-align: center; - background-color: #eceeef; - border-radius: 0.25rem; -} - -.progress-bar { - height: 1rem; - color: #fff; - background-color: #0275d8; -} - -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 1rem 1rem; - background-size: 1rem 1rem; -} - -.progress-bar-animated { - -webkit-animation: progress-bar-stripes 1s linear infinite; - -o-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite; -} - -.media { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-align: start; - -webkit-align-items: flex-start; - -ms-flex-align: start; - align-items: flex-start; -} - -.media-body { - -webkit-box-flex: 1; - -webkit-flex: 1 1 0%; - -ms-flex: 1 1 0%; - flex: 1 1 0%; -} - -.list-group { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; -} - -.list-group-item-action { - width: 100%; - color: #464a4c; - text-align: inherit; -} - -.list-group-item-action .list-group-item-heading { - color: #292b2c; -} - -.list-group-item-action:focus, .list-group-item-action:hover { - color: #464a4c; - text-decoration: none; - background-color: #f7f7f9; -} - -.list-group-item-action:active { - color: #292b2c; - background-color: #eceeef; -} - -.list-group-item { - position: relative; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: row wrap; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - padding: 0.75rem 1.25rem; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); -} - -.list-group-item:first-child { - border-top-right-radius: 0.25rem; - border-top-left-radius: 0.25rem; -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.list-group-item:focus, .list-group-item:hover { - text-decoration: none; -} - -.list-group-item.disabled, .list-group-item:disabled { - color: #636c72; - cursor: not-allowed; - background-color: #fff; -} - -.list-group-item.disabled .list-group-item-heading, .list-group-item:disabled .list-group-item-heading { - color: inherit; -} - -.list-group-item.disabled .list-group-item-text, .list-group-item:disabled .list-group-item-text { - color: #636c72; -} - -.list-group-item.active { - z-index: 2; - color: #fff; - background-color: #0275d8; - border-color: #0275d8; -} - -.list-group-item.active .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small { - color: inherit; -} - -.list-group-item.active .list-group-item-text { - color: #daeeff; -} - -.list-group-flush .list-group-item { - border-right: 0; - border-left: 0; - border-radius: 0; -} - -.list-group-flush:first-child .list-group-item:first-child { - border-top: 0; -} - -.list-group-flush:last-child .list-group-item:last-child { - border-bottom: 0; -} - -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} - -a.list-group-item-success, -button.list-group-item-success { - color: #3c763d; -} - -a.list-group-item-success .list-group-item-heading, -button.list-group-item-success .list-group-item-heading { - color: inherit; -} - -a.list-group-item-success:focus, a.list-group-item-success:hover, -button.list-group-item-success:focus, -button.list-group-item-success:hover { - color: #3c763d; - background-color: #d0e9c6; -} - -a.list-group-item-success.active, -button.list-group-item-success.active { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} - -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} - -a.list-group-item-info, -button.list-group-item-info { - color: #31708f; -} - -a.list-group-item-info .list-group-item-heading, -button.list-group-item-info .list-group-item-heading { - color: inherit; -} - -a.list-group-item-info:focus, a.list-group-item-info:hover, -button.list-group-item-info:focus, -button.list-group-item-info:hover { - color: #31708f; - background-color: #c4e3f3; -} - -a.list-group-item-info.active, -button.list-group-item-info.active { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} - -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} - -a.list-group-item-warning, -button.list-group-item-warning { - color: #8a6d3b; -} - -a.list-group-item-warning .list-group-item-heading, -button.list-group-item-warning .list-group-item-heading { - color: inherit; -} - -a.list-group-item-warning:focus, a.list-group-item-warning:hover, -button.list-group-item-warning:focus, -button.list-group-item-warning:hover { - color: #8a6d3b; - background-color: #faf2cc; -} - -a.list-group-item-warning.active, -button.list-group-item-warning.active { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} - -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} - -a.list-group-item-danger, -button.list-group-item-danger { - color: #a94442; -} - -a.list-group-item-danger .list-group-item-heading, -button.list-group-item-danger .list-group-item-heading { - color: inherit; -} - -a.list-group-item-danger:focus, a.list-group-item-danger:hover, -button.list-group-item-danger:focus, -button.list-group-item-danger:hover { - color: #a94442; - background-color: #ebcccc; -} - -a.list-group-item-danger.active, -button.list-group-item-danger.active { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} - -.embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden; -} - -.embed-responsive::before { - display: block; - content: ""; -} - -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} - -.embed-responsive-21by9::before { - padding-top: 42.857143%; -} - -.embed-responsive-16by9::before { - padding-top: 56.25%; -} - -.embed-responsive-4by3::before { - padding-top: 75%; -} - -.embed-responsive-1by1::before { - padding-top: 100%; -} - -.close { - float: right; - font-size: 1.5rem; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: .5; -} - -.close:focus, .close:hover { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: .75; -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.modal-open { - overflow: hidden; -} - -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - outline: 0; -} - -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform 0.3s ease-out; - transition: -webkit-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; - transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out; - -webkit-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); -} - -.modal.show .modal-dialog { - -webkit-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); -} - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} - -.modal-content { - position: relative; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; - outline: 0; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop.show { - opacity: 0.5; -} - -.modal-header { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 15px; - border-bottom: 1px solid #eceeef; -} - -.modal-title { - margin-bottom: 0; - line-height: 1.5; -} - -.modal-body { - position: relative; - -webkit-box-flex: 1; - -webkit-flex: 1 1 auto; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - padding: 15px; -} - -.modal-footer { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: end; - -webkit-justify-content: flex-end; - -ms-flex-pack: end; - justify-content: flex-end; - padding: 15px; - border-top: 1px solid #eceeef; -} - -.modal-footer > :not(:first-child) { - margin-left: .25rem; -} - -.modal-footer > :not(:last-child) { - margin-right: .25rem; -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} - -@media (min-width: 576px) { - .modal-dialog { - max-width: 500px; - margin: 30px auto; - } - .modal-sm { - max-width: 300px; - } -} - -@media (min-width: 992px) { - .modal-lg { - max-width: 800px; - } -} - -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - font-style: normal; - font-weight: normal; - letter-spacing: normal; - line-break: auto; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - white-space: normal; - word-break: normal; - word-spacing: normal; - font-size: 0.875rem; - word-wrap: break-word; - opacity: 0; -} - -.tooltip.show { - opacity: 0.9; -} - -.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before { - bottom: 0; - left: 50%; - margin-left: -5px; - content: ""; - border-width: 5px 5px 0; - border-top-color: #000; -} - -.tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before { - top: 50%; - left: 0; - margin-top: -5px; - content: ""; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} - -.tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before { - top: 0; - left: 50%; - margin-left: -5px; - content: ""; - border-width: 0 5px 5px; - border-bottom-color: #000; -} - -.tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before { - top: 50%; - right: 0; - margin-top: -5px; - content: ""; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 0.25rem; -} - -.tooltip-inner::before { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - padding: 1px; - font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - font-style: normal; - font-weight: normal; - letter-spacing: normal; - line-break: auto; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - white-space: normal; - word-break: normal; - word-spacing: normal; - font-size: 0.875rem; - word-wrap: break-word; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; -} - -.popover.popover-top, .popover.bs-tether-element-attached-bottom { - margin-top: -10px; -} - -.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after { - left: 50%; - border-bottom-width: 0; -} - -.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before { - bottom: -11px; - margin-left: -11px; - border-top-color: rgba(0, 0, 0, 0.25); -} - -.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after { - bottom: -10px; - margin-left: -10px; - border-top-color: #fff; -} - -.popover.popover-right, .popover.bs-tether-element-attached-left { - margin-left: 10px; -} - -.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after { - top: 50%; - border-left-width: 0; -} - -.popover.popover-right::before, .popover.bs-tether-element-attached-left::before { - left: -11px; - margin-top: -11px; - border-right-color: rgba(0, 0, 0, 0.25); -} - -.popover.popover-right::after, .popover.bs-tether-element-attached-left::after { - left: -10px; - margin-top: -10px; - border-right-color: #fff; -} - -.popover.popover-bottom, .popover.bs-tether-element-attached-top { - margin-top: 10px; -} - -.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after { - left: 50%; - border-top-width: 0; -} - -.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before { - top: -11px; - margin-left: -11px; - border-bottom-color: rgba(0, 0, 0, 0.25); -} - -.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after { - top: -10px; - margin-left: -10px; - border-bottom-color: #f7f7f7; -} - -.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 20px; - margin-left: -10px; - content: ""; - border-bottom: 1px solid #f7f7f7; -} - -.popover.popover-left, .popover.bs-tether-element-attached-right { - margin-left: -10px; -} - -.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after { - top: 50%; - border-right-width: 0; -} - -.popover.popover-left::before, .popover.bs-tether-element-attached-right::before { - right: -11px; - margin-top: -11px; - border-left-color: rgba(0, 0, 0, 0.25); -} - -.popover.popover-left::after, .popover.bs-tether-element-attached-right::after { - right: -10px; - margin-top: -10px; - border-left-color: #fff; -} - -.popover-title { - padding: 8px 14px; - margin-bottom: 0; - font-size: 1rem; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-right-radius: calc(0.3rem - 1px); - border-top-left-radius: calc(0.3rem - 1px); -} - -.popover-title:empty { - display: none; -} - -.popover-content { - padding: 9px 14px; -} - -.popover::before, -.popover::after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover::before { - content: ""; - border-width: 11px; -} - -.popover::after { - content: ""; - border-width: 10px; -} - -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-item { - position: relative; - display: none; - width: 100%; -} - -@media (-webkit-transform-3d) { - .carousel-item { - -webkit-transition: -webkit-transform 0.6s ease-in-out; - transition: -webkit-transform 0.6s ease-in-out; - -o-transition: -o-transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px; - } -} - -@supports ((-webkit-transform: translate3d(0, 0, 0)) or (transform: translate3d(0, 0, 0))) { - .carousel-item { - -webkit-transition: -webkit-transform 0.6s ease-in-out; - transition: -webkit-transform 0.6s ease-in-out; - -o-transition: -o-transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px; - } -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; -} - -.carousel-item-next, -.carousel-item-prev { - position: absolute; - top: 0; -} - -@media (-webkit-transform-3d) { - .carousel-item-next.carousel-item-left, - .carousel-item-prev.carousel-item-right { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - .carousel-item-next, - .active.carousel-item-right { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - .carousel-item-prev, - .active.carousel-item-left { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} - -@supports ((-webkit-transform: translate3d(0, 0, 0)) or (transform: translate3d(0, 0, 0))) { - .carousel-item-next.carousel-item-left, - .carousel-item-prev.carousel-item-right { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - .carousel-item-next, - .active.carousel-item-right { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - .carousel-item-prev, - .active.carousel-item-left { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - width: 15%; - color: #fff; - text-align: center; - opacity: 0.5; -} - -.carousel-control-prev:focus, .carousel-control-prev:hover, -.carousel-control-next:focus, -.carousel-control-next:hover { - color: #fff; - text-decoration: none; - outline: 0; - opacity: .9; -} - -.carousel-control-prev { - left: 0; -} - -.carousel-control-next { - right: 0; -} - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 20px; - height: 20px; - background: transparent no-repeat center center; - -webkit-background-size: 100% 100%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"); -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"); -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 10px; - left: 0; - z-index: 15; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none; -} - -.carousel-indicators li { - position: relative; - -webkit-box-flex: 1; - -webkit-flex: 1 0 auto; - -ms-flex: 1 0 auto; - flex: 1 0 auto; - max-width: 30px; - height: 3px; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: rgba(255, 255, 255, 0.5); -} - -.carousel-indicators li::before { - position: absolute; - top: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: ""; -} - -.carousel-indicators li::after { - position: absolute; - bottom: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: ""; -} - -.carousel-indicators .active { - background-color: #fff; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; -} - -.align-baseline { - vertical-align: baseline !important; -} - -.align-top { - vertical-align: top !important; -} - -.align-middle { - vertical-align: middle !important; -} - -.align-bottom { - vertical-align: bottom !important; -} - -.align-text-bottom { - vertical-align: text-bottom !important; -} - -.align-text-top { - vertical-align: text-top !important; -} - -.bg-faded { - background-color: #f7f7f7; -} - -.bg-primary { - background-color: #0275d8 !important; -} - -a.bg-primary:focus, a.bg-primary:hover { - background-color: #025aa5 !important; -} - -.bg-success { - background-color: #5cb85c !important; -} - -a.bg-success:focus, a.bg-success:hover { - background-color: #449d44 !important; -} - -.bg-info { - background-color: #5bc0de !important; -} - -a.bg-info:focus, a.bg-info:hover { - background-color: #31b0d5 !important; -} - -.bg-warning { - background-color: #f0ad4e !important; -} - -a.bg-warning:focus, a.bg-warning:hover { - background-color: #ec971f !important; -} - -.bg-danger { - background-color: #d9534f !important; -} - -a.bg-danger:focus, a.bg-danger:hover { - background-color: #c9302c !important; -} - -.bg-inverse { - background-color: #292b2c !important; -} - -a.bg-inverse:focus, a.bg-inverse:hover { - background-color: #101112 !important; -} - -.border-0 { - border: 0 !important; -} - -.border-top-0 { - border-top: 0 !important; -} - -.border-right-0 { - border-right: 0 !important; -} - -.border-bottom-0 { - border-bottom: 0 !important; -} - -.border-left-0 { - border-left: 0 !important; -} - -.rounded { - border-radius: 0.25rem; -} - -.rounded-top { - border-top-right-radius: 0.25rem; - border-top-left-radius: 0.25rem; -} - -.rounded-right { - border-bottom-right-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} - -.rounded-bottom { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.rounded-left { - border-bottom-left-radius: 0.25rem; - border-top-left-radius: 0.25rem; -} - -.rounded-circle { - border-radius: 50%; -} - -.rounded-0 { - border-radius: 0; -} - -.clearfix::after { - display: block; - content: ""; - clear: both; -} - -.d-none { - display: none !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-table { - display: table !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; -} - -.d-inline-flex { - display: -webkit-inline-box !important; - display: -webkit-inline-flex !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; -} - -@media (min-width: 576px) { - .d-sm-none { - display: none !important; - } - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; - } - .d-sm-inline-flex { - display: -webkit-inline-box !important; - display: -webkit-inline-flex !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 768px) { - .d-md-none { - display: none !important; - } - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; - } - .d-md-inline-flex { - display: -webkit-inline-box !important; - display: -webkit-inline-flex !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 992px) { - .d-lg-none { - display: none !important; - } - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; - } - .d-lg-inline-flex { - display: -webkit-inline-box !important; - display: -webkit-inline-flex !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 1200px) { - .d-xl-none { - display: none !important; - } - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: -webkit-box !important; - display: -webkit-flex !important; - display: -ms-flexbox !important; - display: flex !important; - } - .d-xl-inline-flex { - display: -webkit-inline-box !important; - display: -webkit-inline-flex !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -.flex-first { - -webkit-box-ordinal-group: 0; - -webkit-order: -1; - -ms-flex-order: -1; - order: -1; -} - -.flex-last { - -webkit-box-ordinal-group: 2; - -webkit-order: 1; - -ms-flex-order: 1; - order: 1; -} - -.flex-unordered { - -webkit-box-ordinal-group: 1; - -webkit-order: 0; - -ms-flex-order: 0; - order: 0; -} - -.flex-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: row !important; - -ms-flex-direction: row !important; - flex-direction: row !important; -} - -.flex-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: column !important; - -ms-flex-direction: column !important; - flex-direction: column !important; -} - -.flex-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: row-reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: column-reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; -} - -.flex-wrap { - -webkit-flex-wrap: wrap !important; - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; -} - -.flex-nowrap { - -webkit-flex-wrap: nowrap !important; - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - -webkit-flex-wrap: wrap-reverse !important; - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; -} - -.justify-content-start { - -webkit-box-pack: start !important; - -webkit-justify-content: flex-start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; -} - -.justify-content-end { - -webkit-box-pack: end !important; - -webkit-justify-content: flex-end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; -} - -.justify-content-center { - -webkit-box-pack: center !important; - -webkit-justify-content: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; -} - -.justify-content-between { - -webkit-box-pack: justify !important; - -webkit-justify-content: space-between !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important; -} - -.justify-content-around { - -webkit-justify-content: space-around !important; - -ms-flex-pack: distribute !important; - justify-content: space-around !important; -} - -.align-items-start { - -webkit-box-align: start !important; - -webkit-align-items: flex-start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; -} - -.align-items-end { - -webkit-box-align: end !important; - -webkit-align-items: flex-end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; -} - -.align-items-center { - -webkit-box-align: center !important; - -webkit-align-items: center !important; - -ms-flex-align: center !important; - align-items: center !important; -} - -.align-items-baseline { - -webkit-box-align: baseline !important; - -webkit-align-items: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; -} - -.align-items-stretch { - -webkit-box-align: stretch !important; - -webkit-align-items: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important; -} - -.align-content-start { - -webkit-align-content: flex-start !important; - -ms-flex-line-pack: start !important; - align-content: flex-start !important; -} - -.align-content-end { - -webkit-align-content: flex-end !important; - -ms-flex-line-pack: end !important; - align-content: flex-end !important; -} - -.align-content-center { - -webkit-align-content: center !important; - -ms-flex-line-pack: center !important; - align-content: center !important; -} - -.align-content-between { - -webkit-align-content: space-between !important; - -ms-flex-line-pack: justify !important; - align-content: space-between !important; -} - -.align-content-around { - -webkit-align-content: space-around !important; - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; -} - -.align-content-stretch { - -webkit-align-content: stretch !important; - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; -} - -.align-self-auto { - -webkit-align-self: auto !important; - -ms-flex-item-align: auto !important; - -ms-grid-row-align: auto !important; - align-self: auto !important; -} - -.align-self-start { - -webkit-align-self: flex-start !important; - -ms-flex-item-align: start !important; - align-self: flex-start !important; -} - -.align-self-end { - -webkit-align-self: flex-end !important; - -ms-flex-item-align: end !important; - align-self: flex-end !important; -} - -.align-self-center { - -webkit-align-self: center !important; - -ms-flex-item-align: center !important; - -ms-grid-row-align: center !important; - align-self: center !important; -} - -.align-self-baseline { - -webkit-align-self: baseline !important; - -ms-flex-item-align: baseline !important; - align-self: baseline !important; -} - -.align-self-stretch { - -webkit-align-self: stretch !important; - -ms-flex-item-align: stretch !important; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; -} - -@media (min-width: 576px) { - .flex-sm-first { - -webkit-box-ordinal-group: 0; - -webkit-order: -1; - -ms-flex-order: -1; - order: -1; - } - .flex-sm-last { - -webkit-box-ordinal-group: 2; - -webkit-order: 1; - -ms-flex-order: 1; - order: 1; - } - .flex-sm-unordered { - -webkit-box-ordinal-group: 1; - -webkit-order: 0; - -ms-flex-order: 0; - order: 0; - } - .flex-sm-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: row !important; - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-sm-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: column !important; - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-sm-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: row-reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: column-reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-sm-wrap { - -webkit-flex-wrap: wrap !important; - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - -webkit-flex-wrap: nowrap !important; - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - -webkit-flex-wrap: wrap-reverse !important; - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .justify-content-sm-start { - -webkit-box-pack: start !important; - -webkit-justify-content: flex-start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-sm-end { - -webkit-box-pack: end !important; - -webkit-justify-content: flex-end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-sm-center { - -webkit-box-pack: center !important; - -webkit-justify-content: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-sm-between { - -webkit-box-pack: justify !important; - -webkit-justify-content: space-between !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-sm-around { - -webkit-justify-content: space-around !important; - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-sm-start { - -webkit-box-align: start !important; - -webkit-align-items: flex-start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-sm-end { - -webkit-box-align: end !important; - -webkit-align-items: flex-end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-sm-center { - -webkit-box-align: center !important; - -webkit-align-items: center !important; - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-sm-baseline { - -webkit-box-align: baseline !important; - -webkit-align-items: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-sm-stretch { - -webkit-box-align: stretch !important; - -webkit-align-items: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-sm-start { - -webkit-align-content: flex-start !important; - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-sm-end { - -webkit-align-content: flex-end !important; - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-sm-center { - -webkit-align-content: center !important; - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-sm-between { - -webkit-align-content: space-between !important; - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-sm-around { - -webkit-align-content: space-around !important; - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-sm-stretch { - -webkit-align-content: stretch !important; - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-sm-auto { - -webkit-align-self: auto !important; - -ms-flex-item-align: auto !important; - -ms-grid-row-align: auto !important; - align-self: auto !important; - } - .align-self-sm-start { - -webkit-align-self: flex-start !important; - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-sm-end { - -webkit-align-self: flex-end !important; - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-sm-center { - -webkit-align-self: center !important; - -ms-flex-item-align: center !important; - -ms-grid-row-align: center !important; - align-self: center !important; - } - .align-self-sm-baseline { - -webkit-align-self: baseline !important; - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-sm-stretch { - -webkit-align-self: stretch !important; - -ms-flex-item-align: stretch !important; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 768px) { - .flex-md-first { - -webkit-box-ordinal-group: 0; - -webkit-order: -1; - -ms-flex-order: -1; - order: -1; - } - .flex-md-last { - -webkit-box-ordinal-group: 2; - -webkit-order: 1; - -ms-flex-order: 1; - order: 1; - } - .flex-md-unordered { - -webkit-box-ordinal-group: 1; - -webkit-order: 0; - -ms-flex-order: 0; - order: 0; - } - .flex-md-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: row !important; - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-md-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: column !important; - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-md-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: row-reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: column-reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-md-wrap { - -webkit-flex-wrap: wrap !important; - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-md-nowrap { - -webkit-flex-wrap: nowrap !important; - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - -webkit-flex-wrap: wrap-reverse !important; - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .justify-content-md-start { - -webkit-box-pack: start !important; - -webkit-justify-content: flex-start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-md-end { - -webkit-box-pack: end !important; - -webkit-justify-content: flex-end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-md-center { - -webkit-box-pack: center !important; - -webkit-justify-content: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-md-between { - -webkit-box-pack: justify !important; - -webkit-justify-content: space-between !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-md-around { - -webkit-justify-content: space-around !important; - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-md-start { - -webkit-box-align: start !important; - -webkit-align-items: flex-start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-md-end { - -webkit-box-align: end !important; - -webkit-align-items: flex-end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-md-center { - -webkit-box-align: center !important; - -webkit-align-items: center !important; - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-md-baseline { - -webkit-box-align: baseline !important; - -webkit-align-items: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-md-stretch { - -webkit-box-align: stretch !important; - -webkit-align-items: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-md-start { - -webkit-align-content: flex-start !important; - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-md-end { - -webkit-align-content: flex-end !important; - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-md-center { - -webkit-align-content: center !important; - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-md-between { - -webkit-align-content: space-between !important; - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-md-around { - -webkit-align-content: space-around !important; - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-md-stretch { - -webkit-align-content: stretch !important; - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-md-auto { - -webkit-align-self: auto !important; - -ms-flex-item-align: auto !important; - -ms-grid-row-align: auto !important; - align-self: auto !important; - } - .align-self-md-start { - -webkit-align-self: flex-start !important; - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-md-end { - -webkit-align-self: flex-end !important; - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-md-center { - -webkit-align-self: center !important; - -ms-flex-item-align: center !important; - -ms-grid-row-align: center !important; - align-self: center !important; - } - .align-self-md-baseline { - -webkit-align-self: baseline !important; - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-md-stretch { - -webkit-align-self: stretch !important; - -ms-flex-item-align: stretch !important; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 992px) { - .flex-lg-first { - -webkit-box-ordinal-group: 0; - -webkit-order: -1; - -ms-flex-order: -1; - order: -1; - } - .flex-lg-last { - -webkit-box-ordinal-group: 2; - -webkit-order: 1; - -ms-flex-order: 1; - order: 1; - } - .flex-lg-unordered { - -webkit-box-ordinal-group: 1; - -webkit-order: 0; - -ms-flex-order: 0; - order: 0; - } - .flex-lg-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: row !important; - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-lg-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: column !important; - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-lg-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: row-reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: column-reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-lg-wrap { - -webkit-flex-wrap: wrap !important; - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - -webkit-flex-wrap: nowrap !important; - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - -webkit-flex-wrap: wrap-reverse !important; - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .justify-content-lg-start { - -webkit-box-pack: start !important; - -webkit-justify-content: flex-start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-lg-end { - -webkit-box-pack: end !important; - -webkit-justify-content: flex-end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-lg-center { - -webkit-box-pack: center !important; - -webkit-justify-content: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-lg-between { - -webkit-box-pack: justify !important; - -webkit-justify-content: space-between !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-lg-around { - -webkit-justify-content: space-around !important; - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-lg-start { - -webkit-box-align: start !important; - -webkit-align-items: flex-start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-lg-end { - -webkit-box-align: end !important; - -webkit-align-items: flex-end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-lg-center { - -webkit-box-align: center !important; - -webkit-align-items: center !important; - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-lg-baseline { - -webkit-box-align: baseline !important; - -webkit-align-items: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-lg-stretch { - -webkit-box-align: stretch !important; - -webkit-align-items: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-lg-start { - -webkit-align-content: flex-start !important; - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-lg-end { - -webkit-align-content: flex-end !important; - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-lg-center { - -webkit-align-content: center !important; - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-lg-between { - -webkit-align-content: space-between !important; - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-lg-around { - -webkit-align-content: space-around !important; - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-lg-stretch { - -webkit-align-content: stretch !important; - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-lg-auto { - -webkit-align-self: auto !important; - -ms-flex-item-align: auto !important; - -ms-grid-row-align: auto !important; - align-self: auto !important; - } - .align-self-lg-start { - -webkit-align-self: flex-start !important; - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-lg-end { - -webkit-align-self: flex-end !important; - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-lg-center { - -webkit-align-self: center !important; - -ms-flex-item-align: center !important; - -ms-grid-row-align: center !important; - align-self: center !important; - } - .align-self-lg-baseline { - -webkit-align-self: baseline !important; - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-lg-stretch { - -webkit-align-self: stretch !important; - -ms-flex-item-align: stretch !important; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 1200px) { - .flex-xl-first { - -webkit-box-ordinal-group: 0; - -webkit-order: -1; - -ms-flex-order: -1; - order: -1; - } - .flex-xl-last { - -webkit-box-ordinal-group: 2; - -webkit-order: 1; - -ms-flex-order: 1; - order: 1; - } - .flex-xl-unordered { - -webkit-box-ordinal-group: 1; - -webkit-order: 0; - -ms-flex-order: 0; - order: 0; - } - .flex-xl-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: row !important; - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-xl-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: column !important; - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-xl-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: row-reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -webkit-flex-direction: column-reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-xl-wrap { - -webkit-flex-wrap: wrap !important; - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - -webkit-flex-wrap: nowrap !important; - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - -webkit-flex-wrap: wrap-reverse !important; - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .justify-content-xl-start { - -webkit-box-pack: start !important; - -webkit-justify-content: flex-start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-xl-end { - -webkit-box-pack: end !important; - -webkit-justify-content: flex-end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-xl-center { - -webkit-box-pack: center !important; - -webkit-justify-content: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-xl-between { - -webkit-box-pack: justify !important; - -webkit-justify-content: space-between !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-xl-around { - -webkit-justify-content: space-around !important; - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-xl-start { - -webkit-box-align: start !important; - -webkit-align-items: flex-start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-xl-end { - -webkit-box-align: end !important; - -webkit-align-items: flex-end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-xl-center { - -webkit-box-align: center !important; - -webkit-align-items: center !important; - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-xl-baseline { - -webkit-box-align: baseline !important; - -webkit-align-items: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-xl-stretch { - -webkit-box-align: stretch !important; - -webkit-align-items: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-xl-start { - -webkit-align-content: flex-start !important; - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-xl-end { - -webkit-align-content: flex-end !important; - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-xl-center { - -webkit-align-content: center !important; - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-xl-between { - -webkit-align-content: space-between !important; - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-xl-around { - -webkit-align-content: space-around !important; - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-xl-stretch { - -webkit-align-content: stretch !important; - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-xl-auto { - -webkit-align-self: auto !important; - -ms-flex-item-align: auto !important; - -ms-grid-row-align: auto !important; - align-self: auto !important; - } - .align-self-xl-start { - -webkit-align-self: flex-start !important; - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-xl-end { - -webkit-align-self: flex-end !important; - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-xl-center { - -webkit-align-self: center !important; - -ms-flex-item-align: center !important; - -ms-grid-row-align: center !important; - align-self: center !important; - } - .align-self-xl-baseline { - -webkit-align-self: baseline !important; - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-xl-stretch { - -webkit-align-self: stretch !important; - -ms-flex-item-align: stretch !important; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; - } -} - -.float-left { - float: left !important; -} - -.float-right { - float: right !important; -} - -.float-none { - float: none !important; -} - -@media (min-width: 576px) { - .float-sm-left { - float: left !important; - } - .float-sm-right { - float: right !important; - } - .float-sm-none { - float: none !important; - } -} - -@media (min-width: 768px) { - .float-md-left { - float: left !important; - } - .float-md-right { - float: right !important; - } - .float-md-none { - float: none !important; - } -} - -@media (min-width: 992px) { - .float-lg-left { - float: left !important; - } - .float-lg-right { - float: right !important; - } - .float-lg-none { - float: none !important; - } -} - -@media (min-width: 1200px) { - .float-xl-left { - float: left !important; - } - .float-xl-right { - float: right !important; - } - .float-xl-none { - float: none !important; - } -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} - -.sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1030; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} - -.w-25 { - width: 25% !important; -} - -.w-50 { - width: 50% !important; -} - -.w-75 { - width: 75% !important; -} - -.w-100 { - width: 100% !important; -} - -.h-25 { - height: 25% !important; -} - -.h-50 { - height: 50% !important; -} - -.h-75 { - height: 75% !important; -} - -.h-100 { - height: 100% !important; -} - -.mw-100 { - max-width: 100% !important; -} - -.mh-100 { - max-height: 100% !important; -} - -.m-0 { - margin: 0 0 !important; -} - -.mt-0 { - margin-top: 0 !important; -} - -.mr-0 { - margin-right: 0 !important; -} - -.mb-0 { - margin-bottom: 0 !important; -} - -.ml-0 { - margin-left: 0 !important; -} - -.mx-0 { - margin-right: 0 !important; - margin-left: 0 !important; -} - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -.m-1 { - margin: 0.25rem 0.25rem !important; -} - -.mt-1 { - margin-top: 0.25rem !important; -} - -.mr-1 { - margin-right: 0.25rem !important; -} - -.mb-1 { - margin-bottom: 0.25rem !important; -} - -.ml-1 { - margin-left: 0.25rem !important; -} - -.mx-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; -} - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem 0.5rem !important; -} - -.mt-2 { - margin-top: 0.5rem !important; -} - -.mr-2 { - margin-right: 0.5rem !important; -} - -.mb-2 { - margin-bottom: 0.5rem !important; -} - -.ml-2 { - margin-left: 0.5rem !important; -} - -.mx-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; -} - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; -} - -.m-3 { - margin: 1rem 1rem !important; -} - -.mt-3 { - margin-top: 1rem !important; -} - -.mr-3 { - margin-right: 1rem !important; -} - -.mb-3 { - margin-bottom: 1rem !important; -} - -.ml-3 { - margin-left: 1rem !important; -} - -.mx-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; -} - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; -} - -.m-4 { - margin: 1.5rem 1.5rem !important; -} - -.mt-4 { - margin-top: 1.5rem !important; -} - -.mr-4 { - margin-right: 1.5rem !important; -} - -.mb-4 { - margin-bottom: 1.5rem !important; -} - -.ml-4 { - margin-left: 1.5rem !important; -} - -.mx-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; -} - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.m-5 { - margin: 3rem 3rem !important; -} - -.mt-5 { - margin-top: 3rem !important; -} - -.mr-5 { - margin-right: 3rem !important; -} - -.mb-5 { - margin-bottom: 3rem !important; -} - -.ml-5 { - margin-left: 3rem !important; -} - -.mx-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; -} - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; -} - -.p-0 { - padding: 0 0 !important; -} - -.pt-0 { - padding-top: 0 !important; -} - -.pr-0 { - padding-right: 0 !important; -} - -.pb-0 { - padding-bottom: 0 !important; -} - -.pl-0 { - padding-left: 0 !important; -} - -.px-0 { - padding-right: 0 !important; - padding-left: 0 !important; -} - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.p-1 { - padding: 0.25rem 0.25rem !important; -} - -.pt-1 { - padding-top: 0.25rem !important; -} - -.pr-1 { - padding-right: 0.25rem !important; -} - -.pb-1 { - padding-bottom: 0.25rem !important; -} - -.pl-1 { - padding-left: 0.25rem !important; -} - -.px-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; -} - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem 0.5rem !important; -} - -.pt-2 { - padding-top: 0.5rem !important; -} - -.pr-2 { - padding-right: 0.5rem !important; -} - -.pb-2 { - padding-bottom: 0.5rem !important; -} - -.pl-2 { - padding-left: 0.5rem !important; -} - -.px-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; -} - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; -} - -.p-3 { - padding: 1rem 1rem !important; -} - -.pt-3 { - padding-top: 1rem !important; -} - -.pr-3 { - padding-right: 1rem !important; -} - -.pb-3 { - padding-bottom: 1rem !important; -} - -.pl-3 { - padding-left: 1rem !important; -} - -.px-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; -} - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; -} - -.p-4 { - padding: 1.5rem 1.5rem !important; -} - -.pt-4 { - padding-top: 1.5rem !important; -} - -.pr-4 { - padding-right: 1.5rem !important; -} - -.pb-4 { - padding-bottom: 1.5rem !important; -} - -.pl-4 { - padding-left: 1.5rem !important; -} - -.px-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; -} - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; -} - -.p-5 { - padding: 3rem 3rem !important; -} - -.pt-5 { - padding-top: 3rem !important; -} - -.pr-5 { - padding-right: 3rem !important; -} - -.pb-5 { - padding-bottom: 3rem !important; -} - -.pl-5 { - padding-left: 3rem !important; -} - -.px-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; -} - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mt-auto { - margin-top: auto !important; -} - -.mr-auto { - margin-right: auto !important; -} - -.mb-auto { - margin-bottom: auto !important; -} - -.ml-auto { - margin-left: auto !important; -} - -.mx-auto { - margin-right: auto !important; - margin-left: auto !important; -} - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; -} - -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 0 !important; - } - .mt-sm-0 { - margin-top: 0 !important; - } - .mr-sm-0 { - margin-right: 0 !important; - } - .mb-sm-0 { - margin-bottom: 0 !important; - } - .ml-sm-0 { - margin-left: 0 !important; - } - .mx-sm-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .m-sm-1 { - margin: 0.25rem 0.25rem !important; - } - .mt-sm-1 { - margin-top: 0.25rem !important; - } - .mr-sm-1 { - margin-right: 0.25rem !important; - } - .mb-sm-1 { - margin-bottom: 0.25rem !important; - } - .ml-sm-1 { - margin-left: 0.25rem !important; - } - .mx-sm-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem 0.5rem !important; - } - .mt-sm-2 { - margin-top: 0.5rem !important; - } - .mr-sm-2 { - margin-right: 0.5rem !important; - } - .mb-sm-2 { - margin-bottom: 0.5rem !important; - } - .ml-sm-2 { - margin-left: 0.5rem !important; - } - .mx-sm-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem 1rem !important; - } - .mt-sm-3 { - margin-top: 1rem !important; - } - .mr-sm-3 { - margin-right: 1rem !important; - } - .mb-sm-3 { - margin-bottom: 1rem !important; - } - .ml-sm-3 { - margin-left: 1rem !important; - } - .mx-sm-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem 1.5rem !important; - } - .mt-sm-4 { - margin-top: 1.5rem !important; - } - .mr-sm-4 { - margin-right: 1.5rem !important; - } - .mb-sm-4 { - margin-bottom: 1.5rem !important; - } - .ml-sm-4 { - margin-left: 1.5rem !important; - } - .mx-sm-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem 3rem !important; - } - .mt-sm-5 { - margin-top: 3rem !important; - } - .mr-sm-5 { - margin-right: 3rem !important; - } - .mb-sm-5 { - margin-bottom: 3rem !important; - } - .ml-sm-5 { - margin-left: 3rem !important; - } - .mx-sm-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .p-sm-0 { - padding: 0 0 !important; - } - .pt-sm-0 { - padding-top: 0 !important; - } - .pr-sm-0 { - padding-right: 0 !important; - } - .pb-sm-0 { - padding-bottom: 0 !important; - } - .pl-sm-0 { - padding-left: 0 !important; - } - .px-sm-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .p-sm-1 { - padding: 0.25rem 0.25rem !important; - } - .pt-sm-1 { - padding-top: 0.25rem !important; - } - .pr-sm-1 { - padding-right: 0.25rem !important; - } - .pb-sm-1 { - padding-bottom: 0.25rem !important; - } - .pl-sm-1 { - padding-left: 0.25rem !important; - } - .px-sm-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem 0.5rem !important; - } - .pt-sm-2 { - padding-top: 0.5rem !important; - } - .pr-sm-2 { - padding-right: 0.5rem !important; - } - .pb-sm-2 { - padding-bottom: 0.5rem !important; - } - .pl-sm-2 { - padding-left: 0.5rem !important; - } - .px-sm-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem 1rem !important; - } - .pt-sm-3 { - padding-top: 1rem !important; - } - .pr-sm-3 { - padding-right: 1rem !important; - } - .pb-sm-3 { - padding-bottom: 1rem !important; - } - .pl-sm-3 { - padding-left: 1rem !important; - } - .px-sm-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem 1.5rem !important; - } - .pt-sm-4 { - padding-top: 1.5rem !important; - } - .pr-sm-4 { - padding-right: 1.5rem !important; - } - .pb-sm-4 { - padding-bottom: 1.5rem !important; - } - .pl-sm-4 { - padding-left: 1.5rem !important; - } - .px-sm-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem 3rem !important; - } - .pt-sm-5 { - padding-top: 3rem !important; - } - .pr-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-5 { - padding-bottom: 3rem !important; - } - .pl-sm-5 { - padding-left: 3rem !important; - } - .px-sm-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mt-sm-auto { - margin-top: auto !important; - } - .mr-sm-auto { - margin-right: auto !important; - } - .mb-sm-auto { - margin-bottom: auto !important; - } - .ml-sm-auto { - margin-left: auto !important; - } - .mx-sm-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } -} - -@media (min-width: 768px) { - .m-md-0 { - margin: 0 0 !important; - } - .mt-md-0 { - margin-top: 0 !important; - } - .mr-md-0 { - margin-right: 0 !important; - } - .mb-md-0 { - margin-bottom: 0 !important; - } - .ml-md-0 { - margin-left: 0 !important; - } - .mx-md-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .m-md-1 { - margin: 0.25rem 0.25rem !important; - } - .mt-md-1 { - margin-top: 0.25rem !important; - } - .mr-md-1 { - margin-right: 0.25rem !important; - } - .mb-md-1 { - margin-bottom: 0.25rem !important; - } - .ml-md-1 { - margin-left: 0.25rem !important; - } - .mx-md-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem 0.5rem !important; - } - .mt-md-2 { - margin-top: 0.5rem !important; - } - .mr-md-2 { - margin-right: 0.5rem !important; - } - .mb-md-2 { - margin-bottom: 0.5rem !important; - } - .ml-md-2 { - margin-left: 0.5rem !important; - } - .mx-md-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .m-md-3 { - margin: 1rem 1rem !important; - } - .mt-md-3 { - margin-top: 1rem !important; - } - .mr-md-3 { - margin-right: 1rem !important; - } - .mb-md-3 { - margin-bottom: 1rem !important; - } - .ml-md-3 { - margin-left: 1rem !important; - } - .mx-md-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .m-md-4 { - margin: 1.5rem 1.5rem !important; - } - .mt-md-4 { - margin-top: 1.5rem !important; - } - .mr-md-4 { - margin-right: 1.5rem !important; - } - .mb-md-4 { - margin-bottom: 1.5rem !important; - } - .ml-md-4 { - margin-left: 1.5rem !important; - } - .mx-md-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .m-md-5 { - margin: 3rem 3rem !important; - } - .mt-md-5 { - margin-top: 3rem !important; - } - .mr-md-5 { - margin-right: 3rem !important; - } - .mb-md-5 { - margin-bottom: 3rem !important; - } - .ml-md-5 { - margin-left: 3rem !important; - } - .mx-md-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .p-md-0 { - padding: 0 0 !important; - } - .pt-md-0 { - padding-top: 0 !important; - } - .pr-md-0 { - padding-right: 0 !important; - } - .pb-md-0 { - padding-bottom: 0 !important; - } - .pl-md-0 { - padding-left: 0 !important; - } - .px-md-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .p-md-1 { - padding: 0.25rem 0.25rem !important; - } - .pt-md-1 { - padding-top: 0.25rem !important; - } - .pr-md-1 { - padding-right: 0.25rem !important; - } - .pb-md-1 { - padding-bottom: 0.25rem !important; - } - .pl-md-1 { - padding-left: 0.25rem !important; - } - .px-md-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem 0.5rem !important; - } - .pt-md-2 { - padding-top: 0.5rem !important; - } - .pr-md-2 { - padding-right: 0.5rem !important; - } - .pb-md-2 { - padding-bottom: 0.5rem !important; - } - .pl-md-2 { - padding-left: 0.5rem !important; - } - .px-md-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .p-md-3 { - padding: 1rem 1rem !important; - } - .pt-md-3 { - padding-top: 1rem !important; - } - .pr-md-3 { - padding-right: 1rem !important; - } - .pb-md-3 { - padding-bottom: 1rem !important; - } - .pl-md-3 { - padding-left: 1rem !important; - } - .px-md-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .p-md-4 { - padding: 1.5rem 1.5rem !important; - } - .pt-md-4 { - padding-top: 1.5rem !important; - } - .pr-md-4 { - padding-right: 1.5rem !important; - } - .pb-md-4 { - padding-bottom: 1.5rem !important; - } - .pl-md-4 { - padding-left: 1.5rem !important; - } - .px-md-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .p-md-5 { - padding: 3rem 3rem !important; - } - .pt-md-5 { - padding-top: 3rem !important; - } - .pr-md-5 { - padding-right: 3rem !important; - } - .pb-md-5 { - padding-bottom: 3rem !important; - } - .pl-md-5 { - padding-left: 3rem !important; - } - .px-md-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mt-md-auto { - margin-top: auto !important; - } - .mr-md-auto { - margin-right: auto !important; - } - .mb-md-auto { - margin-bottom: auto !important; - } - .ml-md-auto { - margin-left: auto !important; - } - .mx-md-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } -} - -@media (min-width: 992px) { - .m-lg-0 { - margin: 0 0 !important; - } - .mt-lg-0 { - margin-top: 0 !important; - } - .mr-lg-0 { - margin-right: 0 !important; - } - .mb-lg-0 { - margin-bottom: 0 !important; - } - .ml-lg-0 { - margin-left: 0 !important; - } - .mx-lg-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .m-lg-1 { - margin: 0.25rem 0.25rem !important; - } - .mt-lg-1 { - margin-top: 0.25rem !important; - } - .mr-lg-1 { - margin-right: 0.25rem !important; - } - .mb-lg-1 { - margin-bottom: 0.25rem !important; - } - .ml-lg-1 { - margin-left: 0.25rem !important; - } - .mx-lg-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem 0.5rem !important; - } - .mt-lg-2 { - margin-top: 0.5rem !important; - } - .mr-lg-2 { - margin-right: 0.5rem !important; - } - .mb-lg-2 { - margin-bottom: 0.5rem !important; - } - .ml-lg-2 { - margin-left: 0.5rem !important; - } - .mx-lg-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem 1rem !important; - } - .mt-lg-3 { - margin-top: 1rem !important; - } - .mr-lg-3 { - margin-right: 1rem !important; - } - .mb-lg-3 { - margin-bottom: 1rem !important; - } - .ml-lg-3 { - margin-left: 1rem !important; - } - .mx-lg-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem 1.5rem !important; - } - .mt-lg-4 { - margin-top: 1.5rem !important; - } - .mr-lg-4 { - margin-right: 1.5rem !important; - } - .mb-lg-4 { - margin-bottom: 1.5rem !important; - } - .ml-lg-4 { - margin-left: 1.5rem !important; - } - .mx-lg-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem 3rem !important; - } - .mt-lg-5 { - margin-top: 3rem !important; - } - .mr-lg-5 { - margin-right: 3rem !important; - } - .mb-lg-5 { - margin-bottom: 3rem !important; - } - .ml-lg-5 { - margin-left: 3rem !important; - } - .mx-lg-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .p-lg-0 { - padding: 0 0 !important; - } - .pt-lg-0 { - padding-top: 0 !important; - } - .pr-lg-0 { - padding-right: 0 !important; - } - .pb-lg-0 { - padding-bottom: 0 !important; - } - .pl-lg-0 { - padding-left: 0 !important; - } - .px-lg-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .p-lg-1 { - padding: 0.25rem 0.25rem !important; - } - .pt-lg-1 { - padding-top: 0.25rem !important; - } - .pr-lg-1 { - padding-right: 0.25rem !important; - } - .pb-lg-1 { - padding-bottom: 0.25rem !important; - } - .pl-lg-1 { - padding-left: 0.25rem !important; - } - .px-lg-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem 0.5rem !important; - } - .pt-lg-2 { - padding-top: 0.5rem !important; - } - .pr-lg-2 { - padding-right: 0.5rem !important; - } - .pb-lg-2 { - padding-bottom: 0.5rem !important; - } - .pl-lg-2 { - padding-left: 0.5rem !important; - } - .px-lg-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem 1rem !important; - } - .pt-lg-3 { - padding-top: 1rem !important; - } - .pr-lg-3 { - padding-right: 1rem !important; - } - .pb-lg-3 { - padding-bottom: 1rem !important; - } - .pl-lg-3 { - padding-left: 1rem !important; - } - .px-lg-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem 1.5rem !important; - } - .pt-lg-4 { - padding-top: 1.5rem !important; - } - .pr-lg-4 { - padding-right: 1.5rem !important; - } - .pb-lg-4 { - padding-bottom: 1.5rem !important; - } - .pl-lg-4 { - padding-left: 1.5rem !important; - } - .px-lg-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem 3rem !important; - } - .pt-lg-5 { - padding-top: 3rem !important; - } - .pr-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-5 { - padding-bottom: 3rem !important; - } - .pl-lg-5 { - padding-left: 3rem !important; - } - .px-lg-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mt-lg-auto { - margin-top: auto !important; - } - .mr-lg-auto { - margin-right: auto !important; - } - .mb-lg-auto { - margin-bottom: auto !important; - } - .ml-lg-auto { - margin-left: auto !important; - } - .mx-lg-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } -} - -@media (min-width: 1200px) { - .m-xl-0 { - margin: 0 0 !important; - } - .mt-xl-0 { - margin-top: 0 !important; - } - .mr-xl-0 { - margin-right: 0 !important; - } - .mb-xl-0 { - margin-bottom: 0 !important; - } - .ml-xl-0 { - margin-left: 0 !important; - } - .mx-xl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .m-xl-1 { - margin: 0.25rem 0.25rem !important; - } - .mt-xl-1 { - margin-top: 0.25rem !important; - } - .mr-xl-1 { - margin-right: 0.25rem !important; - } - .mb-xl-1 { - margin-bottom: 0.25rem !important; - } - .ml-xl-1 { - margin-left: 0.25rem !important; - } - .mx-xl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem 0.5rem !important; - } - .mt-xl-2 { - margin-top: 0.5rem !important; - } - .mr-xl-2 { - margin-right: 0.5rem !important; - } - .mb-xl-2 { - margin-bottom: 0.5rem !important; - } - .ml-xl-2 { - margin-left: 0.5rem !important; - } - .mx-xl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem 1rem !important; - } - .mt-xl-3 { - margin-top: 1rem !important; - } - .mr-xl-3 { - margin-right: 1rem !important; - } - .mb-xl-3 { - margin-bottom: 1rem !important; - } - .ml-xl-3 { - margin-left: 1rem !important; - } - .mx-xl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem 1.5rem !important; - } - .mt-xl-4 { - margin-top: 1.5rem !important; - } - .mr-xl-4 { - margin-right: 1.5rem !important; - } - .mb-xl-4 { - margin-bottom: 1.5rem !important; - } - .ml-xl-4 { - margin-left: 1.5rem !important; - } - .mx-xl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem 3rem !important; - } - .mt-xl-5 { - margin-top: 3rem !important; - } - .mr-xl-5 { - margin-right: 3rem !important; - } - .mb-xl-5 { - margin-bottom: 3rem !important; - } - .ml-xl-5 { - margin-left: 3rem !important; - } - .mx-xl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .p-xl-0 { - padding: 0 0 !important; - } - .pt-xl-0 { - padding-top: 0 !important; - } - .pr-xl-0 { - padding-right: 0 !important; - } - .pb-xl-0 { - padding-bottom: 0 !important; - } - .pl-xl-0 { - padding-left: 0 !important; - } - .px-xl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .p-xl-1 { - padding: 0.25rem 0.25rem !important; - } - .pt-xl-1 { - padding-top: 0.25rem !important; - } - .pr-xl-1 { - padding-right: 0.25rem !important; - } - .pb-xl-1 { - padding-bottom: 0.25rem !important; - } - .pl-xl-1 { - padding-left: 0.25rem !important; - } - .px-xl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem 0.5rem !important; - } - .pt-xl-2 { - padding-top: 0.5rem !important; - } - .pr-xl-2 { - padding-right: 0.5rem !important; - } - .pb-xl-2 { - padding-bottom: 0.5rem !important; - } - .pl-xl-2 { - padding-left: 0.5rem !important; - } - .px-xl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem 1rem !important; - } - .pt-xl-3 { - padding-top: 1rem !important; - } - .pr-xl-3 { - padding-right: 1rem !important; - } - .pb-xl-3 { - padding-bottom: 1rem !important; - } - .pl-xl-3 { - padding-left: 1rem !important; - } - .px-xl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem 1.5rem !important; - } - .pt-xl-4 { - padding-top: 1.5rem !important; - } - .pr-xl-4 { - padding-right: 1.5rem !important; - } - .pb-xl-4 { - padding-bottom: 1.5rem !important; - } - .pl-xl-4 { - padding-left: 1.5rem !important; - } - .px-xl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem 3rem !important; - } - .pt-xl-5 { - padding-top: 3rem !important; - } - .pr-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-5 { - padding-bottom: 3rem !important; - } - .pl-xl-5 { - padding-left: 3rem !important; - } - .px-xl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mt-xl-auto { - margin-top: auto !important; - } - .mr-xl-auto { - margin-right: auto !important; - } - .mb-xl-auto { - margin-bottom: auto !important; - } - .ml-xl-auto { - margin-left: auto !important; - } - .mx-xl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } -} - -.text-justify { - text-align: justify !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.text-left { - text-align: left !important; -} - -.text-right { - text-align: right !important; -} - -.text-center { - text-align: center !important; -} - -@media (min-width: 576px) { - .text-sm-left { - text-align: left !important; - } - .text-sm-right { - text-align: right !important; - } - .text-sm-center { - text-align: center !important; - } -} - -@media (min-width: 768px) { - .text-md-left { - text-align: left !important; - } - .text-md-right { - text-align: right !important; - } - .text-md-center { - text-align: center !important; - } -} - -@media (min-width: 992px) { - .text-lg-left { - text-align: left !important; - } - .text-lg-right { - text-align: right !important; - } - .text-lg-center { - text-align: center !important; - } -} - -@media (min-width: 1200px) { - .text-xl-left { - text-align: left !important; - } - .text-xl-right { - text-align: right !important; - } - .text-xl-center { - text-align: center !important; - } -} - -.text-lowercase { - text-transform: lowercase !important; -} - -.text-uppercase { - text-transform: uppercase !important; -} - -.text-capitalize { - text-transform: capitalize !important; -} - -.font-weight-normal { - font-weight: normal; -} - -.font-weight-bold { - font-weight: bold; -} - -.font-italic { - font-style: italic; -} - -.text-white { - color: #fff !important; -} - -.text-muted { - color: #636c72 !important; -} - -a.text-muted:focus, a.text-muted:hover { - color: #4b5257 !important; -} - -.text-primary { - color: #0275d8 !important; -} - -a.text-primary:focus, a.text-primary:hover { - color: #025aa5 !important; -} - -.text-success { - color: #5cb85c !important; -} - -a.text-success:focus, a.text-success:hover { - color: #449d44 !important; -} - -.text-info { - color: #5bc0de !important; -} - -a.text-info:focus, a.text-info:hover { - color: #31b0d5 !important; -} - -.text-warning { - color: #f0ad4e !important; -} - -a.text-warning:focus, a.text-warning:hover { - color: #ec971f !important; -} - -.text-danger { - color: #d9534f !important; -} - -a.text-danger:focus, a.text-danger:hover { - color: #c9302c !important; -} - -.text-gray-dark { - color: #292b2c !important; -} - -a.text-gray-dark:focus, a.text-gray-dark:hover { - color: #101112 !important; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.invisible { - visibility: hidden !important; -} - -.hidden-xs-up { - display: none !important; -} - -@media (max-width: 575px) { - .hidden-xs-down { - display: none !important; - } -} - -@media (min-width: 576px) { - .hidden-sm-up { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-sm-down { - display: none !important; - } -} - -@media (min-width: 768px) { - .hidden-md-up { - display: none !important; - } -} - -@media (max-width: 991px) { - .hidden-md-down { - display: none !important; - } -} - -@media (min-width: 992px) { - .hidden-lg-up { - display: none !important; - } -} - -@media (max-width: 1199px) { - .hidden-lg-down { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-xl-up { - display: none !important; - } -} - -.hidden-xl-down { - display: none !important; -} - -.visible-print-block { - display: none !important; -} - -@media print { - .visible-print-block { - display: block !important; - } -} - -.visible-print-inline { - display: none !important; -} - -@media print { - .visible-print-inline { - display: inline !important; - } -} - -.visible-print-inline-block { - display: none !important; -} - -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} - -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/pkgs/csslib/test/examples/bulma.css b/pkgs/csslib/test/examples/bulma.css deleted file mode 100644 index 32b9f3e14..000000000 --- a/pkgs/csslib/test/examples/bulma.css +++ /dev/null @@ -1,7128 +0,0 @@ -/*! bulma.io v0.4.1 | MIT License | github.com/jgthms/bulma */ -@-webkit-keyframes spinAround { - from { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - to { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -@keyframes spinAround { - from { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - to { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -/*! minireset.css v0.0.2 | MIT License | github.com/jgthms/minireset.css */ -html, -body, -p, -ol, -ul, -li, -dl, -dt, -dd, -blockquote, -figure, -fieldset, -legend, -textarea, -pre, -iframe, -hr, -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - padding: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - font-weight: normal; -} - -ul { - list-style: none; -} - -button, -input, -select, -textarea { - margin: 0; -} - -html { - box-sizing: border-box; -} - -* { - box-sizing: inherit; -} - -*:before, *:after { - box-sizing: inherit; -} - -img, -embed, -object, -audio, -video { - height: auto; - max-width: 100%; -} - -iframe { - border: 0; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; - text-align: left; -} - -html { - background-color: #fff; - font-size: 16px; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - min-width: 300px; - overflow-x: hidden; - overflow-y: scroll; - text-rendering: optimizeLegibility; -} - -article, -aside, -figure, -footer, -header, -hgroup, -section { - display: block; -} - -body, -button, -input, -select, -textarea { - font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif; -} - -code, -pre { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; - font-family: monospace; -} - -body { - color: #4a4a4a; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; -} - -a { - color: #00d1b2; - cursor: pointer; - text-decoration: none; - -webkit-transition: none 86ms ease-out; - transition: none 86ms ease-out; -} - -a:hover { - color: #363636; -} - -code { - background-color: whitesmoke; - color: #ff3860; - font-size: 0.8em; - font-weight: normal; - padding: 0.25em 0.5em 0.25em; -} - -hr { - background-color: #dbdbdb; - border: none; - display: block; - height: 1px; - margin: 1.5rem 0; -} - -img { - max-width: 100%; -} - -input[type="checkbox"], -input[type="radio"] { - vertical-align: baseline; -} - -small { - font-size: 0.8em; -} - -span { - font-style: inherit; - font-weight: inherit; -} - -strong { - color: #363636; - font-weight: 700; -} - -pre { - background-color: whitesmoke; - color: #4a4a4a; - font-size: 0.8em; - white-space: pre; - word-wrap: normal; -} - -pre code { - -webkit-overflow-scrolling: touch; - background: none; - color: inherit; - display: block; - font-size: 1em; - overflow-x: auto; - padding: 1.25rem 1.5rem; -} - -table { - width: 100%; -} - -table td, -table th { - text-align: left; - vertical-align: top; -} - -table th { - color: #363636; -} - -.is-block { - display: block; -} - -@media screen and (max-width: 768px) { - .is-block-mobile { - display: block !important; - } -} - -@media screen and (min-width: 769px), print { - .is-block-tablet { - display: block !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 999px) { - .is-block-tablet-only { - display: block !important; - } -} - -@media screen and (max-width: 999px) { - .is-block-touch { - display: block !important; - } -} - -@media screen and (min-width: 1000px) { - .is-block-desktop { - display: block !important; - } -} - -@media screen and (min-width: 1000px) and (max-width: 1191px) { - .is-block-desktop-only { - display: block !important; - } -} - -@media screen and (min-width: 1192px) { - .is-block-widescreen { - display: block !important; - } -} - -.is-flex { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} - -@media screen and (max-width: 768px) { - .is-flex-mobile { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } -} - -@media screen and (min-width: 769px), print { - .is-flex-tablet { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 999px) { - .is-flex-tablet-only { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } -} - -@media screen and (max-width: 999px) { - .is-flex-touch { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } -} - -@media screen and (min-width: 1000px) { - .is-flex-desktop { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } -} - -@media screen and (min-width: 1000px) and (max-width: 1191px) { - .is-flex-desktop-only { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } -} - -@media screen and (min-width: 1192px) { - .is-flex-widescreen { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } -} - -.is-inline { - display: inline; -} - -@media screen and (max-width: 768px) { - .is-inline-mobile { - display: inline !important; - } -} - -@media screen and (min-width: 769px), print { - .is-inline-tablet { - display: inline !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 999px) { - .is-inline-tablet-only { - display: inline !important; - } -} - -@media screen and (max-width: 999px) { - .is-inline-touch { - display: inline !important; - } -} - -@media screen and (min-width: 1000px) { - .is-inline-desktop { - display: inline !important; - } -} - -@media screen and (min-width: 1000px) and (max-width: 1191px) { - .is-inline-desktop-only { - display: inline !important; - } -} - -@media screen and (min-width: 1192px) { - .is-inline-widescreen { - display: inline !important; - } -} - -.is-inline-block { - display: inline-block; -} - -@media screen and (max-width: 768px) { - .is-inline-block-mobile { - display: inline-block !important; - } -} - -@media screen and (min-width: 769px), print { - .is-inline-block-tablet { - display: inline-block !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 999px) { - .is-inline-block-tablet-only { - display: inline-block !important; - } -} - -@media screen and (max-width: 999px) { - .is-inline-block-touch { - display: inline-block !important; - } -} - -@media screen and (min-width: 1000px) { - .is-inline-block-desktop { - display: inline-block !important; - } -} - -@media screen and (min-width: 1000px) and (max-width: 1191px) { - .is-inline-block-desktop-only { - display: inline-block !important; - } -} - -@media screen and (min-width: 1192px) { - .is-inline-block-widescreen { - display: inline-block !important; - } -} - -.is-inline-flex { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; -} - -@media screen and (max-width: 768px) { - .is-inline-flex-mobile { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media screen and (min-width: 769px), print { - .is-inline-flex-tablet { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 999px) { - .is-inline-flex-tablet-only { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media screen and (max-width: 999px) { - .is-inline-flex-touch { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media screen and (min-width: 1000px) { - .is-inline-flex-desktop { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media screen and (min-width: 1000px) and (max-width: 1191px) { - .is-inline-flex-desktop-only { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media screen and (min-width: 1192px) { - .is-inline-flex-widescreen { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -.is-clearfix:after { - clear: both; - content: " "; - display: table; -} - -.is-pulled-left { - float: left; -} - -.is-pulled-right { - float: right; -} - -.is-clipped { - overflow: hidden !important; -} - -.is-overlay { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; -} - -.has-text-centered { - text-align: center; -} - -.has-text-left { - text-align: left; -} - -.has-text-right { - text-align: right; -} - -.has-text-white { - color: white; -} - -a.has-text-white:hover, a.has-text-white:focus { - color: #e6e6e6; -} - -.has-text-black { - color: #0a0a0a; -} - -a.has-text-black:hover, a.has-text-black:focus { - color: black; -} - -.has-text-light { - color: whitesmoke; -} - -a.has-text-light:hover, a.has-text-light:focus { - color: #dbdbdb; -} - -.has-text-dark { - color: #363636; -} - -a.has-text-dark:hover, a.has-text-dark:focus { - color: #1c1c1c; -} - -.has-text-primary { - color: #00d1b2; -} - -a.has-text-primary:hover, a.has-text-primary:focus { - color: #009e86; -} - -.has-text-info { - color: #3273dc; -} - -a.has-text-info:hover, a.has-text-info:focus { - color: #205bbc; -} - -.has-text-success { - color: #23d160; -} - -a.has-text-success:hover, a.has-text-success:focus { - color: #1ca64c; -} - -.has-text-warning { - color: #ffdd57; -} - -a.has-text-warning:hover, a.has-text-warning:focus { - color: #ffd324; -} - -.has-text-danger { - color: #ff3860; -} - -a.has-text-danger:hover, a.has-text-danger:focus { - color: #ff0537; -} - -.is-hidden { - display: none !important; -} - -@media screen and (max-width: 768px) { - .is-hidden-mobile { - display: none !important; - } -} - -@media screen and (min-width: 769px), print { - .is-hidden-tablet { - display: none !important; - } -} - -@media screen and (min-width: 769px) and (max-width: 999px) { - .is-hidden-tablet-only { - display: none !important; - } -} - -@media screen and (max-width: 999px) { - .is-hidden-touch { - display: none !important; - } -} - -@media screen and (min-width: 1000px) { - .is-hidden-desktop { - display: none !important; - } -} - -@media screen and (min-width: 1000px) and (max-width: 1191px) { - .is-hidden-desktop-only { - display: none !important; - } -} - -@media screen and (min-width: 1192px) { - .is-hidden-widescreen { - display: none !important; - } -} - -.is-marginless { - margin: 0 !important; -} - -.is-paddingless { - padding: 0 !important; -} - -.is-unselectable { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.box { - background-color: white; - border-radius: 5px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - display: block; - padding: 1.25rem; -} - -.box:not(:last-child) { - margin-bottom: 1.5rem; -} - -a.box:hover, a.box:focus { - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #00d1b2; -} - -a.box:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #00d1b2; -} - -.button { - -moz-appearance: none; - -webkit-appearance: none; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - border: 1px solid transparent; - border-radius: 3px; - box-shadow: none; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - font-size: 1rem; - height: 2.25em; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: white; - border-color: #dbdbdb; - color: #363636; - cursor: pointer; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - padding-left: 0.75em; - padding-right: 0.75em; - text-align: center; - white-space: nowrap; -} - -.button:focus, .button.is-focused, .button:active, .button.is-active { - outline: none; -} - -.button[disabled] { - cursor: not-allowed; -} - -.button strong { - color: inherit; -} - -.button .icon, .button .icon.is-small, .button .icon.is-medium, .button .icon.is-large { - height: 1.5em; - width: 1.5em; -} - -.button .icon:first-child:not(:last-child) { - margin-left: calc(-0.375em - 1px); - margin-right: 0.1875em; -} - -.button .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: calc(-0.375em - 1px); -} - -.button .icon:first-child:last-child { - margin-left: calc(-0.375em - 1px); - margin-right: calc(-0.375em - 1px); -} - -.button:hover, .button.is-hovered { - border-color: #b5b5b5; - color: #363636; -} - -.button:focus, .button.is-focused { - border-color: #00d1b2; - box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25); - color: #363636; -} - -.button:active, .button.is-active { - border-color: #4a4a4a; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: #363636; -} - -.button.is-link { - background-color: transparent; - border-color: transparent; - color: #4a4a4a; - text-decoration: underline; -} - -.button.is-link:hover, .button.is-link.is-hovered, .button.is-link:focus, .button.is-link.is-focused, .button.is-link:active, .button.is-link.is-active { - background-color: whitesmoke; - color: #363636; -} - -.button.is-link[disabled] { - background-color: transparent; - border-color: transparent; - box-shadow: none; -} - -.button.is-white { - background-color: white; - border-color: transparent; - color: #0a0a0a; -} - -.button.is-white:hover, .button.is-white.is-hovered { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; -} - -.button.is-white:focus, .button.is-white.is-focused { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); - color: #0a0a0a; -} - -.button.is-white:active, .button.is-white.is-active { - background-color: #f2f2f2; - border-color: transparent; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: #0a0a0a; -} - -.button.is-white[disabled] { - background-color: white; - border-color: transparent; - box-shadow: none; -} - -.button.is-white.is-inverted { - background-color: #0a0a0a; - color: white; -} - -.button.is-white.is-inverted:hover { - background-color: black; -} - -.button.is-white.is-inverted[disabled] { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; - color: white; -} - -.button.is-white.is-loading:after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; -} - -.button.is-white.is-outlined { - background-color: transparent; - border-color: white; - color: white; -} - -.button.is-white.is-outlined:hover, .button.is-white.is-outlined:focus { - background-color: white; - border-color: white; - color: #0a0a0a; -} - -.button.is-white.is-outlined.is-loading:after { - border-color: transparent transparent white white !important; -} - -.button.is-white.is-outlined[disabled] { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; -} - -.button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; -} - -.button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined:focus { - background-color: #0a0a0a; - color: white; -} - -.button.is-white.is-inverted.is-outlined[disabled] { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; -} - -.button.is-black { - background-color: #0a0a0a; - border-color: transparent; - color: white; -} - -.button.is-black:hover, .button.is-black.is-hovered { - background-color: #040404; - border-color: transparent; - color: white; -} - -.button.is-black:focus, .button.is-black.is-focused { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); - color: white; -} - -.button.is-black:active, .button.is-black.is-active { - background-color: black; - border-color: transparent; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: white; -} - -.button.is-black[disabled] { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; -} - -.button.is-black.is-inverted { - background-color: white; - color: #0a0a0a; -} - -.button.is-black.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-black.is-inverted[disabled] { - background-color: white; - border-color: transparent; - box-shadow: none; - color: #0a0a0a; -} - -.button.is-black.is-loading:after { - border-color: transparent transparent white white !important; -} - -.button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; -} - -.button.is-black.is-outlined:hover, .button.is-black.is-outlined:focus { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; -} - -.button.is-black.is-outlined.is-loading:after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; -} - -.button.is-black.is-outlined[disabled] { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; -} - -.button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - color: white; -} - -.button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined:focus { - background-color: white; - color: #0a0a0a; -} - -.button.is-black.is-inverted.is-outlined[disabled] { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; -} - -.button.is-light { - background-color: whitesmoke; - border-color: transparent; - color: #363636; -} - -.button.is-light:hover, .button.is-light.is-hovered { - background-color: #eeeeee; - border-color: transparent; - color: #363636; -} - -.button.is-light:focus, .button.is-light.is-focused { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); - color: #363636; -} - -.button.is-light:active, .button.is-light.is-active { - background-color: #e8e8e8; - border-color: transparent; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: #363636; -} - -.button.is-light[disabled] { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; -} - -.button.is-light.is-inverted { - background-color: #363636; - color: whitesmoke; -} - -.button.is-light.is-inverted:hover { - background-color: #292929; -} - -.button.is-light.is-inverted[disabled] { - background-color: #363636; - border-color: transparent; - box-shadow: none; - color: whitesmoke; -} - -.button.is-light.is-loading:after { - border-color: transparent transparent #363636 #363636 !important; -} - -.button.is-light.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; -} - -.button.is-light.is-outlined:hover, .button.is-light.is-outlined:focus { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; -} - -.button.is-light.is-outlined.is-loading:after { - border-color: transparent transparent whitesmoke whitesmoke !important; -} - -.button.is-light.is-outlined[disabled] { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; -} - -.button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; -} - -.button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined:focus { - background-color: #363636; - color: whitesmoke; -} - -.button.is-light.is-inverted.is-outlined[disabled] { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; -} - -.button.is-dark { - background-color: #363636; - border-color: transparent; - color: whitesmoke; -} - -.button.is-dark:hover, .button.is-dark.is-hovered { - background-color: #2f2f2f; - border-color: transparent; - color: whitesmoke; -} - -.button.is-dark:focus, .button.is-dark.is-focused { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); - color: whitesmoke; -} - -.button.is-dark:active, .button.is-dark.is-active { - background-color: #292929; - border-color: transparent; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: whitesmoke; -} - -.button.is-dark[disabled] { - background-color: #363636; - border-color: transparent; - box-shadow: none; -} - -.button.is-dark.is-inverted { - background-color: whitesmoke; - color: #363636; -} - -.button.is-dark.is-inverted:hover { - background-color: #e8e8e8; -} - -.button.is-dark.is-inverted[disabled] { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; - color: #363636; -} - -.button.is-dark.is-loading:after { - border-color: transparent transparent whitesmoke whitesmoke !important; -} - -.button.is-dark.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; -} - -.button.is-dark.is-outlined:hover, .button.is-dark.is-outlined:focus { - background-color: #363636; - border-color: #363636; - color: whitesmoke; -} - -.button.is-dark.is-outlined.is-loading:after { - border-color: transparent transparent #363636 #363636 !important; -} - -.button.is-dark.is-outlined[disabled] { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; -} - -.button.is-dark.is-inverted.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; -} - -.button.is-dark.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined:focus { - background-color: whitesmoke; - color: #363636; -} - -.button.is-dark.is-inverted.is-outlined[disabled] { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; -} - -.button.is-primary { - background-color: #00d1b2; - border-color: transparent; - color: #fff; -} - -.button.is-primary:hover, .button.is-primary.is-hovered { - background-color: #00c4a7; - border-color: transparent; - color: #fff; -} - -.button.is-primary:focus, .button.is-primary.is-focused { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25); - color: #fff; -} - -.button.is-primary:active, .button.is-primary.is-active { - background-color: #00b89c; - border-color: transparent; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: #fff; -} - -.button.is-primary[disabled] { - background-color: #00d1b2; - border-color: transparent; - box-shadow: none; -} - -.button.is-primary.is-inverted { - background-color: #fff; - color: #00d1b2; -} - -.button.is-primary.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-primary.is-inverted[disabled] { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #00d1b2; -} - -.button.is-primary.is-loading:after { - border-color: transparent transparent #fff #fff !important; -} - -.button.is-primary.is-outlined { - background-color: transparent; - border-color: #00d1b2; - color: #00d1b2; -} - -.button.is-primary.is-outlined:hover, .button.is-primary.is-outlined:focus { - background-color: #00d1b2; - border-color: #00d1b2; - color: #fff; -} - -.button.is-primary.is-outlined.is-loading:after { - border-color: transparent transparent #00d1b2 #00d1b2 !important; -} - -.button.is-primary.is-outlined[disabled] { - background-color: transparent; - border-color: #00d1b2; - box-shadow: none; - color: #00d1b2; -} - -.button.is-primary.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; -} - -.button.is-primary.is-inverted.is-outlined:hover, .button.is-primary.is-inverted.is-outlined:focus { - background-color: #fff; - color: #00d1b2; -} - -.button.is-primary.is-inverted.is-outlined[disabled] { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; -} - -.button.is-info { - background-color: #3273dc; - border-color: transparent; - color: #fff; -} - -.button.is-info:hover, .button.is-info.is-hovered { - background-color: #276cda; - border-color: transparent; - color: #fff; -} - -.button.is-info:focus, .button.is-info.is-focused { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(50, 115, 220, 0.25); - color: #fff; -} - -.button.is-info:active, .button.is-info.is-active { - background-color: #2366d1; - border-color: transparent; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: #fff; -} - -.button.is-info[disabled] { - background-color: #3273dc; - border-color: transparent; - box-shadow: none; -} - -.button.is-info.is-inverted { - background-color: #fff; - color: #3273dc; -} - -.button.is-info.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-info.is-inverted[disabled] { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #3273dc; -} - -.button.is-info.is-loading:after { - border-color: transparent transparent #fff #fff !important; -} - -.button.is-info.is-outlined { - background-color: transparent; - border-color: #3273dc; - color: #3273dc; -} - -.button.is-info.is-outlined:hover, .button.is-info.is-outlined:focus { - background-color: #3273dc; - border-color: #3273dc; - color: #fff; -} - -.button.is-info.is-outlined.is-loading:after { - border-color: transparent transparent #3273dc #3273dc !important; -} - -.button.is-info.is-outlined[disabled] { - background-color: transparent; - border-color: #3273dc; - box-shadow: none; - color: #3273dc; -} - -.button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; -} - -.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined:focus { - background-color: #fff; - color: #3273dc; -} - -.button.is-info.is-inverted.is-outlined[disabled] { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; -} - -.button.is-success { - background-color: #23d160; - border-color: transparent; - color: #fff; -} - -.button.is-success:hover, .button.is-success.is-hovered { - background-color: #22c65b; - border-color: transparent; - color: #fff; -} - -.button.is-success:focus, .button.is-success.is-focused { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(35, 209, 96, 0.25); - color: #fff; -} - -.button.is-success:active, .button.is-success.is-active { - background-color: #20bc56; - border-color: transparent; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: #fff; -} - -.button.is-success[disabled] { - background-color: #23d160; - border-color: transparent; - box-shadow: none; -} - -.button.is-success.is-inverted { - background-color: #fff; - color: #23d160; -} - -.button.is-success.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-success.is-inverted[disabled] { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #23d160; -} - -.button.is-success.is-loading:after { - border-color: transparent transparent #fff #fff !important; -} - -.button.is-success.is-outlined { - background-color: transparent; - border-color: #23d160; - color: #23d160; -} - -.button.is-success.is-outlined:hover, .button.is-success.is-outlined:focus { - background-color: #23d160; - border-color: #23d160; - color: #fff; -} - -.button.is-success.is-outlined.is-loading:after { - border-color: transparent transparent #23d160 #23d160 !important; -} - -.button.is-success.is-outlined[disabled] { - background-color: transparent; - border-color: #23d160; - box-shadow: none; - color: #23d160; -} - -.button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; -} - -.button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined:focus { - background-color: #fff; - color: #23d160; -} - -.button.is-success.is-inverted.is-outlined[disabled] { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; -} - -.button.is-warning { - background-color: #ffdd57; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning:hover, .button.is-warning.is-hovered { - background-color: #ffdb4a; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning:focus, .button.is-warning.is-focused { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning:active, .button.is-warning.is-active { - background-color: #ffd83d; - border-color: transparent; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning[disabled] { - background-color: #ffdd57; - border-color: transparent; - box-shadow: none; -} - -.button.is-warning.is-inverted { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; -} - -.button.is-warning.is-inverted:hover { - background-color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning.is-inverted[disabled] { - background-color: rgba(0, 0, 0, 0.7); - border-color: transparent; - box-shadow: none; - color: #ffdd57; -} - -.button.is-warning.is-loading:after { - border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; -} - -.button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffdd57; - color: #ffdd57; -} - -.button.is-warning.is-outlined:hover, .button.is-warning.is-outlined:focus { - background-color: #ffdd57; - border-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning.is-outlined.is-loading:after { - border-color: transparent transparent #ffdd57 #ffdd57 !important; -} - -.button.is-warning.is-outlined[disabled] { - background-color: transparent; - border-color: #ffdd57; - box-shadow: none; - color: #ffdd57; -} - -.button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - color: rgba(0, 0, 0, 0.7); -} - -.button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined:focus { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; -} - -.button.is-warning.is-inverted.is-outlined[disabled] { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - box-shadow: none; - color: rgba(0, 0, 0, 0.7); -} - -.button.is-danger { - background-color: #ff3860; - border-color: transparent; - color: #fff; -} - -.button.is-danger:hover, .button.is-danger.is-hovered { - background-color: #ff2b56; - border-color: transparent; - color: #fff; -} - -.button.is-danger:focus, .button.is-danger.is-focused { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 56, 96, 0.25); - color: #fff; -} - -.button.is-danger:active, .button.is-danger.is-active { - background-color: #ff1f4b; - border-color: transparent; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); - color: #fff; -} - -.button.is-danger[disabled] { - background-color: #ff3860; - border-color: transparent; - box-shadow: none; -} - -.button.is-danger.is-inverted { - background-color: #fff; - color: #ff3860; -} - -.button.is-danger.is-inverted:hover { - background-color: #f2f2f2; -} - -.button.is-danger.is-inverted[disabled] { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #ff3860; -} - -.button.is-danger.is-loading:after { - border-color: transparent transparent #fff #fff !important; -} - -.button.is-danger.is-outlined { - background-color: transparent; - border-color: #ff3860; - color: #ff3860; -} - -.button.is-danger.is-outlined:hover, .button.is-danger.is-outlined:focus { - background-color: #ff3860; - border-color: #ff3860; - color: #fff; -} - -.button.is-danger.is-outlined.is-loading:after { - border-color: transparent transparent #ff3860 #ff3860 !important; -} - -.button.is-danger.is-outlined[disabled] { - background-color: transparent; - border-color: #ff3860; - box-shadow: none; - color: #ff3860; -} - -.button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; -} - -.button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined:focus { - background-color: #fff; - color: #ff3860; -} - -.button.is-danger.is-inverted.is-outlined[disabled] { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; -} - -.button.is-small { - border-radius: 2px; - font-size: 0.75rem; -} - -.button.is-medium { - font-size: 1.25rem; -} - -.button.is-large { - font-size: 1.5rem; -} - -.button[disabled] { - background-color: white; - border-color: #dbdbdb; - box-shadow: none; - opacity: 0.5; -} - -.button.is-fullwidth { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - width: 100%; -} - -.button.is-loading { - color: transparent !important; - pointer-events: none; -} - -.button.is-loading:after { - -webkit-animation: spinAround 500ms infinite linear; - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdbdb; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; - position: absolute; - left: calc(50% - (1em / 2)); - top: calc(50% - (1em / 2)); - position: absolute !important; -} - -button.button, -input[type="submit"].button { - line-height: 1; - padding-bottom: 0.4em; - padding-top: 0.35em; -} - -.content { - color: #4a4a4a; -} - -.content:not(:last-child) { - margin-bottom: 1.5rem; -} - -.content li + li { - margin-top: 0.25em; -} - -.content p:not(:last-child), -.content dl:not(:last-child), -.content ol:not(:last-child), -.content ul:not(:last-child), -.content blockquote:not(:last-child), -.content pre:not(:last-child), -.content table:not(:last-child) { - margin-bottom: 1em; -} - -.content h1, -.content h2, -.content h3, -.content h4, -.content h5, -.content h6 { - color: #363636; - font-weight: 400; - line-height: 1.125; -} - -.content h1 { - font-size: 2em; - margin-bottom: 0.5em; -} - -.content h1:not(:first-child) { - margin-top: 1em; -} - -.content h2 { - font-size: 1.75em; - margin-bottom: 0.5714em; -} - -.content h2:not(:first-child) { - margin-top: 1.1428em; -} - -.content h3 { - font-size: 1.5em; - margin-bottom: 0.6666em; -} - -.content h3:not(:first-child) { - margin-top: 1.3333em; -} - -.content h4 { - font-size: 1.25em; - margin-bottom: 0.8em; -} - -.content h5 { - font-size: 1.125em; - margin-bottom: 0.8888em; -} - -.content h6 { - font-size: 1em; - margin-bottom: 1em; -} - -.content blockquote { - background-color: whitesmoke; - border-left: 5px solid #dbdbdb; - padding: 1.25em 1.5em; -} - -.content ol { - list-style: decimal outside; - margin-left: 2em; - margin-right: 2em; - margin-top: 1em; -} - -.content ul { - list-style: disc outside; - margin-left: 2em; - margin-right: 2em; - margin-top: 1em; -} - -.content ul ul { - list-style-type: circle; - margin-top: 0.5em; -} - -.content ul ul ul { - list-style-type: square; -} - -.content dd { - margin-left: 2em; -} - -.content pre { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - padding: 1.25em 1.5em; - white-space: pre; - word-wrap: normal; -} - -.content table { - width: 100%; -} - -.content table td, -.content table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; -} - -.content table th { - color: #363636; - text-align: left; -} - -.content table tr:hover { - background-color: whitesmoke; -} - -.content table thead td, -.content table thead th { - border-width: 0 0 2px; - color: #363636; -} - -.content table tfoot td, -.content table tfoot th { - border-width: 2px 0 0; - color: #363636; -} - -.content table tbody tr:last-child td, -.content table tbody tr:last-child th { - border-bottom-width: 0; -} - -.content.is-small { - font-size: 0.75rem; -} - -.content.is-medium { - font-size: 1.25rem; -} - -.content.is-large { - font-size: 1.5rem; -} - -.input, -.textarea { - -moz-appearance: none; - -webkit-appearance: none; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - border: 1px solid transparent; - border-radius: 3px; - box-shadow: none; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - font-size: 1rem; - height: 2.25em; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; - background-color: white; - border-color: #dbdbdb; - color: #363636; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - max-width: 100%; - width: 100%; -} - -.input:focus, .input.is-focused, .input:active, .input.is-active, -.textarea:focus, -.textarea.is-focused, -.textarea:active, -.textarea.is-active { - outline: none; -} - -.input[disabled], -.textarea[disabled] { - cursor: not-allowed; -} - -.input:hover, .input.is-hovered, -.textarea:hover, -.textarea.is-hovered { - border-color: #b5b5b5; -} - -.input:focus, .input.is-focused, .input:active, .input.is-active, -.textarea:focus, -.textarea.is-focused, -.textarea:active, -.textarea.is-active { - border-color: #00d1b2; -} - -.input[disabled], -.textarea[disabled] { - background-color: whitesmoke; - border-color: whitesmoke; - box-shadow: none; - color: #7a7a7a; -} - -.input[disabled]::-moz-placeholder, -.textarea[disabled]::-moz-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.input[disabled]::-webkit-input-placeholder, -.textarea[disabled]::-webkit-input-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.input[disabled]:-moz-placeholder, -.textarea[disabled]:-moz-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.input[disabled]:-ms-input-placeholder, -.textarea[disabled]:-ms-input-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.input[type="search"], -.textarea[type="search"] { - border-radius: 290486px; -} - -.input.is-white, -.textarea.is-white { - border-color: white; -} - -.input.is-black, -.textarea.is-black { - border-color: #0a0a0a; -} - -.input.is-light, -.textarea.is-light { - border-color: whitesmoke; -} - -.input.is-dark, -.textarea.is-dark { - border-color: #363636; -} - -.input.is-primary, -.textarea.is-primary { - border-color: #00d1b2; -} - -.input.is-info, -.textarea.is-info { - border-color: #3273dc; -} - -.input.is-success, -.textarea.is-success { - border-color: #23d160; -} - -.input.is-warning, -.textarea.is-warning { - border-color: #ffdd57; -} - -.input.is-danger, -.textarea.is-danger { - border-color: #ff3860; -} - -.input.is-small, -.textarea.is-small { - border-radius: 2px; - font-size: 0.75rem; -} - -.input.is-medium, -.textarea.is-medium { - font-size: 1.25rem; -} - -.input.is-large, -.textarea.is-large { - font-size: 1.5rem; -} - -.input.is-fullwidth, -.textarea.is-fullwidth { - display: block; - width: 100%; -} - -.input.is-inline, -.textarea.is-inline { - display: inline; - width: auto; -} - -.textarea { - display: block; - max-height: 600px; - max-width: 100%; - min-height: 120px; - min-width: 100%; - padding: 0.625em; - resize: vertical; -} - -.checkbox, -.radio { - cursor: pointer; - display: inline-block; - line-height: 1.25; - position: relative; -} - -.checkbox input, -.radio input { - cursor: pointer; -} - -.checkbox:hover, -.radio:hover { - color: #363636; -} - -.checkbox[disabled], -.radio[disabled] { - color: #7a7a7a; - cursor: not-allowed; -} - -.radio + .radio { - margin-left: 0.5em; -} - -.select { - display: inline-block; - height: 2.25em; - position: relative; - vertical-align: top; -} - -.select:after { - border: 1px solid #00d1b2; - border-right: 0; - border-top: 0; - content: " "; - display: block; - height: 0.5em; - pointer-events: none; - position: absolute; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - width: 0.5em; - margin-top: -0.375em; - right: 1.125em; - top: 50%; - z-index: 4; -} - -.select select { - -moz-appearance: none; - -webkit-appearance: none; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - border: 1px solid transparent; - border-radius: 3px; - box-shadow: none; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - font-size: 1rem; - height: 2.25em; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; - background-color: white; - border-color: #dbdbdb; - color: #363636; - cursor: pointer; - display: block; - font-size: 1em; - outline: none; - padding-right: 2.5em; -} - -.select select:focus, .select select.is-focused, .select select:active, .select select.is-active { - outline: none; -} - -.select select[disabled] { - cursor: not-allowed; -} - -.select select:hover, .select select.is-hovered { - border-color: #b5b5b5; -} - -.select select:focus, .select select.is-focused, .select select:active, .select select.is-active { - border-color: #00d1b2; -} - -.select select[disabled] { - background-color: whitesmoke; - border-color: whitesmoke; - box-shadow: none; - color: #7a7a7a; -} - -.select select[disabled]::-moz-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.select select[disabled]::-webkit-input-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.select select[disabled]:-moz-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.select select[disabled]:-ms-input-placeholder { - color: rgba(54, 54, 54, 0.3); -} - -.select select:hover { - border-color: #b5b5b5; -} - -.select select::-ms-expand { - display: none; -} - -.select select[disabled]:hover { - border-color: whitesmoke; -} - -.select:hover:after { - border-color: #363636; -} - -.select.is-white select { - border-color: white; -} - -.select.is-black select { - border-color: #0a0a0a; -} - -.select.is-light select { - border-color: whitesmoke; -} - -.select.is-dark select { - border-color: #363636; -} - -.select.is-primary select { - border-color: #00d1b2; -} - -.select.is-info select { - border-color: #3273dc; -} - -.select.is-success select { - border-color: #23d160; -} - -.select.is-warning select { - border-color: #ffdd57; -} - -.select.is-danger select { - border-color: #ff3860; -} - -.select.is-small { - border-radius: 2px; - font-size: 0.75rem; -} - -.select.is-medium { - font-size: 1.25rem; -} - -.select.is-large { - font-size: 1.5rem; -} - -.select.is-disabled:after { - border-color: #7a7a7a; -} - -.select.is-fullwidth { - width: 100%; -} - -.select.is-fullwidth select { - width: 100%; -} - -.select.is-loading:after { - -webkit-animation: spinAround 500ms infinite linear; - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdbdb; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; - margin-top: 0; - position: absolute; - right: 0.625em; - top: 0.625em; - -webkit-transform: none; - transform: none; -} - -.label { - color: #363636; - display: block; - font-size: 1rem; - font-weight: 700; -} - -.label:not(:last-child) { - margin-bottom: 0.5em; -} - -.label.is-small { - font-size: 0.75rem; -} - -.label.is-medium { - font-size: 1.25rem; -} - -.label.is-large { - font-size: 1.5rem; -} - -.help { - display: block; - font-size: 0.75rem; - margin-top: 0.25rem; -} - -.help.is-white { - color: white; -} - -.help.is-black { - color: #0a0a0a; -} - -.help.is-light { - color: whitesmoke; -} - -.help.is-dark { - color: #363636; -} - -.help.is-primary { - color: #00d1b2; -} - -.help.is-info { - color: #3273dc; -} - -.help.is-success { - color: #23d160; -} - -.help.is-warning { - color: #ffdd57; -} - -.help.is-danger { - color: #ff3860; -} - -.field:not(:last-child) { - margin-bottom: 0.75rem; -} - -.field.has-addons { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; -} - -.field.has-addons .control { - margin-right: -1px; -} - -.field.has-addons .control:first-child .button, -.field.has-addons .control:first-child .input, -.field.has-addons .control:first-child .select select { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.field.has-addons .control:last-child .button, -.field.has-addons .control:last-child .input, -.field.has-addons .control:last-child .select select { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -.field.has-addons .control .button, -.field.has-addons .control .input, -.field.has-addons .control .select select { - border-radius: 0; -} - -.field.has-addons .control .button:hover, .field.has-addons .control .button.is-hovered, -.field.has-addons .control .input:hover, -.field.has-addons .control .input.is-hovered, -.field.has-addons .control .select select:hover, -.field.has-addons .control .select select.is-hovered { - z-index: 2; -} - -.field.has-addons .control .button:focus, .field.has-addons .control .button.is-focused, .field.has-addons .control .button:active, .field.has-addons .control .button.is-active, -.field.has-addons .control .input:focus, -.field.has-addons .control .input.is-focused, -.field.has-addons .control .input:active, -.field.has-addons .control .input.is-active, -.field.has-addons .control .select select:focus, -.field.has-addons .control .select select.is-focused, -.field.has-addons .control .select select:active, -.field.has-addons .control .select select.is-active { - z-index: 3; -} - -.field.has-addons .control .button:focus:hover, .field.has-addons .control .button.is-focused:hover, .field.has-addons .control .button:active:hover, .field.has-addons .control .button.is-active:hover, -.field.has-addons .control .input:focus:hover, -.field.has-addons .control .input.is-focused:hover, -.field.has-addons .control .input:active:hover, -.field.has-addons .control .input.is-active:hover, -.field.has-addons .control .select select:focus:hover, -.field.has-addons .control .select select.is-focused:hover, -.field.has-addons .control .select select:active:hover, -.field.has-addons .control .select select.is-active:hover { - z-index: 4; -} - -.field.has-addons .control.is-expanded { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; -} - -.field.has-addons.has-addons-centered { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; -} - -.field.has-addons.has-addons-right { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; -} - -.field.has-addons.has-addons-fullwidth .control { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; -} - -.field.is-grouped { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; -} - -.field.is-grouped > .control { - -ms-flex-negative: 0; - flex-shrink: 0; -} - -.field.is-grouped > .control:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; -} - -.field.is-grouped > .control.is-expanded { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; -} - -.field.is-grouped.is-grouped-centered { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; -} - -.field.is-grouped.is-grouped-right { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; -} - -@media screen and (min-width: 769px), print { - .field.is-horizontal { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - } -} - -.field-label .label { - font-size: inherit; -} - -@media screen and (max-width: 768px) { - .field-label { - margin-bottom: 0.5rem; - } -} - -@media screen and (min-width: 769px), print { - .field-label { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; - margin-right: 1.5rem; - text-align: right; - } - .field-label.is-small { - font-size: 0.75rem; - padding-top: 0.375em; - } - .field-label.is-normal { - padding-top: 0.375em; - } - .field-label.is-medium { - font-size: 1.25rem; - padding-top: 0.375em; - } - .field-label.is-large { - font-size: 1.5rem; - padding-top: 0.375em; - } -} - -@media screen and (min-width: 769px), print { - .field-body { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 5; - -ms-flex-positive: 5; - flex-grow: 5; - -ms-flex-negative: 1; - flex-shrink: 1; - } - .field-body .field { - -ms-flex-negative: 1; - flex-shrink: 1; - } - .field-body .field:not(.is-narrow) { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - } - .field-body .field:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; - } -} - -.control { - font-size: 1rem; - position: relative; - text-align: left; -} - -.control.has-icon .icon { - color: #dbdbdb; - height: 2.25em; - pointer-events: none; - position: absolute; - top: 0; - width: 2.25em; - z-index: 4; -} - -.control.has-icon .input:focus + .icon { - color: #7a7a7a; -} - -.control.has-icon .input.is-small + .icon { - font-size: 0.75rem; -} - -.control.has-icon .input.is-medium + .icon { - font-size: 1.25rem; -} - -.control.has-icon .input.is-large + .icon { - font-size: 1.5rem; -} - -.control.has-icon:not(.has-icon-right) .icon { - left: 0; -} - -.control.has-icon:not(.has-icon-right) .input { - padding-left: 2.25em; -} - -.control.has-icon.has-icon-right .icon { - right: 0; -} - -.control.has-icon.has-icon-right .input { - padding-right: 2.25em; -} - -.control.has-icons-left .input:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon { - color: #7a7a7a; -} - -.control.has-icons-left .input.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon { - font-size: 0.75rem; -} - -.control.has-icons-left .input.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon { - font-size: 1.25rem; -} - -.control.has-icons-left .input.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon { - font-size: 1.5rem; -} - -.control.has-icons-left .icon, .control.has-icons-right .icon { - color: #dbdbdb; - height: 2.25em; - pointer-events: none; - position: absolute; - top: 0; - width: 2.25em; - z-index: 4; -} - -.control.has-icons-left .input { - padding-left: 2.25em; -} - -.control.has-icons-left .icon.is-left { - left: 0; -} - -.control.has-icons-right .input { - padding-right: 2.25em; -} - -.control.has-icons-right .icon.is-right { - right: 0; -} - -.control.is-loading:after { - -webkit-animation: spinAround 500ms infinite linear; - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdbdb; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; - position: absolute !important; - right: 0.625em; - top: 0.625em; -} - -.icon { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - height: 1.5rem; - width: 1.5rem; -} - -.icon .fa { - font-size: 21px; -} - -.icon.is-small { - height: 1rem; - width: 1rem; -} - -.icon.is-small .fa { - font-size: 14px; -} - -.icon.is-medium { - height: 2rem; - width: 2rem; -} - -.icon.is-medium .fa { - font-size: 28px; -} - -.icon.is-large { - height: 3rem; - width: 3rem; -} - -.icon.is-large .fa { - font-size: 42px; -} - -.image { - display: block; - position: relative; -} - -.image img { - display: block; - height: auto; - width: 100%; -} - -.image.is-square img, .image.is-1by1 img, .image.is-4by3 img, .image.is-3by2 img, .image.is-16by9 img, .image.is-2by1 img { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; - height: 100%; - width: 100%; -} - -.image.is-square, .image.is-1by1 { - padding-top: 100%; -} - -.image.is-4by3 { - padding-top: 75%; -} - -.image.is-3by2 { - padding-top: 66.6666%; -} - -.image.is-16by9 { - padding-top: 56.25%; -} - -.image.is-2by1 { - padding-top: 50%; -} - -.image.is-16x16 { - height: 16px; - width: 16px; -} - -.image.is-24x24 { - height: 24px; - width: 24px; -} - -.image.is-32x32 { - height: 32px; - width: 32px; -} - -.image.is-48x48 { - height: 48px; - width: 48px; -} - -.image.is-64x64 { - height: 64px; - width: 64px; -} - -.image.is-96x96 { - height: 96px; - width: 96px; -} - -.image.is-128x128 { - height: 128px; - width: 128px; -} - -.notification { - background-color: whitesmoke; - border-radius: 3px; - padding: 1.25rem 2.5rem 1.25rem 1.5rem; - position: relative; -} - -.notification:not(:last-child) { - margin-bottom: 1.5rem; -} - -.notification a:not(.button) { - color: currentColor; - text-decoration: underline; -} - -.notification code, -.notification pre { - background: white; -} - -.notification pre code { - background: transparent; -} - -.notification > .delete { - position: absolute; - right: 0.5em; - top: 0.5em; -} - -.notification .title, -.notification .subtitle, -.notification .content { - color: inherit; -} - -.notification.is-white { - background-color: white; - color: #0a0a0a; -} - -.notification.is-black { - background-color: #0a0a0a; - color: white; -} - -.notification.is-light { - background-color: whitesmoke; - color: #363636; -} - -.notification.is-dark { - background-color: #363636; - color: whitesmoke; -} - -.notification.is-primary { - background-color: #00d1b2; - color: #fff; -} - -.notification.is-info { - background-color: #3273dc; - color: #fff; -} - -.notification.is-success { - background-color: #23d160; - color: #fff; -} - -.notification.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.notification.is-danger { - background-color: #ff3860; - color: #fff; -} - -.progress { - -moz-appearance: none; - -webkit-appearance: none; - border: none; - border-radius: 290486px; - display: block; - height: 1rem; - overflow: hidden; - padding: 0; - width: 100%; -} - -.progress:not(:last-child) { - margin-bottom: 1.5rem; -} - -.progress::-webkit-progress-bar { - background-color: #dbdbdb; -} - -.progress::-webkit-progress-value { - background-color: #4a4a4a; -} - -.progress::-moz-progress-bar { - background-color: #4a4a4a; -} - -.progress.is-white::-webkit-progress-value { - background-color: white; -} - -.progress.is-white::-moz-progress-bar { - background-color: white; -} - -.progress.is-black::-webkit-progress-value { - background-color: #0a0a0a; -} - -.progress.is-black::-moz-progress-bar { - background-color: #0a0a0a; -} - -.progress.is-light::-webkit-progress-value { - background-color: whitesmoke; -} - -.progress.is-light::-moz-progress-bar { - background-color: whitesmoke; -} - -.progress.is-dark::-webkit-progress-value { - background-color: #363636; -} - -.progress.is-dark::-moz-progress-bar { - background-color: #363636; -} - -.progress.is-primary::-webkit-progress-value { - background-color: #00d1b2; -} - -.progress.is-primary::-moz-progress-bar { - background-color: #00d1b2; -} - -.progress.is-info::-webkit-progress-value { - background-color: #3273dc; -} - -.progress.is-info::-moz-progress-bar { - background-color: #3273dc; -} - -.progress.is-success::-webkit-progress-value { - background-color: #23d160; -} - -.progress.is-success::-moz-progress-bar { - background-color: #23d160; -} - -.progress.is-warning::-webkit-progress-value { - background-color: #ffdd57; -} - -.progress.is-warning::-moz-progress-bar { - background-color: #ffdd57; -} - -.progress.is-danger::-webkit-progress-value { - background-color: #ff3860; -} - -.progress.is-danger::-moz-progress-bar { - background-color: #ff3860; -} - -.progress.is-small { - height: 0.75rem; -} - -.progress.is-medium { - height: 1.25rem; -} - -.progress.is-large { - height: 1.5rem; -} - -.table { - background-color: white; - color: #363636; - margin-bottom: 1.5rem; - width: 100%; -} - -.table td, -.table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; -} - -.table td.is-narrow, -.table th.is-narrow { - white-space: nowrap; - width: 1%; -} - -.table th { - color: #363636; - text-align: left; -} - -.table tr:hover { - background-color: #fafafa; -} - -.table tr.is-selected { - background-color: #00d1b2; - color: #fff; -} - -.table tr.is-selected a, -.table tr.is-selected strong { - color: currentColor; -} - -.table tr.is-selected td, -.table tr.is-selected th { - border-color: #fff; - color: currentColor; -} - -.table thead td, -.table thead th { - border-width: 0 0 2px; - color: #7a7a7a; -} - -.table tfoot td, -.table tfoot th { - border-width: 2px 0 0; - color: #7a7a7a; -} - -.table tbody tr:last-child td, -.table tbody tr:last-child th { - border-bottom-width: 0; -} - -.table.is-bordered td, -.table.is-bordered th { - border-width: 1px; -} - -.table.is-bordered tr:last-child td, -.table.is-bordered tr:last-child th { - border-bottom-width: 1px; -} - -.table.is-narrow td, -.table.is-narrow th { - padding: 0.25em 0.5em; -} - -.table.is-striped tbody tr:nth-child(even) { - background-color: #fafafa; -} - -.table.is-striped tbody tr:nth-child(even):hover { - background-color: whitesmoke; -} - -.tag { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background-color: whitesmoke; - border-radius: 290486px; - color: #4a4a4a; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - font-size: 0.75rem; - height: 2em; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - line-height: 1.5; - padding-left: 0.875em; - padding-right: 0.875em; - white-space: nowrap; -} - -.tag .delete { - margin-left: 0.25em; - margin-right: -0.375em; -} - -.tag.is-white { - background-color: white; - color: #0a0a0a; -} - -.tag.is-black { - background-color: #0a0a0a; - color: white; -} - -.tag.is-light { - background-color: whitesmoke; - color: #363636; -} - -.tag.is-dark { - background-color: #363636; - color: whitesmoke; -} - -.tag.is-primary { - background-color: #00d1b2; - color: #fff; -} - -.tag.is-info { - background-color: #3273dc; - color: #fff; -} - -.tag.is-success { - background-color: #23d160; - color: #fff; -} - -.tag.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.tag.is-danger { - background-color: #ff3860; - color: #fff; -} - -.tag.is-medium { - font-size: 1rem; -} - -.tag.is-large { - font-size: 1.25rem; -} - -.title, -.subtitle { - word-break: break-word; -} - -.title:not(:last-child), -.subtitle:not(:last-child) { - margin-bottom: 1.5rem; -} - -.title em, -.title span, -.subtitle em, -.subtitle span { - font-weight: 300; -} - -.title strong, -.subtitle strong { - font-weight: 500; -} - -.title .tag, -.subtitle .tag { - vertical-align: middle; -} - -.title { - color: #363636; - font-size: 2rem; - font-weight: 300; - line-height: 1.125; -} - -.title strong { - color: inherit; -} - -.title + .highlight { - margin-top: -0.75rem; -} - -.title:not(.is-spaced) + .subtitle { - margin-top: -1.5rem; -} - -.title.is-1 { - font-size: 3rem; -} - -.title.is-2 { - font-size: 2.5rem; -} - -.title.is-3 { - font-size: 2rem; -} - -.title.is-4 { - font-size: 1.5rem; -} - -.title.is-5 { - font-size: 1.25rem; -} - -.title.is-6 { - font-size: 1rem; -} - -.subtitle { - color: #4a4a4a; - font-size: 1.25rem; - font-weight: 300; - line-height: 1.25; -} - -.subtitle strong { - color: #363636; -} - -.subtitle:not(.is-spaced) + .title { - margin-top: -1.5rem; -} - -.subtitle.is-1 { - font-size: 3rem; -} - -.subtitle.is-2 { - font-size: 2.5rem; -} - -.subtitle.is-3 { - font-size: 2rem; -} - -.subtitle.is-4 { - font-size: 1.5rem; -} - -.subtitle.is-5 { - font-size: 1.25rem; -} - -.subtitle.is-6 { - font-size: 1rem; -} - -.block:not(:last-child) { - margin-bottom: 1.5rem; -} - -.container { - position: relative; -} - -@media screen and (min-width: 1000px) { - .container { - margin: 0 auto; - max-width: 960px; - width: 960px; - } - .container.is-fluid { - margin: 0 20px; - max-width: none; - width: auto; - } -} - -@media screen and (min-width: 1192px) { - .container { - max-width: 1152px; - width: 1152px; - } -} - -@media screen and (min-width: 1384px) { - .container { - max-width: 1344px; - width: 1344px; - } -} - -.delete { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -moz-appearance: none; - -webkit-appearance: none; - background-color: rgba(10, 10, 10, 0.2); - border: none; - border-radius: 290486px; - cursor: pointer; - display: inline-block; - font-size: 1rem; - height: 20px; - outline: none; - position: relative; - vertical-align: top; - width: 20px; -} - -.delete:before, .delete:after { - background-color: white; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform: translateX(-50%) translateY(-50%) rotate(45deg); - -webkit-transform-origin: center center; - transform-origin: center center; -} - -.delete:before { - height: 2px; - width: 50%; -} - -.delete:after { - height: 50%; - width: 2px; -} - -.delete:hover, .delete:focus { - background-color: rgba(10, 10, 10, 0.3); -} - -.delete:active { - background-color: rgba(10, 10, 10, 0.4); -} - -.delete.is-small { - height: 16px; - width: 16px; -} - -.delete.is-medium { - height: 24px; - width: 24px; -} - -.delete.is-large { - height: 32px; - width: 32px; -} - -.fa { - font-size: 21px; - text-align: center; - vertical-align: top; -} - -.heading { - display: block; - font-size: 11px; - letter-spacing: 1px; - margin-bottom: 5px; - text-transform: uppercase; -} - -.highlight { - font-weight: 400; - max-width: 100%; - overflow: hidden; - padding: 0; -} - -.highlight:not(:last-child) { - margin-bottom: 1.5rem; -} - -.highlight pre { - overflow: auto; - max-width: 100%; -} - -.loader { - -webkit-animation: spinAround 500ms infinite linear; - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdbdb; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; -} - -.number { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background-color: whitesmoke; - border-radius: 290486px; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - font-size: 1.25rem; - height: 2em; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - margin-right: 1.5rem; - min-width: 2.5em; - padding: 0.25rem 0.5rem; - text-align: center; - vertical-align: top; -} - -.card-header { - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} - -.card-header-title { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - color: #363636; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - font-weight: 700; - padding: 0.75rem; -} - -.card-header-icon { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - cursor: pointer; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0.75rem; -} - -.card-image { - display: block; - position: relative; -} - -.card-content { - padding: 1.5rem; -} - -.card-footer { - border-top: 1px solid #dbdbdb; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} - -.card-footer-item { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0.75rem; -} - -.card-footer-item:not(:last-child) { - border-right: 1px solid #dbdbdb; -} - -.card { - background-color: white; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #4a4a4a; - max-width: 100%; - position: relative; -} - -.card .media:not(:last-child) { - margin-bottom: 0.75rem; -} - -.level-item { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-preferred-size: auto; - flex-basis: auto; - -webkit-box-flex: 0; - -ms-flex-positive: 0; - flex-grow: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; -} - -.level-item .title, -.level-item .subtitle { - margin-bottom: 0; -} - -@media screen and (max-width: 768px) { - .level-item:not(:last-child) { - margin-bottom: 0.75rem; - } -} - -.level-left, -.level-right { - -ms-flex-preferred-size: auto; - flex-basis: auto; - -webkit-box-flex: 0; - -ms-flex-positive: 0; - flex-grow: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} - -.level-left .level-item:not(:last-child), -.level-right .level-item:not(:last-child) { - margin-right: 0.75rem; -} - -.level-left .level-item.is-flexible, -.level-right .level-item.is-flexible { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} - -.level-left { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; -} - -@media screen and (max-width: 768px) { - .level-left + .level-right { - margin-top: 1.5rem; - } -} - -@media screen and (min-width: 769px), print { - .level-left { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - } -} - -.level-right { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; -} - -@media screen and (min-width: 769px), print { - .level-right { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - } -} - -.level { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; -} - -.level:not(:last-child) { - margin-bottom: 1.5rem; -} - -.level code { - border-radius: 3px; -} - -.level img { - display: inline-block; - vertical-align: top; -} - -.level.is-mobile { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} - -.level.is-mobile .level-left, -.level.is-mobile .level-right { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} - -.level.is-mobile .level-left + .level-right { - margin-top: 0; -} - -.level.is-mobile .level-item:not(:last-child) { - margin-bottom: 0; -} - -.level.is-mobile .level-item:not(.is-narrow) { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} - -@media screen and (min-width: 769px), print { - .level { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - } - .level > .level-item:not(.is-narrow) { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - } -} - -.media-left, -.media-right { - -ms-flex-preferred-size: auto; - flex-basis: auto; - -webkit-box-flex: 0; - -ms-flex-positive: 0; - flex-grow: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} - -.media-left { - margin-right: 1rem; -} - -.media-right { - margin-left: 1rem; -} - -.media-content { - -ms-flex-preferred-size: auto; - flex-basis: auto; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; - text-align: left; -} - -.media { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - text-align: left; -} - -.media .content:not(:last-child) { - margin-bottom: 0.75rem; -} - -.media .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - display: -webkit-box; - display: -ms-flexbox; - display: flex; - padding-top: 0.75rem; -} - -.media .media .content:not(:last-child), -.media .media .control:not(:last-child) { - margin-bottom: 0.5rem; -} - -.media .media .media { - padding-top: 0.5rem; -} - -.media .media .media + .media { - margin-top: 0.5rem; -} - -.media + .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - margin-top: 1rem; - padding-top: 1rem; -} - -.media.is-large + .media { - margin-top: 1.5rem; - padding-top: 1.5rem; -} - -.menu { - font-size: 1rem; -} - -.menu-list { - line-height: 1.25; -} - -.menu-list a { - border-radius: 2px; - color: #4a4a4a; - display: block; - padding: 0.5em 0.75em; -} - -.menu-list a:hover { - background-color: whitesmoke; - color: #00d1b2; -} - -.menu-list a.is-active { - background-color: #00d1b2; - color: #fff; -} - -.menu-list li ul { - border-left: 1px solid #dbdbdb; - margin: 0.75em; - padding-left: 0.75em; -} - -.menu-label { - color: #7a7a7a; - font-size: 0.8em; - letter-spacing: 0.1em; - text-transform: uppercase; -} - -.menu-label:not(:first-child) { - margin-top: 1em; -} - -.menu-label:not(:last-child) { - margin-bottom: 1em; -} - -.message { - background-color: whitesmoke; - border-radius: 3px; - font-size: 1rem; -} - -.message:not(:last-child) { - margin-bottom: 1.5rem; -} - -.message.is-white { - background-color: white; -} - -.message.is-white .message-header { - background-color: white; - color: #0a0a0a; -} - -.message.is-white .message-body { - border-color: white; - color: #4d4d4d; -} - -.message.is-black { - background-color: #fafafa; -} - -.message.is-black .message-header { - background-color: #0a0a0a; - color: white; -} - -.message.is-black .message-body { - border-color: #0a0a0a; - color: #090909; -} - -.message.is-light { - background-color: #fafafa; -} - -.message.is-light .message-header { - background-color: whitesmoke; - color: #363636; -} - -.message.is-light .message-body { - border-color: whitesmoke; - color: #505050; -} - -.message.is-dark { - background-color: #fafafa; -} - -.message.is-dark .message-header { - background-color: #363636; - color: whitesmoke; -} - -.message.is-dark .message-body { - border-color: #363636; - color: #2a2a2a; -} - -.message.is-primary { - background-color: #f5fffd; -} - -.message.is-primary .message-header { - background-color: #00d1b2; - color: #fff; -} - -.message.is-primary .message-body { - border-color: #00d1b2; - color: #021310; -} - -.message.is-info { - background-color: #f6f9fe; -} - -.message.is-info .message-header { - background-color: #3273dc; - color: #fff; -} - -.message.is-info .message-body { - border-color: #3273dc; - color: #22509a; -} - -.message.is-success { - background-color: #f6fef9; -} - -.message.is-success .message-header { - background-color: #23d160; - color: #fff; -} - -.message.is-success .message-body { - border-color: #23d160; - color: #0e301a; -} - -.message.is-warning { - background-color: #fffdf5; -} - -.message.is-warning .message-header { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.message.is-warning .message-body { - border-color: #ffdd57; - color: #3b3108; -} - -.message.is-danger { - background-color: #fff5f7; -} - -.message.is-danger .message-header { - background-color: #ff3860; - color: #fff; -} - -.message.is-danger .message-body { - border-color: #ff3860; - color: #cd0930; -} - -.message-header { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background-color: #4a4a4a; - border-radius: 3px 3px 0 0; - color: #fff; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - line-height: 1.25; - padding: 0.5em 0.75em; - position: relative; -} - -.message-header a, -.message-header strong { - color: inherit; -} - -.message-header a { - text-decoration: underline; -} - -.message-header .delete { - -webkit-box-flex: 0; - -ms-flex-positive: 0; - flex-grow: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - margin-left: 0.75em; -} - -.message-header + .message-body { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-top: none; -} - -.message-body { - border: 1px solid #dbdbdb; - border-radius: 3px; - color: #4a4a4a; - padding: 1em 1.25em; -} - -.message-body a, -.message-body strong { - color: inherit; -} - -.message-body a { - text-decoration: underline; -} - -.message-body code, -.message-body pre { - background: white; -} - -.message-body pre code { - background: transparent; -} - -.modal-background { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; - background-color: rgba(10, 10, 10, 0.86); -} - -.modal-content, -.modal-card { - margin: 0 20px; - max-height: calc(100vh - 160px); - overflow: auto; - position: relative; - width: 100%; -} - -@media screen and (min-width: 769px), print { - .modal-content, - .modal-card { - margin: 0 auto; - max-height: calc(100vh - 40px); - width: 640px; - } -} - -.modal-close { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -moz-appearance: none; - -webkit-appearance: none; - background-color: rgba(10, 10, 10, 0.2); - border: none; - border-radius: 290486px; - cursor: pointer; - display: inline-block; - font-size: 1rem; - height: 20px; - outline: none; - position: relative; - vertical-align: top; - width: 20px; - background: none; - height: 40px; - position: fixed; - right: 20px; - top: 20px; - width: 40px; -} - -.modal-close:before, .modal-close:after { - background-color: white; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform: translateX(-50%) translateY(-50%) rotate(45deg); - -webkit-transform-origin: center center; - transform-origin: center center; -} - -.modal-close:before { - height: 2px; - width: 50%; -} - -.modal-close:after { - height: 50%; - width: 2px; -} - -.modal-close:hover, .modal-close:focus { - background-color: rgba(10, 10, 10, 0.3); -} - -.modal-close:active { - background-color: rgba(10, 10, 10, 0.4); -} - -.modal-close.is-small { - height: 16px; - width: 16px; -} - -.modal-close.is-medium { - height: 24px; - width: 24px; -} - -.modal-close.is-large { - height: 32px; - width: 32px; -} - -.modal-card { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - max-height: calc(100vh - 40px); - overflow: hidden; -} - -.modal-card-head, -.modal-card-foot { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background-color: whitesmoke; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - padding: 20px; - position: relative; -} - -.modal-card-head { - border-bottom: 1px solid #dbdbdb; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -.modal-card-title { - color: #363636; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; - font-size: 1.5rem; - line-height: 1; -} - -.modal-card-foot { - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; - border-top: 1px solid #dbdbdb; -} - -.modal-card-foot .button:not(:last-child) { - margin-right: 10px; -} - -.modal-card-body { - -webkit-overflow-scrolling: touch; - background-color: white; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; - overflow: auto; - padding: 20px; -} - -.modal { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: none; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - overflow: hidden; - position: fixed; - z-index: 20; -} - -.modal.is-active { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} - -.nav-toggle { - cursor: pointer; - display: block; - height: 3.25rem; - position: relative; - width: 3.25rem; -} - -.nav-toggle span { - background-color: #4a4a4a; - display: block; - height: 1px; - left: 50%; - margin-left: -7px; - position: absolute; - top: 50%; - -webkit-transition: none 86ms ease-out; - transition: none 86ms ease-out; - -webkit-transition-property: background, left, opacity, -webkit-transform; - transition-property: background, left, opacity, -webkit-transform; - transition-property: background, left, opacity, transform; - transition-property: background, left, opacity, transform, -webkit-transform; - width: 15px; -} - -.nav-toggle span:nth-child(1) { - margin-top: -6px; -} - -.nav-toggle span:nth-child(2) { - margin-top: -1px; -} - -.nav-toggle span:nth-child(3) { - margin-top: 4px; -} - -.nav-toggle:hover { - background-color: whitesmoke; -} - -.nav-toggle.is-active span { - background-color: #00d1b2; -} - -.nav-toggle.is-active span:nth-child(1) { - margin-left: -5px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-transform-origin: left top; - transform-origin: left top; -} - -.nav-toggle.is-active span:nth-child(2) { - opacity: 0; -} - -.nav-toggle.is-active span:nth-child(3) { - margin-left: -5px; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - -webkit-transform-origin: left bottom; - transform-origin: left bottom; -} - -@media screen and (min-width: 769px), print { - .nav-toggle { - display: none; - } -} - -.nav-item { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex-positive: 0; - flex-grow: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - font-size: 1rem; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - line-height: 1.5; - padding: 0.5rem 0.75rem; -} - -.nav-item a { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; -} - -.nav-item img { - max-height: 1.75rem; -} - -.nav-item .tag:first-child:not(:last-child) { - margin-right: 0.5rem; -} - -.nav-item .tag:last-child:not(:first-child) { - margin-left: 0.5rem; -} - -@media screen and (max-width: 768px) { - .nav-item { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - } -} - -.nav-item a, -a.nav-item { - color: #7a7a7a; -} - -.nav-item a:hover, -a.nav-item:hover { - color: #363636; -} - -.nav-item a.is-active, -a.nav-item.is-active { - color: #363636; -} - -.nav-item a.is-tab, -a.nav-item.is-tab { - border-bottom: 1px solid transparent; - border-top: 1px solid transparent; - padding-bottom: calc(0.75rem - 1px); - padding-left: 1rem; - padding-right: 1rem; - padding-top: calc(0.75rem - 1px); -} - -.nav-item a.is-tab:hover, -a.nav-item.is-tab:hover { - border-bottom-color: #00d1b2; - border-top-color: transparent; -} - -.nav-item a.is-tab.is-active, -a.nav-item.is-tab.is-active { - border-bottom: 3px solid #00d1b2; - color: #00d1b2; - padding-bottom: calc(0.75rem - 3px); -} - -@media screen and (min-width: 1000px) { - .nav-item a.is-brand, - a.nav-item.is-brand { - padding-left: 0; - } -} - -.nav-left, -.nav-right { - -webkit-overflow-scrolling: touch; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; - max-width: 100%; - overflow: auto; -} - -@media screen and (min-width: 1192px) { - .nav-left, - .nav-right { - -ms-flex-preferred-size: 0; - flex-basis: 0; - } -} - -.nav-left { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - white-space: nowrap; -} - -.nav-right { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; -} - -.nav-center { - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex-positive: 0; - flex-grow: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - margin-left: auto; - margin-right: auto; -} - -@media screen and (max-width: 768px) { - .nav-menu.nav-right { - background-color: white; - box-shadow: 0 4px 7px rgba(10, 10, 10, 0.1); - left: 0; - display: none; - right: 0; - top: 100%; - position: absolute; - } - .nav-menu.nav-right .nav-item { - border-top: 1px solid rgba(219, 219, 219, 0.5); - padding: 0.75rem; - } - .nav-menu.nav-right.is-active { - display: block; - } -} - -.nav { - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - background-color: white; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - height: 3.25rem; - position: relative; - text-align: center; - z-index: 10; -} - -.nav > .container { - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - min-height: 3.25rem; - width: 100%; -} - -.nav.has-shadow { - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1); -} - -.pagination { - font-size: 1rem; - margin: -0.25rem; -} - -.pagination.is-small { - font-size: 0.75rem; -} - -.pagination.is-medium { - font-size: 1.25rem; -} - -.pagination.is-large { - font-size: 1.5rem; -} - -.pagination, -.pagination-list { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - text-align: center; -} - -.pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis { - -moz-appearance: none; - -webkit-appearance: none; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - border: 1px solid transparent; - border-radius: 3px; - box-shadow: none; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - font-size: 1rem; - height: 2.25em; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - font-size: 1em; - padding-left: 0.5em; - padding-right: 0.5em; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - margin: 0.25rem; - text-align: center; -} - -.pagination-previous:focus, .pagination-previous.is-focused, .pagination-previous:active, .pagination-previous.is-active, -.pagination-next:focus, -.pagination-next.is-focused, -.pagination-next:active, -.pagination-next.is-active, -.pagination-link:focus, -.pagination-link.is-focused, -.pagination-link:active, -.pagination-link.is-active, -.pagination-ellipsis:focus, -.pagination-ellipsis.is-focused, -.pagination-ellipsis:active, -.pagination-ellipsis.is-active { - outline: none; -} - -.pagination-previous[disabled], -.pagination-next[disabled], -.pagination-link[disabled], -.pagination-ellipsis[disabled] { - cursor: not-allowed; -} - -.pagination-previous, -.pagination-next, -.pagination-link { - border-color: #dbdbdb; - min-width: 2.25em; -} - -.pagination-previous:hover, -.pagination-next:hover, -.pagination-link:hover { - border-color: #b5b5b5; - color: #363636; -} - -.pagination-previous:focus, -.pagination-next:focus, -.pagination-link:focus { - border-color: #00d1b2; -} - -.pagination-previous:active, -.pagination-next:active, -.pagination-link:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); -} - -.pagination-previous[disabled], -.pagination-next[disabled], -.pagination-link[disabled] { - background-color: #dbdbdb; - border-color: #dbdbdb; - box-shadow: none; - color: #7a7a7a; - opacity: 0.5; -} - -.pagination-previous, -.pagination-next { - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; -} - -.pagination-link.is-current { - background-color: #00d1b2; - border-color: #00d1b2; - color: #fff; -} - -.pagination-ellipsis { - color: #b5b5b5; - pointer-events: none; -} - -.pagination-list { - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} - -@media screen and (max-width: 768px) { - .pagination { - -ms-flex-wrap: wrap; - flex-wrap: wrap; - } - .pagination-previous, - .pagination-next { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; - } - .pagination-list li { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; - } -} - -@media screen and (min-width: 769px), print { - .pagination-list { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .pagination-previous { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .pagination-next { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .pagination { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - } - .pagination.is-centered .pagination-previous { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .pagination.is-centered .pagination-list { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .pagination.is-centered .pagination-next { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .pagination.is-right .pagination-previous { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .pagination.is-right .pagination-next { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .pagination.is-right .pagination-list { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } -} - -.panel { - font-size: 1rem; -} - -.panel:not(:last-child) { - margin-bottom: 1.5rem; -} - -.panel-heading, -.panel-tabs, -.panel-block { - border-bottom: 1px solid #dbdbdb; - border-left: 1px solid #dbdbdb; - border-right: 1px solid #dbdbdb; -} - -.panel-heading:first-child, -.panel-tabs:first-child, -.panel-block:first-child { - border-top: 1px solid #dbdbdb; -} - -.panel-heading { - background-color: whitesmoke; - border-radius: 3px 3px 0 0; - color: #363636; - font-size: 1.25em; - font-weight: 300; - line-height: 1.25; - padding: 0.5em 0.75em; -} - -.panel-tabs { - -webkit-box-align: end; - -ms-flex-align: end; - align-items: flex-end; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - font-size: 0.875em; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; -} - -.panel-tabs a { - border-bottom: 1px solid #dbdbdb; - margin-bottom: -1px; - padding: 0.5em; -} - -.panel-tabs a.is-active { - border-bottom-color: #4a4a4a; - color: #363636; -} - -.panel-list a { - color: #4a4a4a; -} - -.panel-list a:hover { - color: #00d1b2; -} - -.panel-block { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - color: #363636; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - padding: 0.5em 0.75em; -} - -.panel-block input[type="checkbox"] { - margin-right: 0.75em; -} - -.panel-block > .control { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; - width: 100%; -} - -.panel-block.is-wrapped { - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} - -.panel-block.is-active { - border-left-color: #00d1b2; - color: #363636; -} - -.panel-block.is-active .panel-icon { - color: #00d1b2; -} - -a.panel-block, -label.panel-block { - cursor: pointer; -} - -a.panel-block:hover, -label.panel-block:hover { - background-color: whitesmoke; -} - -.panel-icon { - display: inline-block; - font-size: 14px; - height: 1em; - line-height: 1em; - text-align: center; - vertical-align: top; - width: 1em; - color: #7a7a7a; - margin-right: 0.75em; -} - -.panel-icon .fa { - font-size: inherit; - line-height: inherit; -} - -.tabs { - -webkit-overflow-scrolling: touch; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - font-size: 1rem; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - overflow: hidden; - overflow-x: auto; - white-space: nowrap; -} - -.tabs:not(:last-child) { - margin-bottom: 1.5rem; -} - -.tabs a { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - border-bottom: 1px solid #dbdbdb; - color: #4a4a4a; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - margin-bottom: -1px; - padding: 0.5em 1em; - vertical-align: top; -} - -.tabs a:hover { - border-bottom-color: #363636; - color: #363636; -} - -.tabs li { - display: block; -} - -.tabs li.is-active a { - border-bottom-color: #00d1b2; - color: #00d1b2; -} - -.tabs ul { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - border-bottom: 1px solid #dbdbdb; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; -} - -.tabs ul.is-left { - padding-right: 0.75em; -} - -.tabs ul.is-center { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - padding-left: 0.75em; - padding-right: 0.75em; -} - -.tabs ul.is-right { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - padding-left: 0.75em; -} - -.tabs .icon:first-child { - margin-right: 0.5em; -} - -.tabs .icon:last-child { - margin-left: 0.5em; -} - -.tabs.is-centered ul { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; -} - -.tabs.is-right ul { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; -} - -.tabs.is-boxed a { - border: 1px solid transparent; - border-radius: 3px 3px 0 0; -} - -.tabs.is-boxed a:hover { - background-color: whitesmoke; - border-bottom-color: #dbdbdb; -} - -.tabs.is-boxed li.is-active a { - background-color: white; - border-color: #dbdbdb; - border-bottom-color: transparent !important; -} - -.tabs.is-fullwidth li { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; -} - -.tabs.is-toggle a { - border: 1px solid #dbdbdb; - margin-bottom: 0; - position: relative; -} - -.tabs.is-toggle a:hover { - background-color: whitesmoke; - border-color: #b5b5b5; - z-index: 2; -} - -.tabs.is-toggle li + li { - margin-left: -1px; -} - -.tabs.is-toggle li:first-child a { - border-radius: 3px 0 0 3px; -} - -.tabs.is-toggle li:last-child a { - border-radius: 0 3px 3px 0; -} - -.tabs.is-toggle li.is-active a { - background-color: #00d1b2; - border-color: #00d1b2; - color: #fff; - z-index: 1; -} - -.tabs.is-toggle ul { - border-bottom: none; -} - -.tabs.is-small { - font-size: 0.75rem; -} - -.tabs.is-medium { - font-size: 1.25rem; -} - -.tabs.is-large { - font-size: 1.5rem; -} - -.column { - display: block; - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; - padding: 0.75rem; -} - -.columns.is-mobile > .column.is-narrow { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; -} - -.columns.is-mobile > .column.is-full { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; -} - -.columns.is-mobile > .column.is-three-quarters { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; -} - -.columns.is-mobile > .column.is-two-thirds { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.6666%; -} - -.columns.is-mobile > .column.is-half { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; -} - -.columns.is-mobile > .column.is-one-third { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.3333%; -} - -.columns.is-mobile > .column.is-one-quarter { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; -} - -.columns.is-mobile > .column.is-offset-three-quarters { - margin-left: 75%; -} - -.columns.is-mobile > .column.is-offset-two-thirds { - margin-left: 66.6666%; -} - -.columns.is-mobile > .column.is-offset-half { - margin-left: 50%; -} - -.columns.is-mobile > .column.is-offset-one-third { - margin-left: 33.3333%; -} - -.columns.is-mobile > .column.is-offset-one-quarter { - margin-left: 25%; -} - -.columns.is-mobile > .column.is-1 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 8.33333%; -} - -.columns.is-mobile > .column.is-offset-1 { - margin-left: 8.33333%; -} - -.columns.is-mobile > .column.is-2 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 16.66667%; -} - -.columns.is-mobile > .column.is-offset-2 { - margin-left: 16.66667%; -} - -.columns.is-mobile > .column.is-3 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; -} - -.columns.is-mobile > .column.is-offset-3 { - margin-left: 25%; -} - -.columns.is-mobile > .column.is-4 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.33333%; -} - -.columns.is-mobile > .column.is-offset-4 { - margin-left: 33.33333%; -} - -.columns.is-mobile > .column.is-5 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 41.66667%; -} - -.columns.is-mobile > .column.is-offset-5 { - margin-left: 41.66667%; -} - -.columns.is-mobile > .column.is-6 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; -} - -.columns.is-mobile > .column.is-offset-6 { - margin-left: 50%; -} - -.columns.is-mobile > .column.is-7 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 58.33333%; -} - -.columns.is-mobile > .column.is-offset-7 { - margin-left: 58.33333%; -} - -.columns.is-mobile > .column.is-8 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.66667%; -} - -.columns.is-mobile > .column.is-offset-8 { - margin-left: 66.66667%; -} - -.columns.is-mobile > .column.is-9 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; -} - -.columns.is-mobile > .column.is-offset-9 { - margin-left: 75%; -} - -.columns.is-mobile > .column.is-10 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 83.33333%; -} - -.columns.is-mobile > .column.is-offset-10 { - margin-left: 83.33333%; -} - -.columns.is-mobile > .column.is-11 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 91.66667%; -} - -.columns.is-mobile > .column.is-offset-11 { - margin-left: 91.66667%; -} - -.columns.is-mobile > .column.is-12 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; -} - -.columns.is-mobile > .column.is-offset-12 { - margin-left: 100%; -} - -@media screen and (max-width: 768px) { - .column.is-narrow-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - } - .column.is-full-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - } - .column.is-three-quarters-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; - } - .column.is-two-thirds-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.6666%; - } - .column.is-half-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; - } - .column.is-one-third-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.3333%; - } - .column.is-one-quarter-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; - } - .column.is-offset-three-quarters-mobile { - margin-left: 75%; - } - .column.is-offset-two-thirds-mobile { - margin-left: 66.6666%; - } - .column.is-offset-half-mobile { - margin-left: 50%; - } - .column.is-offset-one-third-mobile { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter-mobile { - margin-left: 25%; - } - .column.is-1-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 8.33333%; - } - .column.is-offset-1-mobile { - margin-left: 8.33333%; - } - .column.is-2-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 16.66667%; - } - .column.is-offset-2-mobile { - margin-left: 16.66667%; - } - .column.is-3-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; - } - .column.is-offset-3-mobile { - margin-left: 25%; - } - .column.is-4-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.33333%; - } - .column.is-offset-4-mobile { - margin-left: 33.33333%; - } - .column.is-5-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 41.66667%; - } - .column.is-offset-5-mobile { - margin-left: 41.66667%; - } - .column.is-6-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; - } - .column.is-offset-6-mobile { - margin-left: 50%; - } - .column.is-7-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 58.33333%; - } - .column.is-offset-7-mobile { - margin-left: 58.33333%; - } - .column.is-8-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.66667%; - } - .column.is-offset-8-mobile { - margin-left: 66.66667%; - } - .column.is-9-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; - } - .column.is-offset-9-mobile { - margin-left: 75%; - } - .column.is-10-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 83.33333%; - } - .column.is-offset-10-mobile { - margin-left: 83.33333%; - } - .column.is-11-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 91.66667%; - } - .column.is-offset-11-mobile { - margin-left: 91.66667%; - } - .column.is-12-mobile { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - } - .column.is-offset-12-mobile { - margin-left: 100%; - } -} - -@media screen and (min-width: 769px), print { - .column.is-narrow, .column.is-narrow-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - } - .column.is-full, .column.is-full-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - } - .column.is-three-quarters, .column.is-three-quarters-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; - } - .column.is-two-thirds, .column.is-two-thirds-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.6666%; - } - .column.is-half, .column.is-half-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; - } - .column.is-one-third, .column.is-one-third-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.3333%; - } - .column.is-one-quarter, .column.is-one-quarter-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; - } - .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { - margin-left: 75%; - } - .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { - margin-left: 66.6666%; - } - .column.is-offset-half, .column.is-offset-half-tablet { - margin-left: 50%; - } - .column.is-offset-one-third, .column.is-offset-one-third-tablet { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { - margin-left: 25%; - } - .column.is-1, .column.is-1-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 8.33333%; - } - .column.is-offset-1, .column.is-offset-1-tablet { - margin-left: 8.33333%; - } - .column.is-2, .column.is-2-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 16.66667%; - } - .column.is-offset-2, .column.is-offset-2-tablet { - margin-left: 16.66667%; - } - .column.is-3, .column.is-3-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; - } - .column.is-offset-3, .column.is-offset-3-tablet { - margin-left: 25%; - } - .column.is-4, .column.is-4-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.33333%; - } - .column.is-offset-4, .column.is-offset-4-tablet { - margin-left: 33.33333%; - } - .column.is-5, .column.is-5-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 41.66667%; - } - .column.is-offset-5, .column.is-offset-5-tablet { - margin-left: 41.66667%; - } - .column.is-6, .column.is-6-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; - } - .column.is-offset-6, .column.is-offset-6-tablet { - margin-left: 50%; - } - .column.is-7, .column.is-7-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 58.33333%; - } - .column.is-offset-7, .column.is-offset-7-tablet { - margin-left: 58.33333%; - } - .column.is-8, .column.is-8-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.66667%; - } - .column.is-offset-8, .column.is-offset-8-tablet { - margin-left: 66.66667%; - } - .column.is-9, .column.is-9-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; - } - .column.is-offset-9, .column.is-offset-9-tablet { - margin-left: 75%; - } - .column.is-10, .column.is-10-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 83.33333%; - } - .column.is-offset-10, .column.is-offset-10-tablet { - margin-left: 83.33333%; - } - .column.is-11, .column.is-11-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 91.66667%; - } - .column.is-offset-11, .column.is-offset-11-tablet { - margin-left: 91.66667%; - } - .column.is-12, .column.is-12-tablet { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - } - .column.is-offset-12, .column.is-offset-12-tablet { - margin-left: 100%; - } -} - -@media screen and (min-width: 1000px) { - .column.is-narrow-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - } - .column.is-full-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - } - .column.is-three-quarters-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; - } - .column.is-two-thirds-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.6666%; - } - .column.is-half-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; - } - .column.is-one-third-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.3333%; - } - .column.is-one-quarter-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; - } - .column.is-offset-three-quarters-desktop { - margin-left: 75%; - } - .column.is-offset-two-thirds-desktop { - margin-left: 66.6666%; - } - .column.is-offset-half-desktop { - margin-left: 50%; - } - .column.is-offset-one-third-desktop { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter-desktop { - margin-left: 25%; - } - .column.is-1-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 8.33333%; - } - .column.is-offset-1-desktop { - margin-left: 8.33333%; - } - .column.is-2-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 16.66667%; - } - .column.is-offset-2-desktop { - margin-left: 16.66667%; - } - .column.is-3-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; - } - .column.is-offset-3-desktop { - margin-left: 25%; - } - .column.is-4-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.33333%; - } - .column.is-offset-4-desktop { - margin-left: 33.33333%; - } - .column.is-5-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 41.66667%; - } - .column.is-offset-5-desktop { - margin-left: 41.66667%; - } - .column.is-6-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; - } - .column.is-offset-6-desktop { - margin-left: 50%; - } - .column.is-7-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 58.33333%; - } - .column.is-offset-7-desktop { - margin-left: 58.33333%; - } - .column.is-8-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.66667%; - } - .column.is-offset-8-desktop { - margin-left: 66.66667%; - } - .column.is-9-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; - } - .column.is-offset-9-desktop { - margin-left: 75%; - } - .column.is-10-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 83.33333%; - } - .column.is-offset-10-desktop { - margin-left: 83.33333%; - } - .column.is-11-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 91.66667%; - } - .column.is-offset-11-desktop { - margin-left: 91.66667%; - } - .column.is-12-desktop { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - } - .column.is-offset-12-desktop { - margin-left: 100%; - } -} - -@media screen and (min-width: 1192px) { - .column.is-narrow-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - } - .column.is-full-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - } - .column.is-three-quarters-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; - } - .column.is-two-thirds-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.6666%; - } - .column.is-half-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; - } - .column.is-one-third-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.3333%; - } - .column.is-one-quarter-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; - } - .column.is-offset-three-quarters-widescreen { - margin-left: 75%; - } - .column.is-offset-two-thirds-widescreen { - margin-left: 66.6666%; - } - .column.is-offset-half-widescreen { - margin-left: 50%; - } - .column.is-offset-one-third-widescreen { - margin-left: 33.3333%; - } - .column.is-offset-one-quarter-widescreen { - margin-left: 25%; - } - .column.is-1-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 8.33333%; - } - .column.is-offset-1-widescreen { - margin-left: 8.33333%; - } - .column.is-2-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 16.66667%; - } - .column.is-offset-2-widescreen { - margin-left: 16.66667%; - } - .column.is-3-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; - } - .column.is-offset-3-widescreen { - margin-left: 25%; - } - .column.is-4-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.33333%; - } - .column.is-offset-4-widescreen { - margin-left: 33.33333%; - } - .column.is-5-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 41.66667%; - } - .column.is-offset-5-widescreen { - margin-left: 41.66667%; - } - .column.is-6-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; - } - .column.is-offset-6-widescreen { - margin-left: 50%; - } - .column.is-7-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 58.33333%; - } - .column.is-offset-7-widescreen { - margin-left: 58.33333%; - } - .column.is-8-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.66667%; - } - .column.is-offset-8-widescreen { - margin-left: 66.66667%; - } - .column.is-9-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; - } - .column.is-offset-9-widescreen { - margin-left: 75%; - } - .column.is-10-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 83.33333%; - } - .column.is-offset-10-widescreen { - margin-left: 83.33333%; - } - .column.is-11-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 91.66667%; - } - .column.is-offset-11-widescreen { - margin-left: 91.66667%; - } - .column.is-12-widescreen { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - } - .column.is-offset-12-widescreen { - margin-left: 100%; - } -} - -.columns { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; -} - -.columns:last-child { - margin-bottom: -0.75rem; -} - -.columns:not(:last-child) { - margin-bottom: 0.75rem; -} - -.columns.is-centered { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; -} - -.columns.is-gapless { - margin-left: 0; - margin-right: 0; - margin-top: 0; -} - -.columns.is-gapless:last-child { - margin-bottom: 0; -} - -.columns.is-gapless:not(:last-child) { - margin-bottom: 1.5rem; -} - -.columns.is-gapless > .column { - margin: 0; - padding: 0; -} - -@media screen and (min-width: 769px), print { - .columns.is-grid { - -ms-flex-wrap: wrap; - flex-wrap: wrap; - } - .columns.is-grid > .column { - max-width: 33.3333%; - padding: 0.75rem; - width: 33.3333%; - } - .columns.is-grid > .column + .column { - margin-left: 0; - } -} - -.columns.is-mobile { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} - -.columns.is-multiline { - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} - -.columns.is-vcentered { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -@media screen and (min-width: 769px), print { - .columns:not(.is-desktop) { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - } -} - -@media screen and (min-width: 1000px) { - .columns.is-desktop { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - } -} - -.tile { - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: block; - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; - min-height: -webkit-min-content; - min-height: -moz-min-content; - min-height: min-content; -} - -.tile.is-ancestor { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; -} - -.tile.is-ancestor:last-child { - margin-bottom: -0.75rem; -} - -.tile.is-ancestor:not(:last-child) { - margin-bottom: 0.75rem; -} - -.tile.is-child { - margin: 0 !important; -} - -.tile.is-parent { - padding: 0.75rem; -} - -.tile.is-vertical { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} - -.tile.is-vertical > .tile.is-child:not(:last-child) { - margin-bottom: 1.5rem !important; -} - -@media screen and (min-width: 769px), print { - .tile:not(.is-child) { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - } - .tile.is-1 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 8.33333%; - } - .tile.is-2 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 16.66667%; - } - .tile.is-3 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 25%; - } - .tile.is-4 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 33.33333%; - } - .tile.is-5 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 41.66667%; - } - .tile.is-6 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 50%; - } - .tile.is-7 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 58.33333%; - } - .tile.is-8 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 66.66667%; - } - .tile.is-9 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 75%; - } - .tile.is-10 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 83.33333%; - } - .tile.is-11 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 91.66667%; - } - .tile.is-12 { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - } -} - -.hero-video { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; - overflow: hidden; -} - -.hero-video video { - left: 50%; - min-height: 100%; - min-width: 100%; - position: absolute; - top: 50%; - -webkit-transform: translate3d(-50%, -50%, 0); - transform: translate3d(-50%, -50%, 0); -} - -.hero-video.is-transparent { - opacity: 0.3; -} - -@media screen and (max-width: 768px) { - .hero-video { - display: none; - } -} - -.hero-buttons { - margin-top: 1.5rem; -} - -@media screen and (max-width: 768px) { - .hero-buttons .button { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - } - .hero-buttons .button:not(:last-child) { - margin-bottom: 0.75rem; - } -} - -@media screen and (min-width: 769px), print { - .hero-buttons { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - } - .hero-buttons .button:not(:last-child) { - margin-right: 1.5rem; - } -} - -.hero-head, -.hero-foot { - -webkit-box-flex: 0; - -ms-flex-positive: 0; - flex-grow: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} - -.hero-body { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 0; - flex-shrink: 0; - padding: 3rem 1.5rem; -} - -@media screen and (min-width: 1192px) { - .hero-body { - padding-left: 0; - padding-right: 0; - } -} - -.hero { - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - background-color: white; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; -} - -.hero .nav { - background: none; - box-shadow: 0 1px 0 rgba(219, 219, 219, 0.3); -} - -.hero .tabs ul { - border-bottom: none; -} - -.hero.is-white { - background-color: white; - color: #0a0a0a; -} - -.hero.is-white a:not(.button), -.hero.is-white strong { - color: inherit; -} - -.hero.is-white .title { - color: #0a0a0a; -} - -.hero.is-white .subtitle { - color: rgba(10, 10, 10, 0.9); -} - -.hero.is-white .subtitle a:not(.button), -.hero.is-white .subtitle strong { - color: #0a0a0a; -} - -.hero.is-white .nav { - box-shadow: 0 1px 0 rgba(10, 10, 10, 0.2); -} - -@media screen and (max-width: 768px) { - .hero.is-white .nav-menu { - background-color: white; - } -} - -.hero.is-white a.nav-item, -.hero.is-white .nav-item a:not(.button) { - color: rgba(10, 10, 10, 0.7); -} - -.hero.is-white a.nav-item:hover, .hero.is-white a.nav-item.is-active, -.hero.is-white .nav-item a:not(.button):hover, -.hero.is-white .nav-item a:not(.button).is-active { - color: #0a0a0a; -} - -.hero.is-white .tabs a { - color: #0a0a0a; - opacity: 0.9; -} - -.hero.is-white .tabs a:hover { - opacity: 1; -} - -.hero.is-white .tabs li.is-active a { - opacity: 1; -} - -.hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { - color: #0a0a0a; -} - -.hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; -} - -.hero.is-white.is-bold { - background-image: -webkit-linear-gradient(309deg, #e6e6e6 0%, white 71%, white 100%); - background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-white.is-bold .nav-menu { - background-image: -webkit-linear-gradient(309deg, #e6e6e6 0%, white 71%, white 100%); - background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); - } -} - -@media screen and (max-width: 768px) { - .hero.is-white .nav-toggle span { - background-color: #0a0a0a; - } - .hero.is-white .nav-toggle:hover { - background-color: rgba(10, 10, 10, 0.1); - } - .hero.is-white .nav-toggle.is-active span { - background-color: #0a0a0a; - } - .hero.is-white .nav-menu .nav-item { - border-top-color: rgba(10, 10, 10, 0.2); - } -} - -.hero.is-black { - background-color: #0a0a0a; - color: white; -} - -.hero.is-black a:not(.button), -.hero.is-black strong { - color: inherit; -} - -.hero.is-black .title { - color: white; -} - -.hero.is-black .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-black .subtitle a:not(.button), -.hero.is-black .subtitle strong { - color: white; -} - -.hero.is-black .nav { - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -} - -@media screen and (max-width: 768px) { - .hero.is-black .nav-menu { - background-color: #0a0a0a; - } -} - -.hero.is-black a.nav-item, -.hero.is-black .nav-item a:not(.button) { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-black a.nav-item:hover, .hero.is-black a.nav-item.is-active, -.hero.is-black .nav-item a:not(.button):hover, -.hero.is-black .nav-item a:not(.button).is-active { - color: white; -} - -.hero.is-black .tabs a { - color: white; - opacity: 0.9; -} - -.hero.is-black .tabs a:hover { - opacity: 1; -} - -.hero.is-black .tabs li.is-active a { - opacity: 1; -} - -.hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { - color: white; -} - -.hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { - background-color: white; - border-color: white; - color: #0a0a0a; -} - -.hero.is-black.is-bold { - background-image: -webkit-linear-gradient(309deg, black 0%, #0a0a0a 71%, #181616 100%); - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-black.is-bold .nav-menu { - background-image: -webkit-linear-gradient(309deg, black 0%, #0a0a0a 71%, #181616 100%); - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); - } -} - -@media screen and (max-width: 768px) { - .hero.is-black .nav-toggle span { - background-color: white; - } - .hero.is-black .nav-toggle:hover { - background-color: rgba(10, 10, 10, 0.1); - } - .hero.is-black .nav-toggle.is-active span { - background-color: white; - } - .hero.is-black .nav-menu .nav-item { - border-top-color: rgba(255, 255, 255, 0.2); - } -} - -.hero.is-light { - background-color: whitesmoke; - color: #363636; -} - -.hero.is-light a:not(.button), -.hero.is-light strong { - color: inherit; -} - -.hero.is-light .title { - color: #363636; -} - -.hero.is-light .subtitle { - color: rgba(54, 54, 54, 0.9); -} - -.hero.is-light .subtitle a:not(.button), -.hero.is-light .subtitle strong { - color: #363636; -} - -.hero.is-light .nav { - box-shadow: 0 1px 0 rgba(54, 54, 54, 0.2); -} - -@media screen and (max-width: 768px) { - .hero.is-light .nav-menu { - background-color: whitesmoke; - } -} - -.hero.is-light a.nav-item, -.hero.is-light .nav-item a:not(.button) { - color: rgba(54, 54, 54, 0.7); -} - -.hero.is-light a.nav-item:hover, .hero.is-light a.nav-item.is-active, -.hero.is-light .nav-item a:not(.button):hover, -.hero.is-light .nav-item a:not(.button).is-active { - color: #363636; -} - -.hero.is-light .tabs a { - color: #363636; - opacity: 0.9; -} - -.hero.is-light .tabs a:hover { - opacity: 1; -} - -.hero.is-light .tabs li.is-active a { - opacity: 1; -} - -.hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { - color: #363636; -} - -.hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { - background-color: #363636; - border-color: #363636; - color: whitesmoke; -} - -.hero.is-light.is-bold { - background-image: -webkit-linear-gradient(309deg, #dfd8d8 0%, whitesmoke 71%, white 100%); - background-image: linear-gradient(141deg, #dfd8d8 0%, whitesmoke 71%, white 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-light.is-bold .nav-menu { - background-image: -webkit-linear-gradient(309deg, #dfd8d8 0%, whitesmoke 71%, white 100%); - background-image: linear-gradient(141deg, #dfd8d8 0%, whitesmoke 71%, white 100%); - } -} - -@media screen and (max-width: 768px) { - .hero.is-light .nav-toggle span { - background-color: #363636; - } - .hero.is-light .nav-toggle:hover { - background-color: rgba(10, 10, 10, 0.1); - } - .hero.is-light .nav-toggle.is-active span { - background-color: #363636; - } - .hero.is-light .nav-menu .nav-item { - border-top-color: rgba(54, 54, 54, 0.2); - } -} - -.hero.is-dark { - background-color: #363636; - color: whitesmoke; -} - -.hero.is-dark a:not(.button), -.hero.is-dark strong { - color: inherit; -} - -.hero.is-dark .title { - color: whitesmoke; -} - -.hero.is-dark .subtitle { - color: rgba(245, 245, 245, 0.9); -} - -.hero.is-dark .subtitle a:not(.button), -.hero.is-dark .subtitle strong { - color: whitesmoke; -} - -.hero.is-dark .nav { - box-shadow: 0 1px 0 rgba(245, 245, 245, 0.2); -} - -@media screen and (max-width: 768px) { - .hero.is-dark .nav-menu { - background-color: #363636; - } -} - -.hero.is-dark a.nav-item, -.hero.is-dark .nav-item a:not(.button) { - color: rgba(245, 245, 245, 0.7); -} - -.hero.is-dark a.nav-item:hover, .hero.is-dark a.nav-item.is-active, -.hero.is-dark .nav-item a:not(.button):hover, -.hero.is-dark .nav-item a:not(.button).is-active { - color: whitesmoke; -} - -.hero.is-dark .tabs a { - color: whitesmoke; - opacity: 0.9; -} - -.hero.is-dark .tabs a:hover { - opacity: 1; -} - -.hero.is-dark .tabs li.is-active a { - opacity: 1; -} - -.hero.is-dark .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a { - color: whitesmoke; -} - -.hero.is-dark .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-dark .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; -} - -.hero.is-dark.is-bold { - background-image: -webkit-linear-gradient(309deg, #1f1919 0%, #363636 71%, #463f3f 100%); - background-image: linear-gradient(141deg, #1f1919 0%, #363636 71%, #463f3f 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-dark.is-bold .nav-menu { - background-image: -webkit-linear-gradient(309deg, #1f1919 0%, #363636 71%, #463f3f 100%); - background-image: linear-gradient(141deg, #1f1919 0%, #363636 71%, #463f3f 100%); - } -} - -@media screen and (max-width: 768px) { - .hero.is-dark .nav-toggle span { - background-color: whitesmoke; - } - .hero.is-dark .nav-toggle:hover { - background-color: rgba(10, 10, 10, 0.1); - } - .hero.is-dark .nav-toggle.is-active span { - background-color: whitesmoke; - } - .hero.is-dark .nav-menu .nav-item { - border-top-color: rgba(245, 245, 245, 0.2); - } -} - -.hero.is-primary { - background-color: #00d1b2; - color: #fff; -} - -.hero.is-primary a:not(.button), -.hero.is-primary strong { - color: inherit; -} - -.hero.is-primary .title { - color: #fff; -} - -.hero.is-primary .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-primary .subtitle a:not(.button), -.hero.is-primary .subtitle strong { - color: #fff; -} - -.hero.is-primary .nav { - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -} - -@media screen and (max-width: 768px) { - .hero.is-primary .nav-menu { - background-color: #00d1b2; - } -} - -.hero.is-primary a.nav-item, -.hero.is-primary .nav-item a:not(.button) { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-primary a.nav-item:hover, .hero.is-primary a.nav-item.is-active, -.hero.is-primary .nav-item a:not(.button):hover, -.hero.is-primary .nav-item a:not(.button).is-active { - color: #fff; -} - -.hero.is-primary .tabs a { - color: #fff; - opacity: 0.9; -} - -.hero.is-primary .tabs a:hover { - opacity: 1; -} - -.hero.is-primary .tabs li.is-active a { - opacity: 1; -} - -.hero.is-primary .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a { - color: #fff; -} - -.hero.is-primary .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-primary .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #00d1b2; -} - -.hero.is-primary.is-bold { - background-image: -webkit-linear-gradient(309deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); - background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-primary.is-bold .nav-menu { - background-image: -webkit-linear-gradient(309deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); - background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); - } -} - -@media screen and (max-width: 768px) { - .hero.is-primary .nav-toggle span { - background-color: #fff; - } - .hero.is-primary .nav-toggle:hover { - background-color: rgba(10, 10, 10, 0.1); - } - .hero.is-primary .nav-toggle.is-active span { - background-color: #fff; - } - .hero.is-primary .nav-menu .nav-item { - border-top-color: rgba(255, 255, 255, 0.2); - } -} - -.hero.is-info { - background-color: #3273dc; - color: #fff; -} - -.hero.is-info a:not(.button), -.hero.is-info strong { - color: inherit; -} - -.hero.is-info .title { - color: #fff; -} - -.hero.is-info .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-info .subtitle a:not(.button), -.hero.is-info .subtitle strong { - color: #fff; -} - -.hero.is-info .nav { - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -} - -@media screen and (max-width: 768px) { - .hero.is-info .nav-menu { - background-color: #3273dc; - } -} - -.hero.is-info a.nav-item, -.hero.is-info .nav-item a:not(.button) { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-info a.nav-item:hover, .hero.is-info a.nav-item.is-active, -.hero.is-info .nav-item a:not(.button):hover, -.hero.is-info .nav-item a:not(.button).is-active { - color: #fff; -} - -.hero.is-info .tabs a { - color: #fff; - opacity: 0.9; -} - -.hero.is-info .tabs a:hover { - opacity: 1; -} - -.hero.is-info .tabs li.is-active a { - opacity: 1; -} - -.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { - color: #fff; -} - -.hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #3273dc; -} - -.hero.is-info.is-bold { - background-image: -webkit-linear-gradient(309deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); - background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-info.is-bold .nav-menu { - background-image: -webkit-linear-gradient(309deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); - background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); - } -} - -@media screen and (max-width: 768px) { - .hero.is-info .nav-toggle span { - background-color: #fff; - } - .hero.is-info .nav-toggle:hover { - background-color: rgba(10, 10, 10, 0.1); - } - .hero.is-info .nav-toggle.is-active span { - background-color: #fff; - } - .hero.is-info .nav-menu .nav-item { - border-top-color: rgba(255, 255, 255, 0.2); - } -} - -.hero.is-success { - background-color: #23d160; - color: #fff; -} - -.hero.is-success a:not(.button), -.hero.is-success strong { - color: inherit; -} - -.hero.is-success .title { - color: #fff; -} - -.hero.is-success .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-success .subtitle a:not(.button), -.hero.is-success .subtitle strong { - color: #fff; -} - -.hero.is-success .nav { - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -} - -@media screen and (max-width: 768px) { - .hero.is-success .nav-menu { - background-color: #23d160; - } -} - -.hero.is-success a.nav-item, -.hero.is-success .nav-item a:not(.button) { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-success a.nav-item:hover, .hero.is-success a.nav-item.is-active, -.hero.is-success .nav-item a:not(.button):hover, -.hero.is-success .nav-item a:not(.button).is-active { - color: #fff; -} - -.hero.is-success .tabs a { - color: #fff; - opacity: 0.9; -} - -.hero.is-success .tabs a:hover { - opacity: 1; -} - -.hero.is-success .tabs li.is-active a { - opacity: 1; -} - -.hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { - color: #fff; -} - -.hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #23d160; -} - -.hero.is-success.is-bold { - background-image: -webkit-linear-gradient(309deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); - background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-success.is-bold .nav-menu { - background-image: -webkit-linear-gradient(309deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); - background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); - } -} - -@media screen and (max-width: 768px) { - .hero.is-success .nav-toggle span { - background-color: #fff; - } - .hero.is-success .nav-toggle:hover { - background-color: rgba(10, 10, 10, 0.1); - } - .hero.is-success .nav-toggle.is-active span { - background-color: #fff; - } - .hero.is-success .nav-menu .nav-item { - border-top-color: rgba(255, 255, 255, 0.2); - } -} - -.hero.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning a:not(.button), -.hero.is-warning strong { - color: inherit; -} - -.hero.is-warning .title { - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning .subtitle { - color: rgba(0, 0, 0, 0.9); -} - -.hero.is-warning .subtitle a:not(.button), -.hero.is-warning .subtitle strong { - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning .nav { - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); -} - -@media screen and (max-width: 768px) { - .hero.is-warning .nav-menu { - background-color: #ffdd57; - } -} - -.hero.is-warning a.nav-item, -.hero.is-warning .nav-item a:not(.button) { - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning a.nav-item:hover, .hero.is-warning a.nav-item.is-active, -.hero.is-warning .nav-item a:not(.button):hover, -.hero.is-warning .nav-item a:not(.button).is-active { - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning .tabs a { - color: rgba(0, 0, 0, 0.7); - opacity: 0.9; -} - -.hero.is-warning .tabs a:hover { - opacity: 1; -} - -.hero.is-warning .tabs li.is-active a { - opacity: 1; -} - -.hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { - color: rgba(0, 0, 0, 0.7); -} - -.hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { - background-color: rgba(0, 0, 0, 0.7); - border-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; -} - -.hero.is-warning.is-bold { - background-image: -webkit-linear-gradient(309deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); - background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-warning.is-bold .nav-menu { - background-image: -webkit-linear-gradient(309deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); - background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); - } -} - -@media screen and (max-width: 768px) { - .hero.is-warning .nav-toggle span { - background-color: rgba(0, 0, 0, 0.7); - } - .hero.is-warning .nav-toggle:hover { - background-color: rgba(10, 10, 10, 0.1); - } - .hero.is-warning .nav-toggle.is-active span { - background-color: rgba(0, 0, 0, 0.7); - } - .hero.is-warning .nav-menu .nav-item { - border-top-color: rgba(0, 0, 0, 0.2); - } -} - -.hero.is-danger { - background-color: #ff3860; - color: #fff; -} - -.hero.is-danger a:not(.button), -.hero.is-danger strong { - color: inherit; -} - -.hero.is-danger .title { - color: #fff; -} - -.hero.is-danger .subtitle { - color: rgba(255, 255, 255, 0.9); -} - -.hero.is-danger .subtitle a:not(.button), -.hero.is-danger .subtitle strong { - color: #fff; -} - -.hero.is-danger .nav { - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -} - -@media screen and (max-width: 768px) { - .hero.is-danger .nav-menu { - background-color: #ff3860; - } -} - -.hero.is-danger a.nav-item, -.hero.is-danger .nav-item a:not(.button) { - color: rgba(255, 255, 255, 0.7); -} - -.hero.is-danger a.nav-item:hover, .hero.is-danger a.nav-item.is-active, -.hero.is-danger .nav-item a:not(.button):hover, -.hero.is-danger .nav-item a:not(.button).is-active { - color: #fff; -} - -.hero.is-danger .tabs a { - color: #fff; - opacity: 0.9; -} - -.hero.is-danger .tabs a:hover { - opacity: 1; -} - -.hero.is-danger .tabs li.is-active a { - opacity: 1; -} - -.hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { - color: #fff; -} - -.hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); -} - -.hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #ff3860; -} - -.hero.is-danger.is-bold { - background-image: -webkit-linear-gradient(309deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); - background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); -} - -@media screen and (max-width: 768px) { - .hero.is-danger.is-bold .nav-menu { - background-image: -webkit-linear-gradient(309deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); - background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); - } -} - -@media screen and (max-width: 768px) { - .hero.is-danger .nav-toggle span { - background-color: #fff; - } - .hero.is-danger .nav-toggle:hover { - background-color: rgba(10, 10, 10, 0.1); - } - .hero.is-danger .nav-toggle.is-active span { - background-color: #fff; - } - .hero.is-danger .nav-menu .nav-item { - border-top-color: rgba(255, 255, 255, 0.2); - } -} - -@media screen and (min-width: 769px), print { - .hero.is-medium .hero-body { - padding-bottom: 9rem; - padding-top: 9rem; - } -} - -@media screen and (min-width: 769px), print { - .hero.is-large .hero-body { - padding-bottom: 18rem; - padding-top: 18rem; - } -} - -.hero.is-fullheight { - min-height: 100vh; -} - -.hero.is-fullheight .hero-body { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} - -.hero.is-fullheight .hero-body > .container { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-negative: 1; - flex-shrink: 1; -} - -.section { - background-color: white; - padding: 3rem 1.5rem; -} - -@media screen and (min-width: 1000px) { - .section.is-medium { - padding: 9rem 1.5rem; - } - .section.is-large { - padding: 18rem 1.5rem; - } -} - -.footer { - background-color: whitesmoke; - padding: 3rem 1.5rem 6rem; -} -/*# sourceMappingURL=bulma.css.map */ \ No newline at end of file diff --git a/pkgs/csslib/test/examples/foundation.css b/pkgs/csslib/test/examples/foundation.css deleted file mode 100644 index dd9aabd0d..000000000 --- a/pkgs/csslib/test/examples/foundation.css +++ /dev/null @@ -1,4398 +0,0 @@ -@charset "UTF-8"; -/** - * Foundation for Sites by ZURB - * Version 6.3.1 - * foundation.zurb.com - * Licensed under MIT Open Source - */ -/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ -/* Document - ========================================================================== */ -/** - * 1. Change the default font family in all browsers (opinionated). - * 2. Correct the line height in all browsers. - * 3. Prevent adjustments of font size after orientation changes in - * IE on Windows Phone and in iOS. - */ -html { - font-family: sans-serif; - /* 1 */ - line-height: 1.15; - /* 2 */ - -ms-text-size-adjust: 100%; - /* 3 */ - -webkit-text-size-adjust: 100%; - /* 3 */ } - -/* Sections - ========================================================================== */ -/** - * Remove the margin in all browsers (opinionated). - */ -body { - margin: 0; } - -/** - * Add the correct display in IE 9-. - */ -article, -aside, -footer, -header, -nav, -section { - display: block; } - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ -h1 { - font-size: 2em; - margin: 0.67em 0; } - -/* Grouping content - ========================================================================== */ -/** - * Add the correct display in IE 9-. - */ -figcaption, -figure { - display: block; } - -/** - * Add the correct margin in IE 8. - */ -figure { - margin: 1em 40px; } - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ -hr { - box-sizing: content-box; - /* 1 */ - height: 0; - /* 1 */ - overflow: visible; - /* 2 */ } - -/** - * Add the correct display in IE. - */ -main { - display: block; } - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ -pre { - font-family: monospace, monospace; - /* 1 */ - font-size: 1em; - /* 2 */ } - -/* Links - ========================================================================== */ -/** - * 1. Remove the gray background on active links in IE 10. - * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. - */ -a { - background-color: transparent; - /* 1 */ - -webkit-text-decoration-skip: objects; - /* 2 */ } - -/** - * Remove the outline on focused links when they are also active or hovered - * in all browsers (opinionated). - */ -a:active, -a:hover { - outline-width: 0; } - -/* Text-level semantics - ========================================================================== */ -/** - * 1. Remove the bottom border in Firefox 39-. - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ -abbr[title] { - border-bottom: none; - /* 1 */ - text-decoration: underline; - /* 2 */ - text-decoration: underline dotted; - /* 2 */ } - -/** - * Prevent the duplicate application of `bolder` by the next rule in Safari 6. - */ -b, -strong { - font-weight: inherit; } - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ -b, -strong { - font-weight: bolder; } - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ -code, -kbd, -samp { - font-family: monospace, monospace; - /* 1 */ - font-size: 1em; - /* 2 */ } - -/** - * Add the correct font style in Android 4.3-. - */ -dfn { - font-style: italic; } - -/** - * Add the correct background and color in IE 9-. - */ -mark { - background-color: #ff0; - color: #000; } - -/** - * Add the correct font size in all browsers. - */ -small { - font-size: 80%; } - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sub { - bottom: -0.25em; } - -sup { - top: -0.5em; } - -/* Embedded content - ========================================================================== */ -/** - * Add the correct display in IE 9-. - */ -audio, -video { - display: inline-block; } - -/** - * Add the correct display in iOS 4-7. - */ -audio:not([controls]) { - display: none; - height: 0; } - -/** - * Remove the border on images inside links in IE 10-. - */ -img { - border-style: none; } - -/** - * Hide the overflow in IE. - */ -svg:not(:root) { - overflow: hidden; } - -/* Forms - ========================================================================== */ -/** - * 1. Change the font styles in all browsers (opinionated). - * 2. Remove the margin in Firefox and Safari. - */ -button, -input, -optgroup, -select, -textarea { - font-family: sans-serif; - /* 1 */ - font-size: 100%; - /* 1 */ - line-height: 1.15; - /* 1 */ - margin: 0; - /* 2 */ } - -/** - * Show the overflow in IE. - */ -button { - overflow: visible; } - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ -button, -select { - /* 1 */ - text-transform: none; } - -/** - * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` - * controls in Android 4. - * 2. Correct the inability to style clickable types in iOS and Safari. - */ -button, -html [type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; - /* 2 */ } - -button, -[type="button"], -[type="reset"], -[type="submit"] { - /** - * Remove the inner border and padding in Firefox. - */ - /** - * Restore the focus styles unset by the previous rule. - */ } - button::-moz-focus-inner, - [type="button"]::-moz-focus-inner, - [type="reset"]::-moz-focus-inner, - [type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; } - button:-moz-focusring, - [type="button"]:-moz-focusring, - [type="reset"]:-moz-focusring, - [type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; } - -/** - * Show the overflow in Edge. - */ -input { - overflow: visible; } - -/** - * 1. Add the correct box sizing in IE 10-. - * 2. Remove the padding in IE 10-. - */ -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; } - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ -[type="search"] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ - /** - * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. - */ } - [type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { - -webkit-appearance: none; } - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ } - -/** - * Change the border, margin, and padding in all browsers (opinionated). - */ -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; } - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ -legend { - box-sizing: border-box; - /* 1 */ - display: table; - /* 1 */ - max-width: 100%; - /* 1 */ - padding: 0; - /* 3 */ - color: inherit; - /* 2 */ - white-space: normal; - /* 1 */ } - -/** - * 1. Add the correct display in IE 9-. - * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ -progress { - display: inline-block; - /* 1 */ - vertical-align: baseline; - /* 2 */ } - -/** - * Remove the default vertical scrollbar in IE. - */ -textarea { - overflow: auto; } - -/* Interactive - ========================================================================== */ -/* - * Add the correct display in Edge, IE, and Firefox. - */ -details { - display: block; } - -/* - * Add the correct display in all browsers. - */ -summary { - display: list-item; } - -/* - * Add the correct display in IE 9-. - */ -menu { - display: block; } - -/* Scripting - ========================================================================== */ -/** - * Add the correct display in IE 9-. - */ -canvas { - display: inline-block; } - -/** - * Add the correct display in IE. - */ -template { - display: none; } - -/* Hidden - ========================================================================== */ -/** - * Add the correct display in IE 10-. - */ -[hidden] { - display: none; } - -.foundation-mq { - font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; } - -html { - box-sizing: border-box; - font-size: 100%; } - -*, -*::before, -*::after { - box-sizing: inherit; } - -body { - margin: 0; - padding: 0; - background: #fefefe; - font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; - font-weight: normal; - line-height: 1.5; - color: #0a0a0a; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; } - -img { - display: inline-block; - vertical-align: middle; - max-width: 100%; - height: auto; - -ms-interpolation-mode: bicubic; } - -textarea { - height: auto; - min-height: 50px; - border-radius: 0; } - -select { - box-sizing: border-box; - width: 100%; - border-radius: 0; } - -.map_canvas img, -.map_canvas embed, -.map_canvas object, -.mqa-display img, -.mqa-display embed, -.mqa-display object { - max-width: none !important; } - -button { - padding: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border: 0; - border-radius: 0; - background: transparent; - line-height: 1; } - [data-whatinput='mouse'] button { - outline: 0; } - -pre { - overflow: auto; } - -.is-visible { - display: block !important; } - -.is-hidden { - display: none !important; } - -.row { - max-width: 75rem; - margin-right: auto; - margin-left: auto; } - .row::before, .row::after { - display: table; - content: ' '; } - .row::after { - clear: both; } - .row.collapse > .column, .row.collapse > .columns { - padding-right: 0; - padding-left: 0; } - .row .row { - margin-right: -0.625rem; - margin-left: -0.625rem; } - @media print, screen and (min-width: 40em) { - .row .row { - margin-right: -0.9375rem; - margin-left: -0.9375rem; } } - @media print, screen and (min-width: 64em) { - .row .row { - margin-right: -0.9375rem; - margin-left: -0.9375rem; } } - .row .row.collapse { - margin-right: 0; - margin-left: 0; } - .row.expanded { - max-width: none; } - .row.expanded .row { - margin-right: auto; - margin-left: auto; } - .row:not(.expanded) .row { - max-width: none; } - .row.gutter-small > .column, .row.gutter-small > .columns { - padding-right: 0.625rem; - padding-left: 0.625rem; } - .row.gutter-medium > .column, .row.gutter-medium > .columns { - padding-right: 0.9375rem; - padding-left: 0.9375rem; } - -.column, .columns { - width: 100%; - float: left; - padding-right: 0.625rem; - padding-left: 0.625rem; } - @media print, screen and (min-width: 40em) { - .column, .columns { - padding-right: 0.9375rem; - padding-left: 0.9375rem; } } - .column:last-child:not(:first-child), .columns:last-child:not(:first-child) { - float: right; } - .column.end:last-child:last-child, .end.columns:last-child:last-child { - float: left; } - -.column.row.row, .row.row.columns { - float: none; } - -.row .column.row.row, .row .row.row.columns { - margin-right: 0; - margin-left: 0; - padding-right: 0; - padding-left: 0; } - -.small-1 { - width: 8.33333%; } - -.small-push-1 { - position: relative; - left: 8.33333%; } - -.small-pull-1 { - position: relative; - left: -8.33333%; } - -.small-offset-0 { - margin-left: 0%; } - -.small-2 { - width: 16.66667%; } - -.small-push-2 { - position: relative; - left: 16.66667%; } - -.small-pull-2 { - position: relative; - left: -16.66667%; } - -.small-offset-1 { - margin-left: 8.33333%; } - -.small-3 { - width: 25%; } - -.small-push-3 { - position: relative; - left: 25%; } - -.small-pull-3 { - position: relative; - left: -25%; } - -.small-offset-2 { - margin-left: 16.66667%; } - -.small-4 { - width: 33.33333%; } - -.small-push-4 { - position: relative; - left: 33.33333%; } - -.small-pull-4 { - position: relative; - left: -33.33333%; } - -.small-offset-3 { - margin-left: 25%; } - -.small-5 { - width: 41.66667%; } - -.small-push-5 { - position: relative; - left: 41.66667%; } - -.small-pull-5 { - position: relative; - left: -41.66667%; } - -.small-offset-4 { - margin-left: 33.33333%; } - -.small-6 { - width: 50%; } - -.small-push-6 { - position: relative; - left: 50%; } - -.small-pull-6 { - position: relative; - left: -50%; } - -.small-offset-5 { - margin-left: 41.66667%; } - -.small-7 { - width: 58.33333%; } - -.small-push-7 { - position: relative; - left: 58.33333%; } - -.small-pull-7 { - position: relative; - left: -58.33333%; } - -.small-offset-6 { - margin-left: 50%; } - -.small-8 { - width: 66.66667%; } - -.small-push-8 { - position: relative; - left: 66.66667%; } - -.small-pull-8 { - position: relative; - left: -66.66667%; } - -.small-offset-7 { - margin-left: 58.33333%; } - -.small-9 { - width: 75%; } - -.small-push-9 { - position: relative; - left: 75%; } - -.small-pull-9 { - position: relative; - left: -75%; } - -.small-offset-8 { - margin-left: 66.66667%; } - -.small-10 { - width: 83.33333%; } - -.small-push-10 { - position: relative; - left: 83.33333%; } - -.small-pull-10 { - position: relative; - left: -83.33333%; } - -.small-offset-9 { - margin-left: 75%; } - -.small-11 { - width: 91.66667%; } - -.small-push-11 { - position: relative; - left: 91.66667%; } - -.small-pull-11 { - position: relative; - left: -91.66667%; } - -.small-offset-10 { - margin-left: 83.33333%; } - -.small-12 { - width: 100%; } - -.small-offset-11 { - margin-left: 91.66667%; } - -.small-up-1 > .column, .small-up-1 > .columns { - float: left; - width: 100%; } - .small-up-1 > .column:nth-of-type(1n), .small-up-1 > .columns:nth-of-type(1n) { - clear: none; } - .small-up-1 > .column:nth-of-type(1n+1), .small-up-1 > .columns:nth-of-type(1n+1) { - clear: both; } - .small-up-1 > .column:last-child, .small-up-1 > .columns:last-child { - float: left; } - -.small-up-2 > .column, .small-up-2 > .columns { - float: left; - width: 50%; } - .small-up-2 > .column:nth-of-type(1n), .small-up-2 > .columns:nth-of-type(1n) { - clear: none; } - .small-up-2 > .column:nth-of-type(2n+1), .small-up-2 > .columns:nth-of-type(2n+1) { - clear: both; } - .small-up-2 > .column:last-child, .small-up-2 > .columns:last-child { - float: left; } - -.small-up-3 > .column, .small-up-3 > .columns { - float: left; - width: 33.33333%; } - .small-up-3 > .column:nth-of-type(1n), .small-up-3 > .columns:nth-of-type(1n) { - clear: none; } - .small-up-3 > .column:nth-of-type(3n+1), .small-up-3 > .columns:nth-of-type(3n+1) { - clear: both; } - .small-up-3 > .column:last-child, .small-up-3 > .columns:last-child { - float: left; } - -.small-up-4 > .column, .small-up-4 > .columns { - float: left; - width: 25%; } - .small-up-4 > .column:nth-of-type(1n), .small-up-4 > .columns:nth-of-type(1n) { - clear: none; } - .small-up-4 > .column:nth-of-type(4n+1), .small-up-4 > .columns:nth-of-type(4n+1) { - clear: both; } - .small-up-4 > .column:last-child, .small-up-4 > .columns:last-child { - float: left; } - -.small-up-5 > .column, .small-up-5 > .columns { - float: left; - width: 20%; } - .small-up-5 > .column:nth-of-type(1n), .small-up-5 > .columns:nth-of-type(1n) { - clear: none; } - .small-up-5 > .column:nth-of-type(5n+1), .small-up-5 > .columns:nth-of-type(5n+1) { - clear: both; } - .small-up-5 > .column:last-child, .small-up-5 > .columns:last-child { - float: left; } - -.small-up-6 > .column, .small-up-6 > .columns { - float: left; - width: 16.66667%; } - .small-up-6 > .column:nth-of-type(1n), .small-up-6 > .columns:nth-of-type(1n) { - clear: none; } - .small-up-6 > .column:nth-of-type(6n+1), .small-up-6 > .columns:nth-of-type(6n+1) { - clear: both; } - .small-up-6 > .column:last-child, .small-up-6 > .columns:last-child { - float: left; } - -.small-up-7 > .column, .small-up-7 > .columns { - float: left; - width: 14.28571%; } - .small-up-7 > .column:nth-of-type(1n), .small-up-7 > .columns:nth-of-type(1n) { - clear: none; } - .small-up-7 > .column:nth-of-type(7n+1), .small-up-7 > .columns:nth-of-type(7n+1) { - clear: both; } - .small-up-7 > .column:last-child, .small-up-7 > .columns:last-child { - float: left; } - -.small-up-8 > .column, .small-up-8 > .columns { - float: left; - width: 12.5%; } - .small-up-8 > .column:nth-of-type(1n), .small-up-8 > .columns:nth-of-type(1n) { - clear: none; } - .small-up-8 > .column:nth-of-type(8n+1), .small-up-8 > .columns:nth-of-type(8n+1) { - clear: both; } - .small-up-8 > .column:last-child, .small-up-8 > .columns:last-child { - float: left; } - -.small-collapse > .column, .small-collapse > .columns { - padding-right: 0; - padding-left: 0; } - -.small-collapse .row { - margin-right: 0; - margin-left: 0; } - -.expanded.row .small-collapse.row { - margin-right: 0; - margin-left: 0; } - -.small-uncollapse > .column, .small-uncollapse > .columns { - padding-right: 0.625rem; - padding-left: 0.625rem; } - -.small-centered { - margin-right: auto; - margin-left: auto; } - .small-centered, .small-centered:last-child:not(:first-child) { - float: none; - clear: both; } - -.small-uncentered, -.small-push-0, -.small-pull-0 { - position: static; - float: left; - margin-right: 0; - margin-left: 0; } - -@media print, screen and (min-width: 40em) { - .medium-1 { - width: 8.33333%; } - .medium-push-1 { - position: relative; - left: 8.33333%; } - .medium-pull-1 { - position: relative; - left: -8.33333%; } - .medium-offset-0 { - margin-left: 0%; } - .medium-2 { - width: 16.66667%; } - .medium-push-2 { - position: relative; - left: 16.66667%; } - .medium-pull-2 { - position: relative; - left: -16.66667%; } - .medium-offset-1 { - margin-left: 8.33333%; } - .medium-3 { - width: 25%; } - .medium-push-3 { - position: relative; - left: 25%; } - .medium-pull-3 { - position: relative; - left: -25%; } - .medium-offset-2 { - margin-left: 16.66667%; } - .medium-4 { - width: 33.33333%; } - .medium-push-4 { - position: relative; - left: 33.33333%; } - .medium-pull-4 { - position: relative; - left: -33.33333%; } - .medium-offset-3 { - margin-left: 25%; } - .medium-5 { - width: 41.66667%; } - .medium-push-5 { - position: relative; - left: 41.66667%; } - .medium-pull-5 { - position: relative; - left: -41.66667%; } - .medium-offset-4 { - margin-left: 33.33333%; } - .medium-6 { - width: 50%; } - .medium-push-6 { - position: relative; - left: 50%; } - .medium-pull-6 { - position: relative; - left: -50%; } - .medium-offset-5 { - margin-left: 41.66667%; } - .medium-7 { - width: 58.33333%; } - .medium-push-7 { - position: relative; - left: 58.33333%; } - .medium-pull-7 { - position: relative; - left: -58.33333%; } - .medium-offset-6 { - margin-left: 50%; } - .medium-8 { - width: 66.66667%; } - .medium-push-8 { - position: relative; - left: 66.66667%; } - .medium-pull-8 { - position: relative; - left: -66.66667%; } - .medium-offset-7 { - margin-left: 58.33333%; } - .medium-9 { - width: 75%; } - .medium-push-9 { - position: relative; - left: 75%; } - .medium-pull-9 { - position: relative; - left: -75%; } - .medium-offset-8 { - margin-left: 66.66667%; } - .medium-10 { - width: 83.33333%; } - .medium-push-10 { - position: relative; - left: 83.33333%; } - .medium-pull-10 { - position: relative; - left: -83.33333%; } - .medium-offset-9 { - margin-left: 75%; } - .medium-11 { - width: 91.66667%; } - .medium-push-11 { - position: relative; - left: 91.66667%; } - .medium-pull-11 { - position: relative; - left: -91.66667%; } - .medium-offset-10 { - margin-left: 83.33333%; } - .medium-12 { - width: 100%; } - .medium-offset-11 { - margin-left: 91.66667%; } - .medium-up-1 > .column, .medium-up-1 > .columns { - float: left; - width: 100%; } - .medium-up-1 > .column:nth-of-type(1n), .medium-up-1 > .columns:nth-of-type(1n) { - clear: none; } - .medium-up-1 > .column:nth-of-type(1n+1), .medium-up-1 > .columns:nth-of-type(1n+1) { - clear: both; } - .medium-up-1 > .column:last-child, .medium-up-1 > .columns:last-child { - float: left; } - .medium-up-2 > .column, .medium-up-2 > .columns { - float: left; - width: 50%; } - .medium-up-2 > .column:nth-of-type(1n), .medium-up-2 > .columns:nth-of-type(1n) { - clear: none; } - .medium-up-2 > .column:nth-of-type(2n+1), .medium-up-2 > .columns:nth-of-type(2n+1) { - clear: both; } - .medium-up-2 > .column:last-child, .medium-up-2 > .columns:last-child { - float: left; } - .medium-up-3 > .column, .medium-up-3 > .columns { - float: left; - width: 33.33333%; } - .medium-up-3 > .column:nth-of-type(1n), .medium-up-3 > .columns:nth-of-type(1n) { - clear: none; } - .medium-up-3 > .column:nth-of-type(3n+1), .medium-up-3 > .columns:nth-of-type(3n+1) { - clear: both; } - .medium-up-3 > .column:last-child, .medium-up-3 > .columns:last-child { - float: left; } - .medium-up-4 > .column, .medium-up-4 > .columns { - float: left; - width: 25%; } - .medium-up-4 > .column:nth-of-type(1n), .medium-up-4 > .columns:nth-of-type(1n) { - clear: none; } - .medium-up-4 > .column:nth-of-type(4n+1), .medium-up-4 > .columns:nth-of-type(4n+1) { - clear: both; } - .medium-up-4 > .column:last-child, .medium-up-4 > .columns:last-child { - float: left; } - .medium-up-5 > .column, .medium-up-5 > .columns { - float: left; - width: 20%; } - .medium-up-5 > .column:nth-of-type(1n), .medium-up-5 > .columns:nth-of-type(1n) { - clear: none; } - .medium-up-5 > .column:nth-of-type(5n+1), .medium-up-5 > .columns:nth-of-type(5n+1) { - clear: both; } - .medium-up-5 > .column:last-child, .medium-up-5 > .columns:last-child { - float: left; } - .medium-up-6 > .column, .medium-up-6 > .columns { - float: left; - width: 16.66667%; } - .medium-up-6 > .column:nth-of-type(1n), .medium-up-6 > .columns:nth-of-type(1n) { - clear: none; } - .medium-up-6 > .column:nth-of-type(6n+1), .medium-up-6 > .columns:nth-of-type(6n+1) { - clear: both; } - .medium-up-6 > .column:last-child, .medium-up-6 > .columns:last-child { - float: left; } - .medium-up-7 > .column, .medium-up-7 > .columns { - float: left; - width: 14.28571%; } - .medium-up-7 > .column:nth-of-type(1n), .medium-up-7 > .columns:nth-of-type(1n) { - clear: none; } - .medium-up-7 > .column:nth-of-type(7n+1), .medium-up-7 > .columns:nth-of-type(7n+1) { - clear: both; } - .medium-up-7 > .column:last-child, .medium-up-7 > .columns:last-child { - float: left; } - .medium-up-8 > .column, .medium-up-8 > .columns { - float: left; - width: 12.5%; } - .medium-up-8 > .column:nth-of-type(1n), .medium-up-8 > .columns:nth-of-type(1n) { - clear: none; } - .medium-up-8 > .column:nth-of-type(8n+1), .medium-up-8 > .columns:nth-of-type(8n+1) { - clear: both; } - .medium-up-8 > .column:last-child, .medium-up-8 > .columns:last-child { - float: left; } - .medium-collapse > .column, .medium-collapse > .columns { - padding-right: 0; - padding-left: 0; } - .medium-collapse .row { - margin-right: 0; - margin-left: 0; } - .expanded.row .medium-collapse.row { - margin-right: 0; - margin-left: 0; } - .medium-uncollapse > .column, .medium-uncollapse > .columns { - padding-right: 0.9375rem; - padding-left: 0.9375rem; } - .medium-centered { - margin-right: auto; - margin-left: auto; } - .medium-centered, .medium-centered:last-child:not(:first-child) { - float: none; - clear: both; } - .medium-uncentered, - .medium-push-0, - .medium-pull-0 { - position: static; - float: left; - margin-right: 0; - margin-left: 0; } } - -@media print, screen and (min-width: 64em) { - .large-1 { - width: 8.33333%; } - .large-push-1 { - position: relative; - left: 8.33333%; } - .large-pull-1 { - position: relative; - left: -8.33333%; } - .large-offset-0 { - margin-left: 0%; } - .large-2 { - width: 16.66667%; } - .large-push-2 { - position: relative; - left: 16.66667%; } - .large-pull-2 { - position: relative; - left: -16.66667%; } - .large-offset-1 { - margin-left: 8.33333%; } - .large-3 { - width: 25%; } - .large-push-3 { - position: relative; - left: 25%; } - .large-pull-3 { - position: relative; - left: -25%; } - .large-offset-2 { - margin-left: 16.66667%; } - .large-4 { - width: 33.33333%; } - .large-push-4 { - position: relative; - left: 33.33333%; } - .large-pull-4 { - position: relative; - left: -33.33333%; } - .large-offset-3 { - margin-left: 25%; } - .large-5 { - width: 41.66667%; } - .large-push-5 { - position: relative; - left: 41.66667%; } - .large-pull-5 { - position: relative; - left: -41.66667%; } - .large-offset-4 { - margin-left: 33.33333%; } - .large-6 { - width: 50%; } - .large-push-6 { - position: relative; - left: 50%; } - .large-pull-6 { - position: relative; - left: -50%; } - .large-offset-5 { - margin-left: 41.66667%; } - .large-7 { - width: 58.33333%; } - .large-push-7 { - position: relative; - left: 58.33333%; } - .large-pull-7 { - position: relative; - left: -58.33333%; } - .large-offset-6 { - margin-left: 50%; } - .large-8 { - width: 66.66667%; } - .large-push-8 { - position: relative; - left: 66.66667%; } - .large-pull-8 { - position: relative; - left: -66.66667%; } - .large-offset-7 { - margin-left: 58.33333%; } - .large-9 { - width: 75%; } - .large-push-9 { - position: relative; - left: 75%; } - .large-pull-9 { - position: relative; - left: -75%; } - .large-offset-8 { - margin-left: 66.66667%; } - .large-10 { - width: 83.33333%; } - .large-push-10 { - position: relative; - left: 83.33333%; } - .large-pull-10 { - position: relative; - left: -83.33333%; } - .large-offset-9 { - margin-left: 75%; } - .large-11 { - width: 91.66667%; } - .large-push-11 { - position: relative; - left: 91.66667%; } - .large-pull-11 { - position: relative; - left: -91.66667%; } - .large-offset-10 { - margin-left: 83.33333%; } - .large-12 { - width: 100%; } - .large-offset-11 { - margin-left: 91.66667%; } - .large-up-1 > .column, .large-up-1 > .columns { - float: left; - width: 100%; } - .large-up-1 > .column:nth-of-type(1n), .large-up-1 > .columns:nth-of-type(1n) { - clear: none; } - .large-up-1 > .column:nth-of-type(1n+1), .large-up-1 > .columns:nth-of-type(1n+1) { - clear: both; } - .large-up-1 > .column:last-child, .large-up-1 > .columns:last-child { - float: left; } - .large-up-2 > .column, .large-up-2 > .columns { - float: left; - width: 50%; } - .large-up-2 > .column:nth-of-type(1n), .large-up-2 > .columns:nth-of-type(1n) { - clear: none; } - .large-up-2 > .column:nth-of-type(2n+1), .large-up-2 > .columns:nth-of-type(2n+1) { - clear: both; } - .large-up-2 > .column:last-child, .large-up-2 > .columns:last-child { - float: left; } - .large-up-3 > .column, .large-up-3 > .columns { - float: left; - width: 33.33333%; } - .large-up-3 > .column:nth-of-type(1n), .large-up-3 > .columns:nth-of-type(1n) { - clear: none; } - .large-up-3 > .column:nth-of-type(3n+1), .large-up-3 > .columns:nth-of-type(3n+1) { - clear: both; } - .large-up-3 > .column:last-child, .large-up-3 > .columns:last-child { - float: left; } - .large-up-4 > .column, .large-up-4 > .columns { - float: left; - width: 25%; } - .large-up-4 > .column:nth-of-type(1n), .large-up-4 > .columns:nth-of-type(1n) { - clear: none; } - .large-up-4 > .column:nth-of-type(4n+1), .large-up-4 > .columns:nth-of-type(4n+1) { - clear: both; } - .large-up-4 > .column:last-child, .large-up-4 > .columns:last-child { - float: left; } - .large-up-5 > .column, .large-up-5 > .columns { - float: left; - width: 20%; } - .large-up-5 > .column:nth-of-type(1n), .large-up-5 > .columns:nth-of-type(1n) { - clear: none; } - .large-up-5 > .column:nth-of-type(5n+1), .large-up-5 > .columns:nth-of-type(5n+1) { - clear: both; } - .large-up-5 > .column:last-child, .large-up-5 > .columns:last-child { - float: left; } - .large-up-6 > .column, .large-up-6 > .columns { - float: left; - width: 16.66667%; } - .large-up-6 > .column:nth-of-type(1n), .large-up-6 > .columns:nth-of-type(1n) { - clear: none; } - .large-up-6 > .column:nth-of-type(6n+1), .large-up-6 > .columns:nth-of-type(6n+1) { - clear: both; } - .large-up-6 > .column:last-child, .large-up-6 > .columns:last-child { - float: left; } - .large-up-7 > .column, .large-up-7 > .columns { - float: left; - width: 14.28571%; } - .large-up-7 > .column:nth-of-type(1n), .large-up-7 > .columns:nth-of-type(1n) { - clear: none; } - .large-up-7 > .column:nth-of-type(7n+1), .large-up-7 > .columns:nth-of-type(7n+1) { - clear: both; } - .large-up-7 > .column:last-child, .large-up-7 > .columns:last-child { - float: left; } - .large-up-8 > .column, .large-up-8 > .columns { - float: left; - width: 12.5%; } - .large-up-8 > .column:nth-of-type(1n), .large-up-8 > .columns:nth-of-type(1n) { - clear: none; } - .large-up-8 > .column:nth-of-type(8n+1), .large-up-8 > .columns:nth-of-type(8n+1) { - clear: both; } - .large-up-8 > .column:last-child, .large-up-8 > .columns:last-child { - float: left; } - .large-collapse > .column, .large-collapse > .columns { - padding-right: 0; - padding-left: 0; } - .large-collapse .row { - margin-right: 0; - margin-left: 0; } - .expanded.row .large-collapse.row { - margin-right: 0; - margin-left: 0; } - .large-uncollapse > .column, .large-uncollapse > .columns { - padding-right: 0.9375rem; - padding-left: 0.9375rem; } - .large-centered { - margin-right: auto; - margin-left: auto; } - .large-centered, .large-centered:last-child:not(:first-child) { - float: none; - clear: both; } - .large-uncentered, - .large-push-0, - .large-pull-0 { - position: static; - float: left; - margin-right: 0; - margin-left: 0; } } - -.column-block { - margin-bottom: 1.25rem; } - .column-block > :last-child { - margin-bottom: 0; } - @media print, screen and (min-width: 40em) { - .column-block { - margin-bottom: 1.875rem; } - .column-block > :last-child { - margin-bottom: 0; } } - -div, -dl, -dt, -dd, -ul, -ol, -li, -h1, -h2, -h3, -h4, -h5, -h6, -pre, -form, -p, -blockquote, -th, -td { - margin: 0; - padding: 0; } - -p { - margin-bottom: 1rem; - font-size: inherit; - line-height: 1.6; - text-rendering: optimizeLegibility; } - -em, -i { - font-style: italic; - line-height: inherit; } - -strong, -b { - font-weight: bold; - line-height: inherit; } - -small { - font-size: 80%; - line-height: inherit; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; - font-style: normal; - font-weight: normal; - color: inherit; - text-rendering: optimizeLegibility; } - h1 small, - h2 small, - h3 small, - h4 small, - h5 small, - h6 small { - line-height: 0; - color: #cacaca; } - -h1 { - font-size: 1.5rem; - line-height: 1.4; - margin-top: 0; - margin-bottom: 0.5rem; } - -h2 { - font-size: 1.25rem; - line-height: 1.4; - margin-top: 0; - margin-bottom: 0.5rem; } - -h3 { - font-size: 1.1875rem; - line-height: 1.4; - margin-top: 0; - margin-bottom: 0.5rem; } - -h4 { - font-size: 1.125rem; - line-height: 1.4; - margin-top: 0; - margin-bottom: 0.5rem; } - -h5 { - font-size: 1.0625rem; - line-height: 1.4; - margin-top: 0; - margin-bottom: 0.5rem; } - -h6 { - font-size: 1rem; - line-height: 1.4; - margin-top: 0; - margin-bottom: 0.5rem; } - -@media print, screen and (min-width: 40em) { - h1 { - font-size: 3rem; } - h2 { - font-size: 2.5rem; } - h3 { - font-size: 1.9375rem; } - h4 { - font-size: 1.5625rem; } - h5 { - font-size: 1.25rem; } - h6 { - font-size: 1rem; } } - -a { - line-height: inherit; - color: #1779ba; - text-decoration: none; - cursor: pointer; } - a:hover, a:focus { - color: #1468a0; } - a img { - border: 0; } - -hr { - clear: both; - max-width: 75rem; - height: 0; - margin: 1.25rem auto; - border-top: 0; - border-right: 0; - border-bottom: 1px solid #cacaca; - border-left: 0; } - -ul, -ol, -dl { - margin-bottom: 1rem; - list-style-position: outside; - line-height: 1.6; } - -li { - font-size: inherit; } - -ul { - margin-left: 1.25rem; - list-style-type: disc; } - -ol { - margin-left: 1.25rem; } - -ul ul, ol ul, ul ol, ol ol { - margin-left: 1.25rem; - margin-bottom: 0; } - -dl { - margin-bottom: 1rem; } - dl dt { - margin-bottom: 0.3rem; - font-weight: bold; } - -blockquote { - margin: 0 0 1rem; - padding: 0.5625rem 1.25rem 0 1.1875rem; - border-left: 1px solid #cacaca; } - blockquote, blockquote p { - line-height: 1.6; - color: #8a8a8a; } - -cite { - display: block; - font-size: 0.8125rem; - color: #8a8a8a; } - cite:before { - content: "— "; } - -abbr { - border-bottom: 1px dotted #0a0a0a; - color: #0a0a0a; - cursor: help; } - -figure { - margin: 0; } - -code { - padding: 0.125rem 0.3125rem 0.0625rem; - border: 1px solid #cacaca; - background-color: #e6e6e6; - font-family: Consolas, "Liberation Mono", Courier, monospace; - font-weight: normal; - color: #0a0a0a; } - -kbd { - margin: 0; - padding: 0.125rem 0.25rem 0; - background-color: #e6e6e6; - font-family: Consolas, "Liberation Mono", Courier, monospace; - color: #0a0a0a; } - -.subheader { - margin-top: 0.2rem; - margin-bottom: 0.5rem; - font-weight: normal; - line-height: 1.4; - color: #8a8a8a; } - -.lead { - font-size: 125%; - line-height: 1.6; } - -.stat { - font-size: 2.5rem; - line-height: 1; } - p + .stat { - margin-top: -1rem; } - -.no-bullet { - margin-left: 0; - list-style: none; } - -.text-left { - text-align: left; } - -.text-right { - text-align: right; } - -.text-center { - text-align: center; } - -.text-justify { - text-align: justify; } - -@media print, screen and (min-width: 40em) { - .medium-text-left { - text-align: left; } - .medium-text-right { - text-align: right; } - .medium-text-center { - text-align: center; } - .medium-text-justify { - text-align: justify; } } - -@media print, screen and (min-width: 64em) { - .large-text-left { - text-align: left; } - .large-text-right { - text-align: right; } - .large-text-center { - text-align: center; } - .large-text-justify { - text-align: justify; } } - -.show-for-print { - display: none !important; } - -@media print { - * { - background: transparent !important; - box-shadow: none !important; - color: black !important; - text-shadow: none !important; } - .show-for-print { - display: block !important; } - .hide-for-print { - display: none !important; } - table.show-for-print { - display: table !important; } - thead.show-for-print { - display: table-header-group !important; } - tbody.show-for-print { - display: table-row-group !important; } - tr.show-for-print { - display: table-row !important; } - td.show-for-print { - display: table-cell !important; } - th.show-for-print { - display: table-cell !important; } - a, - a:visited { - text-decoration: underline; } - a[href]:after { - content: " (" attr(href) ")"; } - .ir a:after, - a[href^='javascript:']:after, - a[href^='#']:after { - content: ''; } - abbr[title]:after { - content: " (" attr(title) ")"; } - pre, - blockquote { - border: 1px solid #8a8a8a; - page-break-inside: avoid; } - thead { - display: table-header-group; } - tr, - img { - page-break-inside: avoid; } - img { - max-width: 100% !important; } - @page { - margin: 0.5cm; } - p, - h2, - h3 { - orphans: 3; - widows: 3; } - h2, - h3 { - page-break-after: avoid; } } - -.button { - display: inline-block; - vertical-align: middle; - margin: 0 0 1rem 0; - padding: 0.85em 1em; - -webkit-appearance: none; - border: 1px solid transparent; - border-radius: 0; - transition: background-color 0.25s ease-out, color 0.25s ease-out; - font-size: 0.9rem; - line-height: 1; - text-align: center; - cursor: pointer; - background-color: #1779ba; - color: #fefefe; } - [data-whatinput='mouse'] .button { - outline: 0; } - .button:hover, .button:focus { - background-color: #14679e; - color: #fefefe; } - .button.tiny { - font-size: 0.6rem; } - .button.small { - font-size: 0.75rem; } - .button.large { - font-size: 1.25rem; } - .button.expanded { - display: block; - width: 100%; - margin-right: 0; - margin-left: 0; } - .button.primary { - background-color: #1779ba; - color: #fefefe; } - .button.primary:hover, .button.primary:focus { - background-color: #126195; - color: #fefefe; } - .button.secondary { - background-color: #767676; - color: #fefefe; } - .button.secondary:hover, .button.secondary:focus { - background-color: #5e5e5e; - color: #fefefe; } - .button.success { - background-color: #3adb76; - color: #0a0a0a; } - .button.success:hover, .button.success:focus { - background-color: #22bb5b; - color: #0a0a0a; } - .button.warning { - background-color: #ffae00; - color: #0a0a0a; } - .button.warning:hover, .button.warning:focus { - background-color: #cc8b00; - color: #0a0a0a; } - .button.alert { - background-color: #cc4b37; - color: #fefefe; } - .button.alert:hover, .button.alert:focus { - background-color: #a53b2a; - color: #fefefe; } - .button.hollow { - border: 1px solid #1779ba; - color: #1779ba; } - .button.hollow, .button.hollow:hover, .button.hollow:focus { - background-color: transparent; } - .button.hollow:hover, .button.hollow:focus { - border-color: #0c3d5d; - color: #0c3d5d; } - .button.hollow.primary { - border: 1px solid #1779ba; - color: #1779ba; } - .button.hollow.primary:hover, .button.hollow.primary:focus { - border-color: #0c3d5d; - color: #0c3d5d; } - .button.hollow.secondary { - border: 1px solid #767676; - color: #767676; } - .button.hollow.secondary:hover, .button.hollow.secondary:focus { - border-color: #3b3b3b; - color: #3b3b3b; } - .button.hollow.success { - border: 1px solid #3adb76; - color: #3adb76; } - .button.hollow.success:hover, .button.hollow.success:focus { - border-color: #157539; - color: #157539; } - .button.hollow.warning { - border: 1px solid #ffae00; - color: #ffae00; } - .button.hollow.warning:hover, .button.hollow.warning:focus { - border-color: #805700; - color: #805700; } - .button.hollow.alert { - border: 1px solid #cc4b37; - color: #cc4b37; } - .button.hollow.alert:hover, .button.hollow.alert:focus { - border-color: #67251a; - color: #67251a; } - .button.disabled, .button[disabled] { - opacity: 0.25; - cursor: not-allowed; } - .button.disabled, .button.disabled:hover, .button.disabled:focus, .button[disabled], .button[disabled]:hover, .button[disabled]:focus { - background-color: #1779ba; - color: #fefefe; } - .button.disabled.primary, .button[disabled].primary { - opacity: 0.25; - cursor: not-allowed; } - .button.disabled.primary, .button.disabled.primary:hover, .button.disabled.primary:focus, .button[disabled].primary, .button[disabled].primary:hover, .button[disabled].primary:focus { - background-color: #1779ba; - color: #fefefe; } - .button.disabled.secondary, .button[disabled].secondary { - opacity: 0.25; - cursor: not-allowed; } - .button.disabled.secondary, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary, .button[disabled].secondary:hover, .button[disabled].secondary:focus { - background-color: #767676; - color: #fefefe; } - .button.disabled.success, .button[disabled].success { - opacity: 0.25; - cursor: not-allowed; } - .button.disabled.success, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success, .button[disabled].success:hover, .button[disabled].success:focus { - background-color: #3adb76; - color: #0a0a0a; } - .button.disabled.warning, .button[disabled].warning { - opacity: 0.25; - cursor: not-allowed; } - .button.disabled.warning, .button.disabled.warning:hover, .button.disabled.warning:focus, .button[disabled].warning, .button[disabled].warning:hover, .button[disabled].warning:focus { - background-color: #ffae00; - color: #0a0a0a; } - .button.disabled.alert, .button[disabled].alert { - opacity: 0.25; - cursor: not-allowed; } - .button.disabled.alert, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert, .button[disabled].alert:hover, .button[disabled].alert:focus { - background-color: #cc4b37; - color: #fefefe; } - .button.dropdown::after { - display: block; - width: 0; - height: 0; - border: inset 0.4em; - content: ''; - border-bottom-width: 0; - border-top-style: solid; - border-color: #fefefe transparent transparent; - position: relative; - top: 0.4em; - display: inline-block; - float: right; - margin-left: 1em; } - .button.arrow-only::after { - top: -0.1em; - float: none; - margin-left: 0; } - -[type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], -textarea { - display: block; - box-sizing: border-box; - width: 100%; - height: 2.4375rem; - margin: 0 0 1rem; - padding: 0.5rem; - border: 1px solid #cacaca; - border-radius: 0; - background-color: #fefefe; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - font-family: inherit; - font-size: 1rem; - font-weight: normal; - color: #0a0a0a; - transition: box-shadow 0.5s, border-color 0.25s ease-in-out; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; } - [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, - textarea:focus { - outline: none; - border: 1px solid #8a8a8a; - background-color: #fefefe; - box-shadow: 0 0 5px #cacaca; - transition: box-shadow 0.5s, border-color 0.25s ease-in-out; } - -textarea { - max-width: 100%; } - textarea[rows] { - height: auto; } - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #cacaca; } - -input::-moz-placeholder, -textarea::-moz-placeholder { - color: #cacaca; } - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #cacaca; } - -input::placeholder, -textarea::placeholder { - color: #cacaca; } - -input:disabled, input[readonly], -textarea:disabled, -textarea[readonly] { - background-color: #e6e6e6; - cursor: not-allowed; } - -[type='submit'], -[type='button'] { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: 0; } - -input[type='search'] { - box-sizing: border-box; } - -[type='file'], -[type='checkbox'], -[type='radio'] { - margin: 0 0 1rem; } - -[type='checkbox'] + label, -[type='radio'] + label { - display: inline-block; - vertical-align: baseline; - margin-left: 0.5rem; - margin-right: 1rem; - margin-bottom: 0; } - [type='checkbox'] + label[for], - [type='radio'] + label[for] { - cursor: pointer; } - -label > [type='checkbox'], -label > [type='radio'] { - margin-right: 0.5rem; } - -[type='file'] { - width: 100%; } - -label { - display: block; - margin: 0; - font-size: 0.875rem; - font-weight: normal; - line-height: 1.8; - color: #0a0a0a; } - label.middle { - margin: 0 0 1rem; - padding: 0.5625rem 0; } - -.help-text { - margin-top: -0.5rem; - font-size: 0.8125rem; - font-style: italic; - color: #0a0a0a; } - -.input-group { - display: table; - width: 100%; - margin-bottom: 1rem; } - .input-group > :first-child { - border-radius: 0 0 0 0; } - .input-group > :last-child > * { - border-radius: 0 0 0 0; } - -.input-group-label, .input-group-field, .input-group-button, .input-group-button a, -.input-group-button input, -.input-group-button button, -.input-group-button label { - margin: 0; - white-space: nowrap; - display: table-cell; - vertical-align: middle; } - -.input-group-label { - padding: 0 1rem; - border: 1px solid #cacaca; - background: #e6e6e6; - color: #0a0a0a; - text-align: center; - white-space: nowrap; - width: 1%; - height: 100%; } - .input-group-label:first-child { - border-right: 0; } - .input-group-label:last-child { - border-left: 0; } - -.input-group-field { - border-radius: 0; - height: 2.5rem; } - -.input-group-button { - padding-top: 0; - padding-bottom: 0; - text-align: center; - width: 1%; - height: 100%; } - .input-group-button a, - .input-group-button input, - .input-group-button button, - .input-group-button label { - height: 2.5rem; - padding-top: 0; - padding-bottom: 0; - font-size: 1rem; } - -.input-group .input-group-button { - display: table-cell; } - -fieldset { - margin: 0; - padding: 0; - border: 0; } - -legend { - max-width: 100%; - margin-bottom: 0.5rem; } - -.fieldset { - margin: 1.125rem 0; - padding: 1.25rem; - border: 1px solid #cacaca; } - .fieldset legend { - margin: 0; - margin-left: -0.1875rem; - padding: 0 0.1875rem; - background: #fefefe; } - -select { - height: 2.4375rem; - margin: 0 0 1rem; - padding: 0.5rem; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border: 1px solid #cacaca; - border-radius: 0; - background-color: #fefefe; - font-family: inherit; - font-size: 1rem; - line-height: normal; - color: #0a0a0a; - background-image: url("data:image/svg+xml;utf8,"); - background-origin: content-box; - background-position: right -1rem center; - background-repeat: no-repeat; - background-size: 9px 6px; - padding-right: 1.5rem; - transition: box-shadow 0.5s, border-color 0.25s ease-in-out; } - @media screen and (min-width: 0\0) { - select { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); } } - select:focus { - outline: none; - border: 1px solid #8a8a8a; - background-color: #fefefe; - box-shadow: 0 0 5px #cacaca; - transition: box-shadow 0.5s, border-color 0.25s ease-in-out; } - select:disabled { - background-color: #e6e6e6; - cursor: not-allowed; } - select::-ms-expand { - display: none; } - select[multiple] { - height: auto; - background-image: none; } - -.is-invalid-input:not(:focus) { - border-color: #cc4b37; - background-color: #f9ecea; } - .is-invalid-input:not(:focus)::-webkit-input-placeholder { - color: #cc4b37; } - .is-invalid-input:not(:focus)::-moz-placeholder { - color: #cc4b37; } - .is-invalid-input:not(:focus):-ms-input-placeholder { - color: #cc4b37; } - .is-invalid-input:not(:focus)::placeholder { - color: #cc4b37; } - -.is-invalid-label { - color: #cc4b37; } - -.form-error { - display: none; - margin-top: -0.5rem; - margin-bottom: 1rem; - font-size: 0.75rem; - font-weight: bold; - color: #cc4b37; } - .form-error.is-visible { - display: block; } - -.accordion { - margin-left: 0; - background: #fefefe; - list-style-type: none; } - -.accordion-item:first-child > :first-child { - border-radius: 0 0 0 0; } - -.accordion-item:last-child > :last-child { - border-radius: 0 0 0 0; } - -.accordion-title { - position: relative; - display: block; - padding: 1.25rem 1rem; - border: 1px solid #e6e6e6; - border-bottom: 0; - font-size: 0.75rem; - line-height: 1; - color: #1779ba; } - :last-child:not(.is-active) > .accordion-title { - border-bottom: 1px solid #e6e6e6; - border-radius: 0 0 0 0; } - .accordion-title:hover, .accordion-title:focus { - background-color: #e6e6e6; } - .accordion-title::before { - position: absolute; - top: 50%; - right: 1rem; - margin-top: -0.5rem; - content: '+'; } - .is-active > .accordion-title::before { - content: '\2013'; } - -.accordion-content { - display: none; - padding: 1rem; - border: 1px solid #e6e6e6; - border-bottom: 0; - background-color: #fefefe; - color: #0a0a0a; } - :last-child > .accordion-content:last-child { - border-bottom: 1px solid #e6e6e6; } - -.is-accordion-submenu-parent > a { - position: relative; } - .is-accordion-submenu-parent > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-bottom-width: 0; - border-top-style: solid; - border-color: #1779ba transparent transparent; - position: absolute; - top: 50%; - margin-top: -3px; - right: 1rem; } - -.is-accordion-submenu-parent[aria-expanded='true'] > a::after { - -ms-transform: rotate(180deg); - transform: rotate(180deg); - -ms-transform-origin: 50% 50%; - transform-origin: 50% 50%; } - -.badge { - display: inline-block; - min-width: 2.1em; - padding: 0.3em; - border-radius: 50%; - font-size: 0.6rem; - text-align: center; - background: #1779ba; - color: #fefefe; } - .badge.primary { - background: #1779ba; - color: #fefefe; } - .badge.secondary { - background: #767676; - color: #fefefe; } - .badge.success { - background: #3adb76; - color: #0a0a0a; } - .badge.warning { - background: #ffae00; - color: #0a0a0a; } - .badge.alert { - background: #cc4b37; - color: #fefefe; } - -.breadcrumbs { - margin: 0 0 1rem 0; - list-style: none; } - .breadcrumbs::before, .breadcrumbs::after { - display: table; - content: ' '; } - .breadcrumbs::after { - clear: both; } - .breadcrumbs li { - float: left; - font-size: 0.6875rem; - color: #0a0a0a; - cursor: default; - text-transform: uppercase; } - .breadcrumbs li:not(:last-child)::after { - position: relative; - top: 1px; - margin: 0 0.75rem; - opacity: 1; - content: "/"; - color: #cacaca; } - .breadcrumbs a { - color: #1779ba; } - .breadcrumbs a:hover { - text-decoration: underline; } - .breadcrumbs .disabled { - color: #cacaca; - cursor: not-allowed; } - -.button-group { - margin-bottom: 1rem; - font-size: 0; } - .button-group::before, .button-group::after { - display: table; - content: ' '; } - .button-group::after { - clear: both; } - .button-group .button { - margin: 0; - margin-right: 1px; - margin-bottom: 1px; - font-size: 0.9rem; } - .button-group .button:last-child { - margin-right: 0; } - .button-group.tiny .button { - font-size: 0.6rem; } - .button-group.small .button { - font-size: 0.75rem; } - .button-group.large .button { - font-size: 1.25rem; } - .button-group.expanded { - margin-right: -1px; } - .button-group.expanded::before, .button-group.expanded::after { - display: none; } - .button-group.expanded .button:first-child:last-child { - width: 100%; } - .button-group.expanded .button:first-child:nth-last-child(2), .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button { - display: inline-block; - width: calc(50% - 1px); - margin-right: 1px; } - .button-group.expanded .button:first-child:nth-last-child(2):last-child, .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button:last-child { - margin-right: -6px; } - .button-group.expanded .button:first-child:nth-last-child(3), .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button { - display: inline-block; - width: calc(33.33333% - 1px); - margin-right: 1px; } - .button-group.expanded .button:first-child:nth-last-child(3):last-child, .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button:last-child { - margin-right: -6px; } - .button-group.expanded .button:first-child:nth-last-child(4), .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button { - display: inline-block; - width: calc(25% - 1px); - margin-right: 1px; } - .button-group.expanded .button:first-child:nth-last-child(4):last-child, .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button:last-child { - margin-right: -6px; } - .button-group.expanded .button:first-child:nth-last-child(5), .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button { - display: inline-block; - width: calc(20% - 1px); - margin-right: 1px; } - .button-group.expanded .button:first-child:nth-last-child(5):last-child, .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button:last-child { - margin-right: -6px; } - .button-group.expanded .button:first-child:nth-last-child(6), .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button { - display: inline-block; - width: calc(16.66667% - 1px); - margin-right: 1px; } - .button-group.expanded .button:first-child:nth-last-child(6):last-child, .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button:last-child { - margin-right: -6px; } - .button-group.primary .button { - background-color: #1779ba; - color: #fefefe; } - .button-group.primary .button:hover, .button-group.primary .button:focus { - background-color: #126195; - color: #fefefe; } - .button-group.secondary .button { - background-color: #767676; - color: #fefefe; } - .button-group.secondary .button:hover, .button-group.secondary .button:focus { - background-color: #5e5e5e; - color: #fefefe; } - .button-group.success .button { - background-color: #3adb76; - color: #0a0a0a; } - .button-group.success .button:hover, .button-group.success .button:focus { - background-color: #22bb5b; - color: #0a0a0a; } - .button-group.warning .button { - background-color: #ffae00; - color: #0a0a0a; } - .button-group.warning .button:hover, .button-group.warning .button:focus { - background-color: #cc8b00; - color: #0a0a0a; } - .button-group.alert .button { - background-color: #cc4b37; - color: #fefefe; } - .button-group.alert .button:hover, .button-group.alert .button:focus { - background-color: #a53b2a; - color: #fefefe; } - .button-group.stacked .button, .button-group.stacked-for-small .button, .button-group.stacked-for-medium .button { - width: 100%; } - .button-group.stacked .button:last-child, .button-group.stacked-for-small .button:last-child, .button-group.stacked-for-medium .button:last-child { - margin-bottom: 0; } - @media print, screen and (min-width: 40em) { - .button-group.stacked-for-small .button { - width: auto; - margin-bottom: 0; } } - @media print, screen and (min-width: 64em) { - .button-group.stacked-for-medium .button { - width: auto; - margin-bottom: 0; } } - @media screen and (max-width: 39.9375em) { - .button-group.stacked-for-small.expanded { - display: block; } - .button-group.stacked-for-small.expanded .button { - display: block; - margin-right: 0; } } - -.card { - margin-bottom: 1rem; - border: 1px solid #e6e6e6; - border-radius: 0; - background: #fefefe; - box-shadow: none; - overflow: hidden; - color: #0a0a0a; } - .card > :last-child { - margin-bottom: 0; } - -.card-divider { - padding: 1rem; - background: #e6e6e6; } - .card-divider > :last-child { - margin-bottom: 0; } - -.card-section { - padding: 1rem; } - .card-section > :last-child { - margin-bottom: 0; } - -.callout { - position: relative; - margin: 0 0 1rem 0; - padding: 1rem; - border: 1px solid rgba(10, 10, 10, 0.25); - border-radius: 0; - background-color: white; - color: #0a0a0a; } - .callout > :first-child { - margin-top: 0; } - .callout > :last-child { - margin-bottom: 0; } - .callout.primary { - background-color: #d7ecfa; - color: #0a0a0a; } - .callout.secondary { - background-color: #eaeaea; - color: #0a0a0a; } - .callout.success { - background-color: #e1faea; - color: #0a0a0a; } - .callout.warning { - background-color: #fff3d9; - color: #0a0a0a; } - .callout.alert { - background-color: #f7e4e1; - color: #0a0a0a; } - .callout.small { - padding-top: 0.5rem; - padding-right: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 0.5rem; } - .callout.large { - padding-top: 3rem; - padding-right: 3rem; - padding-bottom: 3rem; - padding-left: 3rem; } - -.close-button { - position: absolute; - color: #8a8a8a; - cursor: pointer; } - [data-whatinput='mouse'] .close-button { - outline: 0; } - .close-button:hover, .close-button:focus { - color: #0a0a0a; } - .close-button.small { - right: 0.66rem; - top: 0.33em; - font-size: 1.5em; - line-height: 1; } - .close-button, .close-button.medium { - right: 1rem; - top: 0.5rem; - font-size: 2em; - line-height: 1; } - -.menu { - margin: 0; - list-style-type: none; } - .menu > li { - display: table-cell; - vertical-align: middle; } - [data-whatinput='mouse'] .menu > li { - outline: 0; } - .menu > li > a { - display: block; - padding: 0.7rem 1rem; - line-height: 1; } - .menu input, - .menu select, - .menu a, - .menu button { - margin-bottom: 0; } - .menu > li > a img, - .menu > li > a i, - .menu > li > a svg { - vertical-align: middle; } - .menu > li > a img + span, - .menu > li > a i + span, - .menu > li > a svg + span { - vertical-align: middle; } - .menu > li > a img, - .menu > li > a i, - .menu > li > a svg { - margin-right: 0.25rem; - display: inline-block; } - .menu > li, .menu.horizontal > li { - display: table-cell; } - .menu.expanded { - display: table; - width: 100%; - table-layout: fixed; } - .menu.expanded > li:first-child:last-child { - width: 100%; } - .menu.vertical > li { - display: block; } - @media print, screen and (min-width: 40em) { - .menu.medium-horizontal > li { - display: table-cell; } - .menu.medium-expanded { - display: table; - width: 100%; - table-layout: fixed; } - .menu.medium-expanded > li:first-child:last-child { - width: 100%; } - .menu.medium-vertical > li { - display: block; } } - @media print, screen and (min-width: 64em) { - .menu.large-horizontal > li { - display: table-cell; } - .menu.large-expanded { - display: table; - width: 100%; - table-layout: fixed; } - .menu.large-expanded > li:first-child:last-child { - width: 100%; } - .menu.large-vertical > li { - display: block; } } - .menu.simple li { - display: inline-block; - vertical-align: top; - line-height: 1; } - .menu.simple a { - padding: 0; } - .menu.simple li { - margin-left: 0; - margin-right: 1rem; } - .menu.simple.align-right li { - margin-right: 0; - margin-left: 1rem; } - .menu.align-right::before, .menu.align-right::after { - display: table; - content: ' '; } - .menu.align-right::after { - clear: both; } - .menu.align-right > li { - float: right; } - .menu.icon-top > li > a { - text-align: center; } - .menu.icon-top > li > a img, - .menu.icon-top > li > a i, - .menu.icon-top > li > a svg { - display: block; - margin: 0 auto 0.25rem; } - .menu.icon-top.vertical a > span { - margin: auto; } - .menu.nested { - margin-left: 1rem; } - .menu .active > a { - background: #1779ba; - color: #fefefe; } - .menu.menu-bordered li { - border: 1px solid #e6e6e6; } - .menu.menu-bordered li:not(:first-child) { - border-top: 0; } - .menu.menu-hover li:hover { - background-color: #e6e6e6; } - -.menu-text { - padding-top: 0; - padding-bottom: 0; - padding: 0.7rem 1rem; - font-weight: bold; - line-height: 1; - color: inherit; } - -.menu-centered { - text-align: center; } - .menu-centered > .menu { - display: inline-block; - vertical-align: top; } - -.no-js [data-responsive-menu] ul { - display: none; } - -.menu-icon { - position: relative; - display: inline-block; - vertical-align: middle; - width: 20px; - height: 16px; - cursor: pointer; } - .menu-icon::after { - position: absolute; - top: 0; - left: 0; - display: block; - width: 100%; - height: 2px; - background: #fefefe; - box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe; - content: ''; } - .menu-icon:hover::after { - background: #cacaca; - box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; } - -.menu-icon.dark { - position: relative; - display: inline-block; - vertical-align: middle; - width: 20px; - height: 16px; - cursor: pointer; } - .menu-icon.dark::after { - position: absolute; - top: 0; - left: 0; - display: block; - width: 100%; - height: 2px; - background: #0a0a0a; - box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; - content: ''; } - .menu-icon.dark:hover::after { - background: #8a8a8a; - box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; } - -.is-drilldown { - position: relative; - overflow: hidden; } - .is-drilldown li { - display: block; } - .is-drilldown.animate-height { - transition: height 0.5s; } - -.is-drilldown-submenu { - position: absolute; - top: 0; - left: 100%; - z-index: -1; - width: 100%; - background: #fefefe; - transition: transform 0.15s linear; } - .is-drilldown-submenu.is-active { - z-index: 1; - display: block; - -ms-transform: translateX(-100%); - transform: translateX(-100%); } - .is-drilldown-submenu.is-closing { - -ms-transform: translateX(100%); - transform: translateX(100%); } - -.drilldown-submenu-cover-previous { - min-height: 100%; } - -.is-drilldown-submenu-parent > a { - position: relative; } - .is-drilldown-submenu-parent > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-right-width: 0; - border-left-style: solid; - border-color: transparent transparent transparent #1779ba; - position: absolute; - top: 50%; - margin-top: -6px; - right: 1rem; } - -.js-drilldown-back > a::before { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-left-width: 0; - border-right-style: solid; - border-color: transparent #1779ba transparent transparent; - border-left-width: 0; - display: inline-block; - vertical-align: middle; - margin-right: 0.75rem; - border-left-width: 0; } - -.dropdown-pane { - position: absolute; - z-index: 10; - display: block; - width: 300px; - padding: 1rem; - visibility: hidden; - border: 1px solid #cacaca; - border-radius: 0; - background-color: #fefefe; - font-size: 1rem; } - .dropdown-pane.is-open { - visibility: visible; } - -.dropdown-pane.tiny { - width: 100px; } - -.dropdown-pane.small { - width: 200px; } - -.dropdown-pane.large { - width: 400px; } - -.dropdown.menu > li.opens-left > .is-dropdown-submenu { - top: 100%; - right: 0; - left: auto; } - -.dropdown.menu > li.opens-right > .is-dropdown-submenu { - top: 100%; - right: auto; - left: 0; } - -.dropdown.menu > li.is-dropdown-submenu-parent > a { - position: relative; - padding-right: 1.5rem; } - -.dropdown.menu > li.is-dropdown-submenu-parent > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-bottom-width: 0; - border-top-style: solid; - border-color: #1779ba transparent transparent; - right: 5px; - margin-top: -3px; } - -[data-whatinput='mouse'] .dropdown.menu a { - outline: 0; } - -.no-js .dropdown.menu ul { - display: none; } - -.dropdown.menu.vertical > li .is-dropdown-submenu { - top: 0; } - -.dropdown.menu.vertical > li.opens-left > .is-dropdown-submenu { - right: 100%; - left: auto; } - -.dropdown.menu.vertical > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 100%; } - -.dropdown.menu.vertical > li > a::after { - right: 14px; } - -.dropdown.menu.vertical > li.opens-left > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-left-width: 0; - border-right-style: solid; - border-color: transparent #1779ba transparent transparent; } - -.dropdown.menu.vertical > li.opens-right > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-right-width: 0; - border-left-style: solid; - border-color: transparent transparent transparent #1779ba; } - -@media print, screen and (min-width: 40em) { - .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu { - top: 100%; - right: 0; - left: auto; } - .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu { - top: 100%; - right: auto; - left: 0; } - .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a { - position: relative; - padding-right: 1.5rem; } - .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-bottom-width: 0; - border-top-style: solid; - border-color: #1779ba transparent transparent; - right: 5px; - margin-top: -3px; } - .dropdown.menu.medium-vertical > li .is-dropdown-submenu { - top: 0; } - .dropdown.menu.medium-vertical > li.opens-left > .is-dropdown-submenu { - right: 100%; - left: auto; } - .dropdown.menu.medium-vertical > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 100%; } - .dropdown.menu.medium-vertical > li > a::after { - right: 14px; } - .dropdown.menu.medium-vertical > li.opens-left > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-left-width: 0; - border-right-style: solid; - border-color: transparent #1779ba transparent transparent; } - .dropdown.menu.medium-vertical > li.opens-right > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-right-width: 0; - border-left-style: solid; - border-color: transparent transparent transparent #1779ba; } } - -@media print, screen and (min-width: 64em) { - .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu { - top: 100%; - right: 0; - left: auto; } - .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu { - top: 100%; - right: auto; - left: 0; } - .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a { - position: relative; - padding-right: 1.5rem; } - .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-bottom-width: 0; - border-top-style: solid; - border-color: #1779ba transparent transparent; - right: 5px; - margin-top: -3px; } - .dropdown.menu.large-vertical > li .is-dropdown-submenu { - top: 0; } - .dropdown.menu.large-vertical > li.opens-left > .is-dropdown-submenu { - right: 100%; - left: auto; } - .dropdown.menu.large-vertical > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 100%; } - .dropdown.menu.large-vertical > li > a::after { - right: 14px; } - .dropdown.menu.large-vertical > li.opens-left > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-left-width: 0; - border-right-style: solid; - border-color: transparent #1779ba transparent transparent; } - .dropdown.menu.large-vertical > li.opens-right > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-right-width: 0; - border-left-style: solid; - border-color: transparent transparent transparent #1779ba; } } - -.dropdown.menu.align-right .is-dropdown-submenu.first-sub { - top: 100%; - right: 0; - left: auto; } - -.is-dropdown-menu.vertical { - width: 100px; } - .is-dropdown-menu.vertical.align-right { - float: right; } - -.is-dropdown-submenu-parent { - position: relative; } - .is-dropdown-submenu-parent a::after { - position: absolute; - top: 50%; - right: 5px; - margin-top: -6px; } - .is-dropdown-submenu-parent.opens-inner > .is-dropdown-submenu { - top: 100%; - left: auto; } - .is-dropdown-submenu-parent.opens-left > .is-dropdown-submenu { - right: 100%; - left: auto; } - .is-dropdown-submenu-parent.opens-right > .is-dropdown-submenu { - right: auto; - left: 100%; } - -.is-dropdown-submenu { - position: absolute; - top: 0; - left: 100%; - z-index: 1; - display: none; - min-width: 200px; - border: 1px solid #cacaca; - background: #fefefe; } - .is-dropdown-submenu .is-dropdown-submenu-parent > a::after { - right: 14px; } - .is-dropdown-submenu .is-dropdown-submenu-parent.opens-left > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-left-width: 0; - border-right-style: solid; - border-color: transparent #1779ba transparent transparent; } - .is-dropdown-submenu .is-dropdown-submenu-parent.opens-right > a::after { - display: block; - width: 0; - height: 0; - border: inset 6px; - content: ''; - border-right-width: 0; - border-left-style: solid; - border-color: transparent transparent transparent #1779ba; } - .is-dropdown-submenu .is-dropdown-submenu { - margin-top: -1px; } - .is-dropdown-submenu > li { - width: 100%; } - .is-dropdown-submenu.js-dropdown-active { - display: block; } - -.responsive-embed, -.flex-video { - position: relative; - height: 0; - margin-bottom: 1rem; - padding-bottom: 75%; - overflow: hidden; } - .responsive-embed iframe, - .responsive-embed object, - .responsive-embed embed, - .responsive-embed video, - .flex-video iframe, - .flex-video object, - .flex-video embed, - .flex-video video { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; } - .responsive-embed.widescreen, - .flex-video.widescreen { - padding-bottom: 56.25%; } - -.label { - display: inline-block; - padding: 0.33333rem 0.5rem; - border-radius: 0; - font-size: 0.8rem; - line-height: 1; - white-space: nowrap; - cursor: default; - background: #1779ba; - color: #fefefe; } - .label.primary { - background: #1779ba; - color: #fefefe; } - .label.secondary { - background: #767676; - color: #fefefe; } - .label.success { - background: #3adb76; - color: #0a0a0a; } - .label.warning { - background: #ffae00; - color: #0a0a0a; } - .label.alert { - background: #cc4b37; - color: #fefefe; } - -.media-object { - display: block; - margin-bottom: 1rem; } - .media-object img { - max-width: none; } - @media screen and (max-width: 39.9375em) { - .media-object.stack-for-small .media-object-section { - padding: 0; - padding-bottom: 1rem; - display: block; } - .media-object.stack-for-small .media-object-section img { - width: 100%; } } - -.media-object-section { - display: table-cell; - vertical-align: top; } - .media-object-section:first-child { - padding-right: 1rem; } - .media-object-section:last-child:not(:nth-child(2)) { - padding-left: 1rem; } - .media-object-section > :last-child { - margin-bottom: 0; } - .media-object-section.middle { - vertical-align: middle; } - .media-object-section.bottom { - vertical-align: bottom; } - -.is-off-canvas-open { - overflow: hidden; } - -.js-off-canvas-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - transition: opacity 0.5s ease, visibility 0.5s ease; - background: rgba(254, 254, 254, 0.25); - opacity: 0; - visibility: hidden; - overflow: hidden; } - .js-off-canvas-overlay.is-visible { - opacity: 1; - visibility: visible; } - .js-off-canvas-overlay.is-closable { - cursor: pointer; } - .js-off-canvas-overlay.is-overlay-absolute { - position: absolute; } - .js-off-canvas-overlay.is-overlay-fixed { - position: fixed; } - -.off-canvas-wrapper { - position: relative; - overflow: hidden; } - -.off-canvas { - position: fixed; - z-index: 1; - transition: transform 0.5s ease; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - background: #e6e6e6; } - [data-whatinput='mouse'] .off-canvas { - outline: 0; } - .off-canvas.is-transition-overlap { - z-index: 10; } - .off-canvas.is-transition-overlap.is-open { - box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); } - .off-canvas.is-open { - -ms-transform: translate(0, 0); - transform: translate(0, 0); } - -.off-canvas-absolute { - position: absolute; - z-index: 1; - transition: transform 0.5s ease; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - background: #e6e6e6; } - [data-whatinput='mouse'] .off-canvas-absolute { - outline: 0; } - .off-canvas-absolute.is-transition-overlap { - z-index: 10; } - .off-canvas-absolute.is-transition-overlap.is-open { - box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); } - .off-canvas-absolute.is-open { - -ms-transform: translate(0, 0); - transform: translate(0, 0); } - -.position-left { - top: 0; - left: 0; - width: 250px; - height: 100%; - -ms-transform: translateX(-250px); - transform: translateX(-250px); - overflow-y: auto; } - .position-left.is-open ~ .off-canvas-content { - -ms-transform: translateX(250px); - transform: translateX(250px); } - .position-left.is-transition-push::after { - position: absolute; - top: 0; - right: 0; - height: 100%; - width: 1px; - box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); - content: " "; } - .position-left.is-transition-overlap.is-open ~ .off-canvas-content { - -ms-transform: none; - transform: none; } - -.position-right { - top: 0; - right: 0; - width: 250px; - height: 100%; - -ms-transform: translateX(250px); - transform: translateX(250px); - overflow-y: auto; } - .position-right.is-open ~ .off-canvas-content { - -ms-transform: translateX(-250px); - transform: translateX(-250px); } - .position-right.is-transition-push::after { - position: absolute; - top: 0; - left: 0; - height: 100%; - width: 1px; - box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); - content: " "; } - .position-right.is-transition-overlap.is-open ~ .off-canvas-content { - -ms-transform: none; - transform: none; } - -.position-top { - top: 0; - left: 0; - width: 100%; - height: 250px; - -ms-transform: translateY(-250px); - transform: translateY(-250px); - overflow-x: auto; } - .position-top.is-open ~ .off-canvas-content { - -ms-transform: translateY(250px); - transform: translateY(250px); } - .position-top.is-transition-push::after { - position: absolute; - bottom: 0; - left: 0; - height: 1px; - width: 100%; - box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); - content: " "; } - .position-top.is-transition-overlap.is-open ~ .off-canvas-content { - -ms-transform: none; - transform: none; } - -.position-bottom { - bottom: 0; - left: 0; - width: 100%; - height: 250px; - -ms-transform: translateY(250px); - transform: translateY(250px); - overflow-x: auto; } - .position-bottom.is-open ~ .off-canvas-content { - -ms-transform: translateY(-250px); - transform: translateY(-250px); } - .position-bottom.is-transition-push::after { - position: absolute; - top: 0; - left: 0; - height: 1px; - width: 100%; - box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); - content: " "; } - .position-bottom.is-transition-overlap.is-open ~ .off-canvas-content { - -ms-transform: none; - transform: none; } - -.off-canvas-content { - transition: transform 0.5s ease; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -@media print, screen and (min-width: 40em) { - .position-left.reveal-for-medium { - -ms-transform: none; - transform: none; - z-index: 1; } - .position-left.reveal-for-medium ~ .off-canvas-content { - margin-left: 250px; } - .position-right.reveal-for-medium { - -ms-transform: none; - transform: none; - z-index: 1; } - .position-right.reveal-for-medium ~ .off-canvas-content { - margin-right: 250px; } - .position-top.reveal-for-medium { - -ms-transform: none; - transform: none; - z-index: 1; } - .position-top.reveal-for-medium ~ .off-canvas-content { - margin-top: 250px; } - .position-bottom.reveal-for-medium { - -ms-transform: none; - transform: none; - z-index: 1; } - .position-bottom.reveal-for-medium ~ .off-canvas-content { - margin-bottom: 250px; } } - -@media print, screen and (min-width: 64em) { - .position-left.reveal-for-large { - -ms-transform: none; - transform: none; - z-index: 1; } - .position-left.reveal-for-large ~ .off-canvas-content { - margin-left: 250px; } - .position-right.reveal-for-large { - -ms-transform: none; - transform: none; - z-index: 1; } - .position-right.reveal-for-large ~ .off-canvas-content { - margin-right: 250px; } - .position-top.reveal-for-large { - -ms-transform: none; - transform: none; - z-index: 1; } - .position-top.reveal-for-large ~ .off-canvas-content { - margin-top: 250px; } - .position-bottom.reveal-for-large { - -ms-transform: none; - transform: none; - z-index: 1; } - .position-bottom.reveal-for-large ~ .off-canvas-content { - margin-bottom: 250px; } } - -.orbit { - position: relative; } - -.orbit-container { - position: relative; - height: 0; - margin: 0; - list-style: none; - overflow: hidden; } - -.orbit-slide { - width: 100%; } - .orbit-slide.no-motionui.is-active { - top: 0; - left: 0; } - -.orbit-figure { - margin: 0; } - -.orbit-image { - width: 100%; - max-width: 100%; - margin: 0; } - -.orbit-caption { - position: absolute; - bottom: 0; - width: 100%; - margin-bottom: 0; - padding: 1rem; - background-color: rgba(10, 10, 10, 0.5); - color: #fefefe; } - -.orbit-previous, .orbit-next { - position: absolute; - top: 50%; - -ms-transform: translateY(-50%); - transform: translateY(-50%); - z-index: 10; - padding: 1rem; - color: #fefefe; } - [data-whatinput='mouse'] .orbit-previous, [data-whatinput='mouse'] .orbit-next { - outline: 0; } - .orbit-previous:hover, .orbit-next:hover, .orbit-previous:active, .orbit-next:active, .orbit-previous:focus, .orbit-next:focus { - background-color: rgba(10, 10, 10, 0.5); } - -.orbit-previous { - left: 0; } - -.orbit-next { - left: auto; - right: 0; } - -.orbit-bullets { - position: relative; - margin-top: 0.8rem; - margin-bottom: 0.8rem; - text-align: center; } - [data-whatinput='mouse'] .orbit-bullets { - outline: 0; } - .orbit-bullets button { - width: 1.2rem; - height: 1.2rem; - margin: 0.1rem; - border-radius: 50%; - background-color: #cacaca; } - .orbit-bullets button:hover { - background-color: #8a8a8a; } - .orbit-bullets button.is-active { - background-color: #8a8a8a; } - -.pagination { - margin-left: 0; - margin-bottom: 1rem; } - .pagination::before, .pagination::after { - display: table; - content: ' '; } - .pagination::after { - clear: both; } - .pagination li { - margin-right: 0.0625rem; - border-radius: 0; - font-size: 0.875rem; - display: none; } - .pagination li:last-child, .pagination li:first-child { - display: inline-block; } - @media print, screen and (min-width: 40em) { - .pagination li { - display: inline-block; } } - .pagination a, - .pagination button { - display: block; - padding: 0.1875rem 0.625rem; - border-radius: 0; - color: #0a0a0a; } - .pagination a:hover, - .pagination button:hover { - background: #e6e6e6; } - .pagination .current { - padding: 0.1875rem 0.625rem; - background: #1779ba; - color: #fefefe; - cursor: default; } - .pagination .disabled { - padding: 0.1875rem 0.625rem; - color: #cacaca; - cursor: not-allowed; } - .pagination .disabled:hover { - background: transparent; } - .pagination .ellipsis::after { - padding: 0.1875rem 0.625rem; - content: '\2026'; - color: #0a0a0a; } - -.pagination-previous a::before, -.pagination-previous.disabled::before { - display: inline-block; - margin-right: 0.5rem; - content: '\00ab'; } - -.pagination-next a::after, -.pagination-next.disabled::after { - display: inline-block; - margin-left: 0.5rem; - content: '\00bb'; } - -.progress { - height: 1rem; - margin-bottom: 1rem; - border-radius: 0; - background-color: #cacaca; } - .progress.primary .progress-meter { - background-color: #1779ba; } - .progress.secondary .progress-meter { - background-color: #767676; } - .progress.success .progress-meter { - background-color: #3adb76; } - .progress.warning .progress-meter { - background-color: #ffae00; } - .progress.alert .progress-meter { - background-color: #cc4b37; } - -.progress-meter { - position: relative; - display: block; - width: 0%; - height: 100%; - background-color: #1779ba; } - -.progress-meter-text { - position: absolute; - top: 50%; - left: 50%; - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - position: absolute; - margin: 0; - font-size: 0.75rem; - font-weight: bold; - color: #fefefe; - white-space: nowrap; } - -body.is-reveal-open { - overflow: hidden; } - -html.is-reveal-open, -html.is-reveal-open body { - min-height: 100%; - overflow: hidden; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -.reveal-overlay { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1005; - display: none; - background-color: rgba(10, 10, 10, 0.45); - overflow-y: scroll; } - -.reveal { - z-index: 1006; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - display: none; - padding: 1rem; - border: 1px solid #cacaca; - border-radius: 0; - background-color: #fefefe; - position: relative; - top: 100px; - margin-right: auto; - margin-left: auto; - overflow-y: auto; } - [data-whatinput='mouse'] .reveal { - outline: 0; } - @media print, screen and (min-width: 40em) { - .reveal { - min-height: 0; } } - .reveal .column, .reveal .columns, - .reveal .columns { - min-width: 0; } - .reveal > :last-child { - margin-bottom: 0; } - @media print, screen and (min-width: 40em) { - .reveal { - width: 600px; - max-width: 75rem; } } - @media print, screen and (min-width: 40em) { - .reveal .reveal { - right: auto; - left: auto; - margin: 0 auto; } } - .reveal.collapse { - padding: 0; } - @media print, screen and (min-width: 40em) { - .reveal.tiny { - width: 30%; - max-width: 75rem; } } - @media print, screen and (min-width: 40em) { - .reveal.small { - width: 50%; - max-width: 75rem; } } - @media print, screen and (min-width: 40em) { - .reveal.large { - width: 90%; - max-width: 75rem; } } - .reveal.full { - top: 0; - left: 0; - width: 100%; - max-width: none; - height: 100%; - height: 100vh; - min-height: 100vh; - margin-left: 0; - border: 0; - border-radius: 0; } - @media screen and (max-width: 39.9375em) { - .reveal { - top: 0; - left: 0; - width: 100%; - max-width: none; - height: 100%; - height: 100vh; - min-height: 100vh; - margin-left: 0; - border: 0; - border-radius: 0; } } - .reveal.without-overlay { - position: fixed; } - -.slider { - position: relative; - height: 0.5rem; - margin-top: 1.25rem; - margin-bottom: 2.25rem; - background-color: #e6e6e6; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -ms-touch-action: none; - touch-action: none; } - -.slider-fill { - position: absolute; - top: 0; - left: 0; - display: inline-block; - max-width: 100%; - height: 0.5rem; - background-color: #cacaca; - transition: all 0.2s ease-in-out; } - .slider-fill.is-dragging { - transition: all 0s linear; } - -.slider-handle { - position: absolute; - top: 50%; - -ms-transform: translateY(-50%); - transform: translateY(-50%); - position: absolute; - left: 0; - z-index: 1; - display: inline-block; - width: 1.4rem; - height: 1.4rem; - border-radius: 0; - background-color: #1779ba; - transition: all 0.2s ease-in-out; - -ms-touch-action: manipulation; - touch-action: manipulation; } - [data-whatinput='mouse'] .slider-handle { - outline: 0; } - .slider-handle:hover { - background-color: #14679e; } - .slider-handle.is-dragging { - transition: all 0s linear; } - -.slider.disabled, -.slider[disabled] { - opacity: 0.25; - cursor: not-allowed; } - -.slider.vertical { - display: inline-block; - width: 0.5rem; - height: 12.5rem; - margin: 0 1.25rem; - -ms-transform: scale(1, -1); - transform: scale(1, -1); } - .slider.vertical .slider-fill { - top: 0; - width: 0.5rem; - max-height: 100%; } - .slider.vertical .slider-handle { - position: absolute; - top: 0; - left: 50%; - width: 1.4rem; - height: 1.4rem; - -ms-transform: translateX(-50%); - transform: translateX(-50%); } - -.sticky-container { - position: relative; } - -.sticky { - position: relative; - z-index: 0; - transform: translate3d(0, 0, 0); } - -.sticky.is-stuck { - position: fixed; - z-index: 5; } - .sticky.is-stuck.is-at-top { - top: 0; } - .sticky.is-stuck.is-at-bottom { - bottom: 0; } - -.sticky.is-anchored { - position: relative; - right: auto; - left: auto; } - .sticky.is-anchored.is-at-bottom { - bottom: 0; } - -.switch { - height: 2rem; - position: relative; - margin-bottom: 1rem; - outline: 0; - font-size: 0.875rem; - font-weight: bold; - color: #fefefe; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -.switch-input { - position: absolute; - margin-bottom: 0; - opacity: 0; } - -.switch-paddle { - position: relative; - display: block; - width: 4rem; - height: 2rem; - border-radius: 0; - background: #cacaca; - transition: all 0.25s ease-out; - font-weight: inherit; - color: inherit; - cursor: pointer; } - input + .switch-paddle { - margin: 0; } - .switch-paddle::after { - position: absolute; - top: 0.25rem; - left: 0.25rem; - display: block; - width: 1.5rem; - height: 1.5rem; - transform: translate3d(0, 0, 0); - border-radius: 0; - background: #fefefe; - transition: all 0.25s ease-out; - content: ''; } - input:checked ~ .switch-paddle { - background: #1779ba; } - input:checked ~ .switch-paddle::after { - left: 2.25rem; } - [data-whatinput='mouse'] input:focus ~ .switch-paddle { - outline: 0; } - -.switch-active, .switch-inactive { - position: absolute; - top: 50%; - -ms-transform: translateY(-50%); - transform: translateY(-50%); } - -.switch-active { - left: 8%; - display: none; } - input:checked + label > .switch-active { - display: block; } - -.switch-inactive { - right: 15%; } - input:checked + label > .switch-inactive { - display: none; } - -.switch.tiny { - height: 1.5rem; } - .switch.tiny .switch-paddle { - width: 3rem; - height: 1.5rem; - font-size: 0.625rem; } - .switch.tiny .switch-paddle::after { - top: 0.25rem; - left: 0.25rem; - width: 1rem; - height: 1rem; } - .switch.tiny input:checked ~ .switch-paddle::after { - left: 1.75rem; } - -.switch.small { - height: 1.75rem; } - .switch.small .switch-paddle { - width: 3.5rem; - height: 1.75rem; - font-size: 0.75rem; } - .switch.small .switch-paddle::after { - top: 0.25rem; - left: 0.25rem; - width: 1.25rem; - height: 1.25rem; } - .switch.small input:checked ~ .switch-paddle::after { - left: 2rem; } - -.switch.large { - height: 2.5rem; } - .switch.large .switch-paddle { - width: 5rem; - height: 2.5rem; - font-size: 1rem; } - .switch.large .switch-paddle::after { - top: 0.25rem; - left: 0.25rem; - width: 2rem; - height: 2rem; } - .switch.large input:checked ~ .switch-paddle::after { - left: 2.75rem; } - -table { - width: 100%; - margin-bottom: 1rem; - border-radius: 0; } - table thead, - table tbody, - table tfoot { - border: 1px solid #f1f1f1; - background-color: #fefefe; } - table caption { - padding: 0.5rem 0.625rem 0.625rem; - font-weight: bold; } - table thead { - background: #f8f8f8; - color: #0a0a0a; } - table tfoot { - background: #f1f1f1; - color: #0a0a0a; } - table thead tr, - table tfoot tr { - background: transparent; } - table thead th, - table thead td, - table tfoot th, - table tfoot td { - padding: 0.5rem 0.625rem 0.625rem; - font-weight: bold; - text-align: left; } - table tbody th, - table tbody td { - padding: 0.5rem 0.625rem 0.625rem; } - table tbody tr:nth-child(even) { - border-bottom: 0; - background-color: #f1f1f1; } - table.unstriped tbody { - background-color: #fefefe; } - table.unstriped tbody tr { - border-bottom: 0; - border-bottom: 1px solid #f1f1f1; - background-color: #fefefe; } - -@media screen and (max-width: 63.9375em) { - table.stack thead { - display: none; } - table.stack tfoot { - display: none; } - table.stack tr, - table.stack th, - table.stack td { - display: block; } - table.stack td { - border-top: 0; } } - -table.scroll { - display: block; - width: 100%; - overflow-x: auto; } - -table.hover thead tr:hover { - background-color: #f3f3f3; } - -table.hover tfoot tr:hover { - background-color: #ececec; } - -table.hover tbody tr:hover { - background-color: #f9f9f9; } - -table.hover:not(.unstriped) tr:nth-of-type(even):hover { - background-color: #ececec; } - -.table-scroll { - overflow-x: auto; } - .table-scroll table { - width: auto; } - -.tabs { - margin: 0; - border: 1px solid #e6e6e6; - background: #fefefe; - list-style-type: none; } - .tabs::before, .tabs::after { - display: table; - content: ' '; } - .tabs::after { - clear: both; } - -.tabs.vertical > li { - display: block; - float: none; - width: auto; } - -.tabs.simple > li > a { - padding: 0; } - .tabs.simple > li > a:hover { - background: transparent; } - -.tabs.primary { - background: #1779ba; } - .tabs.primary > li > a { - color: #fefefe; } - .tabs.primary > li > a:hover, .tabs.primary > li > a:focus { - background: #1673b1; } - -.tabs-title { - float: left; } - .tabs-title > a { - display: block; - padding: 1.25rem 1.5rem; - font-size: 0.75rem; - line-height: 1; - color: #1779ba; } - .tabs-title > a:hover { - background: #fefefe; - color: #1468a0; } - .tabs-title > a:focus, .tabs-title > a[aria-selected='true'] { - background: #e6e6e6; - color: #1779ba; } - -.tabs-content { - border: 1px solid #e6e6e6; - border-top: 0; - background: #fefefe; - color: #0a0a0a; - transition: all 0.5s ease; } - -.tabs-content.vertical { - border: 1px solid #e6e6e6; - border-left: 0; } - -.tabs-panel { - display: none; - padding: 1rem; } - .tabs-panel[aria-hidden="false"] { - display: block; } - -.thumbnail { - display: inline-block; - max-width: 100%; - margin-bottom: 1rem; - border: solid 4px #fefefe; - border-radius: 0; - box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); - line-height: 0; } - -a.thumbnail { - transition: box-shadow 200ms ease-out; } - a.thumbnail:hover, a.thumbnail:focus { - box-shadow: 0 0 6px 1px rgba(23, 121, 186, 0.5); } - a.thumbnail image { - box-shadow: none; } - -.title-bar { - padding: 0.5rem; - background: #0a0a0a; - color: #fefefe; } - .title-bar::before, .title-bar::after { - display: table; - content: ' '; } - .title-bar::after { - clear: both; } - .title-bar .menu-icon { - margin-left: 0.25rem; - margin-right: 0.25rem; } - -.title-bar-left { - float: left; } - -.title-bar-right { - float: right; - text-align: right; } - -.title-bar-title { - display: inline-block; - vertical-align: middle; - font-weight: bold; } - -.has-tip { - position: relative; - display: inline-block; - border-bottom: dotted 1px #8a8a8a; - font-weight: bold; - cursor: help; } - -.tooltip { - position: absolute; - top: calc(100% + 0.6495rem); - z-index: 1200; - max-width: 10rem; - padding: 0.75rem; - border-radius: 0; - background-color: #0a0a0a; - font-size: 80%; - color: #fefefe; } - .tooltip::before { - display: block; - width: 0; - height: 0; - border: inset 0.75rem; - content: ''; - border-top-width: 0; - border-bottom-style: solid; - border-color: transparent transparent #0a0a0a; - position: absolute; - bottom: 100%; - left: 50%; - -ms-transform: translateX(-50%); - transform: translateX(-50%); } - .tooltip.top::before { - display: block; - width: 0; - height: 0; - border: inset 0.75rem; - content: ''; - border-bottom-width: 0; - border-top-style: solid; - border-color: #0a0a0a transparent transparent; - top: 100%; - bottom: auto; } - .tooltip.left::before { - display: block; - width: 0; - height: 0; - border: inset 0.75rem; - content: ''; - border-right-width: 0; - border-left-style: solid; - border-color: transparent transparent transparent #0a0a0a; - top: 50%; - bottom: auto; - left: 100%; - -ms-transform: translateY(-50%); - transform: translateY(-50%); } - .tooltip.right::before { - display: block; - width: 0; - height: 0; - border: inset 0.75rem; - content: ''; - border-left-width: 0; - border-right-style: solid; - border-color: transparent #0a0a0a transparent transparent; - top: 50%; - right: 100%; - bottom: auto; - left: auto; - -ms-transform: translateY(-50%); - transform: translateY(-50%); } - -.top-bar { - padding: 0.5rem; } - .top-bar::before, .top-bar::after { - display: table; - content: ' '; } - .top-bar::after { - clear: both; } - .top-bar, - .top-bar ul { - background-color: #e6e6e6; } - .top-bar input { - max-width: 200px; - margin-right: 1rem; } - .top-bar .input-group-field { - width: 100%; - margin-right: 0; } - .top-bar input.button { - width: auto; } - .top-bar .top-bar-left, - .top-bar .top-bar-right { - width: 100%; } - @media print, screen and (min-width: 40em) { - .top-bar .top-bar-left, - .top-bar .top-bar-right { - width: auto; } } - @media screen and (max-width: 63.9375em) { - .top-bar.stacked-for-medium .top-bar-left, - .top-bar.stacked-for-medium .top-bar-right { - width: 100%; } } - @media screen and (max-width: 74.9375em) { - .top-bar.stacked-for-large .top-bar-left, - .top-bar.stacked-for-large .top-bar-right { - width: 100%; } } - -.top-bar-title { - display: inline-block; - float: left; - padding: 0.5rem 1rem 0.5rem 0; } - .top-bar-title .menu-icon { - bottom: 2px; } - -.top-bar-left { - float: left; } - -.top-bar-right { - float: right; } - -.hide { - display: none !important; } - -.invisible { - visibility: hidden; } - -@media screen and (max-width: 39.9375em) { - .hide-for-small-only { - display: none !important; } } - -@media screen and (max-width: 0em), screen and (min-width: 40em) { - .show-for-small-only { - display: none !important; } } - -@media print, screen and (min-width: 40em) { - .hide-for-medium { - display: none !important; } } - -@media screen and (max-width: 39.9375em) { - .show-for-medium { - display: none !important; } } - -@media screen and (min-width: 40em) and (max-width: 63.9375em) { - .hide-for-medium-only { - display: none !important; } } - -@media screen and (max-width: 39.9375em), screen and (min-width: 64em) { - .show-for-medium-only { - display: none !important; } } - -@media print, screen and (min-width: 64em) { - .hide-for-large { - display: none !important; } } - -@media screen and (max-width: 63.9375em) { - .show-for-large { - display: none !important; } } - -@media screen and (min-width: 64em) and (max-width: 74.9375em) { - .hide-for-large-only { - display: none !important; } } - -@media screen and (max-width: 63.9375em), screen and (min-width: 75em) { - .show-for-large-only { - display: none !important; } } - -.show-for-sr, -.show-on-focus { - position: absolute !important; - width: 1px; - height: 1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); } - -.show-on-focus:active, .show-on-focus:focus { - position: static !important; - width: auto; - height: auto; - overflow: visible; - clip: auto; } - -.show-for-landscape, -.hide-for-portrait { - display: block !important; } - @media screen and (orientation: landscape) { - .show-for-landscape, - .hide-for-portrait { - display: block !important; } } - @media screen and (orientation: portrait) { - .show-for-landscape, - .hide-for-portrait { - display: none !important; } } - -.hide-for-landscape, -.show-for-portrait { - display: none !important; } - @media screen and (orientation: landscape) { - .hide-for-landscape, - .show-for-portrait { - display: none !important; } } - @media screen and (orientation: portrait) { - .hide-for-landscape, - .show-for-portrait { - display: block !important; } } - -.float-left { - float: left !important; } - -.float-right { - float: right !important; } - -.float-center { - display: block; - margin-right: auto; - margin-left: auto; } - -.clearfix::before, .clearfix::after { - display: table; - content: ' '; } - -.clearfix::after { - clear: both; } - -.slide-in-down.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: translateY(-100%); - transform: translateY(-100%); - transition-property: transform, opacity; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.slide-in-down.mui-enter.mui-enter-active { - -ms-transform: translateY(0); - transform: translateY(0); } - -.slide-in-left.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: translateX(-100%); - transform: translateX(-100%); - transition-property: transform, opacity; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.slide-in-left.mui-enter.mui-enter-active { - -ms-transform: translateX(0); - transform: translateX(0); } - -.slide-in-up.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: translateY(100%); - transform: translateY(100%); - transition-property: transform, opacity; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.slide-in-up.mui-enter.mui-enter-active { - -ms-transform: translateY(0); - transform: translateY(0); } - -.slide-in-right.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: translateX(100%); - transform: translateX(100%); - transition-property: transform, opacity; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.slide-in-right.mui-enter.mui-enter-active { - -ms-transform: translateX(0); - transform: translateX(0); } - -.slide-out-down.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: translateY(0); - transform: translateY(0); - transition-property: transform, opacity; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.slide-out-down.mui-leave.mui-leave-active { - -ms-transform: translateY(100%); - transform: translateY(100%); } - -.slide-out-right.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: translateX(0); - transform: translateX(0); - transition-property: transform, opacity; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.slide-out-right.mui-leave.mui-leave-active { - -ms-transform: translateX(100%); - transform: translateX(100%); } - -.slide-out-up.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: translateY(0); - transform: translateY(0); - transition-property: transform, opacity; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.slide-out-up.mui-leave.mui-leave-active { - -ms-transform: translateY(-100%); - transform: translateY(-100%); } - -.slide-out-left.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: translateX(0); - transform: translateX(0); - transition-property: transform, opacity; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.slide-out-left.mui-leave.mui-leave-active { - -ms-transform: translateX(-100%); - transform: translateX(-100%); } - -.fade-in.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - opacity: 0; - transition-property: opacity; } - -.fade-in.mui-enter.mui-enter-active { - opacity: 1; } - -.fade-out.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - opacity: 1; - transition-property: opacity; } - -.fade-out.mui-leave.mui-leave-active { - opacity: 0; } - -.hinge-in-from-top.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotateX(-90deg); - -ms-transform-origin: top; - transform-origin: top; - transition-property: transform, opacity; - opacity: 0; } - -.hinge-in-from-top.mui-enter.mui-enter-active { - transform: perspective(2000px) rotate(0deg); - opacity: 1; } - -.hinge-in-from-right.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotateY(-90deg); - -ms-transform-origin: right; - transform-origin: right; - transition-property: transform, opacity; - opacity: 0; } - -.hinge-in-from-right.mui-enter.mui-enter-active { - transform: perspective(2000px) rotate(0deg); - opacity: 1; } - -.hinge-in-from-bottom.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotateX(90deg); - -ms-transform-origin: bottom; - transform-origin: bottom; - transition-property: transform, opacity; - opacity: 0; } - -.hinge-in-from-bottom.mui-enter.mui-enter-active { - transform: perspective(2000px) rotate(0deg); - opacity: 1; } - -.hinge-in-from-left.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotateY(90deg); - -ms-transform-origin: left; - transform-origin: left; - transition-property: transform, opacity; - opacity: 0; } - -.hinge-in-from-left.mui-enter.mui-enter-active { - transform: perspective(2000px) rotate(0deg); - opacity: 1; } - -.hinge-in-from-middle-x.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotateX(-90deg); - -ms-transform-origin: center; - transform-origin: center; - transition-property: transform, opacity; - opacity: 0; } - -.hinge-in-from-middle-x.mui-enter.mui-enter-active { - transform: perspective(2000px) rotate(0deg); - opacity: 1; } - -.hinge-in-from-middle-y.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotateY(-90deg); - -ms-transform-origin: center; - transform-origin: center; - transition-property: transform, opacity; - opacity: 0; } - -.hinge-in-from-middle-y.mui-enter.mui-enter-active { - transform: perspective(2000px) rotate(0deg); - opacity: 1; } - -.hinge-out-from-top.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotate(0deg); - -ms-transform-origin: top; - transform-origin: top; - transition-property: transform, opacity; - opacity: 1; } - -.hinge-out-from-top.mui-leave.mui-leave-active { - transform: perspective(2000px) rotateX(-90deg); - opacity: 0; } - -.hinge-out-from-right.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotate(0deg); - -ms-transform-origin: right; - transform-origin: right; - transition-property: transform, opacity; - opacity: 1; } - -.hinge-out-from-right.mui-leave.mui-leave-active { - transform: perspective(2000px) rotateY(-90deg); - opacity: 0; } - -.hinge-out-from-bottom.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotate(0deg); - -ms-transform-origin: bottom; - transform-origin: bottom; - transition-property: transform, opacity; - opacity: 1; } - -.hinge-out-from-bottom.mui-leave.mui-leave-active { - transform: perspective(2000px) rotateX(90deg); - opacity: 0; } - -.hinge-out-from-left.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotate(0deg); - -ms-transform-origin: left; - transform-origin: left; - transition-property: transform, opacity; - opacity: 1; } - -.hinge-out-from-left.mui-leave.mui-leave-active { - transform: perspective(2000px) rotateY(90deg); - opacity: 0; } - -.hinge-out-from-middle-x.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotate(0deg); - -ms-transform-origin: center; - transform-origin: center; - transition-property: transform, opacity; - opacity: 1; } - -.hinge-out-from-middle-x.mui-leave.mui-leave-active { - transform: perspective(2000px) rotateX(-90deg); - opacity: 0; } - -.hinge-out-from-middle-y.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - transform: perspective(2000px) rotate(0deg); - -ms-transform-origin: center; - transform-origin: center; - transition-property: transform, opacity; - opacity: 1; } - -.hinge-out-from-middle-y.mui-leave.mui-leave-active { - transform: perspective(2000px) rotateY(-90deg); - opacity: 0; } - -.scale-in-up.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: scale(0.5); - transform: scale(0.5); - transition-property: transform, opacity; - opacity: 0; } - -.scale-in-up.mui-enter.mui-enter-active { - -ms-transform: scale(1); - transform: scale(1); - opacity: 1; } - -.scale-in-down.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: scale(1.5); - transform: scale(1.5); - transition-property: transform, opacity; - opacity: 0; } - -.scale-in-down.mui-enter.mui-enter-active { - -ms-transform: scale(1); - transform: scale(1); - opacity: 1; } - -.scale-out-up.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: scale(1); - transform: scale(1); - transition-property: transform, opacity; - opacity: 1; } - -.scale-out-up.mui-leave.mui-leave-active { - -ms-transform: scale(1.5); - transform: scale(1.5); - opacity: 0; } - -.scale-out-down.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: scale(1); - transform: scale(1); - transition-property: transform, opacity; - opacity: 1; } - -.scale-out-down.mui-leave.mui-leave-active { - -ms-transform: scale(0.5); - transform: scale(0.5); - opacity: 0; } - -.spin-in.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: rotate(-0.75turn); - transform: rotate(-0.75turn); - transition-property: transform, opacity; - opacity: 0; } - -.spin-in.mui-enter.mui-enter-active { - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; } - -.spin-out.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: rotate(0); - transform: rotate(0); - transition-property: transform, opacity; - opacity: 1; } - -.spin-out.mui-leave.mui-leave-active { - -ms-transform: rotate(0.75turn); - transform: rotate(0.75turn); - opacity: 0; } - -.spin-in-ccw.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: rotate(0.75turn); - transform: rotate(0.75turn); - transition-property: transform, opacity; - opacity: 0; } - -.spin-in-ccw.mui-enter.mui-enter-active { - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; } - -.spin-out-ccw.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -ms-transform: rotate(0); - transform: rotate(0); - transition-property: transform, opacity; - opacity: 1; } - -.spin-out-ccw.mui-leave.mui-leave-active { - -ms-transform: rotate(-0.75turn); - transform: rotate(-0.75turn); - opacity: 0; } - -.slow { - transition-duration: 750ms !important; } - -.fast { - transition-duration: 250ms !important; } - -.linear { - transition-timing-function: linear !important; } - -.ease { - transition-timing-function: ease !important; } - -.ease-in { - transition-timing-function: ease-in !important; } - -.ease-out { - transition-timing-function: ease-out !important; } - -.ease-in-out { - transition-timing-function: ease-in-out !important; } - -.bounce-in { - transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } - -.bounce-out { - transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } - -.bounce-in-out { - transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } - -.short-delay { - transition-delay: 300ms !important; } - -.long-delay { - transition-delay: 700ms !important; } - -.shake { - animation-name: shake-7; } - -@keyframes shake-7 { - 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% { - transform: translateX(7%); } - 5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% { - transform: translateX(-7%); } } - -.spin-cw { - animation-name: spin-cw-1turn; } - -@keyframes spin-cw-1turn { - 0% { - transform: rotate(-1turn); } - 100% { - transform: rotate(0); } } - -.spin-ccw { - animation-name: spin-cw-1turn; } - -@keyframes spin-cw-1turn { - 0% { - transform: rotate(0); } - 100% { - transform: rotate(1turn); } } - -.wiggle { - animation-name: wiggle-7deg; } - -@keyframes wiggle-7deg { - 40%, 50%, 60% { - transform: rotate(7deg); } - 35%, 45%, 55%, 65% { - transform: rotate(-7deg); } - 0%, 30%, 70%, 100% { - transform: rotate(0); } } - -.shake, -.spin-cw, -.spin-ccw, -.wiggle { - animation-duration: 500ms; } - -.infinite { - animation-iteration-count: infinite; } - -.slow { - animation-duration: 750ms !important; } - -.fast { - animation-duration: 250ms !important; } - -.linear { - animation-timing-function: linear !important; } - -.ease { - animation-timing-function: ease !important; } - -.ease-in { - animation-timing-function: ease-in !important; } - -.ease-out { - animation-timing-function: ease-out !important; } - -.ease-in-out { - animation-timing-function: ease-in-out !important; } - -.bounce-in { - animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; } - -.bounce-out { - animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; } - -.bounce-in-out { - animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; } - -.short-delay { - animation-delay: 300ms !important; } - -.long-delay { - animation-delay: 700ms !important; } diff --git a/pkgs/csslib/test/examples/materialize.css b/pkgs/csslib/test/examples/materialize.css deleted file mode 100644 index 77ff7497d..000000000 --- a/pkgs/csslib/test/examples/materialize.css +++ /dev/null @@ -1,8952 +0,0 @@ -/*! - * Materialize v0.98.2 (http://materializecss.com) - * Copyright 2014-2015 Materialize - * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) - */ -.materialize-red { - background-color: #e51c23 !important; -} - -.materialize-red-text { - color: #e51c23 !important; -} - -.materialize-red.lighten-5 { - background-color: #fdeaeb !important; -} - -.materialize-red-text.text-lighten-5 { - color: #fdeaeb !important; -} - -.materialize-red.lighten-4 { - background-color: #f8c1c3 !important; -} - -.materialize-red-text.text-lighten-4 { - color: #f8c1c3 !important; -} - -.materialize-red.lighten-3 { - background-color: #f3989b !important; -} - -.materialize-red-text.text-lighten-3 { - color: #f3989b !important; -} - -.materialize-red.lighten-2 { - background-color: #ee6e73 !important; -} - -.materialize-red-text.text-lighten-2 { - color: #ee6e73 !important; -} - -.materialize-red.lighten-1 { - background-color: #ea454b !important; -} - -.materialize-red-text.text-lighten-1 { - color: #ea454b !important; -} - -.materialize-red.darken-1 { - background-color: #d0181e !important; -} - -.materialize-red-text.text-darken-1 { - color: #d0181e !important; -} - -.materialize-red.darken-2 { - background-color: #b9151b !important; -} - -.materialize-red-text.text-darken-2 { - color: #b9151b !important; -} - -.materialize-red.darken-3 { - background-color: #a21318 !important; -} - -.materialize-red-text.text-darken-3 { - color: #a21318 !important; -} - -.materialize-red.darken-4 { - background-color: #8b1014 !important; -} - -.materialize-red-text.text-darken-4 { - color: #8b1014 !important; -} - -.red { - background-color: #F44336 !important; -} - -.red-text { - color: #F44336 !important; -} - -.red.lighten-5 { - background-color: #FFEBEE !important; -} - -.red-text.text-lighten-5 { - color: #FFEBEE !important; -} - -.red.lighten-4 { - background-color: #FFCDD2 !important; -} - -.red-text.text-lighten-4 { - color: #FFCDD2 !important; -} - -.red.lighten-3 { - background-color: #EF9A9A !important; -} - -.red-text.text-lighten-3 { - color: #EF9A9A !important; -} - -.red.lighten-2 { - background-color: #E57373 !important; -} - -.red-text.text-lighten-2 { - color: #E57373 !important; -} - -.red.lighten-1 { - background-color: #EF5350 !important; -} - -.red-text.text-lighten-1 { - color: #EF5350 !important; -} - -.red.darken-1 { - background-color: #E53935 !important; -} - -.red-text.text-darken-1 { - color: #E53935 !important; -} - -.red.darken-2 { - background-color: #D32F2F !important; -} - -.red-text.text-darken-2 { - color: #D32F2F !important; -} - -.red.darken-3 { - background-color: #C62828 !important; -} - -.red-text.text-darken-3 { - color: #C62828 !important; -} - -.red.darken-4 { - background-color: #B71C1C !important; -} - -.red-text.text-darken-4 { - color: #B71C1C !important; -} - -.red.accent-1 { - background-color: #FF8A80 !important; -} - -.red-text.text-accent-1 { - color: #FF8A80 !important; -} - -.red.accent-2 { - background-color: #FF5252 !important; -} - -.red-text.text-accent-2 { - color: #FF5252 !important; -} - -.red.accent-3 { - background-color: #FF1744 !important; -} - -.red-text.text-accent-3 { - color: #FF1744 !important; -} - -.red.accent-4 { - background-color: #D50000 !important; -} - -.red-text.text-accent-4 { - color: #D50000 !important; -} - -.pink { - background-color: #e91e63 !important; -} - -.pink-text { - color: #e91e63 !important; -} - -.pink.lighten-5 { - background-color: #fce4ec !important; -} - -.pink-text.text-lighten-5 { - color: #fce4ec !important; -} - -.pink.lighten-4 { - background-color: #f8bbd0 !important; -} - -.pink-text.text-lighten-4 { - color: #f8bbd0 !important; -} - -.pink.lighten-3 { - background-color: #f48fb1 !important; -} - -.pink-text.text-lighten-3 { - color: #f48fb1 !important; -} - -.pink.lighten-2 { - background-color: #f06292 !important; -} - -.pink-text.text-lighten-2 { - color: #f06292 !important; -} - -.pink.lighten-1 { - background-color: #ec407a !important; -} - -.pink-text.text-lighten-1 { - color: #ec407a !important; -} - -.pink.darken-1 { - background-color: #d81b60 !important; -} - -.pink-text.text-darken-1 { - color: #d81b60 !important; -} - -.pink.darken-2 { - background-color: #c2185b !important; -} - -.pink-text.text-darken-2 { - color: #c2185b !important; -} - -.pink.darken-3 { - background-color: #ad1457 !important; -} - -.pink-text.text-darken-3 { - color: #ad1457 !important; -} - -.pink.darken-4 { - background-color: #880e4f !important; -} - -.pink-text.text-darken-4 { - color: #880e4f !important; -} - -.pink.accent-1 { - background-color: #ff80ab !important; -} - -.pink-text.text-accent-1 { - color: #ff80ab !important; -} - -.pink.accent-2 { - background-color: #ff4081 !important; -} - -.pink-text.text-accent-2 { - color: #ff4081 !important; -} - -.pink.accent-3 { - background-color: #f50057 !important; -} - -.pink-text.text-accent-3 { - color: #f50057 !important; -} - -.pink.accent-4 { - background-color: #c51162 !important; -} - -.pink-text.text-accent-4 { - color: #c51162 !important; -} - -.purple { - background-color: #9c27b0 !important; -} - -.purple-text { - color: #9c27b0 !important; -} - -.purple.lighten-5 { - background-color: #f3e5f5 !important; -} - -.purple-text.text-lighten-5 { - color: #f3e5f5 !important; -} - -.purple.lighten-4 { - background-color: #e1bee7 !important; -} - -.purple-text.text-lighten-4 { - color: #e1bee7 !important; -} - -.purple.lighten-3 { - background-color: #ce93d8 !important; -} - -.purple-text.text-lighten-3 { - color: #ce93d8 !important; -} - -.purple.lighten-2 { - background-color: #ba68c8 !important; -} - -.purple-text.text-lighten-2 { - color: #ba68c8 !important; -} - -.purple.lighten-1 { - background-color: #ab47bc !important; -} - -.purple-text.text-lighten-1 { - color: #ab47bc !important; -} - -.purple.darken-1 { - background-color: #8e24aa !important; -} - -.purple-text.text-darken-1 { - color: #8e24aa !important; -} - -.purple.darken-2 { - background-color: #7b1fa2 !important; -} - -.purple-text.text-darken-2 { - color: #7b1fa2 !important; -} - -.purple.darken-3 { - background-color: #6a1b9a !important; -} - -.purple-text.text-darken-3 { - color: #6a1b9a !important; -} - -.purple.darken-4 { - background-color: #4a148c !important; -} - -.purple-text.text-darken-4 { - color: #4a148c !important; -} - -.purple.accent-1 { - background-color: #ea80fc !important; -} - -.purple-text.text-accent-1 { - color: #ea80fc !important; -} - -.purple.accent-2 { - background-color: #e040fb !important; -} - -.purple-text.text-accent-2 { - color: #e040fb !important; -} - -.purple.accent-3 { - background-color: #d500f9 !important; -} - -.purple-text.text-accent-3 { - color: #d500f9 !important; -} - -.purple.accent-4 { - background-color: #aa00ff !important; -} - -.purple-text.text-accent-4 { - color: #aa00ff !important; -} - -.deep-purple { - background-color: #673ab7 !important; -} - -.deep-purple-text { - color: #673ab7 !important; -} - -.deep-purple.lighten-5 { - background-color: #ede7f6 !important; -} - -.deep-purple-text.text-lighten-5 { - color: #ede7f6 !important; -} - -.deep-purple.lighten-4 { - background-color: #d1c4e9 !important; -} - -.deep-purple-text.text-lighten-4 { - color: #d1c4e9 !important; -} - -.deep-purple.lighten-3 { - background-color: #b39ddb !important; -} - -.deep-purple-text.text-lighten-3 { - color: #b39ddb !important; -} - -.deep-purple.lighten-2 { - background-color: #9575cd !important; -} - -.deep-purple-text.text-lighten-2 { - color: #9575cd !important; -} - -.deep-purple.lighten-1 { - background-color: #7e57c2 !important; -} - -.deep-purple-text.text-lighten-1 { - color: #7e57c2 !important; -} - -.deep-purple.darken-1 { - background-color: #5e35b1 !important; -} - -.deep-purple-text.text-darken-1 { - color: #5e35b1 !important; -} - -.deep-purple.darken-2 { - background-color: #512da8 !important; -} - -.deep-purple-text.text-darken-2 { - color: #512da8 !important; -} - -.deep-purple.darken-3 { - background-color: #4527a0 !important; -} - -.deep-purple-text.text-darken-3 { - color: #4527a0 !important; -} - -.deep-purple.darken-4 { - background-color: #311b92 !important; -} - -.deep-purple-text.text-darken-4 { - color: #311b92 !important; -} - -.deep-purple.accent-1 { - background-color: #b388ff !important; -} - -.deep-purple-text.text-accent-1 { - color: #b388ff !important; -} - -.deep-purple.accent-2 { - background-color: #7c4dff !important; -} - -.deep-purple-text.text-accent-2 { - color: #7c4dff !important; -} - -.deep-purple.accent-3 { - background-color: #651fff !important; -} - -.deep-purple-text.text-accent-3 { - color: #651fff !important; -} - -.deep-purple.accent-4 { - background-color: #6200ea !important; -} - -.deep-purple-text.text-accent-4 { - color: #6200ea !important; -} - -.indigo { - background-color: #3f51b5 !important; -} - -.indigo-text { - color: #3f51b5 !important; -} - -.indigo.lighten-5 { - background-color: #e8eaf6 !important; -} - -.indigo-text.text-lighten-5 { - color: #e8eaf6 !important; -} - -.indigo.lighten-4 { - background-color: #c5cae9 !important; -} - -.indigo-text.text-lighten-4 { - color: #c5cae9 !important; -} - -.indigo.lighten-3 { - background-color: #9fa8da !important; -} - -.indigo-text.text-lighten-3 { - color: #9fa8da !important; -} - -.indigo.lighten-2 { - background-color: #7986cb !important; -} - -.indigo-text.text-lighten-2 { - color: #7986cb !important; -} - -.indigo.lighten-1 { - background-color: #5c6bc0 !important; -} - -.indigo-text.text-lighten-1 { - color: #5c6bc0 !important; -} - -.indigo.darken-1 { - background-color: #3949ab !important; -} - -.indigo-text.text-darken-1 { - color: #3949ab !important; -} - -.indigo.darken-2 { - background-color: #303f9f !important; -} - -.indigo-text.text-darken-2 { - color: #303f9f !important; -} - -.indigo.darken-3 { - background-color: #283593 !important; -} - -.indigo-text.text-darken-3 { - color: #283593 !important; -} - -.indigo.darken-4 { - background-color: #1a237e !important; -} - -.indigo-text.text-darken-4 { - color: #1a237e !important; -} - -.indigo.accent-1 { - background-color: #8c9eff !important; -} - -.indigo-text.text-accent-1 { - color: #8c9eff !important; -} - -.indigo.accent-2 { - background-color: #536dfe !important; -} - -.indigo-text.text-accent-2 { - color: #536dfe !important; -} - -.indigo.accent-3 { - background-color: #3d5afe !important; -} - -.indigo-text.text-accent-3 { - color: #3d5afe !important; -} - -.indigo.accent-4 { - background-color: #304ffe !important; -} - -.indigo-text.text-accent-4 { - color: #304ffe !important; -} - -.blue { - background-color: #2196F3 !important; -} - -.blue-text { - color: #2196F3 !important; -} - -.blue.lighten-5 { - background-color: #E3F2FD !important; -} - -.blue-text.text-lighten-5 { - color: #E3F2FD !important; -} - -.blue.lighten-4 { - background-color: #BBDEFB !important; -} - -.blue-text.text-lighten-4 { - color: #BBDEFB !important; -} - -.blue.lighten-3 { - background-color: #90CAF9 !important; -} - -.blue-text.text-lighten-3 { - color: #90CAF9 !important; -} - -.blue.lighten-2 { - background-color: #64B5F6 !important; -} - -.blue-text.text-lighten-2 { - color: #64B5F6 !important; -} - -.blue.lighten-1 { - background-color: #42A5F5 !important; -} - -.blue-text.text-lighten-1 { - color: #42A5F5 !important; -} - -.blue.darken-1 { - background-color: #1E88E5 !important; -} - -.blue-text.text-darken-1 { - color: #1E88E5 !important; -} - -.blue.darken-2 { - background-color: #1976D2 !important; -} - -.blue-text.text-darken-2 { - color: #1976D2 !important; -} - -.blue.darken-3 { - background-color: #1565C0 !important; -} - -.blue-text.text-darken-3 { - color: #1565C0 !important; -} - -.blue.darken-4 { - background-color: #0D47A1 !important; -} - -.blue-text.text-darken-4 { - color: #0D47A1 !important; -} - -.blue.accent-1 { - background-color: #82B1FF !important; -} - -.blue-text.text-accent-1 { - color: #82B1FF !important; -} - -.blue.accent-2 { - background-color: #448AFF !important; -} - -.blue-text.text-accent-2 { - color: #448AFF !important; -} - -.blue.accent-3 { - background-color: #2979FF !important; -} - -.blue-text.text-accent-3 { - color: #2979FF !important; -} - -.blue.accent-4 { - background-color: #2962FF !important; -} - -.blue-text.text-accent-4 { - color: #2962FF !important; -} - -.light-blue { - background-color: #03a9f4 !important; -} - -.light-blue-text { - color: #03a9f4 !important; -} - -.light-blue.lighten-5 { - background-color: #e1f5fe !important; -} - -.light-blue-text.text-lighten-5 { - color: #e1f5fe !important; -} - -.light-blue.lighten-4 { - background-color: #b3e5fc !important; -} - -.light-blue-text.text-lighten-4 { - color: #b3e5fc !important; -} - -.light-blue.lighten-3 { - background-color: #81d4fa !important; -} - -.light-blue-text.text-lighten-3 { - color: #81d4fa !important; -} - -.light-blue.lighten-2 { - background-color: #4fc3f7 !important; -} - -.light-blue-text.text-lighten-2 { - color: #4fc3f7 !important; -} - -.light-blue.lighten-1 { - background-color: #29b6f6 !important; -} - -.light-blue-text.text-lighten-1 { - color: #29b6f6 !important; -} - -.light-blue.darken-1 { - background-color: #039be5 !important; -} - -.light-blue-text.text-darken-1 { - color: #039be5 !important; -} - -.light-blue.darken-2 { - background-color: #0288d1 !important; -} - -.light-blue-text.text-darken-2 { - color: #0288d1 !important; -} - -.light-blue.darken-3 { - background-color: #0277bd !important; -} - -.light-blue-text.text-darken-3 { - color: #0277bd !important; -} - -.light-blue.darken-4 { - background-color: #01579b !important; -} - -.light-blue-text.text-darken-4 { - color: #01579b !important; -} - -.light-blue.accent-1 { - background-color: #80d8ff !important; -} - -.light-blue-text.text-accent-1 { - color: #80d8ff !important; -} - -.light-blue.accent-2 { - background-color: #40c4ff !important; -} - -.light-blue-text.text-accent-2 { - color: #40c4ff !important; -} - -.light-blue.accent-3 { - background-color: #00b0ff !important; -} - -.light-blue-text.text-accent-3 { - color: #00b0ff !important; -} - -.light-blue.accent-4 { - background-color: #0091ea !important; -} - -.light-blue-text.text-accent-4 { - color: #0091ea !important; -} - -.cyan { - background-color: #00bcd4 !important; -} - -.cyan-text { - color: #00bcd4 !important; -} - -.cyan.lighten-5 { - background-color: #e0f7fa !important; -} - -.cyan-text.text-lighten-5 { - color: #e0f7fa !important; -} - -.cyan.lighten-4 { - background-color: #b2ebf2 !important; -} - -.cyan-text.text-lighten-4 { - color: #b2ebf2 !important; -} - -.cyan.lighten-3 { - background-color: #80deea !important; -} - -.cyan-text.text-lighten-3 { - color: #80deea !important; -} - -.cyan.lighten-2 { - background-color: #4dd0e1 !important; -} - -.cyan-text.text-lighten-2 { - color: #4dd0e1 !important; -} - -.cyan.lighten-1 { - background-color: #26c6da !important; -} - -.cyan-text.text-lighten-1 { - color: #26c6da !important; -} - -.cyan.darken-1 { - background-color: #00acc1 !important; -} - -.cyan-text.text-darken-1 { - color: #00acc1 !important; -} - -.cyan.darken-2 { - background-color: #0097a7 !important; -} - -.cyan-text.text-darken-2 { - color: #0097a7 !important; -} - -.cyan.darken-3 { - background-color: #00838f !important; -} - -.cyan-text.text-darken-3 { - color: #00838f !important; -} - -.cyan.darken-4 { - background-color: #006064 !important; -} - -.cyan-text.text-darken-4 { - color: #006064 !important; -} - -.cyan.accent-1 { - background-color: #84ffff !important; -} - -.cyan-text.text-accent-1 { - color: #84ffff !important; -} - -.cyan.accent-2 { - background-color: #18ffff !important; -} - -.cyan-text.text-accent-2 { - color: #18ffff !important; -} - -.cyan.accent-3 { - background-color: #00e5ff !important; -} - -.cyan-text.text-accent-3 { - color: #00e5ff !important; -} - -.cyan.accent-4 { - background-color: #00b8d4 !important; -} - -.cyan-text.text-accent-4 { - color: #00b8d4 !important; -} - -.teal { - background-color: #009688 !important; -} - -.teal-text { - color: #009688 !important; -} - -.teal.lighten-5 { - background-color: #e0f2f1 !important; -} - -.teal-text.text-lighten-5 { - color: #e0f2f1 !important; -} - -.teal.lighten-4 { - background-color: #b2dfdb !important; -} - -.teal-text.text-lighten-4 { - color: #b2dfdb !important; -} - -.teal.lighten-3 { - background-color: #80cbc4 !important; -} - -.teal-text.text-lighten-3 { - color: #80cbc4 !important; -} - -.teal.lighten-2 { - background-color: #4db6ac !important; -} - -.teal-text.text-lighten-2 { - color: #4db6ac !important; -} - -.teal.lighten-1 { - background-color: #26a69a !important; -} - -.teal-text.text-lighten-1 { - color: #26a69a !important; -} - -.teal.darken-1 { - background-color: #00897b !important; -} - -.teal-text.text-darken-1 { - color: #00897b !important; -} - -.teal.darken-2 { - background-color: #00796b !important; -} - -.teal-text.text-darken-2 { - color: #00796b !important; -} - -.teal.darken-3 { - background-color: #00695c !important; -} - -.teal-text.text-darken-3 { - color: #00695c !important; -} - -.teal.darken-4 { - background-color: #004d40 !important; -} - -.teal-text.text-darken-4 { - color: #004d40 !important; -} - -.teal.accent-1 { - background-color: #a7ffeb !important; -} - -.teal-text.text-accent-1 { - color: #a7ffeb !important; -} - -.teal.accent-2 { - background-color: #64ffda !important; -} - -.teal-text.text-accent-2 { - color: #64ffda !important; -} - -.teal.accent-3 { - background-color: #1de9b6 !important; -} - -.teal-text.text-accent-3 { - color: #1de9b6 !important; -} - -.teal.accent-4 { - background-color: #00bfa5 !important; -} - -.teal-text.text-accent-4 { - color: #00bfa5 !important; -} - -.green { - background-color: #4CAF50 !important; -} - -.green-text { - color: #4CAF50 !important; -} - -.green.lighten-5 { - background-color: #E8F5E9 !important; -} - -.green-text.text-lighten-5 { - color: #E8F5E9 !important; -} - -.green.lighten-4 { - background-color: #C8E6C9 !important; -} - -.green-text.text-lighten-4 { - color: #C8E6C9 !important; -} - -.green.lighten-3 { - background-color: #A5D6A7 !important; -} - -.green-text.text-lighten-3 { - color: #A5D6A7 !important; -} - -.green.lighten-2 { - background-color: #81C784 !important; -} - -.green-text.text-lighten-2 { - color: #81C784 !important; -} - -.green.lighten-1 { - background-color: #66BB6A !important; -} - -.green-text.text-lighten-1 { - color: #66BB6A !important; -} - -.green.darken-1 { - background-color: #43A047 !important; -} - -.green-text.text-darken-1 { - color: #43A047 !important; -} - -.green.darken-2 { - background-color: #388E3C !important; -} - -.green-text.text-darken-2 { - color: #388E3C !important; -} - -.green.darken-3 { - background-color: #2E7D32 !important; -} - -.green-text.text-darken-3 { - color: #2E7D32 !important; -} - -.green.darken-4 { - background-color: #1B5E20 !important; -} - -.green-text.text-darken-4 { - color: #1B5E20 !important; -} - -.green.accent-1 { - background-color: #B9F6CA !important; -} - -.green-text.text-accent-1 { - color: #B9F6CA !important; -} - -.green.accent-2 { - background-color: #69F0AE !important; -} - -.green-text.text-accent-2 { - color: #69F0AE !important; -} - -.green.accent-3 { - background-color: #00E676 !important; -} - -.green-text.text-accent-3 { - color: #00E676 !important; -} - -.green.accent-4 { - background-color: #00C853 !important; -} - -.green-text.text-accent-4 { - color: #00C853 !important; -} - -.light-green { - background-color: #8bc34a !important; -} - -.light-green-text { - color: #8bc34a !important; -} - -.light-green.lighten-5 { - background-color: #f1f8e9 !important; -} - -.light-green-text.text-lighten-5 { - color: #f1f8e9 !important; -} - -.light-green.lighten-4 { - background-color: #dcedc8 !important; -} - -.light-green-text.text-lighten-4 { - color: #dcedc8 !important; -} - -.light-green.lighten-3 { - background-color: #c5e1a5 !important; -} - -.light-green-text.text-lighten-3 { - color: #c5e1a5 !important; -} - -.light-green.lighten-2 { - background-color: #aed581 !important; -} - -.light-green-text.text-lighten-2 { - color: #aed581 !important; -} - -.light-green.lighten-1 { - background-color: #9ccc65 !important; -} - -.light-green-text.text-lighten-1 { - color: #9ccc65 !important; -} - -.light-green.darken-1 { - background-color: #7cb342 !important; -} - -.light-green-text.text-darken-1 { - color: #7cb342 !important; -} - -.light-green.darken-2 { - background-color: #689f38 !important; -} - -.light-green-text.text-darken-2 { - color: #689f38 !important; -} - -.light-green.darken-3 { - background-color: #558b2f !important; -} - -.light-green-text.text-darken-3 { - color: #558b2f !important; -} - -.light-green.darken-4 { - background-color: #33691e !important; -} - -.light-green-text.text-darken-4 { - color: #33691e !important; -} - -.light-green.accent-1 { - background-color: #ccff90 !important; -} - -.light-green-text.text-accent-1 { - color: #ccff90 !important; -} - -.light-green.accent-2 { - background-color: #b2ff59 !important; -} - -.light-green-text.text-accent-2 { - color: #b2ff59 !important; -} - -.light-green.accent-3 { - background-color: #76ff03 !important; -} - -.light-green-text.text-accent-3 { - color: #76ff03 !important; -} - -.light-green.accent-4 { - background-color: #64dd17 !important; -} - -.light-green-text.text-accent-4 { - color: #64dd17 !important; -} - -.lime { - background-color: #cddc39 !important; -} - -.lime-text { - color: #cddc39 !important; -} - -.lime.lighten-5 { - background-color: #f9fbe7 !important; -} - -.lime-text.text-lighten-5 { - color: #f9fbe7 !important; -} - -.lime.lighten-4 { - background-color: #f0f4c3 !important; -} - -.lime-text.text-lighten-4 { - color: #f0f4c3 !important; -} - -.lime.lighten-3 { - background-color: #e6ee9c !important; -} - -.lime-text.text-lighten-3 { - color: #e6ee9c !important; -} - -.lime.lighten-2 { - background-color: #dce775 !important; -} - -.lime-text.text-lighten-2 { - color: #dce775 !important; -} - -.lime.lighten-1 { - background-color: #d4e157 !important; -} - -.lime-text.text-lighten-1 { - color: #d4e157 !important; -} - -.lime.darken-1 { - background-color: #c0ca33 !important; -} - -.lime-text.text-darken-1 { - color: #c0ca33 !important; -} - -.lime.darken-2 { - background-color: #afb42b !important; -} - -.lime-text.text-darken-2 { - color: #afb42b !important; -} - -.lime.darken-3 { - background-color: #9e9d24 !important; -} - -.lime-text.text-darken-3 { - color: #9e9d24 !important; -} - -.lime.darken-4 { - background-color: #827717 !important; -} - -.lime-text.text-darken-4 { - color: #827717 !important; -} - -.lime.accent-1 { - background-color: #f4ff81 !important; -} - -.lime-text.text-accent-1 { - color: #f4ff81 !important; -} - -.lime.accent-2 { - background-color: #eeff41 !important; -} - -.lime-text.text-accent-2 { - color: #eeff41 !important; -} - -.lime.accent-3 { - background-color: #c6ff00 !important; -} - -.lime-text.text-accent-3 { - color: #c6ff00 !important; -} - -.lime.accent-4 { - background-color: #aeea00 !important; -} - -.lime-text.text-accent-4 { - color: #aeea00 !important; -} - -.yellow { - background-color: #ffeb3b !important; -} - -.yellow-text { - color: #ffeb3b !important; -} - -.yellow.lighten-5 { - background-color: #fffde7 !important; -} - -.yellow-text.text-lighten-5 { - color: #fffde7 !important; -} - -.yellow.lighten-4 { - background-color: #fff9c4 !important; -} - -.yellow-text.text-lighten-4 { - color: #fff9c4 !important; -} - -.yellow.lighten-3 { - background-color: #fff59d !important; -} - -.yellow-text.text-lighten-3 { - color: #fff59d !important; -} - -.yellow.lighten-2 { - background-color: #fff176 !important; -} - -.yellow-text.text-lighten-2 { - color: #fff176 !important; -} - -.yellow.lighten-1 { - background-color: #ffee58 !important; -} - -.yellow-text.text-lighten-1 { - color: #ffee58 !important; -} - -.yellow.darken-1 { - background-color: #fdd835 !important; -} - -.yellow-text.text-darken-1 { - color: #fdd835 !important; -} - -.yellow.darken-2 { - background-color: #fbc02d !important; -} - -.yellow-text.text-darken-2 { - color: #fbc02d !important; -} - -.yellow.darken-3 { - background-color: #f9a825 !important; -} - -.yellow-text.text-darken-3 { - color: #f9a825 !important; -} - -.yellow.darken-4 { - background-color: #f57f17 !important; -} - -.yellow-text.text-darken-4 { - color: #f57f17 !important; -} - -.yellow.accent-1 { - background-color: #ffff8d !important; -} - -.yellow-text.text-accent-1 { - color: #ffff8d !important; -} - -.yellow.accent-2 { - background-color: #ffff00 !important; -} - -.yellow-text.text-accent-2 { - color: #ffff00 !important; -} - -.yellow.accent-3 { - background-color: #ffea00 !important; -} - -.yellow-text.text-accent-3 { - color: #ffea00 !important; -} - -.yellow.accent-4 { - background-color: #ffd600 !important; -} - -.yellow-text.text-accent-4 { - color: #ffd600 !important; -} - -.amber { - background-color: #ffc107 !important; -} - -.amber-text { - color: #ffc107 !important; -} - -.amber.lighten-5 { - background-color: #fff8e1 !important; -} - -.amber-text.text-lighten-5 { - color: #fff8e1 !important; -} - -.amber.lighten-4 { - background-color: #ffecb3 !important; -} - -.amber-text.text-lighten-4 { - color: #ffecb3 !important; -} - -.amber.lighten-3 { - background-color: #ffe082 !important; -} - -.amber-text.text-lighten-3 { - color: #ffe082 !important; -} - -.amber.lighten-2 { - background-color: #ffd54f !important; -} - -.amber-text.text-lighten-2 { - color: #ffd54f !important; -} - -.amber.lighten-1 { - background-color: #ffca28 !important; -} - -.amber-text.text-lighten-1 { - color: #ffca28 !important; -} - -.amber.darken-1 { - background-color: #ffb300 !important; -} - -.amber-text.text-darken-1 { - color: #ffb300 !important; -} - -.amber.darken-2 { - background-color: #ffa000 !important; -} - -.amber-text.text-darken-2 { - color: #ffa000 !important; -} - -.amber.darken-3 { - background-color: #ff8f00 !important; -} - -.amber-text.text-darken-3 { - color: #ff8f00 !important; -} - -.amber.darken-4 { - background-color: #ff6f00 !important; -} - -.amber-text.text-darken-4 { - color: #ff6f00 !important; -} - -.amber.accent-1 { - background-color: #ffe57f !important; -} - -.amber-text.text-accent-1 { - color: #ffe57f !important; -} - -.amber.accent-2 { - background-color: #ffd740 !important; -} - -.amber-text.text-accent-2 { - color: #ffd740 !important; -} - -.amber.accent-3 { - background-color: #ffc400 !important; -} - -.amber-text.text-accent-3 { - color: #ffc400 !important; -} - -.amber.accent-4 { - background-color: #ffab00 !important; -} - -.amber-text.text-accent-4 { - color: #ffab00 !important; -} - -.orange { - background-color: #ff9800 !important; -} - -.orange-text { - color: #ff9800 !important; -} - -.orange.lighten-5 { - background-color: #fff3e0 !important; -} - -.orange-text.text-lighten-5 { - color: #fff3e0 !important; -} - -.orange.lighten-4 { - background-color: #ffe0b2 !important; -} - -.orange-text.text-lighten-4 { - color: #ffe0b2 !important; -} - -.orange.lighten-3 { - background-color: #ffcc80 !important; -} - -.orange-text.text-lighten-3 { - color: #ffcc80 !important; -} - -.orange.lighten-2 { - background-color: #ffb74d !important; -} - -.orange-text.text-lighten-2 { - color: #ffb74d !important; -} - -.orange.lighten-1 { - background-color: #ffa726 !important; -} - -.orange-text.text-lighten-1 { - color: #ffa726 !important; -} - -.orange.darken-1 { - background-color: #fb8c00 !important; -} - -.orange-text.text-darken-1 { - color: #fb8c00 !important; -} - -.orange.darken-2 { - background-color: #f57c00 !important; -} - -.orange-text.text-darken-2 { - color: #f57c00 !important; -} - -.orange.darken-3 { - background-color: #ef6c00 !important; -} - -.orange-text.text-darken-3 { - color: #ef6c00 !important; -} - -.orange.darken-4 { - background-color: #e65100 !important; -} - -.orange-text.text-darken-4 { - color: #e65100 !important; -} - -.orange.accent-1 { - background-color: #ffd180 !important; -} - -.orange-text.text-accent-1 { - color: #ffd180 !important; -} - -.orange.accent-2 { - background-color: #ffab40 !important; -} - -.orange-text.text-accent-2 { - color: #ffab40 !important; -} - -.orange.accent-3 { - background-color: #ff9100 !important; -} - -.orange-text.text-accent-3 { - color: #ff9100 !important; -} - -.orange.accent-4 { - background-color: #ff6d00 !important; -} - -.orange-text.text-accent-4 { - color: #ff6d00 !important; -} - -.deep-orange { - background-color: #ff5722 !important; -} - -.deep-orange-text { - color: #ff5722 !important; -} - -.deep-orange.lighten-5 { - background-color: #fbe9e7 !important; -} - -.deep-orange-text.text-lighten-5 { - color: #fbe9e7 !important; -} - -.deep-orange.lighten-4 { - background-color: #ffccbc !important; -} - -.deep-orange-text.text-lighten-4 { - color: #ffccbc !important; -} - -.deep-orange.lighten-3 { - background-color: #ffab91 !important; -} - -.deep-orange-text.text-lighten-3 { - color: #ffab91 !important; -} - -.deep-orange.lighten-2 { - background-color: #ff8a65 !important; -} - -.deep-orange-text.text-lighten-2 { - color: #ff8a65 !important; -} - -.deep-orange.lighten-1 { - background-color: #ff7043 !important; -} - -.deep-orange-text.text-lighten-1 { - color: #ff7043 !important; -} - -.deep-orange.darken-1 { - background-color: #f4511e !important; -} - -.deep-orange-text.text-darken-1 { - color: #f4511e !important; -} - -.deep-orange.darken-2 { - background-color: #e64a19 !important; -} - -.deep-orange-text.text-darken-2 { - color: #e64a19 !important; -} - -.deep-orange.darken-3 { - background-color: #d84315 !important; -} - -.deep-orange-text.text-darken-3 { - color: #d84315 !important; -} - -.deep-orange.darken-4 { - background-color: #bf360c !important; -} - -.deep-orange-text.text-darken-4 { - color: #bf360c !important; -} - -.deep-orange.accent-1 { - background-color: #ff9e80 !important; -} - -.deep-orange-text.text-accent-1 { - color: #ff9e80 !important; -} - -.deep-orange.accent-2 { - background-color: #ff6e40 !important; -} - -.deep-orange-text.text-accent-2 { - color: #ff6e40 !important; -} - -.deep-orange.accent-3 { - background-color: #ff3d00 !important; -} - -.deep-orange-text.text-accent-3 { - color: #ff3d00 !important; -} - -.deep-orange.accent-4 { - background-color: #dd2c00 !important; -} - -.deep-orange-text.text-accent-4 { - color: #dd2c00 !important; -} - -.brown { - background-color: #795548 !important; -} - -.brown-text { - color: #795548 !important; -} - -.brown.lighten-5 { - background-color: #efebe9 !important; -} - -.brown-text.text-lighten-5 { - color: #efebe9 !important; -} - -.brown.lighten-4 { - background-color: #d7ccc8 !important; -} - -.brown-text.text-lighten-4 { - color: #d7ccc8 !important; -} - -.brown.lighten-3 { - background-color: #bcaaa4 !important; -} - -.brown-text.text-lighten-3 { - color: #bcaaa4 !important; -} - -.brown.lighten-2 { - background-color: #a1887f !important; -} - -.brown-text.text-lighten-2 { - color: #a1887f !important; -} - -.brown.lighten-1 { - background-color: #8d6e63 !important; -} - -.brown-text.text-lighten-1 { - color: #8d6e63 !important; -} - -.brown.darken-1 { - background-color: #6d4c41 !important; -} - -.brown-text.text-darken-1 { - color: #6d4c41 !important; -} - -.brown.darken-2 { - background-color: #5d4037 !important; -} - -.brown-text.text-darken-2 { - color: #5d4037 !important; -} - -.brown.darken-3 { - background-color: #4e342e !important; -} - -.brown-text.text-darken-3 { - color: #4e342e !important; -} - -.brown.darken-4 { - background-color: #3e2723 !important; -} - -.brown-text.text-darken-4 { - color: #3e2723 !important; -} - -.blue-grey { - background-color: #607d8b !important; -} - -.blue-grey-text { - color: #607d8b !important; -} - -.blue-grey.lighten-5 { - background-color: #eceff1 !important; -} - -.blue-grey-text.text-lighten-5 { - color: #eceff1 !important; -} - -.blue-grey.lighten-4 { - background-color: #cfd8dc !important; -} - -.blue-grey-text.text-lighten-4 { - color: #cfd8dc !important; -} - -.blue-grey.lighten-3 { - background-color: #b0bec5 !important; -} - -.blue-grey-text.text-lighten-3 { - color: #b0bec5 !important; -} - -.blue-grey.lighten-2 { - background-color: #90a4ae !important; -} - -.blue-grey-text.text-lighten-2 { - color: #90a4ae !important; -} - -.blue-grey.lighten-1 { - background-color: #78909c !important; -} - -.blue-grey-text.text-lighten-1 { - color: #78909c !important; -} - -.blue-grey.darken-1 { - background-color: #546e7a !important; -} - -.blue-grey-text.text-darken-1 { - color: #546e7a !important; -} - -.blue-grey.darken-2 { - background-color: #455a64 !important; -} - -.blue-grey-text.text-darken-2 { - color: #455a64 !important; -} - -.blue-grey.darken-3 { - background-color: #37474f !important; -} - -.blue-grey-text.text-darken-3 { - color: #37474f !important; -} - -.blue-grey.darken-4 { - background-color: #263238 !important; -} - -.blue-grey-text.text-darken-4 { - color: #263238 !important; -} - -.grey { - background-color: #9e9e9e !important; -} - -.grey-text { - color: #9e9e9e !important; -} - -.grey.lighten-5 { - background-color: #fafafa !important; -} - -.grey-text.text-lighten-5 { - color: #fafafa !important; -} - -.grey.lighten-4 { - background-color: #f5f5f5 !important; -} - -.grey-text.text-lighten-4 { - color: #f5f5f5 !important; -} - -.grey.lighten-3 { - background-color: #eeeeee !important; -} - -.grey-text.text-lighten-3 { - color: #eeeeee !important; -} - -.grey.lighten-2 { - background-color: #e0e0e0 !important; -} - -.grey-text.text-lighten-2 { - color: #e0e0e0 !important; -} - -.grey.lighten-1 { - background-color: #bdbdbd !important; -} - -.grey-text.text-lighten-1 { - color: #bdbdbd !important; -} - -.grey.darken-1 { - background-color: #757575 !important; -} - -.grey-text.text-darken-1 { - color: #757575 !important; -} - -.grey.darken-2 { - background-color: #616161 !important; -} - -.grey-text.text-darken-2 { - color: #616161 !important; -} - -.grey.darken-3 { - background-color: #424242 !important; -} - -.grey-text.text-darken-3 { - color: #424242 !important; -} - -.grey.darken-4 { - background-color: #212121 !important; -} - -.grey-text.text-darken-4 { - color: #212121 !important; -} - -.black { - background-color: #000000 !important; -} - -.black-text { - color: #000000 !important; -} - -.white { - background-color: #FFFFFF !important; -} - -.white-text { - color: #FFFFFF !important; -} - -.transparent { - background-color: transparent !important; -} - -.transparent-text { - color: transparent !important; -} - -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS and IE text size adjust after device orientation change, - * without disabling user zoom. - */ -html { - font-family: sans-serif; - /* 1 */ - -ms-text-size-adjust: 100%; - /* 2 */ - -webkit-text-size-adjust: 100%; - /* 2 */ -} - -/** - * Remove default margin. - */ -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ -audio, -canvas, -progress, -video { - display: inline-block; - /* 1 */ - vertical-align: baseline; - /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. - */ -[hidden], -template { - display: none; -} - -/* Links - ========================================================================== */ -/** - * Remove the gray background color from active links in IE 10. - */ -a { - background-color: transparent; -} - -/** - * Improve readability of focused elements when they are also in an - * active/hover state. - */ -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari and Chrome. - */ -dfn { - font-style: italic; -} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9. - */ -mark { - background: #ff0; - color: #000; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* Embedded content - ========================================================================== */ -/** - * Remove border when inside `a` element in IE 8/9/10. - */ -img { - border: 0; -} - -/** - * Correct overflow not hidden in IE 9/10/11. - */ -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ -/** - * Address margin not present in IE 8/9 and Safari. - */ -figure { - margin: 1em 40px; -} - -/** - * Address differences between Firefox and other browsers. - */ -hr { - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -/* Forms - ========================================================================== */ -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ -button, -input, -optgroup, -select, -textarea { - color: inherit; - /* 1 */ - font: inherit; - /* 2 */ - margin: 0; - /* 3 */ -} - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ -button { - overflow: visible; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - /* 2 */ - cursor: pointer; - /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ -input { - line-height: normal; -} - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. - */ -input[type="search"] { - -webkit-appearance: textfield; - /* 1 */ - box-sizing: content-box; - /* 2 */ -} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Define consistent border, margin, and padding. - */ -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ -legend { - border: 0; - /* 1 */ - padding: 0; - /* 2 */ -} - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ -textarea { - overflow: auto; -} - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ -optgroup { - font-weight: bold; -} - -/* Tables - ========================================================================== */ -/** - * Remove most spacing between table cells. - */ -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} - -html { - box-sizing: border-box; -} - -*, *:before, *:after { - box-sizing: inherit; -} - -ul:not(.browser-default) { - padding-left: 0; - list-style-type: none; -} - -ul:not(.browser-default) li { - list-style-type: none; -} - -a { - color: #039be5; - text-decoration: none; - -webkit-tap-highlight-color: transparent; -} - -.valign-wrapper { - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; -} - -.clearfix { - clear: both; -} - -.z-depth-0 { - box-shadow: none !important; -} - -.z-depth-1, nav, .card-panel, .card, .toast, .btn, .btn-large, .btn-floating, .dropdown-content, .collapsible, .side-nav { - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); -} - -.z-depth-1-half, .btn:hover, .btn-large:hover, .btn-floating:hover { - box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); -} - -.z-depth-2 { - box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); -} - -.z-depth-3 { - box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.3); -} - -.z-depth-4, .modal { - box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.3); -} - -.z-depth-5 { - box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3); -} - -.hoverable { - transition: box-shadow .25s; - box-shadow: 0; -} - -.hoverable:hover { - transition: box-shadow .25s; - box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); -} - -.divider { - height: 1px; - overflow: hidden; - background-color: #e0e0e0; -} - -blockquote { - margin: 20px 0; - padding-left: 1.5rem; - border-left: 5px solid #ee6e73; -} - -i { - line-height: inherit; -} - -i.left { - float: left; - margin-right: 15px; -} - -i.right { - float: right; - margin-left: 15px; -} - -i.tiny { - font-size: 1rem; -} - -i.small { - font-size: 2rem; -} - -i.medium { - font-size: 4rem; -} - -i.large { - font-size: 6rem; -} - -img.responsive-img, -video.responsive-video { - max-width: 100%; - height: auto; -} - -.pagination li { - display: inline-block; - border-radius: 2px; - text-align: center; - vertical-align: top; - height: 30px; -} - -.pagination li a { - color: #444; - display: inline-block; - font-size: 1.2rem; - padding: 0 10px; - line-height: 30px; -} - -.pagination li.active a { - color: #fff; -} - -.pagination li.active { - background-color: #ee6e73; -} - -.pagination li.disabled a { - cursor: default; - color: #999; -} - -.pagination li i { - font-size: 2rem; -} - -.pagination li.pages ul li { - display: inline-block; - float: none; -} - -@media only screen and (max-width: 992px) { - .pagination { - width: 100%; - } - .pagination li.prev, - .pagination li.next { - width: 10%; - } - .pagination li.pages { - width: 80%; - overflow: hidden; - white-space: nowrap; - } -} - -.breadcrumb { - font-size: 18px; - color: rgba(255, 255, 255, 0.7); -} - -.breadcrumb i, -.breadcrumb [class^="mdi-"], .breadcrumb [class*="mdi-"], -.breadcrumb i.material-icons { - display: inline-block; - float: left; - font-size: 24px; -} - -.breadcrumb:before { - content: '\E5CC'; - color: rgba(255, 255, 255, 0.7); - vertical-align: top; - display: inline-block; - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 25px; - margin: 0 10px 0 8px; - -webkit-font-smoothing: antialiased; -} - -.breadcrumb:first-child:before { - display: none; -} - -.breadcrumb:last-child { - color: #fff; -} - -.parallax-container { - position: relative; - overflow: hidden; - height: 500px; -} - -.parallax { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: -1; -} - -.parallax img { - display: none; - position: absolute; - left: 50%; - bottom: 0; - min-width: 100%; - min-height: 100%; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - -webkit-transform: translateX(-50%); - transform: translateX(-50%); -} - -.pin-top, .pin-bottom { - position: relative; -} - -.pinned { - position: fixed !important; -} - -/********************* - Transition Classes -**********************/ -ul.staggered-list li { - opacity: 0; -} - -.fade-in { - opacity: 0; - -webkit-transform-origin: 0 50%; - transform-origin: 0 50%; -} - -/********************* - Media Query Classes -**********************/ -@media only screen and (max-width: 600px) { - .hide-on-small-only, .hide-on-small-and-down { - display: none !important; - } -} - -@media only screen and (max-width: 992px) { - .hide-on-med-and-down { - display: none !important; - } -} - -@media only screen and (min-width: 601px) { - .hide-on-med-and-up { - display: none !important; - } -} - -@media only screen and (min-width: 600px) and (max-width: 992px) { - .hide-on-med-only { - display: none !important; - } -} - -@media only screen and (min-width: 993px) { - .hide-on-large-only { - display: none !important; - } -} - -@media only screen and (min-width: 993px) { - .show-on-large { - display: block !important; - } -} - -@media only screen and (min-width: 600px) and (max-width: 992px) { - .show-on-medium { - display: block !important; - } -} - -@media only screen and (max-width: 600px) { - .show-on-small { - display: block !important; - } -} - -@media only screen and (min-width: 601px) { - .show-on-medium-and-up { - display: block !important; - } -} - -@media only screen and (max-width: 992px) { - .show-on-medium-and-down { - display: block !important; - } -} - -@media only screen and (max-width: 600px) { - .center-on-small-only { - text-align: center; - } -} - -.page-footer { - padding-top: 20px; - background-color: #ee6e73; -} - -.page-footer .footer-copyright { - overflow: hidden; - min-height: 50px; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - padding: 10px 0px; - color: rgba(255, 255, 255, 0.8); - background-color: rgba(51, 51, 51, 0.08); -} - -table, th, td { - border: none; -} - -table { - width: 100%; - display: table; -} - -table.bordered > thead > tr, -table.bordered > tbody > tr { - border-bottom: 1px solid #d0d0d0; -} - -table.striped > tbody > tr:nth-child(odd) { - background-color: #f2f2f2; -} - -table.striped > tbody > tr > td { - border-radius: 0; -} - -table.highlight > tbody > tr { - transition: background-color .25s ease; -} - -table.highlight > tbody > tr:hover { - background-color: #f2f2f2; -} - -table.centered thead tr th, table.centered tbody tr td { - text-align: center; -} - -thead { - border-bottom: 1px solid #d0d0d0; -} - -td, th { - padding: 15px 5px; - display: table-cell; - text-align: left; - vertical-align: middle; - border-radius: 2px; -} - -@media only screen and (max-width: 992px) { - table.responsive-table { - width: 100%; - border-collapse: collapse; - border-spacing: 0; - display: block; - position: relative; - /* sort out borders */ - } - table.responsive-table td:empty:before { - content: '\00a0'; - } - table.responsive-table th, - table.responsive-table td { - margin: 0; - vertical-align: top; - } - table.responsive-table th { - text-align: left; - } - table.responsive-table thead { - display: block; - float: left; - } - table.responsive-table thead tr { - display: block; - padding: 0 10px 0 0; - } - table.responsive-table thead tr th::before { - content: "\00a0"; - } - table.responsive-table tbody { - display: block; - width: auto; - position: relative; - overflow-x: auto; - white-space: nowrap; - } - table.responsive-table tbody tr { - display: inline-block; - vertical-align: top; - } - table.responsive-table th { - display: block; - text-align: right; - } - table.responsive-table td { - display: block; - min-height: 1.25em; - text-align: left; - } - table.responsive-table tr { - padding: 0 10px; - } - table.responsive-table thead { - border: 0; - border-right: 1px solid #d0d0d0; - } - table.responsive-table.bordered th { - border-bottom: 0; - border-left: 0; - } - table.responsive-table.bordered td { - border-left: 0; - border-right: 0; - border-bottom: 0; - } - table.responsive-table.bordered tr { - border: 0; - } - table.responsive-table.bordered tbody tr { - border-right: 1px solid #d0d0d0; - } -} - -.collection { - margin: 0.5rem 0 1rem 0; - border: 1px solid #e0e0e0; - border-radius: 2px; - overflow: hidden; - position: relative; -} - -.collection .collection-item { - background-color: #fff; - line-height: 1.5rem; - padding: 10px 20px; - margin: 0; - border-bottom: 1px solid #e0e0e0; -} - -.collection .collection-item.avatar { - min-height: 84px; - padding-left: 72px; - position: relative; -} - -.collection .collection-item.avatar .circle { - position: absolute; - width: 42px; - height: 42px; - overflow: hidden; - left: 15px; - display: inline-block; - vertical-align: middle; -} - -.collection .collection-item.avatar i.circle { - font-size: 18px; - line-height: 42px; - color: #fff; - background-color: #999; - text-align: center; -} - -.collection .collection-item.avatar .title { - font-size: 16px; -} - -.collection .collection-item.avatar p { - margin: 0; -} - -.collection .collection-item.avatar .secondary-content { - position: absolute; - top: 16px; - right: 16px; -} - -.collection .collection-item:last-child { - border-bottom: none; -} - -.collection .collection-item.active { - background-color: #26a69a; - color: #eafaf9; -} - -.collection .collection-item.active .secondary-content { - color: #fff; -} - -.collection a.collection-item { - display: block; - transition: .25s; - color: #26a69a; -} - -.collection a.collection-item:not(.active):hover { - background-color: #ddd; -} - -.collection.with-header .collection-header { - background-color: #fff; - border-bottom: 1px solid #e0e0e0; - padding: 10px 20px; -} - -.collection.with-header .collection-item { - padding-left: 30px; -} - -.collection.with-header .collection-item.avatar { - padding-left: 72px; -} - -.secondary-content { - float: right; - color: #26a69a; -} - -.collapsible .collection { - margin: 0; - border: none; -} - -.video-container { - position: relative; - padding-bottom: 56.25%; - height: 0; - overflow: hidden; -} - -.video-container iframe, .video-container object, .video-container embed { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.progress { - position: relative; - height: 4px; - display: block; - width: 100%; - background-color: #acece6; - border-radius: 2px; - margin: 0.5rem 0 1rem 0; - overflow: hidden; -} - -.progress .determinate { - position: absolute; - top: 0; - left: 0; - bottom: 0; - background-color: #26a69a; - transition: width .3s linear; -} - -.progress .indeterminate { - background-color: #26a69a; -} - -.progress .indeterminate:before { - content: ''; - position: absolute; - background-color: inherit; - top: 0; - left: 0; - bottom: 0; - will-change: left, right; - -webkit-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; - animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; -} - -.progress .indeterminate:after { - content: ''; - position: absolute; - background-color: inherit; - top: 0; - left: 0; - bottom: 0; - will-change: left, right; - -webkit-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; - animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; - -webkit-animation-delay: 1.15s; - animation-delay: 1.15s; -} - -@-webkit-keyframes indeterminate { - 0% { - left: -35%; - right: 100%; - } - 60% { - left: 100%; - right: -90%; - } - 100% { - left: 100%; - right: -90%; - } -} - -@keyframes indeterminate { - 0% { - left: -35%; - right: 100%; - } - 60% { - left: 100%; - right: -90%; - } - 100% { - left: 100%; - right: -90%; - } -} - -@-webkit-keyframes indeterminate-short { - 0% { - left: -200%; - right: 100%; - } - 60% { - left: 107%; - right: -8%; - } - 100% { - left: 107%; - right: -8%; - } -} - -@keyframes indeterminate-short { - 0% { - left: -200%; - right: 100%; - } - 60% { - left: 107%; - right: -8%; - } - 100% { - left: 107%; - right: -8%; - } -} - -/******************* - Utility Classes -*******************/ -.hide { - display: none !important; -} - -.left-align { - text-align: left; -} - -.right-align { - text-align: right; -} - -.center, .center-align { - text-align: center; -} - -.left { - float: left !important; -} - -.right { - float: right !important; -} - -.no-select, input[type=range], -input[type=range] + .thumb { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.circle { - border-radius: 50%; -} - -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} - -.truncate { - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.no-padding { - padding: 0 !important; -} - -span.badge { - min-width: 3rem; - padding: 0 6px; - margin-left: 14px; - text-align: center; - font-size: 1rem; - line-height: 22px; - height: 22px; - color: #757575; - float: right; - box-sizing: border-box; -} - -span.badge.new { - font-weight: 300; - font-size: 0.8rem; - color: #fff; - background-color: #26a69a; - border-radius: 2px; -} - -span.badge.new:after { - content: " new"; -} - -span.badge[data-badge-caption]::after { - content: " " attr(data-badge-caption); -} - -nav ul a span.badge { - display: inline-block; - float: none; - margin-left: 4px; - line-height: 22px; - height: 22px; -} - -.collection-item span.badge { - margin-top: calc(0.75rem - 11px); -} - -.collapsible span.badge { - margin-top: calc(1.5rem - 11px); -} - -.side-nav span.badge { - margin-top: calc(24px - 11px); -} - -/* This is needed for some mobile phones to display the Google Icon font properly */ -.material-icons { - text-rendering: optimizeLegibility; - -webkit-font-feature-settings: 'liga'; - -moz-font-feature-settings: 'liga'; - font-feature-settings: 'liga'; -} - -.container { - margin: 0 auto; - max-width: 1280px; - width: 90%; -} - -@media only screen and (min-width: 601px) { - .container { - width: 85%; - } -} - -@media only screen and (min-width: 993px) { - .container { - width: 70%; - } -} - -.container .row { - margin-left: -0.75rem; - margin-right: -0.75rem; -} - -.section { - padding-top: 1rem; - padding-bottom: 1rem; -} - -.section.no-pad { - padding: 0; -} - -.section.no-pad-bot { - padding-bottom: 0; -} - -.section.no-pad-top { - padding-top: 0; -} - -.row { - margin-left: auto; - margin-right: auto; - margin-bottom: 20px; -} - -.row:after { - content: ""; - display: table; - clear: both; -} - -.row .col { - float: left; - box-sizing: border-box; - padding: 0 0.75rem; - min-height: 1px; -} - -.row .col[class*="push-"], .row .col[class*="pull-"] { - position: relative; -} - -.row .col.s1 { - width: 8.3333333333%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s2 { - width: 16.6666666667%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s3 { - width: 25%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s4 { - width: 33.3333333333%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s5 { - width: 41.6666666667%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s6 { - width: 50%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s7 { - width: 58.3333333333%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s8 { - width: 66.6666666667%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s9 { - width: 75%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s10 { - width: 83.3333333333%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s11 { - width: 91.6666666667%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.s12 { - width: 100%; - margin-left: auto; - left: auto; - right: auto; -} - -.row .col.offset-s1 { - margin-left: 8.3333333333%; -} - -.row .col.pull-s1 { - right: 8.3333333333%; -} - -.row .col.push-s1 { - left: 8.3333333333%; -} - -.row .col.offset-s2 { - margin-left: 16.6666666667%; -} - -.row .col.pull-s2 { - right: 16.6666666667%; -} - -.row .col.push-s2 { - left: 16.6666666667%; -} - -.row .col.offset-s3 { - margin-left: 25%; -} - -.row .col.pull-s3 { - right: 25%; -} - -.row .col.push-s3 { - left: 25%; -} - -.row .col.offset-s4 { - margin-left: 33.3333333333%; -} - -.row .col.pull-s4 { - right: 33.3333333333%; -} - -.row .col.push-s4 { - left: 33.3333333333%; -} - -.row .col.offset-s5 { - margin-left: 41.6666666667%; -} - -.row .col.pull-s5 { - right: 41.6666666667%; -} - -.row .col.push-s5 { - left: 41.6666666667%; -} - -.row .col.offset-s6 { - margin-left: 50%; -} - -.row .col.pull-s6 { - right: 50%; -} - -.row .col.push-s6 { - left: 50%; -} - -.row .col.offset-s7 { - margin-left: 58.3333333333%; -} - -.row .col.pull-s7 { - right: 58.3333333333%; -} - -.row .col.push-s7 { - left: 58.3333333333%; -} - -.row .col.offset-s8 { - margin-left: 66.6666666667%; -} - -.row .col.pull-s8 { - right: 66.6666666667%; -} - -.row .col.push-s8 { - left: 66.6666666667%; -} - -.row .col.offset-s9 { - margin-left: 75%; -} - -.row .col.pull-s9 { - right: 75%; -} - -.row .col.push-s9 { - left: 75%; -} - -.row .col.offset-s10 { - margin-left: 83.3333333333%; -} - -.row .col.pull-s10 { - right: 83.3333333333%; -} - -.row .col.push-s10 { - left: 83.3333333333%; -} - -.row .col.offset-s11 { - margin-left: 91.6666666667%; -} - -.row .col.pull-s11 { - right: 91.6666666667%; -} - -.row .col.push-s11 { - left: 91.6666666667%; -} - -.row .col.offset-s12 { - margin-left: 100%; -} - -.row .col.pull-s12 { - right: 100%; -} - -.row .col.push-s12 { - left: 100%; -} - -@media only screen and (min-width: 601px) { - .row .col.m1 { - width: 8.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m2 { - width: 16.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m3 { - width: 25%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m4 { - width: 33.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m5 { - width: 41.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m6 { - width: 50%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m7 { - width: 58.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m8 { - width: 66.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m9 { - width: 75%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m10 { - width: 83.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m11 { - width: 91.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.m12 { - width: 100%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.offset-m1 { - margin-left: 8.3333333333%; - } - .row .col.pull-m1 { - right: 8.3333333333%; - } - .row .col.push-m1 { - left: 8.3333333333%; - } - .row .col.offset-m2 { - margin-left: 16.6666666667%; - } - .row .col.pull-m2 { - right: 16.6666666667%; - } - .row .col.push-m2 { - left: 16.6666666667%; - } - .row .col.offset-m3 { - margin-left: 25%; - } - .row .col.pull-m3 { - right: 25%; - } - .row .col.push-m3 { - left: 25%; - } - .row .col.offset-m4 { - margin-left: 33.3333333333%; - } - .row .col.pull-m4 { - right: 33.3333333333%; - } - .row .col.push-m4 { - left: 33.3333333333%; - } - .row .col.offset-m5 { - margin-left: 41.6666666667%; - } - .row .col.pull-m5 { - right: 41.6666666667%; - } - .row .col.push-m5 { - left: 41.6666666667%; - } - .row .col.offset-m6 { - margin-left: 50%; - } - .row .col.pull-m6 { - right: 50%; - } - .row .col.push-m6 { - left: 50%; - } - .row .col.offset-m7 { - margin-left: 58.3333333333%; - } - .row .col.pull-m7 { - right: 58.3333333333%; - } - .row .col.push-m7 { - left: 58.3333333333%; - } - .row .col.offset-m8 { - margin-left: 66.6666666667%; - } - .row .col.pull-m8 { - right: 66.6666666667%; - } - .row .col.push-m8 { - left: 66.6666666667%; - } - .row .col.offset-m9 { - margin-left: 75%; - } - .row .col.pull-m9 { - right: 75%; - } - .row .col.push-m9 { - left: 75%; - } - .row .col.offset-m10 { - margin-left: 83.3333333333%; - } - .row .col.pull-m10 { - right: 83.3333333333%; - } - .row .col.push-m10 { - left: 83.3333333333%; - } - .row .col.offset-m11 { - margin-left: 91.6666666667%; - } - .row .col.pull-m11 { - right: 91.6666666667%; - } - .row .col.push-m11 { - left: 91.6666666667%; - } - .row .col.offset-m12 { - margin-left: 100%; - } - .row .col.pull-m12 { - right: 100%; - } - .row .col.push-m12 { - left: 100%; - } -} - -@media only screen and (min-width: 993px) { - .row .col.l1 { - width: 8.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l2 { - width: 16.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l3 { - width: 25%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l4 { - width: 33.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l5 { - width: 41.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l6 { - width: 50%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l7 { - width: 58.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l8 { - width: 66.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l9 { - width: 75%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l10 { - width: 83.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l11 { - width: 91.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.l12 { - width: 100%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.offset-l1 { - margin-left: 8.3333333333%; - } - .row .col.pull-l1 { - right: 8.3333333333%; - } - .row .col.push-l1 { - left: 8.3333333333%; - } - .row .col.offset-l2 { - margin-left: 16.6666666667%; - } - .row .col.pull-l2 { - right: 16.6666666667%; - } - .row .col.push-l2 { - left: 16.6666666667%; - } - .row .col.offset-l3 { - margin-left: 25%; - } - .row .col.pull-l3 { - right: 25%; - } - .row .col.push-l3 { - left: 25%; - } - .row .col.offset-l4 { - margin-left: 33.3333333333%; - } - .row .col.pull-l4 { - right: 33.3333333333%; - } - .row .col.push-l4 { - left: 33.3333333333%; - } - .row .col.offset-l5 { - margin-left: 41.6666666667%; - } - .row .col.pull-l5 { - right: 41.6666666667%; - } - .row .col.push-l5 { - left: 41.6666666667%; - } - .row .col.offset-l6 { - margin-left: 50%; - } - .row .col.pull-l6 { - right: 50%; - } - .row .col.push-l6 { - left: 50%; - } - .row .col.offset-l7 { - margin-left: 58.3333333333%; - } - .row .col.pull-l7 { - right: 58.3333333333%; - } - .row .col.push-l7 { - left: 58.3333333333%; - } - .row .col.offset-l8 { - margin-left: 66.6666666667%; - } - .row .col.pull-l8 { - right: 66.6666666667%; - } - .row .col.push-l8 { - left: 66.6666666667%; - } - .row .col.offset-l9 { - margin-left: 75%; - } - .row .col.pull-l9 { - right: 75%; - } - .row .col.push-l9 { - left: 75%; - } - .row .col.offset-l10 { - margin-left: 83.3333333333%; - } - .row .col.pull-l10 { - right: 83.3333333333%; - } - .row .col.push-l10 { - left: 83.3333333333%; - } - .row .col.offset-l11 { - margin-left: 91.6666666667%; - } - .row .col.pull-l11 { - right: 91.6666666667%; - } - .row .col.push-l11 { - left: 91.6666666667%; - } - .row .col.offset-l12 { - margin-left: 100%; - } - .row .col.pull-l12 { - right: 100%; - } - .row .col.push-l12 { - left: 100%; - } -} - -@media only screen and (min-width: 1201px) { - .row .col.xl1 { - width: 8.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl2 { - width: 16.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl3 { - width: 25%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl4 { - width: 33.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl5 { - width: 41.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl6 { - width: 50%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl7 { - width: 58.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl8 { - width: 66.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl9 { - width: 75%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl10 { - width: 83.3333333333%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl11 { - width: 91.6666666667%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.xl12 { - width: 100%; - margin-left: auto; - left: auto; - right: auto; - } - .row .col.offset-xl1 { - margin-left: 8.3333333333%; - } - .row .col.pull-xl1 { - right: 8.3333333333%; - } - .row .col.push-xl1 { - left: 8.3333333333%; - } - .row .col.offset-xl2 { - margin-left: 16.6666666667%; - } - .row .col.pull-xl2 { - right: 16.6666666667%; - } - .row .col.push-xl2 { - left: 16.6666666667%; - } - .row .col.offset-xl3 { - margin-left: 25%; - } - .row .col.pull-xl3 { - right: 25%; - } - .row .col.push-xl3 { - left: 25%; - } - .row .col.offset-xl4 { - margin-left: 33.3333333333%; - } - .row .col.pull-xl4 { - right: 33.3333333333%; - } - .row .col.push-xl4 { - left: 33.3333333333%; - } - .row .col.offset-xl5 { - margin-left: 41.6666666667%; - } - .row .col.pull-xl5 { - right: 41.6666666667%; - } - .row .col.push-xl5 { - left: 41.6666666667%; - } - .row .col.offset-xl6 { - margin-left: 50%; - } - .row .col.pull-xl6 { - right: 50%; - } - .row .col.push-xl6 { - left: 50%; - } - .row .col.offset-xl7 { - margin-left: 58.3333333333%; - } - .row .col.pull-xl7 { - right: 58.3333333333%; - } - .row .col.push-xl7 { - left: 58.3333333333%; - } - .row .col.offset-xl8 { - margin-left: 66.6666666667%; - } - .row .col.pull-xl8 { - right: 66.6666666667%; - } - .row .col.push-xl8 { - left: 66.6666666667%; - } - .row .col.offset-xl9 { - margin-left: 75%; - } - .row .col.pull-xl9 { - right: 75%; - } - .row .col.push-xl9 { - left: 75%; - } - .row .col.offset-xl10 { - margin-left: 83.3333333333%; - } - .row .col.pull-xl10 { - right: 83.3333333333%; - } - .row .col.push-xl10 { - left: 83.3333333333%; - } - .row .col.offset-xl11 { - margin-left: 91.6666666667%; - } - .row .col.pull-xl11 { - right: 91.6666666667%; - } - .row .col.push-xl11 { - left: 91.6666666667%; - } - .row .col.offset-xl12 { - margin-left: 100%; - } - .row .col.pull-xl12 { - right: 100%; - } - .row .col.push-xl12 { - left: 100%; - } -} - -nav { - color: #fff; - background-color: #ee6e73; - width: 100%; - height: 56px; - line-height: 56px; -} - -nav.nav-extended { - height: auto; -} - -nav.nav-extended .nav-wrapper { - min-height: 56px; - height: auto; -} - -nav.nav-extended .nav-content { - position: relative; - line-height: normal; -} - -nav a { - color: #fff; -} - -nav i, -nav [class^="mdi-"], nav [class*="mdi-"], -nav i.material-icons { - display: block; - font-size: 24px; - height: 56px; - line-height: 56px; -} - -nav .nav-wrapper { - position: relative; - height: 100%; -} - -@media only screen and (min-width: 993px) { - nav a.button-collapse { - display: none; - } -} - -nav .button-collapse { - float: left; - position: relative; - z-index: 1; - height: 56px; - margin: 0 18px; -} - -nav .button-collapse i { - height: 56px; - line-height: 56px; -} - -nav .brand-logo { - position: absolute; - color: #fff; - display: inline-block; - font-size: 2.1rem; - padding: 0; - white-space: nowrap; -} - -nav .brand-logo.center { - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); -} - -@media only screen and (max-width: 992px) { - nav .brand-logo { - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); - } - nav .brand-logo.left, nav .brand-logo.right { - padding: 0; - -webkit-transform: none; - transform: none; - } - nav .brand-logo.left { - left: 0.5rem; - } - nav .brand-logo.right { - right: 0.5rem; - left: auto; - } -} - -nav .brand-logo.right { - right: 0.5rem; - padding: 0; -} - -nav .brand-logo i, -nav .brand-logo [class^="mdi-"], nav .brand-logo [class*="mdi-"], -nav .brand-logo i.material-icons { - float: left; - margin-right: 15px; -} - -nav .nav-title { - display: inline-block; - font-size: 32px; - padding: 28px 0; -} - -nav ul { - margin: 0; -} - -nav ul li { - transition: background-color .3s; - float: left; - padding: 0; -} - -nav ul li.active { - background-color: rgba(0, 0, 0, 0.1); -} - -nav ul a { - transition: background-color .3s; - font-size: 1rem; - color: #fff; - display: block; - padding: 0 15px; - cursor: pointer; -} - -nav ul a.btn, nav ul a.btn-large, nav ul a.btn-large, nav ul a.btn-flat, nav ul a.btn-floating { - margin-top: -2px; - margin-left: 15px; - margin-right: 15px; -} - -nav ul a.btn > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-flat > .material-icons, nav ul a.btn-floating > .material-icons { - height: inherit; - line-height: inherit; -} - -nav ul a:hover { - background-color: rgba(0, 0, 0, 0.1); -} - -nav ul.left { - float: left; -} - -nav form { - height: 100%; -} - -nav .input-field { - margin: 0; - height: 100%; -} - -nav .input-field input { - height: 100%; - font-size: 1.2rem; - border: none; - padding-left: 2rem; -} - -nav .input-field input:focus, nav .input-field input[type=text]:valid, nav .input-field input[type=password]:valid, nav .input-field input[type=email]:valid, nav .input-field input[type=url]:valid, nav .input-field input[type=date]:valid { - border: none; - box-shadow: none; -} - -nav .input-field label { - top: 0; - left: 0; -} - -nav .input-field label i { - color: rgba(255, 255, 255, 0.7); - transition: color .3s; -} - -nav .input-field label.active i { - color: #fff; -} - -.navbar-fixed { - position: relative; - height: 56px; - z-index: 997; -} - -.navbar-fixed nav { - position: fixed; -} - -@media only screen and (min-width: 601px) { - nav.nav-extended .nav-wrapper { - min-height: 64px; - } - nav, nav .nav-wrapper i, nav a.button-collapse, nav a.button-collapse i { - height: 64px; - line-height: 64px; - } - .navbar-fixed { - height: 64px; - } -} - -@font-face { - font-family: "Roboto"; - src: local(Roboto Thin), url("../fonts/roboto/Roboto-Thin.woff2") format("woff2"), url("../fonts/roboto/Roboto-Thin.woff") format("woff"); - font-weight: 100; -} - -@font-face { - font-family: "Roboto"; - src: local(Roboto Light), url("../fonts/roboto/Roboto-Light.woff2") format("woff2"), url("../fonts/roboto/Roboto-Light.woff") format("woff"); - font-weight: 300; -} - -@font-face { - font-family: "Roboto"; - src: local(Roboto Regular), url("../fonts/roboto/Roboto-Regular.woff2") format("woff2"), url("../fonts/roboto/Roboto-Regular.woff") format("woff"); - font-weight: 400; -} - -@font-face { - font-family: "Roboto"; - src: local(Roboto Medium), url("../fonts/roboto/Roboto-Medium.woff2") format("woff2"), url("../fonts/roboto/Roboto-Medium.woff") format("woff"); - font-weight: 500; -} - -@font-face { - font-family: "Roboto"; - src: local(Roboto Bold), url("../fonts/roboto/Roboto-Bold.woff2") format("woff2"), url("../fonts/roboto/Roboto-Bold.woff") format("woff"); - font-weight: 700; -} - -a { - text-decoration: none; -} - -html { - line-height: 1.5; - font-family: "Roboto", sans-serif; - font-weight: normal; - color: rgba(0, 0, 0, 0.87); -} - -@media only screen and (min-width: 0) { - html { - font-size: 14px; - } -} - -@media only screen and (min-width: 992px) { - html { - font-size: 14.5px; - } -} - -@media only screen and (min-width: 1200px) { - html { - font-size: 15px; - } -} - -h1, h2, h3, h4, h5, h6 { - font-weight: 400; - line-height: 1.1; -} - -h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { - font-weight: inherit; -} - -h1 { - font-size: 4.2rem; - line-height: 110%; - margin: 2.1rem 0 1.68rem 0; -} - -h2 { - font-size: 3.56rem; - line-height: 110%; - margin: 1.78rem 0 1.424rem 0; -} - -h3 { - font-size: 2.92rem; - line-height: 110%; - margin: 1.46rem 0 1.168rem 0; -} - -h4 { - font-size: 2.28rem; - line-height: 110%; - margin: 1.14rem 0 0.912rem 0; -} - -h5 { - font-size: 1.64rem; - line-height: 110%; - margin: 0.82rem 0 0.656rem 0; -} - -h6 { - font-size: 1rem; - line-height: 110%; - margin: 0.5rem 0 0.4rem 0; -} - -em { - font-style: italic; -} - -strong { - font-weight: 500; -} - -small { - font-size: 75%; -} - -.light, .page-footer .footer-copyright { - font-weight: 300; -} - -.thin { - font-weight: 200; -} - -.flow-text { - font-weight: 300; -} - -@media only screen and (min-width: 360px) { - .flow-text { - font-size: 1.2rem; - } -} - -@media only screen and (min-width: 390px) { - .flow-text { - font-size: 1.224rem; - } -} - -@media only screen and (min-width: 420px) { - .flow-text { - font-size: 1.248rem; - } -} - -@media only screen and (min-width: 450px) { - .flow-text { - font-size: 1.272rem; - } -} - -@media only screen and (min-width: 480px) { - .flow-text { - font-size: 1.296rem; - } -} - -@media only screen and (min-width: 510px) { - .flow-text { - font-size: 1.32rem; - } -} - -@media only screen and (min-width: 540px) { - .flow-text { - font-size: 1.344rem; - } -} - -@media only screen and (min-width: 570px) { - .flow-text { - font-size: 1.368rem; - } -} - -@media only screen and (min-width: 600px) { - .flow-text { - font-size: 1.392rem; - } -} - -@media only screen and (min-width: 630px) { - .flow-text { - font-size: 1.416rem; - } -} - -@media only screen and (min-width: 660px) { - .flow-text { - font-size: 1.44rem; - } -} - -@media only screen and (min-width: 690px) { - .flow-text { - font-size: 1.464rem; - } -} - -@media only screen and (min-width: 720px) { - .flow-text { - font-size: 1.488rem; - } -} - -@media only screen and (min-width: 750px) { - .flow-text { - font-size: 1.512rem; - } -} - -@media only screen and (min-width: 780px) { - .flow-text { - font-size: 1.536rem; - } -} - -@media only screen and (min-width: 810px) { - .flow-text { - font-size: 1.56rem; - } -} - -@media only screen and (min-width: 840px) { - .flow-text { - font-size: 1.584rem; - } -} - -@media only screen and (min-width: 870px) { - .flow-text { - font-size: 1.608rem; - } -} - -@media only screen and (min-width: 900px) { - .flow-text { - font-size: 1.632rem; - } -} - -@media only screen and (min-width: 930px) { - .flow-text { - font-size: 1.656rem; - } -} - -@media only screen and (min-width: 960px) { - .flow-text { - font-size: 1.68rem; - } -} - -@media only screen and (max-width: 360px) { - .flow-text { - font-size: 1.2rem; - } -} - -.scale-transition { - transition: -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; - transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; - transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; -} - -.scale-transition.scale-out { - -webkit-transform: scale(0); - transform: scale(0); - transition: -webkit-transform .2s !important; - transition: transform .2s !important; - transition: transform .2s, -webkit-transform .2s !important; -} - -.scale-transition.scale-in { - -webkit-transform: scale(1); - transform: scale(1); -} - -.card-panel { - transition: box-shadow .25s; - padding: 24px; - margin: 0.5rem 0 1rem 0; - border-radius: 2px; - background-color: #fff; -} - -.card { - position: relative; - margin: 0.5rem 0 1rem 0; - background-color: #fff; - transition: box-shadow .25s; - border-radius: 2px; -} - -.card .card-title { - font-size: 24px; - font-weight: 300; -} - -.card .card-title.activator { - cursor: pointer; -} - -.card.small, .card.medium, .card.large { - position: relative; -} - -.card.small .card-image, .card.medium .card-image, .card.large .card-image { - max-height: 60%; - overflow: hidden; -} - -.card.small .card-image + .card-content, .card.medium .card-image + .card-content, .card.large .card-image + .card-content { - max-height: 40%; -} - -.card.small .card-content, .card.medium .card-content, .card.large .card-content { - max-height: 100%; - overflow: hidden; -} - -.card.small .card-action, .card.medium .card-action, .card.large .card-action { - position: absolute; - bottom: 0; - left: 0; - right: 0; -} - -.card.small { - height: 300px; -} - -.card.medium { - height: 400px; -} - -.card.large { - height: 500px; -} - -.card.horizontal { - display: -webkit-flex; - display: -ms-flexbox; - display: flex; -} - -.card.horizontal.small .card-image, .card.horizontal.medium .card-image, .card.horizontal.large .card-image { - height: 100%; - max-height: none; - overflow: visible; -} - -.card.horizontal.small .card-image img, .card.horizontal.medium .card-image img, .card.horizontal.large .card-image img { - height: 100%; -} - -.card.horizontal .card-image { - max-width: 50%; -} - -.card.horizontal .card-image img { - border-radius: 2px 0 0 2px; - max-width: 100%; - width: auto; -} - -.card.horizontal .card-stacked { - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - position: relative; -} - -.card.horizontal .card-stacked .card-content { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} - -.card.sticky-action .card-action { - z-index: 2; -} - -.card.sticky-action .card-reveal { - z-index: 1; - padding-bottom: 64px; -} - -.card .card-image { - position: relative; -} - -.card .card-image img { - display: block; - border-radius: 2px 2px 0 0; - position: relative; - left: 0; - right: 0; - top: 0; - bottom: 0; - width: 100%; -} - -.card .card-image .card-title { - color: #fff; - position: absolute; - bottom: 0; - left: 0; - max-width: 100%; - padding: 24px; -} - -.card .card-content { - padding: 24px; - border-radius: 0 0 2px 2px; -} - -.card .card-content p { - margin: 0; - color: inherit; -} - -.card .card-content .card-title { - display: block; - line-height: 32px; - margin-bottom: 8px; -} - -.card .card-content .card-title i { - line-height: 32px; -} - -.card .card-action { - position: relative; - background-color: inherit; - border-top: 1px solid rgba(160, 160, 160, 0.2); - padding: 16px 24px; -} - -.card .card-action:last-child { - border-radius: 0 0 2px 2px; -} - -.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating) { - color: #ffab40; - margin-right: 24px; - transition: color .3s ease; - text-transform: uppercase; -} - -.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating):hover { - color: #ffd8a6; -} - -.card .card-reveal { - padding: 24px; - position: absolute; - background-color: #fff; - width: 100%; - overflow-y: auto; - left: 0; - top: 100%; - height: 100%; - z-index: 3; - display: none; -} - -.card .card-reveal .card-title { - cursor: pointer; - display: block; -} - -#toast-container { - display: block; - position: fixed; - z-index: 10000; -} - -@media only screen and (max-width: 600px) { - #toast-container { - min-width: 100%; - bottom: 0%; - } -} - -@media only screen and (min-width: 601px) and (max-width: 992px) { - #toast-container { - left: 5%; - bottom: 7%; - max-width: 90%; - } -} - -@media only screen and (min-width: 993px) { - #toast-container { - top: 10%; - right: 7%; - max-width: 86%; - } -} - -.toast { - border-radius: 2px; - top: 35px; - width: auto; - clear: both; - margin-top: 10px; - position: relative; - max-width: 100%; - height: auto; - min-height: 48px; - line-height: 1.5em; - word-break: break-all; - background-color: #323232; - padding: 10px 25px; - font-size: 1.1rem; - font-weight: 300; - color: #fff; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; -} - -.toast .btn, .toast .btn-large, .toast .btn-flat { - margin: 0; - margin-left: 3rem; -} - -.toast.rounded { - border-radius: 24px; -} - -@media only screen and (max-width: 600px) { - .toast { - width: 100%; - border-radius: 0; - } -} - -@media only screen and (min-width: 601px) and (max-width: 992px) { - .toast { - float: left; - } -} - -@media only screen and (min-width: 993px) { - .toast { - float: right; - } -} - -.tabs { - position: relative; - overflow-x: auto; - overflow-y: hidden; - height: 48px; - width: 100%; - background-color: #fff; - margin: 0 auto; - white-space: nowrap; -} - -.tabs.tabs-transparent { - background-color: transparent; -} - -.tabs.tabs-transparent .tab a, -.tabs.tabs-transparent .tab.disabled a, -.tabs.tabs-transparent .tab.disabled a:hover { - color: rgba(255, 255, 255, 0.7); -} - -.tabs.tabs-transparent .tab a:hover, -.tabs.tabs-transparent .tab a.active { - color: #fff; -} - -.tabs.tabs-transparent .indicator { - background-color: #fff; -} - -.tabs.tabs-fixed-width { - display: -webkit-flex; - display: -ms-flexbox; - display: flex; -} - -.tabs.tabs-fixed-width .tab { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} - -.tabs .tab { - display: inline-block; - text-align: center; - line-height: 48px; - height: 48px; - padding: 0; - margin: 0; - text-transform: uppercase; -} - -.tabs .tab a { - color: rgba(238, 110, 115, 0.7); - display: block; - width: 100%; - height: 100%; - padding: 0 24px; - font-size: 14px; - text-overflow: ellipsis; - overflow: hidden; - transition: color .28s ease; -} - -.tabs .tab a:hover, .tabs .tab a.active { - background-color: transparent; - color: #ee6e73; -} - -.tabs .tab.disabled a, -.tabs .tab.disabled a:hover { - color: rgba(238, 110, 115, 0.7); - cursor: default; -} - -.tabs .indicator { - position: absolute; - bottom: 0; - height: 2px; - background-color: #f6b2b5; - will-change: left, right; -} - -@media only screen and (max-width: 992px) { - .tabs { - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - } - .tabs .tab { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - } - .tabs .tab a { - padding: 0 12px; - } -} - -.material-tooltip { - padding: 10px 8px; - font-size: 1rem; - z-index: 2000; - background-color: transparent; - border-radius: 2px; - color: #fff; - min-height: 36px; - line-height: 120%; - opacity: 0; - position: absolute; - text-align: center; - max-width: calc(100% - 4px); - overflow: hidden; - left: 0; - top: 0; - pointer-events: none; - visibility: hidden; -} - -.backdrop { - position: absolute; - opacity: 0; - height: 7px; - width: 14px; - border-radius: 0 0 50% 50%; - background-color: #323232; - z-index: -1; - -webkit-transform-origin: 50% 0%; - transform-origin: 50% 0%; - visibility: hidden; -} - -.btn, .btn-large, -.btn-flat { - border: none; - border-radius: 2px; - display: inline-block; - height: 36px; - line-height: 36px; - padding: 0 2rem; - text-transform: uppercase; - vertical-align: middle; - -webkit-tap-highlight-color: transparent; -} - -.btn.disabled, .disabled.btn-large, -.btn-floating.disabled, -.btn-large.disabled, -.btn-flat.disabled, -.btn:disabled, -.btn-large:disabled, -.btn-floating:disabled, -.btn-large:disabled, -.btn-flat:disabled, -.btn[disabled], -[disabled].btn-large, -.btn-floating[disabled], -.btn-large[disabled], -.btn-flat[disabled] { - pointer-events: none; - background-color: #DFDFDF !important; - box-shadow: none; - color: #9F9F9F !important; - cursor: default; -} - -.btn.disabled:hover, .disabled.btn-large:hover, -.btn-floating.disabled:hover, -.btn-large.disabled:hover, -.btn-flat.disabled:hover, -.btn:disabled:hover, -.btn-large:disabled:hover, -.btn-floating:disabled:hover, -.btn-large:disabled:hover, -.btn-flat:disabled:hover, -.btn[disabled]:hover, -[disabled].btn-large:hover, -.btn-floating[disabled]:hover, -.btn-large[disabled]:hover, -.btn-flat[disabled]:hover { - background-color: #DFDFDF !important; - color: #9F9F9F !important; -} - -.btn, .btn-large, -.btn-floating, -.btn-large, -.btn-flat { - font-size: 1rem; - outline: 0; -} - -.btn i, .btn-large i, -.btn-floating i, -.btn-large i, -.btn-flat i { - font-size: 1.3rem; - line-height: inherit; -} - -.btn:focus, .btn-large:focus, -.btn-floating:focus { - background-color: #1d7d74; -} - -.btn, .btn-large { - text-decoration: none; - color: #fff; - background-color: #26a69a; - text-align: center; - letter-spacing: .5px; - transition: .2s ease-out; - cursor: pointer; -} - -.btn:hover, .btn-large:hover { - background-color: #2bbbad; -} - -.btn-floating { - display: inline-block; - color: #fff; - position: relative; - overflow: hidden; - z-index: 1; - width: 40px; - height: 40px; - line-height: 40px; - padding: 0; - background-color: #26a69a; - border-radius: 50%; - transition: .3s; - cursor: pointer; - vertical-align: middle; -} - -.btn-floating:hover { - background-color: #26a69a; -} - -.btn-floating:before { - border-radius: 0; -} - -.btn-floating.btn-large { - width: 56px; - height: 56px; -} - -.btn-floating.btn-large.halfway-fab { - bottom: -28px; -} - -.btn-floating.btn-large i { - line-height: 56px; -} - -.btn-floating.halfway-fab { - position: absolute; - right: 24px; - bottom: -20px; -} - -.btn-floating.halfway-fab.left { - right: auto; - left: 24px; -} - -.btn-floating i { - width: inherit; - display: inline-block; - text-align: center; - color: #fff; - font-size: 1.6rem; - line-height: 40px; -} - -button.btn-floating { - border: none; -} - -.fixed-action-btn { - position: fixed; - right: 23px; - bottom: 23px; - padding-top: 15px; - margin-bottom: 0; - z-index: 998; -} - -.fixed-action-btn.active ul { - visibility: visible; -} - -.fixed-action-btn.horizontal { - padding: 0 0 0 15px; -} - -.fixed-action-btn.horizontal ul { - text-align: right; - right: 64px; - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - height: 100%; - left: auto; - width: 500px; - /*width 100% only goes to width of button container */ -} - -.fixed-action-btn.horizontal ul li { - display: inline-block; - margin: 15px 15px 0 0; -} - -.fixed-action-btn.toolbar { - padding: 0; - height: 56px; -} - -.fixed-action-btn.toolbar.active > a i { - opacity: 0; -} - -.fixed-action-btn.toolbar ul { - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - top: 0; - bottom: 0; -} - -.fixed-action-btn.toolbar ul li { - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - display: inline-block; - margin: 0; - height: 100%; - transition: none; -} - -.fixed-action-btn.toolbar ul li a { - display: block; - overflow: hidden; - position: relative; - width: 100%; - height: 100%; - background-color: transparent; - box-shadow: none; - color: #fff; - line-height: 56px; - z-index: 1; -} - -.fixed-action-btn.toolbar ul li a i { - line-height: inherit; -} - -.fixed-action-btn ul { - left: 0; - right: 0; - text-align: center; - position: absolute; - bottom: 64px; - margin: 0; - visibility: hidden; -} - -.fixed-action-btn ul li { - margin-bottom: 15px; -} - -.fixed-action-btn ul a.btn-floating { - opacity: 0; -} - -.fixed-action-btn .fab-backdrop { - position: absolute; - top: 0; - left: 0; - z-index: -1; - width: 40px; - height: 40px; - background-color: #26a69a; - border-radius: 50%; - -webkit-transform: scale(0); - transform: scale(0); -} - -.btn-flat { - box-shadow: none; - background-color: transparent; - color: #343434; - cursor: pointer; - transition: background-color .2s; -} - -.btn-flat:focus, .btn-flat:active { - background-color: transparent; -} - -.btn-flat:focus, .btn-flat:hover { - background-color: rgba(0, 0, 0, 0.1); - box-shadow: none; -} - -.btn-flat:active { - background-color: rgba(0, 0, 0, 0.2); -} - -.btn-flat.disabled { - background-color: transparent !important; - color: #b3b3b3 !important; - cursor: default; -} - -.btn-large { - height: 54px; - line-height: 54px; -} - -.btn-large i { - font-size: 1.6rem; -} - -.btn-block { - display: block; -} - -.dropdown-content { - background-color: #fff; - margin: 0; - display: none; - min-width: 100px; - max-height: 650px; - overflow-y: auto; - opacity: 0; - position: absolute; - z-index: 999; - will-change: width, height; -} - -.dropdown-content li { - clear: both; - color: rgba(0, 0, 0, 0.87); - cursor: pointer; - min-height: 50px; - line-height: 1.5rem; - width: 100%; - text-align: left; - text-transform: none; -} - -.dropdown-content li:hover, .dropdown-content li.active, .dropdown-content li.selected { - background-color: #eee; -} - -.dropdown-content li.active.selected { - background-color: #e1e1e1; -} - -.dropdown-content li.divider { - min-height: 0; - height: 1px; -} - -.dropdown-content li > a, .dropdown-content li > span { - font-size: 16px; - color: #26a69a; - display: block; - line-height: 22px; - padding: 14px 16px; -} - -.dropdown-content li > span > label { - top: 1px; - left: 0; - height: 18px; -} - -.dropdown-content li > a > i { - height: inherit; - line-height: inherit; - float: left; - margin: 0 24px 0 0; - width: 24px; -} - -.input-field.col .dropdown-content [type="checkbox"] + label { - top: 1px; - left: 0; - height: 18px; -} - -/*! - * Waves v0.6.0 - * http://fian.my.id/Waves - * - * Copyright 2014 Alfiana E. Sibuea and other contributors - * Released under the MIT license - * https://github.com/fians/Waves/blob/master/LICENSE - */ -.waves-effect { - position: relative; - cursor: pointer; - display: inline-block; - overflow: hidden; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: transparent; - vertical-align: middle; - z-index: 1; - transition: .3s ease-out; -} - -.waves-effect .waves-ripple { - position: absolute; - border-radius: 50%; - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - opacity: 0; - background: rgba(0, 0, 0, 0.2); - transition: all 0.7s ease-out; - transition-property: opacity, -webkit-transform; - transition-property: transform, opacity; - transition-property: transform, opacity, -webkit-transform; - -webkit-transform: scale(0); - transform: scale(0); - pointer-events: none; -} - -.waves-effect.waves-light .waves-ripple { - background-color: rgba(255, 255, 255, 0.45); -} - -.waves-effect.waves-red .waves-ripple { - background-color: rgba(244, 67, 54, 0.7); -} - -.waves-effect.waves-yellow .waves-ripple { - background-color: rgba(255, 235, 59, 0.7); -} - -.waves-effect.waves-orange .waves-ripple { - background-color: rgba(255, 152, 0, 0.7); -} - -.waves-effect.waves-purple .waves-ripple { - background-color: rgba(156, 39, 176, 0.7); -} - -.waves-effect.waves-green .waves-ripple { - background-color: rgba(76, 175, 80, 0.7); -} - -.waves-effect.waves-teal .waves-ripple { - background-color: rgba(0, 150, 136, 0.7); -} - -.waves-effect input[type="button"], .waves-effect input[type="reset"], .waves-effect input[type="submit"] { - border: 0; - font-style: normal; - font-size: inherit; - text-transform: inherit; - background: none; -} - -.waves-effect img { - position: relative; - z-index: -1; -} - -.waves-notransition { - transition: none !important; -} - -.waves-circle { - -webkit-transform: translateZ(0); - transform: translateZ(0); - -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); -} - -.waves-input-wrapper { - border-radius: 0.2em; - vertical-align: bottom; -} - -.waves-input-wrapper .waves-button-input { - position: relative; - top: 0; - left: 0; - z-index: 1; -} - -.waves-circle { - text-align: center; - width: 2.5em; - height: 2.5em; - line-height: 2.5em; - border-radius: 50%; - -webkit-mask-image: none; -} - -.waves-block { - display: block; -} - -/* Firefox Bug: link not triggered */ -.waves-effect .waves-ripple { - z-index: -1; -} - -.modal { - display: none; - position: fixed; - left: 0; - right: 0; - background-color: #fafafa; - padding: 0; - max-height: 70%; - width: 55%; - margin: auto; - overflow-y: auto; - border-radius: 2px; - will-change: top, opacity; -} - -@media only screen and (max-width: 992px) { - .modal { - width: 80%; - } -} - -.modal h1, .modal h2, .modal h3, .modal h4 { - margin-top: 0; -} - -.modal .modal-content { - padding: 24px; -} - -.modal .modal-close { - cursor: pointer; -} - -.modal .modal-footer { - border-radius: 0 0 2px 2px; - background-color: #fafafa; - padding: 4px 6px; - height: 56px; - width: 100%; -} - -.modal .modal-footer .btn, .modal .modal-footer .btn-large, .modal .modal-footer .btn-flat { - float: right; - margin: 6px 0; -} - -.modal-overlay { - position: fixed; - z-index: 999; - top: -100px; - left: 0; - bottom: 0; - right: 0; - height: 125%; - width: 100%; - background: #000; - display: none; - will-change: opacity; -} - -.modal.modal-fixed-footer { - padding: 0; - height: 70%; -} - -.modal.modal-fixed-footer .modal-content { - position: absolute; - height: calc(100% - 56px); - max-height: 100%; - width: 100%; - overflow-y: auto; -} - -.modal.modal-fixed-footer .modal-footer { - border-top: 1px solid rgba(0, 0, 0, 0.1); - position: absolute; - bottom: 0; -} - -.modal.bottom-sheet { - top: auto; - bottom: -100%; - margin: 0; - width: 100%; - max-height: 45%; - border-radius: 0; - will-change: bottom, opacity; -} - -.collapsible { - border-top: 1px solid #ddd; - border-right: 1px solid #ddd; - border-left: 1px solid #ddd; - margin: 0.5rem 0 1rem 0; -} - -.collapsible-header { - display: block; - cursor: pointer; - min-height: 3rem; - line-height: 3rem; - padding: 0 1rem; - background-color: #fff; - border-bottom: 1px solid #ddd; -} - -.collapsible-header i { - width: 2rem; - font-size: 1.6rem; - line-height: 3rem; - display: block; - float: left; - text-align: center; - margin-right: 1rem; -} - -.collapsible-body { - display: none; - border-bottom: 1px solid #ddd; - box-sizing: border-box; - padding: 2rem; -} - -.side-nav .collapsible, -.side-nav.fixed .collapsible { - border: none; - box-shadow: none; -} - -.side-nav .collapsible li, -.side-nav.fixed .collapsible li { - padding: 0; -} - -.side-nav .collapsible-header, -.side-nav.fixed .collapsible-header { - background-color: transparent; - border: none; - line-height: inherit; - height: inherit; - padding: 0 16px; -} - -.side-nav .collapsible-header:hover, -.side-nav.fixed .collapsible-header:hover { - background-color: rgba(0, 0, 0, 0.05); -} - -.side-nav .collapsible-header i, -.side-nav.fixed .collapsible-header i { - line-height: inherit; -} - -.side-nav .collapsible-body, -.side-nav.fixed .collapsible-body { - border: 0; - background-color: #fff; -} - -.side-nav .collapsible-body li a, -.side-nav.fixed .collapsible-body li a { - padding: 0 23.5px 0 31px; -} - -.collapsible.popout { - border: none; - box-shadow: none; -} - -.collapsible.popout > li { - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); - margin: 0 24px; - transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); -} - -.collapsible.popout > li.active { - box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); - margin: 16px 0; -} - -.chip { - display: inline-block; - height: 32px; - font-size: 13px; - font-weight: 500; - color: rgba(0, 0, 0, 0.6); - line-height: 32px; - padding: 0 12px; - border-radius: 16px; - background-color: #e4e4e4; - margin-bottom: 5px; - margin-right: 5px; -} - -.chip > img { - float: left; - margin: 0 8px 0 -12px; - height: 32px; - width: 32px; - border-radius: 50%; -} - -.chip .close { - cursor: pointer; - float: right; - font-size: 16px; - line-height: 32px; - padding-left: 8px; -} - -.chips { - border: none; - border-bottom: 1px solid #9e9e9e; - box-shadow: none; - margin: 0 0 20px 0; - min-height: 45px; - outline: none; - transition: all .3s; -} - -.chips.focus { - border-bottom: 1px solid #26a69a; - box-shadow: 0 1px 0 0 #26a69a; -} - -.chips:hover { - cursor: text; -} - -.chips .chip.selected { - background-color: #26a69a; - color: #fff; -} - -.chips .input { - background: none; - border: 0; - color: rgba(0, 0, 0, 0.6); - display: inline-block; - font-size: 1rem; - height: 3rem; - line-height: 32px; - outline: 0; - margin: 0; - padding: 0 !important; - width: 120px !important; -} - -.chips .input:focus { - border: 0 !important; - box-shadow: none !important; -} - -.chips .autocomplete-content { - margin-top: 0; -} - -.prefix ~ .chips { - margin-left: 3rem; - width: 92%; - width: calc(100% - 3rem); -} - -.chips:empty ~ label { - font-size: 0.8rem; - -webkit-transform: translateY(-140%); - transform: translateY(-140%); -} - -.materialboxed { - display: block; - cursor: -webkit-zoom-in; - cursor: zoom-in; - position: relative; - transition: opacity .4s; - -webkit-backface-visibility: hidden; -} - -.materialboxed:hover:not(.active) { - opacity: .8; -} - -.materialboxed.active { - cursor: -webkit-zoom-out; - cursor: zoom-out; -} - -#materialbox-overlay { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-color: #292929; - z-index: 1000; - will-change: opacity; -} - -.materialbox-caption { - position: fixed; - display: none; - color: #fff; - line-height: 50px; - bottom: 0; - left: 0; - width: 100%; - text-align: center; - padding: 0% 15%; - height: 50px; - z-index: 1000; - -webkit-font-smoothing: antialiased; -} - -select:focus { - outline: 1px solid #c9f3ef; -} - -button:focus { - outline: none; - background-color: #2ab7a9; -} - -label { - font-size: 0.8rem; - color: #9e9e9e; -} - -/* Text Inputs + Textarea - ========================================================================== */ -/* Style Placeholders */ -::-webkit-input-placeholder { - color: #d1d1d1; -} - -:-moz-placeholder { - /* Firefox 18- */ - color: #d1d1d1; -} - -::-moz-placeholder { - /* Firefox 19+ */ - color: #d1d1d1; -} - -:-ms-input-placeholder { - color: #d1d1d1; -} - -/* Text inputs */ -input:not([type]), -input[type=text], -input[type=password], -input[type=email], -input[type=url], -input[type=time], -input[type=date], -input[type=datetime], -input[type=datetime-local], -input[type=tel], -input[type=number], -input[type=search], -textarea.materialize-textarea { - background-color: transparent; - border: none; - border-bottom: 1px solid #9e9e9e; - border-radius: 0; - outline: none; - height: 3rem; - width: 100%; - font-size: 1rem; - margin: 0 0 20px 0; - padding: 0; - box-shadow: none; - box-sizing: content-box; - transition: all 0.3s; -} - -input:not([type]):disabled, input:not([type])[readonly="readonly"], -input[type=text]:disabled, -input[type=text][readonly="readonly"], -input[type=password]:disabled, -input[type=password][readonly="readonly"], -input[type=email]:disabled, -input[type=email][readonly="readonly"], -input[type=url]:disabled, -input[type=url][readonly="readonly"], -input[type=time]:disabled, -input[type=time][readonly="readonly"], -input[type=date]:disabled, -input[type=date][readonly="readonly"], -input[type=datetime]:disabled, -input[type=datetime][readonly="readonly"], -input[type=datetime-local]:disabled, -input[type=datetime-local][readonly="readonly"], -input[type=tel]:disabled, -input[type=tel][readonly="readonly"], -input[type=number]:disabled, -input[type=number][readonly="readonly"], -input[type=search]:disabled, -input[type=search][readonly="readonly"], -textarea.materialize-textarea:disabled, -textarea.materialize-textarea[readonly="readonly"] { - color: rgba(0, 0, 0, 0.26); - border-bottom: 1px dotted rgba(0, 0, 0, 0.26); -} - -input:not([type]):disabled + label, -input:not([type])[readonly="readonly"] + label, -input[type=text]:disabled + label, -input[type=text][readonly="readonly"] + label, -input[type=password]:disabled + label, -input[type=password][readonly="readonly"] + label, -input[type=email]:disabled + label, -input[type=email][readonly="readonly"] + label, -input[type=url]:disabled + label, -input[type=url][readonly="readonly"] + label, -input[type=time]:disabled + label, -input[type=time][readonly="readonly"] + label, -input[type=date]:disabled + label, -input[type=date][readonly="readonly"] + label, -input[type=datetime]:disabled + label, -input[type=datetime][readonly="readonly"] + label, -input[type=datetime-local]:disabled + label, -input[type=datetime-local][readonly="readonly"] + label, -input[type=tel]:disabled + label, -input[type=tel][readonly="readonly"] + label, -input[type=number]:disabled + label, -input[type=number][readonly="readonly"] + label, -input[type=search]:disabled + label, -input[type=search][readonly="readonly"] + label, -textarea.materialize-textarea:disabled + label, -textarea.materialize-textarea[readonly="readonly"] + label { - color: rgba(0, 0, 0, 0.26); -} - -input:not([type]):focus:not([readonly]), -input[type=text]:focus:not([readonly]), -input[type=password]:focus:not([readonly]), -input[type=email]:focus:not([readonly]), -input[type=url]:focus:not([readonly]), -input[type=time]:focus:not([readonly]), -input[type=date]:focus:not([readonly]), -input[type=datetime]:focus:not([readonly]), -input[type=datetime-local]:focus:not([readonly]), -input[type=tel]:focus:not([readonly]), -input[type=number]:focus:not([readonly]), -input[type=search]:focus:not([readonly]), -textarea.materialize-textarea:focus:not([readonly]) { - border-bottom: 1px solid #26a69a; - box-shadow: 0 1px 0 0 #26a69a; -} - -input:not([type]):focus:not([readonly]) + label, -input[type=text]:focus:not([readonly]) + label, -input[type=password]:focus:not([readonly]) + label, -input[type=email]:focus:not([readonly]) + label, -input[type=url]:focus:not([readonly]) + label, -input[type=time]:focus:not([readonly]) + label, -input[type=date]:focus:not([readonly]) + label, -input[type=datetime]:focus:not([readonly]) + label, -input[type=datetime-local]:focus:not([readonly]) + label, -input[type=tel]:focus:not([readonly]) + label, -input[type=number]:focus:not([readonly]) + label, -input[type=search]:focus:not([readonly]) + label, -textarea.materialize-textarea:focus:not([readonly]) + label { - color: #26a69a; -} - -input:not([type]).valid, input:not([type]):focus.valid, -input[type=text].valid, -input[type=text]:focus.valid, -input[type=password].valid, -input[type=password]:focus.valid, -input[type=email].valid, -input[type=email]:focus.valid, -input[type=url].valid, -input[type=url]:focus.valid, -input[type=time].valid, -input[type=time]:focus.valid, -input[type=date].valid, -input[type=date]:focus.valid, -input[type=datetime].valid, -input[type=datetime]:focus.valid, -input[type=datetime-local].valid, -input[type=datetime-local]:focus.valid, -input[type=tel].valid, -input[type=tel]:focus.valid, -input[type=number].valid, -input[type=number]:focus.valid, -input[type=search].valid, -input[type=search]:focus.valid, -textarea.materialize-textarea.valid, -textarea.materialize-textarea:focus.valid { - border-bottom: 1px solid #4CAF50; - box-shadow: 0 1px 0 0 #4CAF50; -} - -input:not([type]).valid + label:after, -input:not([type]):focus.valid + label:after, -input[type=text].valid + label:after, -input[type=text]:focus.valid + label:after, -input[type=password].valid + label:after, -input[type=password]:focus.valid + label:after, -input[type=email].valid + label:after, -input[type=email]:focus.valid + label:after, -input[type=url].valid + label:after, -input[type=url]:focus.valid + label:after, -input[type=time].valid + label:after, -input[type=time]:focus.valid + label:after, -input[type=date].valid + label:after, -input[type=date]:focus.valid + label:after, -input[type=datetime].valid + label:after, -input[type=datetime]:focus.valid + label:after, -input[type=datetime-local].valid + label:after, -input[type=datetime-local]:focus.valid + label:after, -input[type=tel].valid + label:after, -input[type=tel]:focus.valid + label:after, -input[type=number].valid + label:after, -input[type=number]:focus.valid + label:after, -input[type=search].valid + label:after, -input[type=search]:focus.valid + label:after, -textarea.materialize-textarea.valid + label:after, -textarea.materialize-textarea:focus.valid + label:after { - content: attr(data-success); - color: #4CAF50; - opacity: 1; -} - -input:not([type]).invalid, input:not([type]):focus.invalid, -input[type=text].invalid, -input[type=text]:focus.invalid, -input[type=password].invalid, -input[type=password]:focus.invalid, -input[type=email].invalid, -input[type=email]:focus.invalid, -input[type=url].invalid, -input[type=url]:focus.invalid, -input[type=time].invalid, -input[type=time]:focus.invalid, -input[type=date].invalid, -input[type=date]:focus.invalid, -input[type=datetime].invalid, -input[type=datetime]:focus.invalid, -input[type=datetime-local].invalid, -input[type=datetime-local]:focus.invalid, -input[type=tel].invalid, -input[type=tel]:focus.invalid, -input[type=number].invalid, -input[type=number]:focus.invalid, -input[type=search].invalid, -input[type=search]:focus.invalid, -textarea.materialize-textarea.invalid, -textarea.materialize-textarea:focus.invalid { - border-bottom: 1px solid #F44336; - box-shadow: 0 1px 0 0 #F44336; -} - -input:not([type]).invalid + label:after, -input:not([type]):focus.invalid + label:after, -input[type=text].invalid + label:after, -input[type=text]:focus.invalid + label:after, -input[type=password].invalid + label:after, -input[type=password]:focus.invalid + label:after, -input[type=email].invalid + label:after, -input[type=email]:focus.invalid + label:after, -input[type=url].invalid + label:after, -input[type=url]:focus.invalid + label:after, -input[type=time].invalid + label:after, -input[type=time]:focus.invalid + label:after, -input[type=date].invalid + label:after, -input[type=date]:focus.invalid + label:after, -input[type=datetime].invalid + label:after, -input[type=datetime]:focus.invalid + label:after, -input[type=datetime-local].invalid + label:after, -input[type=datetime-local]:focus.invalid + label:after, -input[type=tel].invalid + label:after, -input[type=tel]:focus.invalid + label:after, -input[type=number].invalid + label:after, -input[type=number]:focus.invalid + label:after, -input[type=search].invalid + label:after, -input[type=search]:focus.invalid + label:after, -textarea.materialize-textarea.invalid + label:after, -textarea.materialize-textarea:focus.invalid + label:after { - content: attr(data-error); - color: #F44336; - opacity: 1; -} - -input:not([type]).validate + label, -input[type=text].validate + label, -input[type=password].validate + label, -input[type=email].validate + label, -input[type=url].validate + label, -input[type=time].validate + label, -input[type=date].validate + label, -input[type=datetime].validate + label, -input[type=datetime-local].validate + label, -input[type=tel].validate + label, -input[type=number].validate + label, -input[type=search].validate + label, -textarea.materialize-textarea.validate + label { - width: 100%; - pointer-events: none; -} - -input:not([type]) + label:after, -input[type=text] + label:after, -input[type=password] + label:after, -input[type=email] + label:after, -input[type=url] + label:after, -input[type=time] + label:after, -input[type=date] + label:after, -input[type=datetime] + label:after, -input[type=datetime-local] + label:after, -input[type=tel] + label:after, -input[type=number] + label:after, -input[type=search] + label:after, -textarea.materialize-textarea + label:after { - display: block; - content: ""; - position: absolute; - top: 60px; - opacity: 0; - transition: .2s opacity ease-out, .2s color ease-out; -} - -.input-field { - position: relative; - margin-top: 1rem; -} - -.input-field.inline { - display: inline-block; - vertical-align: middle; - margin-left: 5px; -} - -.input-field.inline input, -.input-field.inline .select-dropdown { - margin-bottom: 1rem; -} - -.input-field.col label { - left: 0.75rem; -} - -.input-field.col .prefix ~ label, -.input-field.col .prefix ~ .validate ~ label { - width: calc(100% - 3rem - 1.5rem); -} - -.input-field label { - color: #9e9e9e; - position: absolute; - top: 0.8rem; - left: 0; - font-size: 1rem; - cursor: text; - transition: .2s ease-out; - text-align: initial; -} - -.input-field label:not(.label-icon).active { - font-size: 0.8rem; - -webkit-transform: translateY(-140%); - transform: translateY(-140%); -} - -.input-field .prefix { - position: absolute; - width: 3rem; - font-size: 2rem; - transition: color .2s; -} - -.input-field .prefix.active { - color: #26a69a; -} - -.input-field .prefix ~ input, -.input-field .prefix ~ textarea, -.input-field .prefix ~ label, -.input-field .prefix ~ .validate ~ label, -.input-field .prefix ~ .autocomplete-content { - margin-left: 3rem; - width: 92%; - width: calc(100% - 3rem); -} - -.input-field .prefix ~ label { - margin-left: 3rem; -} - -@media only screen and (max-width: 992px) { - .input-field .prefix ~ input { - width: 86%; - width: calc(100% - 3rem); - } -} - -@media only screen and (max-width: 600px) { - .input-field .prefix ~ input { - width: 80%; - width: calc(100% - 3rem); - } -} - -/* Search Field */ -.input-field input[type=search] { - display: block; - line-height: inherit; - padding-left: 4rem; - width: calc(100% - 4rem); -} - -.input-field input[type=search]:focus { - background-color: #fff; - border: 0; - box-shadow: none; - color: #444; -} - -.input-field input[type=search]:focus + label i, -.input-field input[type=search]:focus ~ .mdi-navigation-close, -.input-field input[type=search]:focus ~ .material-icons { - color: #444; -} - -.input-field input[type=search] + label { - left: 1rem; -} - -.input-field input[type=search] ~ .mdi-navigation-close, -.input-field input[type=search] ~ .material-icons { - position: absolute; - top: 0; - right: 1rem; - color: transparent; - cursor: pointer; - font-size: 2rem; - transition: .3s color; -} - -/* Textarea */ -textarea { - width: 100%; - height: 3rem; - background-color: transparent; -} - -textarea.materialize-textarea { - overflow-y: hidden; - /* prevents scroll bar flash */ - padding: .8rem 0 1.6rem 0; - /* prevents text jump on Enter keypress */ - resize: none; - min-height: 3rem; -} - -.hiddendiv { - display: none; - white-space: pre-wrap; - word-wrap: break-word; - overflow-wrap: break-word; - /* future version of deprecated 'word-wrap' */ - padding-top: 1.2rem; - /* prevents text jump on Enter keypress */ - position: absolute; - top: 0; -} - -/* Autocomplete */ -.autocomplete-content { - margin-top: -20px; - display: block; - opacity: 1; - position: static; -} - -.autocomplete-content li .highlight { - color: #444; -} - -.autocomplete-content li img { - height: 40px; - width: 40px; - margin: 5px 15px; -} - -/* Radio Buttons - ========================================================================== */ -[type="radio"]:not(:checked), -[type="radio"]:checked { - position: absolute; - left: -9999px; - opacity: 0; -} - -[type="radio"]:not(:checked) + label, -[type="radio"]:checked + label { - position: relative; - padding-left: 35px; - cursor: pointer; - display: inline-block; - height: 25px; - line-height: 25px; - font-size: 1rem; - transition: .28s ease; - /* webkit (konqueror) browsers */ - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -[type="radio"] + label:before, -[type="radio"] + label:after { - content: ''; - position: absolute; - left: 0; - top: 0; - margin: 4px; - width: 16px; - height: 16px; - z-index: 0; - transition: .28s ease; -} - -/* Unchecked styles */ -[type="radio"]:not(:checked) + label:before, -[type="radio"]:not(:checked) + label:after, -[type="radio"]:checked + label:before, -[type="radio"]:checked + label:after, -[type="radio"].with-gap:checked + label:before, -[type="radio"].with-gap:checked + label:after { - border-radius: 50%; -} - -[type="radio"]:not(:checked) + label:before, -[type="radio"]:not(:checked) + label:after { - border: 2px solid #5a5a5a; -} - -[type="radio"]:not(:checked) + label:after { - -webkit-transform: scale(0); - transform: scale(0); -} - -/* Checked styles */ -[type="radio"]:checked + label:before { - border: 2px solid transparent; -} - -[type="radio"]:checked + label:after, -[type="radio"].with-gap:checked + label:before, -[type="radio"].with-gap:checked + label:after { - border: 2px solid #26a69a; -} - -[type="radio"]:checked + label:after, -[type="radio"].with-gap:checked + label:after { - background-color: #26a69a; -} - -[type="radio"]:checked + label:after { - -webkit-transform: scale(1.02); - transform: scale(1.02); -} - -/* Radio With gap */ -[type="radio"].with-gap:checked + label:after { - -webkit-transform: scale(0.5); - transform: scale(0.5); -} - -/* Focused styles */ -[type="radio"].tabbed:focus + label:before { - box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); -} - -/* Disabled Radio With gap */ -[type="radio"].with-gap:disabled:checked + label:before { - border: 2px solid rgba(0, 0, 0, 0.26); -} - -[type="radio"].with-gap:disabled:checked + label:after { - border: none; - background-color: rgba(0, 0, 0, 0.26); -} - -/* Disabled style */ -[type="radio"]:disabled:not(:checked) + label:before, -[type="radio"]:disabled:checked + label:before { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.26); -} - -[type="radio"]:disabled + label { - color: rgba(0, 0, 0, 0.26); -} - -[type="radio"]:disabled:not(:checked) + label:before { - border-color: rgba(0, 0, 0, 0.26); -} - -[type="radio"]:disabled:checked + label:after { - background-color: rgba(0, 0, 0, 0.26); - border-color: #BDBDBD; -} - -/* Checkboxes - ========================================================================== */ -/* CUSTOM CSS CHECKBOXES */ -form p { - margin-bottom: 10px; - text-align: left; -} - -form p:last-child { - margin-bottom: 0; -} - -/* Remove default checkbox */ -[type="checkbox"]:not(:checked), -[type="checkbox"]:checked { - position: absolute; - left: -9999px; - opacity: 0; -} - -[type="checkbox"] { - /* checkbox aspect */ -} - -[type="checkbox"] + label { - position: relative; - padding-left: 35px; - cursor: pointer; - display: inline-block; - height: 25px; - line-height: 25px; - font-size: 1rem; - -webkit-user-select: none; - /* webkit (safari, chrome) browsers */ - -moz-user-select: none; - /* mozilla browsers */ - -khtml-user-select: none; - /* webkit (konqueror) browsers */ - -ms-user-select: none; - /* IE10+ */ -} - -[type="checkbox"] + label:before, -[type="checkbox"]:not(.filled-in) + label:after { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 18px; - height: 18px; - z-index: 0; - border: 2px solid #5a5a5a; - border-radius: 1px; - margin-top: 2px; - transition: .2s; -} - -[type="checkbox"]:not(.filled-in) + label:after { - border: 0; - -webkit-transform: scale(0); - transform: scale(0); -} - -[type="checkbox"]:not(:checked):disabled + label:before { - border: none; - background-color: rgba(0, 0, 0, 0.26); -} - -[type="checkbox"].tabbed:focus + label:after { - -webkit-transform: scale(1); - transform: scale(1); - border: 0; - border-radius: 50%; - box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); - background-color: rgba(0, 0, 0, 0.1); -} - -[type="checkbox"]:checked + label:before { - top: -4px; - left: -5px; - width: 12px; - height: 22px; - border-top: 2px solid transparent; - border-left: 2px solid transparent; - border-right: 2px solid #26a69a; - border-bottom: 2px solid #26a69a; - -webkit-transform: rotate(40deg); - transform: rotate(40deg); - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; -} - -[type="checkbox"]:checked:disabled + label:before { - border-right: 2px solid rgba(0, 0, 0, 0.26); - border-bottom: 2px solid rgba(0, 0, 0, 0.26); -} - -/* Indeterminate checkbox */ -[type="checkbox"]:indeterminate + label:before { - top: -11px; - left: -12px; - width: 10px; - height: 22px; - border-top: none; - border-left: none; - border-right: 2px solid #26a69a; - border-bottom: none; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; -} - -[type="checkbox"]:indeterminate:disabled + label:before { - border-right: 2px solid rgba(0, 0, 0, 0.26); - background-color: transparent; -} - -[type="checkbox"].filled-in + label:after { - border-radius: 2px; -} - -[type="checkbox"].filled-in + label:before, -[type="checkbox"].filled-in + label:after { - content: ''; - left: 0; - position: absolute; - /* .1s delay is for check animation */ - transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; - z-index: 1; -} - -[type="checkbox"].filled-in:not(:checked) + label:before { - width: 0; - height: 0; - border: 3px solid transparent; - left: 6px; - top: 10px; - -webkit-transform: rotateZ(37deg); - transform: rotateZ(37deg); - -webkit-transform-origin: 20% 40%; - transform-origin: 100% 100%; -} - -[type="checkbox"].filled-in:not(:checked) + label:after { - height: 20px; - width: 20px; - background-color: transparent; - border: 2px solid #5a5a5a; - top: 0px; - z-index: 0; -} - -[type="checkbox"].filled-in:checked + label:before { - top: 0; - left: 1px; - width: 8px; - height: 13px; - border-top: 2px solid transparent; - border-left: 2px solid transparent; - border-right: 2px solid #fff; - border-bottom: 2px solid #fff; - -webkit-transform: rotateZ(37deg); - transform: rotateZ(37deg); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; -} - -[type="checkbox"].filled-in:checked + label:after { - top: 0; - width: 20px; - height: 20px; - border: 2px solid #26a69a; - background-color: #26a69a; - z-index: 0; -} - -[type="checkbox"].filled-in.tabbed:focus + label:after { - border-radius: 2px; - border-color: #5a5a5a; - background-color: rgba(0, 0, 0, 0.1); -} - -[type="checkbox"].filled-in.tabbed:checked:focus + label:after { - border-radius: 2px; - background-color: #26a69a; - border-color: #26a69a; -} - -[type="checkbox"].filled-in:disabled:not(:checked) + label:before { - background-color: transparent; - border: 2px solid transparent; -} - -[type="checkbox"].filled-in:disabled:not(:checked) + label:after { - border-color: transparent; - background-color: #BDBDBD; -} - -[type="checkbox"].filled-in:disabled:checked + label:before { - background-color: transparent; -} - -[type="checkbox"].filled-in:disabled:checked + label:after { - background-color: #BDBDBD; - border-color: #BDBDBD; -} - -/* Switch - ========================================================================== */ -.switch, -.switch * { - -webkit-user-select: none; - -moz-user-select: none; - -khtml-user-select: none; - -ms-user-select: none; -} - -.switch label { - cursor: pointer; -} - -.switch label input[type=checkbox] { - opacity: 0; - width: 0; - height: 0; -} - -.switch label input[type=checkbox]:checked + .lever { - background-color: #84c7c1; -} - -.switch label input[type=checkbox]:checked + .lever:after { - background-color: #26a69a; - left: 24px; -} - -.switch label .lever { - content: ""; - display: inline-block; - position: relative; - width: 40px; - height: 15px; - background-color: #818181; - border-radius: 15px; - margin-right: 10px; - transition: background 0.3s ease; - vertical-align: middle; - margin: 0 16px; -} - -.switch label .lever:after { - content: ""; - position: absolute; - display: inline-block; - width: 21px; - height: 21px; - background-color: #F1F1F1; - border-radius: 21px; - box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4); - left: -5px; - top: -3px; - transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease; -} - -input[type=checkbox]:checked:not(:disabled) ~ .lever:active::after, -input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::after { - box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(38, 166, 154, 0.1); -} - -input[type=checkbox]:not(:disabled) ~ .lever:active:after, -input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::after { - box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(0, 0, 0, 0.08); -} - -.switch input[type=checkbox][disabled] + .lever { - cursor: default; -} - -.switch label input[type=checkbox][disabled] + .lever:after, -.switch label input[type=checkbox][disabled]:checked + .lever:after { - background-color: #BDBDBD; -} - -/* Select Field - ========================================================================== */ -select { - display: none; -} - -select.browser-default { - display: block; -} - -select { - background-color: rgba(255, 255, 255, 0.9); - width: 100%; - padding: 5px; - border: 1px solid #f2f2f2; - border-radius: 2px; - height: 3rem; -} - -.select-label { - position: absolute; -} - -.select-wrapper { - position: relative; -} - -.select-wrapper input.select-dropdown { - position: relative; - cursor: pointer; - background-color: transparent; - border: none; - border-bottom: 1px solid #9e9e9e; - outline: none; - height: 3rem; - line-height: 3rem; - width: 100%; - font-size: 1rem; - margin: 0 0 20px 0; - padding: 0; - display: block; -} - -.select-wrapper span.caret { - color: initial; - position: absolute; - right: 0; - top: 0; - bottom: 0; - height: 10px; - margin: auto 0; - font-size: 10px; - line-height: 10px; -} - -.select-wrapper span.caret.disabled { - color: rgba(0, 0, 0, 0.26); -} - -.select-wrapper + label { - position: absolute; - top: -14px; - font-size: 0.8rem; -} - -select:disabled { - color: rgba(0, 0, 0, 0.3); -} - -.select-wrapper input.select-dropdown:disabled { - color: rgba(0, 0, 0, 0.3); - cursor: default; - -webkit-user-select: none; - /* webkit (safari, chrome) browsers */ - -moz-user-select: none; - /* mozilla browsers */ - -ms-user-select: none; - /* IE10+ */ - border-bottom: 1px solid rgba(0, 0, 0, 0.3); -} - -.select-wrapper i { - color: rgba(0, 0, 0, 0.3); -} - -.select-dropdown li.disabled, -.select-dropdown li.disabled > span, -.select-dropdown li.optgroup { - color: rgba(0, 0, 0, 0.3); - background-color: transparent; -} - -.prefix ~ .select-wrapper { - margin-left: 3rem; - width: 92%; - width: calc(100% - 3rem); -} - -.prefix ~ label { - margin-left: 3rem; -} - -.select-dropdown li img { - height: 40px; - width: 40px; - margin: 5px 15px; - float: right; -} - -.select-dropdown li.optgroup { - border-top: 1px solid #eee; -} - -.select-dropdown li.optgroup.selected > span { - color: rgba(0, 0, 0, 0.7); -} - -.select-dropdown li.optgroup > span { - color: rgba(0, 0, 0, 0.4); -} - -.select-dropdown li.optgroup ~ li.optgroup-option { - padding-left: 1rem; -} - -/* File Input - ========================================================================== */ -.file-field { - position: relative; -} - -.file-field .file-path-wrapper { - overflow: hidden; - padding-left: 10px; -} - -.file-field input.file-path { - width: 100%; -} - -.file-field .btn, .file-field .btn-large { - float: left; - height: 3rem; - line-height: 3rem; -} - -.file-field span { - cursor: pointer; -} - -.file-field input[type=file] { - position: absolute; - top: 0; - right: 0; - left: 0; - bottom: 0; - width: 100%; - margin: 0; - padding: 0; - font-size: 20px; - cursor: pointer; - opacity: 0; - filter: alpha(opacity=0); -} - -/* Range - ========================================================================== */ -.range-field { - position: relative; -} - -input[type=range], -input[type=range] + .thumb { - cursor: pointer; -} - -input[type=range] { - position: relative; - background-color: transparent; - border: none; - outline: none; - width: 100%; - margin: 15px 0; - padding: 0; -} - -input[type=range]:focus { - outline: none; -} - -input[type=range] + .thumb { - position: absolute; - top: 10px; - left: 0; - border: none; - height: 0; - width: 0; - border-radius: 50%; - background-color: #26a69a; - margin-left: 7px; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); -} - -input[type=range] + .thumb .value { - display: block; - width: 30px; - text-align: center; - color: #26a69a; - font-size: 0; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); -} - -input[type=range] + .thumb.active { - border-radius: 50% 50% 50% 0; -} - -input[type=range] + .thumb.active .value { - color: #fff; - margin-left: -1px; - margin-top: 8px; - font-size: 10px; -} - -input[type=range] { - -webkit-appearance: none; -} - -input[type=range]::-webkit-slider-runnable-track { - height: 3px; - background: #c2c0c2; - border: none; -} - -input[type=range]::-webkit-slider-thumb { - -webkit-appearance: none; - border: none; - height: 14px; - width: 14px; - border-radius: 50%; - background-color: #26a69a; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; - margin: -5px 0 0 0; - transition: .3s; -} - -input[type=range]:focus::-webkit-slider-runnable-track { - background: #ccc; -} - -input[type=range] { - /* fix for FF unable to apply focus style bug */ - border: 1px solid white; - /*required for proper track sizing in FF*/ -} - -input[type=range]::-moz-range-track { - height: 3px; - background: #ddd; - border: none; -} - -input[type=range]::-moz-range-thumb { - border: none; - height: 14px; - width: 14px; - border-radius: 50%; - background: #26a69a; - margin-top: -5px; -} - -input[type=range]:-moz-focusring { - outline: 1px solid #fff; - outline-offset: -1px; -} - -input[type=range]:focus::-moz-range-track { - background: #ccc; -} - -input[type=range]::-ms-track { - height: 3px; - background: transparent; - border-color: transparent; - border-width: 6px 0; - /*remove default tick marks*/ - color: transparent; -} - -input[type=range]::-ms-fill-lower { - background: #777; -} - -input[type=range]::-ms-fill-upper { - background: #ddd; -} - -input[type=range]::-ms-thumb { - border: none; - height: 14px; - width: 14px; - border-radius: 50%; - background: #26a69a; -} - -input[type=range]:focus::-ms-fill-lower { - background: #888; -} - -input[type=range]:focus::-ms-fill-upper { - background: #ccc; -} - -/*************** - Nav List -***************/ -.table-of-contents.fixed { - position: fixed; -} - -.table-of-contents li { - padding: 2px 0; -} - -.table-of-contents a { - display: inline-block; - font-weight: 300; - color: #757575; - padding-left: 20px; - height: 1.5rem; - line-height: 1.5rem; - letter-spacing: .4; - display: inline-block; -} - -.table-of-contents a:hover { - color: #a8a8a8; - padding-left: 19px; - border-left: 1px solid #ee6e73; -} - -.table-of-contents a.active { - font-weight: 500; - padding-left: 18px; - border-left: 2px solid #ee6e73; -} - -.side-nav { - position: fixed; - width: 300px; - left: 0; - top: 0; - margin: 0; - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - height: 100%; - height: calc(100% + 60px); - height: -moz-calc(100%); - padding-bottom: 60px; - background-color: #fff; - z-index: 999; - overflow-y: auto; - will-change: transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-transform: translateX(-105%); - transform: translateX(-105%); -} - -.side-nav.right-aligned { - right: 0; - -webkit-transform: translateX(105%); - transform: translateX(105%); - left: auto; - -webkit-transform: translateX(100%); - transform: translateX(100%); -} - -.side-nav .collapsible { - margin: 0; -} - -.side-nav li { - float: none; - line-height: 48px; -} - -.side-nav li.active { - background-color: rgba(0, 0, 0, 0.05); -} - -.side-nav li > a { - color: rgba(0, 0, 0, 0.87); - display: block; - font-size: 14px; - font-weight: 500; - height: 48px; - line-height: 48px; - padding: 0 32px; -} - -.side-nav li > a:hover { - background-color: rgba(0, 0, 0, 0.05); -} - -.side-nav li > a.btn, .side-nav li > a.btn-large, .side-nav li > a.btn-large, .side-nav li > a.btn-flat, .side-nav li > a.btn-floating { - margin: 10px 15px; -} - -.side-nav li > a.btn, .side-nav li > a.btn-large, .side-nav li > a.btn-large, .side-nav li > a.btn-floating { - color: #fff; -} - -.side-nav li > a.btn-flat { - color: #343434; -} - -.side-nav li > a.btn:hover, .side-nav li > a.btn-large:hover, .side-nav li > a.btn-large:hover { - background-color: #2bbbad; -} - -.side-nav li > a.btn-floating:hover { - background-color: #26a69a; -} - -.side-nav li > a > i, -.side-nav li > a > [class^="mdi-"], .side-nav li > a li > a > [class*="mdi-"], -.side-nav li > a > i.material-icons { - float: left; - height: 48px; - line-height: 48px; - margin: 0 32px 0 0; - width: 24px; - color: rgba(0, 0, 0, 0.54); -} - -.side-nav .divider { - margin: 8px 0 0 0; -} - -.side-nav .subheader { - cursor: initial; - pointer-events: none; - color: rgba(0, 0, 0, 0.54); - font-size: 14px; - font-weight: 500; - line-height: 48px; -} - -.side-nav .subheader:hover { - background-color: transparent; -} - -.side-nav .userView { - position: relative; - padding: 32px 32px 0; - margin-bottom: 8px; -} - -.side-nav .userView > a { - height: auto; - padding: 0; -} - -.side-nav .userView > a:hover { - background-color: transparent; -} - -.side-nav .userView .background { - overflow: hidden; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: -1; -} - -.side-nav .userView .circle, .side-nav .userView .name, .side-nav .userView .email { - display: block; -} - -.side-nav .userView .circle { - height: 64px; - width: 64px; -} - -.side-nav .userView .name, -.side-nav .userView .email { - font-size: 14px; - line-height: 24px; -} - -.side-nav .userView .name { - margin-top: 16px; - font-weight: 500; -} - -.side-nav .userView .email { - padding-bottom: 16px; - font-weight: 400; -} - -.drag-target { - height: 100%; - width: 10px; - position: fixed; - top: 0; - z-index: 998; -} - -.side-nav.fixed { - left: 0; - -webkit-transform: translateX(0); - transform: translateX(0); - position: fixed; -} - -.side-nav.fixed.right-aligned { - right: 0; - left: auto; -} - -@media only screen and (max-width: 992px) { - .side-nav.fixed { - -webkit-transform: translateX(-105%); - transform: translateX(-105%); - } - .side-nav.fixed.right-aligned { - -webkit-transform: translateX(105%); - transform: translateX(105%); - } - .side-nav a { - padding: 0 16px; - } - .side-nav .userView { - padding: 16px 16px 0; - } -} - -.side-nav .collapsible-body > ul:not(.collapsible) > li.active, -.side-nav.fixed .collapsible-body > ul:not(.collapsible) > li.active { - background-color: #ee6e73; -} - -.side-nav .collapsible-body > ul:not(.collapsible) > li.active a, -.side-nav.fixed .collapsible-body > ul:not(.collapsible) > li.active a { - color: #fff; -} - -.side-nav .collapsible-body { - padding: 0; -} - -#sidenav-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - height: 120vh; - background-color: rgba(0, 0, 0, 0.5); - z-index: 997; - will-change: opacity; -} - -/* - @license - Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - Code distributed by Google as part of the polymer project is also - subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -/**************************/ -/* STYLES FOR THE SPINNER */ -/**************************/ -/* - * Constants: - * STROKEWIDTH = 3px - * ARCSIZE = 270 degrees (amount of circle the arc takes up) - * ARCTIME = 1333ms (time it takes to expand and contract arc) - * ARCSTARTROT = 216 degrees (how much the start location of the arc - * should rotate each time, 216 gives us a - * 5 pointed star shape (it's 360/5 * 3). - * For a 7 pointed star, we might do - * 360/7 * 3 = 154.286) - * CONTAINERWIDTH = 28px - * SHRINK_TIME = 400ms - */ -.preloader-wrapper { - display: inline-block; - position: relative; - width: 50px; - height: 50px; -} - -.preloader-wrapper.small { - width: 36px; - height: 36px; -} - -.preloader-wrapper.big { - width: 64px; - height: 64px; -} - -.preloader-wrapper.active { - /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */ - -webkit-animation: container-rotate 1568ms linear infinite; - animation: container-rotate 1568ms linear infinite; -} - -@-webkit-keyframes container-rotate { - to { - -webkit-transform: rotate(360deg); - } -} - -@keyframes container-rotate { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -.spinner-layer { - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - border-color: #26a69a; -} - -.spinner-blue, -.spinner-blue-only { - border-color: #4285f4; -} - -.spinner-red, -.spinner-red-only { - border-color: #db4437; -} - -.spinner-yellow, -.spinner-yellow-only { - border-color: #f4b400; -} - -.spinner-green, -.spinner-green-only { - border-color: #0f9d58; -} - -/** - * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee): - * - * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't - * guarantee that the animation will start _exactly_ after that value. So we avoid using - * animation-delay and instead set custom keyframes for each color (as redundant as it - * seems). - * - * We write out each animation in full (instead of separating animation-name, - * animation-duration, etc.) because under the polyfill, Safari does not recognize those - * specific properties properly, treats them as -webkit-animation, and overrides the - * other animation rules. See https://github.com/Polymer/platform/issues/53. - */ -.active .spinner-layer.spinner-blue { - /* durations: 4 * ARCTIME */ - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; -} - -.active .spinner-layer.spinner-red { - /* durations: 4 * ARCTIME */ - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; -} - -.active .spinner-layer.spinner-yellow { - /* durations: 4 * ARCTIME */ - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; -} - -.active .spinner-layer.spinner-green { - /* durations: 4 * ARCTIME */ - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; -} - -.active .spinner-layer, -.active .spinner-layer.spinner-blue-only, -.active .spinner-layer.spinner-red-only, -.active .spinner-layer.spinner-yellow-only, -.active .spinner-layer.spinner-green-only { - /* durations: 4 * ARCTIME */ - opacity: 1; - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; -} - -@-webkit-keyframes fill-unfill-rotate { - 12.5% { - -webkit-transform: rotate(135deg); - } - /* 0.5 * ARCSIZE */ - 25% { - -webkit-transform: rotate(270deg); - } - /* 1 * ARCSIZE */ - 37.5% { - -webkit-transform: rotate(405deg); - } - /* 1.5 * ARCSIZE */ - 50% { - -webkit-transform: rotate(540deg); - } - /* 2 * ARCSIZE */ - 62.5% { - -webkit-transform: rotate(675deg); - } - /* 2.5 * ARCSIZE */ - 75% { - -webkit-transform: rotate(810deg); - } - /* 3 * ARCSIZE */ - 87.5% { - -webkit-transform: rotate(945deg); - } - /* 3.5 * ARCSIZE */ - to { - -webkit-transform: rotate(1080deg); - } - /* 4 * ARCSIZE */ -} - -@keyframes fill-unfill-rotate { - 12.5% { - -webkit-transform: rotate(135deg); - transform: rotate(135deg); - } - /* 0.5 * ARCSIZE */ - 25% { - -webkit-transform: rotate(270deg); - transform: rotate(270deg); - } - /* 1 * ARCSIZE */ - 37.5% { - -webkit-transform: rotate(405deg); - transform: rotate(405deg); - } - /* 1.5 * ARCSIZE */ - 50% { - -webkit-transform: rotate(540deg); - transform: rotate(540deg); - } - /* 2 * ARCSIZE */ - 62.5% { - -webkit-transform: rotate(675deg); - transform: rotate(675deg); - } - /* 2.5 * ARCSIZE */ - 75% { - -webkit-transform: rotate(810deg); - transform: rotate(810deg); - } - /* 3 * ARCSIZE */ - 87.5% { - -webkit-transform: rotate(945deg); - transform: rotate(945deg); - } - /* 3.5 * ARCSIZE */ - to { - -webkit-transform: rotate(1080deg); - transform: rotate(1080deg); - } - /* 4 * ARCSIZE */ -} - -@-webkit-keyframes blue-fade-in-out { - from { - opacity: 1; - } - 25% { - opacity: 1; - } - 26% { - opacity: 0; - } - 89% { - opacity: 0; - } - 90% { - opacity: 1; - } - 100% { - opacity: 1; - } -} - -@keyframes blue-fade-in-out { - from { - opacity: 1; - } - 25% { - opacity: 1; - } - 26% { - opacity: 0; - } - 89% { - opacity: 0; - } - 90% { - opacity: 1; - } - 100% { - opacity: 1; - } -} - -@-webkit-keyframes red-fade-in-out { - from { - opacity: 0; - } - 15% { - opacity: 0; - } - 25% { - opacity: 1; - } - 50% { - opacity: 1; - } - 51% { - opacity: 0; - } -} - -@keyframes red-fade-in-out { - from { - opacity: 0; - } - 15% { - opacity: 0; - } - 25% { - opacity: 1; - } - 50% { - opacity: 1; - } - 51% { - opacity: 0; - } -} - -@-webkit-keyframes yellow-fade-in-out { - from { - opacity: 0; - } - 40% { - opacity: 0; - } - 50% { - opacity: 1; - } - 75% { - opacity: 1; - } - 76% { - opacity: 0; - } -} - -@keyframes yellow-fade-in-out { - from { - opacity: 0; - } - 40% { - opacity: 0; - } - 50% { - opacity: 1; - } - 75% { - opacity: 1; - } - 76% { - opacity: 0; - } -} - -@-webkit-keyframes green-fade-in-out { - from { - opacity: 0; - } - 65% { - opacity: 0; - } - 75% { - opacity: 1; - } - 90% { - opacity: 1; - } - 100% { - opacity: 0; - } -} - -@keyframes green-fade-in-out { - from { - opacity: 0; - } - 65% { - opacity: 0; - } - 75% { - opacity: 1; - } - 90% { - opacity: 1; - } - 100% { - opacity: 0; - } -} - -/** - * Patch the gap that appear between the two adjacent div.circle-clipper while the - * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11). - */ -.gap-patch { - position: absolute; - top: 0; - left: 45%; - width: 10%; - height: 100%; - overflow: hidden; - border-color: inherit; -} - -.gap-patch .circle { - width: 1000%; - left: -450%; -} - -.circle-clipper { - display: inline-block; - position: relative; - width: 50%; - height: 100%; - overflow: hidden; - border-color: inherit; -} - -.circle-clipper .circle { - width: 200%; - height: 100%; - border-width: 3px; - /* STROKEWIDTH */ - border-style: solid; - border-color: inherit; - border-bottom-color: transparent !important; - border-radius: 50%; - -webkit-animation: none; - animation: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; -} - -.circle-clipper.left .circle { - left: 0; - border-right-color: transparent !important; - -webkit-transform: rotate(129deg); - transform: rotate(129deg); -} - -.circle-clipper.right .circle { - left: -100%; - border-left-color: transparent !important; - -webkit-transform: rotate(-129deg); - transform: rotate(-129deg); -} - -.active .circle-clipper.left .circle { - /* duration: ARCTIME */ - -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; -} - -.active .circle-clipper.right .circle { - /* duration: ARCTIME */ - -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; - animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; -} - -@-webkit-keyframes left-spin { - from { - -webkit-transform: rotate(130deg); - } - 50% { - -webkit-transform: rotate(-5deg); - } - to { - -webkit-transform: rotate(130deg); - } -} - -@keyframes left-spin { - from { - -webkit-transform: rotate(130deg); - transform: rotate(130deg); - } - 50% { - -webkit-transform: rotate(-5deg); - transform: rotate(-5deg); - } - to { - -webkit-transform: rotate(130deg); - transform: rotate(130deg); - } -} - -@-webkit-keyframes right-spin { - from { - -webkit-transform: rotate(-130deg); - } - 50% { - -webkit-transform: rotate(5deg); - } - to { - -webkit-transform: rotate(-130deg); - } -} - -@keyframes right-spin { - from { - -webkit-transform: rotate(-130deg); - transform: rotate(-130deg); - } - 50% { - -webkit-transform: rotate(5deg); - transform: rotate(5deg); - } - to { - -webkit-transform: rotate(-130deg); - transform: rotate(-130deg); - } -} - -#spinnerContainer.cooldown { - /* duration: SHRINK_TIME */ - -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); - animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); -} - -@-webkit-keyframes fade-out { - from { - opacity: 1; - } - to { - opacity: 0; - } -} - -@keyframes fade-out { - from { - opacity: 1; - } - to { - opacity: 0; - } -} - -.slider { - position: relative; - height: 400px; - width: 100%; -} - -.slider.fullscreen { - height: 100%; - width: 100%; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} - -.slider.fullscreen ul.slides { - height: 100%; -} - -.slider.fullscreen ul.indicators { - z-index: 2; - bottom: 30px; -} - -.slider .slides { - background-color: #9e9e9e; - margin: 0; - height: 400px; -} - -.slider .slides li { - opacity: 0; - position: absolute; - top: 0; - left: 0; - z-index: 1; - width: 100%; - height: inherit; - overflow: hidden; -} - -.slider .slides li img { - height: 100%; - width: 100%; - background-size: cover; - background-position: center; -} - -.slider .slides li .caption { - color: #fff; - position: absolute; - top: 15%; - left: 15%; - width: 70%; - opacity: 0; -} - -.slider .slides li .caption p { - color: #e0e0e0; -} - -.slider .slides li.active { - z-index: 2; -} - -.slider .indicators { - position: absolute; - text-align: center; - left: 0; - right: 0; - bottom: 0; - margin: 0; -} - -.slider .indicators .indicator-item { - display: inline-block; - position: relative; - cursor: pointer; - height: 16px; - width: 16px; - margin: 0 12px; - background-color: #e0e0e0; - transition: background-color .3s; - border-radius: 50%; -} - -.slider .indicators .indicator-item.active { - background-color: #4CAF50; -} - -.carousel { - overflow: hidden; - position: relative; - width: 100%; - height: 400px; - -webkit-perspective: 500px; - perspective: 500px; - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; -} - -.carousel.carousel-slider { - top: 0; - left: 0; - height: 0; -} - -.carousel.carousel-slider .carousel-fixed-item { - position: absolute; - left: 0; - right: 0; - bottom: 20px; - z-index: 1; -} - -.carousel.carousel-slider .carousel-fixed-item.with-indicators { - bottom: 68px; -} - -.carousel.carousel-slider .carousel-item { - width: 100%; - height: 100%; - min-height: 400px; - position: absolute; - top: 0; - left: 0; -} - -.carousel.carousel-slider .carousel-item h2 { - font-size: 24px; - font-weight: 500; - line-height: 32px; -} - -.carousel.carousel-slider .carousel-item p { - font-size: 15px; -} - -.carousel .carousel-item { - display: none; - width: 200px; - height: 200px; - position: absolute; - top: 0; - left: 0; -} - -.carousel .carousel-item > img { - width: 100%; -} - -.carousel .indicators { - position: absolute; - text-align: center; - left: 0; - right: 0; - bottom: 0; - margin: 0; -} - -.carousel .indicators .indicator-item { - display: inline-block; - position: relative; - cursor: pointer; - height: 8px; - width: 8px; - margin: 24px 4px; - background-color: rgba(255, 255, 255, 0.5); - transition: background-color .3s; - border-radius: 50%; -} - -.carousel .indicators .indicator-item.active { - background-color: #fff; -} - -.carousel.scrolling .carousel-item .materialboxed, -.carousel .carousel-item:not(.active) .materialboxed { - pointer-events: none; -} - -.tap-target-wrapper { - width: 800px; - height: 800px; - position: fixed; - z-index: 1000; - visibility: hidden; - transition: visibility 0s .3s; -} - -.tap-target-wrapper.open { - visibility: visible; - transition: visibility 0s; -} - -.tap-target-wrapper.open .tap-target { - -webkit-transform: scale(1); - transform: scale(1); - opacity: .95; - transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); - transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); - transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); -} - -.tap-target-wrapper.open .tap-target-wave::before { - -webkit-transform: scale(1); - transform: scale(1); -} - -.tap-target-wrapper.open .tap-target-wave::after { - visibility: visible; - -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; - animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; - transition: opacity .3s, visibility 0s 1s, -webkit-transform .3s; - transition: opacity .3s, transform .3s, visibility 0s 1s; - transition: opacity .3s, transform .3s, visibility 0s 1s, -webkit-transform .3s; -} - -.tap-target { - position: absolute; - font-size: 1rem; - border-radius: 50%; - background-color: #ee6e73; - box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2); - width: 100%; - height: 100%; - opacity: 0; - -webkit-transform: scale(0); - transform: scale(0); - transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); - transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); - transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); -} - -.tap-target-content { - position: relative; - display: table-cell; -} - -.tap-target-wave { - position: absolute; - border-radius: 50%; - z-index: 10001; -} - -.tap-target-wave::before, .tap-target-wave::after { - content: ''; - display: block; - position: absolute; - width: 100%; - height: 100%; - border-radius: 50%; - background-color: #ffffff; -} - -.tap-target-wave::before { - -webkit-transform: scale(0); - transform: scale(0); - transition: -webkit-transform .3s; - transition: transform .3s; - transition: transform .3s, -webkit-transform .3s; -} - -.tap-target-wave::after { - visibility: hidden; - transition: opacity .3s, visibility 0s, -webkit-transform .3s; - transition: opacity .3s, transform .3s, visibility 0s; - transition: opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s; - z-index: -1; -} - -.tap-target-origin { - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - z-index: 10002; - position: absolute !important; -} - -.tap-target-origin:not(.btn):not(.btn-large), .tap-target-origin:not(.btn):not(.btn-large):hover { - background: none; -} - -@media only screen and (max-width: 600px) { - .tap-target, .tap-target-wrapper { - width: 600px; - height: 600px; - } -} - -.pulse { - overflow: initial; - position: relative; -} - -.pulse::before { - content: ''; - display: block; - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - background-color: inherit; - border-radius: inherit; - transition: opacity .3s, -webkit-transform .3s; - transition: opacity .3s, transform .3s; - transition: opacity .3s, transform .3s, -webkit-transform .3s; - -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; - animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; - z-index: -1; -} - -@-webkit-keyframes pulse-animation { - 0% { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - opacity: 0; - -webkit-transform: scale(1.5); - transform: scale(1.5); - } - 100% { - opacity: 0; - -webkit-transform: scale(1.5); - transform: scale(1.5); - } -} - -@keyframes pulse-animation { - 0% { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - opacity: 0; - -webkit-transform: scale(1.5); - transform: scale(1.5); - } - 100% { - opacity: 0; - -webkit-transform: scale(1.5); - transform: scale(1.5); - } -} - -/* ========================================================================== - $BASE-PICKER - ========================================================================== */ -/** - * Note: the root picker element should *NOT* be styled more than what's here. - */ -.picker { - font-size: 16px; - text-align: left; - line-height: 1.2; - color: #000000; - position: absolute; - z-index: 10000; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -/** - * The picker input element. - */ -.picker__input { - cursor: default; -} - -/** - * When the picker is opened, the input element is "activated". - */ -.picker__input.picker__input--active { - border-color: #0089ec; -} - -/** - * The holder is the only "scrollable" top-level container element. - */ -.picker__holder { - width: 100%; - overflow-y: auto; - -webkit-overflow-scrolling: touch; -} - -/*! - * Default mobile-first, responsive styling for pickadate.js - * Demo: http://amsul.github.io/pickadate.js - */ -/** - * Note: the root picker element should *NOT* be styled more than what's here. - */ -/** - * Make the holder and frame fullscreen. - */ -.picker__holder, -.picker__frame { - bottom: 0; - left: 0; - right: 0; - top: 100%; -} - -/** - * The holder should overlay the entire screen. - */ -.picker__holder { - position: fixed; - transition: background 0.15s ease-out, top 0s 0.15s; - -webkit-backface-visibility: hidden; -} - -/** - * The frame that bounds the box contents of the picker. - */ -.picker__frame { - position: absolute; - margin: 0 auto; - min-width: 256px; - width: 300px; - max-height: 350px; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: alpha(opacity=0); - -moz-opacity: 0; - opacity: 0; - transition: all 0.15s ease-out; -} - -@media (min-height: 28.875em) { - .picker__frame { - overflow: visible; - top: auto; - bottom: -100%; - max-height: 80%; - } -} - -@media (min-height: 40.125em) { - .picker__frame { - margin-bottom: 7.5%; - } -} - -/** - * The wrapper sets the stage to vertically align the box contents. - */ -.picker__wrap { - display: table; - width: 100%; - height: 100%; -} - -@media (min-height: 28.875em) { - .picker__wrap { - display: block; - } -} - -/** - * The box contains all the picker contents. - */ -.picker__box { - background: #ffffff; - display: table-cell; - vertical-align: middle; -} - -@media (min-height: 28.875em) { - .picker__box { - display: block; - border: 1px solid #777777; - border-top-color: #898989; - border-bottom-width: 0; - border-radius: 5px 5px 0 0; - box-shadow: 0 12px 36px 16px rgba(0, 0, 0, 0.24); - } -} - -/** - * When the picker opens... - */ -.picker--opened .picker__holder { - top: 0; - background: transparent; - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)"; - zoom: 1; - background: rgba(0, 0, 0, 0.32); - transition: background 0.15s ease-out; -} - -.picker--opened .picker__frame { - top: 0; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; - filter: alpha(opacity=100); - -moz-opacity: 1; - opacity: 1; -} - -@media (min-height: 35.875em) { - .picker--opened .picker__frame { - top: 10%; - bottom: auto; - } -} - -/** - * For `large` screens, transform into an inline picker. - */ -/* ========================================================================== - CUSTOM MATERIALIZE STYLES - ========================================================================== */ -.picker__input.picker__input--active { - border-color: #E3F2FD; -} - -.picker__frame { - margin: 0 auto; - max-width: 325px; -} - -@media (min-height: 38.875em) { - .picker--opened .picker__frame { - top: 10%; - bottom: auto; - } -} - -/* ========================================================================== - $BASE-DATE-PICKER - ========================================================================== */ -/** - * The picker box. - */ -.picker__box { - padding: 0 1em; -} - -/** - * The header containing the month and year stuff. - */ -.picker__header { - text-align: center; - position: relative; - margin-top: .75em; -} - -/** - * The month and year labels. - */ -.picker__month, -.picker__year { - display: inline-block; - margin-left: .25em; - margin-right: .25em; -} - -/** - * The month and year selectors. - */ -.picker__select--month, -.picker__select--year { - height: 2em; - padding: 0; - margin-left: .25em; - margin-right: .25em; -} - -.picker__select--month.browser-default { - display: inline; - background-color: #FFFFFF; - width: 40%; -} - -.picker__select--year.browser-default { - display: inline; - background-color: #FFFFFF; - width: 26%; -} - -.picker__select--month:focus, -.picker__select--year:focus { - border-color: rgba(0, 0, 0, 0.05); -} - -/** - * The month navigation buttons. - */ -.picker__nav--prev, -.picker__nav--next { - position: absolute; - padding: .5em 1.25em; - width: 1em; - height: 1em; - box-sizing: content-box; - top: -0.25em; -} - -.picker__nav--prev { - left: -1em; - padding-right: 1.25em; -} - -.picker__nav--next { - right: -1em; - padding-left: 1.25em; -} - -.picker__nav--disabled, -.picker__nav--disabled:hover, -.picker__nav--disabled:before, -.picker__nav--disabled:before:hover { - cursor: default; - background: none; - border-right-color: #f5f5f5; - border-left-color: #f5f5f5; -} - -/** - * The calendar table of dates - */ -.picker__table { - text-align: center; - border-collapse: collapse; - border-spacing: 0; - table-layout: fixed; - font-size: 1rem; - width: 100%; - margin-top: .75em; - margin-bottom: .5em; -} - -.picker__table th, .picker__table td { - text-align: center; -} - -.picker__table td { - margin: 0; - padding: 0; -} - -/** - * The weekday labels - */ -.picker__weekday { - width: 14.285714286%; - font-size: .75em; - padding-bottom: .25em; - color: #999999; - font-weight: 500; - /* Increase the spacing a tad */ -} - -@media (min-height: 33.875em) { - .picker__weekday { - padding-bottom: .5em; - } -} - -/** - * The days on the calendar - */ -.picker__day--today { - position: relative; - color: #595959; - letter-spacing: -.3; - padding: .75rem 0; - font-weight: 400; - border: 1px solid transparent; -} - -.picker__day--disabled:before { - border-top-color: #aaaaaa; -} - -.picker__day--infocus:hover { - cursor: pointer; - color: #000; - font-weight: 500; -} - -.picker__day--outfocus { - display: none; - padding: .75rem 0; - color: #fff; -} - -.picker__day--outfocus:hover { - cursor: pointer; - color: #dddddd; - font-weight: 500; -} - -.picker__day--highlighted:hover, -.picker--focused .picker__day--highlighted { - cursor: pointer; -} - -.picker__day--selected, -.picker__day--selected:hover, -.picker--focused .picker__day--selected { - border-radius: 50%; - -webkit-transform: scale(0.75); - transform: scale(0.75); - background: #0089ec; - color: #ffffff; -} - -.picker__day--disabled, -.picker__day--disabled:hover, -.picker--focused .picker__day--disabled { - background: #f5f5f5; - border-color: #f5f5f5; - color: #dddddd; - cursor: default; -} - -.picker__day--highlighted.picker__day--disabled, -.picker__day--highlighted.picker__day--disabled:hover { - background: #bbbbbb; -} - -/** - * The footer containing the "today", "clear", and "close" buttons. - */ -.picker__footer { - text-align: center; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; -} - -.picker__button--today, -.picker__button--clear, -.picker__button--close { - border: 1px solid #ffffff; - background: #ffffff; - font-size: .8em; - padding: .66em 0; - font-weight: bold; - width: 33%; - display: inline-block; - vertical-align: bottom; -} - -.picker__button--today:hover, -.picker__button--clear:hover, -.picker__button--close:hover { - cursor: pointer; - color: #000000; - background: #b1dcfb; - border-bottom-color: #b1dcfb; -} - -.picker__button--today:focus, -.picker__button--clear:focus, -.picker__button--close:focus { - background: #b1dcfb; - border-color: rgba(0, 0, 0, 0.05); - outline: none; -} - -.picker__button--today:before, -.picker__button--clear:before, -.picker__button--close:before { - position: relative; - display: inline-block; - height: 0; -} - -.picker__button--today:before, -.picker__button--clear:before { - content: " "; - margin-right: .45em; -} - -.picker__button--today:before { - top: -0.05em; - width: 0; - border-top: 0.66em solid #0059bc; - border-left: .66em solid transparent; -} - -.picker__button--clear:before { - top: -0.25em; - width: .66em; - border-top: 3px solid #ee2200; -} - -.picker__button--close:before { - content: "\D7"; - top: -0.1em; - vertical-align: top; - font-size: 1.1em; - margin-right: .35em; - color: #777777; -} - -.picker__button--today[disabled], -.picker__button--today[disabled]:hover { - background: #f5f5f5; - border-color: #f5f5f5; - color: #dddddd; - cursor: default; -} - -.picker__button--today[disabled]:before { - border-top-color: #aaaaaa; -} - -/* ========================================================================== - CUSTOM MATERIALIZE STYLES - ========================================================================== */ -.picker__box { - border-radius: 2px; - overflow: hidden; -} - -.picker__date-display { - text-align: center; - background-color: #26a69a; - color: #fff; - padding-bottom: 15px; - font-weight: 300; -} - -.picker__nav--prev:hover, -.picker__nav--next:hover { - cursor: pointer; - color: #000000; - background: #a1ded8; -} - -.picker__weekday-display { - background-color: #1f897f; - padding: 10px; - font-weight: 200; - letter-spacing: .5; - font-size: 1rem; - margin-bottom: 15px; -} - -.picker__month-display { - text-transform: uppercase; - font-size: 2rem; -} - -.picker__day-display { - font-size: 4.5rem; - font-weight: 400; -} - -.picker__year-display { - font-size: 1.8rem; - color: rgba(255, 255, 255, 0.4); -} - -.picker__box { - padding: 0; -} - -.picker__calendar-container { - padding: 0 1rem; -} - -.picker__calendar-container thead { - border: none; -} - -.picker__table { - margin-top: 0; - margin-bottom: .5em; -} - -.picker__day--infocus { - color: #595959; - letter-spacing: -.3; - padding: .75rem 0; - font-weight: 400; - border: 1px solid transparent; -} - -.picker__day.picker__day--today { - color: #26a69a; -} - -.picker__day.picker__day--today.picker__day--selected { - color: #fff; -} - -.picker__weekday { - font-size: .9rem; -} - -.picker__day--selected, -.picker__day--selected:hover, -.picker--focused .picker__day--selected { - border-radius: 50%; - -webkit-transform: scale(0.9); - transform: scale(0.9); - background-color: #26a69a; - color: #ffffff; -} - -.picker__day--selected.picker__day--outfocus, -.picker__day--selected:hover.picker__day--outfocus, -.picker--focused .picker__day--selected.picker__day--outfocus { - background-color: #a1ded8; -} - -.picker__footer { - text-align: right; - padding: 5px 10px; -} - -.picker__close, .picker__today { - font-size: 1.1rem; - padding: 0 1rem; - color: #26a69a; -} - -.picker__nav--prev:before, -.picker__nav--next:before { - content: " "; - border-top: .5em solid transparent; - border-bottom: .5em solid transparent; - border-right: 0.75em solid #676767; - width: 0; - height: 0; - display: block; - margin: 0 auto; -} - -.picker__nav--next:before { - border-right: 0; - border-left: 0.75em solid #676767; -} - -button.picker__today:focus, button.picker__clear:focus, button.picker__close:focus { - background-color: #a1ded8; -} - -/* ========================================================================== - $BASE-TIME-PICKER - ========================================================================== */ -/** - * The list of times. - */ -.picker__list { - list-style: none; - padding: 0.75em 0 4.2em; - margin: 0; -} - -/** - * The times on the clock. - */ -.picker__list-item { - border-bottom: 1px solid #dddddd; - border-top: 1px solid #dddddd; - margin-bottom: -1px; - position: relative; - background: #ffffff; - padding: .75em 1.25em; -} - -@media (min-height: 46.75em) { - .picker__list-item { - padding: .5em 1em; - } -} - -/* Hovered time */ -.picker__list-item:hover { - cursor: pointer; - color: #000000; - background: #b1dcfb; - border-color: #0089ec; - z-index: 10; -} - -/* Highlighted and hovered/focused time */ -.picker__list-item--highlighted { - border-color: #0089ec; - z-index: 10; -} - -.picker__list-item--highlighted:hover, -.picker--focused .picker__list-item--highlighted { - cursor: pointer; - color: #000000; - background: #b1dcfb; -} - -/* Selected and hovered/focused time */ -.picker__list-item--selected, -.picker__list-item--selected:hover, -.picker--focused .picker__list-item--selected { - background: #0089ec; - color: #ffffff; - z-index: 10; -} - -/* Disabled time */ -.picker__list-item--disabled, -.picker__list-item--disabled:hover, -.picker--focused .picker__list-item--disabled { - background: #f5f5f5; - border-color: #f5f5f5; - color: #dddddd; - cursor: default; - border-color: #dddddd; - z-index: auto; -} - -/** - * The clear button - */ -.picker--time .picker__button--clear { - display: block; - width: 80%; - margin: 1em auto 0; - padding: 1em 1.25em; - background: none; - border: 0; - font-weight: 500; - font-size: .67em; - text-align: center; - text-transform: uppercase; - color: #666; -} - -.picker--time .picker__button--clear:hover, -.picker--time .picker__button--clear:focus { - color: #000000; - background: #b1dcfb; - background: #ee2200; - border-color: #ee2200; - cursor: pointer; - color: #ffffff; - outline: none; -} - -.picker--time .picker__button--clear:before { - top: -0.25em; - color: #666; - font-size: 1.25em; - font-weight: bold; -} - -.picker--time .picker__button--clear:hover:before, -.picker--time .picker__button--clear:focus:before { - color: #ffffff; -} - -/* ========================================================================== - $DEFAULT-TIME-PICKER - ========================================================================== */ -/** - * The frame the bounds the time picker. - */ -.picker--time .picker__frame { - min-width: 256px; - max-width: 320px; -} - -/** - * The picker box. - */ -.picker--time .picker__box { - font-size: 1em; - background: #f2f2f2; - padding: 0; -} - -@media (min-height: 40.125em) { - .picker--time .picker__box { - margin-bottom: 5em; - } -} diff --git a/pkgs/csslib/test/examples/mdc-card.css b/pkgs/csslib/test/examples/mdc-card.css deleted file mode 100644 index 72c5d439f..000000000 --- a/pkgs/csslib/test/examples/mdc-card.css +++ /dev/null @@ -1,412 +0,0 @@ -/** -* Copyright 2017 Google Inc. All Rights Reserved. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -**/ -/** - * The css property used for elevation. In most cases this should not be changed. It is exposed - * as a variable for abstraction / easy use when needing to reference the property directly, for - * example in a `will-change` rule. - */ -/** - * The default duration value for elevation transitions. - */ -/** - * The default easing value for elevation transitions. - */ -/** - * Applies the correct css rules to an element to give it the elevation specified by $z-value. - * The $z-value must be between 0 and 24. - */ -/** - * Returns a string that can be used as the value for a `transition` property for elevation. - * Calling this function directly is useful in situations where a component needs to transition - * more than one property. - * - * ```scss - * .foo { - * transition: mdc-elevation-transition-rule(), opacity 100ms ease; - * will-change: $mdc-elevation-property, opacity; - * } - * ``` - */ -/** - * Applies the correct css rules needed to have an element transition between elevations. - * This mixin should be applied to elements whose elevation values will change depending on their - * context (e.g. when active or disabled). - */ -/* - Precomputed linear color channel values, for use in contrast calculations. - See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests - - Algorithm, for c in 0 to 255: - f(c) { - c = c / 255; - return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); - } - - This lookup table is needed since there is no `pow` in SASS. -*/ -/** - * Calculate the luminance for a color. - * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests - */ -/** - * Calculate the contrast ratio between two colors. - * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests - */ -/** - * Determine whether to use dark or light text on top of given color. - * Returns "dark" for dark text and "light" for light text. - */ -/* - Main theme colors. - If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change. -*/ -/* Indigo 500 */ -/* Pink A200 */ -/* White */ -/* Which set of text colors to use for each main theme color (light or dark) */ -/* Text colors according to light vs dark and text type */ -/* Primary text colors for each of the theme colors */ -/** - * Applies the correct theme color style to the specified property. - * $property is typically color or background-color, but can be any CSS property that accepts color values. - * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss). - */ -/** - * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents. - * Should provide the $root-selector option if applied to anything other than the root selector. - * When used with a modifier class, provide a second argument of `true` for the $compound parameter - * to specify that this should be attached as a compound class. - * - * Usage example: - * - * ```scss - * .mdc-foo { - * color: black; - * - * @include mdc-theme-dark { - * color: white; - * } - * - * &__bar { - * background: black; - * - * @include mdc-theme-dark(".mdc-foo") { - * background: white; - * } - * } - * } - * - * .mdc-foo--disabled { - * opacity: .38; - * - * @include mdc-theme-dark(".mdc-foo", true) { - * opacity: .5; - * } - * } - * ``` - */ -/* TODO(sgomes): Figure out what to do about desktop font sizes. */ -/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */ -/** - * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout. - * - * Usage Example: - * ```scss - * .mdc-foo { - * position: absolute; - * left: 0; - * - * @include mdc-rtl { - * left: auto; - * right: 0; - * } - * - * &__bar { - * margin-left: 4px; - * @include mdc-rtl(".mdc-foo") { - * margin-left: auto; - * margin-right: 4px; - * } - * } - * } - * - * .mdc-foo--mod { - * padding-left: 4px; - * - * @include mdc-rtl { - * padding-left: auto; - * padding-right: 4px; - * } - * } - * ``` - * - * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work - * in most cases, it will in some cases lead to false negatives, e.g. - * - * ```html - * - * - *
- *
Styled incorrectly as RTL!
- *
- * - * ``` - * - * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this. - */ -/** - * Takes a base box-model property - e.g. margin / border / padding - along with a default - * direction and value, and emits rules which apply the value to the - * "-" property by default, but flips the direction - * when within an RTL context. - * - * For example: - * - * ```scss - * .mdc-foo { - * @include mdc-rtl-reflexive-box(margin, left, 8px); - * } - * ``` - * is equivalent to: - * - * ```scss - * .mdc-foo { - * margin-left: 8px; - * - * @include mdc-rtl { - * margin-right: 8px; - * margin-left: 0; - * } - * } - * ``` - * whereas: - * - * ```scss - * .mdc-foo { - * @include mdc-rtl-reflexive-box(margin, right, 8px); - * } - * ``` - * is equivalent to: - * - * ```scss - * .mdc-foo { - * margin-right: 8px; - * - * @include mdc-rtl { - * margin-right: 0; - * margin-left: 8px; - * } - * } - * ``` - * - * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`, - * e.g. `@include mdc-rtl-reflexive-box-property(margin, left, 8px, ".mdc-component")`. - * - * Note that this function will always zero out the original value in an RTL context. If you're - * trying to flip the values, use mdc-rtl-reflexive-property(). - */ -/** - * Takes a base property and emits rules that assign -left to and - * -right to in a LTR context, and vice versa in a RTL context. - * For example: - * - * ```scss - * .mdc-foo { - * @include mdc-rtl-reflexive-property(margin, auto, 12px); - * } - * ``` - * is equivalent to: - * - * ```scss - * .mdc-foo { - * margin-left: auto; - * margin-right: 12px; - * - * @include mdc-rtl { - * margin-left: 12px; - * margin-right: auto; - * } - * } - * ``` - * - * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`. - */ -/** - * Takes an argument specifying a horizontal position property (either "left" or "right") as well - * as a value, and applies that value to the specified position in a LTR context, and flips it in a - * RTL context. For example: - * - * ```scss - * .mdc-foo { - * @include mdc-rtl-reflexive-position(left, 0); - * position: absolute; - * } - * ``` - * is equivalent to: - * - * ```scss - * .mdc-foo { - * position: absolute; - * left: 0; - * right: initial; - * - * @include mdc-rtl { - * right: 0; - * left: initial; - * } - * } - * ``` - * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`. - */ -.mdc-card { - box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14); - display: flex; - flex-direction: column; - justify-content: flex-end; - padding: 0; - box-sizing: border-box; } - .mdc-card__primary { - padding: 16px; } - .mdc-card__primary .mdc-card__title--large { - padding-top: 8px; } - .mdc-card__primary:last-child { - padding-bottom: 24px; } - .mdc-card__supporting-text { - padding: 8px 16px; - box-sizing: border-box; - font-family: Roboto, sans-serif; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-size: 0.875rem; - font-weight: 400; - letter-spacing: 0.04em; - line-height: 1.25rem; - color: rgba(0, 0, 0, 0.87); - color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); } - .mdc-card--theme-dark .mdc-card__supporting-text, .mdc-theme--dark .mdc-card__supporting-text { - color: white; - color: var(--mdc-theme-text-primary-on-dark, white); } - .mdc-card__primary + .mdc-card__supporting-text { - margin-top: -8px; - padding-top: 0; } - .mdc-card__supporting-text:last-child { - padding-bottom: 24px; } - .mdc-card__actions { - display: flex; - padding: 8px; - box-sizing: border-box; } - .mdc-card--theme-dark .mdc-card__actions, .mdc-theme--dark .mdc-card__actions { - color: white; - color: var(--mdc-theme-text-primary-on-dark, white); } - .mdc-card__actions .mdc-card__action { - margin: 0 8px 0 0; } - [dir="rtl"] .mdc-card__actions .mdc-card__action, .mdc-card__actions .mdc-card__action[dir="rtl"] { - margin: 0 0 0 8px; } - .mdc-card__actions .mdc-card__action:last-child { - margin-left: 0; - margin-right: 0; } - [dir="rtl"] .mdc-card__actions .mdc-card__action:last-child, .mdc-card__actions .mdc-card__action:last-child[dir="rtl"] { - margin-left: 0; - margin-right: 0; } - .mdc-card__actions--vertical { - flex-flow: column; - align-items: flex-start; } - .mdc-card__actions--vertical .mdc-card__action { - margin: 0 0 4px; } - .mdc-card__actions--vertical .mdc-card__action:last-child { - margin-bottom: 0; } - .mdc-card__media { - display: flex; - flex-direction: column; - justify-content: flex-end; - padding: 16px; - box-sizing: border-box; } - .mdc-card__media-item { - display: inline-block; - width: auto; - height: 80px; - margin: 16px 0 0; - padding: 0; } - .mdc-card__media-item--1dot5x { - width: auto; - height: 120px; } - .mdc-card__media-item--2x { - width: auto; - height: 160px; } - .mdc-card__media-item--3x { - width: auto; - height: 240px; } - .mdc-card__title { - font-family: Roboto, sans-serif; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-size: 0.875rem; - font-weight: 500; - letter-spacing: 0.04em; - line-height: 1.5rem; - color: rgba(0, 0, 0, 0.87); - color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); - margin: -.063rem 0; } - .mdc-card--theme-dark .mdc-card__title, .mdc-theme--dark .mdc-card__title { - color: white; - color: var(--mdc-theme-text-primary-on-dark, white); } - .mdc-card__title--large { - font-family: Roboto, sans-serif; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-size: 1.5rem; - font-weight: 400; - letter-spacing: normal; - line-height: 2rem; - margin: 0; } - .mdc-card__subtitle { - font-family: Roboto, sans-serif; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-size: 0.875rem; - font-weight: 400; - letter-spacing: 0.04em; - line-height: 1.25rem; - color: rgba(0, 0, 0, 0.87); - color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); - margin: -.063rem 0; } - .mdc-card--theme-dark .mdc-card__subtitle, .mdc-theme--dark .mdc-card__subtitle { - color: white; - color: var(--mdc-theme-text-primary-on-dark, white); } - .mdc-card__horizontal-block { - display: flex; - flex-direction: row; - align-items: flex-start; - justify-content: space-between; - box-sizing: border-box; - padding: 0; - padding-left: 0; - padding-right: 16px; } - [dir="rtl"] .mdc-card__horizontal-block, .mdc-card__horizontal-block[dir="rtl"] { - padding-left: 16px; - padding-right: 0; } - .mdc-card__horizontal-block .mdc-card__actions--vertical { - margin: 16px; } - .mdc-card__horizontal-block .mdc-card__media-item { - margin-left: 16px; - margin-right: 0; } - [dir="rtl"] .mdc-card__horizontal-block .mdc-card__media-item, .mdc-card__horizontal-block .mdc-card__media-item[dir="rtl"] { - margin-left: 0; - margin-right: 16px; } - .mdc-card__horizontal-block .mdc-card__media-item--3x { - margin-bottom: 16px; } - -/*# sourceMappingURL=mdc-card.css.map */ diff --git a/pkgs/csslib/test/examples/mdc-layout.css b/pkgs/csslib/test/examples/mdc-layout.css deleted file mode 100644 index 75e6390bc..000000000 --- a/pkgs/csslib/test/examples/mdc-layout.css +++ /dev/null @@ -1,434 +0,0 @@ -/** -* Copyright 2017 Google Inc. All Rights Reserved. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -**/ -.mdc-layout-grid { - display: flex; - flex-flow: row wrap; - align-items: stretch; - margin: 0 auto; - box-sizing: border-box; - padding: 8px; - padding: calc(var(--mdc-layout-grid-margin, 16px) - var(--mdc-layout-grid-gutter, 16px) / 2); } - @supports (display: grid) { - .mdc-layout-grid { - display: grid; - grid-gap: 16px; - grid-gap: var(--mdc-layout-grid-gutter, 16px); - padding: 16px; - padding: var(--mdc-layout-grid-margin, 16px); } - @media (min-width: 840px) { - .mdc-layout-grid { - grid-template-columns: repeat(12, minmax(0, 1fr)); } } - @media (min-width: 480px) and (max-width: 839px) { - .mdc-layout-grid { - grid-template-columns: repeat(8, minmax(0, 1fr)); } } - @media (max-width: 479px) { - .mdc-layout-grid { - grid-template-columns: repeat(4, minmax(0, 1fr)); } } } - -.mdc-layout-grid__cell { - margin: 8px; - margin: calc(var(--mdc-layout-grid-gutter, 16px) / 2); - box-sizing: border-box; } - @supports (display: grid) { - .mdc-layout-grid__cell { - margin: 0; } } - @media (min-width: 840px) { - .mdc-layout-grid__cell { - width: calc(33.33333% - 16px); - width: calc(33.33333% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell { - width: auto; - grid-column-end: span 4; } } } - @media (min-width: 480px) and (max-width: 839px) { - .mdc-layout-grid__cell { - width: calc(50% - 16px); - width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell { - width: auto; - grid-column-end: span 4; } } } - @media (max-width: 479px) { - .mdc-layout-grid__cell { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell { - width: auto; - grid-column-end: span 4; } } } - @media (min-width: 840px) { - .mdc-layout-grid__cell--span-1, - .mdc-layout-grid__cell--span-1-desktop.mdc-layout-grid__cell--span-1-desktop { - width: calc(8.33333% - 16px); - width: calc(8.33333% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-1, - .mdc-layout-grid__cell--span-1-desktop.mdc-layout-grid__cell--span-1-desktop { - width: auto; - grid-column-end: span 1; } } - .mdc-layout-grid__cell--span-2, - .mdc-layout-grid__cell--span-2-desktop.mdc-layout-grid__cell--span-2-desktop { - width: calc(16.66667% - 16px); - width: calc(16.66667% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-2, - .mdc-layout-grid__cell--span-2-desktop.mdc-layout-grid__cell--span-2-desktop { - width: auto; - grid-column-end: span 2; } } - .mdc-layout-grid__cell--span-3, - .mdc-layout-grid__cell--span-3-desktop.mdc-layout-grid__cell--span-3-desktop { - width: calc(25% - 16px); - width: calc(25% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-3, - .mdc-layout-grid__cell--span-3-desktop.mdc-layout-grid__cell--span-3-desktop { - width: auto; - grid-column-end: span 3; } } - .mdc-layout-grid__cell--span-4, - .mdc-layout-grid__cell--span-4-desktop.mdc-layout-grid__cell--span-4-desktop { - width: calc(33.33333% - 16px); - width: calc(33.33333% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-4, - .mdc-layout-grid__cell--span-4-desktop.mdc-layout-grid__cell--span-4-desktop { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-5, - .mdc-layout-grid__cell--span-5-desktop.mdc-layout-grid__cell--span-5-desktop { - width: calc(41.66667% - 16px); - width: calc(41.66667% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-5, - .mdc-layout-grid__cell--span-5-desktop.mdc-layout-grid__cell--span-5-desktop { - width: auto; - grid-column-end: span 5; } } - .mdc-layout-grid__cell--span-6, - .mdc-layout-grid__cell--span-6-desktop.mdc-layout-grid__cell--span-6-desktop { - width: calc(50% - 16px); - width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-6, - .mdc-layout-grid__cell--span-6-desktop.mdc-layout-grid__cell--span-6-desktop { - width: auto; - grid-column-end: span 6; } } - .mdc-layout-grid__cell--span-7, - .mdc-layout-grid__cell--span-7-desktop.mdc-layout-grid__cell--span-7-desktop { - width: calc(58.33333% - 16px); - width: calc(58.33333% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-7, - .mdc-layout-grid__cell--span-7-desktop.mdc-layout-grid__cell--span-7-desktop { - width: auto; - grid-column-end: span 7; } } - .mdc-layout-grid__cell--span-8, - .mdc-layout-grid__cell--span-8-desktop.mdc-layout-grid__cell--span-8-desktop { - width: calc(66.66667% - 16px); - width: calc(66.66667% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-8, - .mdc-layout-grid__cell--span-8-desktop.mdc-layout-grid__cell--span-8-desktop { - width: auto; - grid-column-end: span 8; } } - .mdc-layout-grid__cell--span-9, - .mdc-layout-grid__cell--span-9-desktop.mdc-layout-grid__cell--span-9-desktop { - width: calc(75% - 16px); - width: calc(75% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-9, - .mdc-layout-grid__cell--span-9-desktop.mdc-layout-grid__cell--span-9-desktop { - width: auto; - grid-column-end: span 9; } } - .mdc-layout-grid__cell--span-10, - .mdc-layout-grid__cell--span-10-desktop.mdc-layout-grid__cell--span-10-desktop { - width: calc(83.33333% - 16px); - width: calc(83.33333% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-10, - .mdc-layout-grid__cell--span-10-desktop.mdc-layout-grid__cell--span-10-desktop { - width: auto; - grid-column-end: span 10; } } - .mdc-layout-grid__cell--span-11, - .mdc-layout-grid__cell--span-11-desktop.mdc-layout-grid__cell--span-11-desktop { - width: calc(91.66667% - 16px); - width: calc(91.66667% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-11, - .mdc-layout-grid__cell--span-11-desktop.mdc-layout-grid__cell--span-11-desktop { - width: auto; - grid-column-end: span 11; } } - .mdc-layout-grid__cell--span-12, - .mdc-layout-grid__cell--span-12-desktop.mdc-layout-grid__cell--span-12-desktop { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-12, - .mdc-layout-grid__cell--span-12-desktop.mdc-layout-grid__cell--span-12-desktop { - width: auto; - grid-column-end: span 12; } } } - @media (min-width: 480px) and (max-width: 839px) { - .mdc-layout-grid__cell--span-1, - .mdc-layout-grid__cell--span-1-tablet.mdc-layout-grid__cell--span-1-tablet { - width: calc(12.5% - 16px); - width: calc(12.5% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-1, - .mdc-layout-grid__cell--span-1-tablet.mdc-layout-grid__cell--span-1-tablet { - width: auto; - grid-column-end: span 1; } } - .mdc-layout-grid__cell--span-2, - .mdc-layout-grid__cell--span-2-tablet.mdc-layout-grid__cell--span-2-tablet { - width: calc(25% - 16px); - width: calc(25% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-2, - .mdc-layout-grid__cell--span-2-tablet.mdc-layout-grid__cell--span-2-tablet { - width: auto; - grid-column-end: span 2; } } - .mdc-layout-grid__cell--span-3, - .mdc-layout-grid__cell--span-3-tablet.mdc-layout-grid__cell--span-3-tablet { - width: calc(37.5% - 16px); - width: calc(37.5% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-3, - .mdc-layout-grid__cell--span-3-tablet.mdc-layout-grid__cell--span-3-tablet { - width: auto; - grid-column-end: span 3; } } - .mdc-layout-grid__cell--span-4, - .mdc-layout-grid__cell--span-4-tablet.mdc-layout-grid__cell--span-4-tablet { - width: calc(50% - 16px); - width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-4, - .mdc-layout-grid__cell--span-4-tablet.mdc-layout-grid__cell--span-4-tablet { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-5, - .mdc-layout-grid__cell--span-5-tablet.mdc-layout-grid__cell--span-5-tablet { - width: calc(62.5% - 16px); - width: calc(62.5% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-5, - .mdc-layout-grid__cell--span-5-tablet.mdc-layout-grid__cell--span-5-tablet { - width: auto; - grid-column-end: span 5; } } - .mdc-layout-grid__cell--span-6, - .mdc-layout-grid__cell--span-6-tablet.mdc-layout-grid__cell--span-6-tablet { - width: calc(75% - 16px); - width: calc(75% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-6, - .mdc-layout-grid__cell--span-6-tablet.mdc-layout-grid__cell--span-6-tablet { - width: auto; - grid-column-end: span 6; } } - .mdc-layout-grid__cell--span-7, - .mdc-layout-grid__cell--span-7-tablet.mdc-layout-grid__cell--span-7-tablet { - width: calc(87.5% - 16px); - width: calc(87.5% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-7, - .mdc-layout-grid__cell--span-7-tablet.mdc-layout-grid__cell--span-7-tablet { - width: auto; - grid-column-end: span 7; } } - .mdc-layout-grid__cell--span-8, - .mdc-layout-grid__cell--span-8-tablet.mdc-layout-grid__cell--span-8-tablet { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-8, - .mdc-layout-grid__cell--span-8-tablet.mdc-layout-grid__cell--span-8-tablet { - width: auto; - grid-column-end: span 8; } } - .mdc-layout-grid__cell--span-9, - .mdc-layout-grid__cell--span-9-tablet.mdc-layout-grid__cell--span-9-tablet { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-9, - .mdc-layout-grid__cell--span-9-tablet.mdc-layout-grid__cell--span-9-tablet { - width: auto; - grid-column-end: span 8; } } - .mdc-layout-grid__cell--span-10, - .mdc-layout-grid__cell--span-10-tablet.mdc-layout-grid__cell--span-10-tablet { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-10, - .mdc-layout-grid__cell--span-10-tablet.mdc-layout-grid__cell--span-10-tablet { - width: auto; - grid-column-end: span 8; } } - .mdc-layout-grid__cell--span-11, - .mdc-layout-grid__cell--span-11-tablet.mdc-layout-grid__cell--span-11-tablet { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-11, - .mdc-layout-grid__cell--span-11-tablet.mdc-layout-grid__cell--span-11-tablet { - width: auto; - grid-column-end: span 8; } } - .mdc-layout-grid__cell--span-12, - .mdc-layout-grid__cell--span-12-tablet.mdc-layout-grid__cell--span-12-tablet { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-12, - .mdc-layout-grid__cell--span-12-tablet.mdc-layout-grid__cell--span-12-tablet { - width: auto; - grid-column-end: span 8; } } } - @media (max-width: 479px) { - .mdc-layout-grid__cell--span-1, - .mdc-layout-grid__cell--span-1-phone.mdc-layout-grid__cell--span-1-phone { - width: calc(25% - 16px); - width: calc(25% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-1, - .mdc-layout-grid__cell--span-1-phone.mdc-layout-grid__cell--span-1-phone { - width: auto; - grid-column-end: span 1; } } - .mdc-layout-grid__cell--span-2, - .mdc-layout-grid__cell--span-2-phone.mdc-layout-grid__cell--span-2-phone { - width: calc(50% - 16px); - width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-2, - .mdc-layout-grid__cell--span-2-phone.mdc-layout-grid__cell--span-2-phone { - width: auto; - grid-column-end: span 2; } } - .mdc-layout-grid__cell--span-3, - .mdc-layout-grid__cell--span-3-phone.mdc-layout-grid__cell--span-3-phone { - width: calc(75% - 16px); - width: calc(75% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-3, - .mdc-layout-grid__cell--span-3-phone.mdc-layout-grid__cell--span-3-phone { - width: auto; - grid-column-end: span 3; } } - .mdc-layout-grid__cell--span-4, - .mdc-layout-grid__cell--span-4-phone.mdc-layout-grid__cell--span-4-phone { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-4, - .mdc-layout-grid__cell--span-4-phone.mdc-layout-grid__cell--span-4-phone { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-5, - .mdc-layout-grid__cell--span-5-phone.mdc-layout-grid__cell--span-5-phone { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-5, - .mdc-layout-grid__cell--span-5-phone.mdc-layout-grid__cell--span-5-phone { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-6, - .mdc-layout-grid__cell--span-6-phone.mdc-layout-grid__cell--span-6-phone { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-6, - .mdc-layout-grid__cell--span-6-phone.mdc-layout-grid__cell--span-6-phone { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-7, - .mdc-layout-grid__cell--span-7-phone.mdc-layout-grid__cell--span-7-phone { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-7, - .mdc-layout-grid__cell--span-7-phone.mdc-layout-grid__cell--span-7-phone { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-8, - .mdc-layout-grid__cell--span-8-phone.mdc-layout-grid__cell--span-8-phone { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-8, - .mdc-layout-grid__cell--span-8-phone.mdc-layout-grid__cell--span-8-phone { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-9, - .mdc-layout-grid__cell--span-9-phone.mdc-layout-grid__cell--span-9-phone { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-9, - .mdc-layout-grid__cell--span-9-phone.mdc-layout-grid__cell--span-9-phone { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-10, - .mdc-layout-grid__cell--span-10-phone.mdc-layout-grid__cell--span-10-phone { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-10, - .mdc-layout-grid__cell--span-10-phone.mdc-layout-grid__cell--span-10-phone { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-11, - .mdc-layout-grid__cell--span-11-phone.mdc-layout-grid__cell--span-11-phone { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-11, - .mdc-layout-grid__cell--span-11-phone.mdc-layout-grid__cell--span-11-phone { - width: auto; - grid-column-end: span 4; } } - .mdc-layout-grid__cell--span-12, - .mdc-layout-grid__cell--span-12-phone.mdc-layout-grid__cell--span-12-phone { - width: calc(100% - 16px); - width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); } - @supports (display: grid) { - .mdc-layout-grid__cell--span-12, - .mdc-layout-grid__cell--span-12-phone.mdc-layout-grid__cell--span-12-phone { - width: auto; - grid-column-end: span 4; } } } - .mdc-layout-grid__cell--order-1 { - order: 1; } - .mdc-layout-grid__cell--order-2 { - order: 2; } - .mdc-layout-grid__cell--order-3 { - order: 3; } - .mdc-layout-grid__cell--order-4 { - order: 4; } - .mdc-layout-grid__cell--order-5 { - order: 5; } - .mdc-layout-grid__cell--order-6 { - order: 6; } - .mdc-layout-grid__cell--order-7 { - order: 7; } - .mdc-layout-grid__cell--order-8 { - order: 8; } - .mdc-layout-grid__cell--order-9 { - order: 9; } - .mdc-layout-grid__cell--order-10 { - order: 10; } - .mdc-layout-grid__cell--order-11 { - order: 11; } - .mdc-layout-grid__cell--order-12 { - order: 12; } - .mdc-layout-grid__cell--align-top { - align-self: flex-start; } - @supports (display: grid) { - .mdc-layout-grid__cell--align-top { - align-self: start; } } - .mdc-layout-grid__cell--align-middle { - align-self: center; } - .mdc-layout-grid__cell--align-bottom { - align-self: flex-end; } - @supports (display: grid) { - .mdc-layout-grid__cell--align-bottom { - align-self: end; } } diff --git a/pkgs/csslib/test/examples/pure.css b/pkgs/csslib/test/examples/pure.css deleted file mode 100644 index 9f3d66a20..000000000 --- a/pkgs/csslib/test/examples/pure.css +++ /dev/null @@ -1,1507 +0,0 @@ -/*! -Pure v0.6.2 -Copyright 2013 Yahoo! -Licensed under the BSD License. -https://github.com/yahoo/pure/blob/master/LICENSE.md -*/ -/*! -normalize.css v^3.0 | MIT License | git.io/normalize -Copyright (c) Nicolas Gallagher and Jonathan Neal -*/ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS and IE text size adjust after device orientation change, - * without disabling user zoom. - */ -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ - -audio, -canvas, -progress, -video { - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * Improve readability of focused elements when they are also in an - * active/hover state. - */ - -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9/10. - */ - -img { - border: 0; -} - -/** - * Correct overflow not hidden in IE 9/10/11. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari. - */ - -figure { - margin: 1em 40px; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ - -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -/* Forms - ========================================================================== */ - -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ - -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ - -button, -input, -optgroup, -select, -textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ - -button { - overflow: visible; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -input { - line-height: normal; -} - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - box-sizing: content-box; /* 2 */ -} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ - -textarea { - overflow: auto; -} - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ - -optgroup { - font-weight: bold; -} - -/* Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} - -/*csslint important:false*/ - -/* ========================================================================== - Pure Base Extras - ========================================================================== */ - -/** - * Extra rules that Pure adds on top of Normalize.css - */ - -/** - * Always hide an element when it has the `hidden` HTML attribute. - */ - -.hidden, -[hidden] { - display: none !important; -} - -/** - * Add this class to an image to make it fit within it's fluid parent wrapper while maintaining - * aspect ratio. - */ -.pure-img { - max-width: 100%; - height: auto; - display: block; -} - -/*csslint regex-selectors:false, known-properties:false, duplicate-properties:false*/ - -.pure-g { - letter-spacing: -0.31em; /* Webkit: collapse white-space between units */ - *letter-spacing: normal; /* reset IE < 8 */ - *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */ - text-rendering: optimizespeed; /* Webkit: fixes text-rendering: optimizeLegibility */ - - /* - Sets the font stack to fonts known to work properly with the above letter - and word spacings. See: https://github.com/yahoo/pure/issues/41/ - - The following font stack makes Pure Grids work on all known environments. - - * FreeSans: Ships with many Linux distros, including Ubuntu - - * Arimo: Ships with Chrome OS. Arimo has to be defined before Helvetica and - Arial to get picked up by the browser, even though neither is available - in Chrome OS. - - * Droid Sans: Ships with all versions of Android. - - * Helvetica, Arial, sans-serif: Common font stack on OS X and Windows. - */ - font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif; - - /* Use flexbox when possible to avoid `letter-spacing` side-effects. */ - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: row wrap; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - - /* Prevents distributing space between rows */ - -webkit-align-content: flex-start; - -ms-flex-line-pack: start; - align-content: flex-start; -} - -/* IE10 display: -ms-flexbox (and display: flex in IE 11) does not work inside a table; fall back to block and rely on font hack */ -@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { - table .pure-g { - display: block; - } -} - -/* Opera as of 12 on Windows needs word-spacing. - The ".opera-only" selector is used to prevent actual prefocus styling - and is not required in markup. -*/ -.opera-only :-o-prefocus, -.pure-g { - word-spacing: -0.43em; -} - -.pure-u { - display: inline-block; - *display: inline; /* IE < 8: fake inline-block */ - zoom: 1; - letter-spacing: normal; - word-spacing: normal; - vertical-align: top; - text-rendering: auto; -} - -/* -Resets the font family back to the OS/browser's default sans-serif font, -this the same font stack that Normalize.css sets for the `body`. -*/ -.pure-g [class *= "pure-u"] { - font-family: sans-serif; -} - -.pure-u-1, -.pure-u-1-1, -.pure-u-1-2, -.pure-u-1-3, -.pure-u-2-3, -.pure-u-1-4, -.pure-u-3-4, -.pure-u-1-5, -.pure-u-2-5, -.pure-u-3-5, -.pure-u-4-5, -.pure-u-5-5, -.pure-u-1-6, -.pure-u-5-6, -.pure-u-1-8, -.pure-u-3-8, -.pure-u-5-8, -.pure-u-7-8, -.pure-u-1-12, -.pure-u-5-12, -.pure-u-7-12, -.pure-u-11-12, -.pure-u-1-24, -.pure-u-2-24, -.pure-u-3-24, -.pure-u-4-24, -.pure-u-5-24, -.pure-u-6-24, -.pure-u-7-24, -.pure-u-8-24, -.pure-u-9-24, -.pure-u-10-24, -.pure-u-11-24, -.pure-u-12-24, -.pure-u-13-24, -.pure-u-14-24, -.pure-u-15-24, -.pure-u-16-24, -.pure-u-17-24, -.pure-u-18-24, -.pure-u-19-24, -.pure-u-20-24, -.pure-u-21-24, -.pure-u-22-24, -.pure-u-23-24, -.pure-u-24-24 { - display: inline-block; - *display: inline; - zoom: 1; - letter-spacing: normal; - word-spacing: normal; - vertical-align: top; - text-rendering: auto; -} - -.pure-u-1-24 { - width: 4.1667%; - *width: 4.1357%; -} - -.pure-u-1-12, -.pure-u-2-24 { - width: 8.3333%; - *width: 8.3023%; -} - -.pure-u-1-8, -.pure-u-3-24 { - width: 12.5000%; - *width: 12.4690%; -} - -.pure-u-1-6, -.pure-u-4-24 { - width: 16.6667%; - *width: 16.6357%; -} - -.pure-u-1-5 { - width: 20%; - *width: 19.9690%; -} - -.pure-u-5-24 { - width: 20.8333%; - *width: 20.8023%; -} - -.pure-u-1-4, -.pure-u-6-24 { - width: 25%; - *width: 24.9690%; -} - -.pure-u-7-24 { - width: 29.1667%; - *width: 29.1357%; -} - -.pure-u-1-3, -.pure-u-8-24 { - width: 33.3333%; - *width: 33.3023%; -} - -.pure-u-3-8, -.pure-u-9-24 { - width: 37.5000%; - *width: 37.4690%; -} - -.pure-u-2-5 { - width: 40%; - *width: 39.9690%; -} - -.pure-u-5-12, -.pure-u-10-24 { - width: 41.6667%; - *width: 41.6357%; -} - -.pure-u-11-24 { - width: 45.8333%; - *width: 45.8023%; -} - -.pure-u-1-2, -.pure-u-12-24 { - width: 50%; - *width: 49.9690%; -} - -.pure-u-13-24 { - width: 54.1667%; - *width: 54.1357%; -} - -.pure-u-7-12, -.pure-u-14-24 { - width: 58.3333%; - *width: 58.3023%; -} - -.pure-u-3-5 { - width: 60%; - *width: 59.9690%; -} - -.pure-u-5-8, -.pure-u-15-24 { - width: 62.5000%; - *width: 62.4690%; -} - -.pure-u-2-3, -.pure-u-16-24 { - width: 66.6667%; - *width: 66.6357%; -} - -.pure-u-17-24 { - width: 70.8333%; - *width: 70.8023%; -} - -.pure-u-3-4, -.pure-u-18-24 { - width: 75%; - *width: 74.9690%; -} - -.pure-u-19-24 { - width: 79.1667%; - *width: 79.1357%; -} - -.pure-u-4-5 { - width: 80%; - *width: 79.9690%; -} - -.pure-u-5-6, -.pure-u-20-24 { - width: 83.3333%; - *width: 83.3023%; -} - -.pure-u-7-8, -.pure-u-21-24 { - width: 87.5000%; - *width: 87.4690%; -} - -.pure-u-11-12, -.pure-u-22-24 { - width: 91.6667%; - *width: 91.6357%; -} - -.pure-u-23-24 { - width: 95.8333%; - *width: 95.8023%; -} - -.pure-u-1, -.pure-u-1-1, -.pure-u-5-5, -.pure-u-24-24 { - width: 100%; -} -.pure-button { - /* Structure */ - display: inline-block; - zoom: 1; - line-height: normal; - white-space: nowrap; - vertical-align: middle; - text-align: center; - cursor: pointer; - -webkit-user-drag: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - box-sizing: border-box; -} - -/* Firefox: Get rid of the inner focus border */ -.pure-button::-moz-focus-inner { - padding: 0; - border: 0; -} - -/* Inherit .pure-g styles */ -.pure-button-group { - letter-spacing: -0.31em; /* Webkit: collapse white-space between units */ - *letter-spacing: normal; /* reset IE < 8 */ - *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */ - text-rendering: optimizespeed; /* Webkit: fixes text-rendering: optimizeLegibility */ -} - -.opera-only :-o-prefocus, -.pure-button-group { - word-spacing: -0.43em; -} - -.pure-button-group .pure-button { - letter-spacing: normal; - word-spacing: normal; - vertical-align: top; - text-rendering: auto; -} - -/*csslint outline-none:false*/ - -.pure-button { - font-family: inherit; - font-size: 100%; - padding: 0.5em 1em; - color: #444; /* rgba not supported (IE 8) */ - color: rgba(0, 0, 0, 0.80); /* rgba supported */ - border: 1px solid #999; /*IE 6/7/8*/ - border: none rgba(0, 0, 0, 0); /*IE9 + everything else*/ - background-color: #E6E6E6; - text-decoration: none; - border-radius: 2px; -} - -.pure-button-hover, -.pure-button:hover, -.pure-button:focus { - /* csslint ignore:start */ - filter: alpha(opacity=90); - /* csslint ignore:end */ - background-image: -webkit-linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); - background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); -} -.pure-button:focus { - outline: 0; -} -.pure-button-active, -.pure-button:active { - box-shadow: 0 0 0 1px rgba(0,0,0, 0.15) inset, 0 0 6px rgba(0,0,0, 0.20) inset; - border-color: #000\9; -} - -.pure-button[disabled], -.pure-button-disabled, -.pure-button-disabled:hover, -.pure-button-disabled:focus, -.pure-button-disabled:active { - border: none; - background-image: none; - /* csslint ignore:start */ - filter: alpha(opacity=40); - /* csslint ignore:end */ - opacity: 0.40; - cursor: not-allowed; - box-shadow: none; - pointer-events: none; -} - -.pure-button-hidden { - display: none; -} - -.pure-button-primary, -.pure-button-selected, -a.pure-button-primary, -a.pure-button-selected { - background-color: rgb(0, 120, 231); - color: #fff; -} - -/* Button Groups */ -.pure-button-group .pure-button { - margin: 0; - border-radius: 0; - border-right: 1px solid #111; /* fallback color for rgba() for IE7/8 */ - border-right: 1px solid rgba(0, 0, 0, 0.2); - -} - -.pure-button-group .pure-button:first-child { - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; -} -.pure-button-group .pure-button:last-child { - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; - border-right: none; -} - -/*csslint box-model:false*/ -/* -Box-model set to false because we're setting a height on select elements, which -also have border and padding. This is done because some browsers don't render -the padding. We explicitly set the box-model for select elements to border-box, -so we can ignore the csslint warning. -*/ - -.pure-form input[type="text"], -.pure-form input[type="password"], -.pure-form input[type="email"], -.pure-form input[type="url"], -.pure-form input[type="date"], -.pure-form input[type="month"], -.pure-form input[type="time"], -.pure-form input[type="datetime"], -.pure-form input[type="datetime-local"], -.pure-form input[type="week"], -.pure-form input[type="number"], -.pure-form input[type="search"], -.pure-form input[type="tel"], -.pure-form input[type="color"], -.pure-form select, -.pure-form textarea { - padding: 0.5em 0.6em; - display: inline-block; - border: 1px solid #ccc; - box-shadow: inset 0 1px 3px #ddd; - border-radius: 4px; - vertical-align: middle; - box-sizing: border-box; -} - -/* -Need to separate out the :not() selector from the rest of the CSS 2.1 selectors -since IE8 won't execute CSS that contains a CSS3 selector. -*/ -.pure-form input:not([type]) { - padding: 0.5em 0.6em; - display: inline-block; - border: 1px solid #ccc; - box-shadow: inset 0 1px 3px #ddd; - border-radius: 4px; - box-sizing: border-box; -} - - -/* Chrome (as of v.32/34 on OS X) needs additional room for color to display. */ -/* May be able to remove this tweak as color inputs become more standardized across browsers. */ -.pure-form input[type="color"] { - padding: 0.2em 0.5em; -} - - -.pure-form input[type="text"]:focus, -.pure-form input[type="password"]:focus, -.pure-form input[type="email"]:focus, -.pure-form input[type="url"]:focus, -.pure-form input[type="date"]:focus, -.pure-form input[type="month"]:focus, -.pure-form input[type="time"]:focus, -.pure-form input[type="datetime"]:focus, -.pure-form input[type="datetime-local"]:focus, -.pure-form input[type="week"]:focus, -.pure-form input[type="number"]:focus, -.pure-form input[type="search"]:focus, -.pure-form input[type="tel"]:focus, -.pure-form input[type="color"]:focus, -.pure-form select:focus, -.pure-form textarea:focus { - outline: 0; - border-color: #129FEA; -} - -/* -Need to separate out the :not() selector from the rest of the CSS 2.1 selectors -since IE8 won't execute CSS that contains a CSS3 selector. -*/ -.pure-form input:not([type]):focus { - outline: 0; - border-color: #129FEA; -} - -.pure-form input[type="file"]:focus, -.pure-form input[type="radio"]:focus, -.pure-form input[type="checkbox"]:focus { - outline: thin solid #129FEA; - outline: 1px auto #129FEA; -} -.pure-form .pure-checkbox, -.pure-form .pure-radio { - margin: 0.5em 0; - display: block; -} - -.pure-form input[type="text"][disabled], -.pure-form input[type="password"][disabled], -.pure-form input[type="email"][disabled], -.pure-form input[type="url"][disabled], -.pure-form input[type="date"][disabled], -.pure-form input[type="month"][disabled], -.pure-form input[type="time"][disabled], -.pure-form input[type="datetime"][disabled], -.pure-form input[type="datetime-local"][disabled], -.pure-form input[type="week"][disabled], -.pure-form input[type="number"][disabled], -.pure-form input[type="search"][disabled], -.pure-form input[type="tel"][disabled], -.pure-form input[type="color"][disabled], -.pure-form select[disabled], -.pure-form textarea[disabled] { - cursor: not-allowed; - background-color: #eaeded; - color: #cad2d3; -} - -/* -Need to separate out the :not() selector from the rest of the CSS 2.1 selectors -since IE8 won't execute CSS that contains a CSS3 selector. -*/ -.pure-form input:not([type])[disabled] { - cursor: not-allowed; - background-color: #eaeded; - color: #cad2d3; -} -.pure-form input[readonly], -.pure-form select[readonly], -.pure-form textarea[readonly] { - background-color: #eee; /* menu hover bg color */ - color: #777; /* menu text color */ - border-color: #ccc; -} - -.pure-form input:focus:invalid, -.pure-form textarea:focus:invalid, -.pure-form select:focus:invalid { - color: #b94a48; - border-color: #e9322d; -} -.pure-form input[type="file"]:focus:invalid:focus, -.pure-form input[type="radio"]:focus:invalid:focus, -.pure-form input[type="checkbox"]:focus:invalid:focus { - outline-color: #e9322d; -} -.pure-form select { - /* Normalizes the height; padding is not sufficient. */ - height: 2.25em; - border: 1px solid #ccc; - background-color: white; -} -.pure-form select[multiple] { - height: auto; -} -.pure-form label { - margin: 0.5em 0 0.2em; -} -.pure-form fieldset { - margin: 0; - padding: 0.35em 0 0.75em; - border: 0; -} -.pure-form legend { - display: block; - width: 100%; - padding: 0.3em 0; - margin-bottom: 0.3em; - color: #333; - border-bottom: 1px solid #e5e5e5; -} - -.pure-form-stacked input[type="text"], -.pure-form-stacked input[type="password"], -.pure-form-stacked input[type="email"], -.pure-form-stacked input[type="url"], -.pure-form-stacked input[type="date"], -.pure-form-stacked input[type="month"], -.pure-form-stacked input[type="time"], -.pure-form-stacked input[type="datetime"], -.pure-form-stacked input[type="datetime-local"], -.pure-form-stacked input[type="week"], -.pure-form-stacked input[type="number"], -.pure-form-stacked input[type="search"], -.pure-form-stacked input[type="tel"], -.pure-form-stacked input[type="color"], -.pure-form-stacked input[type="file"], -.pure-form-stacked select, -.pure-form-stacked label, -.pure-form-stacked textarea { - display: block; - margin: 0.25em 0; -} - -/* -Need to separate out the :not() selector from the rest of the CSS 2.1 selectors -since IE8 won't execute CSS that contains a CSS3 selector. -*/ -.pure-form-stacked input:not([type]) { - display: block; - margin: 0.25em 0; -} -.pure-form-aligned input, -.pure-form-aligned textarea, -.pure-form-aligned select, -/* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline instead. */ -.pure-form-aligned .pure-help-inline, -.pure-form-message-inline { - display: inline-block; - *display: inline; - *zoom: 1; - vertical-align: middle; -} -.pure-form-aligned textarea { - vertical-align: top; -} - -/* Aligned Forms */ -.pure-form-aligned .pure-control-group { - margin-bottom: 0.5em; -} -.pure-form-aligned .pure-control-group label { - text-align: right; - display: inline-block; - vertical-align: middle; - width: 10em; - margin: 0 1em 0 0; -} -.pure-form-aligned .pure-controls { - margin: 1.5em 0 0 11em; -} - -/* Rounded Inputs */ -.pure-form input.pure-input-rounded, -.pure-form .pure-input-rounded { - border-radius: 2em; - padding: 0.5em 1em; -} - -/* Grouped Inputs */ -.pure-form .pure-group fieldset { - margin-bottom: 10px; -} -.pure-form .pure-group input, -.pure-form .pure-group textarea { - display: block; - padding: 10px; - margin: 0 0 -1px; - border-radius: 0; - position: relative; - top: -1px; -} -.pure-form .pure-group input:focus, -.pure-form .pure-group textarea:focus { - z-index: 3; -} -.pure-form .pure-group input:first-child, -.pure-form .pure-group textarea:first-child { - top: 1px; - border-radius: 4px 4px 0 0; - margin: 0; -} -.pure-form .pure-group input:first-child:last-child, -.pure-form .pure-group textarea:first-child:last-child { - top: 1px; - border-radius: 4px; - margin: 0; -} -.pure-form .pure-group input:last-child, -.pure-form .pure-group textarea:last-child { - top: -2px; - border-radius: 0 0 4px 4px; - margin: 0; -} -.pure-form .pure-group button { - margin: 0.35em 0; -} - -.pure-form .pure-input-1 { - width: 100%; -} -.pure-form .pure-input-3-4 { - width: 75%; -} -.pure-form .pure-input-2-3 { - width: 66%; -} -.pure-form .pure-input-1-2 { - width: 50%; -} -.pure-form .pure-input-1-3 { - width: 33%; -} -.pure-form .pure-input-1-4 { - width: 25%; -} - -/* Inline help for forms */ -/* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline instead. */ -.pure-form .pure-help-inline, -.pure-form-message-inline { - display: inline-block; - padding-left: 0.3em; - color: #666; - vertical-align: middle; - font-size: 0.875em; -} - -/* Block help for forms */ -.pure-form-message { - display: block; - color: #666; - font-size: 0.875em; -} - -@media only screen and (max-width : 480px) { - .pure-form button[type="submit"] { - margin: 0.7em 0 0; - } - - .pure-form input:not([type]), - .pure-form input[type="text"], - .pure-form input[type="password"], - .pure-form input[type="email"], - .pure-form input[type="url"], - .pure-form input[type="date"], - .pure-form input[type="month"], - .pure-form input[type="time"], - .pure-form input[type="datetime"], - .pure-form input[type="datetime-local"], - .pure-form input[type="week"], - .pure-form input[type="number"], - .pure-form input[type="search"], - .pure-form input[type="tel"], - .pure-form input[type="color"], - .pure-form label { - margin-bottom: 0.3em; - display: block; - } - - .pure-group input:not([type]), - .pure-group input[type="text"], - .pure-group input[type="password"], - .pure-group input[type="email"], - .pure-group input[type="url"], - .pure-group input[type="date"], - .pure-group input[type="month"], - .pure-group input[type="time"], - .pure-group input[type="datetime"], - .pure-group input[type="datetime-local"], - .pure-group input[type="week"], - .pure-group input[type="number"], - .pure-group input[type="search"], - .pure-group input[type="tel"], - .pure-group input[type="color"] { - margin-bottom: 0; - } - - .pure-form-aligned .pure-control-group label { - margin-bottom: 0.3em; - text-align: left; - display: block; - width: 100%; - } - - .pure-form-aligned .pure-controls { - margin: 1.5em 0 0 0; - } - - /* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline instead. */ - .pure-form .pure-help-inline, - .pure-form-message-inline, - .pure-form-message { - display: block; - font-size: 0.75em; - /* Increased bottom padding to make it group with its related input element. */ - padding: 0.2em 0 0.8em; - } -} - -/*csslint adjoining-classes: false, box-model:false*/ -.pure-menu { - box-sizing: border-box; -} - -.pure-menu-fixed { - position: fixed; - left: 0; - top: 0; - z-index: 3; -} - -.pure-menu-list, -.pure-menu-item { - position: relative; -} - -.pure-menu-list { - list-style: none; - margin: 0; - padding: 0; -} - -.pure-menu-item { - padding: 0; - margin: 0; - height: 100%; -} - -.pure-menu-link, -.pure-menu-heading { - display: block; - text-decoration: none; - white-space: nowrap; -} - -/* HORIZONTAL MENU */ -.pure-menu-horizontal { - width: 100%; - white-space: nowrap; -} - -.pure-menu-horizontal .pure-menu-list { - display: inline-block; -} - -/* Initial menus should be inline-block so that they are horizontal */ -.pure-menu-horizontal .pure-menu-item, -.pure-menu-horizontal .pure-menu-heading, -.pure-menu-horizontal .pure-menu-separator { - display: inline-block; - *display: inline; - zoom: 1; - vertical-align: middle; -} - -/* Submenus should still be display: block; */ -.pure-menu-item .pure-menu-item { - display: block; -} - -.pure-menu-children { - display: none; - position: absolute; - left: 100%; - top: 0; - margin: 0; - padding: 0; - z-index: 3; -} - -.pure-menu-horizontal .pure-menu-children { - left: 0; - top: auto; - width: inherit; -} - -.pure-menu-allow-hover:hover > .pure-menu-children, -.pure-menu-active > .pure-menu-children { - display: block; - position: absolute; -} - -/* Vertical Menus - show the dropdown arrow */ -.pure-menu-has-children > .pure-menu-link:after { - padding-left: 0.5em; - content: "\25B8"; - font-size: small; -} - -/* Horizontal Menus - show the dropdown arrow */ -.pure-menu-horizontal .pure-menu-has-children > .pure-menu-link:after { - content: "\25BE"; -} - -/* scrollable menus */ -.pure-menu-scrollable { - overflow-y: scroll; - overflow-x: hidden; -} - -.pure-menu-scrollable .pure-menu-list { - display: block; -} - -.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list { - display: inline-block; -} - -.pure-menu-horizontal.pure-menu-scrollable { - white-space: nowrap; - overflow-y: hidden; - overflow-x: auto; - -ms-overflow-style: none; - -webkit-overflow-scrolling: touch; - /* a little extra padding for this style to allow for scrollbars */ - padding: .5em 0; -} - -.pure-menu-horizontal.pure-menu-scrollable::-webkit-scrollbar { - display: none; -} - -/* misc default styling */ - -.pure-menu-separator, -.pure-menu-horizontal .pure-menu-children .pure-menu-separator { - background-color: #ccc; - height: 1px; - margin: .3em 0; -} - -.pure-menu-horizontal .pure-menu-separator { - width: 1px; - height: 1.3em; - margin: 0 .3em ; -} - -/* Need to reset the separator since submenu is vertical */ -.pure-menu-horizontal .pure-menu-children .pure-menu-separator { - display: block; - width: auto; -} - -.pure-menu-heading { - text-transform: uppercase; - color: #565d64; -} - -.pure-menu-link { - color: #777; -} - -.pure-menu-children { - background-color: #fff; -} - -.pure-menu-link, -.pure-menu-disabled, -.pure-menu-heading { - padding: .5em 1em; -} - -.pure-menu-disabled { - opacity: .5; -} - -.pure-menu-disabled .pure-menu-link:hover { - background-color: transparent; -} - -.pure-menu-active > .pure-menu-link, -.pure-menu-link:hover, -.pure-menu-link:focus { - background-color: #eee; -} - -.pure-menu-selected .pure-menu-link, -.pure-menu-selected .pure-menu-link:visited { - color: #000; -} - -.pure-table { - /* Remove spacing between table cells (from Normalize.css) */ - border-collapse: collapse; - border-spacing: 0; - empty-cells: show; - border: 1px solid #cbcbcb; -} - -.pure-table caption { - color: #000; - font: italic 85%/1 arial, sans-serif; - padding: 1em 0; - text-align: center; -} - -.pure-table td, -.pure-table th { - border-left: 1px solid #cbcbcb;/* inner column border */ - border-width: 0 0 0 1px; - font-size: inherit; - margin: 0; - overflow: visible; /*to make ths where the title is really long work*/ - padding: 0.5em 1em; /* cell padding */ -} - -/* Consider removing this next declaration block, as it causes problems when -there's a rowspan on the first cell. Case added to the tests. issue#432 */ -.pure-table td:first-child, -.pure-table th:first-child { - border-left-width: 0; -} - -.pure-table thead { - background-color: #e0e0e0; - color: #000; - text-align: left; - vertical-align: bottom; -} - -/* -striping: - even - #fff (white) - odd - #f2f2f2 (light gray) -*/ -.pure-table td { - background-color: transparent; -} -.pure-table-odd td { - background-color: #f2f2f2; -} - -/* nth-child selector for modern browsers */ -.pure-table-striped tr:nth-child(2n-1) td { - background-color: #f2f2f2; -} - -/* BORDERED TABLES */ -.pure-table-bordered td { - border-bottom: 1px solid #cbcbcb; -} -.pure-table-bordered tbody > tr:last-child > td { - border-bottom-width: 0; -} - - -/* HORIZONTAL BORDERED TABLES */ - -.pure-table-horizontal td, -.pure-table-horizontal th { - border-width: 0 0 1px 0; - border-bottom: 1px solid #cbcbcb; -} -.pure-table-horizontal tbody > tr:last-child > td { - border-bottom-width: 0; -} diff --git a/pkgs/csslib/test/examples/skeleton.css b/pkgs/csslib/test/examples/skeleton.css deleted file mode 100644 index f28bf6c59..000000000 --- a/pkgs/csslib/test/examples/skeleton.css +++ /dev/null @@ -1,418 +0,0 @@ -/* -* Skeleton V2.0.4 -* Copyright 2014, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 12/29/2014 -*/ - - -/* Table of contents -–––––––––––––––––––––––––––––––––––––––––––––––––– -- Grid -- Base Styles -- Typography -- Links -- Buttons -- Forms -- Lists -- Code -- Tables -- Spacing -- Utilities -- Clearing -- Media Queries -*/ - - -/* Grid -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -.container { - position: relative; - width: 100%; - max-width: 960px; - margin: 0 auto; - padding: 0 20px; - box-sizing: border-box; } -.column, -.columns { - width: 100%; - float: left; - box-sizing: border-box; } - -/* For devices larger than 400px */ -@media (min-width: 400px) { - .container { - width: 85%; - padding: 0; } -} - -/* For devices larger than 550px */ -@media (min-width: 550px) { - .container { - width: 80%; } - .column, - .columns { - margin-left: 4%; } - .column:first-child, - .columns:first-child { - margin-left: 0; } - - .one.column, - .one.columns { width: 4.66666666667%; } - .two.columns { width: 13.3333333333%; } - .three.columns { width: 22%; } - .four.columns { width: 30.6666666667%; } - .five.columns { width: 39.3333333333%; } - .six.columns { width: 48%; } - .seven.columns { width: 56.6666666667%; } - .eight.columns { width: 65.3333333333%; } - .nine.columns { width: 74.0%; } - .ten.columns { width: 82.6666666667%; } - .eleven.columns { width: 91.3333333333%; } - .twelve.columns { width: 100%; margin-left: 0; } - - .one-third.column { width: 30.6666666667%; } - .two-thirds.column { width: 65.3333333333%; } - - .one-half.column { width: 48%; } - - /* Offsets */ - .offset-by-one.column, - .offset-by-one.columns { margin-left: 8.66666666667%; } - .offset-by-two.column, - .offset-by-two.columns { margin-left: 17.3333333333%; } - .offset-by-three.column, - .offset-by-three.columns { margin-left: 26%; } - .offset-by-four.column, - .offset-by-four.columns { margin-left: 34.6666666667%; } - .offset-by-five.column, - .offset-by-five.columns { margin-left: 43.3333333333%; } - .offset-by-six.column, - .offset-by-six.columns { margin-left: 52%; } - .offset-by-seven.column, - .offset-by-seven.columns { margin-left: 60.6666666667%; } - .offset-by-eight.column, - .offset-by-eight.columns { margin-left: 69.3333333333%; } - .offset-by-nine.column, - .offset-by-nine.columns { margin-left: 78.0%; } - .offset-by-ten.column, - .offset-by-ten.columns { margin-left: 86.6666666667%; } - .offset-by-eleven.column, - .offset-by-eleven.columns { margin-left: 95.3333333333%; } - - .offset-by-one-third.column, - .offset-by-one-third.columns { margin-left: 34.6666666667%; } - .offset-by-two-thirds.column, - .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } - - .offset-by-one-half.column, - .offset-by-one-half.columns { margin-left: 52%; } - -} - - -/* Base Styles -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -/* NOTE -html is set to 62.5% so that all the REM measurements throughout Skeleton -are based on 10px sizing. So basically 1.5rem = 15px :) */ -html { - font-size: 62.5%; } -body { - font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ - line-height: 1.6; - font-weight: 400; - font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #222; } - - -/* Typography -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 2rem; - font-weight: 300; } -h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} -h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } -h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } -h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } -h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } -h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } - -/* Larger than phablet */ -@media (min-width: 550px) { - h1 { font-size: 5.0rem; } - h2 { font-size: 4.2rem; } - h3 { font-size: 3.6rem; } - h4 { font-size: 3.0rem; } - h5 { font-size: 2.4rem; } - h6 { font-size: 1.5rem; } -} - -p { - margin-top: 0; } - - -/* Links -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -a { - color: #1EAEDB; } -a:hover { - color: #0FA0CE; } - - -/* Buttons -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -.button, -button, -input[type="submit"], -input[type="reset"], -input[type="button"] { - display: inline-block; - height: 38px; - padding: 0 30px; - color: #555; - text-align: center; - font-size: 11px; - font-weight: 600; - line-height: 38px; - letter-spacing: .1rem; - text-transform: uppercase; - text-decoration: none; - white-space: nowrap; - background-color: transparent; - border-radius: 4px; - border: 1px solid #bbb; - cursor: pointer; - box-sizing: border-box; } -.button:hover, -button:hover, -input[type="submit"]:hover, -input[type="reset"]:hover, -input[type="button"]:hover, -.button:focus, -button:focus, -input[type="submit"]:focus, -input[type="reset"]:focus, -input[type="button"]:focus { - color: #333; - border-color: #888; - outline: 0; } -.button.button-primary, -button.button-primary, -input[type="submit"].button-primary, -input[type="reset"].button-primary, -input[type="button"].button-primary { - color: #FFF; - background-color: #33C3F0; - border-color: #33C3F0; } -.button.button-primary:hover, -button.button-primary:hover, -input[type="submit"].button-primary:hover, -input[type="reset"].button-primary:hover, -input[type="button"].button-primary:hover, -.button.button-primary:focus, -button.button-primary:focus, -input[type="submit"].button-primary:focus, -input[type="reset"].button-primary:focus, -input[type="button"].button-primary:focus { - color: #FFF; - background-color: #1EAEDB; - border-color: #1EAEDB; } - - -/* Forms -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -input[type="email"], -input[type="number"], -input[type="search"], -input[type="text"], -input[type="tel"], -input[type="url"], -input[type="password"], -textarea, -select { - height: 38px; - padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ - background-color: #fff; - border: 1px solid #D1D1D1; - border-radius: 4px; - box-shadow: none; - box-sizing: border-box; } -/* Removes awkward default styles on some inputs for iOS */ -input[type="email"], -input[type="number"], -input[type="search"], -input[type="text"], -input[type="tel"], -input[type="url"], -input[type="password"], -textarea { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; } -textarea { - min-height: 65px; - padding-top: 6px; - padding-bottom: 6px; } -input[type="email"]:focus, -input[type="number"]:focus, -input[type="search"]:focus, -input[type="text"]:focus, -input[type="tel"]:focus, -input[type="url"]:focus, -input[type="password"]:focus, -textarea:focus, -select:focus { - border: 1px solid #33C3F0; - outline: 0; } -label, -legend { - display: block; - margin-bottom: .5rem; - font-weight: 600; } -fieldset { - padding: 0; - border-width: 0; } -input[type="checkbox"], -input[type="radio"] { - display: inline; } -label > .label-body { - display: inline-block; - margin-left: .5rem; - font-weight: normal; } - - -/* Lists -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -ul { - list-style: circle inside; } -ol { - list-style: decimal inside; } -ol, ul { - padding-left: 0; - margin-top: 0; } -ul ul, -ul ol, -ol ol, -ol ul { - margin: 1.5rem 0 1.5rem 3rem; - font-size: 90%; } -li { - margin-bottom: 1rem; } - - -/* Code -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -code { - padding: .2rem .5rem; - margin: 0 .2rem; - font-size: 90%; - white-space: nowrap; - background: #F1F1F1; - border: 1px solid #E1E1E1; - border-radius: 4px; } -pre > code { - display: block; - padding: 1rem 1.5rem; - white-space: pre; } - - -/* Tables -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -th, -td { - padding: 12px 15px; - text-align: left; - border-bottom: 1px solid #E1E1E1; } -th:first-child, -td:first-child { - padding-left: 0; } -th:last-child, -td:last-child { - padding-right: 0; } - - -/* Spacing -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -button, -.button { - margin-bottom: 1rem; } -input, -textarea, -select, -fieldset { - margin-bottom: 1.5rem; } -pre, -blockquote, -dl, -figure, -table, -p, -ul, -ol, -form { - margin-bottom: 2.5rem; } - - -/* Utilities -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -.u-full-width { - width: 100%; - box-sizing: border-box; } -.u-max-full-width { - max-width: 100%; - box-sizing: border-box; } -.u-pull-right { - float: right; } -.u-pull-left { - float: left; } - - -/* Misc -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -hr { - margin-top: 3rem; - margin-bottom: 3.5rem; - border-width: 0; - border-top: 1px solid #E1E1E1; } - - -/* Clearing -–––––––––––––––––––––––––––––––––––––––––––––––––– */ - -/* Self Clearing Goodness */ -.container:after, -.row:after, -.u-cf { - content: ""; - display: table; - clear: both; } - - -/* Media Queries -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -/* -Note: The best way to structure the use of media queries is to create the queries -near the relevant code. For example, if you wanted to change the styles for buttons -on small devices, paste the mobile query code up in the buttons section and style it -there. -*/ - - -/* Larger than mobile */ -@media (min-width: 400px) {} - -/* Larger than phablet (also point when grid becomes active) */ -@media (min-width: 550px) {} - -/* Larger than tablet */ -@media (min-width: 750px) {} - -/* Larger than desktop */ -@media (min-width: 1000px) {} - -/* Larger than Desktop HD */ -@media (min-width: 1200px) {} From 9d48d627bbe81ff52daf06ae07593ad5384c8c7b Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Thu, 16 Sep 2021 11:18:27 +0200 Subject: [PATCH 180/245] Update test to run from third_party --- pkgs/csslib/pubspec.yaml | 1 + pkgs/csslib/test/samples_test.dart | 28 +++++++++++++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index ed521e985..41709f446 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: source_span: ^1.8.0 + path: ^1.8.0 dev_dependencies: pedantic: ^1.10.0 diff --git a/pkgs/csslib/test/samples_test.dart b/pkgs/csslib/test/samples_test.dart index b90613115..7aed4ee23 100644 --- a/pkgs/csslib/test/samples_test.dart +++ b/pkgs/csslib/test/samples_test.dart @@ -2,16 +2,17 @@ library samples_test; import 'dart:io'; -import 'dart:mirrors'; import 'package:test/test.dart'; import 'package:csslib/parser.dart'; +import 'package:path/path.dart' as path; const testOptions = PreprocessorOptions( - useColors: false, - checked: false, - warningsAsErrors: true, - inputFile: 'memory'); + useColors: false, + checked: false, + warningsAsErrors: true, + inputFile: 'memory', +); void testCSSFile(File cssFile) { final errors = []; @@ -22,12 +23,17 @@ void testCSSFile(File cssFile) { expect(errors, isEmpty, reason: errors.toString()); } -void main() { - final libraryUri = currentMirrorSystem().findLibrary(#samples_test).uri; - final cssDir = Directory.fromUri(libraryUri.resolve('examples')); - for (var element in cssDir.listSync()) { - if (element is File && element.uri.pathSegments.last.endsWith('.css')) { - test(element.uri.pathSegments.last, () => testCSSFile(element)); +void main() async { + // Iterate over all sub-folders of third_party, + // and then all css files in those. + final third_party = path.join(Directory.current.path, 'third_party'); + for (var entity in Directory(third_party).listSync()) { + if (await FileSystemEntity.isDirectory(entity.path)) { + for (var element in Directory(entity.path).listSync()) { + if (element is File && element.uri.pathSegments.last.endsWith('.css')) { + test(element.uri.pathSegments.last, () => testCSSFile(element)); + } + } } } } From 3cf6c9163f4d2eca133a7d4227b9a98c7814b4ee Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Thu, 16 Sep 2021 11:21:33 +0200 Subject: [PATCH 181/245] Rename test --- .../test/{samples_test.dart => third_party_samples_test.dart} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pkgs/csslib/test/{samples_test.dart => third_party_samples_test.dart} (100%) diff --git a/pkgs/csslib/test/samples_test.dart b/pkgs/csslib/test/third_party_samples_test.dart similarity index 100% rename from pkgs/csslib/test/samples_test.dart rename to pkgs/csslib/test/third_party_samples_test.dart From 13161534649713c6c565aecabef24c59f4a51f5b Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Thu, 16 Sep 2021 11:37:33 +0200 Subject: [PATCH 182/245] Add third_party test files --- pkgs/csslib/third_party/README.md | 2 + pkgs/csslib/third_party/base/README.md | 5 + pkgs/csslib/third_party/base/index.css | 1 + pkgs/csslib/third_party/bootstrap/LICENSE | 22 + pkgs/csslib/third_party/bootstrap/README.md | 4 + .../third_party/bootstrap/bootstrap-grid.css | 5051 +++++ .../third_party/bootstrap/bootstrap.css | 11222 +++++++++++ pkgs/csslib/third_party/foundation/LICENSE | 22 + pkgs/csslib/third_party/foundation/README.md | 4 + .../third_party/foundation/foundation.css | 5616 ++++++ .../third_party/foundation/foundation.min.css | 2 + .../third_party/html5-boilerplate/LICENSE.txt | 19 + .../third_party/html5-boilerplate/README.md | 4 + .../html5-boilerplate/normalize.css | 349 + .../third_party/html5-boilerplate/style.css | 263 + pkgs/csslib/third_party/materialize/LICENSE | 21 + pkgs/csslib/third_party/materialize/README.md | 4 + .../third_party/materialize/materialize.css | 9067 +++++++++ .../materialize/materialize.min.css | 13 + pkgs/csslib/third_party/mdc/LICENSE | 21 + pkgs/csslib/third_party/mdc/README.md | 7 + .../mdc/material-components-web.css | 16511 ++++++++++++++++ .../mdc/material-components-web.min.css | 10 + pkgs/csslib/third_party/pure/LICENSE | 29 + pkgs/csslib/third_party/pure/README.md | 4 + pkgs/csslib/third_party/pure/main-grid.css | 855 + pkgs/csslib/third_party/pure/main.css | 624 + pkgs/csslib/third_party/skeleton/LICENSE.md | 21 + pkgs/csslib/third_party/skeleton/README.me | 4 + .../csslib/third_party/skeleton/normalize.css | 427 + pkgs/csslib/third_party/skeleton/skeleton.css | 418 + 31 files changed, 50622 insertions(+) create mode 100644 pkgs/csslib/third_party/README.md create mode 100644 pkgs/csslib/third_party/base/README.md create mode 100644 pkgs/csslib/third_party/base/index.css create mode 100644 pkgs/csslib/third_party/bootstrap/LICENSE create mode 100644 pkgs/csslib/third_party/bootstrap/README.md create mode 100644 pkgs/csslib/third_party/bootstrap/bootstrap-grid.css create mode 100644 pkgs/csslib/third_party/bootstrap/bootstrap.css create mode 100644 pkgs/csslib/third_party/foundation/LICENSE create mode 100644 pkgs/csslib/third_party/foundation/README.md create mode 100644 pkgs/csslib/third_party/foundation/foundation.css create mode 100644 pkgs/csslib/third_party/foundation/foundation.min.css create mode 100644 pkgs/csslib/third_party/html5-boilerplate/LICENSE.txt create mode 100644 pkgs/csslib/third_party/html5-boilerplate/README.md create mode 100644 pkgs/csslib/third_party/html5-boilerplate/normalize.css create mode 100644 pkgs/csslib/third_party/html5-boilerplate/style.css create mode 100644 pkgs/csslib/third_party/materialize/LICENSE create mode 100644 pkgs/csslib/third_party/materialize/README.md create mode 100644 pkgs/csslib/third_party/materialize/materialize.css create mode 100644 pkgs/csslib/third_party/materialize/materialize.min.css create mode 100644 pkgs/csslib/third_party/mdc/LICENSE create mode 100644 pkgs/csslib/third_party/mdc/README.md create mode 100644 pkgs/csslib/third_party/mdc/material-components-web.css create mode 100644 pkgs/csslib/third_party/mdc/material-components-web.min.css create mode 100644 pkgs/csslib/third_party/pure/LICENSE create mode 100644 pkgs/csslib/third_party/pure/README.md create mode 100644 pkgs/csslib/third_party/pure/main-grid.css create mode 100644 pkgs/csslib/third_party/pure/main.css create mode 100644 pkgs/csslib/third_party/skeleton/LICENSE.md create mode 100644 pkgs/csslib/third_party/skeleton/README.me create mode 100644 pkgs/csslib/third_party/skeleton/normalize.css create mode 100644 pkgs/csslib/third_party/skeleton/skeleton.css diff --git a/pkgs/csslib/third_party/README.md b/pkgs/csslib/third_party/README.md new file mode 100644 index 000000000..a68a963fb --- /dev/null +++ b/pkgs/csslib/third_party/README.md @@ -0,0 +1,2 @@ +This folder contains resources from third parties. +See each subfolder for details. diff --git a/pkgs/csslib/third_party/base/README.md b/pkgs/csslib/third_party/base/README.md new file mode 100644 index 000000000..3e2b26198 --- /dev/null +++ b/pkgs/csslib/third_party/base/README.md @@ -0,0 +1,5 @@ +This folder contains a sample css file from the open-source project +https://github.com/getbase/base. + +This code was included under the +[MIT Open Source](https://opensource.org/licenses/MIT) license. \ No newline at end of file diff --git a/pkgs/csslib/third_party/base/index.css b/pkgs/csslib/third_party/base/index.css new file mode 100644 index 000000000..95156ce57 --- /dev/null +++ b/pkgs/csslib/third_party/base/index.css @@ -0,0 +1 @@ +*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}.sr{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1rem}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}table{text-align:left;border-collapse:collapse;border-spacing:0;width:100%;margin:0;border:1px solid #e9e9e9}table td,table th{padding:1rem;border-bottom:1px solid #e9e9e9;border-right:1px solid #e9e9e9}table tr:nth-child(2n){background-color:#f6f8fa}body{font-family:sans-serif;font-size:16px;line-height:22px;color:#232323;font-weight:400;background:#fff}details,main{display:block}a{background-color:rgba(0,0,0,0)}.b,.strong,b,strong{font-weight:700}.em,em{font-style:italic}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.small,small{font-size:.8125rem}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}[hidden],template{display:none}h1,h2,h3,h4,h5,h6{font-family:sans-serif;margin:.5rem 0}.h1,h1{font-size:32px;line-height:38px}.h2,h2{font-size:26px;line-height:32px}.h3,h3{font-size:22px;line-height:28px}.h4,h4{font-size:18px;line-height:24px}.h5,h5{font-size:16px;line-height:22px}.h6,h6{font-size:14px;line-height:20px}.container{max-width:1168px;padding-left:16px;padding-right:16px;margin-left:auto;margin-right:auto}@media only screen and (min-width:768px){.container-m{width:736px;max-width:auto;padding-left:16px;padding-right:16px;margin-left:auto;margin-right:auto}}@media only screen and (min-width:980px){.container-l{width:948px;max-width:auto;padding-left:16px;padding-right:16px;margin-left:auto;margin-right:auto}}@media only screen and (min-width:1200px){.container-xl{width:1168px;max-width:auto;padding-left:16px;padding-right:16px;margin-left:auto;margin-right:auto}}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative;margin-left:-16px;margin-right:-16px}.col-1,.col-1-2,.col-1-3,.col-1-4,.col-1-5,.col-2,.col-2-3,.col-2-5,.col-3,.col-3-4,.col-3-5,.col-4,.col-4-5,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:16px;padding-right:16px}.col-1{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-1,.col-2{-webkit-box-flex:0}.col-2{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-3,.col-4{-webkit-box-flex:0}.col-4{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-5{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-5,.col-6{-webkit-box-flex:0}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-7,.col-8{-webkit-box-flex:0}.col-8{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-9,.col-10{-webkit-box-flex:0}.col-10{-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-11{-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-11,.col-12{-webkit-box-flex:0}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.col-1-2{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-1-2,.col-1-3{-webkit-box-flex:0}.col-1-3{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-2-3{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-1-4,.col-2-3{-webkit-box-flex:0}.col-1-4{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-3-4{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-1-5,.col-3-4{-webkit-box-flex:0}.col-1-5{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-2-5{-ms-flex:0 0 40%;flex:0 0 40%;max-width:40%}.col-2-5,.col-3-5{-webkit-box-flex:0}.col-3-5{-ms-flex:0 0 60%;flex:0 0 60%;max-width:60%}.col-4-5{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-full{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}@media only screen and (min-width:768px){.row-m{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative;margin-left:-16px;margin-right:-16px}.col-1-2-m,.col-1-3-m,.col-1-4-m,.col-1-5-m,.col-1-m,.col-2-3-m,.col-2-5-m,.col-2-m,.col-3-4-m,.col-3-5-m,.col-3-m,.col-4-5-m,.col-4-m,.col-5-m,.col-6-m,.col-7-m,.col-8-m,.col-9-m,.col-10-m,.col-11-m,.col-12-m{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:16px;padding-right:16px}.col-1-m{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-1-m,.col-2-m{-webkit-box-flex:0}.col-2-m{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-3-m{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-3-m,.col-4-m{-webkit-box-flex:0}.col-4-m{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-5-m{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-5-m,.col-6-m{-webkit-box-flex:0}.col-6-m{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7-m{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-7-m,.col-8-m{-webkit-box-flex:0}.col-8-m{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-9-m{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10-m{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-11-m{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-12-m{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.col-1-2-m{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-1-3-m{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-2-3-m{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-1-4-m{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-3-4-m{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-1-5-m{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-2-5-m{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;max-width:40%}.col-3-5-m{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;max-width:60%}.col-4-5-m{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-full-m{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}}@media only screen and (min-width:980px){.row-l{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative;margin-left:-16px;margin-right:-16px}.col-1-2-l,.col-1-3-l,.col-1-4-l,.col-1-5-l,.col-1-l,.col-2-3-l,.col-2-5-l,.col-2-l,.col-3-4-l,.col-3-5-l,.col-3-l,.col-4-5-l,.col-4-l,.col-5-l,.col-6-l,.col-7-l,.col-8-l,.col-9-l,.col-10-l,.col-11-l,.col-12-l{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:16px;padding-right:16px}.col-1-l{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-1-l,.col-2-l{-webkit-box-flex:0}.col-2-l{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-3-l{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-3-l,.col-4-l{-webkit-box-flex:0}.col-4-l{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-5-l{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-5-l,.col-6-l{-webkit-box-flex:0}.col-6-l{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7-l{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-7-l,.col-8-l{-webkit-box-flex:0}.col-8-l{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-9-l{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10-l{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-11-l{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-12-l{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.col-1-2-l{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-1-3-l{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-2-3-l{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-1-4-l{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-3-4-l{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-1-5-l{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-2-5-l{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;max-width:40%}.col-3-5-l{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;max-width:60%}.col-4-5-l{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-full-l{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}}@media only screen and (min-width:1200px){.row-xl{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative;margin-left:-16px;margin-right:-16px}.col-1-2-xl,.col-1-3-xl,.col-1-4-xl,.col-1-5-xl,.col-1-xl,.col-2-3-xl,.col-2-5-xl,.col-2-xl,.col-3-4-xl,.col-3-5-xl,.col-3-xl,.col-4-5-xl,.col-4-xl,.col-5-xl,.col-6-xl,.col-7-xl,.col-8-xl,.col-9-xl,.col-10-xl,.col-11-xl,.col-12-xl{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:16px;padding-right:16px}.col-1-xl{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-2-xl{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-3-xl{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4-xl{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-5-xl{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-6-xl{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7-xl{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-8-xl{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-9-xl{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10-xl{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-11-xl{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-12-xl{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.col-1-2-xl{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-1-3-xl{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-2-3-xl{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-1-4-xl{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-3-4-xl{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-1-5-xl{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-2-5-xl{-webkit-box-flex:0;-ms-flex:0 0 40%;flex:0 0 40%;max-width:40%}.col-3-5-xl{-webkit-box-flex:0;-ms-flex:0 0 60%;flex:0 0 60%;max-width:60%}.col-4-5-xl{-webkit-box-flex:0;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-full-xl{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}}.padding-left-0-25rem{padding-left:.25rem}.padding-left-0-5rem{padding-left:.5rem}.padding-left-1rem{padding-left:1rem}.padding-left-1-5rem{padding-left:1.5rem}.padding-left-2rem{padding-left:2rem}.padding-left-3rem{padding-left:3rem}.padding-left-4rem{padding-left:4rem}.padding-left-5rem{padding-left:5rem}.padding-right-0-25rem{padding-right:.25rem}.padding-right-0-5rem{padding-right:.5rem}.padding-right-1rem{padding-right:1rem}.padding-right-1-5rem{padding-right:1.5rem}.padding-right-2rem{padding-right:2rem}.padding-right-3rem{padding-right:3rem}.padding-right-4rem{padding-right:4rem}.padding-right-5rem{padding-right:5rem}@media only screen and (min-width:768px){.padding-left-0-m{padding-left:0}.padding-left-0-25rem-m{padding-left:.25rem}.padding-left-0-5rem-m{padding-left:.5rem}.padding-left-1rem-m{padding-left:1rem}.padding-left-1-5rem-m{padding-left:1.5rem}.padding-left-2rem-m{padding-left:2rem}.padding-left-3rem-m{padding-left:3rem}.padding-left-4rem-m{padding-left:4rem}.padding-left-5rem-m{padding-left:5rem}.padding-right-0-m{padding-right:0}.padding-right-0-25rem-m{padding-right:.25rem}.padding-right-0-5rem-m{padding-right:.5rem}.padding-right-1rem-m{padding-right:1rem}.padding-right-1-5rem-m{padding-right:1.5rem}.padding-right-2rem-m{padding-right:2rem}.padding-right-3rem-m{padding-right:3rem}.padding-right-4rem-m{padding-right:4rem}.padding-right-5rem-m{padding-right:5rem}}@media only screen and (min-width:980px){.padding-left-0-l{padding-left:0}.padding-left-0-25rem-l{padding-left:.25rem}.padding-left-0-5rem-l{padding-left:.5rem}.padding-left-1rem-l{padding-left:1rem}.padding-left-1-5rem-l{padding-left:1.5rem}.padding-left-2rem-l{padding-left:2rem}.padding-left-3rem-l{padding-left:3rem}.padding-left-4rem-l{padding-left:4rem}.padding-left-5rem-l{padding-left:5rem}.padding-right-0-l{padding-right:0}.padding-right-0-25rem-l{padding-right:.25rem}.padding-right-0-5rem-l{padding-right:.5rem}.padding-right-1rem-l{padding-right:1rem}.padding-right-1-5rem-l{padding-right:1.5rem}.padding-right-2rem-l{padding-right:2rem}.padding-right-3rem-l{padding-right:3rem}.padding-right-4rem-l{padding-right:4rem}.padding-right-5rem-l{padding-right:5rem}}@media only screen and (min-width:1200px){.padding-left-0-xl{padding-left:0}.padding-left-0-25rem-xl{padding-left:.25rem}.padding-left-0-5rem-xl{padding-left:.5rem}.padding-left-1rem-xl{padding-left:1rem}.padding-left-1-5rem-xl{padding-left:1.5rem}.padding-left-2rem-xl{padding-left:2rem}.padding-left-3rem-xl{padding-left:3rem}.padding-left-4rem-xl{padding-left:4rem}.padding-left-5rem-xl{padding-left:5rem}.padding-right-0-xl{padding-right:0}.padding-right-0-25rem-xl{padding-right:.25rem}.padding-right-0-5rem-xl{padding-right:.5rem}.padding-right-1rem-xl{padding-right:1rem}.padding-right-1-5rem-xl{padding-right:1.5rem}.padding-right-2rem-xl{padding-right:2rem}.padding-right-3rem-xl{padding-right:3rem}.padding-right-4rem-xl{padding-right:4rem}.padding-right-5rem-xl{padding-right:5rem}}.padding-top-0-25rem{padding-top:.25rem}.padding-top-0-5rem{padding-top:.5rem}.padding-top-1rem{padding-top:1rem}.padding-top-1-5rem{padding-top:1.5rem}.padding-top-2rem{padding-top:2rem}.padding-top-3rem{padding-top:3rem}.padding-top-4rem{padding-top:4rem}.padding-top-5rem{padding-top:5rem}.padding-bottom-0-25rem{padding-bottom:.25rem}.padding-bottom-0-5rem{padding-bottom:.5rem}.padding-bottom-1rem{padding-bottom:1rem}.padding-bottom-1-5rem{padding-bottom:1.5rem}.padding-bottom-2rem{padding-bottom:2rem}.padding-bottom-3rem{padding-bottom:3rem}.padding-bottom-4rem{padding-bottom:4rem}.padding-bottom-5rem{padding-bottom:5rem}@media only screen and (min-width:768px){.padding-top-0-m{padding-top:0}.padding-top-0-25rem-m{padding-top:.25rem}.padding-top-0-5rem-m{padding-top:.5rem}.padding-top-1rem-m{padding-top:1rem}.padding-top-1-5rem-m{padding-top:1.5rem}.padding-top-2rem-m{padding-top:2rem}.padding-top-3rem-m{padding-top:3rem}.padding-top-4rem-m{padding-top:4rem}.padding-top-5rem-m{padding-top:5rem}.padding-bottom-0-m{padding-bottom:0}.padding-bottom-0-25rem-m{padding-bottom:.25rem}.padding-bottom-0-5rem-m{padding-bottom:.5rem}.padding-bottom-1rem-m{padding-bottom:1rem}.padding-bottom-1-5rem-m{padding-bottom:1.5rem}.padding-bottom-2rem-m{padding-bottom:2rem}.padding-bottom-3rem-m{padding-bottom:3rem}.padding-bottom-4rem-m{padding-bottom:4rem}.padding-bottom-5rem-m{padding-bottom:5rem}}@media only screen and (min-width:980px){.padding-top-0-l{padding-top:0}.padding-top-0-25rem-l{padding-top:.25rem}.padding-top-0-5rem-l{padding-top:.5rem}.padding-top-1rem-l{padding-top:1rem}.padding-top-1-5rem-l{padding-top:1.5rem}.padding-top-2rem-l{padding-top:2rem}.padding-top-3rem-l{padding-top:3rem}.padding-top-4rem-l{padding-top:4rem}.padding-top-5rem-l{padding-top:5rem}.padding-bottom-0-l{padding-bottom:0}.padding-bottom-0-25rem-l{padding-bottom:.25rem}.padding-bottom-0-5rem-l{padding-bottom:.5rem}.padding-bottom-1rem-l{padding-bottom:1rem}.padding-bottom-1-5rem-l{padding-bottom:1.5rem}.padding-bottom-2rem-l{padding-bottom:2rem}.padding-bottom-3rem-l{padding-bottom:3rem}.padding-bottom-4rem-l{padding-bottom:4rem}.padding-bottom-5rem-l{padding-bottom:5rem}}@media only screen and (min-width:1200px){.padding-top-0-xl{padding-top:0}.padding-top-0-25rem-xl{padding-top:.25rem}.padding-top-0-5rem-xl{padding-top:.5rem}.padding-top-1rem-xl{padding-top:1rem}.padding-top-1-5rem-xl{padding-top:1.5rem}.padding-top-2rem-xl{padding-top:2rem}.padding-top-3rem-xl{padding-top:3rem}.padding-top-4rem-xl{padding-top:4rem}.padding-top-5rem-xl{padding-top:5rem}.padding-bottom-0-xl{padding-bottom:0}.padding-bottom-0-25rem-xl{padding-bottom:.25rem}.padding-bottom-0-5rem-xl{padding-bottom:.5rem}.padding-bottom-1rem-xl{padding-bottom:1rem}.padding-bottom-1-5rem-xl{padding-bottom:1.5rem}.padding-bottom-2rem-xl{padding-bottom:2rem}.padding-bottom-3rem-xl{padding-bottom:3rem}.padding-bottom-4rem-xl{padding-bottom:4rem}.padding-bottom-5rem-xl{padding-bottom:5rem}}.padding-0{padding:0}.padding-0-25rem{padding:.25rem}.padding-0-5rem{padding:.5rem}.padding-1rem{padding:1rem}.padding-1-5rem{padding:1.5rem}.padding-2rem{padding:2rem}.padding-3rem{padding:3rem}.padding-4rem{padding:4rem}.padding-5rem{padding:5rem}@media only screen and (min-width:768px){.padding-0-m{padding:0}.padding-0-25rem-m{padding:.25rem}.padding-0-5rem-m{padding:.5rem}.padding-1rem-m{padding:1rem}.padding-1-5rem-m{padding:1.5rem}.padding-2rem-m{padding:2rem}.padding-3rem-m{padding:3rem}.padding-4rem-m{padding:4rem}.padding-5rem-m{padding:5rem}}@media only screen and (min-width:980px){.padding-0-l{padding:0}.padding-0-25rem-l{padding:.25rem}.padding-0-5rem-l{padding:.5rem}.padding-1rem-l{padding:1rem}.padding-1-5rem-l{padding:1.5rem}.padding-2rem-l{padding:2rem}.padding-3rem-l{padding:3rem}.padding-4rem-l{padding:4rem}.padding-5rem-l{padding:5rem}}@media only screen and (min-width:1200px){.padding-0-xl{padding:0}.padding-0-25rem-xl{padding:.25rem}.padding-0-5rem-xl{padding:.5rem}.padding-1rem-xl{padding:1rem}.padding-1-5rem-xl{padding:1.5rem}.padding-2rem-xl{padding:2rem}.padding-3rem-xl{padding:3rem}.padding-4rem-xl{padding:4rem}.padding-5rem-xl{padding:5rem}}.none{display:none}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}@media only screen and (min-width:768px){.none-m{display:none}.block-m{display:block}.inline-block-m{display:inline-block}.inline-m{display:inline}.flex-m{display:-webkit-box;display:-ms-flexbox;display:flex}}@media only screen and (min-width:980px){.none-l{display:none}.block-l{display:block}.inline-block-l{display:inline-block}.inline-l{display:inline}.flex-l{display:-webkit-box;display:-ms-flexbox;display:flex}}@media only screen and (min-width:1200px){.block-xl,.none-xl{display:block}.inline-block-xl{display:inline-block}.inline-xl{display:inline}.flex-xl{display:-webkit-box;display:-ms-flexbox;display:flex}}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-nowrap{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.flex-align-items-bottom,.flex-align-items-center,.flex-align-items-top{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.flex-justify-left{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.flex-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.flex-justify-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.flex-space-around{-ms-flex-pack:distribute;justify-content:space-around}.flex-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.flex-row{-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.flex-row,.flex-row-reverse{-webkit-box-orient:horizontal}.flex-row-reverse{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.flex-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media only screen and (min-width:768px){.flex-wrap-m{-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-nowrap-m{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.flex-align-items-bottom-m,.flex-align-items-center-m,.flex-align-items-top-m{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.flex-justify-left-m{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.flex-justify-center-m{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.flex-justify-right-m{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.flex-space-around-m{-ms-flex-pack:distribute;justify-content:space-around}.flex-space-between-m{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.flex-row-m{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.flex-row-reverse-m{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-column-m{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.flex-column-reverse-m{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media only screen and (min-width:980px){.flex-wrap-l{-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-nowrap-l{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.flex-align-items-bottom-l,.flex-align-items-center-l,.flex-align-items-top-l{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.flex-justify-left-l{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.flex-justify-center-l{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.flex-justify-right-l{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.flex-space-around-l{-ms-flex-pack:distribute;justify-content:space-around}.flex-space-between-l{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.flex-row-l{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.flex-row-reverse-l{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-column-l{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.flex-column-reverse-l{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media only screen and (min-width:1200px){.flex-wrap-xl{-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-nowrap-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.flex-align-items-bottom-xl,.flex-align-items-center-xl,.flex-align-items-top-xl{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.flex-justify-left-xl{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.flex-justify-center-xl{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.flex-justify-right-xl{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.flex-space-around-xl{-ms-flex-pack:distribute;justify-content:space-around}.flex-space-between-xl{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.flex-row-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.flex-row-reverse-xl{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-column-xl{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.flex-column-reverse-xl{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.relative{position:relative}.absolute{position:absolute}.static{position:static}.fixed{position:fixed}.sticky{position:-webkit-sticky;position:sticky}@media only screen and (min-width:768px){.relative-m{position:relative}.absolute-m{position:absolute}.static-m{position:static}.fixed-m{position:fixed}.sticky-m{position:-webkit-sticky;position:sticky}}@media only screen and (min-width:980px){.relative-l{position:relative}.absolute-l{position:absolute}.static-l{position:static}.fixed-l{position:fixed}.sticky-l{position:-webkit-sticky;position:sticky}}@media only screen and (min-width:1200px){.relative-xl{position:relative}.absolute-xl{position:absolute}.static-xl{position:static}.fixed-xl{position:fixed}.sticky-xl{position:-webkit-sticky;position:sticky}}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.font-100{font-weight:100}.font-200{font-weight:200}.font-300{font-weight:300}.font-400{font-weight:400}.font-500{font-weight:500}.font-600{font-weight:600}.font-700{font-weight:700}.font-800{font-weight:800}.font-900{font-weight:900}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}@media only screen and (min-width:768px){.text-left-m{text-align:left}.text-right-m{text-align:right}.text-center-m{text-align:center}}@media only screen and (min-width:980px){.text-left-l{text-align:left}.text-right-l{text-align:right}.text-center-l{text-align:center}}@media only screen and (min-width:1200px){.text-left-xl{text-align:left}.text-right-xl{text-align:right}.text-center-xl{text-align:center}} \ No newline at end of file diff --git a/pkgs/csslib/third_party/bootstrap/LICENSE b/pkgs/csslib/third_party/bootstrap/LICENSE new file mode 100644 index 000000000..72dda234e --- /dev/null +++ b/pkgs/csslib/third_party/bootstrap/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2011-2021 Twitter, Inc. +Copyright (c) 2011-2021 The Bootstrap Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pkgs/csslib/third_party/bootstrap/README.md b/pkgs/csslib/third_party/bootstrap/README.md new file mode 100644 index 000000000..bb1d3bba4 --- /dev/null +++ b/pkgs/csslib/third_party/bootstrap/README.md @@ -0,0 +1,4 @@ +This folder contains sample css files from the open-source project +https://github.com/twbs/bootstrap. + +This code was included under the terms in the `LICENSE` file. \ No newline at end of file diff --git a/pkgs/csslib/third_party/bootstrap/bootstrap-grid.css b/pkgs/csslib/third_party/bootstrap/bootstrap-grid.css new file mode 100644 index 000000000..e6af9ab8f --- /dev/null +++ b/pkgs/csslib/third_party/bootstrap/bootstrap-grid.css @@ -0,0 +1,5051 @@ +/*! + * Bootstrap Grid v5.1.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg-rgb: 255, 255, 255; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-bg: #fff; +} + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + width: 100%; + padding-right: var(--bs-gutter-x, 0.75rem); + padding-left: var(--bs-gutter-x, 0.75rem); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1320px; + } +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(var(--bs-gutter-y) * -1); + margin-right: calc(var(--bs-gutter-x) * -.5); + margin-left: calc(var(--bs-gutter-x) * -.5); +} +.row > * { + box-sizing: border-box; + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * .5); + padding-left: calc(var(--bs-gutter-x) * .5); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.33333333%; + } + + .offset-sm-2 { + margin-left: 16.66666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.33333333%; + } + + .offset-sm-5 { + margin-left: 41.66666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.33333333%; + } + + .offset-sm-8 { + margin-left: 66.66666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.33333333%; + } + + .offset-sm-11 { + margin-left: 91.66666667%; + } + + .g-sm-0, +.gx-sm-0 { + --bs-gutter-x: 0; + } + + .g-sm-0, +.gy-sm-0 { + --bs-gutter-y: 0; + } + + .g-sm-1, +.gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + + .g-sm-1, +.gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + + .g-sm-2, +.gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + + .g-sm-2, +.gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + + .g-sm-3, +.gx-sm-3 { + --bs-gutter-x: 1rem; + } + + .g-sm-3, +.gy-sm-3 { + --bs-gutter-y: 1rem; + } + + .g-sm-4, +.gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + + .g-sm-4, +.gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + + .g-sm-5, +.gx-sm-5 { + --bs-gutter-x: 3rem; + } + + .g-sm-5, +.gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.33333333%; + } + + .offset-md-2 { + margin-left: 16.66666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.33333333%; + } + + .offset-md-5 { + margin-left: 41.66666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.33333333%; + } + + .offset-md-8 { + margin-left: 66.66666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.33333333%; + } + + .offset-md-11 { + margin-left: 91.66666667%; + } + + .g-md-0, +.gx-md-0 { + --bs-gutter-x: 0; + } + + .g-md-0, +.gy-md-0 { + --bs-gutter-y: 0; + } + + .g-md-1, +.gx-md-1 { + --bs-gutter-x: 0.25rem; + } + + .g-md-1, +.gy-md-1 { + --bs-gutter-y: 0.25rem; + } + + .g-md-2, +.gx-md-2 { + --bs-gutter-x: 0.5rem; + } + + .g-md-2, +.gy-md-2 { + --bs-gutter-y: 0.5rem; + } + + .g-md-3, +.gx-md-3 { + --bs-gutter-x: 1rem; + } + + .g-md-3, +.gy-md-3 { + --bs-gutter-y: 1rem; + } + + .g-md-4, +.gx-md-4 { + --bs-gutter-x: 1.5rem; + } + + .g-md-4, +.gy-md-4 { + --bs-gutter-y: 1.5rem; + } + + .g-md-5, +.gx-md-5 { + --bs-gutter-x: 3rem; + } + + .g-md-5, +.gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.33333333%; + } + + .offset-lg-2 { + margin-left: 16.66666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.33333333%; + } + + .offset-lg-5 { + margin-left: 41.66666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.33333333%; + } + + .offset-lg-8 { + margin-left: 66.66666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.33333333%; + } + + .offset-lg-11 { + margin-left: 91.66666667%; + } + + .g-lg-0, +.gx-lg-0 { + --bs-gutter-x: 0; + } + + .g-lg-0, +.gy-lg-0 { + --bs-gutter-y: 0; + } + + .g-lg-1, +.gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + + .g-lg-1, +.gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + + .g-lg-2, +.gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + + .g-lg-2, +.gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + + .g-lg-3, +.gx-lg-3 { + --bs-gutter-x: 1rem; + } + + .g-lg-3, +.gy-lg-3 { + --bs-gutter-y: 1rem; + } + + .g-lg-4, +.gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + + .g-lg-4, +.gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + + .g-lg-5, +.gx-lg-5 { + --bs-gutter-x: 3rem; + } + + .g-lg-5, +.gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.33333333%; + } + + .offset-xl-2 { + margin-left: 16.66666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.33333333%; + } + + .offset-xl-5 { + margin-left: 41.66666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.33333333%; + } + + .offset-xl-8 { + margin-left: 66.66666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.33333333%; + } + + .offset-xl-11 { + margin-left: 91.66666667%; + } + + .g-xl-0, +.gx-xl-0 { + --bs-gutter-x: 0; + } + + .g-xl-0, +.gy-xl-0 { + --bs-gutter-y: 0; + } + + .g-xl-1, +.gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + + .g-xl-1, +.gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + + .g-xl-2, +.gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + + .g-xl-2, +.gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + + .g-xl-3, +.gx-xl-3 { + --bs-gutter-x: 1rem; + } + + .g-xl-3, +.gy-xl-3 { + --bs-gutter-y: 1rem; + } + + .g-xl-4, +.gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + + .g-xl-4, +.gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + + .g-xl-5, +.gx-xl-5 { + --bs-gutter-x: 3rem; + } + + .g-xl-5, +.gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xxl-0 { + margin-left: 0; + } + + .offset-xxl-1 { + margin-left: 8.33333333%; + } + + .offset-xxl-2 { + margin-left: 16.66666667%; + } + + .offset-xxl-3 { + margin-left: 25%; + } + + .offset-xxl-4 { + margin-left: 33.33333333%; + } + + .offset-xxl-5 { + margin-left: 41.66666667%; + } + + .offset-xxl-6 { + margin-left: 50%; + } + + .offset-xxl-7 { + margin-left: 58.33333333%; + } + + .offset-xxl-8 { + margin-left: 66.66666667%; + } + + .offset-xxl-9 { + margin-left: 75%; + } + + .offset-xxl-10 { + margin-left: 83.33333333%; + } + + .offset-xxl-11 { + margin-left: 91.66666667%; + } + + .g-xxl-0, +.gx-xxl-0 { + --bs-gutter-x: 0; + } + + .g-xxl-0, +.gy-xxl-0 { + --bs-gutter-y: 0; + } + + .g-xxl-1, +.gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + + .g-xxl-1, +.gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + + .g-xxl-2, +.gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + + .g-xxl-2, +.gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + + .g-xxl-3, +.gx-xxl-3 { + --bs-gutter-x: 1rem; + } + + .g-xxl-3, +.gy-xxl-3 { + --bs-gutter-y: 1rem; + } + + .g-xxl-4, +.gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + + .g-xxl-4, +.gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + + .g-xxl-5, +.gx-xxl-5 { + --bs-gutter-x: 3rem; + } + + .g-xxl-5, +.gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +@media (min-width: 576px) { + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-grid { + display: grid !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: flex !important; + } + + .d-sm-inline-flex { + display: inline-flex !important; + } + + .d-sm-none { + display: none !important; + } + + .flex-sm-fill { + flex: 1 1 auto !important; + } + + .flex-sm-row { + flex-direction: row !important; + } + + .flex-sm-column { + flex-direction: column !important; + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-sm-wrap { + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .justify-content-sm-start { + justify-content: flex-start !important; + } + + .justify-content-sm-end { + justify-content: flex-end !important; + } + + .justify-content-sm-center { + justify-content: center !important; + } + + .justify-content-sm-between { + justify-content: space-between !important; + } + + .justify-content-sm-around { + justify-content: space-around !important; + } + + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + + .align-items-sm-start { + align-items: flex-start !important; + } + + .align-items-sm-end { + align-items: flex-end !important; + } + + .align-items-sm-center { + align-items: center !important; + } + + .align-items-sm-baseline { + align-items: baseline !important; + } + + .align-items-sm-stretch { + align-items: stretch !important; + } + + .align-content-sm-start { + align-content: flex-start !important; + } + + .align-content-sm-end { + align-content: flex-end !important; + } + + .align-content-sm-center { + align-content: center !important; + } + + .align-content-sm-between { + align-content: space-between !important; + } + + .align-content-sm-around { + align-content: space-around !important; + } + + .align-content-sm-stretch { + align-content: stretch !important; + } + + .align-self-sm-auto { + align-self: auto !important; + } + + .align-self-sm-start { + align-self: flex-start !important; + } + + .align-self-sm-end { + align-self: flex-end !important; + } + + .align-self-sm-center { + align-self: center !important; + } + + .align-self-sm-baseline { + align-self: baseline !important; + } + + .align-self-sm-stretch { + align-self: stretch !important; + } + + .order-sm-first { + order: -1 !important; + } + + .order-sm-0 { + order: 0 !important; + } + + .order-sm-1 { + order: 1 !important; + } + + .order-sm-2 { + order: 2 !important; + } + + .order-sm-3 { + order: 3 !important; + } + + .order-sm-4 { + order: 4 !important; + } + + .order-sm-5 { + order: 5 !important; + } + + .order-sm-last { + order: 6 !important; + } + + .m-sm-0 { + margin: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-sm-0 { + margin-top: 0 !important; + } + + .mt-sm-1 { + margin-top: 0.25rem !important; + } + + .mt-sm-2 { + margin-top: 0.5rem !important; + } + + .mt-sm-3 { + margin-top: 1rem !important; + } + + .mt-sm-4 { + margin-top: 1.5rem !important; + } + + .mt-sm-5 { + margin-top: 3rem !important; + } + + .mt-sm-auto { + margin-top: auto !important; + } + + .me-sm-0 { + margin-right: 0 !important; + } + + .me-sm-1 { + margin-right: 0.25rem !important; + } + + .me-sm-2 { + margin-right: 0.5rem !important; + } + + .me-sm-3 { + margin-right: 1rem !important; + } + + .me-sm-4 { + margin-right: 1.5rem !important; + } + + .me-sm-5 { + margin-right: 3rem !important; + } + + .me-sm-auto { + margin-right: auto !important; + } + + .mb-sm-0 { + margin-bottom: 0 !important; + } + + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + + .mb-sm-3 { + margin-bottom: 1rem !important; + } + + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + + .mb-sm-5 { + margin-bottom: 3rem !important; + } + + .mb-sm-auto { + margin-bottom: auto !important; + } + + .ms-sm-0 { + margin-left: 0 !important; + } + + .ms-sm-1 { + margin-left: 0.25rem !important; + } + + .ms-sm-2 { + margin-left: 0.5rem !important; + } + + .ms-sm-3 { + margin-left: 1rem !important; + } + + .ms-sm-4 { + margin-left: 1.5rem !important; + } + + .ms-sm-5 { + margin-left: 3rem !important; + } + + .ms-sm-auto { + margin-left: auto !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-sm-0 { + padding-top: 0 !important; + } + + .pt-sm-1 { + padding-top: 0.25rem !important; + } + + .pt-sm-2 { + padding-top: 0.5rem !important; + } + + .pt-sm-3 { + padding-top: 1rem !important; + } + + .pt-sm-4 { + padding-top: 1.5rem !important; + } + + .pt-sm-5 { + padding-top: 3rem !important; + } + + .pe-sm-0 { + padding-right: 0 !important; + } + + .pe-sm-1 { + padding-right: 0.25rem !important; + } + + .pe-sm-2 { + padding-right: 0.5rem !important; + } + + .pe-sm-3 { + padding-right: 1rem !important; + } + + .pe-sm-4 { + padding-right: 1.5rem !important; + } + + .pe-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-0 { + padding-bottom: 0 !important; + } + + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pb-sm-3 { + padding-bottom: 1rem !important; + } + + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pb-sm-5 { + padding-bottom: 3rem !important; + } + + .ps-sm-0 { + padding-left: 0 !important; + } + + .ps-sm-1 { + padding-left: 0.25rem !important; + } + + .ps-sm-2 { + padding-left: 0.5rem !important; + } + + .ps-sm-3 { + padding-left: 1rem !important; + } + + .ps-sm-4 { + padding-left: 1.5rem !important; + } + + .ps-sm-5 { + padding-left: 3rem !important; + } +} +@media (min-width: 768px) { + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-grid { + display: grid !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: flex !important; + } + + .d-md-inline-flex { + display: inline-flex !important; + } + + .d-md-none { + display: none !important; + } + + .flex-md-fill { + flex: 1 1 auto !important; + } + + .flex-md-row { + flex-direction: row !important; + } + + .flex-md-column { + flex-direction: column !important; + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-md-grow-0 { + flex-grow: 0 !important; + } + + .flex-md-grow-1 { + flex-grow: 1 !important; + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-md-wrap { + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .justify-content-md-start { + justify-content: flex-start !important; + } + + .justify-content-md-end { + justify-content: flex-end !important; + } + + .justify-content-md-center { + justify-content: center !important; + } + + .justify-content-md-between { + justify-content: space-between !important; + } + + .justify-content-md-around { + justify-content: space-around !important; + } + + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + + .align-items-md-start { + align-items: flex-start !important; + } + + .align-items-md-end { + align-items: flex-end !important; + } + + .align-items-md-center { + align-items: center !important; + } + + .align-items-md-baseline { + align-items: baseline !important; + } + + .align-items-md-stretch { + align-items: stretch !important; + } + + .align-content-md-start { + align-content: flex-start !important; + } + + .align-content-md-end { + align-content: flex-end !important; + } + + .align-content-md-center { + align-content: center !important; + } + + .align-content-md-between { + align-content: space-between !important; + } + + .align-content-md-around { + align-content: space-around !important; + } + + .align-content-md-stretch { + align-content: stretch !important; + } + + .align-self-md-auto { + align-self: auto !important; + } + + .align-self-md-start { + align-self: flex-start !important; + } + + .align-self-md-end { + align-self: flex-end !important; + } + + .align-self-md-center { + align-self: center !important; + } + + .align-self-md-baseline { + align-self: baseline !important; + } + + .align-self-md-stretch { + align-self: stretch !important; + } + + .order-md-first { + order: -1 !important; + } + + .order-md-0 { + order: 0 !important; + } + + .order-md-1 { + order: 1 !important; + } + + .order-md-2 { + order: 2 !important; + } + + .order-md-3 { + order: 3 !important; + } + + .order-md-4 { + order: 4 !important; + } + + .order-md-5 { + order: 5 !important; + } + + .order-md-last { + order: 6 !important; + } + + .m-md-0 { + margin: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-md-0 { + margin-top: 0 !important; + } + + .mt-md-1 { + margin-top: 0.25rem !important; + } + + .mt-md-2 { + margin-top: 0.5rem !important; + } + + .mt-md-3 { + margin-top: 1rem !important; + } + + .mt-md-4 { + margin-top: 1.5rem !important; + } + + .mt-md-5 { + margin-top: 3rem !important; + } + + .mt-md-auto { + margin-top: auto !important; + } + + .me-md-0 { + margin-right: 0 !important; + } + + .me-md-1 { + margin-right: 0.25rem !important; + } + + .me-md-2 { + margin-right: 0.5rem !important; + } + + .me-md-3 { + margin-right: 1rem !important; + } + + .me-md-4 { + margin-right: 1.5rem !important; + } + + .me-md-5 { + margin-right: 3rem !important; + } + + .me-md-auto { + margin-right: auto !important; + } + + .mb-md-0 { + margin-bottom: 0 !important; + } + + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + + .mb-md-3 { + margin-bottom: 1rem !important; + } + + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + + .mb-md-5 { + margin-bottom: 3rem !important; + } + + .mb-md-auto { + margin-bottom: auto !important; + } + + .ms-md-0 { + margin-left: 0 !important; + } + + .ms-md-1 { + margin-left: 0.25rem !important; + } + + .ms-md-2 { + margin-left: 0.5rem !important; + } + + .ms-md-3 { + margin-left: 1rem !important; + } + + .ms-md-4 { + margin-left: 1.5rem !important; + } + + .ms-md-5 { + margin-left: 3rem !important; + } + + .ms-md-auto { + margin-left: auto !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-md-0 { + padding-top: 0 !important; + } + + .pt-md-1 { + padding-top: 0.25rem !important; + } + + .pt-md-2 { + padding-top: 0.5rem !important; + } + + .pt-md-3 { + padding-top: 1rem !important; + } + + .pt-md-4 { + padding-top: 1.5rem !important; + } + + .pt-md-5 { + padding-top: 3rem !important; + } + + .pe-md-0 { + padding-right: 0 !important; + } + + .pe-md-1 { + padding-right: 0.25rem !important; + } + + .pe-md-2 { + padding-right: 0.5rem !important; + } + + .pe-md-3 { + padding-right: 1rem !important; + } + + .pe-md-4 { + padding-right: 1.5rem !important; + } + + .pe-md-5 { + padding-right: 3rem !important; + } + + .pb-md-0 { + padding-bottom: 0 !important; + } + + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + + .pb-md-3 { + padding-bottom: 1rem !important; + } + + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + + .pb-md-5 { + padding-bottom: 3rem !important; + } + + .ps-md-0 { + padding-left: 0 !important; + } + + .ps-md-1 { + padding-left: 0.25rem !important; + } + + .ps-md-2 { + padding-left: 0.5rem !important; + } + + .ps-md-3 { + padding-left: 1rem !important; + } + + .ps-md-4 { + padding-left: 1.5rem !important; + } + + .ps-md-5 { + padding-left: 3rem !important; + } +} +@media (min-width: 992px) { + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-grid { + display: grid !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: flex !important; + } + + .d-lg-inline-flex { + display: inline-flex !important; + } + + .d-lg-none { + display: none !important; + } + + .flex-lg-fill { + flex: 1 1 auto !important; + } + + .flex-lg-row { + flex-direction: row !important; + } + + .flex-lg-column { + flex-direction: column !important; + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-lg-wrap { + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .justify-content-lg-start { + justify-content: flex-start !important; + } + + .justify-content-lg-end { + justify-content: flex-end !important; + } + + .justify-content-lg-center { + justify-content: center !important; + } + + .justify-content-lg-between { + justify-content: space-between !important; + } + + .justify-content-lg-around { + justify-content: space-around !important; + } + + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + + .align-items-lg-start { + align-items: flex-start !important; + } + + .align-items-lg-end { + align-items: flex-end !important; + } + + .align-items-lg-center { + align-items: center !important; + } + + .align-items-lg-baseline { + align-items: baseline !important; + } + + .align-items-lg-stretch { + align-items: stretch !important; + } + + .align-content-lg-start { + align-content: flex-start !important; + } + + .align-content-lg-end { + align-content: flex-end !important; + } + + .align-content-lg-center { + align-content: center !important; + } + + .align-content-lg-between { + align-content: space-between !important; + } + + .align-content-lg-around { + align-content: space-around !important; + } + + .align-content-lg-stretch { + align-content: stretch !important; + } + + .align-self-lg-auto { + align-self: auto !important; + } + + .align-self-lg-start { + align-self: flex-start !important; + } + + .align-self-lg-end { + align-self: flex-end !important; + } + + .align-self-lg-center { + align-self: center !important; + } + + .align-self-lg-baseline { + align-self: baseline !important; + } + + .align-self-lg-stretch { + align-self: stretch !important; + } + + .order-lg-first { + order: -1 !important; + } + + .order-lg-0 { + order: 0 !important; + } + + .order-lg-1 { + order: 1 !important; + } + + .order-lg-2 { + order: 2 !important; + } + + .order-lg-3 { + order: 3 !important; + } + + .order-lg-4 { + order: 4 !important; + } + + .order-lg-5 { + order: 5 !important; + } + + .order-lg-last { + order: 6 !important; + } + + .m-lg-0 { + margin: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-lg-0 { + margin-top: 0 !important; + } + + .mt-lg-1 { + margin-top: 0.25rem !important; + } + + .mt-lg-2 { + margin-top: 0.5rem !important; + } + + .mt-lg-3 { + margin-top: 1rem !important; + } + + .mt-lg-4 { + margin-top: 1.5rem !important; + } + + .mt-lg-5 { + margin-top: 3rem !important; + } + + .mt-lg-auto { + margin-top: auto !important; + } + + .me-lg-0 { + margin-right: 0 !important; + } + + .me-lg-1 { + margin-right: 0.25rem !important; + } + + .me-lg-2 { + margin-right: 0.5rem !important; + } + + .me-lg-3 { + margin-right: 1rem !important; + } + + .me-lg-4 { + margin-right: 1.5rem !important; + } + + .me-lg-5 { + margin-right: 3rem !important; + } + + .me-lg-auto { + margin-right: auto !important; + } + + .mb-lg-0 { + margin-bottom: 0 !important; + } + + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + + .mb-lg-3 { + margin-bottom: 1rem !important; + } + + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + + .mb-lg-5 { + margin-bottom: 3rem !important; + } + + .mb-lg-auto { + margin-bottom: auto !important; + } + + .ms-lg-0 { + margin-left: 0 !important; + } + + .ms-lg-1 { + margin-left: 0.25rem !important; + } + + .ms-lg-2 { + margin-left: 0.5rem !important; + } + + .ms-lg-3 { + margin-left: 1rem !important; + } + + .ms-lg-4 { + margin-left: 1.5rem !important; + } + + .ms-lg-5 { + margin-left: 3rem !important; + } + + .ms-lg-auto { + margin-left: auto !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-lg-0 { + padding-top: 0 !important; + } + + .pt-lg-1 { + padding-top: 0.25rem !important; + } + + .pt-lg-2 { + padding-top: 0.5rem !important; + } + + .pt-lg-3 { + padding-top: 1rem !important; + } + + .pt-lg-4 { + padding-top: 1.5rem !important; + } + + .pt-lg-5 { + padding-top: 3rem !important; + } + + .pe-lg-0 { + padding-right: 0 !important; + } + + .pe-lg-1 { + padding-right: 0.25rem !important; + } + + .pe-lg-2 { + padding-right: 0.5rem !important; + } + + .pe-lg-3 { + padding-right: 1rem !important; + } + + .pe-lg-4 { + padding-right: 1.5rem !important; + } + + .pe-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-0 { + padding-bottom: 0 !important; + } + + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pb-lg-3 { + padding-bottom: 1rem !important; + } + + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pb-lg-5 { + padding-bottom: 3rem !important; + } + + .ps-lg-0 { + padding-left: 0 !important; + } + + .ps-lg-1 { + padding-left: 0.25rem !important; + } + + .ps-lg-2 { + padding-left: 0.5rem !important; + } + + .ps-lg-3 { + padding-left: 1rem !important; + } + + .ps-lg-4 { + padding-left: 1.5rem !important; + } + + .ps-lg-5 { + padding-left: 3rem !important; + } +} +@media (min-width: 1200px) { + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-grid { + display: grid !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: flex !important; + } + + .d-xl-inline-flex { + display: inline-flex !important; + } + + .d-xl-none { + display: none !important; + } + + .flex-xl-fill { + flex: 1 1 auto !important; + } + + .flex-xl-row { + flex-direction: row !important; + } + + .flex-xl-column { + flex-direction: column !important; + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-xl-wrap { + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .justify-content-xl-start { + justify-content: flex-start !important; + } + + .justify-content-xl-end { + justify-content: flex-end !important; + } + + .justify-content-xl-center { + justify-content: center !important; + } + + .justify-content-xl-between { + justify-content: space-between !important; + } + + .justify-content-xl-around { + justify-content: space-around !important; + } + + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + + .align-items-xl-start { + align-items: flex-start !important; + } + + .align-items-xl-end { + align-items: flex-end !important; + } + + .align-items-xl-center { + align-items: center !important; + } + + .align-items-xl-baseline { + align-items: baseline !important; + } + + .align-items-xl-stretch { + align-items: stretch !important; + } + + .align-content-xl-start { + align-content: flex-start !important; + } + + .align-content-xl-end { + align-content: flex-end !important; + } + + .align-content-xl-center { + align-content: center !important; + } + + .align-content-xl-between { + align-content: space-between !important; + } + + .align-content-xl-around { + align-content: space-around !important; + } + + .align-content-xl-stretch { + align-content: stretch !important; + } + + .align-self-xl-auto { + align-self: auto !important; + } + + .align-self-xl-start { + align-self: flex-start !important; + } + + .align-self-xl-end { + align-self: flex-end !important; + } + + .align-self-xl-center { + align-self: center !important; + } + + .align-self-xl-baseline { + align-self: baseline !important; + } + + .align-self-xl-stretch { + align-self: stretch !important; + } + + .order-xl-first { + order: -1 !important; + } + + .order-xl-0 { + order: 0 !important; + } + + .order-xl-1 { + order: 1 !important; + } + + .order-xl-2 { + order: 2 !important; + } + + .order-xl-3 { + order: 3 !important; + } + + .order-xl-4 { + order: 4 !important; + } + + .order-xl-5 { + order: 5 !important; + } + + .order-xl-last { + order: 6 !important; + } + + .m-xl-0 { + margin: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-xl-0 { + margin-top: 0 !important; + } + + .mt-xl-1 { + margin-top: 0.25rem !important; + } + + .mt-xl-2 { + margin-top: 0.5rem !important; + } + + .mt-xl-3 { + margin-top: 1rem !important; + } + + .mt-xl-4 { + margin-top: 1.5rem !important; + } + + .mt-xl-5 { + margin-top: 3rem !important; + } + + .mt-xl-auto { + margin-top: auto !important; + } + + .me-xl-0 { + margin-right: 0 !important; + } + + .me-xl-1 { + margin-right: 0.25rem !important; + } + + .me-xl-2 { + margin-right: 0.5rem !important; + } + + .me-xl-3 { + margin-right: 1rem !important; + } + + .me-xl-4 { + margin-right: 1.5rem !important; + } + + .me-xl-5 { + margin-right: 3rem !important; + } + + .me-xl-auto { + margin-right: auto !important; + } + + .mb-xl-0 { + margin-bottom: 0 !important; + } + + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + + .mb-xl-3 { + margin-bottom: 1rem !important; + } + + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + + .mb-xl-5 { + margin-bottom: 3rem !important; + } + + .mb-xl-auto { + margin-bottom: auto !important; + } + + .ms-xl-0 { + margin-left: 0 !important; + } + + .ms-xl-1 { + margin-left: 0.25rem !important; + } + + .ms-xl-2 { + margin-left: 0.5rem !important; + } + + .ms-xl-3 { + margin-left: 1rem !important; + } + + .ms-xl-4 { + margin-left: 1.5rem !important; + } + + .ms-xl-5 { + margin-left: 3rem !important; + } + + .ms-xl-auto { + margin-left: auto !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-xl-0 { + padding-top: 0 !important; + } + + .pt-xl-1 { + padding-top: 0.25rem !important; + } + + .pt-xl-2 { + padding-top: 0.5rem !important; + } + + .pt-xl-3 { + padding-top: 1rem !important; + } + + .pt-xl-4 { + padding-top: 1.5rem !important; + } + + .pt-xl-5 { + padding-top: 3rem !important; + } + + .pe-xl-0 { + padding-right: 0 !important; + } + + .pe-xl-1 { + padding-right: 0.25rem !important; + } + + .pe-xl-2 { + padding-right: 0.5rem !important; + } + + .pe-xl-3 { + padding-right: 1rem !important; + } + + .pe-xl-4 { + padding-right: 1.5rem !important; + } + + .pe-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-0 { + padding-bottom: 0 !important; + } + + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pb-xl-3 { + padding-bottom: 1rem !important; + } + + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pb-xl-5 { + padding-bottom: 3rem !important; + } + + .ps-xl-0 { + padding-left: 0 !important; + } + + .ps-xl-1 { + padding-left: 0.25rem !important; + } + + .ps-xl-2 { + padding-left: 0.5rem !important; + } + + .ps-xl-3 { + padding-left: 1rem !important; + } + + .ps-xl-4 { + padding-left: 1.5rem !important; + } + + .ps-xl-5 { + padding-left: 3rem !important; + } +} +@media (min-width: 1400px) { + .d-xxl-inline { + display: inline !important; + } + + .d-xxl-inline-block { + display: inline-block !important; + } + + .d-xxl-block { + display: block !important; + } + + .d-xxl-grid { + display: grid !important; + } + + .d-xxl-table { + display: table !important; + } + + .d-xxl-table-row { + display: table-row !important; + } + + .d-xxl-table-cell { + display: table-cell !important; + } + + .d-xxl-flex { + display: flex !important; + } + + .d-xxl-inline-flex { + display: inline-flex !important; + } + + .d-xxl-none { + display: none !important; + } + + .flex-xxl-fill { + flex: 1 1 auto !important; + } + + .flex-xxl-row { + flex-direction: row !important; + } + + .flex-xxl-column { + flex-direction: column !important; + } + + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .justify-content-xxl-start { + justify-content: flex-start !important; + } + + .justify-content-xxl-end { + justify-content: flex-end !important; + } + + .justify-content-xxl-center { + justify-content: center !important; + } + + .justify-content-xxl-between { + justify-content: space-between !important; + } + + .justify-content-xxl-around { + justify-content: space-around !important; + } + + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + + .align-items-xxl-start { + align-items: flex-start !important; + } + + .align-items-xxl-end { + align-items: flex-end !important; + } + + .align-items-xxl-center { + align-items: center !important; + } + + .align-items-xxl-baseline { + align-items: baseline !important; + } + + .align-items-xxl-stretch { + align-items: stretch !important; + } + + .align-content-xxl-start { + align-content: flex-start !important; + } + + .align-content-xxl-end { + align-content: flex-end !important; + } + + .align-content-xxl-center { + align-content: center !important; + } + + .align-content-xxl-between { + align-content: space-between !important; + } + + .align-content-xxl-around { + align-content: space-around !important; + } + + .align-content-xxl-stretch { + align-content: stretch !important; + } + + .align-self-xxl-auto { + align-self: auto !important; + } + + .align-self-xxl-start { + align-self: flex-start !important; + } + + .align-self-xxl-end { + align-self: flex-end !important; + } + + .align-self-xxl-center { + align-self: center !important; + } + + .align-self-xxl-baseline { + align-self: baseline !important; + } + + .align-self-xxl-stretch { + align-self: stretch !important; + } + + .order-xxl-first { + order: -1 !important; + } + + .order-xxl-0 { + order: 0 !important; + } + + .order-xxl-1 { + order: 1 !important; + } + + .order-xxl-2 { + order: 2 !important; + } + + .order-xxl-3 { + order: 3 !important; + } + + .order-xxl-4 { + order: 4 !important; + } + + .order-xxl-5 { + order: 5 !important; + } + + .order-xxl-last { + order: 6 !important; + } + + .m-xxl-0 { + margin: 0 !important; + } + + .m-xxl-1 { + margin: 0.25rem !important; + } + + .m-xxl-2 { + margin: 0.5rem !important; + } + + .m-xxl-3 { + margin: 1rem !important; + } + + .m-xxl-4 { + margin: 1.5rem !important; + } + + .m-xxl-5 { + margin: 3rem !important; + } + + .m-xxl-auto { + margin: auto !important; + } + + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-xxl-0 { + margin-top: 0 !important; + } + + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + + .mt-xxl-3 { + margin-top: 1rem !important; + } + + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + + .mt-xxl-5 { + margin-top: 3rem !important; + } + + .mt-xxl-auto { + margin-top: auto !important; + } + + .me-xxl-0 { + margin-right: 0 !important; + } + + .me-xxl-1 { + margin-right: 0.25rem !important; + } + + .me-xxl-2 { + margin-right: 0.5rem !important; + } + + .me-xxl-3 { + margin-right: 1rem !important; + } + + .me-xxl-4 { + margin-right: 1.5rem !important; + } + + .me-xxl-5 { + margin-right: 3rem !important; + } + + .me-xxl-auto { + margin-right: auto !important; + } + + .mb-xxl-0 { + margin-bottom: 0 !important; + } + + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + + .mb-xxl-auto { + margin-bottom: auto !important; + } + + .ms-xxl-0 { + margin-left: 0 !important; + } + + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + + .ms-xxl-3 { + margin-left: 1rem !important; + } + + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + + .ms-xxl-5 { + margin-left: 3rem !important; + } + + .ms-xxl-auto { + margin-left: auto !important; + } + + .p-xxl-0 { + padding: 0 !important; + } + + .p-xxl-1 { + padding: 0.25rem !important; + } + + .p-xxl-2 { + padding: 0.5rem !important; + } + + .p-xxl-3 { + padding: 1rem !important; + } + + .p-xxl-4 { + padding: 1.5rem !important; + } + + .p-xxl-5 { + padding: 3rem !important; + } + + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-xxl-0 { + padding-top: 0 !important; + } + + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + + .pt-xxl-3 { + padding-top: 1rem !important; + } + + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + + .pt-xxl-5 { + padding-top: 3rem !important; + } + + .pe-xxl-0 { + padding-right: 0 !important; + } + + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + + .pe-xxl-3 { + padding-right: 1rem !important; + } + + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + + .pe-xxl-5 { + padding-right: 3rem !important; + } + + .pb-xxl-0 { + padding-bottom: 0 !important; + } + + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + + .ps-xxl-0 { + padding-left: 0 !important; + } + + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + + .ps-xxl-3 { + padding-left: 1rem !important; + } + + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + + .ps-xxl-5 { + padding-left: 3rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-grid { + display: grid !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: flex !important; + } + + .d-print-inline-flex { + display: inline-flex !important; + } + + .d-print-none { + display: none !important; + } +} + +/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file diff --git a/pkgs/csslib/third_party/bootstrap/bootstrap.css b/pkgs/csslib/third_party/bootstrap/bootstrap.css new file mode 100644 index 000000000..f78e17718 --- /dev/null +++ b/pkgs/csslib/third_party/bootstrap/bootstrap.css @@ -0,0 +1,11222 @@ +@charset "UTF-8"; +/*! + * Bootstrap v5.1.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg-rgb: 255, 255, 255; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-bg: #fff; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +hr { + margin: 1rem 0; + color: inherit; + background-color: currentColor; + border: 0; + opacity: 0.25; +} + +hr:not([size]) { + height: 1px; +} + +h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1, .h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + h1, .h1 { + font-size: 2.5rem; + } +} + +h2, .h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + h2, .h2 { + font-size: 2rem; + } +} + +h3, .h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + h3, .h3 { + font-size: 1.75rem; + } +} + +h4, .h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + h4, .h4 { + font-size: 1.5rem; + } +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-bs-original-title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul { + padding-left: 2rem; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small, .small { + font-size: 0.875em; +} + +mark, .mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: #0d6efd; + text-decoration: underline; +} +a:hover { + color: #0a58ca; +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; + direction: ltr /* rtl:ignore */; + unicode-bidi: bidi-override; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +code { + font-size: 0.875em; + color: #d63384; + word-wrap: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 0.875em; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 1em; + font-weight: 700; +} + +figure { + margin: 0 0 1rem; +} + +img, +svg { + vertical-align: middle; +} + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: #6c757d; + text-align: left; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + +label { + display: inline-block; +} + +button { + border-radius: 0; +} + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +select { + text-transform: none; +} + +[role=button] { + cursor: pointer; +} + +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} + +[list]::-webkit-calendar-picker-indicator { + display: none; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} +button:not(:disabled), +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled) { + cursor: pointer; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: textfield; +} + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::file-selector-button { + font: inherit; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +iframe { + border: 0; +} + +summary { + display: list-item; + cursor: pointer; +} + +progress { + vertical-align: baseline; +} + +[hidden] { + display: none !important; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 0.875em; + color: #6c757d; +} + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + width: 100%; + padding-right: var(--bs-gutter-x, 0.75rem); + padding-left: var(--bs-gutter-x, 0.75rem); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1320px; + } +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(var(--bs-gutter-y) * -1); + margin-right: calc(var(--bs-gutter-x) * -.5); + margin-left: calc(var(--bs-gutter-x) * -.5); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * .5); + padding-left: calc(var(--bs-gutter-x) * .5); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.33333333%; + } + + .offset-sm-2 { + margin-left: 16.66666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.33333333%; + } + + .offset-sm-5 { + margin-left: 41.66666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.33333333%; + } + + .offset-sm-8 { + margin-left: 66.66666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.33333333%; + } + + .offset-sm-11 { + margin-left: 91.66666667%; + } + + .g-sm-0, +.gx-sm-0 { + --bs-gutter-x: 0; + } + + .g-sm-0, +.gy-sm-0 { + --bs-gutter-y: 0; + } + + .g-sm-1, +.gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + + .g-sm-1, +.gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + + .g-sm-2, +.gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + + .g-sm-2, +.gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + + .g-sm-3, +.gx-sm-3 { + --bs-gutter-x: 1rem; + } + + .g-sm-3, +.gy-sm-3 { + --bs-gutter-y: 1rem; + } + + .g-sm-4, +.gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + + .g-sm-4, +.gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + + .g-sm-5, +.gx-sm-5 { + --bs-gutter-x: 3rem; + } + + .g-sm-5, +.gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.33333333%; + } + + .offset-md-2 { + margin-left: 16.66666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.33333333%; + } + + .offset-md-5 { + margin-left: 41.66666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.33333333%; + } + + .offset-md-8 { + margin-left: 66.66666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.33333333%; + } + + .offset-md-11 { + margin-left: 91.66666667%; + } + + .g-md-0, +.gx-md-0 { + --bs-gutter-x: 0; + } + + .g-md-0, +.gy-md-0 { + --bs-gutter-y: 0; + } + + .g-md-1, +.gx-md-1 { + --bs-gutter-x: 0.25rem; + } + + .g-md-1, +.gy-md-1 { + --bs-gutter-y: 0.25rem; + } + + .g-md-2, +.gx-md-2 { + --bs-gutter-x: 0.5rem; + } + + .g-md-2, +.gy-md-2 { + --bs-gutter-y: 0.5rem; + } + + .g-md-3, +.gx-md-3 { + --bs-gutter-x: 1rem; + } + + .g-md-3, +.gy-md-3 { + --bs-gutter-y: 1rem; + } + + .g-md-4, +.gx-md-4 { + --bs-gutter-x: 1.5rem; + } + + .g-md-4, +.gy-md-4 { + --bs-gutter-y: 1.5rem; + } + + .g-md-5, +.gx-md-5 { + --bs-gutter-x: 3rem; + } + + .g-md-5, +.gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.33333333%; + } + + .offset-lg-2 { + margin-left: 16.66666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.33333333%; + } + + .offset-lg-5 { + margin-left: 41.66666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.33333333%; + } + + .offset-lg-8 { + margin-left: 66.66666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.33333333%; + } + + .offset-lg-11 { + margin-left: 91.66666667%; + } + + .g-lg-0, +.gx-lg-0 { + --bs-gutter-x: 0; + } + + .g-lg-0, +.gy-lg-0 { + --bs-gutter-y: 0; + } + + .g-lg-1, +.gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + + .g-lg-1, +.gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + + .g-lg-2, +.gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + + .g-lg-2, +.gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + + .g-lg-3, +.gx-lg-3 { + --bs-gutter-x: 1rem; + } + + .g-lg-3, +.gy-lg-3 { + --bs-gutter-y: 1rem; + } + + .g-lg-4, +.gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + + .g-lg-4, +.gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + + .g-lg-5, +.gx-lg-5 { + --bs-gutter-x: 3rem; + } + + .g-lg-5, +.gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.33333333%; + } + + .offset-xl-2 { + margin-left: 16.66666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.33333333%; + } + + .offset-xl-5 { + margin-left: 41.66666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.33333333%; + } + + .offset-xl-8 { + margin-left: 66.66666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.33333333%; + } + + .offset-xl-11 { + margin-left: 91.66666667%; + } + + .g-xl-0, +.gx-xl-0 { + --bs-gutter-x: 0; + } + + .g-xl-0, +.gy-xl-0 { + --bs-gutter-y: 0; + } + + .g-xl-1, +.gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + + .g-xl-1, +.gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + + .g-xl-2, +.gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + + .g-xl-2, +.gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + + .g-xl-3, +.gx-xl-3 { + --bs-gutter-x: 1rem; + } + + .g-xl-3, +.gy-xl-3 { + --bs-gutter-y: 1rem; + } + + .g-xl-4, +.gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + + .g-xl-4, +.gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + + .g-xl-5, +.gx-xl-5 { + --bs-gutter-x: 3rem; + } + + .g-xl-5, +.gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xxl-0 { + margin-left: 0; + } + + .offset-xxl-1 { + margin-left: 8.33333333%; + } + + .offset-xxl-2 { + margin-left: 16.66666667%; + } + + .offset-xxl-3 { + margin-left: 25%; + } + + .offset-xxl-4 { + margin-left: 33.33333333%; + } + + .offset-xxl-5 { + margin-left: 41.66666667%; + } + + .offset-xxl-6 { + margin-left: 50%; + } + + .offset-xxl-7 { + margin-left: 58.33333333%; + } + + .offset-xxl-8 { + margin-left: 66.66666667%; + } + + .offset-xxl-9 { + margin-left: 75%; + } + + .offset-xxl-10 { + margin-left: 83.33333333%; + } + + .offset-xxl-11 { + margin-left: 91.66666667%; + } + + .g-xxl-0, +.gx-xxl-0 { + --bs-gutter-x: 0; + } + + .g-xxl-0, +.gy-xxl-0 { + --bs-gutter-y: 0; + } + + .g-xxl-1, +.gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + + .g-xxl-1, +.gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + + .g-xxl-2, +.gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + + .g-xxl-2, +.gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + + .g-xxl-3, +.gx-xxl-3 { + --bs-gutter-x: 1rem; + } + + .g-xxl-3, +.gy-xxl-3 { + --bs-gutter-y: 1rem; + } + + .g-xxl-4, +.gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + + .g-xxl-4, +.gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + + .g-xxl-5, +.gx-xxl-5 { + --bs-gutter-x: 3rem; + } + + .g-xxl-5, +.gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-bg: transparent; + --bs-table-accent-bg: transparent; + --bs-table-striped-color: #212529; + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: #212529; + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: #212529; + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: #212529; + vertical-align: top; + border-color: #dee2e6; +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} +.table > :not(:last-child) > :last-child > * { + border-bottom-color: currentColor; +} + +.caption-top { + caption-side: top; +} + +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} + +.table-bordered > :not(caption) > * { + border-width: 1px 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 1px; +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} + +.table-striped > tbody > tr:nth-of-type(odd) { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color); +} + +.table-hover > tbody > tr:hover { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color); +} + +.table-primary { + --bs-table-bg: #cfe2ff; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: #000; + border-color: #bacbe6; +} + +.table-secondary { + --bs-table-bg: #e2e3e5; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: #000; + border-color: #cbccce; +} + +.table-success { + --bs-table-bg: #d1e7dd; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: #000; + border-color: #bcd0c7; +} + +.table-info { + --bs-table-bg: #cff4fc; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: #000; + border-color: #badce3; +} + +.table-warning { + --bs-table-bg: #fff3cd; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: #000; + border-color: #e6dbb9; +} + +.table-danger { + --bs-table-bg: #f8d7da; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: #000; + border-color: #dfc2c4; +} + +.table-light { + --bs-table-bg: #f8f9fa; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: #000; + border-color: #dfe0e1; +} + +.table-dark { + --bs-table-bg: #212529; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #373b3e; +} + +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; +} + +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: #6c757d; +} + +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type=file] { + overflow: hidden; +} +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: #212529; + background-color: #fff; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value { + height: 1.5em; +} +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #dde0e3; +} +.form-control::-webkit-file-upload-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: #dde0e3; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-sm::-webkit-file-upload-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +.form-control-lg::-webkit-file-upload-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} + +textarea.form-control { + min-height: calc(1.5em + 0.75rem + 2px); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); +} + +.form-control-color { + width: 3rem; + height: auto; + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + height: 1.5em; + border-radius: 0.25rem; +} +.form-control-color::-webkit-color-swatch { + height: 1.5em; + border-radius: 0.25rem; +} + +.form-select { + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + -moz-padding-start: calc(0.75rem - 3px); + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], .form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: #e9ecef; +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #212529; +} + +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-input { + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: 1px solid rgba(0, 0, 0, 0.25); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + color-adjust: exact; +} +.form-check-input[type=checkbox] { + border-radius: 0.25em; +} +.form-check-input[type=radio] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type=checkbox] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type=radio] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type=checkbox]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: #b6d4fe; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-select { + height: calc(3.5rem + 2px); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + height: 100%; + padding: 1rem 0.75rem; + pointer-events: none; + border: 1px solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus { + z-index: 3; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 3; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} + +.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: -1px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #198754; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(25, 135, 84, 0.9); + border-radius: 0.25rem; +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #198754; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:valid, .form-select.is-valid { + border-color: #198754; +} +.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, .form-select.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated .form-check-input:valid, .form-check-input.is-valid { + border-color: #198754; +} +.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { + background-color: #198754; +} +.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #198754; +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid, +.was-validated .input-group .form-select:valid, +.input-group .form-select.is-valid { + z-index: 1; +} +.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus, +.was-validated .input-group .form-select:valid:focus, +.input-group .form-select.is-valid:focus { + z-index: 3; +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:invalid, .form-select.is-invalid { + border-color: #dc3545; +} +.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-check-input:invalid, .form-check-input.is-invalid { + border-color: #dc3545; +} +.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { + background-color: #dc3545; +} +.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid, +.was-validated .input-group .form-select:invalid, +.input-group .form-select.is-invalid { + z-index: 2; +} +.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus, +.was-validated .input-group .form-select:invalid:focus, +.input-group .form-select.is-invalid:focus { + z-index: 3; +} + +.btn { + display: inline-block; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: #212529; +} +.btn-check:focus + .btn, .btn:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.btn:disabled, .btn.disabled, fieldset:disabled .btn { + pointer-events: none; + opacity: 0.65; +} + +.btn-primary { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-primary:hover { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; +} +.btn-check:focus + .btn-primary, .btn-primary:focus { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; + box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); +} +.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0a58ca; + border-color: #0a53be; +} +.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); +} +.btn-primary:disabled, .btn-primary.disabled { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-secondary:hover { + color: #fff; + background-color: #5c636a; + border-color: #565e64; +} +.btn-check:focus + .btn-secondary, .btn-secondary:focus { + color: #fff; + background-color: #5c636a; + border-color: #565e64; + box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); +} +.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #565e64; + border-color: #51585e; +} +.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); +} +.btn-secondary:disabled, .btn-secondary.disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-success { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-success:hover { + color: #fff; + background-color: #157347; + border-color: #146c43; +} +.btn-check:focus + .btn-success, .btn-success:focus { + color: #fff; + background-color: #157347; + border-color: #146c43; + box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); +} +.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #146c43; + border-color: #13653f; +} +.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); +} +.btn-success:disabled, .btn-success.disabled { + color: #fff; + background-color: #198754; + border-color: #198754; +} + +.btn-info { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-info:hover { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; +} +.btn-check:focus + .btn-info, .btn-info:focus { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; + box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); +} +.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle { + color: #000; + background-color: #3dd5f3; + border-color: #25cff2; +} +.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); +} +.btn-info:disabled, .btn-info.disabled { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} + +.btn-warning { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-warning:hover { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; +} +.btn-check:focus + .btn-warning, .btn-warning:focus { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; + box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); +} +.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle { + color: #000; + background-color: #ffcd39; + border-color: #ffc720; +} +.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); +} +.btn-warning:disabled, .btn-warning.disabled { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-danger:hover { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; +} +.btn-check:focus + .btn-danger, .btn-danger:focus { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; + box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); +} +.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #b02a37; + border-color: #a52834; +} +.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); +} +.btn-danger:disabled, .btn-danger.disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-light { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-light:hover { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:focus + .btn-light, .btn-light:focus { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); +} +.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); +} +.btn-light:disabled, .btn-light.disabled { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-dark { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-dark:hover { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; +} +.btn-check:focus + .btn-dark, .btn-dark:focus { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; + box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); +} +.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1a1e21; + border-color: #191c1f; +} +.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); +} +.btn-dark:disabled, .btn-dark.disabled { + color: #fff; + background-color: #212529; + border-color: #212529; +} + +.btn-outline-primary { + color: #0d6efd; + border-color: #0d6efd; +} +.btn-outline-primary:hover { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); +} +.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); +} +.btn-outline-primary:disabled, .btn-outline-primary.disabled { + color: #0d6efd; + background-color: transparent; +} + +.btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; +} +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus { + box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); +} +.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); +} +.btn-outline-secondary:disabled, .btn-outline-secondary.disabled { + color: #6c757d; + background-color: transparent; +} + +.btn-outline-success { + color: #198754; + border-color: #198754; +} +.btn-outline-success:hover { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-check:focus + .btn-outline-success, .btn-outline-success:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); +} +.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); +} +.btn-outline-success:disabled, .btn-outline-success.disabled { + color: #198754; + background-color: transparent; +} + +.btn-outline-info { + color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-outline-info:hover { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-check:focus + .btn-outline-info, .btn-outline-info:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); +} +.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); +} +.btn-outline-info:disabled, .btn-outline-info.disabled { + color: #0dcaf0; + background-color: transparent; +} + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107; +} +.btn-outline-warning:hover { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus { + box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); +} +.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); +} +.btn-outline-warning:disabled, .btn-outline-warning.disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545; +} +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); +} +.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); +} +.btn-outline-danger:disabled, .btn-outline-danger.disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-outline-light:hover { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:focus + .btn-outline-light, .btn-outline-light:focus { + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); +} +.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); +} +.btn-outline-light:disabled, .btn-outline-light.disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-dark { + color: #212529; + border-color: #212529; +} +.btn-outline-dark:hover { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus { + box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); +} +.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); +} +.btn-outline-dark:disabled, .btn-outline-dark.disabled { + color: #212529; + background-color: transparent; +} + +.btn-link { + font-weight: 400; + color: #0d6efd; + text-decoration: underline; +} +.btn-link:hover { + color: #0a58ca; +} +.btn-link:disabled, .btn-link.disabled { + color: #6c757d; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} + +.dropup, +.dropend, +.dropdown, +.dropstart { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + z-index: 1000; + display: none; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: 0.125rem; +} + +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} + +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid rgba(0, 0, 0, 0.15); +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:hover, .dropdown-item:focus { + color: #1e2125; + background-color: #e9ecef; +} +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #0d6efd; +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: #adb5bd; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1rem; + color: #212529; +} + +.dropdown-menu-dark { + color: #dee2e6; + background-color: #343a40; + border-color: rgba(0, 0, 0, 0.15); +} +.dropdown-menu-dark .dropdown-item { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus { + color: #fff; + background-color: rgba(255, 255, 255, 0.15); +} +.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active { + color: #fff; + background-color: #0d6efd; +} +.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled { + color: #adb5bd; +} +.dropdown-menu-dark .dropdown-divider { + border-color: rgba(0, 0, 0, 0.15); +} +.dropdown-menu-dark .dropdown-item-text { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-header { + color: #adb5bd; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:nth-child(n+3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn ~ .btn, +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; + color: #0d6efd; + text-decoration: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:hover, .nav-link:focus { + color: #0a58ca; +} +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6; +} +.nav-tabs .nav-link { + margin-bottom: -1px; + background: none; + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; + isolation: isolate; +} +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + background: none; + border: 0; + border-radius: 0.25rem; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #0d6efd; +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-sm, +.navbar > .container-md, +.navbar > .container-lg, +.navbar > .container-xl, +.navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; +} +.navbar-brand { + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + text-decoration: none; + white-space: nowrap; +} +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; +} + +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; + transition: box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 0.25rem; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-sm .offcanvas-top, +.navbar-expand-sm .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-md .offcanvas-top, +.navbar-expand-md .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-lg .offcanvas-top, +.navbar-expand-lg .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-xl .offcanvas-top, +.navbar-expand-xl .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-xxl .offcanvas-top, +.navbar-expand-xxl .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; +} +.navbar-expand .offcanvas-top, +.navbar-expand .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; +} +.navbar-expand .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.55); +} +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.55); + border-color: rgba(0, 0, 0, 0.1); +} +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.55); +} +.navbar-light .navbar-text a, +.navbar-light .navbar-text a:hover, +.navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.55); +} +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.55); + border-color: rgba(255, 255, 255, 0.1); +} +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.55); +} +.navbar-dark .navbar-text a, +.navbar-dark .navbar-text a:hover, +.navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: 1rem 1rem; +} + +.card-title { + margin-bottom: 0.5rem; +} + +.card-subtitle { + margin-top: -0.25rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link + .card-link { + margin-left: 1rem; +} + +.card-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-footer { + padding: 0.5rem 1rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.5rem; + margin-bottom: -0.5rem; + margin-left: -0.5rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.5rem; + margin-left: -0.5rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1rem; + border-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-group > .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, +.card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, +.card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, +.card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, +.card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: 1rem 1.25rem; + font-size: 1rem; + color: #212529; + text-align: left; + background-color: #fff; + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: #0c63e4; + background-color: #e7f1ff; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125); +} +.accordion-button:not(.collapsed)::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + transform: rotate(-180deg); +} +.accordion-button::after { + flex-shrink: 0; + width: 1.25rem; + height: 1.25rem; + margin-left: auto; + content: ""; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-size: 1.25rem; + transition: transform 0.2s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.accordion-item:first-of-type { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.accordion-body { + padding: 1rem 1.25rem; +} + +.accordion-flush .accordion-collapse { + border-width: 0; +} +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button { + border-radius: 0; +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0 0; + margin-bottom: 1rem; + list-style: none; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: 0.5rem; + color: #6c757d; + content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; +} +.breadcrumb-item.active { + color: #6c757d; +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link { + position: relative; + display: block; + color: #0d6efd; + text-decoration: none; + background-color: #fff; + border: 1px solid #dee2e6; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: #0a58ca; + background-color: #e9ecef; + border-color: #dee2e6; +} +.page-link:focus { + z-index: 3; + color: #0a58ca; + background-color: #e9ecef; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +.page-item:not(:first-child) .page-link { + margin-left: -1px; +} +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + background-color: #fff; + border-color: #dee2e6; +} + +.page-link { + padding: 0.375rem 0.75rem; +} + +.page-item:first-child .page-link { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.35em 0.65em; + font-size: 0.75em; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.alert { + position: relative; + padding: 1rem 1rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} + +.alert-primary { + color: #084298; + background-color: #cfe2ff; + border-color: #b6d4fe; +} +.alert-primary .alert-link { + color: #06357a; +} + +.alert-secondary { + color: #41464b; + background-color: #e2e3e5; + border-color: #d3d6d8; +} +.alert-secondary .alert-link { + color: #34383c; +} + +.alert-success { + color: #0f5132; + background-color: #d1e7dd; + border-color: #badbcc; +} +.alert-success .alert-link { + color: #0c4128; +} + +.alert-info { + color: #055160; + background-color: #cff4fc; + border-color: #b6effb; +} +.alert-info .alert-link { + color: #04414d; +} + +.alert-warning { + color: #664d03; + background-color: #fff3cd; + border-color: #ffecb5; +} +.alert-warning .alert-link { + color: #523e02; +} + +.alert-danger { + color: #842029; + background-color: #f8d7da; + border-color: #f5c2c7; +} +.alert-danger .alert-link { + color: #6a1a21; +} + +.alert-light { + color: #636464; + background-color: #fefefe; + border-color: #fdfdfe; +} +.alert-light .alert-link { + color: #4f5050; +} + +.alert-dark { + color: #141619; + background-color: #d3d3d4; + border-color: #bcbebf; +} +.alert-dark .alert-link { + color: #101214; +} + +@-webkit-keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #0d6efd; + transition: width 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: 1s linear infinite progress-bar-stripes; + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: 0.25rem; +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > li::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.5rem 1rem; + color: #212529; + text-decoration: none; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; +} + +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 1px; +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #084298; + background-color: #cfe2ff; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #084298; + background-color: #bacbe6; +} +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #084298; + border-color: #084298; +} + +.list-group-item-secondary { + color: #41464b; + background-color: #e2e3e5; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #41464b; + background-color: #cbccce; +} +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #41464b; + border-color: #41464b; +} + +.list-group-item-success { + color: #0f5132; + background-color: #d1e7dd; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #0f5132; + background-color: #bcd0c7; +} +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f5132; + border-color: #0f5132; +} + +.list-group-item-info { + color: #055160; + background-color: #cff4fc; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #055160; + background-color: #badce3; +} +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #055160; + border-color: #055160; +} + +.list-group-item-warning { + color: #664d03; + background-color: #fff3cd; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #664d03; + background-color: #e6dbb9; +} +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #664d03; + border-color: #664d03; +} + +.list-group-item-danger { + color: #842029; + background-color: #f8d7da; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #842029; + background-color: #dfc2c4; +} +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #842029; + border-color: #842029; +} + +.list-group-item-light { + color: #636464; + background-color: #fefefe; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #636464; + background-color: #e5e5e5; +} +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #636464; + border-color: #636464; +} + +.list-group-item-dark { + color: #141619; + background-color: #d3d3d4; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #141619; + background-color: #bebebf; +} +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #141619; + border-color: #141619; +} + +.btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: #000; + background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; + border: 0; + border-radius: 0.25rem; + opacity: 0.5; +} +.btn-close:hover { + color: #000; + text-decoration: none; + opacity: 0.75; +} +.btn-close:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + opacity: 1; +} +.btn-close:disabled, .btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: 0.25; +} + +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%); +} + +.toast { + width: 350px; + max-width: 100%; + font-size: 0.875rem; + pointer-events: auto; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} + +.toast-container { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast-header { + display: flex; + align-items: center; + padding: 0.5rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.toast-header .btn-close { + margin-right: -0.375rem; + margin-left: 0.75rem; +} + +.toast-body { + padding: 0.75rem; + word-wrap: break-word; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1055; + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable { + height: calc(100% - 1rem); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - 1rem); +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + width: 100vw; + height: 100vh; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.modal-header .btn-close { + padding: 0.5rem 0.5rem; + margin: -0.5rem -0.5rem -0.5rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: flex; + flex-wrap: wrap; + flex-shrink: 0; + align-items: center; + justify-content: flex-end; + padding: 0.75rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: calc(0.3rem - 1px); + border-bottom-left-radius: calc(0.3rem - 1px); +} +.modal-footer > * { + margin: 0.25rem; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + + .modal-dialog-scrollable { + height: calc(100% - 3.5rem); + } + + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + + .modal-sm { + max-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, +.modal-xl { + max-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-header { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} +.modal-fullscreen .modal-footer { + border-radius: 0; +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } +} +.tooltip { + position: absolute; + z-index: 1080; + display: block; + margin: 0; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .tooltip-arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] { + padding: 0.4rem 0; +} +.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { + bottom: 0; +} +.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { + top: -1px; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] { + padding: 0 0.4rem; +} +.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { + right: -1px; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] { + padding: 0.4rem 0; +} +.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { + top: 0; +} +.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] { + padding: 0 0.4rem; +} +.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { + left: -1px; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0 /* rtl:ignore */; + z-index: 1070; + display: block; + max-width: 276px; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .popover-arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; +} +.popover .popover-arrow::before, .popover .popover-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { + bottom: calc(-0.5rem - 1px); +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { + top: calc(-0.5rem - 1px); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f0f0f0; +} + +.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f0f0f0; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 1rem 1rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +/* rtl:begin:ignore */ +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + +/* rtl:end:ignore */ +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, +.carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +/* rtl:options: { + "autoRename": true, + "stringMap":[ { + "name" : "prev-next", + "search" : "prev", + "replace" : "next" + } ] +} */ +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; + list-style: none; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} + +.carousel-dark .carousel-control-prev-icon, +.carousel-dark .carousel-control-next-icon { + filter: invert(1) grayscale(100); +} +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} +.carousel-dark .carousel-caption { + color: #000; +} + +@-webkit-keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } +} +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: 0.75s linear infinite spinner-border; + animation: 0.75s linear infinite spinner-border; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@-webkit-keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: 0.75s linear infinite spinner-grow; + animation: 0.75s linear infinite spinner-grow; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, +.spinner-grow { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; + } +} +.offcanvas { + position: fixed; + bottom: 0; + z-index: 1045; + display: flex; + flex-direction: column; + max-width: 100%; + visibility: hidden; + background-color: #fff; + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} + +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem 1rem; +} +.offcanvas-header .btn-close { + padding: 0.5rem 0.5rem; + margin-top: -0.5rem; + margin-right: -0.5rem; + margin-bottom: -0.5rem; +} + +.offcanvas-title { + margin-bottom: 0; + line-height: 1.5; +} + +.offcanvas-body { + flex-grow: 1; + padding: 1rem 1rem; + overflow-y: auto; +} + +.offcanvas-start { + top: 0; + left: 0; + width: 400px; + border-right: 1px solid rgba(0, 0, 0, 0.2); + transform: translateX(-100%); +} + +.offcanvas-end { + top: 0; + right: 0; + width: 400px; + border-left: 1px solid rgba(0, 0, 0, 0.2); + transform: translateX(100%); +} + +.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + transform: translateY(-100%); +} + +.offcanvas-bottom { + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-top: 1px solid rgba(0, 0, 0, 0.2); + transform: translateY(100%); +} + +.offcanvas.show { + transform: none; +} + +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentColor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} + +.placeholder-xs { + min-height: 0.6em; +} + +.placeholder-sm { + min-height: 0.8em; +} + +.placeholder-lg { + min-height: 1.2em; +} + +.placeholder-glow .placeholder { + -webkit-animation: placeholder-glow 2s ease-in-out infinite; + animation: placeholder-glow 2s ease-in-out infinite; +} + +@-webkit-keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} + +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +.placeholder-wave { + -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + -webkit-animation: placeholder-wave 2s linear infinite; + animation: placeholder-wave 2s linear infinite; +} + +@-webkit-keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} + +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.link-primary { + color: #0d6efd; +} +.link-primary:hover, .link-primary:focus { + color: #0a58ca; +} + +.link-secondary { + color: #6c757d; +} +.link-secondary:hover, .link-secondary:focus { + color: #565e64; +} + +.link-success { + color: #198754; +} +.link-success:hover, .link-success:focus { + color: #146c43; +} + +.link-info { + color: #0dcaf0; +} +.link-info:hover, .link-info:focus { + color: #3dd5f3; +} + +.link-warning { + color: #ffc107; +} +.link-warning:hover, .link-warning:focus { + color: #ffcd39; +} + +.link-danger { + color: #dc3545; +} +.link-danger:hover, .link-danger:focus { + color: #b02a37; +} + +.link-light { + color: #f8f9fa; +} +.link-light:hover, .link-light:focus { + color: #f9fafb; +} + +.link-dark { + color: #212529; +} +.link-dark:hover, .link-dark:focus { + color: #1a1e21; +} + +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} + +.ratio-4x3 { + --bs-aspect-ratio: calc(3 / 4 * 100%); +} + +.ratio-16x9 { + --bs-aspect-ratio: calc(9 / 16 * 100%); +} + +.ratio-21x9 { + --bs-aspect-ratio: calc(9 / 21 * 100%); +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} + +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} + +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.vr { + display: inline-block; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentColor; + opacity: 0.25; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.float-start { + float: left !important; +} + +.float-end { + float: right !important; +} + +.float-none { + float: none !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-25 { + opacity: 0.25 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-75 { + opacity: 0.75 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.top-50 { + top: 50% !important; +} + +.top-100 { + top: 100% !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.bottom-50 { + bottom: 50% !important; +} + +.bottom-100 { + bottom: 100% !important; +} + +.start-0 { + left: 0 !important; +} + +.start-50 { + left: 50% !important; +} + +.start-100 { + left: 100% !important; +} + +.end-0 { + right: 0 !important; +} + +.end-50 { + right: 50% !important; +} + +.end-100 { + right: 100% !important; +} + +.translate-middle { + transform: translate(-50%, -50%) !important; +} + +.translate-middle-x { + transform: translateX(-50%) !important; +} + +.translate-middle-y { + transform: translateY(-50%) !important; +} + +.border { + border: 1px solid #dee2e6 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top { + border-top: 1px solid #dee2e6 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-end { + border-right: 1px solid #dee2e6 !important; +} + +.border-end-0 { + border-right: 0 !important; +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-start { + border-left: 1px solid #dee2e6 !important; +} + +.border-start-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #0d6efd !important; +} + +.border-secondary { + border-color: #6c757d !important; +} + +.border-success { + border-color: #198754 !important; +} + +.border-info { + border-color: #0dcaf0 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #212529 !important; +} + +.border-white { + border-color: #fff !important; +} + +.border-1 { + border-width: 1px !important; +} + +.border-2 { + border-width: 2px !important; +} + +.border-3 { + border-width: 3px !important; +} + +.border-4 { + border-width: 4px !important; +} + +.border-5 { + border-width: 5px !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.vw-100 { + width: 100vw !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} + +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} + +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} + +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} + +.fs-5 { + font-size: 1.25rem !important; +} + +.fs-6 { + font-size: 1rem !important; +} + +.fst-italic { + font-style: italic !important; +} + +.fst-normal { + font-style: normal !important; +} + +.fw-light { + font-weight: 300 !important; +} + +.fw-lighter { + font-weight: lighter !important; +} + +.fw-normal { + font-weight: 400 !important; +} + +.fw-bold { + font-weight: 700 !important; +} + +.fw-bolder { + font-weight: bolder !important; +} + +.lh-1 { + line-height: 1 !important; +} + +.lh-sm { + line-height: 1.25 !important; +} + +.lh-base { + line-height: 1.5 !important; +} + +.lh-lg { + line-height: 2 !important; +} + +.text-start { + text-align: left !important; +} + +.text-end { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +/* rtl:begin:remove */ +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +/* rtl:end:remove */ +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} + +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} + +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} + +.text-muted { + --bs-text-opacity: 1; + color: #6c757d !important; +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} + +.text-opacity-25 { + --bs-text-opacity: 0.25; +} + +.text-opacity-50 { + --bs-text-opacity: 0.5; +} + +.text-opacity-75 { + --bs-text-opacity: 0.75; +} + +.text-opacity-100 { + --bs-text-opacity: 1; +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} + +.bg-opacity-100 { + --bs-bg-opacity: 1; +} + +.bg-gradient { + background-image: var(--bs-gradient) !important; +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important; +} + +.pe-none { + pointer-events: none !important; +} + +.pe-auto { + pointer-events: auto !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-1 { + border-radius: 0.2rem !important; +} + +.rounded-2 { + border-radius: 0.25rem !important; +} + +.rounded-3 { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-end { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-start { + border-bottom-left-radius: 0.25rem !important; + border-top-left-radius: 0.25rem !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + + .float-sm-end { + float: right !important; + } + + .float-sm-none { + float: none !important; + } + + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-grid { + display: grid !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: flex !important; + } + + .d-sm-inline-flex { + display: inline-flex !important; + } + + .d-sm-none { + display: none !important; + } + + .flex-sm-fill { + flex: 1 1 auto !important; + } + + .flex-sm-row { + flex-direction: row !important; + } + + .flex-sm-column { + flex-direction: column !important; + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-sm-wrap { + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-sm-0 { + gap: 0 !important; + } + + .gap-sm-1 { + gap: 0.25rem !important; + } + + .gap-sm-2 { + gap: 0.5rem !important; + } + + .gap-sm-3 { + gap: 1rem !important; + } + + .gap-sm-4 { + gap: 1.5rem !important; + } + + .gap-sm-5 { + gap: 3rem !important; + } + + .justify-content-sm-start { + justify-content: flex-start !important; + } + + .justify-content-sm-end { + justify-content: flex-end !important; + } + + .justify-content-sm-center { + justify-content: center !important; + } + + .justify-content-sm-between { + justify-content: space-between !important; + } + + .justify-content-sm-around { + justify-content: space-around !important; + } + + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + + .align-items-sm-start { + align-items: flex-start !important; + } + + .align-items-sm-end { + align-items: flex-end !important; + } + + .align-items-sm-center { + align-items: center !important; + } + + .align-items-sm-baseline { + align-items: baseline !important; + } + + .align-items-sm-stretch { + align-items: stretch !important; + } + + .align-content-sm-start { + align-content: flex-start !important; + } + + .align-content-sm-end { + align-content: flex-end !important; + } + + .align-content-sm-center { + align-content: center !important; + } + + .align-content-sm-between { + align-content: space-between !important; + } + + .align-content-sm-around { + align-content: space-around !important; + } + + .align-content-sm-stretch { + align-content: stretch !important; + } + + .align-self-sm-auto { + align-self: auto !important; + } + + .align-self-sm-start { + align-self: flex-start !important; + } + + .align-self-sm-end { + align-self: flex-end !important; + } + + .align-self-sm-center { + align-self: center !important; + } + + .align-self-sm-baseline { + align-self: baseline !important; + } + + .align-self-sm-stretch { + align-self: stretch !important; + } + + .order-sm-first { + order: -1 !important; + } + + .order-sm-0 { + order: 0 !important; + } + + .order-sm-1 { + order: 1 !important; + } + + .order-sm-2 { + order: 2 !important; + } + + .order-sm-3 { + order: 3 !important; + } + + .order-sm-4 { + order: 4 !important; + } + + .order-sm-5 { + order: 5 !important; + } + + .order-sm-last { + order: 6 !important; + } + + .m-sm-0 { + margin: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-sm-0 { + margin-top: 0 !important; + } + + .mt-sm-1 { + margin-top: 0.25rem !important; + } + + .mt-sm-2 { + margin-top: 0.5rem !important; + } + + .mt-sm-3 { + margin-top: 1rem !important; + } + + .mt-sm-4 { + margin-top: 1.5rem !important; + } + + .mt-sm-5 { + margin-top: 3rem !important; + } + + .mt-sm-auto { + margin-top: auto !important; + } + + .me-sm-0 { + margin-right: 0 !important; + } + + .me-sm-1 { + margin-right: 0.25rem !important; + } + + .me-sm-2 { + margin-right: 0.5rem !important; + } + + .me-sm-3 { + margin-right: 1rem !important; + } + + .me-sm-4 { + margin-right: 1.5rem !important; + } + + .me-sm-5 { + margin-right: 3rem !important; + } + + .me-sm-auto { + margin-right: auto !important; + } + + .mb-sm-0 { + margin-bottom: 0 !important; + } + + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + + .mb-sm-3 { + margin-bottom: 1rem !important; + } + + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + + .mb-sm-5 { + margin-bottom: 3rem !important; + } + + .mb-sm-auto { + margin-bottom: auto !important; + } + + .ms-sm-0 { + margin-left: 0 !important; + } + + .ms-sm-1 { + margin-left: 0.25rem !important; + } + + .ms-sm-2 { + margin-left: 0.5rem !important; + } + + .ms-sm-3 { + margin-left: 1rem !important; + } + + .ms-sm-4 { + margin-left: 1.5rem !important; + } + + .ms-sm-5 { + margin-left: 3rem !important; + } + + .ms-sm-auto { + margin-left: auto !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-sm-0 { + padding-top: 0 !important; + } + + .pt-sm-1 { + padding-top: 0.25rem !important; + } + + .pt-sm-2 { + padding-top: 0.5rem !important; + } + + .pt-sm-3 { + padding-top: 1rem !important; + } + + .pt-sm-4 { + padding-top: 1.5rem !important; + } + + .pt-sm-5 { + padding-top: 3rem !important; + } + + .pe-sm-0 { + padding-right: 0 !important; + } + + .pe-sm-1 { + padding-right: 0.25rem !important; + } + + .pe-sm-2 { + padding-right: 0.5rem !important; + } + + .pe-sm-3 { + padding-right: 1rem !important; + } + + .pe-sm-4 { + padding-right: 1.5rem !important; + } + + .pe-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-0 { + padding-bottom: 0 !important; + } + + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pb-sm-3 { + padding-bottom: 1rem !important; + } + + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pb-sm-5 { + padding-bottom: 3rem !important; + } + + .ps-sm-0 { + padding-left: 0 !important; + } + + .ps-sm-1 { + padding-left: 0.25rem !important; + } + + .ps-sm-2 { + padding-left: 0.5rem !important; + } + + .ps-sm-3 { + padding-left: 1rem !important; + } + + .ps-sm-4 { + padding-left: 1.5rem !important; + } + + .ps-sm-5 { + padding-left: 3rem !important; + } + + .text-sm-start { + text-align: left !important; + } + + .text-sm-end { + text-align: right !important; + } + + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + + .float-md-end { + float: right !important; + } + + .float-md-none { + float: none !important; + } + + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-grid { + display: grid !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: flex !important; + } + + .d-md-inline-flex { + display: inline-flex !important; + } + + .d-md-none { + display: none !important; + } + + .flex-md-fill { + flex: 1 1 auto !important; + } + + .flex-md-row { + flex-direction: row !important; + } + + .flex-md-column { + flex-direction: column !important; + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-md-grow-0 { + flex-grow: 0 !important; + } + + .flex-md-grow-1 { + flex-grow: 1 !important; + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-md-wrap { + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-md-0 { + gap: 0 !important; + } + + .gap-md-1 { + gap: 0.25rem !important; + } + + .gap-md-2 { + gap: 0.5rem !important; + } + + .gap-md-3 { + gap: 1rem !important; + } + + .gap-md-4 { + gap: 1.5rem !important; + } + + .gap-md-5 { + gap: 3rem !important; + } + + .justify-content-md-start { + justify-content: flex-start !important; + } + + .justify-content-md-end { + justify-content: flex-end !important; + } + + .justify-content-md-center { + justify-content: center !important; + } + + .justify-content-md-between { + justify-content: space-between !important; + } + + .justify-content-md-around { + justify-content: space-around !important; + } + + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + + .align-items-md-start { + align-items: flex-start !important; + } + + .align-items-md-end { + align-items: flex-end !important; + } + + .align-items-md-center { + align-items: center !important; + } + + .align-items-md-baseline { + align-items: baseline !important; + } + + .align-items-md-stretch { + align-items: stretch !important; + } + + .align-content-md-start { + align-content: flex-start !important; + } + + .align-content-md-end { + align-content: flex-end !important; + } + + .align-content-md-center { + align-content: center !important; + } + + .align-content-md-between { + align-content: space-between !important; + } + + .align-content-md-around { + align-content: space-around !important; + } + + .align-content-md-stretch { + align-content: stretch !important; + } + + .align-self-md-auto { + align-self: auto !important; + } + + .align-self-md-start { + align-self: flex-start !important; + } + + .align-self-md-end { + align-self: flex-end !important; + } + + .align-self-md-center { + align-self: center !important; + } + + .align-self-md-baseline { + align-self: baseline !important; + } + + .align-self-md-stretch { + align-self: stretch !important; + } + + .order-md-first { + order: -1 !important; + } + + .order-md-0 { + order: 0 !important; + } + + .order-md-1 { + order: 1 !important; + } + + .order-md-2 { + order: 2 !important; + } + + .order-md-3 { + order: 3 !important; + } + + .order-md-4 { + order: 4 !important; + } + + .order-md-5 { + order: 5 !important; + } + + .order-md-last { + order: 6 !important; + } + + .m-md-0 { + margin: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-md-0 { + margin-top: 0 !important; + } + + .mt-md-1 { + margin-top: 0.25rem !important; + } + + .mt-md-2 { + margin-top: 0.5rem !important; + } + + .mt-md-3 { + margin-top: 1rem !important; + } + + .mt-md-4 { + margin-top: 1.5rem !important; + } + + .mt-md-5 { + margin-top: 3rem !important; + } + + .mt-md-auto { + margin-top: auto !important; + } + + .me-md-0 { + margin-right: 0 !important; + } + + .me-md-1 { + margin-right: 0.25rem !important; + } + + .me-md-2 { + margin-right: 0.5rem !important; + } + + .me-md-3 { + margin-right: 1rem !important; + } + + .me-md-4 { + margin-right: 1.5rem !important; + } + + .me-md-5 { + margin-right: 3rem !important; + } + + .me-md-auto { + margin-right: auto !important; + } + + .mb-md-0 { + margin-bottom: 0 !important; + } + + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + + .mb-md-3 { + margin-bottom: 1rem !important; + } + + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + + .mb-md-5 { + margin-bottom: 3rem !important; + } + + .mb-md-auto { + margin-bottom: auto !important; + } + + .ms-md-0 { + margin-left: 0 !important; + } + + .ms-md-1 { + margin-left: 0.25rem !important; + } + + .ms-md-2 { + margin-left: 0.5rem !important; + } + + .ms-md-3 { + margin-left: 1rem !important; + } + + .ms-md-4 { + margin-left: 1.5rem !important; + } + + .ms-md-5 { + margin-left: 3rem !important; + } + + .ms-md-auto { + margin-left: auto !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-md-0 { + padding-top: 0 !important; + } + + .pt-md-1 { + padding-top: 0.25rem !important; + } + + .pt-md-2 { + padding-top: 0.5rem !important; + } + + .pt-md-3 { + padding-top: 1rem !important; + } + + .pt-md-4 { + padding-top: 1.5rem !important; + } + + .pt-md-5 { + padding-top: 3rem !important; + } + + .pe-md-0 { + padding-right: 0 !important; + } + + .pe-md-1 { + padding-right: 0.25rem !important; + } + + .pe-md-2 { + padding-right: 0.5rem !important; + } + + .pe-md-3 { + padding-right: 1rem !important; + } + + .pe-md-4 { + padding-right: 1.5rem !important; + } + + .pe-md-5 { + padding-right: 3rem !important; + } + + .pb-md-0 { + padding-bottom: 0 !important; + } + + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + + .pb-md-3 { + padding-bottom: 1rem !important; + } + + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + + .pb-md-5 { + padding-bottom: 3rem !important; + } + + .ps-md-0 { + padding-left: 0 !important; + } + + .ps-md-1 { + padding-left: 0.25rem !important; + } + + .ps-md-2 { + padding-left: 0.5rem !important; + } + + .ps-md-3 { + padding-left: 1rem !important; + } + + .ps-md-4 { + padding-left: 1.5rem !important; + } + + .ps-md-5 { + padding-left: 3rem !important; + } + + .text-md-start { + text-align: left !important; + } + + .text-md-end { + text-align: right !important; + } + + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + + .float-lg-end { + float: right !important; + } + + .float-lg-none { + float: none !important; + } + + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-grid { + display: grid !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: flex !important; + } + + .d-lg-inline-flex { + display: inline-flex !important; + } + + .d-lg-none { + display: none !important; + } + + .flex-lg-fill { + flex: 1 1 auto !important; + } + + .flex-lg-row { + flex-direction: row !important; + } + + .flex-lg-column { + flex-direction: column !important; + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-lg-wrap { + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-lg-0 { + gap: 0 !important; + } + + .gap-lg-1 { + gap: 0.25rem !important; + } + + .gap-lg-2 { + gap: 0.5rem !important; + } + + .gap-lg-3 { + gap: 1rem !important; + } + + .gap-lg-4 { + gap: 1.5rem !important; + } + + .gap-lg-5 { + gap: 3rem !important; + } + + .justify-content-lg-start { + justify-content: flex-start !important; + } + + .justify-content-lg-end { + justify-content: flex-end !important; + } + + .justify-content-lg-center { + justify-content: center !important; + } + + .justify-content-lg-between { + justify-content: space-between !important; + } + + .justify-content-lg-around { + justify-content: space-around !important; + } + + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + + .align-items-lg-start { + align-items: flex-start !important; + } + + .align-items-lg-end { + align-items: flex-end !important; + } + + .align-items-lg-center { + align-items: center !important; + } + + .align-items-lg-baseline { + align-items: baseline !important; + } + + .align-items-lg-stretch { + align-items: stretch !important; + } + + .align-content-lg-start { + align-content: flex-start !important; + } + + .align-content-lg-end { + align-content: flex-end !important; + } + + .align-content-lg-center { + align-content: center !important; + } + + .align-content-lg-between { + align-content: space-between !important; + } + + .align-content-lg-around { + align-content: space-around !important; + } + + .align-content-lg-stretch { + align-content: stretch !important; + } + + .align-self-lg-auto { + align-self: auto !important; + } + + .align-self-lg-start { + align-self: flex-start !important; + } + + .align-self-lg-end { + align-self: flex-end !important; + } + + .align-self-lg-center { + align-self: center !important; + } + + .align-self-lg-baseline { + align-self: baseline !important; + } + + .align-self-lg-stretch { + align-self: stretch !important; + } + + .order-lg-first { + order: -1 !important; + } + + .order-lg-0 { + order: 0 !important; + } + + .order-lg-1 { + order: 1 !important; + } + + .order-lg-2 { + order: 2 !important; + } + + .order-lg-3 { + order: 3 !important; + } + + .order-lg-4 { + order: 4 !important; + } + + .order-lg-5 { + order: 5 !important; + } + + .order-lg-last { + order: 6 !important; + } + + .m-lg-0 { + margin: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-lg-0 { + margin-top: 0 !important; + } + + .mt-lg-1 { + margin-top: 0.25rem !important; + } + + .mt-lg-2 { + margin-top: 0.5rem !important; + } + + .mt-lg-3 { + margin-top: 1rem !important; + } + + .mt-lg-4 { + margin-top: 1.5rem !important; + } + + .mt-lg-5 { + margin-top: 3rem !important; + } + + .mt-lg-auto { + margin-top: auto !important; + } + + .me-lg-0 { + margin-right: 0 !important; + } + + .me-lg-1 { + margin-right: 0.25rem !important; + } + + .me-lg-2 { + margin-right: 0.5rem !important; + } + + .me-lg-3 { + margin-right: 1rem !important; + } + + .me-lg-4 { + margin-right: 1.5rem !important; + } + + .me-lg-5 { + margin-right: 3rem !important; + } + + .me-lg-auto { + margin-right: auto !important; + } + + .mb-lg-0 { + margin-bottom: 0 !important; + } + + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + + .mb-lg-3 { + margin-bottom: 1rem !important; + } + + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + + .mb-lg-5 { + margin-bottom: 3rem !important; + } + + .mb-lg-auto { + margin-bottom: auto !important; + } + + .ms-lg-0 { + margin-left: 0 !important; + } + + .ms-lg-1 { + margin-left: 0.25rem !important; + } + + .ms-lg-2 { + margin-left: 0.5rem !important; + } + + .ms-lg-3 { + margin-left: 1rem !important; + } + + .ms-lg-4 { + margin-left: 1.5rem !important; + } + + .ms-lg-5 { + margin-left: 3rem !important; + } + + .ms-lg-auto { + margin-left: auto !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-lg-0 { + padding-top: 0 !important; + } + + .pt-lg-1 { + padding-top: 0.25rem !important; + } + + .pt-lg-2 { + padding-top: 0.5rem !important; + } + + .pt-lg-3 { + padding-top: 1rem !important; + } + + .pt-lg-4 { + padding-top: 1.5rem !important; + } + + .pt-lg-5 { + padding-top: 3rem !important; + } + + .pe-lg-0 { + padding-right: 0 !important; + } + + .pe-lg-1 { + padding-right: 0.25rem !important; + } + + .pe-lg-2 { + padding-right: 0.5rem !important; + } + + .pe-lg-3 { + padding-right: 1rem !important; + } + + .pe-lg-4 { + padding-right: 1.5rem !important; + } + + .pe-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-0 { + padding-bottom: 0 !important; + } + + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pb-lg-3 { + padding-bottom: 1rem !important; + } + + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pb-lg-5 { + padding-bottom: 3rem !important; + } + + .ps-lg-0 { + padding-left: 0 !important; + } + + .ps-lg-1 { + padding-left: 0.25rem !important; + } + + .ps-lg-2 { + padding-left: 0.5rem !important; + } + + .ps-lg-3 { + padding-left: 1rem !important; + } + + .ps-lg-4 { + padding-left: 1.5rem !important; + } + + .ps-lg-5 { + padding-left: 3rem !important; + } + + .text-lg-start { + text-align: left !important; + } + + .text-lg-end { + text-align: right !important; + } + + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + + .float-xl-end { + float: right !important; + } + + .float-xl-none { + float: none !important; + } + + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-grid { + display: grid !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: flex !important; + } + + .d-xl-inline-flex { + display: inline-flex !important; + } + + .d-xl-none { + display: none !important; + } + + .flex-xl-fill { + flex: 1 1 auto !important; + } + + .flex-xl-row { + flex-direction: row !important; + } + + .flex-xl-column { + flex-direction: column !important; + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-xl-wrap { + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-xl-0 { + gap: 0 !important; + } + + .gap-xl-1 { + gap: 0.25rem !important; + } + + .gap-xl-2 { + gap: 0.5rem !important; + } + + .gap-xl-3 { + gap: 1rem !important; + } + + .gap-xl-4 { + gap: 1.5rem !important; + } + + .gap-xl-5 { + gap: 3rem !important; + } + + .justify-content-xl-start { + justify-content: flex-start !important; + } + + .justify-content-xl-end { + justify-content: flex-end !important; + } + + .justify-content-xl-center { + justify-content: center !important; + } + + .justify-content-xl-between { + justify-content: space-between !important; + } + + .justify-content-xl-around { + justify-content: space-around !important; + } + + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + + .align-items-xl-start { + align-items: flex-start !important; + } + + .align-items-xl-end { + align-items: flex-end !important; + } + + .align-items-xl-center { + align-items: center !important; + } + + .align-items-xl-baseline { + align-items: baseline !important; + } + + .align-items-xl-stretch { + align-items: stretch !important; + } + + .align-content-xl-start { + align-content: flex-start !important; + } + + .align-content-xl-end { + align-content: flex-end !important; + } + + .align-content-xl-center { + align-content: center !important; + } + + .align-content-xl-between { + align-content: space-between !important; + } + + .align-content-xl-around { + align-content: space-around !important; + } + + .align-content-xl-stretch { + align-content: stretch !important; + } + + .align-self-xl-auto { + align-self: auto !important; + } + + .align-self-xl-start { + align-self: flex-start !important; + } + + .align-self-xl-end { + align-self: flex-end !important; + } + + .align-self-xl-center { + align-self: center !important; + } + + .align-self-xl-baseline { + align-self: baseline !important; + } + + .align-self-xl-stretch { + align-self: stretch !important; + } + + .order-xl-first { + order: -1 !important; + } + + .order-xl-0 { + order: 0 !important; + } + + .order-xl-1 { + order: 1 !important; + } + + .order-xl-2 { + order: 2 !important; + } + + .order-xl-3 { + order: 3 !important; + } + + .order-xl-4 { + order: 4 !important; + } + + .order-xl-5 { + order: 5 !important; + } + + .order-xl-last { + order: 6 !important; + } + + .m-xl-0 { + margin: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-xl-0 { + margin-top: 0 !important; + } + + .mt-xl-1 { + margin-top: 0.25rem !important; + } + + .mt-xl-2 { + margin-top: 0.5rem !important; + } + + .mt-xl-3 { + margin-top: 1rem !important; + } + + .mt-xl-4 { + margin-top: 1.5rem !important; + } + + .mt-xl-5 { + margin-top: 3rem !important; + } + + .mt-xl-auto { + margin-top: auto !important; + } + + .me-xl-0 { + margin-right: 0 !important; + } + + .me-xl-1 { + margin-right: 0.25rem !important; + } + + .me-xl-2 { + margin-right: 0.5rem !important; + } + + .me-xl-3 { + margin-right: 1rem !important; + } + + .me-xl-4 { + margin-right: 1.5rem !important; + } + + .me-xl-5 { + margin-right: 3rem !important; + } + + .me-xl-auto { + margin-right: auto !important; + } + + .mb-xl-0 { + margin-bottom: 0 !important; + } + + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + + .mb-xl-3 { + margin-bottom: 1rem !important; + } + + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + + .mb-xl-5 { + margin-bottom: 3rem !important; + } + + .mb-xl-auto { + margin-bottom: auto !important; + } + + .ms-xl-0 { + margin-left: 0 !important; + } + + .ms-xl-1 { + margin-left: 0.25rem !important; + } + + .ms-xl-2 { + margin-left: 0.5rem !important; + } + + .ms-xl-3 { + margin-left: 1rem !important; + } + + .ms-xl-4 { + margin-left: 1.5rem !important; + } + + .ms-xl-5 { + margin-left: 3rem !important; + } + + .ms-xl-auto { + margin-left: auto !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-xl-0 { + padding-top: 0 !important; + } + + .pt-xl-1 { + padding-top: 0.25rem !important; + } + + .pt-xl-2 { + padding-top: 0.5rem !important; + } + + .pt-xl-3 { + padding-top: 1rem !important; + } + + .pt-xl-4 { + padding-top: 1.5rem !important; + } + + .pt-xl-5 { + padding-top: 3rem !important; + } + + .pe-xl-0 { + padding-right: 0 !important; + } + + .pe-xl-1 { + padding-right: 0.25rem !important; + } + + .pe-xl-2 { + padding-right: 0.5rem !important; + } + + .pe-xl-3 { + padding-right: 1rem !important; + } + + .pe-xl-4 { + padding-right: 1.5rem !important; + } + + .pe-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-0 { + padding-bottom: 0 !important; + } + + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pb-xl-3 { + padding-bottom: 1rem !important; + } + + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pb-xl-5 { + padding-bottom: 3rem !important; + } + + .ps-xl-0 { + padding-left: 0 !important; + } + + .ps-xl-1 { + padding-left: 0.25rem !important; + } + + .ps-xl-2 { + padding-left: 0.5rem !important; + } + + .ps-xl-3 { + padding-left: 1rem !important; + } + + .ps-xl-4 { + padding-left: 1.5rem !important; + } + + .ps-xl-5 { + padding-left: 3rem !important; + } + + .text-xl-start { + text-align: left !important; + } + + .text-xl-end { + text-align: right !important; + } + + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + + .float-xxl-end { + float: right !important; + } + + .float-xxl-none { + float: none !important; + } + + .d-xxl-inline { + display: inline !important; + } + + .d-xxl-inline-block { + display: inline-block !important; + } + + .d-xxl-block { + display: block !important; + } + + .d-xxl-grid { + display: grid !important; + } + + .d-xxl-table { + display: table !important; + } + + .d-xxl-table-row { + display: table-row !important; + } + + .d-xxl-table-cell { + display: table-cell !important; + } + + .d-xxl-flex { + display: flex !important; + } + + .d-xxl-inline-flex { + display: inline-flex !important; + } + + .d-xxl-none { + display: none !important; + } + + .flex-xxl-fill { + flex: 1 1 auto !important; + } + + .flex-xxl-row { + flex-direction: row !important; + } + + .flex-xxl-column { + flex-direction: column !important; + } + + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-xxl-0 { + gap: 0 !important; + } + + .gap-xxl-1 { + gap: 0.25rem !important; + } + + .gap-xxl-2 { + gap: 0.5rem !important; + } + + .gap-xxl-3 { + gap: 1rem !important; + } + + .gap-xxl-4 { + gap: 1.5rem !important; + } + + .gap-xxl-5 { + gap: 3rem !important; + } + + .justify-content-xxl-start { + justify-content: flex-start !important; + } + + .justify-content-xxl-end { + justify-content: flex-end !important; + } + + .justify-content-xxl-center { + justify-content: center !important; + } + + .justify-content-xxl-between { + justify-content: space-between !important; + } + + .justify-content-xxl-around { + justify-content: space-around !important; + } + + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + + .align-items-xxl-start { + align-items: flex-start !important; + } + + .align-items-xxl-end { + align-items: flex-end !important; + } + + .align-items-xxl-center { + align-items: center !important; + } + + .align-items-xxl-baseline { + align-items: baseline !important; + } + + .align-items-xxl-stretch { + align-items: stretch !important; + } + + .align-content-xxl-start { + align-content: flex-start !important; + } + + .align-content-xxl-end { + align-content: flex-end !important; + } + + .align-content-xxl-center { + align-content: center !important; + } + + .align-content-xxl-between { + align-content: space-between !important; + } + + .align-content-xxl-around { + align-content: space-around !important; + } + + .align-content-xxl-stretch { + align-content: stretch !important; + } + + .align-self-xxl-auto { + align-self: auto !important; + } + + .align-self-xxl-start { + align-self: flex-start !important; + } + + .align-self-xxl-end { + align-self: flex-end !important; + } + + .align-self-xxl-center { + align-self: center !important; + } + + .align-self-xxl-baseline { + align-self: baseline !important; + } + + .align-self-xxl-stretch { + align-self: stretch !important; + } + + .order-xxl-first { + order: -1 !important; + } + + .order-xxl-0 { + order: 0 !important; + } + + .order-xxl-1 { + order: 1 !important; + } + + .order-xxl-2 { + order: 2 !important; + } + + .order-xxl-3 { + order: 3 !important; + } + + .order-xxl-4 { + order: 4 !important; + } + + .order-xxl-5 { + order: 5 !important; + } + + .order-xxl-last { + order: 6 !important; + } + + .m-xxl-0 { + margin: 0 !important; + } + + .m-xxl-1 { + margin: 0.25rem !important; + } + + .m-xxl-2 { + margin: 0.5rem !important; + } + + .m-xxl-3 { + margin: 1rem !important; + } + + .m-xxl-4 { + margin: 1.5rem !important; + } + + .m-xxl-5 { + margin: 3rem !important; + } + + .m-xxl-auto { + margin: auto !important; + } + + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-xxl-0 { + margin-top: 0 !important; + } + + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + + .mt-xxl-3 { + margin-top: 1rem !important; + } + + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + + .mt-xxl-5 { + margin-top: 3rem !important; + } + + .mt-xxl-auto { + margin-top: auto !important; + } + + .me-xxl-0 { + margin-right: 0 !important; + } + + .me-xxl-1 { + margin-right: 0.25rem !important; + } + + .me-xxl-2 { + margin-right: 0.5rem !important; + } + + .me-xxl-3 { + margin-right: 1rem !important; + } + + .me-xxl-4 { + margin-right: 1.5rem !important; + } + + .me-xxl-5 { + margin-right: 3rem !important; + } + + .me-xxl-auto { + margin-right: auto !important; + } + + .mb-xxl-0 { + margin-bottom: 0 !important; + } + + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + + .mb-xxl-auto { + margin-bottom: auto !important; + } + + .ms-xxl-0 { + margin-left: 0 !important; + } + + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + + .ms-xxl-3 { + margin-left: 1rem !important; + } + + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + + .ms-xxl-5 { + margin-left: 3rem !important; + } + + .ms-xxl-auto { + margin-left: auto !important; + } + + .p-xxl-0 { + padding: 0 !important; + } + + .p-xxl-1 { + padding: 0.25rem !important; + } + + .p-xxl-2 { + padding: 0.5rem !important; + } + + .p-xxl-3 { + padding: 1rem !important; + } + + .p-xxl-4 { + padding: 1.5rem !important; + } + + .p-xxl-5 { + padding: 3rem !important; + } + + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-xxl-0 { + padding-top: 0 !important; + } + + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + + .pt-xxl-3 { + padding-top: 1rem !important; + } + + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + + .pt-xxl-5 { + padding-top: 3rem !important; + } + + .pe-xxl-0 { + padding-right: 0 !important; + } + + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + + .pe-xxl-3 { + padding-right: 1rem !important; + } + + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + + .pe-xxl-5 { + padding-right: 3rem !important; + } + + .pb-xxl-0 { + padding-bottom: 0 !important; + } + + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + + .ps-xxl-0 { + padding-left: 0 !important; + } + + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + + .ps-xxl-3 { + padding-left: 1rem !important; + } + + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + + .ps-xxl-5 { + padding-left: 3rem !important; + } + + .text-xxl-start { + text-align: left !important; + } + + .text-xxl-end { + text-align: right !important; + } + + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + + .fs-2 { + font-size: 2rem !important; + } + + .fs-3 { + font-size: 1.75rem !important; + } + + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-grid { + display: grid !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: flex !important; + } + + .d-print-inline-flex { + display: inline-flex !important; + } + + .d-print-none { + display: none !important; + } +} + +/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/pkgs/csslib/third_party/foundation/LICENSE b/pkgs/csslib/third_party/foundation/LICENSE new file mode 100644 index 000000000..cfa9e0582 --- /dev/null +++ b/pkgs/csslib/third_party/foundation/LICENSE @@ -0,0 +1,22 @@ +Copyright © 2011-2020 ZURB, Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/pkgs/csslib/third_party/foundation/README.md b/pkgs/csslib/third_party/foundation/README.md new file mode 100644 index 000000000..a79a2a8ac --- /dev/null +++ b/pkgs/csslib/third_party/foundation/README.md @@ -0,0 +1,4 @@ +This folder contains sample css files from the open-source project +https://github.com/foundation/foundation-sites. + +This code was included under the terms in the `LICENSE` file. \ No newline at end of file diff --git a/pkgs/csslib/third_party/foundation/foundation.css b/pkgs/csslib/third_party/foundation/foundation.css new file mode 100644 index 000000000..eb68cfdce --- /dev/null +++ b/pkgs/csslib/third_party/foundation/foundation.css @@ -0,0 +1,5616 @@ +@charset "UTF-8"; +/** + * Foundation for Sites + * Version 6.7.2 + * https://get.foundation + * Licensed under MIT Open Source + */ +@media print, screen and (min-width: 40em) { + .reveal, .reveal.tiny, .reveal.small, .reveal.large { + right: auto; + left: auto; + margin: 0 auto; } } + +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ +html { + line-height: 1.15; + -webkit-text-size-adjust: 100%; } + +body { + margin: 0; } + +h1 { + font-size: 2em; + margin: 0.67em 0; } + +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible; } + +pre { + font-family: monospace, monospace; + font-size: 1em; } + +a { + background-color: transparent; } + +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; } + +b, +strong { + font-weight: bolder; } + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; } + +small { + font-size: 80%; } + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sub { + bottom: -0.25em; } + +sup { + top: -0.5em; } + +img { + border-style: none; } + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; } + +button, +input { + overflow: visible; } + +button, +select { + text-transform: none; } + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; } + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; } + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; } + +fieldset { + padding: 0.35em 0.75em 0.625em; } + +legend { + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; } + +progress { + vertical-align: baseline; } + +textarea { + overflow: auto; } + +[type="checkbox"], +[type="radio"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0; } + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; } + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; } + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; } + +details { + display: block; } + +summary { + display: list-item; } + +template { + display: none; } + +[hidden] { + display: none; } + +.foundation-mq { + font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; } + +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; + font-size: 100%; } + +*, +*::before, +*::after { + -webkit-box-sizing: inherit; + box-sizing: inherit; } + +body { + margin: 0; + padding: 0; + background: #fefefe; + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-weight: normal; + line-height: 1.5; + color: #0a0a0a; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +img { + display: inline-block; + vertical-align: middle; + max-width: 100%; + height: auto; + -ms-interpolation-mode: bicubic; } + +textarea { + height: auto; + min-height: 50px; + border-radius: 0; } + +select { + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + border-radius: 0; } + +.map_canvas img, +.map_canvas embed, +.map_canvas object, +.mqa-display img, +.mqa-display embed, +.mqa-display object { + max-width: none !important; } + +button { + padding: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 0; + border-radius: 0; + background: transparent; + line-height: 1; + cursor: auto; } + [data-whatinput='mouse'] button { + outline: 0; } + +pre { + overflow: auto; } + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; } + +.is-visible { + display: block !important; } + +.is-hidden { + display: none !important; } + +[type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'], +textarea { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 2.4375rem; + margin: 0 0 1rem; + padding: 0.5rem; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + -webkit-box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + font-family: inherit; + font-size: 1rem; + font-weight: normal; + line-height: 1.5; + color: #0a0a0a; + -webkit-transition: border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; + transition: border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } + [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus, + textarea:focus { + outline: none; + border: 1px solid #8a8a8a; + background-color: #fefefe; + -webkit-box-shadow: 0 0 5px #cacaca; + box-shadow: 0 0 5px #cacaca; + -webkit-transition: border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; + transition: border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; } + +textarea { + max-width: 100%; } + textarea[rows] { + height: auto; } + +input:disabled, input[readonly], +textarea:disabled, +textarea[readonly] { + background-color: #e6e6e6; + cursor: not-allowed; } + +[type='submit'], +[type='button'] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0; } + +input[type='search'] { + -webkit-box-sizing: border-box; + box-sizing: border-box; } + +::-webkit-input-placeholder { + color: #cacaca; } + +::-moz-placeholder { + color: #cacaca; } + +:-ms-input-placeholder { + color: #cacaca; } + +::-ms-input-placeholder { + color: #cacaca; } + +::placeholder { + color: #cacaca; } + +[type='file'], +[type='checkbox'], +[type='radio'] { + margin: 0 0 1rem; } + +[type='checkbox'] + label, +[type='radio'] + label { + display: inline-block; + vertical-align: baseline; + margin-left: 0.5rem; + margin-right: 1rem; + margin-bottom: 0; } + [type='checkbox'] + label[for], + [type='radio'] + label[for] { + cursor: pointer; } + +label > [type='checkbox'], +label > [type='radio'] { + margin-right: 0.5rem; } + +[type='file'] { + width: 100%; } + +label { + display: block; + margin: 0; + font-size: 0.875rem; + font-weight: normal; + line-height: 1.8; + color: #0a0a0a; } + label.middle { + margin: 0 0 1rem; + line-height: 1.5; + padding: 0.5625rem 0; } + +.help-text { + margin-top: -0.5rem; + font-size: 0.8125rem; + font-style: italic; + color: #0a0a0a; } + +.input-group { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: 100%; + margin-bottom: 1rem; + -webkit-box-align: stretch; + -webkit-align-items: stretch; + -ms-flex-align: stretch; + align-items: stretch; } + .input-group > :first-child, .input-group > :first-child.input-group-button > * { + border-radius: 0 0 0 0; } + .input-group > :last-child, .input-group > :last-child.input-group-button > * { + border-radius: 0 0 0 0; } + +.input-group-label, .input-group-field, .input-group-button, .input-group-button a, +.input-group-button input, +.input-group-button button, +.input-group-button label { + margin: 0; + white-space: nowrap; } + +.input-group-label { + padding: 0 1rem; + border: 1px solid #cacaca; + background: #e6e6e6; + color: #0a0a0a; + text-align: center; + white-space: nowrap; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; } + .input-group-label:first-child { + border-right: 0; } + .input-group-label:last-child { + border-left: 0; } + +.input-group-field { + border-radius: 0; + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; + min-width: 0; } + +.input-group-button { + padding-top: 0; + padding-bottom: 0; + text-align: center; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .input-group-button a, + .input-group-button input, + .input-group-button button, + .input-group-button label { + -webkit-align-self: stretch; + -ms-flex-item-align: stretch; + align-self: stretch; + height: auto; + padding-top: 0; + padding-bottom: 0; + font-size: 1rem; } + +fieldset { + margin: 0; + padding: 0; + border: 0; } + +legend { + max-width: 100%; + margin-bottom: 0.5rem; } + +.fieldset { + margin: 1.125rem 0; + padding: 1.25rem; + border: 1px solid #cacaca; } + .fieldset legend { + margin: 0; + margin-left: -0.1875rem; + padding: 0 0.1875rem; } + +select { + height: 2.4375rem; + margin: 0 0 1rem; + padding: 0.5rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + font-family: inherit; + font-size: 1rem; + font-weight: normal; + line-height: 1.5; + color: #0a0a0a; + background-image: url("data:image/svg+xml;utf8,"); + background-origin: content-box; + background-position: right -1rem center; + background-repeat: no-repeat; + background-size: 9px 6px; + padding-right: 1.5rem; + -webkit-transition: border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; + transition: border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; } + @media screen and (min-width: 0\0) { + select { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); } } + select:focus { + outline: none; + border: 1px solid #8a8a8a; + background-color: #fefefe; + -webkit-box-shadow: 0 0 5px #cacaca; + box-shadow: 0 0 5px #cacaca; + -webkit-transition: border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; + transition: border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out; + transition: box-shadow 0.5s, border-color 0.25s ease-in-out, -webkit-box-shadow 0.5s; } + select:disabled { + background-color: #e6e6e6; + cursor: not-allowed; } + select::-ms-expand { + display: none; } + select[multiple] { + height: auto; + background-image: none; } + select:not([multiple]) { + padding-top: 0; + padding-bottom: 0; } + +.is-invalid-input:not(:focus) { + border-color: #cc4b37; + background-color: #f9ecea; } + .is-invalid-input:not(:focus)::-webkit-input-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus)::-moz-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus):-ms-input-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus)::-ms-input-placeholder { + color: #cc4b37; } + .is-invalid-input:not(:focus)::placeholder { + color: #cc4b37; } + +.is-invalid-label { + color: #cc4b37; } + +.form-error { + display: none; + margin-top: -0.5rem; + margin-bottom: 1rem; + font-size: 0.75rem; + font-weight: bold; + color: #cc4b37; } + .form-error.is-visible { + display: block; } + +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +form, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; } + +p { + margin-bottom: 1rem; + font-size: inherit; + line-height: 1.6; + text-rendering: optimizeLegibility; } + +em, +i { + font-style: italic; + line-height: inherit; } + +strong, +b { + font-weight: bold; + line-height: inherit; } + +small { + font-size: 80%; + line-height: inherit; } + +h1, .h1, +h2, .h2, +h3, .h3, +h4, .h4, +h5, .h5, +h6, .h6 { + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-style: normal; + font-weight: normal; + color: inherit; + text-rendering: optimizeLegibility; } + h1 small, .h1 small, + h2 small, .h2 small, + h3 small, .h3 small, + h4 small, .h4 small, + h5 small, .h5 small, + h6 small, .h6 small { + line-height: 0; + color: #cacaca; } + +h1, .h1 { + font-size: 1.5rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h2, .h2 { + font-size: 1.25rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h3, .h3 { + font-size: 1.1875rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h4, .h4 { + font-size: 1.125rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h5, .h5 { + font-size: 1.0625rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +h6, .h6 { + font-size: 1rem; + line-height: 1.4; + margin-top: 0; + margin-bottom: 0.5rem; } + +@media print, screen and (min-width: 40em) { + h1, .h1 { + font-size: 3rem; } + h2, .h2 { + font-size: 2.5rem; } + h3, .h3 { + font-size: 1.9375rem; } + h4, .h4 { + font-size: 1.5625rem; } + h5, .h5 { + font-size: 1.25rem; } + h6, .h6 { + font-size: 1rem; } } + +a { + line-height: inherit; + color: #1779ba; + text-decoration: none; + cursor: pointer; } + a:hover, a:focus { + color: #1468a0; } + a img { + border: 0; } + +hr { + clear: both; + max-width: 75rem; + height: 0; + margin: 1.25rem auto; + border-top: 0; + border-right: 0; + border-bottom: 1px solid #cacaca; + border-left: 0; } + +ul, +ol, +dl { + margin-bottom: 1rem; + list-style-position: outside; + line-height: 1.6; } + +li { + font-size: inherit; } + +ul { + margin-left: 1.25rem; + list-style-type: disc; } + +ol { + margin-left: 1.25rem; } + +ul ul, ol ul, ul ol, ol ol { + margin-left: 1.25rem; + margin-bottom: 0; } + +dl { + margin-bottom: 1rem; } + dl dt { + margin-bottom: 0.3rem; + font-weight: bold; } + +blockquote { + margin: 0 0 1rem; + padding: 0.5625rem 1.25rem 0 1.1875rem; + border-left: 1px solid #cacaca; } + blockquote, blockquote p { + line-height: 1.6; + color: #8a8a8a; } + +abbr, abbr[title] { + border-bottom: 1px dotted #0a0a0a; + cursor: help; + text-decoration: none; } + +figure { + margin: 0; } + +kbd { + margin: 0; + padding: 0.125rem 0.25rem 0; + background-color: #e6e6e6; + font-family: Consolas, "Liberation Mono", Courier, monospace; + color: #0a0a0a; } + +.subheader { + margin-top: 0.2rem; + margin-bottom: 0.5rem; + font-weight: normal; + line-height: 1.4; + color: #8a8a8a; } + +.lead { + font-size: 125%; + line-height: 1.6; } + +.stat { + font-size: 2.5rem; + line-height: 1; } + p + .stat { + margin-top: -1rem; } + +ul.no-bullet, ol.no-bullet { + margin-left: 0; + list-style: none; } + +.cite-block, cite { + display: block; + color: #8a8a8a; + font-size: 0.8125rem; } + .cite-block:before, cite:before { + content: "— "; } + +.code-inline, code { + border: 1px solid #cacaca; + background-color: #e6e6e6; + font-family: Consolas, "Liberation Mono", Courier, monospace; + font-weight: normal; + color: #0a0a0a; + display: inline; + max-width: 100%; + word-wrap: break-word; + padding: 0.125rem 0.3125rem 0.0625rem; } + +.code-block { + border: 1px solid #cacaca; + background-color: #e6e6e6; + font-family: Consolas, "Liberation Mono", Courier, monospace; + font-weight: normal; + color: #0a0a0a; + display: block; + overflow: auto; + white-space: pre; + padding: 1rem; + margin-bottom: 1.5rem; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +@media print, screen and (min-width: 40em) { + .medium-text-left { + text-align: left; } + .medium-text-right { + text-align: right; } + .medium-text-center { + text-align: center; } + .medium-text-justify { + text-align: justify; } } + +@media print, screen and (min-width: 64em) { + .large-text-left { + text-align: left; } + .large-text-right { + text-align: right; } + .large-text-center { + text-align: center; } + .large-text-justify { + text-align: justify; } } + +.show-for-print { + display: none !important; } + +@media print { + * { + background: transparent !important; + color: black !important; + -webkit-print-color-adjust: economy; + color-adjust: economy; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important; } + .show-for-print { + display: block !important; } + .hide-for-print { + display: none !important; } + table.show-for-print { + display: table !important; } + thead.show-for-print { + display: table-header-group !important; } + tbody.show-for-print { + display: table-row-group !important; } + tr.show-for-print { + display: table-row !important; } + td.show-for-print { + display: table-cell !important; } + th.show-for-print { + display: table-cell !important; } + a, + a:visited { + text-decoration: underline; } + a[href]:after { + content: " (" attr(href) ")"; } + .ir a:after, + a[href^='javascript:']:after, + a[href^='#']:after { + content: ''; } + abbr[title]:after { + content: " (" attr(title) ")"; } + pre, + blockquote { + border: 1px solid #8a8a8a; + page-break-inside: avoid; } + thead { + display: table-header-group; } + tr, + img { + page-break-inside: avoid; } + img { + max-width: 100% !important; } + @page { + margin: 0.5cm; } + p, + h2, + h3 { + orphans: 3; + widows: 3; } + h2, + h3 { + page-break-after: avoid; } + .print-break-inside { + page-break-inside: auto; } } + +.grid-container { + padding-right: 0.625rem; + padding-left: 0.625rem; + max-width: 75rem; + margin-left: auto; + margin-right: auto; } + @media print, screen and (min-width: 40em) { + .grid-container { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } } + .grid-container.fluid { + padding-right: 0.625rem; + padding-left: 0.625rem; + max-width: 100%; + margin-left: auto; + margin-right: auto; } + @media print, screen and (min-width: 40em) { + .grid-container.fluid { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } } + .grid-container.full { + padding-right: 0; + padding-left: 0; + max-width: 100%; + margin-left: auto; + margin-right: auto; } + +.grid-x { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; } + +.cell { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + min-height: 0px; + min-width: 0px; + width: 100%; } + .cell.auto { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } + .cell.shrink { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.grid-x > .auto { + width: auto; } + +.grid-x > .shrink { + width: auto; } + +.grid-x > .small-shrink, .grid-x > .small-full, .grid-x > .small-1, .grid-x > .small-2, .grid-x > .small-3, .grid-x > .small-4, .grid-x > .small-5, .grid-x > .small-6, .grid-x > .small-7, .grid-x > .small-8, .grid-x > .small-9, .grid-x > .small-10, .grid-x > .small-11, .grid-x > .small-12 { + -webkit-flex-basis: auto; + -ms-flex-preferred-size: auto; + flex-basis: auto; } + +@media print, screen and (min-width: 40em) { + .grid-x > .medium-shrink, .grid-x > .medium-full, .grid-x > .medium-1, .grid-x > .medium-2, .grid-x > .medium-3, .grid-x > .medium-4, .grid-x > .medium-5, .grid-x > .medium-6, .grid-x > .medium-7, .grid-x > .medium-8, .grid-x > .medium-9, .grid-x > .medium-10, .grid-x > .medium-11, .grid-x > .medium-12 { + -webkit-flex-basis: auto; + -ms-flex-preferred-size: auto; + flex-basis: auto; } } + +@media print, screen and (min-width: 64em) { + .grid-x > .large-shrink, .grid-x > .large-full, .grid-x > .large-1, .grid-x > .large-2, .grid-x > .large-3, .grid-x > .large-4, .grid-x > .large-5, .grid-x > .large-6, .grid-x > .large-7, .grid-x > .large-8, .grid-x > .large-9, .grid-x > .large-10, .grid-x > .large-11, .grid-x > .large-12 { + -webkit-flex-basis: auto; + -ms-flex-preferred-size: auto; + flex-basis: auto; } } + +.grid-x > .small-1, .grid-x > .small-2, .grid-x > .small-3, .grid-x > .small-4, .grid-x > .small-5, .grid-x > .small-6, .grid-x > .small-7, .grid-x > .small-8, .grid-x > .small-9, .grid-x > .small-10, .grid-x > .small-11, .grid-x > .small-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.grid-x > .small-1 { + width: 8.33333%; } + +.grid-x > .small-2 { + width: 16.66667%; } + +.grid-x > .small-3 { + width: 25%; } + +.grid-x > .small-4 { + width: 33.33333%; } + +.grid-x > .small-5 { + width: 41.66667%; } + +.grid-x > .small-6 { + width: 50%; } + +.grid-x > .small-7 { + width: 58.33333%; } + +.grid-x > .small-8 { + width: 66.66667%; } + +.grid-x > .small-9 { + width: 75%; } + +.grid-x > .small-10 { + width: 83.33333%; } + +.grid-x > .small-11 { + width: 91.66667%; } + +.grid-x > .small-12 { + width: 100%; } + +@media print, screen and (min-width: 40em) { + .grid-x > .medium-auto { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; + width: auto; } + .grid-x > .medium-shrink, .grid-x > .medium-1, .grid-x > .medium-2, .grid-x > .medium-3, .grid-x > .medium-4, .grid-x > .medium-5, .grid-x > .medium-6, .grid-x > .medium-7, .grid-x > .medium-8, .grid-x > .medium-9, .grid-x > .medium-10, .grid-x > .medium-11, .grid-x > .medium-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .grid-x > .medium-shrink { + width: auto; } + .grid-x > .medium-1 { + width: 8.33333%; } + .grid-x > .medium-2 { + width: 16.66667%; } + .grid-x > .medium-3 { + width: 25%; } + .grid-x > .medium-4 { + width: 33.33333%; } + .grid-x > .medium-5 { + width: 41.66667%; } + .grid-x > .medium-6 { + width: 50%; } + .grid-x > .medium-7 { + width: 58.33333%; } + .grid-x > .medium-8 { + width: 66.66667%; } + .grid-x > .medium-9 { + width: 75%; } + .grid-x > .medium-10 { + width: 83.33333%; } + .grid-x > .medium-11 { + width: 91.66667%; } + .grid-x > .medium-12 { + width: 100%; } } + +@media print, screen and (min-width: 64em) { + .grid-x > .large-auto { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; + width: auto; } + .grid-x > .large-shrink, .grid-x > .large-1, .grid-x > .large-2, .grid-x > .large-3, .grid-x > .large-4, .grid-x > .large-5, .grid-x > .large-6, .grid-x > .large-7, .grid-x > .large-8, .grid-x > .large-9, .grid-x > .large-10, .grid-x > .large-11, .grid-x > .large-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .grid-x > .large-shrink { + width: auto; } + .grid-x > .large-1 { + width: 8.33333%; } + .grid-x > .large-2 { + width: 16.66667%; } + .grid-x > .large-3 { + width: 25%; } + .grid-x > .large-4 { + width: 33.33333%; } + .grid-x > .large-5 { + width: 41.66667%; } + .grid-x > .large-6 { + width: 50%; } + .grid-x > .large-7 { + width: 58.33333%; } + .grid-x > .large-8 { + width: 66.66667%; } + .grid-x > .large-9 { + width: 75%; } + .grid-x > .large-10 { + width: 83.33333%; } + .grid-x > .large-11 { + width: 91.66667%; } + .grid-x > .large-12 { + width: 100%; } } + +.grid-margin-x:not(.grid-x) > .cell { + width: auto; } + +.grid-margin-y:not(.grid-y) > .cell { + height: auto; } + +.grid-margin-x { + margin-left: -0.625rem; + margin-right: -0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-margin-x { + margin-left: -0.9375rem; + margin-right: -0.9375rem; } } + .grid-margin-x > .cell { + width: calc(100% - 1.25rem); + margin-left: 0.625rem; + margin-right: 0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-margin-x > .cell { + width: calc(100% - 1.875rem); + margin-left: 0.9375rem; + margin-right: 0.9375rem; } } + .grid-margin-x > .auto { + width: auto; } + .grid-margin-x > .shrink { + width: auto; } + .grid-margin-x > .small-1 { + width: calc(8.33333% - 1.25rem); } + .grid-margin-x > .small-2 { + width: calc(16.66667% - 1.25rem); } + .grid-margin-x > .small-3 { + width: calc(25% - 1.25rem); } + .grid-margin-x > .small-4 { + width: calc(33.33333% - 1.25rem); } + .grid-margin-x > .small-5 { + width: calc(41.66667% - 1.25rem); } + .grid-margin-x > .small-6 { + width: calc(50% - 1.25rem); } + .grid-margin-x > .small-7 { + width: calc(58.33333% - 1.25rem); } + .grid-margin-x > .small-8 { + width: calc(66.66667% - 1.25rem); } + .grid-margin-x > .small-9 { + width: calc(75% - 1.25rem); } + .grid-margin-x > .small-10 { + width: calc(83.33333% - 1.25rem); } + .grid-margin-x > .small-11 { + width: calc(91.66667% - 1.25rem); } + .grid-margin-x > .small-12 { + width: calc(100% - 1.25rem); } + @media print, screen and (min-width: 40em) { + .grid-margin-x > .auto { + width: auto; } + .grid-margin-x > .shrink { + width: auto; } + .grid-margin-x > .small-1 { + width: calc(8.33333% - 1.875rem); } + .grid-margin-x > .small-2 { + width: calc(16.66667% - 1.875rem); } + .grid-margin-x > .small-3 { + width: calc(25% - 1.875rem); } + .grid-margin-x > .small-4 { + width: calc(33.33333% - 1.875rem); } + .grid-margin-x > .small-5 { + width: calc(41.66667% - 1.875rem); } + .grid-margin-x > .small-6 { + width: calc(50% - 1.875rem); } + .grid-margin-x > .small-7 { + width: calc(58.33333% - 1.875rem); } + .grid-margin-x > .small-8 { + width: calc(66.66667% - 1.875rem); } + .grid-margin-x > .small-9 { + width: calc(75% - 1.875rem); } + .grid-margin-x > .small-10 { + width: calc(83.33333% - 1.875rem); } + .grid-margin-x > .small-11 { + width: calc(91.66667% - 1.875rem); } + .grid-margin-x > .small-12 { + width: calc(100% - 1.875rem); } + .grid-margin-x > .medium-auto { + width: auto; } + .grid-margin-x > .medium-shrink { + width: auto; } + .grid-margin-x > .medium-1 { + width: calc(8.33333% - 1.875rem); } + .grid-margin-x > .medium-2 { + width: calc(16.66667% - 1.875rem); } + .grid-margin-x > .medium-3 { + width: calc(25% - 1.875rem); } + .grid-margin-x > .medium-4 { + width: calc(33.33333% - 1.875rem); } + .grid-margin-x > .medium-5 { + width: calc(41.66667% - 1.875rem); } + .grid-margin-x > .medium-6 { + width: calc(50% - 1.875rem); } + .grid-margin-x > .medium-7 { + width: calc(58.33333% - 1.875rem); } + .grid-margin-x > .medium-8 { + width: calc(66.66667% - 1.875rem); } + .grid-margin-x > .medium-9 { + width: calc(75% - 1.875rem); } + .grid-margin-x > .medium-10 { + width: calc(83.33333% - 1.875rem); } + .grid-margin-x > .medium-11 { + width: calc(91.66667% - 1.875rem); } + .grid-margin-x > .medium-12 { + width: calc(100% - 1.875rem); } } + @media print, screen and (min-width: 64em) { + .grid-margin-x > .large-auto { + width: auto; } + .grid-margin-x > .large-shrink { + width: auto; } + .grid-margin-x > .large-1 { + width: calc(8.33333% - 1.875rem); } + .grid-margin-x > .large-2 { + width: calc(16.66667% - 1.875rem); } + .grid-margin-x > .large-3 { + width: calc(25% - 1.875rem); } + .grid-margin-x > .large-4 { + width: calc(33.33333% - 1.875rem); } + .grid-margin-x > .large-5 { + width: calc(41.66667% - 1.875rem); } + .grid-margin-x > .large-6 { + width: calc(50% - 1.875rem); } + .grid-margin-x > .large-7 { + width: calc(58.33333% - 1.875rem); } + .grid-margin-x > .large-8 { + width: calc(66.66667% - 1.875rem); } + .grid-margin-x > .large-9 { + width: calc(75% - 1.875rem); } + .grid-margin-x > .large-10 { + width: calc(83.33333% - 1.875rem); } + .grid-margin-x > .large-11 { + width: calc(91.66667% - 1.875rem); } + .grid-margin-x > .large-12 { + width: calc(100% - 1.875rem); } } + +.grid-padding-x .grid-padding-x { + margin-right: -0.625rem; + margin-left: -0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-padding-x .grid-padding-x { + margin-right: -0.9375rem; + margin-left: -0.9375rem; } } + +.grid-container:not(.full) > .grid-padding-x { + margin-right: -0.625rem; + margin-left: -0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-container:not(.full) > .grid-padding-x { + margin-right: -0.9375rem; + margin-left: -0.9375rem; } } + +.grid-padding-x > .cell { + padding-right: 0.625rem; + padding-left: 0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-padding-x > .cell { + padding-right: 0.9375rem; + padding-left: 0.9375rem; } } + +.small-up-1 > .cell { + width: 100%; } + +.small-up-2 > .cell { + width: 50%; } + +.small-up-3 > .cell { + width: 33.33333%; } + +.small-up-4 > .cell { + width: 25%; } + +.small-up-5 > .cell { + width: 20%; } + +.small-up-6 > .cell { + width: 16.66667%; } + +.small-up-7 > .cell { + width: 14.28571%; } + +.small-up-8 > .cell { + width: 12.5%; } + +@media print, screen and (min-width: 40em) { + .medium-up-1 > .cell { + width: 100%; } + .medium-up-2 > .cell { + width: 50%; } + .medium-up-3 > .cell { + width: 33.33333%; } + .medium-up-4 > .cell { + width: 25%; } + .medium-up-5 > .cell { + width: 20%; } + .medium-up-6 > .cell { + width: 16.66667%; } + .medium-up-7 > .cell { + width: 14.28571%; } + .medium-up-8 > .cell { + width: 12.5%; } } + +@media print, screen and (min-width: 64em) { + .large-up-1 > .cell { + width: 100%; } + .large-up-2 > .cell { + width: 50%; } + .large-up-3 > .cell { + width: 33.33333%; } + .large-up-4 > .cell { + width: 25%; } + .large-up-5 > .cell { + width: 20%; } + .large-up-6 > .cell { + width: 16.66667%; } + .large-up-7 > .cell { + width: 14.28571%; } + .large-up-8 > .cell { + width: 12.5%; } } + +.grid-margin-x.small-up-1 > .cell { + width: calc(100% - 1.25rem); } + +.grid-margin-x.small-up-2 > .cell { + width: calc(50% - 1.25rem); } + +.grid-margin-x.small-up-3 > .cell { + width: calc(33.33333% - 1.25rem); } + +.grid-margin-x.small-up-4 > .cell { + width: calc(25% - 1.25rem); } + +.grid-margin-x.small-up-5 > .cell { + width: calc(20% - 1.25rem); } + +.grid-margin-x.small-up-6 > .cell { + width: calc(16.66667% - 1.25rem); } + +.grid-margin-x.small-up-7 > .cell { + width: calc(14.28571% - 1.25rem); } + +.grid-margin-x.small-up-8 > .cell { + width: calc(12.5% - 1.25rem); } + +@media print, screen and (min-width: 40em) { + .grid-margin-x.small-up-1 > .cell { + width: calc(100% - 1.875rem); } + .grid-margin-x.small-up-2 > .cell { + width: calc(50% - 1.875rem); } + .grid-margin-x.small-up-3 > .cell { + width: calc(33.33333% - 1.875rem); } + .grid-margin-x.small-up-4 > .cell { + width: calc(25% - 1.875rem); } + .grid-margin-x.small-up-5 > .cell { + width: calc(20% - 1.875rem); } + .grid-margin-x.small-up-6 > .cell { + width: calc(16.66667% - 1.875rem); } + .grid-margin-x.small-up-7 > .cell { + width: calc(14.28571% - 1.875rem); } + .grid-margin-x.small-up-8 > .cell { + width: calc(12.5% - 1.875rem); } + .grid-margin-x.medium-up-1 > .cell { + width: calc(100% - 1.875rem); } + .grid-margin-x.medium-up-2 > .cell { + width: calc(50% - 1.875rem); } + .grid-margin-x.medium-up-3 > .cell { + width: calc(33.33333% - 1.875rem); } + .grid-margin-x.medium-up-4 > .cell { + width: calc(25% - 1.875rem); } + .grid-margin-x.medium-up-5 > .cell { + width: calc(20% - 1.875rem); } + .grid-margin-x.medium-up-6 > .cell { + width: calc(16.66667% - 1.875rem); } + .grid-margin-x.medium-up-7 > .cell { + width: calc(14.28571% - 1.875rem); } + .grid-margin-x.medium-up-8 > .cell { + width: calc(12.5% - 1.875rem); } } + +@media print, screen and (min-width: 64em) { + .grid-margin-x.large-up-1 > .cell { + width: calc(100% - 1.875rem); } + .grid-margin-x.large-up-2 > .cell { + width: calc(50% - 1.875rem); } + .grid-margin-x.large-up-3 > .cell { + width: calc(33.33333% - 1.875rem); } + .grid-margin-x.large-up-4 > .cell { + width: calc(25% - 1.875rem); } + .grid-margin-x.large-up-5 > .cell { + width: calc(20% - 1.875rem); } + .grid-margin-x.large-up-6 > .cell { + width: calc(16.66667% - 1.875rem); } + .grid-margin-x.large-up-7 > .cell { + width: calc(14.28571% - 1.875rem); } + .grid-margin-x.large-up-8 > .cell { + width: calc(12.5% - 1.875rem); } } + +.small-margin-collapse { + margin-right: 0; + margin-left: 0; } + .small-margin-collapse > .cell { + margin-right: 0; + margin-left: 0; } + .small-margin-collapse > .small-1 { + width: 8.33333%; } + .small-margin-collapse > .small-2 { + width: 16.66667%; } + .small-margin-collapse > .small-3 { + width: 25%; } + .small-margin-collapse > .small-4 { + width: 33.33333%; } + .small-margin-collapse > .small-5 { + width: 41.66667%; } + .small-margin-collapse > .small-6 { + width: 50%; } + .small-margin-collapse > .small-7 { + width: 58.33333%; } + .small-margin-collapse > .small-8 { + width: 66.66667%; } + .small-margin-collapse > .small-9 { + width: 75%; } + .small-margin-collapse > .small-10 { + width: 83.33333%; } + .small-margin-collapse > .small-11 { + width: 91.66667%; } + .small-margin-collapse > .small-12 { + width: 100%; } + @media print, screen and (min-width: 40em) { + .small-margin-collapse > .medium-1 { + width: 8.33333%; } + .small-margin-collapse > .medium-2 { + width: 16.66667%; } + .small-margin-collapse > .medium-3 { + width: 25%; } + .small-margin-collapse > .medium-4 { + width: 33.33333%; } + .small-margin-collapse > .medium-5 { + width: 41.66667%; } + .small-margin-collapse > .medium-6 { + width: 50%; } + .small-margin-collapse > .medium-7 { + width: 58.33333%; } + .small-margin-collapse > .medium-8 { + width: 66.66667%; } + .small-margin-collapse > .medium-9 { + width: 75%; } + .small-margin-collapse > .medium-10 { + width: 83.33333%; } + .small-margin-collapse > .medium-11 { + width: 91.66667%; } + .small-margin-collapse > .medium-12 { + width: 100%; } } + @media print, screen and (min-width: 64em) { + .small-margin-collapse > .large-1 { + width: 8.33333%; } + .small-margin-collapse > .large-2 { + width: 16.66667%; } + .small-margin-collapse > .large-3 { + width: 25%; } + .small-margin-collapse > .large-4 { + width: 33.33333%; } + .small-margin-collapse > .large-5 { + width: 41.66667%; } + .small-margin-collapse > .large-6 { + width: 50%; } + .small-margin-collapse > .large-7 { + width: 58.33333%; } + .small-margin-collapse > .large-8 { + width: 66.66667%; } + .small-margin-collapse > .large-9 { + width: 75%; } + .small-margin-collapse > .large-10 { + width: 83.33333%; } + .small-margin-collapse > .large-11 { + width: 91.66667%; } + .small-margin-collapse > .large-12 { + width: 100%; } } + +.small-padding-collapse { + margin-right: 0; + margin-left: 0; } + .small-padding-collapse > .cell { + padding-right: 0; + padding-left: 0; } + +@media print, screen and (min-width: 40em) { + .medium-margin-collapse { + margin-right: 0; + margin-left: 0; } + .medium-margin-collapse > .cell { + margin-right: 0; + margin-left: 0; } } + +@media print, screen and (min-width: 40em) { + .medium-margin-collapse > .small-1 { + width: 8.33333%; } + .medium-margin-collapse > .small-2 { + width: 16.66667%; } + .medium-margin-collapse > .small-3 { + width: 25%; } + .medium-margin-collapse > .small-4 { + width: 33.33333%; } + .medium-margin-collapse > .small-5 { + width: 41.66667%; } + .medium-margin-collapse > .small-6 { + width: 50%; } + .medium-margin-collapse > .small-7 { + width: 58.33333%; } + .medium-margin-collapse > .small-8 { + width: 66.66667%; } + .medium-margin-collapse > .small-9 { + width: 75%; } + .medium-margin-collapse > .small-10 { + width: 83.33333%; } + .medium-margin-collapse > .small-11 { + width: 91.66667%; } + .medium-margin-collapse > .small-12 { + width: 100%; } } + +@media print, screen and (min-width: 40em) { + .medium-margin-collapse > .medium-1 { + width: 8.33333%; } + .medium-margin-collapse > .medium-2 { + width: 16.66667%; } + .medium-margin-collapse > .medium-3 { + width: 25%; } + .medium-margin-collapse > .medium-4 { + width: 33.33333%; } + .medium-margin-collapse > .medium-5 { + width: 41.66667%; } + .medium-margin-collapse > .medium-6 { + width: 50%; } + .medium-margin-collapse > .medium-7 { + width: 58.33333%; } + .medium-margin-collapse > .medium-8 { + width: 66.66667%; } + .medium-margin-collapse > .medium-9 { + width: 75%; } + .medium-margin-collapse > .medium-10 { + width: 83.33333%; } + .medium-margin-collapse > .medium-11 { + width: 91.66667%; } + .medium-margin-collapse > .medium-12 { + width: 100%; } } + +@media print, screen and (min-width: 64em) { + .medium-margin-collapse > .large-1 { + width: 8.33333%; } + .medium-margin-collapse > .large-2 { + width: 16.66667%; } + .medium-margin-collapse > .large-3 { + width: 25%; } + .medium-margin-collapse > .large-4 { + width: 33.33333%; } + .medium-margin-collapse > .large-5 { + width: 41.66667%; } + .medium-margin-collapse > .large-6 { + width: 50%; } + .medium-margin-collapse > .large-7 { + width: 58.33333%; } + .medium-margin-collapse > .large-8 { + width: 66.66667%; } + .medium-margin-collapse > .large-9 { + width: 75%; } + .medium-margin-collapse > .large-10 { + width: 83.33333%; } + .medium-margin-collapse > .large-11 { + width: 91.66667%; } + .medium-margin-collapse > .large-12 { + width: 100%; } } + +@media print, screen and (min-width: 40em) { + .medium-padding-collapse { + margin-right: 0; + margin-left: 0; } + .medium-padding-collapse > .cell { + padding-right: 0; + padding-left: 0; } } + +@media print, screen and (min-width: 64em) { + .large-margin-collapse { + margin-right: 0; + margin-left: 0; } + .large-margin-collapse > .cell { + margin-right: 0; + margin-left: 0; } } + +@media print, screen and (min-width: 64em) { + .large-margin-collapse > .small-1 { + width: 8.33333%; } + .large-margin-collapse > .small-2 { + width: 16.66667%; } + .large-margin-collapse > .small-3 { + width: 25%; } + .large-margin-collapse > .small-4 { + width: 33.33333%; } + .large-margin-collapse > .small-5 { + width: 41.66667%; } + .large-margin-collapse > .small-6 { + width: 50%; } + .large-margin-collapse > .small-7 { + width: 58.33333%; } + .large-margin-collapse > .small-8 { + width: 66.66667%; } + .large-margin-collapse > .small-9 { + width: 75%; } + .large-margin-collapse > .small-10 { + width: 83.33333%; } + .large-margin-collapse > .small-11 { + width: 91.66667%; } + .large-margin-collapse > .small-12 { + width: 100%; } } + +@media print, screen and (min-width: 64em) { + .large-margin-collapse > .medium-1 { + width: 8.33333%; } + .large-margin-collapse > .medium-2 { + width: 16.66667%; } + .large-margin-collapse > .medium-3 { + width: 25%; } + .large-margin-collapse > .medium-4 { + width: 33.33333%; } + .large-margin-collapse > .medium-5 { + width: 41.66667%; } + .large-margin-collapse > .medium-6 { + width: 50%; } + .large-margin-collapse > .medium-7 { + width: 58.33333%; } + .large-margin-collapse > .medium-8 { + width: 66.66667%; } + .large-margin-collapse > .medium-9 { + width: 75%; } + .large-margin-collapse > .medium-10 { + width: 83.33333%; } + .large-margin-collapse > .medium-11 { + width: 91.66667%; } + .large-margin-collapse > .medium-12 { + width: 100%; } } + +@media print, screen and (min-width: 64em) { + .large-margin-collapse > .large-1 { + width: 8.33333%; } + .large-margin-collapse > .large-2 { + width: 16.66667%; } + .large-margin-collapse > .large-3 { + width: 25%; } + .large-margin-collapse > .large-4 { + width: 33.33333%; } + .large-margin-collapse > .large-5 { + width: 41.66667%; } + .large-margin-collapse > .large-6 { + width: 50%; } + .large-margin-collapse > .large-7 { + width: 58.33333%; } + .large-margin-collapse > .large-8 { + width: 66.66667%; } + .large-margin-collapse > .large-9 { + width: 75%; } + .large-margin-collapse > .large-10 { + width: 83.33333%; } + .large-margin-collapse > .large-11 { + width: 91.66667%; } + .large-margin-collapse > .large-12 { + width: 100%; } } + +@media print, screen and (min-width: 64em) { + .large-padding-collapse { + margin-right: 0; + margin-left: 0; } + .large-padding-collapse > .cell { + padding-right: 0; + padding-left: 0; } } + +.small-offset-0 { + margin-left: 0%; } + +.grid-margin-x > .small-offset-0 { + margin-left: calc(0% + 1.25rem / 2); } + +.small-offset-1 { + margin-left: 8.33333%; } + +.grid-margin-x > .small-offset-1 { + margin-left: calc(8.33333% + 1.25rem / 2); } + +.small-offset-2 { + margin-left: 16.66667%; } + +.grid-margin-x > .small-offset-2 { + margin-left: calc(16.66667% + 1.25rem / 2); } + +.small-offset-3 { + margin-left: 25%; } + +.grid-margin-x > .small-offset-3 { + margin-left: calc(25% + 1.25rem / 2); } + +.small-offset-4 { + margin-left: 33.33333%; } + +.grid-margin-x > .small-offset-4 { + margin-left: calc(33.33333% + 1.25rem / 2); } + +.small-offset-5 { + margin-left: 41.66667%; } + +.grid-margin-x > .small-offset-5 { + margin-left: calc(41.66667% + 1.25rem / 2); } + +.small-offset-6 { + margin-left: 50%; } + +.grid-margin-x > .small-offset-6 { + margin-left: calc(50% + 1.25rem / 2); } + +.small-offset-7 { + margin-left: 58.33333%; } + +.grid-margin-x > .small-offset-7 { + margin-left: calc(58.33333% + 1.25rem / 2); } + +.small-offset-8 { + margin-left: 66.66667%; } + +.grid-margin-x > .small-offset-8 { + margin-left: calc(66.66667% + 1.25rem / 2); } + +.small-offset-9 { + margin-left: 75%; } + +.grid-margin-x > .small-offset-9 { + margin-left: calc(75% + 1.25rem / 2); } + +.small-offset-10 { + margin-left: 83.33333%; } + +.grid-margin-x > .small-offset-10 { + margin-left: calc(83.33333% + 1.25rem / 2); } + +.small-offset-11 { + margin-left: 91.66667%; } + +.grid-margin-x > .small-offset-11 { + margin-left: calc(91.66667% + 1.25rem / 2); } + +@media print, screen and (min-width: 40em) { + .medium-offset-0 { + margin-left: 0%; } + .grid-margin-x > .medium-offset-0 { + margin-left: calc(0% + 1.875rem / 2); } + .medium-offset-1 { + margin-left: 8.33333%; } + .grid-margin-x > .medium-offset-1 { + margin-left: calc(8.33333% + 1.875rem / 2); } + .medium-offset-2 { + margin-left: 16.66667%; } + .grid-margin-x > .medium-offset-2 { + margin-left: calc(16.66667% + 1.875rem / 2); } + .medium-offset-3 { + margin-left: 25%; } + .grid-margin-x > .medium-offset-3 { + margin-left: calc(25% + 1.875rem / 2); } + .medium-offset-4 { + margin-left: 33.33333%; } + .grid-margin-x > .medium-offset-4 { + margin-left: calc(33.33333% + 1.875rem / 2); } + .medium-offset-5 { + margin-left: 41.66667%; } + .grid-margin-x > .medium-offset-5 { + margin-left: calc(41.66667% + 1.875rem / 2); } + .medium-offset-6 { + margin-left: 50%; } + .grid-margin-x > .medium-offset-6 { + margin-left: calc(50% + 1.875rem / 2); } + .medium-offset-7 { + margin-left: 58.33333%; } + .grid-margin-x > .medium-offset-7 { + margin-left: calc(58.33333% + 1.875rem / 2); } + .medium-offset-8 { + margin-left: 66.66667%; } + .grid-margin-x > .medium-offset-8 { + margin-left: calc(66.66667% + 1.875rem / 2); } + .medium-offset-9 { + margin-left: 75%; } + .grid-margin-x > .medium-offset-9 { + margin-left: calc(75% + 1.875rem / 2); } + .medium-offset-10 { + margin-left: 83.33333%; } + .grid-margin-x > .medium-offset-10 { + margin-left: calc(83.33333% + 1.875rem / 2); } + .medium-offset-11 { + margin-left: 91.66667%; } + .grid-margin-x > .medium-offset-11 { + margin-left: calc(91.66667% + 1.875rem / 2); } } + +@media print, screen and (min-width: 64em) { + .large-offset-0 { + margin-left: 0%; } + .grid-margin-x > .large-offset-0 { + margin-left: calc(0% + 1.875rem / 2); } + .large-offset-1 { + margin-left: 8.33333%; } + .grid-margin-x > .large-offset-1 { + margin-left: calc(8.33333% + 1.875rem / 2); } + .large-offset-2 { + margin-left: 16.66667%; } + .grid-margin-x > .large-offset-2 { + margin-left: calc(16.66667% + 1.875rem / 2); } + .large-offset-3 { + margin-left: 25%; } + .grid-margin-x > .large-offset-3 { + margin-left: calc(25% + 1.875rem / 2); } + .large-offset-4 { + margin-left: 33.33333%; } + .grid-margin-x > .large-offset-4 { + margin-left: calc(33.33333% + 1.875rem / 2); } + .large-offset-5 { + margin-left: 41.66667%; } + .grid-margin-x > .large-offset-5 { + margin-left: calc(41.66667% + 1.875rem / 2); } + .large-offset-6 { + margin-left: 50%; } + .grid-margin-x > .large-offset-6 { + margin-left: calc(50% + 1.875rem / 2); } + .large-offset-7 { + margin-left: 58.33333%; } + .grid-margin-x > .large-offset-7 { + margin-left: calc(58.33333% + 1.875rem / 2); } + .large-offset-8 { + margin-left: 66.66667%; } + .grid-margin-x > .large-offset-8 { + margin-left: calc(66.66667% + 1.875rem / 2); } + .large-offset-9 { + margin-left: 75%; } + .grid-margin-x > .large-offset-9 { + margin-left: calc(75% + 1.875rem / 2); } + .large-offset-10 { + margin-left: 83.33333%; } + .grid-margin-x > .large-offset-10 { + margin-left: calc(83.33333% + 1.875rem / 2); } + .large-offset-11 { + margin-left: 91.66667%; } + .grid-margin-x > .large-offset-11 { + margin-left: calc(91.66667% + 1.875rem / 2); } } + +.grid-y { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; } + .grid-y > .cell { + height: auto; + max-height: none; } + .grid-y > .auto { + height: auto; } + .grid-y > .shrink { + height: auto; } + .grid-y > .small-shrink, .grid-y > .small-full, .grid-y > .small-1, .grid-y > .small-2, .grid-y > .small-3, .grid-y > .small-4, .grid-y > .small-5, .grid-y > .small-6, .grid-y > .small-7, .grid-y > .small-8, .grid-y > .small-9, .grid-y > .small-10, .grid-y > .small-11, .grid-y > .small-12 { + -webkit-flex-basis: auto; + -ms-flex-preferred-size: auto; + flex-basis: auto; } + @media print, screen and (min-width: 40em) { + .grid-y > .medium-shrink, .grid-y > .medium-full, .grid-y > .medium-1, .grid-y > .medium-2, .grid-y > .medium-3, .grid-y > .medium-4, .grid-y > .medium-5, .grid-y > .medium-6, .grid-y > .medium-7, .grid-y > .medium-8, .grid-y > .medium-9, .grid-y > .medium-10, .grid-y > .medium-11, .grid-y > .medium-12 { + -webkit-flex-basis: auto; + -ms-flex-preferred-size: auto; + flex-basis: auto; } } + @media print, screen and (min-width: 64em) { + .grid-y > .large-shrink, .grid-y > .large-full, .grid-y > .large-1, .grid-y > .large-2, .grid-y > .large-3, .grid-y > .large-4, .grid-y > .large-5, .grid-y > .large-6, .grid-y > .large-7, .grid-y > .large-8, .grid-y > .large-9, .grid-y > .large-10, .grid-y > .large-11, .grid-y > .large-12 { + -webkit-flex-basis: auto; + -ms-flex-preferred-size: auto; + flex-basis: auto; } } + .grid-y > .small-1, .grid-y > .small-2, .grid-y > .small-3, .grid-y > .small-4, .grid-y > .small-5, .grid-y > .small-6, .grid-y > .small-7, .grid-y > .small-8, .grid-y > .small-9, .grid-y > .small-10, .grid-y > .small-11, .grid-y > .small-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .grid-y > .small-1 { + height: 8.33333%; } + .grid-y > .small-2 { + height: 16.66667%; } + .grid-y > .small-3 { + height: 25%; } + .grid-y > .small-4 { + height: 33.33333%; } + .grid-y > .small-5 { + height: 41.66667%; } + .grid-y > .small-6 { + height: 50%; } + .grid-y > .small-7 { + height: 58.33333%; } + .grid-y > .small-8 { + height: 66.66667%; } + .grid-y > .small-9 { + height: 75%; } + .grid-y > .small-10 { + height: 83.33333%; } + .grid-y > .small-11 { + height: 91.66667%; } + .grid-y > .small-12 { + height: 100%; } + @media print, screen and (min-width: 40em) { + .grid-y > .medium-auto { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; + height: auto; } + .grid-y > .medium-shrink, .grid-y > .medium-1, .grid-y > .medium-2, .grid-y > .medium-3, .grid-y > .medium-4, .grid-y > .medium-5, .grid-y > .medium-6, .grid-y > .medium-7, .grid-y > .medium-8, .grid-y > .medium-9, .grid-y > .medium-10, .grid-y > .medium-11, .grid-y > .medium-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .grid-y > .medium-shrink { + height: auto; } + .grid-y > .medium-1 { + height: 8.33333%; } + .grid-y > .medium-2 { + height: 16.66667%; } + .grid-y > .medium-3 { + height: 25%; } + .grid-y > .medium-4 { + height: 33.33333%; } + .grid-y > .medium-5 { + height: 41.66667%; } + .grid-y > .medium-6 { + height: 50%; } + .grid-y > .medium-7 { + height: 58.33333%; } + .grid-y > .medium-8 { + height: 66.66667%; } + .grid-y > .medium-9 { + height: 75%; } + .grid-y > .medium-10 { + height: 83.33333%; } + .grid-y > .medium-11 { + height: 91.66667%; } + .grid-y > .medium-12 { + height: 100%; } } + @media print, screen and (min-width: 64em) { + .grid-y > .large-auto { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; + height: auto; } + .grid-y > .large-shrink, .grid-y > .large-1, .grid-y > .large-2, .grid-y > .large-3, .grid-y > .large-4, .grid-y > .large-5, .grid-y > .large-6, .grid-y > .large-7, .grid-y > .large-8, .grid-y > .large-9, .grid-y > .large-10, .grid-y > .large-11, .grid-y > .large-12 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .grid-y > .large-shrink { + height: auto; } + .grid-y > .large-1 { + height: 8.33333%; } + .grid-y > .large-2 { + height: 16.66667%; } + .grid-y > .large-3 { + height: 25%; } + .grid-y > .large-4 { + height: 33.33333%; } + .grid-y > .large-5 { + height: 41.66667%; } + .grid-y > .large-6 { + height: 50%; } + .grid-y > .large-7 { + height: 58.33333%; } + .grid-y > .large-8 { + height: 66.66667%; } + .grid-y > .large-9 { + height: 75%; } + .grid-y > .large-10 { + height: 83.33333%; } + .grid-y > .large-11 { + height: 91.66667%; } + .grid-y > .large-12 { + height: 100%; } } + +.grid-padding-y .grid-padding-y { + margin-top: -0.625rem; + margin-bottom: -0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-padding-y .grid-padding-y { + margin-top: -0.9375rem; + margin-bottom: -0.9375rem; } } + +.grid-padding-y > .cell { + padding-top: 0.625rem; + padding-bottom: 0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-padding-y > .cell { + padding-top: 0.9375rem; + padding-bottom: 0.9375rem; } } + +.grid-margin-y { + margin-top: -0.625rem; + margin-bottom: -0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-margin-y { + margin-top: -0.9375rem; + margin-bottom: -0.9375rem; } } + .grid-margin-y > .cell { + height: calc(100% - 1.25rem); + margin-top: 0.625rem; + margin-bottom: 0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-margin-y > .cell { + height: calc(100% - 1.875rem); + margin-top: 0.9375rem; + margin-bottom: 0.9375rem; } } + .grid-margin-y > .auto { + height: auto; } + .grid-margin-y > .shrink { + height: auto; } + .grid-margin-y > .small-1 { + height: calc(8.33333% - 1.25rem); } + .grid-margin-y > .small-2 { + height: calc(16.66667% - 1.25rem); } + .grid-margin-y > .small-3 { + height: calc(25% - 1.25rem); } + .grid-margin-y > .small-4 { + height: calc(33.33333% - 1.25rem); } + .grid-margin-y > .small-5 { + height: calc(41.66667% - 1.25rem); } + .grid-margin-y > .small-6 { + height: calc(50% - 1.25rem); } + .grid-margin-y > .small-7 { + height: calc(58.33333% - 1.25rem); } + .grid-margin-y > .small-8 { + height: calc(66.66667% - 1.25rem); } + .grid-margin-y > .small-9 { + height: calc(75% - 1.25rem); } + .grid-margin-y > .small-10 { + height: calc(83.33333% - 1.25rem); } + .grid-margin-y > .small-11 { + height: calc(91.66667% - 1.25rem); } + .grid-margin-y > .small-12 { + height: calc(100% - 1.25rem); } + @media print, screen and (min-width: 40em) { + .grid-margin-y > .auto { + height: auto; } + .grid-margin-y > .shrink { + height: auto; } + .grid-margin-y > .small-1 { + height: calc(8.33333% - 1.875rem); } + .grid-margin-y > .small-2 { + height: calc(16.66667% - 1.875rem); } + .grid-margin-y > .small-3 { + height: calc(25% - 1.875rem); } + .grid-margin-y > .small-4 { + height: calc(33.33333% - 1.875rem); } + .grid-margin-y > .small-5 { + height: calc(41.66667% - 1.875rem); } + .grid-margin-y > .small-6 { + height: calc(50% - 1.875rem); } + .grid-margin-y > .small-7 { + height: calc(58.33333% - 1.875rem); } + .grid-margin-y > .small-8 { + height: calc(66.66667% - 1.875rem); } + .grid-margin-y > .small-9 { + height: calc(75% - 1.875rem); } + .grid-margin-y > .small-10 { + height: calc(83.33333% - 1.875rem); } + .grid-margin-y > .small-11 { + height: calc(91.66667% - 1.875rem); } + .grid-margin-y > .small-12 { + height: calc(100% - 1.875rem); } + .grid-margin-y > .medium-auto { + height: auto; } + .grid-margin-y > .medium-shrink { + height: auto; } + .grid-margin-y > .medium-1 { + height: calc(8.33333% - 1.875rem); } + .grid-margin-y > .medium-2 { + height: calc(16.66667% - 1.875rem); } + .grid-margin-y > .medium-3 { + height: calc(25% - 1.875rem); } + .grid-margin-y > .medium-4 { + height: calc(33.33333% - 1.875rem); } + .grid-margin-y > .medium-5 { + height: calc(41.66667% - 1.875rem); } + .grid-margin-y > .medium-6 { + height: calc(50% - 1.875rem); } + .grid-margin-y > .medium-7 { + height: calc(58.33333% - 1.875rem); } + .grid-margin-y > .medium-8 { + height: calc(66.66667% - 1.875rem); } + .grid-margin-y > .medium-9 { + height: calc(75% - 1.875rem); } + .grid-margin-y > .medium-10 { + height: calc(83.33333% - 1.875rem); } + .grid-margin-y > .medium-11 { + height: calc(91.66667% - 1.875rem); } + .grid-margin-y > .medium-12 { + height: calc(100% - 1.875rem); } } + @media print, screen and (min-width: 64em) { + .grid-margin-y > .large-auto { + height: auto; } + .grid-margin-y > .large-shrink { + height: auto; } + .grid-margin-y > .large-1 { + height: calc(8.33333% - 1.875rem); } + .grid-margin-y > .large-2 { + height: calc(16.66667% - 1.875rem); } + .grid-margin-y > .large-3 { + height: calc(25% - 1.875rem); } + .grid-margin-y > .large-4 { + height: calc(33.33333% - 1.875rem); } + .grid-margin-y > .large-5 { + height: calc(41.66667% - 1.875rem); } + .grid-margin-y > .large-6 { + height: calc(50% - 1.875rem); } + .grid-margin-y > .large-7 { + height: calc(58.33333% - 1.875rem); } + .grid-margin-y > .large-8 { + height: calc(66.66667% - 1.875rem); } + .grid-margin-y > .large-9 { + height: calc(75% - 1.875rem); } + .grid-margin-y > .large-10 { + height: calc(83.33333% - 1.875rem); } + .grid-margin-y > .large-11 { + height: calc(91.66667% - 1.875rem); } + .grid-margin-y > .large-12 { + height: calc(100% - 1.875rem); } } + +.grid-frame { + overflow: hidden; + position: relative; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: stretch; + -webkit-align-items: stretch; + -ms-flex-align: stretch; + align-items: stretch; + width: 100vw; } + +.cell .grid-frame { + width: 100%; } + +.cell-block { + overflow-x: auto; + max-width: 100%; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; } + +.cell-block-y { + overflow-y: auto; + max-height: 100%; + min-height: 100%; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; } + +.cell-block-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + max-height: 100%; } + .cell-block-container > .grid-x { + max-height: 100%; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + +@media print, screen and (min-width: 40em) { + .medium-grid-frame { + overflow: hidden; + position: relative; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: stretch; + -webkit-align-items: stretch; + -ms-flex-align: stretch; + align-items: stretch; + width: 100vw; } + .cell .medium-grid-frame { + width: 100%; } + .medium-cell-block { + overflow-x: auto; + max-width: 100%; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; } + .medium-cell-block-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + max-height: 100%; } + .medium-cell-block-container > .grid-x { + max-height: 100%; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .medium-cell-block-y { + overflow-y: auto; + max-height: 100%; + min-height: 100%; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; } } + +@media print, screen and (min-width: 64em) { + .large-grid-frame { + overflow: hidden; + position: relative; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: stretch; + -webkit-align-items: stretch; + -ms-flex-align: stretch; + align-items: stretch; + width: 100vw; } + .cell .large-grid-frame { + width: 100%; } + .large-cell-block { + overflow-x: auto; + max-width: 100%; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; } + .large-cell-block-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + max-height: 100%; } + .large-cell-block-container > .grid-x { + max-height: 100%; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .large-cell-block-y { + overflow-y: auto; + max-height: 100%; + min-height: 100%; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; } } + +.grid-y.grid-frame { + width: auto; + overflow: hidden; + position: relative; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: stretch; + -webkit-align-items: stretch; + -ms-flex-align: stretch; + align-items: stretch; + height: 100vh; } + +@media print, screen and (min-width: 40em) { + .grid-y.medium-grid-frame { + width: auto; + overflow: hidden; + position: relative; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: stretch; + -webkit-align-items: stretch; + -ms-flex-align: stretch; + align-items: stretch; + height: 100vh; } } + +@media print, screen and (min-width: 64em) { + .grid-y.large-grid-frame { + width: auto; + overflow: hidden; + position: relative; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: stretch; + -webkit-align-items: stretch; + -ms-flex-align: stretch; + align-items: stretch; + height: 100vh; } } + +.cell .grid-y.grid-frame { + height: 100%; } + +@media print, screen and (min-width: 40em) { + .cell .grid-y.medium-grid-frame { + height: 100%; } } + +@media print, screen and (min-width: 64em) { + .cell .grid-y.large-grid-frame { + height: 100%; } } + +.grid-margin-y { + margin-top: -0.625rem; + margin-bottom: -0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-margin-y { + margin-top: -0.9375rem; + margin-bottom: -0.9375rem; } } + .grid-margin-y > .cell { + height: calc(100% - 1.25rem); + margin-top: 0.625rem; + margin-bottom: 0.625rem; } + @media print, screen and (min-width: 40em) { + .grid-margin-y > .cell { + height: calc(100% - 1.875rem); + margin-top: 0.9375rem; + margin-bottom: 0.9375rem; } } + .grid-margin-y > .auto { + height: auto; } + .grid-margin-y > .shrink { + height: auto; } + .grid-margin-y > .small-1 { + height: calc(8.33333% - 1.25rem); } + .grid-margin-y > .small-2 { + height: calc(16.66667% - 1.25rem); } + .grid-margin-y > .small-3 { + height: calc(25% - 1.25rem); } + .grid-margin-y > .small-4 { + height: calc(33.33333% - 1.25rem); } + .grid-margin-y > .small-5 { + height: calc(41.66667% - 1.25rem); } + .grid-margin-y > .small-6 { + height: calc(50% - 1.25rem); } + .grid-margin-y > .small-7 { + height: calc(58.33333% - 1.25rem); } + .grid-margin-y > .small-8 { + height: calc(66.66667% - 1.25rem); } + .grid-margin-y > .small-9 { + height: calc(75% - 1.25rem); } + .grid-margin-y > .small-10 { + height: calc(83.33333% - 1.25rem); } + .grid-margin-y > .small-11 { + height: calc(91.66667% - 1.25rem); } + .grid-margin-y > .small-12 { + height: calc(100% - 1.25rem); } + @media print, screen and (min-width: 40em) { + .grid-margin-y > .auto { + height: auto; } + .grid-margin-y > .shrink { + height: auto; } + .grid-margin-y > .small-1 { + height: calc(8.33333% - 1.875rem); } + .grid-margin-y > .small-2 { + height: calc(16.66667% - 1.875rem); } + .grid-margin-y > .small-3 { + height: calc(25% - 1.875rem); } + .grid-margin-y > .small-4 { + height: calc(33.33333% - 1.875rem); } + .grid-margin-y > .small-5 { + height: calc(41.66667% - 1.875rem); } + .grid-margin-y > .small-6 { + height: calc(50% - 1.875rem); } + .grid-margin-y > .small-7 { + height: calc(58.33333% - 1.875rem); } + .grid-margin-y > .small-8 { + height: calc(66.66667% - 1.875rem); } + .grid-margin-y > .small-9 { + height: calc(75% - 1.875rem); } + .grid-margin-y > .small-10 { + height: calc(83.33333% - 1.875rem); } + .grid-margin-y > .small-11 { + height: calc(91.66667% - 1.875rem); } + .grid-margin-y > .small-12 { + height: calc(100% - 1.875rem); } + .grid-margin-y > .medium-auto { + height: auto; } + .grid-margin-y > .medium-shrink { + height: auto; } + .grid-margin-y > .medium-1 { + height: calc(8.33333% - 1.875rem); } + .grid-margin-y > .medium-2 { + height: calc(16.66667% - 1.875rem); } + .grid-margin-y > .medium-3 { + height: calc(25% - 1.875rem); } + .grid-margin-y > .medium-4 { + height: calc(33.33333% - 1.875rem); } + .grid-margin-y > .medium-5 { + height: calc(41.66667% - 1.875rem); } + .grid-margin-y > .medium-6 { + height: calc(50% - 1.875rem); } + .grid-margin-y > .medium-7 { + height: calc(58.33333% - 1.875rem); } + .grid-margin-y > .medium-8 { + height: calc(66.66667% - 1.875rem); } + .grid-margin-y > .medium-9 { + height: calc(75% - 1.875rem); } + .grid-margin-y > .medium-10 { + height: calc(83.33333% - 1.875rem); } + .grid-margin-y > .medium-11 { + height: calc(91.66667% - 1.875rem); } + .grid-margin-y > .medium-12 { + height: calc(100% - 1.875rem); } } + @media print, screen and (min-width: 64em) { + .grid-margin-y > .large-auto { + height: auto; } + .grid-margin-y > .large-shrink { + height: auto; } + .grid-margin-y > .large-1 { + height: calc(8.33333% - 1.875rem); } + .grid-margin-y > .large-2 { + height: calc(16.66667% - 1.875rem); } + .grid-margin-y > .large-3 { + height: calc(25% - 1.875rem); } + .grid-margin-y > .large-4 { + height: calc(33.33333% - 1.875rem); } + .grid-margin-y > .large-5 { + height: calc(41.66667% - 1.875rem); } + .grid-margin-y > .large-6 { + height: calc(50% - 1.875rem); } + .grid-margin-y > .large-7 { + height: calc(58.33333% - 1.875rem); } + .grid-margin-y > .large-8 { + height: calc(66.66667% - 1.875rem); } + .grid-margin-y > .large-9 { + height: calc(75% - 1.875rem); } + .grid-margin-y > .large-10 { + height: calc(83.33333% - 1.875rem); } + .grid-margin-y > .large-11 { + height: calc(91.66667% - 1.875rem); } + .grid-margin-y > .large-12 { + height: calc(100% - 1.875rem); } } + +.grid-frame.grid-margin-y { + height: calc(100vh + 1.25rem); } + @media print, screen and (min-width: 40em) { + .grid-frame.grid-margin-y { + height: calc(100vh + 1.875rem); } } + @media print, screen and (min-width: 64em) { + .grid-frame.grid-margin-y { + height: calc(100vh + 1.875rem); } } + +@media print, screen and (min-width: 40em) { + .grid-margin-y.medium-grid-frame { + height: calc(100vh + 1.875rem); } } + +@media print, screen and (min-width: 64em) { + .grid-margin-y.large-grid-frame { + height: calc(100vh + 1.875rem); } } + +.button { + display: inline-block; + vertical-align: middle; + margin: 0 0 1rem 0; + padding: 0.85em 1em; + border: 1px solid transparent; + border-radius: 0; + -webkit-transition: background-color 0.25s ease-out, color 0.25s ease-out; + transition: background-color 0.25s ease-out, color 0.25s ease-out; + font-family: inherit; + font-size: 0.9rem; + -webkit-appearance: none; + line-height: 1; + text-align: center; + cursor: pointer; } + [data-whatinput='mouse'] .button { + outline: 0; } + .button.tiny { + font-size: 0.6rem; } + .button.small { + font-size: 0.75rem; } + .button.large { + font-size: 1.25rem; } + .button.expanded { + display: block; + width: 100%; + margin-right: 0; + margin-left: 0; } + .button, .button.disabled, .button[disabled], .button.disabled:hover, .button[disabled]:hover, .button.disabled:focus, .button[disabled]:focus { + background-color: #1779ba; + color: #fefefe; } + .button:hover, .button:focus { + background-color: #14679e; + color: #fefefe; } + .button.primary, .button.primary.disabled, .button.primary[disabled], .button.primary.disabled:hover, .button.primary[disabled]:hover, .button.primary.disabled:focus, .button.primary[disabled]:focus { + background-color: #1779ba; + color: #fefefe; } + .button.primary:hover, .button.primary:focus { + background-color: #126195; + color: #fefefe; } + .button.secondary, .button.secondary.disabled, .button.secondary[disabled], .button.secondary.disabled:hover, .button.secondary[disabled]:hover, .button.secondary.disabled:focus, .button.secondary[disabled]:focus { + background-color: #767676; + color: #fefefe; } + .button.secondary:hover, .button.secondary:focus { + background-color: #5e5e5e; + color: #fefefe; } + .button.success, .button.success.disabled, .button.success[disabled], .button.success.disabled:hover, .button.success[disabled]:hover, .button.success.disabled:focus, .button.success[disabled]:focus { + background-color: #3adb76; + color: #0a0a0a; } + .button.success:hover, .button.success:focus { + background-color: #22bb5b; + color: #0a0a0a; } + .button.warning, .button.warning.disabled, .button.warning[disabled], .button.warning.disabled:hover, .button.warning[disabled]:hover, .button.warning.disabled:focus, .button.warning[disabled]:focus { + background-color: #ffae00; + color: #0a0a0a; } + .button.warning:hover, .button.warning:focus { + background-color: #cc8b00; + color: #0a0a0a; } + .button.alert, .button.alert.disabled, .button.alert[disabled], .button.alert.disabled:hover, .button.alert[disabled]:hover, .button.alert.disabled:focus, .button.alert[disabled]:focus { + background-color: #cc4b37; + color: #fefefe; } + .button.alert:hover, .button.alert:focus { + background-color: #a53b2a; + color: #fefefe; } + .button.hollow, .button.hollow:hover, .button.hollow:focus, .button.hollow.disabled, .button.hollow.disabled:hover, .button.hollow.disabled:focus, .button.hollow[disabled], .button.hollow[disabled]:hover, .button.hollow[disabled]:focus { + background-color: transparent; } + .button.hollow, .button.hollow.disabled, .button.hollow[disabled], .button.hollow.disabled:hover, .button.hollow[disabled]:hover, .button.hollow.disabled:focus, .button.hollow[disabled]:focus { + border: 1px solid #1779ba; + color: #1779ba; } + .button.hollow:hover, .button.hollow:focus { + border-color: #0c3d5d; + color: #0c3d5d; } + .button.hollow.primary, .button.hollow.primary.disabled, .button.hollow.primary[disabled], .button.hollow.primary.disabled:hover, .button.hollow.primary[disabled]:hover, .button.hollow.primary.disabled:focus, .button.hollow.primary[disabled]:focus { + border: 1px solid #1779ba; + color: #1779ba; } + .button.hollow.primary:hover, .button.hollow.primary:focus { + border-color: #0c3d5d; + color: #0c3d5d; } + .button.hollow.secondary, .button.hollow.secondary.disabled, .button.hollow.secondary[disabled], .button.hollow.secondary.disabled:hover, .button.hollow.secondary[disabled]:hover, .button.hollow.secondary.disabled:focus, .button.hollow.secondary[disabled]:focus { + border: 1px solid #767676; + color: #767676; } + .button.hollow.secondary:hover, .button.hollow.secondary:focus { + border-color: #3b3b3b; + color: #3b3b3b; } + .button.hollow.success, .button.hollow.success.disabled, .button.hollow.success[disabled], .button.hollow.success.disabled:hover, .button.hollow.success[disabled]:hover, .button.hollow.success.disabled:focus, .button.hollow.success[disabled]:focus { + border: 1px solid #3adb76; + color: #3adb76; } + .button.hollow.success:hover, .button.hollow.success:focus { + border-color: #157539; + color: #157539; } + .button.hollow.warning, .button.hollow.warning.disabled, .button.hollow.warning[disabled], .button.hollow.warning.disabled:hover, .button.hollow.warning[disabled]:hover, .button.hollow.warning.disabled:focus, .button.hollow.warning[disabled]:focus { + border: 1px solid #ffae00; + color: #ffae00; } + .button.hollow.warning:hover, .button.hollow.warning:focus { + border-color: #805700; + color: #805700; } + .button.hollow.alert, .button.hollow.alert.disabled, .button.hollow.alert[disabled], .button.hollow.alert.disabled:hover, .button.hollow.alert[disabled]:hover, .button.hollow.alert.disabled:focus, .button.hollow.alert[disabled]:focus { + border: 1px solid #cc4b37; + color: #cc4b37; } + .button.hollow.alert:hover, .button.hollow.alert:focus { + border-color: #67251a; + color: #67251a; } + .button.clear, .button.clear:hover, .button.clear:focus, .button.clear.disabled, .button.clear.disabled:hover, .button.clear.disabled:focus, .button.clear[disabled], .button.clear[disabled]:hover, .button.clear[disabled]:focus { + border-color: transparent; + background-color: transparent; } + .button.clear, .button.clear.disabled, .button.clear[disabled], .button.clear.disabled:hover, .button.clear[disabled]:hover, .button.clear.disabled:focus, .button.clear[disabled]:focus { + color: #1779ba; } + .button.clear:hover, .button.clear:focus { + color: #0c3d5d; } + .button.clear.primary, .button.clear.primary.disabled, .button.clear.primary[disabled], .button.clear.primary.disabled:hover, .button.clear.primary[disabled]:hover, .button.clear.primary.disabled:focus, .button.clear.primary[disabled]:focus { + color: #1779ba; } + .button.clear.primary:hover, .button.clear.primary:focus { + color: #0c3d5d; } + .button.clear.secondary, .button.clear.secondary.disabled, .button.clear.secondary[disabled], .button.clear.secondary.disabled:hover, .button.clear.secondary[disabled]:hover, .button.clear.secondary.disabled:focus, .button.clear.secondary[disabled]:focus { + color: #767676; } + .button.clear.secondary:hover, .button.clear.secondary:focus { + color: #3b3b3b; } + .button.clear.success, .button.clear.success.disabled, .button.clear.success[disabled], .button.clear.success.disabled:hover, .button.clear.success[disabled]:hover, .button.clear.success.disabled:focus, .button.clear.success[disabled]:focus { + color: #3adb76; } + .button.clear.success:hover, .button.clear.success:focus { + color: #157539; } + .button.clear.warning, .button.clear.warning.disabled, .button.clear.warning[disabled], .button.clear.warning.disabled:hover, .button.clear.warning[disabled]:hover, .button.clear.warning.disabled:focus, .button.clear.warning[disabled]:focus { + color: #ffae00; } + .button.clear.warning:hover, .button.clear.warning:focus { + color: #805700; } + .button.clear.alert, .button.clear.alert.disabled, .button.clear.alert[disabled], .button.clear.alert.disabled:hover, .button.clear.alert[disabled]:hover, .button.clear.alert.disabled:focus, .button.clear.alert[disabled]:focus { + color: #cc4b37; } + .button.clear.alert:hover, .button.clear.alert:focus { + color: #67251a; } + .button.disabled, .button[disabled] { + opacity: 0.25; + cursor: not-allowed; } + .button.dropdown::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 0.4em; + content: ''; + border-bottom-width: 0; + border-color: #fefefe transparent transparent; + position: relative; + top: 0.4em; + display: inline-block; + float: right; + margin-left: 1em; } + .button.dropdown.hollow::after, .button.dropdown.clear::after { + border-top-color: #1779ba; } + .button.dropdown.hollow.primary::after, .button.dropdown.clear.primary::after { + border-top-color: #1779ba; } + .button.dropdown.hollow.secondary::after, .button.dropdown.clear.secondary::after { + border-top-color: #767676; } + .button.dropdown.hollow.success::after, .button.dropdown.clear.success::after { + border-top-color: #3adb76; } + .button.dropdown.hollow.warning::after, .button.dropdown.clear.warning::after { + border-top-color: #ffae00; } + .button.dropdown.hollow.alert::after, .button.dropdown.clear.alert::after { + border-top-color: #cc4b37; } + .button.arrow-only::after { + top: -0.1em; + float: none; + margin-left: 0; } + +a.button:hover, a.button:focus { + text-decoration: none; } + +.button-group { + margin-bottom: 1rem; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: stretch; + -webkit-align-items: stretch; + -ms-flex-align: stretch; + align-items: stretch; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; } + .button-group::before, .button-group::after { + display: table; + content: ' '; + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .button-group::after { + clear: both; } + .button-group::before, .button-group::after { + display: none; } + .button-group .button { + margin: 0; + margin-right: 1px; + margin-bottom: 1px; + font-size: 0.9rem; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .button-group .button:last-child { + margin-right: 0; } + .button-group.tiny .button { + font-size: 0.6rem; } + .button-group.small .button { + font-size: 0.75rem; } + .button-group.large .button { + font-size: 1.25rem; } + .button-group.expanded .button { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } + .button-group.primary .button, .button-group.primary .button.disabled, .button-group.primary .button[disabled], .button-group.primary .button.disabled:hover, .button-group.primary .button[disabled]:hover, .button-group.primary .button.disabled:focus, .button-group.primary .button[disabled]:focus { + background-color: #1779ba; + color: #fefefe; } + .button-group.primary .button:hover, .button-group.primary .button:focus { + background-color: #126195; + color: #fefefe; } + .button-group.secondary .button, .button-group.secondary .button.disabled, .button-group.secondary .button[disabled], .button-group.secondary .button.disabled:hover, .button-group.secondary .button[disabled]:hover, .button-group.secondary .button.disabled:focus, .button-group.secondary .button[disabled]:focus { + background-color: #767676; + color: #fefefe; } + .button-group.secondary .button:hover, .button-group.secondary .button:focus { + background-color: #5e5e5e; + color: #fefefe; } + .button-group.success .button, .button-group.success .button.disabled, .button-group.success .button[disabled], .button-group.success .button.disabled:hover, .button-group.success .button[disabled]:hover, .button-group.success .button.disabled:focus, .button-group.success .button[disabled]:focus { + background-color: #3adb76; + color: #0a0a0a; } + .button-group.success .button:hover, .button-group.success .button:focus { + background-color: #22bb5b; + color: #0a0a0a; } + .button-group.warning .button, .button-group.warning .button.disabled, .button-group.warning .button[disabled], .button-group.warning .button.disabled:hover, .button-group.warning .button[disabled]:hover, .button-group.warning .button.disabled:focus, .button-group.warning .button[disabled]:focus { + background-color: #ffae00; + color: #0a0a0a; } + .button-group.warning .button:hover, .button-group.warning .button:focus { + background-color: #cc8b00; + color: #0a0a0a; } + .button-group.alert .button, .button-group.alert .button.disabled, .button-group.alert .button[disabled], .button-group.alert .button.disabled:hover, .button-group.alert .button[disabled]:hover, .button-group.alert .button.disabled:focus, .button-group.alert .button[disabled]:focus { + background-color: #cc4b37; + color: #fefefe; } + .button-group.alert .button:hover, .button-group.alert .button:focus { + background-color: #a53b2a; + color: #fefefe; } + .button-group.hollow .button, .button-group.hollow .button:hover, .button-group.hollow .button:focus, .button-group.hollow .button.disabled, .button-group.hollow .button.disabled:hover, .button-group.hollow .button.disabled:focus, .button-group.hollow .button[disabled], .button-group.hollow .button[disabled]:hover, .button-group.hollow .button[disabled]:focus { + background-color: transparent; } + .button-group.hollow .button, .button-group.hollow .button.disabled, .button-group.hollow .button[disabled], .button-group.hollow .button.disabled:hover, .button-group.hollow .button[disabled]:hover, .button-group.hollow .button.disabled:focus, .button-group.hollow .button[disabled]:focus { + border: 1px solid #1779ba; + color: #1779ba; } + .button-group.hollow .button:hover, .button-group.hollow .button:focus { + border-color: #0c3d5d; + color: #0c3d5d; } + .button-group.hollow.primary .button, .button-group.hollow.primary .button.disabled, .button-group.hollow.primary .button[disabled], .button-group.hollow.primary .button.disabled:hover, .button-group.hollow.primary .button[disabled]:hover, .button-group.hollow.primary .button.disabled:focus, .button-group.hollow.primary .button[disabled]:focus, .button-group.hollow .button.primary, .button-group.hollow .button.primary.disabled, .button-group.hollow .button.primary[disabled], .button-group.hollow .button.primary.disabled:hover, .button-group.hollow .button.primary[disabled]:hover, .button-group.hollow .button.primary.disabled:focus, .button-group.hollow .button.primary[disabled]:focus { + border: 1px solid #1779ba; + color: #1779ba; } + .button-group.hollow.primary .button:hover, .button-group.hollow.primary .button:focus, .button-group.hollow .button.primary:hover, .button-group.hollow .button.primary:focus { + border-color: #0c3d5d; + color: #0c3d5d; } + .button-group.hollow.secondary .button, .button-group.hollow.secondary .button.disabled, .button-group.hollow.secondary .button[disabled], .button-group.hollow.secondary .button.disabled:hover, .button-group.hollow.secondary .button[disabled]:hover, .button-group.hollow.secondary .button.disabled:focus, .button-group.hollow.secondary .button[disabled]:focus, .button-group.hollow .button.secondary, .button-group.hollow .button.secondary.disabled, .button-group.hollow .button.secondary[disabled], .button-group.hollow .button.secondary.disabled:hover, .button-group.hollow .button.secondary[disabled]:hover, .button-group.hollow .button.secondary.disabled:focus, .button-group.hollow .button.secondary[disabled]:focus { + border: 1px solid #767676; + color: #767676; } + .button-group.hollow.secondary .button:hover, .button-group.hollow.secondary .button:focus, .button-group.hollow .button.secondary:hover, .button-group.hollow .button.secondary:focus { + border-color: #3b3b3b; + color: #3b3b3b; } + .button-group.hollow.success .button, .button-group.hollow.success .button.disabled, .button-group.hollow.success .button[disabled], .button-group.hollow.success .button.disabled:hover, .button-group.hollow.success .button[disabled]:hover, .button-group.hollow.success .button.disabled:focus, .button-group.hollow.success .button[disabled]:focus, .button-group.hollow .button.success, .button-group.hollow .button.success.disabled, .button-group.hollow .button.success[disabled], .button-group.hollow .button.success.disabled:hover, .button-group.hollow .button.success[disabled]:hover, .button-group.hollow .button.success.disabled:focus, .button-group.hollow .button.success[disabled]:focus { + border: 1px solid #3adb76; + color: #3adb76; } + .button-group.hollow.success .button:hover, .button-group.hollow.success .button:focus, .button-group.hollow .button.success:hover, .button-group.hollow .button.success:focus { + border-color: #157539; + color: #157539; } + .button-group.hollow.warning .button, .button-group.hollow.warning .button.disabled, .button-group.hollow.warning .button[disabled], .button-group.hollow.warning .button.disabled:hover, .button-group.hollow.warning .button[disabled]:hover, .button-group.hollow.warning .button.disabled:focus, .button-group.hollow.warning .button[disabled]:focus, .button-group.hollow .button.warning, .button-group.hollow .button.warning.disabled, .button-group.hollow .button.warning[disabled], .button-group.hollow .button.warning.disabled:hover, .button-group.hollow .button.warning[disabled]:hover, .button-group.hollow .button.warning.disabled:focus, .button-group.hollow .button.warning[disabled]:focus { + border: 1px solid #ffae00; + color: #ffae00; } + .button-group.hollow.warning .button:hover, .button-group.hollow.warning .button:focus, .button-group.hollow .button.warning:hover, .button-group.hollow .button.warning:focus { + border-color: #805700; + color: #805700; } + .button-group.hollow.alert .button, .button-group.hollow.alert .button.disabled, .button-group.hollow.alert .button[disabled], .button-group.hollow.alert .button.disabled:hover, .button-group.hollow.alert .button[disabled]:hover, .button-group.hollow.alert .button.disabled:focus, .button-group.hollow.alert .button[disabled]:focus, .button-group.hollow .button.alert, .button-group.hollow .button.alert.disabled, .button-group.hollow .button.alert[disabled], .button-group.hollow .button.alert.disabled:hover, .button-group.hollow .button.alert[disabled]:hover, .button-group.hollow .button.alert.disabled:focus, .button-group.hollow .button.alert[disabled]:focus { + border: 1px solid #cc4b37; + color: #cc4b37; } + .button-group.hollow.alert .button:hover, .button-group.hollow.alert .button:focus, .button-group.hollow .button.alert:hover, .button-group.hollow .button.alert:focus { + border-color: #67251a; + color: #67251a; } + .button-group.clear .button, .button-group.clear .button:hover, .button-group.clear .button:focus, .button-group.clear .button.disabled, .button-group.clear .button.disabled:hover, .button-group.clear .button.disabled:focus, .button-group.clear .button[disabled], .button-group.clear .button[disabled]:hover, .button-group.clear .button[disabled]:focus { + border-color: transparent; + background-color: transparent; } + .button-group.clear .button, .button-group.clear .button.disabled, .button-group.clear .button[disabled], .button-group.clear .button.disabled:hover, .button-group.clear .button[disabled]:hover, .button-group.clear .button.disabled:focus, .button-group.clear .button[disabled]:focus { + color: #1779ba; } + .button-group.clear .button:hover, .button-group.clear .button:focus { + color: #0c3d5d; } + .button-group.clear.primary .button, .button-group.clear.primary .button.disabled, .button-group.clear.primary .button[disabled], .button-group.clear.primary .button.disabled:hover, .button-group.clear.primary .button[disabled]:hover, .button-group.clear.primary .button.disabled:focus, .button-group.clear.primary .button[disabled]:focus, .button-group.clear .button.primary, .button-group.clear .button.primary.disabled, .button-group.clear .button.primary[disabled], .button-group.clear .button.primary.disabled:hover, .button-group.clear .button.primary[disabled]:hover, .button-group.clear .button.primary.disabled:focus, .button-group.clear .button.primary[disabled]:focus { + color: #1779ba; } + .button-group.clear.primary .button:hover, .button-group.clear.primary .button:focus, .button-group.clear .button.primary:hover, .button-group.clear .button.primary:focus { + color: #0c3d5d; } + .button-group.clear.secondary .button, .button-group.clear.secondary .button.disabled, .button-group.clear.secondary .button[disabled], .button-group.clear.secondary .button.disabled:hover, .button-group.clear.secondary .button[disabled]:hover, .button-group.clear.secondary .button.disabled:focus, .button-group.clear.secondary .button[disabled]:focus, .button-group.clear .button.secondary, .button-group.clear .button.secondary.disabled, .button-group.clear .button.secondary[disabled], .button-group.clear .button.secondary.disabled:hover, .button-group.clear .button.secondary[disabled]:hover, .button-group.clear .button.secondary.disabled:focus, .button-group.clear .button.secondary[disabled]:focus { + color: #767676; } + .button-group.clear.secondary .button:hover, .button-group.clear.secondary .button:focus, .button-group.clear .button.secondary:hover, .button-group.clear .button.secondary:focus { + color: #3b3b3b; } + .button-group.clear.success .button, .button-group.clear.success .button.disabled, .button-group.clear.success .button[disabled], .button-group.clear.success .button.disabled:hover, .button-group.clear.success .button[disabled]:hover, .button-group.clear.success .button.disabled:focus, .button-group.clear.success .button[disabled]:focus, .button-group.clear .button.success, .button-group.clear .button.success.disabled, .button-group.clear .button.success[disabled], .button-group.clear .button.success.disabled:hover, .button-group.clear .button.success[disabled]:hover, .button-group.clear .button.success.disabled:focus, .button-group.clear .button.success[disabled]:focus { + color: #3adb76; } + .button-group.clear.success .button:hover, .button-group.clear.success .button:focus, .button-group.clear .button.success:hover, .button-group.clear .button.success:focus { + color: #157539; } + .button-group.clear.warning .button, .button-group.clear.warning .button.disabled, .button-group.clear.warning .button[disabled], .button-group.clear.warning .button.disabled:hover, .button-group.clear.warning .button[disabled]:hover, .button-group.clear.warning .button.disabled:focus, .button-group.clear.warning .button[disabled]:focus, .button-group.clear .button.warning, .button-group.clear .button.warning.disabled, .button-group.clear .button.warning[disabled], .button-group.clear .button.warning.disabled:hover, .button-group.clear .button.warning[disabled]:hover, .button-group.clear .button.warning.disabled:focus, .button-group.clear .button.warning[disabled]:focus { + color: #ffae00; } + .button-group.clear.warning .button:hover, .button-group.clear.warning .button:focus, .button-group.clear .button.warning:hover, .button-group.clear .button.warning:focus { + color: #805700; } + .button-group.clear.alert .button, .button-group.clear.alert .button.disabled, .button-group.clear.alert .button[disabled], .button-group.clear.alert .button.disabled:hover, .button-group.clear.alert .button[disabled]:hover, .button-group.clear.alert .button.disabled:focus, .button-group.clear.alert .button[disabled]:focus, .button-group.clear .button.alert, .button-group.clear .button.alert.disabled, .button-group.clear .button.alert[disabled], .button-group.clear .button.alert.disabled:hover, .button-group.clear .button.alert[disabled]:hover, .button-group.clear .button.alert.disabled:focus, .button-group.clear .button.alert[disabled]:focus { + color: #cc4b37; } + .button-group.clear.alert .button:hover, .button-group.clear.alert .button:focus, .button-group.clear .button.alert:hover, .button-group.clear .button.alert:focus { + color: #67251a; } + .button-group.no-gaps .button { + margin-right: -0.0625rem; } + .button-group.no-gaps .button + .button { + border-left-color: transparent; } + .button-group.stacked, .button-group.stacked-for-small, .button-group.stacked-for-medium { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .button-group.stacked .button, .button-group.stacked-for-small .button, .button-group.stacked-for-medium .button { + -webkit-box-flex: 0; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; } + .button-group.stacked .button:last-child, .button-group.stacked-for-small .button:last-child, .button-group.stacked-for-medium .button:last-child { + margin-bottom: 0; } + .button-group.stacked.expanded .button, .button-group.stacked-for-small.expanded .button, .button-group.stacked-for-medium.expanded .button { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } + @media print, screen and (min-width: 40em) { + .button-group.stacked-for-small .button { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + margin-bottom: 0; } } + @media print, screen and (min-width: 64em) { + .button-group.stacked-for-medium .button { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + margin-bottom: 0; } } + @media print, screen and (max-width: 39.99875em) { + .button-group.stacked-for-small.expanded { + display: block; } + .button-group.stacked-for-small.expanded .button { + display: block; + margin-right: 0; } } + @media print, screen and (max-width: 63.99875em) { + .button-group.stacked-for-medium.expanded { + display: block; } + .button-group.stacked-for-medium.expanded .button { + display: block; + margin-right: 0; } } + +.close-button { + position: absolute; + z-index: 10; + color: #8a8a8a; + cursor: pointer; } + [data-whatinput='mouse'] .close-button { + outline: 0; } + .close-button:hover, .close-button:focus { + color: #0a0a0a; } + .close-button.small { + right: 0.66rem; + top: 0.33em; + font-size: 1.5em; + line-height: 1; } + .close-button.medium, .close-button { + right: 1rem; + top: 0.5rem; + font-size: 2em; + line-height: 1; } + +.label { + display: inline-block; + padding: 0.33333rem 0.5rem; + border-radius: 0; + font-size: 0.8rem; + line-height: 1; + white-space: nowrap; + cursor: default; + background: #1779ba; + color: #fefefe; } + .label.primary { + background: #1779ba; + color: #fefefe; } + .label.secondary { + background: #767676; + color: #fefefe; } + .label.success { + background: #3adb76; + color: #0a0a0a; } + .label.warning { + background: #ffae00; + color: #0a0a0a; } + .label.alert { + background: #cc4b37; + color: #fefefe; } + +.progress { + height: 1rem; + margin-bottom: 1rem; + border-radius: 0; + background-color: #cacaca; } + .progress.primary .progress-meter { + background-color: #1779ba; } + .progress.secondary .progress-meter { + background-color: #767676; } + .progress.success .progress-meter { + background-color: #3adb76; } + .progress.warning .progress-meter { + background-color: #ffae00; } + .progress.alert .progress-meter { + background-color: #cc4b37; } + +.progress-meter { + position: relative; + display: block; + width: 0%; + height: 100%; + background-color: #1779ba; } + +.progress-meter-text { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + margin: 0; + font-size: 0.75rem; + font-weight: bold; + color: #fefefe; + white-space: nowrap; } + +.slider { + position: relative; + height: 0.5rem; + margin-top: 1.25rem; + margin-bottom: 2.25rem; + background-color: #e6e6e6; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-touch-action: none; + touch-action: none; } + +.slider-fill { + position: absolute; + top: 0; + left: 0; + display: inline-block; + max-width: 100%; + height: 0.5rem; + background-color: #cacaca; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; } + .slider-fill.is-dragging { + -webkit-transition: all 0s linear; + transition: all 0s linear; } + +.slider-handle { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + left: 0; + z-index: 1; + display: inline-block; + width: 1.4rem; + height: 1.4rem; + border-radius: 0; + background-color: #1779ba; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -ms-touch-action: manipulation; + touch-action: manipulation; } + [data-whatinput='mouse'] .slider-handle { + outline: 0; } + .slider-handle:hover { + background-color: #14679e; } + .slider-handle.is-dragging { + -webkit-transition: all 0s linear; + transition: all 0s linear; } + +.slider.disabled, +.slider[disabled] { + opacity: 0.25; + cursor: not-allowed; } + +.slider.vertical { + display: inline-block; + width: 0.5rem; + height: 12.5rem; + margin: 0 1.25rem; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); } + .slider.vertical .slider-fill { + top: 0; + width: 0.5rem; + max-height: 100%; } + .slider.vertical .slider-handle { + position: absolute; + top: 0; + left: 50%; + width: 1.4rem; + height: 1.4rem; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); } + +.switch { + height: 2rem; + position: relative; + margin-bottom: 1rem; + outline: 0; + font-size: 0.875rem; + font-weight: bold; + color: #fefefe; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.switch-input { + position: absolute; + margin-bottom: 0; + opacity: 0; } + +.switch-paddle { + position: relative; + display: block; + width: 4rem; + height: 2rem; + border-radius: 0; + background: #cacaca; + -webkit-transition: all 0.25s ease-out; + transition: all 0.25s ease-out; + font-weight: inherit; + color: inherit; + cursor: pointer; } + input + .switch-paddle { + margin: 0; } + .switch-paddle::after { + position: absolute; + top: 0.25rem; + left: 0.25rem; + display: block; + width: 1.5rem; + height: 1.5rem; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + border-radius: 0; + background: #fefefe; + -webkit-transition: all 0.25s ease-out; + transition: all 0.25s ease-out; + content: ''; } + input:checked ~ .switch-paddle { + background: #1779ba; } + input:checked ~ .switch-paddle::after { + left: 2.25rem; } + input:disabled ~ .switch-paddle { + cursor: not-allowed; + opacity: 0.5; } + [data-whatinput='mouse'] input:focus ~ .switch-paddle { + outline: 0; } + +.switch-active, .switch-inactive { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + +.switch-active { + left: 8%; + display: none; } + input:checked + label > .switch-active { + display: block; } + +.switch-inactive { + right: 15%; } + input:checked + label > .switch-inactive { + display: none; } + +.switch.tiny { + height: 1.5rem; } + .switch.tiny .switch-paddle { + width: 3rem; + height: 1.5rem; + font-size: 0.625rem; } + .switch.tiny .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 1rem; + height: 1rem; } + .switch.tiny input:checked ~ .switch-paddle::after { + left: 1.75rem; } + +.switch.small { + height: 1.75rem; } + .switch.small .switch-paddle { + width: 3.5rem; + height: 1.75rem; + font-size: 0.75rem; } + .switch.small .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 1.25rem; + height: 1.25rem; } + .switch.small input:checked ~ .switch-paddle::after { + left: 2rem; } + +.switch.large { + height: 2.5rem; } + .switch.large .switch-paddle { + width: 5rem; + height: 2.5rem; + font-size: 1rem; } + .switch.large .switch-paddle::after { + top: 0.25rem; + left: 0.25rem; + width: 2rem; + height: 2rem; } + .switch.large input:checked ~ .switch-paddle::after { + left: 2.75rem; } + +table { + border-collapse: collapse; + width: 100%; + margin-bottom: 1rem; + border-radius: 0; } + thead, + tbody, + tfoot { + border: 1px solid #f1f1f1; + background-color: #fefefe; } + caption { + padding: 0.5rem 0.625rem 0.625rem; + font-weight: bold; } + thead { + background: #f8f8f8; + color: #0a0a0a; } + tfoot { + background: #f1f1f1; + color: #0a0a0a; } + thead tr, + tfoot tr { + background: transparent; } + thead th, + thead td, + tfoot th, + tfoot td { + padding: 0.5rem 0.625rem 0.625rem; + font-weight: bold; + text-align: left; } + tbody th, + tbody td { + padding: 0.5rem 0.625rem 0.625rem; } + tbody tr:nth-child(even) { + border-bottom: 0; + background-color: #f1f1f1; } + table.unstriped tbody { + background-color: #fefefe; } + table.unstriped tbody tr { + border-bottom: 0; + border-bottom: 1px solid #f1f1f1; + background-color: #fefefe; } + +@media print, screen and (max-width: 63.99875em) { + table.stack thead { + display: none; } + table.stack tfoot { + display: none; } + table.stack tr, + table.stack th, + table.stack td { + display: block; } + table.stack td { + border-top: 0; } } + +table.scroll { + display: block; + width: 100%; + overflow-x: auto; } + +table.hover thead tr:hover { + background-color: #f3f3f3; } + +table.hover tfoot tr:hover { + background-color: #ececec; } + +table.hover tbody tr:hover { + background-color: #f9f9f9; } + +table.hover:not(.unstriped) tr:nth-of-type(even):hover { + background-color: #ececec; } + +.table-scroll { + overflow-x: auto; } + +.badge { + display: inline-block; + min-width: 2.1em; + padding: 0.3em; + border-radius: 50%; + font-size: 0.6rem; + text-align: center; + background: #1779ba; + color: #fefefe; } + .badge.primary { + background: #1779ba; + color: #fefefe; } + .badge.secondary { + background: #767676; + color: #fefefe; } + .badge.success { + background: #3adb76; + color: #0a0a0a; } + .badge.warning { + background: #ffae00; + color: #0a0a0a; } + .badge.alert { + background: #cc4b37; + color: #fefefe; } + +.breadcrumbs { + margin: 0 0 1rem 0; + list-style: none; } + .breadcrumbs::before, .breadcrumbs::after { + display: table; + content: ' '; + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .breadcrumbs::after { + clear: both; } + .breadcrumbs li { + float: left; + font-size: 0.6875rem; + color: #0a0a0a; + cursor: default; + text-transform: uppercase; } + .breadcrumbs li:not(:last-child)::after { + position: relative; + margin: 0 0.75rem; + opacity: 1; + content: "/"; + color: #cacaca; } + .breadcrumbs a { + color: #1779ba; } + .breadcrumbs a:hover { + text-decoration: underline; } + .breadcrumbs .disabled { + color: #cacaca; + cursor: not-allowed; } + +.callout { + position: relative; + margin: 0 0 1rem 0; + padding: 1rem; + border: 1px solid rgba(10, 10, 10, 0.25); + border-radius: 0; + background-color: white; + color: #0a0a0a; } + .callout > :first-child { + margin-top: 0; } + .callout > :last-child { + margin-bottom: 0; } + .callout.primary { + background-color: #d7ecfa; + color: #0a0a0a; } + .callout.secondary { + background-color: #eaeaea; + color: #0a0a0a; } + .callout.success { + background-color: #e1faea; + color: #0a0a0a; } + .callout.warning { + background-color: #fff3d9; + color: #0a0a0a; } + .callout.alert { + background-color: #f7e4e1; + color: #0a0a0a; } + .callout.small { + padding-top: 0.5rem; + padding-right: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 0.5rem; } + .callout.large { + padding-top: 3rem; + padding-right: 3rem; + padding-bottom: 3rem; + padding-left: 3rem; } + +.card { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + margin-bottom: 1rem; + border: 1px solid #e6e6e6; + border-radius: 0; + background: #fefefe; + -webkit-box-shadow: none; + box-shadow: none; + overflow: hidden; + color: #0a0a0a; } + .card > :last-child { + margin-bottom: 0; } + +.card-divider { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -webkit-flex: 0 1 auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + padding: 1rem; + background: #e6e6e6; } + .card-divider > :last-child { + margin-bottom: 0; } + +.card-section { + -webkit-box-flex: 1; + -webkit-flex: 1 0 auto; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + padding: 1rem; } + .card-section > :last-child { + margin-bottom: 0; } + +.card-image { + min-height: 1px; } + +.dropdown-pane { + position: absolute; + z-index: 10; + display: none; + width: 300px; + padding: 1rem; + visibility: hidden; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + font-size: 1rem; } + .dropdown-pane.is-opening { + display: block; } + .dropdown-pane.is-open { + display: block; + visibility: visible; } + +.dropdown-pane.tiny { + width: 100px; } + +.dropdown-pane.small { + width: 200px; } + +.dropdown-pane.large { + width: 400px; } + +.pagination { + margin-left: 0; + margin-bottom: 1rem; } + .pagination::before, .pagination::after { + display: table; + content: ' '; + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .pagination::after { + clear: both; } + .pagination li { + margin-right: 0.0625rem; + border-radius: 0; + font-size: 0.875rem; + display: none; } + .pagination li:last-child, .pagination li:first-child { + display: inline-block; } + @media print, screen and (min-width: 40em) { + .pagination li { + display: inline-block; } } + .pagination a, + .pagination button { + display: block; + padding: 0.1875rem 0.625rem; + border-radius: 0; + color: #0a0a0a; } + .pagination a:hover, + .pagination button:hover { + background: #e6e6e6; } + .pagination .current { + padding: 0.1875rem 0.625rem; + background: #1779ba; + color: #fefefe; + cursor: default; } + .pagination .disabled { + padding: 0.1875rem 0.625rem; + color: #cacaca; + cursor: not-allowed; } + .pagination .disabled:hover { + background: transparent; } + .pagination .ellipsis::after { + padding: 0.1875rem 0.625rem; + content: '\2026'; + color: #0a0a0a; } + +.pagination-previous a::before, +.pagination-previous.disabled::before { + display: inline-block; + margin-right: 0.5rem; + content: "«"; } + +.pagination-next a::after, +.pagination-next.disabled::after { + display: inline-block; + margin-left: 0.5rem; + content: "»"; } + +.has-tip { + position: relative; + display: inline-block; + border-bottom: dotted 1px #8a8a8a; + font-weight: bold; + cursor: help; } + +.tooltip { + position: absolute; + top: calc(100% + 0.6495rem); + z-index: 1200; + max-width: 10rem; + padding: 0.75rem; + border-radius: 0; + background-color: #0a0a0a; + font-size: 80%; + color: #fefefe; } + .tooltip::before { + position: absolute; } + .tooltip.bottom::before { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 0.75rem; + content: ''; + border-top-width: 0; + border-color: transparent transparent #0a0a0a; + bottom: 100%; } + .tooltip.bottom.align-center::before { + left: 50%; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); } + .tooltip.top::before { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 0.75rem; + content: ''; + border-bottom-width: 0; + border-color: #0a0a0a transparent transparent; + top: 100%; + bottom: auto; } + .tooltip.top.align-center::before { + left: 50%; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); } + .tooltip.left::before { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 0.75rem; + content: ''; + border-right-width: 0; + border-color: transparent transparent transparent #0a0a0a; + left: 100%; } + .tooltip.left.align-center::before { + bottom: auto; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + .tooltip.right::before { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 0.75rem; + content: ''; + border-left-width: 0; + border-color: transparent #0a0a0a transparent transparent; + right: 100%; + left: auto; } + .tooltip.right.align-center::before { + bottom: auto; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + .tooltip.align-top::before { + bottom: auto; + top: 10%; } + .tooltip.align-bottom::before { + bottom: 10%; + top: auto; } + .tooltip.align-left::before { + left: 10%; + right: auto; } + .tooltip.align-right::before { + left: auto; + right: 10%; } + +.accordion { + margin-left: 0; + background: #fefefe; + list-style-type: none; } + .accordion[disabled] .accordion-title { + cursor: not-allowed; } + +.accordion-item:first-child > :first-child { + border-radius: 0 0 0 0; } + +.accordion-item:last-child > :last-child { + border-radius: 0 0 0 0; } + +.accordion-title { + position: relative; + display: block; + padding: 1.25rem 1rem; + border: 1px solid #e6e6e6; + border-bottom: 0; + font-size: 0.75rem; + line-height: 1; + color: #1779ba; } + :last-child:not(.is-active) > .accordion-title { + border-bottom: 1px solid #e6e6e6; + border-radius: 0 0 0 0; } + .accordion-title:hover, .accordion-title:focus { + background-color: #e6e6e6; } + .accordion-title::before { + position: absolute; + top: 50%; + right: 1rem; + margin-top: -0.5rem; + content: "+"; } + .is-active > .accordion-title::before { + content: "–"; } + +.accordion-content { + display: none; + padding: 1rem; + border: 1px solid #e6e6e6; + border-bottom: 0; + background-color: #fefefe; + color: #0a0a0a; } + :last-child > .accordion-content:last-child { + border-bottom: 1px solid #e6e6e6; } + +.media-object { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + margin-bottom: 1rem; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .media-object img { + max-width: none; } + @media print, screen and (max-width: 39.99875em) { + .media-object.stack-for-small { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } } + +.media-object-section { + -webkit-box-flex: 0; + -webkit-flex: 0 1 auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; } + .media-object-section:first-child { + padding-right: 1rem; } + .media-object-section:last-child:not(:nth-child(2)) { + padding-left: 1rem; } + .media-object-section > :last-child { + margin-bottom: 0; } + @media print, screen and (max-width: 39.99875em) { + .stack-for-small .media-object-section { + padding: 0; + padding-bottom: 1rem; + -webkit-flex-basis: 100%; + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + max-width: 100%; } + .stack-for-small .media-object-section img { + width: 100%; } } + .media-object-section.main-section { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } + +.orbit { + position: relative; } + +.orbit-container { + position: relative; + height: 0; + margin: 0; + list-style: none; + overflow: hidden; } + +.orbit-slide { + width: 100%; + position: absolute; } + .orbit-slide.no-motionui.is-active { + top: 0; + left: 0; } + +.orbit-figure { + margin: 0; } + +.orbit-image { + width: 100%; + max-width: 100%; + margin: 0; } + +.orbit-caption { + position: absolute; + bottom: 0; + width: 100%; + margin-bottom: 0; + padding: 1rem; + background-color: rgba(10, 10, 10, 0.5); + color: #fefefe; } + +.orbit-previous, .orbit-next { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + z-index: 10; + padding: 1rem; + color: #fefefe; } + [data-whatinput='mouse'] .orbit-previous, [data-whatinput='mouse'] .orbit-next { + outline: 0; } + .orbit-previous:hover, .orbit-next:hover, .orbit-previous:active, .orbit-next:active, .orbit-previous:focus, .orbit-next:focus { + background-color: rgba(10, 10, 10, 0.5); } + +.orbit-previous { + left: 0; } + +.orbit-next { + left: auto; + right: 0; } + +.orbit-bullets { + position: relative; + margin-top: 0.8rem; + margin-bottom: 0.8rem; + text-align: center; } + [data-whatinput='mouse'] .orbit-bullets { + outline: 0; } + .orbit-bullets button { + width: 1.2rem; + height: 1.2rem; + margin: 0.1rem; + border-radius: 50%; + background-color: #cacaca; } + .orbit-bullets button:hover { + background-color: #8a8a8a; } + .orbit-bullets button.is-active { + background-color: #8a8a8a; } + +.responsive-embed, +.flex-video { + position: relative; + height: 0; + margin-bottom: 1rem; + padding-bottom: 75%; + overflow: hidden; } + .responsive-embed iframe, + .responsive-embed object, + .responsive-embed embed, + .responsive-embed video, + .flex-video iframe, + .flex-video object, + .flex-video embed, + .flex-video video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; } + .responsive-embed.widescreen, + .flex-video.widescreen { + padding-bottom: 56.25%; } + +.tabs { + margin: 0; + border: 1px solid #e6e6e6; + background: #fefefe; + list-style-type: none; } + .tabs::before, .tabs::after { + display: table; + content: ' '; + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .tabs::after { + clear: both; } + +.tabs.vertical > li { + display: block; + float: none; + width: auto; } + +.tabs.simple > li > a { + padding: 0; } + .tabs.simple > li > a:hover { + background: transparent; } + +.tabs.primary { + background: #1779ba; } + .tabs.primary > li > a { + color: #fefefe; } + .tabs.primary > li > a:hover, .tabs.primary > li > a:focus { + background: #1673b1; } + +.tabs-title { + float: left; } + .tabs-title > a { + display: block; + padding: 1.25rem 1.5rem; + font-size: 0.75rem; + line-height: 1; + color: #1779ba; } + [data-whatinput='mouse'] .tabs-title > a { + outline: 0; } + .tabs-title > a:hover { + background: #fefefe; + color: #1468a0; } + .tabs-title > a:focus, .tabs-title > a[aria-selected='true'] { + background: #e6e6e6; + color: #1779ba; } + +.tabs-content { + border: 1px solid #e6e6e6; + border-top: 0; + background: #fefefe; + color: #0a0a0a; + -webkit-transition: all 0.5s ease; + transition: all 0.5s ease; } + +.tabs-content.vertical { + border: 1px solid #e6e6e6; + border-left: 0; } + +.tabs-panel { + display: none; + padding: 1rem; } + .tabs-panel.is-active { + display: block; } + +.thumbnail { + display: inline-block; + max-width: 100%; + margin-bottom: 1rem; + border: 4px solid #fefefe; + border-radius: 0; + -webkit-box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); + box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); + line-height: 0; } + +a.thumbnail { + -webkit-transition: -webkit-box-shadow 200ms ease-out; + transition: -webkit-box-shadow 200ms ease-out; + transition: box-shadow 200ms ease-out; + transition: box-shadow 200ms ease-out, -webkit-box-shadow 200ms ease-out; } + a.thumbnail:hover, a.thumbnail:focus { + -webkit-box-shadow: 0 0 6px 1px rgba(23, 121, 186, 0.5); + box-shadow: 0 0 6px 1px rgba(23, 121, 186, 0.5); } + a.thumbnail image { + -webkit-box-shadow: none; + box-shadow: none; } + +.menu { + padding: 0; + margin: 0; + list-style: none; + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + [data-whatinput='mouse'] .menu li { + outline: 0; } + .menu a, + .menu .button { + line-height: 1; + text-decoration: none; + display: block; + padding: 0.7rem 1rem; } + .menu input, + .menu select, + .menu a, + .menu button { + margin-bottom: 0; } + .menu input { + display: inline-block; } + .menu, .menu.horizontal { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; } + .menu.vertical { + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .menu.vertical.icon-top li a img, + .menu.vertical.icon-top li a i, + .menu.vertical.icon-top li a svg, .menu.vertical.icon-bottom li a img, + .menu.vertical.icon-bottom li a i, + .menu.vertical.icon-bottom li a svg { + text-align: left; } + .menu.expanded li { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } + .menu.expanded.icon-top li a img, + .menu.expanded.icon-top li a i, + .menu.expanded.icon-top li a svg, .menu.expanded.icon-bottom li a img, + .menu.expanded.icon-bottom li a i, + .menu.expanded.icon-bottom li a svg { + text-align: left; } + .menu.simple { + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; } + .menu.simple li + li { + margin-left: 1rem; } + .menu.simple a { + padding: 0; } + @media print, screen and (min-width: 40em) { + .menu.medium-horizontal { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; } + .menu.medium-vertical { + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .menu.medium-expanded li { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } + .menu.medium-simple li { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } } + @media print, screen and (min-width: 64em) { + .menu.large-horizontal { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; } + .menu.large-vertical { + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .menu.large-expanded li { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } + .menu.large-simple li { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } } + .menu.nested { + margin-right: 0; + margin-left: 1rem; } + .menu.icons a { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; } + .menu.icon-top a, .menu.icon-right a, .menu.icon-bottom a, .menu.icon-left a { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; } + .menu.icon-left li a, .menu.nested.icon-left li a { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-flow: row nowrap; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; } + .menu.icon-left li a img, + .menu.icon-left li a i, + .menu.icon-left li a svg, .menu.nested.icon-left li a img, + .menu.nested.icon-left li a i, + .menu.nested.icon-left li a svg { + margin-right: 0.25rem; } + .menu.icon-right li a, .menu.nested.icon-right li a { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-flow: row nowrap; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; } + .menu.icon-right li a img, + .menu.icon-right li a i, + .menu.icon-right li a svg, .menu.nested.icon-right li a img, + .menu.nested.icon-right li a i, + .menu.nested.icon-right li a svg { + margin-left: 0.25rem; } + .menu.icon-top li a, .menu.nested.icon-top li a { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; } + .menu.icon-top li a img, + .menu.icon-top li a i, + .menu.icon-top li a svg, .menu.nested.icon-top li a img, + .menu.nested.icon-top li a i, + .menu.nested.icon-top li a svg { + -webkit-align-self: stretch; + -ms-flex-item-align: stretch; + align-self: stretch; + margin-bottom: 0.25rem; + text-align: center; } + .menu.icon-bottom li a, .menu.nested.icon-bottom li a { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-flow: column nowrap; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; } + .menu.icon-bottom li a img, + .menu.icon-bottom li a i, + .menu.icon-bottom li a svg, .menu.nested.icon-bottom li a img, + .menu.nested.icon-bottom li a i, + .menu.nested.icon-bottom li a svg { + -webkit-align-self: stretch; + -ms-flex-item-align: stretch; + align-self: stretch; + margin-bottom: 0.25rem; + text-align: center; } + .menu .is-active > a { + background: #1779ba; + color: #fefefe; } + .menu .active > a { + background: #1779ba; + color: #fefefe; } + .menu.align-left { + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; } + .menu.align-right li { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; } + .menu.align-right li .submenu li { + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; } + .menu.align-right.vertical li { + display: block; + text-align: right; } + .menu.align-right.vertical li .submenu li { + text-align: right; } + .menu.align-right.icon-top li a img, + .menu.align-right.icon-top li a i, + .menu.align-right.icon-top li a svg, .menu.align-right.icon-bottom li a img, + .menu.align-right.icon-bottom li a i, + .menu.align-right.icon-bottom li a svg { + text-align: right; } + .menu.align-right .nested { + margin-right: 1rem; + margin-left: 0; } + .menu.align-center li { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; } + .menu.align-center li .submenu li { + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; } + .menu .menu-text { + padding: 0.7rem 1rem; + font-weight: bold; + line-height: 1; + color: inherit; } + +.menu-centered > .menu { + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; } + .menu-centered > .menu li { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; } + .menu-centered > .menu li .submenu li { + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; } + +.no-js [data-responsive-menu] ul { + display: none; } + +.menu-icon { + position: relative; + display: inline-block; + vertical-align: middle; + width: 20px; + height: 16px; + cursor: pointer; } + .menu-icon::after { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + height: 2px; + background: #fefefe; + -webkit-box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe; + box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe; + content: ''; } + .menu-icon:hover::after { + background: #cacaca; + -webkit-box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; + box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; } + +.menu-icon.dark { + position: relative; + display: inline-block; + vertical-align: middle; + width: 20px; + height: 16px; + cursor: pointer; } + .menu-icon.dark::after { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + height: 2px; + background: #0a0a0a; + -webkit-box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; + box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; + content: ''; } + .menu-icon.dark:hover::after { + background: #8a8a8a; + -webkit-box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; + box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; } + +.accordion-menu li { + width: 100%; } + +.accordion-menu a { + padding: 0.7rem 1rem; } + +.accordion-menu .is-accordion-submenu a { + padding: 0.7rem 1rem; } + +.accordion-menu .nested.is-accordion-submenu { + margin-right: 0; + margin-left: 1rem; } + +.accordion-menu.align-right .nested.is-accordion-submenu { + margin-right: 1rem; + margin-left: 0; } + +.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle) > a { + position: relative; } + .accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle) > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-bottom-width: 0; + border-color: #1779ba transparent transparent; + position: absolute; + top: 50%; + margin-top: -3px; + right: 1rem; } + +.accordion-menu.align-left .is-accordion-submenu-parent > a::after { + right: 1rem; + left: auto; } + +.accordion-menu.align-right .is-accordion-submenu-parent > a::after { + right: auto; + left: 1rem; } + +.accordion-menu .is-accordion-submenu-parent[aria-expanded='true'] > a::after { + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); + -webkit-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; } + +.is-accordion-submenu-parent { + position: relative; } + +.has-submenu-toggle > a { + margin-right: 40px; } + +.submenu-toggle { + position: absolute; + top: 0; + right: 0; + width: 40px; + height: 40px; + cursor: pointer; } + .submenu-toggle::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-bottom-width: 0; + border-color: #1779ba transparent transparent; + top: 0; + bottom: 0; + margin: auto; } + +.submenu-toggle[aria-expanded='true']::after { + -webkit-transform: scaleY(-1); + -ms-transform: scaleY(-1); + transform: scaleY(-1); + -webkit-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; } + +.submenu-toggle-text { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; } + +.is-drilldown { + position: relative; + overflow: hidden; } + .is-drilldown li { + display: block; } + .is-drilldown.animate-height { + -webkit-transition: height 0.5s; + transition: height 0.5s; } + +.drilldown a { + padding: 0.7rem 1rem; + background: #fefefe; } + +.drilldown .is-drilldown-submenu { + position: absolute; + top: 0; + left: 100%; + z-index: -1; + width: 100%; + background: #fefefe; + -webkit-transition: -webkit-transform 0.15s linear; + transition: -webkit-transform 0.15s linear; + transition: transform 0.15s linear; + transition: transform 0.15s linear, -webkit-transform 0.15s linear; } + .drilldown .is-drilldown-submenu.is-active { + z-index: 1; + display: block; + -webkit-transform: translateX(-100%); + -ms-transform: translateX(-100%); + transform: translateX(-100%); } + .drilldown .is-drilldown-submenu.is-closing { + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); } + .drilldown .is-drilldown-submenu a { + padding: 0.7rem 1rem; } + +.drilldown .nested.is-drilldown-submenu { + margin-right: 0; + margin-left: 0; } + +.drilldown .drilldown-submenu-cover-previous { + min-height: 100%; } + +.drilldown .is-drilldown-submenu-parent > a { + position: relative; } + .drilldown .is-drilldown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-right-width: 0; + border-color: transparent transparent transparent #1779ba; + position: absolute; + top: 50%; + margin-top: -6px; + right: 1rem; } + +.drilldown.align-left .is-drilldown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-right-width: 0; + border-color: transparent transparent transparent #1779ba; + right: 1rem; + left: auto; } + +.drilldown.align-right .is-drilldown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-left-width: 0; + border-color: transparent #1779ba transparent transparent; + right: auto; + left: 1rem; } + +.drilldown .js-drilldown-back > a::before { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-left-width: 0; + border-color: transparent #1779ba transparent transparent; + display: inline-block; + vertical-align: middle; + margin-right: 0.75rem; } + +.dropdown.menu > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; } + +.dropdown.menu > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; } + +.dropdown.menu > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; } + +.dropdown.menu > li.is-dropdown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-bottom-width: 0; + border-color: #1779ba transparent transparent; + right: 5px; + left: auto; + margin-top: -3px; } + +[data-whatinput='mouse'] .dropdown.menu a { + outline: 0; } + +.dropdown.menu > li > a { + padding: 0.7rem 1rem; } + +.dropdown.menu > li.is-active > a { + background: transparent; + color: #1779ba; } + +.no-js .dropdown.menu ul { + display: none; } + +.dropdown.menu .nested.is-dropdown-submenu { + margin-right: 0; + margin-left: 0; } + +.dropdown.menu.vertical > li .is-dropdown-submenu { + top: 0; } + +.dropdown.menu.vertical > li.opens-left > .is-dropdown-submenu { + top: 0; + right: 100%; + left: auto; } + +.dropdown.menu.vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + +.dropdown.menu.vertical > li > a::after { + right: 14px; } + +.dropdown.menu.vertical > li.opens-left > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-left-width: 0; + border-color: transparent #1779ba transparent transparent; + right: auto; + left: 5px; } + +.dropdown.menu.vertical > li.opens-right > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-right-width: 0; + border-color: transparent transparent transparent #1779ba; } + +@media print, screen and (min-width: 40em) { + .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; } + .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; } + .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; } + .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-bottom-width: 0; + border-color: #1779ba transparent transparent; + right: 5px; + left: auto; + margin-top: -3px; } + .dropdown.menu.medium-vertical > li .is-dropdown-submenu { + top: 0; } + .dropdown.menu.medium-vertical > li.opens-left > .is-dropdown-submenu { + top: 0; + right: 100%; + left: auto; } + .dropdown.menu.medium-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + .dropdown.menu.medium-vertical > li > a::after { + right: 14px; } + .dropdown.menu.medium-vertical > li.opens-left > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-left-width: 0; + border-color: transparent #1779ba transparent transparent; + right: auto; + left: 5px; } + .dropdown.menu.medium-vertical > li.opens-right > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-right-width: 0; + border-color: transparent transparent transparent #1779ba; } } + +@media print, screen and (min-width: 64em) { + .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu { + top: 100%; + right: 0; + left: auto; } + .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu { + top: 100%; + right: auto; + left: 0; } + .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a { + position: relative; + padding-right: 1.5rem; } + .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-bottom-width: 0; + border-color: #1779ba transparent transparent; + right: 5px; + left: auto; + margin-top: -3px; } + .dropdown.menu.large-vertical > li .is-dropdown-submenu { + top: 0; } + .dropdown.menu.large-vertical > li.opens-left > .is-dropdown-submenu { + top: 0; + right: 100%; + left: auto; } + .dropdown.menu.large-vertical > li.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + .dropdown.menu.large-vertical > li > a::after { + right: 14px; } + .dropdown.menu.large-vertical > li.opens-left > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-left-width: 0; + border-color: transparent #1779ba transparent transparent; + right: auto; + left: 5px; } + .dropdown.menu.large-vertical > li.opens-right > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-right-width: 0; + border-color: transparent transparent transparent #1779ba; } } + +.dropdown.menu.align-right .is-dropdown-submenu.first-sub { + top: 100%; + right: 0; + left: auto; } + +.is-dropdown-menu.vertical { + width: 100px; } + .is-dropdown-menu.vertical.align-right { + float: right; } + +.is-dropdown-submenu-parent { + position: relative; } + .is-dropdown-submenu-parent a::after { + position: absolute; + top: 50%; + right: 5px; + left: auto; + margin-top: -6px; } + .is-dropdown-submenu-parent.opens-inner > .is-dropdown-submenu { + top: 100%; + left: auto; } + .is-dropdown-submenu-parent.opens-left > .is-dropdown-submenu { + right: 100%; + left: auto; } + .is-dropdown-submenu-parent.opens-right > .is-dropdown-submenu { + right: auto; + left: 100%; } + +.is-dropdown-submenu { + position: absolute; + top: 0; + left: 100%; + z-index: 1; + display: none; + min-width: 200px; + border: 1px solid #cacaca; + background: #fefefe; } + .dropdown .is-dropdown-submenu a { + padding: 0.7rem 1rem; } + .is-dropdown-submenu .is-dropdown-submenu-parent > a::after { + right: 14px; } + .is-dropdown-submenu .is-dropdown-submenu-parent.opens-left > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-left-width: 0; + border-color: transparent #1779ba transparent transparent; + right: auto; + left: 5px; } + .is-dropdown-submenu .is-dropdown-submenu-parent.opens-right > a::after { + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 6px; + content: ''; + border-right-width: 0; + border-color: transparent transparent transparent #1779ba; } + .is-dropdown-submenu .is-dropdown-submenu { + margin-top: -1px; } + .is-dropdown-submenu > li { + width: 100%; } + .is-dropdown-submenu.js-dropdown-active { + display: block; } + +.is-off-canvas-open { + overflow: hidden; } + +.js-off-canvas-overlay { + position: absolute; + top: 0; + left: 0; + z-index: 11; + width: 100%; + height: 100%; + -webkit-transition: opacity 0.5s ease, visibility 0.5s ease; + transition: opacity 0.5s ease, visibility 0.5s ease; + background: rgba(254, 254, 254, 0.25); + opacity: 0; + visibility: hidden; + overflow: hidden; } + .js-off-canvas-overlay.is-visible { + opacity: 1; + visibility: visible; } + .js-off-canvas-overlay.is-closable { + cursor: pointer; } + .js-off-canvas-overlay.is-overlay-absolute { + position: absolute; } + .js-off-canvas-overlay.is-overlay-fixed { + position: fixed; } + +.off-canvas-wrapper { + position: relative; + overflow: hidden; } + +.off-canvas { + position: fixed; + z-index: 12; + -webkit-transition: -webkit-transform 0.5s ease; + transition: -webkit-transform 0.5s ease; + transition: transform 0.5s ease; + transition: transform 0.5s ease, -webkit-transform 0.5s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + background: #e6e6e6; } + [data-whatinput='mouse'] .off-canvas { + outline: 0; } + .off-canvas.is-transition-push { + z-index: 12; } + .off-canvas.is-closed { + visibility: hidden; } + .off-canvas.is-transition-overlap { + z-index: 13; } + .off-canvas.is-transition-overlap.is-open { + -webkit-box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); } + .off-canvas.is-open { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + +.off-canvas-absolute { + position: absolute; + z-index: 12; + -webkit-transition: -webkit-transform 0.5s ease; + transition: -webkit-transform 0.5s ease; + transition: transform 0.5s ease; + transition: transform 0.5s ease, -webkit-transform 0.5s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + background: #e6e6e6; } + [data-whatinput='mouse'] .off-canvas-absolute { + outline: 0; } + .off-canvas-absolute.is-transition-push { + z-index: 12; } + .off-canvas-absolute.is-closed { + visibility: hidden; } + .off-canvas-absolute.is-transition-overlap { + z-index: 13; } + .off-canvas-absolute.is-transition-overlap.is-open { + -webkit-box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); + box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); } + .off-canvas-absolute.is-open { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + +.position-left { + top: 0; + left: 0; + height: 100%; + overflow-y: auto; + width: 250px; + -webkit-transform: translateX(-250px); + -ms-transform: translateX(-250px); + transform: translateX(-250px); } + .off-canvas-content .off-canvas.position-left { + -webkit-transform: translateX(-250px); + -ms-transform: translateX(-250px); + transform: translateX(-250px); } + .off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + .off-canvas-content.is-open-left.has-transition-push { + -webkit-transform: translateX(250px); + -ms-transform: translateX(250px); + transform: translateX(250px); } + .position-left.is-transition-push { + -webkit-box-shadow: inset -13px 0 20px -13px rgba(10, 10, 10, 0.25); + box-shadow: inset -13px 0 20px -13px rgba(10, 10, 10, 0.25); } + +.position-right { + top: 0; + right: 0; + height: 100%; + overflow-y: auto; + width: 250px; + -webkit-transform: translateX(250px); + -ms-transform: translateX(250px); + transform: translateX(250px); } + .off-canvas-content .off-canvas.position-right { + -webkit-transform: translateX(250px); + -ms-transform: translateX(250px); + transform: translateX(250px); } + .off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + .off-canvas-content.is-open-right.has-transition-push { + -webkit-transform: translateX(-250px); + -ms-transform: translateX(-250px); + transform: translateX(-250px); } + .position-right.is-transition-push { + -webkit-box-shadow: inset 13px 0 20px -13px rgba(10, 10, 10, 0.25); + box-shadow: inset 13px 0 20px -13px rgba(10, 10, 10, 0.25); } + +.position-top { + top: 0; + left: 0; + width: 100%; + overflow-x: auto; + height: 250px; + -webkit-transform: translateY(-250px); + -ms-transform: translateY(-250px); + transform: translateY(-250px); } + .off-canvas-content .off-canvas.position-top { + -webkit-transform: translateY(-250px); + -ms-transform: translateY(-250px); + transform: translateY(-250px); } + .off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + .off-canvas-content.is-open-top.has-transition-push { + -webkit-transform: translateY(250px); + -ms-transform: translateY(250px); + transform: translateY(250px); } + .position-top.is-transition-push { + -webkit-box-shadow: inset 0 -13px 20px -13px rgba(10, 10, 10, 0.25); + box-shadow: inset 0 -13px 20px -13px rgba(10, 10, 10, 0.25); } + +.position-bottom { + bottom: 0; + left: 0; + width: 100%; + overflow-x: auto; + height: 250px; + -webkit-transform: translateY(250px); + -ms-transform: translateY(250px); + transform: translateY(250px); } + .off-canvas-content .off-canvas.position-bottom { + -webkit-transform: translateY(250px); + -ms-transform: translateY(250px); + transform: translateY(250px); } + .off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + .off-canvas-content.is-open-bottom.has-transition-push { + -webkit-transform: translateY(-250px); + -ms-transform: translateY(-250px); + transform: translateY(-250px); } + .position-bottom.is-transition-push { + -webkit-box-shadow: inset 0 13px 20px -13px rgba(10, 10, 10, 0.25); + box-shadow: inset 0 13px 20px -13px rgba(10, 10, 10, 0.25); } + +.off-canvas-content { + -webkit-transform: none; + -ms-transform: none; + transform: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + .off-canvas-content.has-transition-overlap, .off-canvas-content.has-transition-push { + -webkit-transition: -webkit-transform 0.5s ease; + transition: -webkit-transform 0.5s ease; + transition: transform 0.5s ease; + transition: transform 0.5s ease, -webkit-transform 0.5s ease; } + .off-canvas-content.has-transition-push { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + .off-canvas-content .off-canvas.is-open { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + +@media print, screen and (min-width: 40em) { + .position-left.reveal-for-medium { + -webkit-transform: none; + -ms-transform: none; + transform: none; + z-index: 12; + -webkit-transition: none; + transition: none; + visibility: visible; } + .position-left.reveal-for-medium .close-button { + display: none; } + .off-canvas-content .position-left.reveal-for-medium { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas-content.has-reveal-left { + margin-left: 250px; } + .position-left.reveal-for-medium ~ .off-canvas-content { + margin-left: 250px; } + .position-right.reveal-for-medium { + -webkit-transform: none; + -ms-transform: none; + transform: none; + z-index: 12; + -webkit-transition: none; + transition: none; + visibility: visible; } + .position-right.reveal-for-medium .close-button { + display: none; } + .off-canvas-content .position-right.reveal-for-medium { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas-content.has-reveal-right { + margin-right: 250px; } + .position-right.reveal-for-medium ~ .off-canvas-content { + margin-right: 250px; } + .position-top.reveal-for-medium { + -webkit-transform: none; + -ms-transform: none; + transform: none; + z-index: 12; + -webkit-transition: none; + transition: none; + visibility: visible; } + .position-top.reveal-for-medium .close-button { + display: none; } + .off-canvas-content .position-top.reveal-for-medium { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas-content.has-reveal-top { + margin-top: 250px; } + .position-top.reveal-for-medium ~ .off-canvas-content { + margin-top: 250px; } + .position-bottom.reveal-for-medium { + -webkit-transform: none; + -ms-transform: none; + transform: none; + z-index: 12; + -webkit-transition: none; + transition: none; + visibility: visible; } + .position-bottom.reveal-for-medium .close-button { + display: none; } + .off-canvas-content .position-bottom.reveal-for-medium { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas-content.has-reveal-bottom { + margin-bottom: 250px; } + .position-bottom.reveal-for-medium ~ .off-canvas-content { + margin-bottom: 250px; } } + +@media print, screen and (min-width: 64em) { + .position-left.reveal-for-large { + -webkit-transform: none; + -ms-transform: none; + transform: none; + z-index: 12; + -webkit-transition: none; + transition: none; + visibility: visible; } + .position-left.reveal-for-large .close-button { + display: none; } + .off-canvas-content .position-left.reveal-for-large { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas-content.has-reveal-left { + margin-left: 250px; } + .position-left.reveal-for-large ~ .off-canvas-content { + margin-left: 250px; } + .position-right.reveal-for-large { + -webkit-transform: none; + -ms-transform: none; + transform: none; + z-index: 12; + -webkit-transition: none; + transition: none; + visibility: visible; } + .position-right.reveal-for-large .close-button { + display: none; } + .off-canvas-content .position-right.reveal-for-large { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas-content.has-reveal-right { + margin-right: 250px; } + .position-right.reveal-for-large ~ .off-canvas-content { + margin-right: 250px; } + .position-top.reveal-for-large { + -webkit-transform: none; + -ms-transform: none; + transform: none; + z-index: 12; + -webkit-transition: none; + transition: none; + visibility: visible; } + .position-top.reveal-for-large .close-button { + display: none; } + .off-canvas-content .position-top.reveal-for-large { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas-content.has-reveal-top { + margin-top: 250px; } + .position-top.reveal-for-large ~ .off-canvas-content { + margin-top: 250px; } + .position-bottom.reveal-for-large { + -webkit-transform: none; + -ms-transform: none; + transform: none; + z-index: 12; + -webkit-transition: none; + transition: none; + visibility: visible; } + .position-bottom.reveal-for-large .close-button { + display: none; } + .off-canvas-content .position-bottom.reveal-for-large { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas-content.has-reveal-bottom { + margin-bottom: 250px; } + .position-bottom.reveal-for-large ~ .off-canvas-content { + margin-bottom: 250px; } } + +@media print, screen and (min-width: 40em) { + .off-canvas.in-canvas-for-medium { + visibility: visible; + height: auto; + position: static; + background: none; + width: auto; + overflow: visible; + -webkit-transition: none; + transition: none; } + .off-canvas.in-canvas-for-medium.position-left, .off-canvas.in-canvas-for-medium.position-right, .off-canvas.in-canvas-for-medium.position-top, .off-canvas.in-canvas-for-medium.position-bottom { + -webkit-box-shadow: none; + box-shadow: none; + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas.in-canvas-for-medium .close-button { + display: none; } } + +@media print, screen and (min-width: 64em) { + .off-canvas.in-canvas-for-large { + visibility: visible; + height: auto; + position: static; + background: none; + width: auto; + overflow: visible; + -webkit-transition: none; + transition: none; } + .off-canvas.in-canvas-for-large.position-left, .off-canvas.in-canvas-for-large.position-right, .off-canvas.in-canvas-for-large.position-top, .off-canvas.in-canvas-for-large.position-bottom { + -webkit-box-shadow: none; + box-shadow: none; + -webkit-transform: none; + -ms-transform: none; + transform: none; } + .off-canvas.in-canvas-for-large .close-button { + display: none; } } + +html.is-reveal-open { + position: fixed; + width: 100%; + overflow-y: hidden; } + html.is-reveal-open.zf-has-scroll { + overflow-y: scroll; } + html.is-reveal-open body { + overflow-y: hidden; } + +.reveal-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1005; + display: none; + background-color: rgba(10, 10, 10, 0.45); + overflow-y: auto; } + +.reveal { + z-index: 1006; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + display: none; + padding: 1rem; + border: 1px solid #cacaca; + border-radius: 0; + background-color: #fefefe; + position: relative; + top: 100px; + margin-right: auto; + margin-left: auto; + overflow-y: auto; } + [data-whatinput='mouse'] .reveal { + outline: 0; } + @media print, screen and (min-width: 40em) { + .reveal { + min-height: 0; } } + .reveal .column { + min-width: 0; } + .reveal > :last-child { + margin-bottom: 0; } + @media print, screen and (min-width: 40em) { + .reveal { + width: 600px; + max-width: 75rem; } } + .reveal.collapse { + padding: 0; } + @media print, screen and (min-width: 40em) { + .reveal.tiny { + width: 30%; + max-width: 75rem; } } + @media print, screen and (min-width: 40em) { + .reveal.small { + width: 50%; + max-width: 75rem; } } + @media print, screen and (min-width: 40em) { + .reveal.large { + width: 90%; + max-width: 75rem; } } + .reveal.full { + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + max-width: none; + height: 100%; + min-height: 100%; + margin-left: 0; + border: 0; + border-radius: 0; } + @media print, screen and (max-width: 39.99875em) { + .reveal { + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + max-width: none; + height: 100%; + min-height: 100%; + margin-left: 0; + border: 0; + border-radius: 0; } } + .reveal.without-overlay { + position: fixed; } + +.sticky-container { + position: relative; } + +.sticky { + position: relative; + z-index: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.sticky.is-stuck { + position: fixed; + z-index: 5; + width: 100%; } + .sticky.is-stuck.is-at-top { + top: 0; } + .sticky.is-stuck.is-at-bottom { + bottom: 0; } + +.sticky.is-anchored { + position: relative; + right: auto; + left: auto; } + .sticky.is-anchored.is-at-bottom { + bottom: 0; } + +.title-bar { + padding: 0.5rem; + background: #0a0a0a; + color: #fefefe; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; } + .title-bar .menu-icon { + margin-left: 0.25rem; + margin-right: 0.25rem; } + +.title-bar-left, +.title-bar-right { + -webkit-box-flex: 1; + -webkit-flex: 1 1 0px; + -ms-flex: 1 1 0px; + flex: 1 1 0px; } + +.title-bar-right { + text-align: right; } + +.title-bar-title { + display: inline-block; + vertical-align: middle; + font-weight: bold; } + +.top-bar { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + padding: 0.5rem; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .top-bar, + .top-bar ul { + background-color: #e6e6e6; } + .top-bar input { + max-width: 200px; + margin-right: 1rem; } + .top-bar .input-group-field { + width: 100%; + margin-right: 0; } + .top-bar input.button { + width: auto; } + .top-bar .top-bar-left, + .top-bar .top-bar-right { + -webkit-box-flex: 0; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + @media print, screen and (min-width: 40em) { + .top-bar { + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .top-bar .top-bar-left { + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + margin-right: auto; } + .top-bar .top-bar-right { + -webkit-box-flex: 0; + -webkit-flex: 0 1 auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + margin-left: auto; } } + @media print, screen and (max-width: 63.99875em) { + .top-bar.stacked-for-medium { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .top-bar.stacked-for-medium .top-bar-left, + .top-bar.stacked-for-medium .top-bar-right { + -webkit-box-flex: 0; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } } + @media print, screen and (max-width: 74.99875em) { + .top-bar.stacked-for-large { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .top-bar.stacked-for-large .top-bar-left, + .top-bar.stacked-for-large .top-bar-right { + -webkit-box-flex: 0; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } } + +.top-bar-title { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + margin: 0.5rem 1rem 0.5rem 0; } + +.top-bar-left, +.top-bar-right { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.float-left { + float: left !important; } + +.float-right { + float: right !important; } + +.float-center { + display: block; + margin-right: auto; + margin-left: auto; } + +.clearfix::before, .clearfix::after { + display: table; + content: ' '; + -webkit-flex-basis: 0; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + +.clearfix::after { + clear: both; } + +.align-left { + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; } + +.align-right { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; } + +.align-center { + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; } + +.align-justify { + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; } + +.align-spaced { + -webkit-justify-content: space-around; + -ms-flex-pack: distribute; + justify-content: space-around; } + +.align-left.vertical.menu > li > a { + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; } + +.align-right.vertical.menu > li > a { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; } + +.align-center.vertical.menu > li > a { + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; } + +.align-top { + -webkit-box-align: start; + -webkit-align-items: flex-start; + -ms-flex-align: start; + align-items: flex-start; } + +.align-self-top { + -webkit-align-self: flex-start; + -ms-flex-item-align: start; + align-self: flex-start; } + +.align-bottom { + -webkit-box-align: end; + -webkit-align-items: flex-end; + -ms-flex-align: end; + align-items: flex-end; } + +.align-self-bottom { + -webkit-align-self: flex-end; + -ms-flex-item-align: end; + align-self: flex-end; } + +.align-middle { + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; } + +.align-self-middle { + -webkit-align-self: center; + -ms-flex-item-align: center; + align-self: center; } + +.align-stretch { + -webkit-box-align: stretch; + -webkit-align-items: stretch; + -ms-flex-align: stretch; + align-items: stretch; } + +.align-self-stretch { + -webkit-align-self: stretch; + -ms-flex-item-align: stretch; + align-self: stretch; } + +.align-center-middle { + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-align-content: center; + -ms-flex-line-pack: center; + align-content: center; } + +.small-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + +.small-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + +.small-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + +.small-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + +.small-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + +.small-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } + +@media print, screen and (min-width: 40em) { + .medium-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .medium-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + .medium-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + .medium-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + .medium-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + .medium-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } } + +@media print, screen and (min-width: 64em) { + .large-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .large-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + .large-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + .large-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + .large-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + .large-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } } + +.flex-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; } + +.flex-child-auto { + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + +.flex-child-grow { + -webkit-box-flex: 1; + -webkit-flex: 1 0 auto; + -ms-flex: 1 0 auto; + flex: 1 0 auto; } + +.flex-child-shrink { + -webkit-box-flex: 0; + -webkit-flex: 0 1 auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; } + +.flex-dir-row { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; } + +.flex-dir-row-reverse { + -webkit-box-orient: horizontal; + -webkit-box-direction: reverse; + -webkit-flex-direction: row-reverse; + -ms-flex-direction: row-reverse; + flex-direction: row-reverse; } + +.flex-dir-column { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + +.flex-dir-column-reverse { + -webkit-box-orient: vertical; + -webkit-box-direction: reverse; + -webkit-flex-direction: column-reverse; + -ms-flex-direction: column-reverse; + flex-direction: column-reverse; } + +@media print, screen and (min-width: 40em) { + .medium-flex-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; } + .medium-flex-child-auto { + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + .medium-flex-child-grow { + -webkit-box-flex: 1; + -webkit-flex: 1 0 auto; + -ms-flex: 1 0 auto; + flex: 1 0 auto; } + .medium-flex-child-shrink { + -webkit-box-flex: 0; + -webkit-flex: 0 1 auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; } + .medium-flex-dir-row { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; } + .medium-flex-dir-row-reverse { + -webkit-box-orient: horizontal; + -webkit-box-direction: reverse; + -webkit-flex-direction: row-reverse; + -ms-flex-direction: row-reverse; + flex-direction: row-reverse; } + .medium-flex-dir-column { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .medium-flex-dir-column-reverse { + -webkit-box-orient: vertical; + -webkit-box-direction: reverse; + -webkit-flex-direction: column-reverse; + -ms-flex-direction: column-reverse; + flex-direction: column-reverse; } } + +@media print, screen and (min-width: 64em) { + .large-flex-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; } + .large-flex-child-auto { + -webkit-box-flex: 1; + -webkit-flex: 1 1 auto; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + .large-flex-child-grow { + -webkit-box-flex: 1; + -webkit-flex: 1 0 auto; + -ms-flex: 1 0 auto; + flex: 1 0 auto; } + .large-flex-child-shrink { + -webkit-box-flex: 0; + -webkit-flex: 0 1 auto; + -ms-flex: 0 1 auto; + flex: 0 1 auto; } + .large-flex-dir-row { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; } + .large-flex-dir-row-reverse { + -webkit-box-orient: horizontal; + -webkit-box-direction: reverse; + -webkit-flex-direction: row-reverse; + -ms-flex-direction: row-reverse; + flex-direction: row-reverse; } + .large-flex-dir-column { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .large-flex-dir-column-reverse { + -webkit-box-orient: vertical; + -webkit-box-direction: reverse; + -webkit-flex-direction: column-reverse; + -ms-flex-direction: column-reverse; + flex-direction: column-reverse; } } + +.hide { + display: none !important; } + +.invisible { + visibility: hidden; } + +.visible { + visibility: visible; } + +@media print, screen and (max-width: 39.99875em) { + .hide-for-small-only { + display: none !important; } } + +@media screen and (max-width: 0em), screen and (min-width: 40em) { + .show-for-small-only { + display: none !important; } } + +@media print, screen and (min-width: 40em) { + .hide-for-medium { + display: none !important; } } + +@media screen and (max-width: 39.99875em) { + .show-for-medium { + display: none !important; } } + +@media print, screen and (min-width: 40em) and (max-width: 63.99875em) { + .hide-for-medium-only { + display: none !important; } } + +@media screen and (max-width: 39.99875em), screen and (min-width: 64em) { + .show-for-medium-only { + display: none !important; } } + +@media print, screen and (min-width: 64em) { + .hide-for-large { + display: none !important; } } + +@media screen and (max-width: 63.99875em) { + .show-for-large { + display: none !important; } } + +@media print, screen and (min-width: 64em) and (max-width: 74.99875em) { + .hide-for-large-only { + display: none !important; } } + +@media screen and (max-width: 63.99875em), screen and (min-width: 75em) { + .show-for-large-only { + display: none !important; } } + +.show-for-sr, +.show-on-focus { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; } + +.show-on-focus:active, .show-on-focus:focus { + position: static !important; + width: auto !important; + height: auto !important; + overflow: visible !important; + clip: auto !important; + white-space: normal !important; } + +.show-for-landscape, +.hide-for-portrait { + display: block !important; } + @media screen and (orientation: landscape) { + .show-for-landscape, + .hide-for-portrait { + display: block !important; } } + @media screen and (orientation: portrait) { + .show-for-landscape, + .hide-for-portrait { + display: none !important; } } + +.hide-for-landscape, +.show-for-portrait { + display: none !important; } + @media screen and (orientation: landscape) { + .hide-for-landscape, + .show-for-portrait { + display: none !important; } } + @media screen and (orientation: portrait) { + .hide-for-landscape, + .show-for-portrait { + display: block !important; } } + +/*# sourceMappingURL=foundation.css.map */ diff --git a/pkgs/csslib/third_party/foundation/foundation.min.css b/pkgs/csslib/third_party/foundation/foundation.min.css new file mode 100644 index 000000000..dec4fbf63 --- /dev/null +++ b/pkgs/csslib/third_party/foundation/foundation.min.css @@ -0,0 +1,2 @@ +@charset "UTF-8";@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{right:auto;left:auto;margin:0 auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:100%}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}body{margin:0;padding:0;background:#fefefe;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;color:#0a0a0a;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle;max-width:100%;height:auto;-ms-interpolation-mode:bicubic}textarea{height:auto;min-height:50px;border-radius:0}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;border-radius:0}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;border-radius:0;background:0 0;line-height:1;cursor:auto}[data-whatinput=mouse] button{outline:0}pre{overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:2.4375rem;margin:0 0 1rem;padding:.5rem;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;-webkit-box-shadow:inset 0 1px 2px rgba(10,10,10,.1);box-shadow:inset 0 1px 2px rgba(10,10,10,.1);font-family:inherit;font-size:1rem;font-weight:400;line-height:1.5;color:#0a0a0a;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;-webkit-appearance:none;-moz-appearance:none;appearance:none}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{outline:0;border:1px solid #8a8a8a;background-color:#fefefe;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;vertical-align:baseline;margin-left:.5rem;margin-right:1rem;margin-bottom:0}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{display:block;margin:0;font-size:.875rem;font-weight:400;line-height:1.8;color:#0a0a0a}label.middle{margin:0 0 1rem;line-height:1.5;padding:.5625rem 0}.help-text{margin-top:-.5rem;font-size:.8125rem;font-style:italic;color:#0a0a0a}.input-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;margin-bottom:1rem;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.input-group>:first-child,.input-group>:first-child.input-group-button>*{border-radius:0}.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{padding:0 1rem;border:1px solid #cacaca;background:#e6e6e6;color:#0a0a0a;text-align:center;white-space:nowrap;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{border-radius:0;-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{padding-top:0;padding-bottom:0;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;height:auto;padding-top:0;padding-bottom:0;font-size:1rem}fieldset{margin:0;padding:0;border:0}legend{max-width:100%;margin-bottom:.5rem}.fieldset{margin:1.125rem 0;padding:1.25rem;border:1px solid #cacaca}.fieldset legend{margin:0;margin-left:-.1875rem;padding:0 .1875rem}select{height:2.4375rem;margin:0 0 1rem;padding:.5rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;font-family:inherit;font-size:1rem;font-weight:400;line-height:1.5;color:#0a0a0a;background-image:url("data:image/svg+xml;utf8,");background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;padding-right:1.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{outline:0;border:1px solid #8a8a8a;background-color:#fefefe;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{height:auto;background-image:none}select:not([multiple]){padding-top:0;padding-bottom:0}.is-invalid-input:not(:focus){border-color:#cc4b37;background-color:#f9ecea}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.is-invalid-label{color:#cc4b37}.form-error{display:none;margin-top:-.5rem;margin-bottom:1rem;font-size:.75rem;font-weight:700;color:#cc4b37}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{margin-bottom:1rem;font-size:inherit;line-height:1.6;text-rendering:optimizeLegibility}em,i{font-style:italic;line-height:inherit}b,strong{font-weight:700;line-height:inherit}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;color:inherit;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{line-height:0;color:#cacaca}.h1,h1{font-size:1.5rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}.h2,h2{font-size:1.25rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}.h3,h3{font-size:1.1875rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}.h4,h4{font-size:1.125rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}.h5,h5{font-size:1.0625rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}.h6,h6{font-size:1rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{line-height:inherit;color:#1779ba;text-decoration:none;cursor:pointer}a:focus,a:hover{color:#1468a0}a img{border:0}hr{clear:both;max-width:75rem;height:0;margin:1.25rem auto;border-top:0;border-right:0;border-bottom:1px solid #cacaca;border-left:0}dl,ol,ul{margin-bottom:1rem;list-style-position:outside;line-height:1.6}li{font-size:inherit}ul{margin-left:1.25rem;list-style-type:disc}ol{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-left:1.25rem;margin-bottom:0}dl{margin-bottom:1rem}dl dt{margin-bottom:.3rem;font-weight:700}blockquote{margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #cacaca}blockquote,blockquote p{line-height:1.6;color:#8a8a8a}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure{margin:0}kbd{margin:0;padding:.125rem .25rem 0;background-color:#e6e6e6;font-family:Consolas,"Liberation Mono",Courier,monospace;color:#0a0a0a}.subheader{margin-top:.2rem;margin-bottom:.5rem;font-weight:400;line-height:1.4;color:#8a8a8a}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{margin-left:0;list-style:none}.cite-block,cite{display:block;color:#8a8a8a;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{border:1px solid #cacaca;background-color:#e6e6e6;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:400;color:#0a0a0a;display:inline;max-width:100%;word-wrap:break-word;padding:.125rem .3125rem .0625rem}.code-block{border:1px solid #cacaca;background-color:#e6e6e6;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:400;color:#0a0a0a;display:block;overflow:auto;white-space:pre;padding:1rem;margin-bottom:1.5rem}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;color:#000!important;-webkit-print-color-adjust:economy;color-adjust:economy;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print{display:table-cell!important}th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^='#']:after,a[href^='javascript:']:after{content:''}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{padding-right:.625rem;padding-left:.625rem;max-width:75rem;margin-left:auto;margin-right:auto}@media print,screen and (min-width:40em){.grid-container{padding-right:.9375rem;padding-left:.9375rem}}.grid-container.fluid{padding-right:.625rem;padding-left:.625rem;max-width:100%;margin-left:auto;margin-right:auto}@media print,screen and (min-width:40em){.grid-container.fluid{padding-right:.9375rem;padding-left:.9375rem}}.grid-container.full{padding-right:0;padding-left:0;max-width:100%;margin-left:auto;margin-right:auto}.grid-x{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto{width:auto}.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{width:calc(100% - 1.25rem);margin-left:.625rem;margin-right:.625rem}@media print,screen and (min-width:40em){.grid-margin-x>.cell{width:calc(100% - 1.875rem);margin-left:.9375rem;margin-right:.9375rem}}.grid-margin-x>.auto{width:auto}.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto{width:auto}.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto{width:auto}.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto{width:auto}.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-right:-.625rem;margin-left:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-right:-.9375rem;margin-left:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-right:-.625rem;margin-left:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-right:-.9375rem;margin-left:-.9375rem}}.grid-padding-x>.cell{padding-right:.625rem;padding-left:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-right:.9375rem;padding-left:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse{margin-right:0;margin-left:0}.small-margin-collapse>.cell{margin-right:0;margin-left:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-right:0;margin-left:0}.small-padding-collapse>.cell{padding-right:0;padding-left:0}@media print,screen and (min-width:40em){.medium-margin-collapse{margin-right:0;margin-left:0}.medium-margin-collapse>.cell{margin-right:0;margin-left:0}}@media print,screen and (min-width:40em){.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}}@media print,screen and (min-width:40em){.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-right:0;margin-left:0}.medium-padding-collapse>.cell{padding-right:0;padding-left:0}}@media print,screen and (min-width:64em){.large-margin-collapse{margin-right:0;margin-left:0}.large-margin-collapse>.cell{margin-right:0;margin-left:0}}@media print,screen and (min-width:64em){.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}}@media print,screen and (min-width:64em){.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:64em){.large-padding-collapse{margin-right:0;margin-left:0}.large-padding-collapse>.cell{padding-right:0;padding-left:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:calc(0% + 1.25rem / 2)}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + 1.25rem / 2)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + 1.25rem / 2)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + 1.25rem / 2)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + 1.25rem / 2)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + 1.25rem / 2)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + 1.25rem / 2)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + 1.25rem / 2)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + 1.25rem / 2)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + 1.25rem / 2)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + 1.25rem / 2)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + 1.25rem / 2)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:calc(0% + 1.875rem / 2)}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + 1.875rem / 2)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + 1.875rem / 2)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + 1.875rem / 2)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + 1.875rem / 2)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + 1.875rem / 2)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + 1.875rem / 2)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + 1.875rem / 2)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + 1.875rem / 2)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + 1.875rem / 2)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + 1.875rem / 2)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + 1.875rem / 2)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:calc(0% + 1.875rem / 2)}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + 1.875rem / 2)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + 1.875rem / 2)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + 1.875rem / 2)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + 1.875rem / 2)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + 1.875rem / 2)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + 1.875rem / 2)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + 1.875rem / 2)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + 1.875rem / 2)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + 1.875rem / 2)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + 1.875rem / 2)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + 1.875rem / 2)}}.grid-y{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto{height:auto}.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-top:-.625rem;margin-bottom:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-top:-.9375rem;margin-bottom:-.9375rem}}.grid-padding-y>.cell{padding-top:.625rem;padding-bottom:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-top:.9375rem;padding-bottom:.9375rem}}.grid-margin-y{margin-top:-.625rem;margin-bottom:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-top:-.9375rem;margin-bottom:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-top:.625rem;margin-bottom:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-top:.9375rem;margin-bottom:.9375rem}}.grid-margin-y>.auto{height:auto}.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto{height:auto}.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto{height:auto}.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto{height:auto}.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame{overflow:hidden;position:relative;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;width:100vw}.cell .grid-frame{width:100%}.cell-block{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{overflow-y:auto;max-height:100%;min-height:100%;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{max-height:100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}@media print,screen and (min-width:40em){.medium-grid-frame{overflow:hidden;position:relative;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.medium-cell-block-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{max-height:100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.medium-cell-block-y{overflow-y:auto;max-height:100%;min-height:100%;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}}@media print,screen and (min-width:64em){.large-grid-frame{overflow:hidden;position:relative;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.large-cell-block-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{max-height:100%;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.large-cell-block-y{overflow-y:auto;max-height:100%;min-height:100%;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}}.grid-y.grid-frame{width:auto;overflow:hidden;position:relative;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;height:100vh}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{width:auto;overflow:hidden;position:relative;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;height:100vh}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{width:auto;overflow:hidden;position:relative;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;height:100vh}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-top:-.625rem;margin-bottom:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-top:-.9375rem;margin-bottom:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-top:.625rem;margin-bottom:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-top:.9375rem;margin-bottom:.9375rem}}.grid-margin-y>.auto{height:auto}.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto{height:auto}.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto{height:auto}.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto{height:auto}.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{display:inline-block;vertical-align:middle;margin:0 0 1rem 0;padding:.85em 1em;border:1px solid transparent;border-radius:0;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;font-family:inherit;font-size:.9rem;-webkit-appearance:none;line-height:1;text-align:center;cursor:pointer}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;width:100%;margin-right:0;margin-left:0}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{border-color:transparent;background-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{opacity:.25;cursor:not-allowed}.button.dropdown::after{display:block;width:0;height:0;border-style:solid;border-width:.4em;content:'';border-bottom-width:0;border-color:#fefefe transparent transparent;position:relative;top:.4em;display:inline-block;float:right;margin-left:1em}.button.dropdown.clear::after,.button.dropdown.hollow::after{border-top-color:#1779ba}.button.dropdown.clear.primary::after,.button.dropdown.hollow.primary::after{border-top-color:#1779ba}.button.dropdown.clear.secondary::after,.button.dropdown.hollow.secondary::after{border-top-color:#767676}.button.dropdown.clear.success::after,.button.dropdown.hollow.success::after{border-top-color:#3adb76}.button.dropdown.clear.warning::after,.button.dropdown.hollow.warning::after{border-top-color:#ffae00}.button.dropdown.clear.alert::after,.button.dropdown.hollow.alert::after{border-top-color:#cc4b37}.button.arrow-only::after{top:-.1em;float:none;margin-left:0}a.button:focus,a.button:hover{text-decoration:none}.button-group{margin-bottom:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.button-group::after,.button-group::before{display:table;content:' ';-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.button-group::after{clear:both}.button-group::after,.button-group::before{display:none}.button-group .button{margin:0;margin-right:1px;margin-bottom:1px;font-size:.9rem;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{border-color:transparent;background-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{position:absolute;z-index:10;color:#8a8a8a;cursor:pointer}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{right:.66rem;top:.33em;font-size:1.5em;line-height:1}.close-button,.close-button.medium{right:1rem;top:.5rem;font-size:2em;line-height:1}.label{display:inline-block;padding:.33333rem .5rem;border-radius:0;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default;background:#1779ba;color:#fefefe}.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{height:1rem;margin-bottom:1rem;border-radius:0;background-color:#cacaca}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{position:relative;display:block;width:0%;height:100%;background-color:#1779ba}.progress-meter-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);margin:0;font-size:.75rem;font-weight:700;color:#fefefe;white-space:nowrap}.slider{position:relative;height:.5rem;margin-top:1.25rem;margin-bottom:2.25rem;background-color:#e6e6e6;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:none;touch-action:none}.slider-fill{position:absolute;top:0;left:0;display:inline-block;max-width:100%;height:.5rem;background-color:#cacaca;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:0;z-index:1;display:inline-block;width:1.4rem;height:1.4rem;border-radius:0;background-color:#1779ba;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-ms-touch-action:manipulation;touch-action:manipulation}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{opacity:.25;cursor:not-allowed}.slider.vertical{display:inline-block;width:.5rem;height:12.5rem;margin:0 1.25rem;-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}.slider.vertical .slider-fill{top:0;width:.5rem;max-height:100%}.slider.vertical .slider-handle{position:absolute;top:0;left:50%;width:1.4rem;height:1.4rem;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.switch{height:2rem;position:relative;margin-bottom:1rem;outline:0;font-size:.875rem;font-weight:700;color:#fefefe;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{position:absolute;margin-bottom:0;opacity:0}.switch-paddle{position:relative;display:block;width:4rem;height:2rem;border-radius:0;background:#cacaca;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;font-weight:inherit;color:inherit;cursor:pointer}input+.switch-paddle{margin:0}.switch-paddle::after{position:absolute;top:.25rem;left:.25rem;display:block;width:1.5rem;height:1.5rem;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-radius:0;background:#fefefe;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;content:''}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle::after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{left:8%;display:none}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{width:3rem;height:1.5rem;font-size:.625rem}.switch.tiny .switch-paddle::after{top:.25rem;left:.25rem;width:1rem;height:1rem}.switch.tiny input:checked~.switch-paddle::after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{width:3.5rem;height:1.75rem;font-size:.75rem}.switch.small .switch-paddle::after{top:.25rem;left:.25rem;width:1.25rem;height:1.25rem}.switch.small input:checked~.switch-paddle::after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{width:5rem;height:2.5rem;font-size:1rem}.switch.large .switch-paddle::after{top:.25rem;left:.25rem;width:2rem;height:2rem}.switch.large input:checked~.switch-paddle::after{left:2.75rem}table{border-collapse:collapse;width:100%;margin-bottom:1rem;border-radius:0}tbody,tfoot,thead{border:1px solid #f1f1f1;background-color:#fefefe}caption{padding:.5rem .625rem .625rem;font-weight:700}thead{background:#f8f8f8;color:#0a0a0a}tfoot{background:#f1f1f1;color:#0a0a0a}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{padding:.5rem .625rem .625rem;font-weight:700;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(even){border-bottom:0;background-color:#f1f1f1}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{border-bottom:0;border-bottom:1px solid #f1f1f1;background-color:#fefefe}@media print,screen and (max-width:63.99875em){table.stack thead{display:none}table.stack tfoot{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;width:100%;overflow-x:auto}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(even):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{display:inline-block;min-width:2.1em;padding:.3em;border-radius:50%;font-size:.6rem;text-align:center;background:#1779ba;color:#fefefe}.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{margin:0 0 1rem 0;list-style:none}.breadcrumbs::after,.breadcrumbs::before{display:table;content:' ';-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.breadcrumbs::after{clear:both}.breadcrumbs li{float:left;font-size:.6875rem;color:#0a0a0a;cursor:default;text-transform:uppercase}.breadcrumbs li:not(:last-child)::after{position:relative;margin:0 .75rem;opacity:1;content:"/";color:#cacaca}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{position:relative;margin:0 0 1rem 0;padding:1rem;border:1px solid rgba(10,10,10,.25);border-radius:0;background-color:#fff;color:#0a0a0a}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding-top:.5rem;padding-right:.5rem;padding-bottom:.5rem;padding-left:.5rem}.callout.large{padding-top:3rem;padding-right:3rem;padding-bottom:3rem;padding-left:3rem}.card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-bottom:1rem;border:1px solid #e6e6e6;border-radius:0;background:#fefefe;-webkit-box-shadow:none;box-shadow:none;overflow:hidden;color:#0a0a0a}.card>:last-child{margin-bottom:0}.card-divider{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem;background:#e6e6e6}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{position:absolute;z-index:10;display:none;width:300px;padding:1rem;visibility:hidden;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;font-size:1rem}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-left:0;margin-bottom:1rem}.pagination::after,.pagination::before{display:table;content:' ';-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.pagination::after{clear:both}.pagination li{margin-right:.0625rem;border-radius:0;font-size:.875rem;display:none}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{display:block;padding:.1875rem .625rem;border-radius:0;color:#0a0a0a}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{padding:.1875rem .625rem;background:#1779ba;color:#fefefe;cursor:default}.pagination .disabled{padding:.1875rem .625rem;color:#cacaca;cursor:not-allowed}.pagination .disabled:hover{background:0 0}.pagination .ellipsis::after{padding:.1875rem .625rem;content:'\2026';color:#0a0a0a}.pagination-previous a::before,.pagination-previous.disabled::before{display:inline-block;margin-right:.5rem;content:"«"}.pagination-next a::after,.pagination-next.disabled::after{display:inline-block;margin-left:.5rem;content:"»"}.has-tip{position:relative;display:inline-block;border-bottom:dotted 1px #8a8a8a;font-weight:700;cursor:help}.tooltip{position:absolute;top:calc(100% + .6495rem);z-index:1200;max-width:10rem;padding:.75rem;border-radius:0;background-color:#0a0a0a;font-size:80%;color:#fefefe}.tooltip::before{position:absolute}.tooltip.bottom::before{display:block;width:0;height:0;border-style:solid;border-width:.75rem;content:'';border-top-width:0;border-color:transparent transparent #0a0a0a;bottom:100%}.tooltip.bottom.align-center::before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top::before{display:block;width:0;height:0;border-style:solid;border-width:.75rem;content:'';border-bottom-width:0;border-color:#0a0a0a transparent transparent;top:100%;bottom:auto}.tooltip.top.align-center::before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left::before{display:block;width:0;height:0;border-style:solid;border-width:.75rem;content:'';border-right-width:0;border-color:transparent transparent transparent #0a0a0a;left:100%}.tooltip.left.align-center::before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right::before{display:block;width:0;height:0;border-style:solid;border-width:.75rem;content:'';border-left-width:0;border-color:transparent #0a0a0a transparent transparent;right:100%;left:auto}.tooltip.right.align-center::before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top::before{bottom:auto;top:10%}.tooltip.align-bottom::before{bottom:10%;top:auto}.tooltip.align-left::before{left:10%;right:auto}.tooltip.align-right::before{left:auto;right:10%}.accordion{margin-left:0;background:#fefefe;list-style-type:none}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child{border-radius:0}.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{position:relative;display:block;padding:1.25rem 1rem;border:1px solid #e6e6e6;border-bottom:0;font-size:.75rem;line-height:1;color:#1779ba}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title::before{position:absolute;top:50%;right:1rem;margin-top:-.5rem;content:"+"}.is-active>.accordion-title::before{content:"–"}.accordion-content{display:none;padding:1rem;border:1px solid #e6e6e6;border-bottom:0;background-color:#fefefe;color:#0a0a0a}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{padding:0;padding-bottom:1rem;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit{position:relative}.orbit-container{position:relative;height:0;margin:0;list-style:none;overflow:hidden}.orbit-slide{width:100%;position:absolute}.orbit-slide.no-motionui.is-active{top:0;left:0}.orbit-figure{margin:0}.orbit-image{width:100%;max-width:100%;margin:0}.orbit-caption{position:absolute;bottom:0;width:100%;margin-bottom:0;padding:1rem;background-color:rgba(10,10,10,.5);color:#fefefe}.orbit-next,.orbit-previous{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10;padding:1rem;color:#fefefe}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:rgba(10,10,10,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{position:relative;margin-top:.8rem;margin-bottom:.8rem;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{width:1.2rem;height:1.2rem;margin:.1rem;border-radius:50%;background-color:#cacaca}.orbit-bullets button:hover{background-color:#8a8a8a}.orbit-bullets button.is-active{background-color:#8a8a8a}.flex-video,.responsive-embed{position:relative;height:0;margin-bottom:1rem;padding-bottom:75%;overflow:hidden}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{position:absolute;top:0;left:0;width:100%;height:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{margin:0;border:1px solid #e6e6e6;background:#fefefe;list-style-type:none}.tabs::after,.tabs::before{display:table;content:' ';-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.tabs::after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{display:block;padding:1.25rem 1.5rem;font-size:.75rem;line-height:1;color:#1779ba}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{border:1px solid #e6e6e6;border-top:0;background:#fefefe;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{display:inline-block;max-width:100%;margin-bottom:1rem;border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px rgba(10,10,10,.2);box-shadow:0 0 0 1px rgba(10,10,10,.2);line-height:0}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{padding:0;margin:0;list-style:none;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{line-height:1;text-decoration:none;display:block;padding:.7rem 1rem}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.menu.vertical{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.menu.medium-vertical{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.menu.medium-expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.menu.large-vertical{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.menu.large-expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-right:0;margin-left:1rem}.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .is-active>a{background:#1779ba;color:#fefefe}.menu .active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.menu.align-right li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg{text-align:right}.menu.align-right .nested{margin-right:1rem;margin-left:0}.menu.align-center li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.menu .menu-text{padding:.7rem 1rem;font-weight:700;line-height:1;color:inherit}.menu-centered>.menu{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{position:relative;display:inline-block;vertical-align:middle;width:20px;height:16px;cursor:pointer}.menu-icon::after{position:absolute;top:0;left:0;display:block;width:100%;height:2px;background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:''}.menu-icon:hover::after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{position:relative;display:inline-block;vertical-align:middle;width:20px;height:16px;cursor:pointer}.menu-icon.dark::after{position:absolute;top:0;left:0;display:block;width:100%;height:2px;background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:''}.menu-icon.dark:hover::after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu a{padding:.7rem 1rem}.accordion-menu .is-accordion-submenu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-right:0;margin-left:1rem}.accordion-menu.align-right .nested.is-accordion-submenu{margin-right:1rem;margin-left:0}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-bottom-width:0;border-color:#1779ba transparent transparent;position:absolute;top:50%;margin-top:-3px;right:1rem}.accordion-menu.align-left .is-accordion-submenu-parent>a::after{right:1rem;left:auto}.accordion-menu.align-right .is-accordion-submenu-parent>a::after{right:auto;left:1rem}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a::after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{position:absolute;top:0;right:0;width:40px;height:40px;cursor:pointer}.submenu-toggle::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-bottom-width:0;border-color:#1779ba transparent transparent;top:0;bottom:0;margin:auto}.submenu-toggle[aria-expanded=true]::after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.is-drilldown{position:relative;overflow:hidden}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{padding:.7rem 1rem;background:#fefefe}.drilldown .is-drilldown-submenu{position:absolute;top:0;left:100%;z-index:-1;width:100%;background:#fefefe;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear}.drilldown .is-drilldown-submenu.is-active{z-index:1;display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%)}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-right:0;margin-left:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-right-width:0;border-color:transparent transparent transparent #1779ba;position:absolute;top:50%;margin-top:-6px;right:1rem}.drilldown.align-left .is-drilldown-submenu-parent>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-right-width:0;border-color:transparent transparent transparent #1779ba;right:1rem;left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-left-width:0;border-color:transparent #1779ba transparent transparent;right:auto;left:1rem}.drilldown .js-drilldown-back>a::before{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-left-width:0;border-color:transparent #1779ba transparent transparent;display:inline-block;vertical-align:middle;margin-right:.75rem}.dropdown.menu>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu>li.is-dropdown-submenu-parent>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-bottom-width:0;border-color:#1779ba transparent transparent;right:5px;left:auto;margin-top:-3px}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-right:0;margin-left:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{top:0;right:100%;left:auto}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.vertical>li>a::after{right:14px}.dropdown.menu.vertical>li.opens-left>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-left-width:0;border-color:transparent #1779ba transparent transparent;right:auto;left:5px}.dropdown.menu.vertical>li.opens-right>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-right-width:0;border-color:transparent transparent transparent #1779ba}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-bottom-width:0;border-color:#1779ba transparent transparent;right:5px;left:auto;margin-top:-3px}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{top:0;right:100%;left:auto}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.medium-vertical>li>a::after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-left-width:0;border-color:transparent #1779ba transparent transparent;right:auto;left:5px}.dropdown.menu.medium-vertical>li.opens-right>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-right-width:0;border-color:transparent transparent transparent #1779ba}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-bottom-width:0;border-color:#1779ba transparent transparent;right:5px;left:auto;margin-top:-3px}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{top:0;right:100%;left:auto}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.large-vertical>li>a::after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-left-width:0;border-color:transparent #1779ba transparent transparent;right:auto;left:5px}.dropdown.menu.large-vertical>li.opens-right>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-right-width:0;border-color:transparent transparent transparent #1779ba}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{top:100%;right:0;left:auto}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a::after{position:absolute;top:50%;right:5px;left:auto;margin-top:-6px}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{top:100%;left:auto}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{right:100%;left:auto}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{right:auto;left:100%}.is-dropdown-submenu{position:absolute;top:0;left:100%;z-index:1;display:none;min-width:200px;border:1px solid #cacaca;background:#fefefe}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a::after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-left-width:0;border-color:transparent #1779ba transparent transparent;right:auto;left:5px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a::after{display:block;width:0;height:0;border-style:solid;border-width:6px;content:'';border-right-width:0;border-color:transparent transparent transparent #1779ba}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{position:absolute;top:0;left:0;z-index:11;width:100%;height:100%;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;background:rgba(254,254,254,.25);opacity:0;visibility:hidden;overflow:hidden}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{position:relative;overflow:hidden}.off-canvas{position:fixed;z-index:12;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px rgba(10,10,10,.7);box-shadow:0 0 10px rgba(10,10,10,.7)}.off-canvas.is-open{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.off-canvas-absolute{position:absolute;z-index:12;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px rgba(10,10,10,.7);box-shadow:0 0 10px rgba(10,10,10,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.position-left{top:0;left:0;height:100%;overflow-y:auto;width:250px;-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px rgba(10,10,10,.25);box-shadow:inset -13px 0 20px -13px rgba(10,10,10,.25)}.position-right{top:0;right:0;height:100%;overflow-y:auto;width:250px;-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px rgba(10,10,10,.25);box-shadow:inset 13px 0 20px -13px rgba(10,10,10,.25)}.position-top{top:0;left:0;width:100%;overflow-x:auto;height:250px;-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px rgba(10,10,10,.25);box-shadow:inset 0 -13px 20px -13px rgba(10,10,10,.25)}.position-bottom{bottom:0;left:0;width:100%;overflow-x:auto;height:250px;-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px rgba(10,10,10,.25);box-shadow:inset 0 13px 20px -13px rgba(10,10,10,.25)}.off-canvas-content{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-backface-visibility:hidden;backface-visibility:hidden}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content.has-transition-push{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.off-canvas-content .off-canvas.is-open{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;z-index:12;-webkit-transition:none;transition:none;visibility:visible}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left{margin-left:250px}.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;z-index:12;-webkit-transition:none;transition:none;visibility:visible}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right{margin-right:250px}.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;z-index:12;-webkit-transition:none;transition:none;visibility:visible}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top{margin-top:250px}.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;z-index:12;-webkit-transition:none;transition:none;visibility:visible}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom{margin-bottom:250px}.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;z-index:12;-webkit-transition:none;transition:none;visibility:visible}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left{margin-left:250px}.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;z-index:12;-webkit-transition:none;transition:none;visibility:visible}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right{margin-right:250px}.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;z-index:12;-webkit-transition:none;transition:none;visibility:visible}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top{margin-top:250px}.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;z-index:12;-webkit-transition:none;transition:none;visibility:visible}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom{margin-bottom:250px}.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{visibility:visible;height:auto;position:static;background:0 0;width:auto;overflow:visible;-webkit-transition:none;transition:none}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{visibility:visible;height:auto;position:static;background:0 0;width:auto;overflow:visible;-webkit-transition:none;transition:none}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{position:fixed;width:100%;overflow-y:hidden}html.is-reveal-open.zf-has-scroll{overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1005;display:none;background-color:rgba(10,10,10,.45);overflow-y:auto}.reveal{z-index:1006;-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;padding:1rem;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;position:relative;top:100px;margin-right:auto;margin-left:auto;overflow-y:auto}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{width:600px;max-width:75rem}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{width:30%;max-width:75rem}}@media print,screen and (min-width:40em){.reveal.small{width:50%;max-width:75rem}}@media print,screen and (min-width:40em){.reveal.large{width:90%;max-width:75rem}}.reveal.full{top:0;right:0;bottom:0;left:0;width:100%;max-width:none;height:100%;min-height:100%;margin-left:0;border:0;border-radius:0}@media print,screen and (max-width:39.99875em){.reveal{top:0;right:0;bottom:0;left:0;width:100%;max-width:none;height:100%;min-height:100%;margin-left:0;border:0;border-radius:0}}.reveal.without-overlay{position:fixed}.sticky-container{position:relative}.sticky{position:relative;z-index:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.sticky.is-stuck{position:fixed;z-index:5;width:100%}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{position:relative;right:auto;left:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{padding:.5rem;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;vertical-align:middle;font-weight:700}.top-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:.5rem;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{max-width:200px;margin-right:1rem}.top-bar .input-group-field{width:100%;margin-right:0}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-right:auto;margin-left:auto}.clearfix::after,.clearfix::before{display:table;content:' ';-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.clearfix::after{clear:both}.align-left{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.align-spaced{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.align-top{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.align-self-top{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}.align-self-bottom{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.align-middle{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.align-self-middle{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.align-self-stretch{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center}.small-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em) and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em) and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.show-on-focus:active,.show-on-focus:focus{position:static!important;width:auto!important;height:auto!important;overflow:visible!important;clip:auto!important;white-space:normal!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}} +/*# sourceMappingURL=foundation.min.css.map */ diff --git a/pkgs/csslib/third_party/html5-boilerplate/LICENSE.txt b/pkgs/csslib/third_party/html5-boilerplate/LICENSE.txt new file mode 100644 index 000000000..294e91d80 --- /dev/null +++ b/pkgs/csslib/third_party/html5-boilerplate/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) HTML5 Boilerplate + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pkgs/csslib/third_party/html5-boilerplate/README.md b/pkgs/csslib/third_party/html5-boilerplate/README.md new file mode 100644 index 000000000..3ca556d0f --- /dev/null +++ b/pkgs/csslib/third_party/html5-boilerplate/README.md @@ -0,0 +1,4 @@ +This folder contains sample css files from the open-source project +https://github.com/h5bp/html5-boilerplate. + +This code was included under the terms in the `LICENSE.txt` file. \ No newline at end of file diff --git a/pkgs/csslib/third_party/html5-boilerplate/normalize.css b/pkgs/csslib/third_party/html5-boilerplate/normalize.css new file mode 100644 index 000000000..192eb9ce4 --- /dev/null +++ b/pkgs/csslib/third_party/html5-boilerplate/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/pkgs/csslib/third_party/html5-boilerplate/style.css b/pkgs/csslib/third_party/html5-boilerplate/style.css new file mode 100644 index 000000000..416a37ec7 --- /dev/null +++ b/pkgs/csslib/third_party/html5-boilerplate/style.css @@ -0,0 +1,263 @@ +/*! HTML5 Boilerplate v8.0.0 | MIT License | https://html5boilerplate.com/ */ + +/* main.css 2.1.0 | MIT License | https://github.com/h5bp/main.css#readme */ +/* + * What follows is the result of much research on cross-browser styling. + * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, + * Kroc Camen, and the H5BP dev community and team. + */ + +/* ========================================================================== + Base styles: opinionated defaults + ========================================================================== */ + +html { + color: #222; + font-size: 1em; + line-height: 1.4; +} + +/* + * Remove text-shadow in selection highlight: + * https://twitter.com/miketaylr/status/12228805301 + * + * Vendor-prefixed and regular ::selection selectors cannot be combined: + * https://stackoverflow.com/a/16982510/7133471 + * + * Customize the background color to match your design. + */ + +::-moz-selection { + background: #b3d4fc; + text-shadow: none; +} + +::selection { + background: #b3d4fc; + text-shadow: none; +} + +/* + * A better looking default horizontal rule + */ + +hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; +} + +/* + * Remove the gap between audio, canvas, iframes, + * images, videos and the bottom of their containers: + * https://github.com/h5bp/html5-boilerplate/issues/440 + */ + +audio, +canvas, +iframe, +img, +svg, +video { + vertical-align: middle; +} + +/* + * Remove default fieldset styles. + */ + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +/* + * Allow only vertical resizing of textareas. + */ + +textarea { + resize: vertical; +} + +/* ========================================================================== + Author's custom styles + ========================================================================== */ + +/* ========================================================================== + Helper classes + ========================================================================== */ + +/* + * Hide visually and from screen readers + */ + +.hidden, +[hidden] { + display: none !important; +} + +/* + * Hide only visually, but have it available for screen readers: + * https://snook.ca/archives/html_and_css/hiding-content-for-accessibility + * + * 1. For long content, line feeds are not interpreted as spaces and small width + * causes content to wrap 1 word per line: + * https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe + */ + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + white-space: nowrap; + width: 1px; + /* 1 */ +} + +/* + * Extends the .sr-only class to allow the element + * to be focusable when navigated to via the keyboard: + * https://www.drupal.org/node/897638 + */ + +.sr-only.focusable:active, +.sr-only.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + white-space: inherit; + width: auto; +} + +/* + * Hide visually and from screen readers, but maintain layout + */ + +.invisible { + visibility: hidden; +} + +/* + * Clearfix: contain floats + * + * For modern browsers + * 1. The space content is one way to avoid an Opera bug when the + * `contenteditable` attribute is included anywhere else in the document. + * Otherwise it causes space to appear at the top and bottom of elements + * that receive the `clearfix` class. + * 2. The use of `table` rather than `block` is only necessary if using + * `:before` to contain the top-margins of child elements. + */ + +.clearfix::before, +.clearfix::after { + content: " "; + display: table; +} + +.clearfix::after { + clear: both; +} + +/* ========================================================================== + EXAMPLE Media Queries for Responsive Design. + These examples override the primary ('mobile first') styles. + Modify as content requires. + ========================================================================== */ + +@media only screen and (min-width: 35em) { + /* Style adjustments for viewports that meet the condition */ +} + +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 1.25dppx), + (min-resolution: 120dpi) { + /* Style adjustments for high resolution devices */ +} + +/* ========================================================================== + Print styles. + Inlined to avoid the additional HTTP request: + https://www.phpied.com/delay-loading-your-print-css/ + ========================================================================== */ + +@media print { + *, + *::before, + *::after { + background: #fff !important; + color: #000 !important; + /* Black prints faster */ + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]::after { + content: " (" attr(href) ")"; + } + + abbr[title]::after { + content: " (" attr(title) ")"; + } + + /* + * Don't show links that are fragment identifiers, + * or use the `javascript:` pseudo protocol + */ + a[href^="#"]::after, + a[href^="javascript:"]::after { + content: ""; + } + + pre { + white-space: pre-wrap !important; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + /* + * Printing Tables: + * https://web.archive.org/web/20180815150934/http://css-discuss.incutio.com/wiki/Printing_Tables + */ + thead { + display: table-header-group; + } + + tr, + img { + page-break-inside: avoid; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } +} + diff --git a/pkgs/csslib/third_party/materialize/LICENSE b/pkgs/csslib/third_party/materialize/LICENSE new file mode 100644 index 000000000..c790fc282 --- /dev/null +++ b/pkgs/csslib/third_party/materialize/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2019 Materialize + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pkgs/csslib/third_party/materialize/README.md b/pkgs/csslib/third_party/materialize/README.md new file mode 100644 index 000000000..2be2627a9 --- /dev/null +++ b/pkgs/csslib/third_party/materialize/README.md @@ -0,0 +1,4 @@ +This folder contains sample css files from the open-source project +https://github.com/Dogfalo/materialize. + +This code was included under the terms in the `LICENSE` file. \ No newline at end of file diff --git a/pkgs/csslib/third_party/materialize/materialize.css b/pkgs/csslib/third_party/materialize/materialize.css new file mode 100644 index 000000000..bc6c1fe4a --- /dev/null +++ b/pkgs/csslib/third_party/materialize/materialize.css @@ -0,0 +1,9067 @@ +/*! + * Materialize v1.0.0 (http://materializecss.com) + * Copyright 2014-2017 Materialize + * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) + */ +.materialize-red { + background-color: #e51c23 !important; +} + +.materialize-red-text { + color: #e51c23 !important; +} + +.materialize-red.lighten-5 { + background-color: #fdeaeb !important; +} + +.materialize-red-text.text-lighten-5 { + color: #fdeaeb !important; +} + +.materialize-red.lighten-4 { + background-color: #f8c1c3 !important; +} + +.materialize-red-text.text-lighten-4 { + color: #f8c1c3 !important; +} + +.materialize-red.lighten-3 { + background-color: #f3989b !important; +} + +.materialize-red-text.text-lighten-3 { + color: #f3989b !important; +} + +.materialize-red.lighten-2 { + background-color: #ee6e73 !important; +} + +.materialize-red-text.text-lighten-2 { + color: #ee6e73 !important; +} + +.materialize-red.lighten-1 { + background-color: #ea454b !important; +} + +.materialize-red-text.text-lighten-1 { + color: #ea454b !important; +} + +.materialize-red.darken-1 { + background-color: #d0181e !important; +} + +.materialize-red-text.text-darken-1 { + color: #d0181e !important; +} + +.materialize-red.darken-2 { + background-color: #b9151b !important; +} + +.materialize-red-text.text-darken-2 { + color: #b9151b !important; +} + +.materialize-red.darken-3 { + background-color: #a21318 !important; +} + +.materialize-red-text.text-darken-3 { + color: #a21318 !important; +} + +.materialize-red.darken-4 { + background-color: #8b1014 !important; +} + +.materialize-red-text.text-darken-4 { + color: #8b1014 !important; +} + +.red { + background-color: #F44336 !important; +} + +.red-text { + color: #F44336 !important; +} + +.red.lighten-5 { + background-color: #FFEBEE !important; +} + +.red-text.text-lighten-5 { + color: #FFEBEE !important; +} + +.red.lighten-4 { + background-color: #FFCDD2 !important; +} + +.red-text.text-lighten-4 { + color: #FFCDD2 !important; +} + +.red.lighten-3 { + background-color: #EF9A9A !important; +} + +.red-text.text-lighten-3 { + color: #EF9A9A !important; +} + +.red.lighten-2 { + background-color: #E57373 !important; +} + +.red-text.text-lighten-2 { + color: #E57373 !important; +} + +.red.lighten-1 { + background-color: #EF5350 !important; +} + +.red-text.text-lighten-1 { + color: #EF5350 !important; +} + +.red.darken-1 { + background-color: #E53935 !important; +} + +.red-text.text-darken-1 { + color: #E53935 !important; +} + +.red.darken-2 { + background-color: #D32F2F !important; +} + +.red-text.text-darken-2 { + color: #D32F2F !important; +} + +.red.darken-3 { + background-color: #C62828 !important; +} + +.red-text.text-darken-3 { + color: #C62828 !important; +} + +.red.darken-4 { + background-color: #B71C1C !important; +} + +.red-text.text-darken-4 { + color: #B71C1C !important; +} + +.red.accent-1 { + background-color: #FF8A80 !important; +} + +.red-text.text-accent-1 { + color: #FF8A80 !important; +} + +.red.accent-2 { + background-color: #FF5252 !important; +} + +.red-text.text-accent-2 { + color: #FF5252 !important; +} + +.red.accent-3 { + background-color: #FF1744 !important; +} + +.red-text.text-accent-3 { + color: #FF1744 !important; +} + +.red.accent-4 { + background-color: #D50000 !important; +} + +.red-text.text-accent-4 { + color: #D50000 !important; +} + +.pink { + background-color: #e91e63 !important; +} + +.pink-text { + color: #e91e63 !important; +} + +.pink.lighten-5 { + background-color: #fce4ec !important; +} + +.pink-text.text-lighten-5 { + color: #fce4ec !important; +} + +.pink.lighten-4 { + background-color: #f8bbd0 !important; +} + +.pink-text.text-lighten-4 { + color: #f8bbd0 !important; +} + +.pink.lighten-3 { + background-color: #f48fb1 !important; +} + +.pink-text.text-lighten-3 { + color: #f48fb1 !important; +} + +.pink.lighten-2 { + background-color: #f06292 !important; +} + +.pink-text.text-lighten-2 { + color: #f06292 !important; +} + +.pink.lighten-1 { + background-color: #ec407a !important; +} + +.pink-text.text-lighten-1 { + color: #ec407a !important; +} + +.pink.darken-1 { + background-color: #d81b60 !important; +} + +.pink-text.text-darken-1 { + color: #d81b60 !important; +} + +.pink.darken-2 { + background-color: #c2185b !important; +} + +.pink-text.text-darken-2 { + color: #c2185b !important; +} + +.pink.darken-3 { + background-color: #ad1457 !important; +} + +.pink-text.text-darken-3 { + color: #ad1457 !important; +} + +.pink.darken-4 { + background-color: #880e4f !important; +} + +.pink-text.text-darken-4 { + color: #880e4f !important; +} + +.pink.accent-1 { + background-color: #ff80ab !important; +} + +.pink-text.text-accent-1 { + color: #ff80ab !important; +} + +.pink.accent-2 { + background-color: #ff4081 !important; +} + +.pink-text.text-accent-2 { + color: #ff4081 !important; +} + +.pink.accent-3 { + background-color: #f50057 !important; +} + +.pink-text.text-accent-3 { + color: #f50057 !important; +} + +.pink.accent-4 { + background-color: #c51162 !important; +} + +.pink-text.text-accent-4 { + color: #c51162 !important; +} + +.purple { + background-color: #9c27b0 !important; +} + +.purple-text { + color: #9c27b0 !important; +} + +.purple.lighten-5 { + background-color: #f3e5f5 !important; +} + +.purple-text.text-lighten-5 { + color: #f3e5f5 !important; +} + +.purple.lighten-4 { + background-color: #e1bee7 !important; +} + +.purple-text.text-lighten-4 { + color: #e1bee7 !important; +} + +.purple.lighten-3 { + background-color: #ce93d8 !important; +} + +.purple-text.text-lighten-3 { + color: #ce93d8 !important; +} + +.purple.lighten-2 { + background-color: #ba68c8 !important; +} + +.purple-text.text-lighten-2 { + color: #ba68c8 !important; +} + +.purple.lighten-1 { + background-color: #ab47bc !important; +} + +.purple-text.text-lighten-1 { + color: #ab47bc !important; +} + +.purple.darken-1 { + background-color: #8e24aa !important; +} + +.purple-text.text-darken-1 { + color: #8e24aa !important; +} + +.purple.darken-2 { + background-color: #7b1fa2 !important; +} + +.purple-text.text-darken-2 { + color: #7b1fa2 !important; +} + +.purple.darken-3 { + background-color: #6a1b9a !important; +} + +.purple-text.text-darken-3 { + color: #6a1b9a !important; +} + +.purple.darken-4 { + background-color: #4a148c !important; +} + +.purple-text.text-darken-4 { + color: #4a148c !important; +} + +.purple.accent-1 { + background-color: #ea80fc !important; +} + +.purple-text.text-accent-1 { + color: #ea80fc !important; +} + +.purple.accent-2 { + background-color: #e040fb !important; +} + +.purple-text.text-accent-2 { + color: #e040fb !important; +} + +.purple.accent-3 { + background-color: #d500f9 !important; +} + +.purple-text.text-accent-3 { + color: #d500f9 !important; +} + +.purple.accent-4 { + background-color: #aa00ff !important; +} + +.purple-text.text-accent-4 { + color: #aa00ff !important; +} + +.deep-purple { + background-color: #673ab7 !important; +} + +.deep-purple-text { + color: #673ab7 !important; +} + +.deep-purple.lighten-5 { + background-color: #ede7f6 !important; +} + +.deep-purple-text.text-lighten-5 { + color: #ede7f6 !important; +} + +.deep-purple.lighten-4 { + background-color: #d1c4e9 !important; +} + +.deep-purple-text.text-lighten-4 { + color: #d1c4e9 !important; +} + +.deep-purple.lighten-3 { + background-color: #b39ddb !important; +} + +.deep-purple-text.text-lighten-3 { + color: #b39ddb !important; +} + +.deep-purple.lighten-2 { + background-color: #9575cd !important; +} + +.deep-purple-text.text-lighten-2 { + color: #9575cd !important; +} + +.deep-purple.lighten-1 { + background-color: #7e57c2 !important; +} + +.deep-purple-text.text-lighten-1 { + color: #7e57c2 !important; +} + +.deep-purple.darken-1 { + background-color: #5e35b1 !important; +} + +.deep-purple-text.text-darken-1 { + color: #5e35b1 !important; +} + +.deep-purple.darken-2 { + background-color: #512da8 !important; +} + +.deep-purple-text.text-darken-2 { + color: #512da8 !important; +} + +.deep-purple.darken-3 { + background-color: #4527a0 !important; +} + +.deep-purple-text.text-darken-3 { + color: #4527a0 !important; +} + +.deep-purple.darken-4 { + background-color: #311b92 !important; +} + +.deep-purple-text.text-darken-4 { + color: #311b92 !important; +} + +.deep-purple.accent-1 { + background-color: #b388ff !important; +} + +.deep-purple-text.text-accent-1 { + color: #b388ff !important; +} + +.deep-purple.accent-2 { + background-color: #7c4dff !important; +} + +.deep-purple-text.text-accent-2 { + color: #7c4dff !important; +} + +.deep-purple.accent-3 { + background-color: #651fff !important; +} + +.deep-purple-text.text-accent-3 { + color: #651fff !important; +} + +.deep-purple.accent-4 { + background-color: #6200ea !important; +} + +.deep-purple-text.text-accent-4 { + color: #6200ea !important; +} + +.indigo { + background-color: #3f51b5 !important; +} + +.indigo-text { + color: #3f51b5 !important; +} + +.indigo.lighten-5 { + background-color: #e8eaf6 !important; +} + +.indigo-text.text-lighten-5 { + color: #e8eaf6 !important; +} + +.indigo.lighten-4 { + background-color: #c5cae9 !important; +} + +.indigo-text.text-lighten-4 { + color: #c5cae9 !important; +} + +.indigo.lighten-3 { + background-color: #9fa8da !important; +} + +.indigo-text.text-lighten-3 { + color: #9fa8da !important; +} + +.indigo.lighten-2 { + background-color: #7986cb !important; +} + +.indigo-text.text-lighten-2 { + color: #7986cb !important; +} + +.indigo.lighten-1 { + background-color: #5c6bc0 !important; +} + +.indigo-text.text-lighten-1 { + color: #5c6bc0 !important; +} + +.indigo.darken-1 { + background-color: #3949ab !important; +} + +.indigo-text.text-darken-1 { + color: #3949ab !important; +} + +.indigo.darken-2 { + background-color: #303f9f !important; +} + +.indigo-text.text-darken-2 { + color: #303f9f !important; +} + +.indigo.darken-3 { + background-color: #283593 !important; +} + +.indigo-text.text-darken-3 { + color: #283593 !important; +} + +.indigo.darken-4 { + background-color: #1a237e !important; +} + +.indigo-text.text-darken-4 { + color: #1a237e !important; +} + +.indigo.accent-1 { + background-color: #8c9eff !important; +} + +.indigo-text.text-accent-1 { + color: #8c9eff !important; +} + +.indigo.accent-2 { + background-color: #536dfe !important; +} + +.indigo-text.text-accent-2 { + color: #536dfe !important; +} + +.indigo.accent-3 { + background-color: #3d5afe !important; +} + +.indigo-text.text-accent-3 { + color: #3d5afe !important; +} + +.indigo.accent-4 { + background-color: #304ffe !important; +} + +.indigo-text.text-accent-4 { + color: #304ffe !important; +} + +.blue { + background-color: #2196F3 !important; +} + +.blue-text { + color: #2196F3 !important; +} + +.blue.lighten-5 { + background-color: #E3F2FD !important; +} + +.blue-text.text-lighten-5 { + color: #E3F2FD !important; +} + +.blue.lighten-4 { + background-color: #BBDEFB !important; +} + +.blue-text.text-lighten-4 { + color: #BBDEFB !important; +} + +.blue.lighten-3 { + background-color: #90CAF9 !important; +} + +.blue-text.text-lighten-3 { + color: #90CAF9 !important; +} + +.blue.lighten-2 { + background-color: #64B5F6 !important; +} + +.blue-text.text-lighten-2 { + color: #64B5F6 !important; +} + +.blue.lighten-1 { + background-color: #42A5F5 !important; +} + +.blue-text.text-lighten-1 { + color: #42A5F5 !important; +} + +.blue.darken-1 { + background-color: #1E88E5 !important; +} + +.blue-text.text-darken-1 { + color: #1E88E5 !important; +} + +.blue.darken-2 { + background-color: #1976D2 !important; +} + +.blue-text.text-darken-2 { + color: #1976D2 !important; +} + +.blue.darken-3 { + background-color: #1565C0 !important; +} + +.blue-text.text-darken-3 { + color: #1565C0 !important; +} + +.blue.darken-4 { + background-color: #0D47A1 !important; +} + +.blue-text.text-darken-4 { + color: #0D47A1 !important; +} + +.blue.accent-1 { + background-color: #82B1FF !important; +} + +.blue-text.text-accent-1 { + color: #82B1FF !important; +} + +.blue.accent-2 { + background-color: #448AFF !important; +} + +.blue-text.text-accent-2 { + color: #448AFF !important; +} + +.blue.accent-3 { + background-color: #2979FF !important; +} + +.blue-text.text-accent-3 { + color: #2979FF !important; +} + +.blue.accent-4 { + background-color: #2962FF !important; +} + +.blue-text.text-accent-4 { + color: #2962FF !important; +} + +.light-blue { + background-color: #03a9f4 !important; +} + +.light-blue-text { + color: #03a9f4 !important; +} + +.light-blue.lighten-5 { + background-color: #e1f5fe !important; +} + +.light-blue-text.text-lighten-5 { + color: #e1f5fe !important; +} + +.light-blue.lighten-4 { + background-color: #b3e5fc !important; +} + +.light-blue-text.text-lighten-4 { + color: #b3e5fc !important; +} + +.light-blue.lighten-3 { + background-color: #81d4fa !important; +} + +.light-blue-text.text-lighten-3 { + color: #81d4fa !important; +} + +.light-blue.lighten-2 { + background-color: #4fc3f7 !important; +} + +.light-blue-text.text-lighten-2 { + color: #4fc3f7 !important; +} + +.light-blue.lighten-1 { + background-color: #29b6f6 !important; +} + +.light-blue-text.text-lighten-1 { + color: #29b6f6 !important; +} + +.light-blue.darken-1 { + background-color: #039be5 !important; +} + +.light-blue-text.text-darken-1 { + color: #039be5 !important; +} + +.light-blue.darken-2 { + background-color: #0288d1 !important; +} + +.light-blue-text.text-darken-2 { + color: #0288d1 !important; +} + +.light-blue.darken-3 { + background-color: #0277bd !important; +} + +.light-blue-text.text-darken-3 { + color: #0277bd !important; +} + +.light-blue.darken-4 { + background-color: #01579b !important; +} + +.light-blue-text.text-darken-4 { + color: #01579b !important; +} + +.light-blue.accent-1 { + background-color: #80d8ff !important; +} + +.light-blue-text.text-accent-1 { + color: #80d8ff !important; +} + +.light-blue.accent-2 { + background-color: #40c4ff !important; +} + +.light-blue-text.text-accent-2 { + color: #40c4ff !important; +} + +.light-blue.accent-3 { + background-color: #00b0ff !important; +} + +.light-blue-text.text-accent-3 { + color: #00b0ff !important; +} + +.light-blue.accent-4 { + background-color: #0091ea !important; +} + +.light-blue-text.text-accent-4 { + color: #0091ea !important; +} + +.cyan { + background-color: #00bcd4 !important; +} + +.cyan-text { + color: #00bcd4 !important; +} + +.cyan.lighten-5 { + background-color: #e0f7fa !important; +} + +.cyan-text.text-lighten-5 { + color: #e0f7fa !important; +} + +.cyan.lighten-4 { + background-color: #b2ebf2 !important; +} + +.cyan-text.text-lighten-4 { + color: #b2ebf2 !important; +} + +.cyan.lighten-3 { + background-color: #80deea !important; +} + +.cyan-text.text-lighten-3 { + color: #80deea !important; +} + +.cyan.lighten-2 { + background-color: #4dd0e1 !important; +} + +.cyan-text.text-lighten-2 { + color: #4dd0e1 !important; +} + +.cyan.lighten-1 { + background-color: #26c6da !important; +} + +.cyan-text.text-lighten-1 { + color: #26c6da !important; +} + +.cyan.darken-1 { + background-color: #00acc1 !important; +} + +.cyan-text.text-darken-1 { + color: #00acc1 !important; +} + +.cyan.darken-2 { + background-color: #0097a7 !important; +} + +.cyan-text.text-darken-2 { + color: #0097a7 !important; +} + +.cyan.darken-3 { + background-color: #00838f !important; +} + +.cyan-text.text-darken-3 { + color: #00838f !important; +} + +.cyan.darken-4 { + background-color: #006064 !important; +} + +.cyan-text.text-darken-4 { + color: #006064 !important; +} + +.cyan.accent-1 { + background-color: #84ffff !important; +} + +.cyan-text.text-accent-1 { + color: #84ffff !important; +} + +.cyan.accent-2 { + background-color: #18ffff !important; +} + +.cyan-text.text-accent-2 { + color: #18ffff !important; +} + +.cyan.accent-3 { + background-color: #00e5ff !important; +} + +.cyan-text.text-accent-3 { + color: #00e5ff !important; +} + +.cyan.accent-4 { + background-color: #00b8d4 !important; +} + +.cyan-text.text-accent-4 { + color: #00b8d4 !important; +} + +.teal { + background-color: #009688 !important; +} + +.teal-text { + color: #009688 !important; +} + +.teal.lighten-5 { + background-color: #e0f2f1 !important; +} + +.teal-text.text-lighten-5 { + color: #e0f2f1 !important; +} + +.teal.lighten-4 { + background-color: #b2dfdb !important; +} + +.teal-text.text-lighten-4 { + color: #b2dfdb !important; +} + +.teal.lighten-3 { + background-color: #80cbc4 !important; +} + +.teal-text.text-lighten-3 { + color: #80cbc4 !important; +} + +.teal.lighten-2 { + background-color: #4db6ac !important; +} + +.teal-text.text-lighten-2 { + color: #4db6ac !important; +} + +.teal.lighten-1 { + background-color: #26a69a !important; +} + +.teal-text.text-lighten-1 { + color: #26a69a !important; +} + +.teal.darken-1 { + background-color: #00897b !important; +} + +.teal-text.text-darken-1 { + color: #00897b !important; +} + +.teal.darken-2 { + background-color: #00796b !important; +} + +.teal-text.text-darken-2 { + color: #00796b !important; +} + +.teal.darken-3 { + background-color: #00695c !important; +} + +.teal-text.text-darken-3 { + color: #00695c !important; +} + +.teal.darken-4 { + background-color: #004d40 !important; +} + +.teal-text.text-darken-4 { + color: #004d40 !important; +} + +.teal.accent-1 { + background-color: #a7ffeb !important; +} + +.teal-text.text-accent-1 { + color: #a7ffeb !important; +} + +.teal.accent-2 { + background-color: #64ffda !important; +} + +.teal-text.text-accent-2 { + color: #64ffda !important; +} + +.teal.accent-3 { + background-color: #1de9b6 !important; +} + +.teal-text.text-accent-3 { + color: #1de9b6 !important; +} + +.teal.accent-4 { + background-color: #00bfa5 !important; +} + +.teal-text.text-accent-4 { + color: #00bfa5 !important; +} + +.green { + background-color: #4CAF50 !important; +} + +.green-text { + color: #4CAF50 !important; +} + +.green.lighten-5 { + background-color: #E8F5E9 !important; +} + +.green-text.text-lighten-5 { + color: #E8F5E9 !important; +} + +.green.lighten-4 { + background-color: #C8E6C9 !important; +} + +.green-text.text-lighten-4 { + color: #C8E6C9 !important; +} + +.green.lighten-3 { + background-color: #A5D6A7 !important; +} + +.green-text.text-lighten-3 { + color: #A5D6A7 !important; +} + +.green.lighten-2 { + background-color: #81C784 !important; +} + +.green-text.text-lighten-2 { + color: #81C784 !important; +} + +.green.lighten-1 { + background-color: #66BB6A !important; +} + +.green-text.text-lighten-1 { + color: #66BB6A !important; +} + +.green.darken-1 { + background-color: #43A047 !important; +} + +.green-text.text-darken-1 { + color: #43A047 !important; +} + +.green.darken-2 { + background-color: #388E3C !important; +} + +.green-text.text-darken-2 { + color: #388E3C !important; +} + +.green.darken-3 { + background-color: #2E7D32 !important; +} + +.green-text.text-darken-3 { + color: #2E7D32 !important; +} + +.green.darken-4 { + background-color: #1B5E20 !important; +} + +.green-text.text-darken-4 { + color: #1B5E20 !important; +} + +.green.accent-1 { + background-color: #B9F6CA !important; +} + +.green-text.text-accent-1 { + color: #B9F6CA !important; +} + +.green.accent-2 { + background-color: #69F0AE !important; +} + +.green-text.text-accent-2 { + color: #69F0AE !important; +} + +.green.accent-3 { + background-color: #00E676 !important; +} + +.green-text.text-accent-3 { + color: #00E676 !important; +} + +.green.accent-4 { + background-color: #00C853 !important; +} + +.green-text.text-accent-4 { + color: #00C853 !important; +} + +.light-green { + background-color: #8bc34a !important; +} + +.light-green-text { + color: #8bc34a !important; +} + +.light-green.lighten-5 { + background-color: #f1f8e9 !important; +} + +.light-green-text.text-lighten-5 { + color: #f1f8e9 !important; +} + +.light-green.lighten-4 { + background-color: #dcedc8 !important; +} + +.light-green-text.text-lighten-4 { + color: #dcedc8 !important; +} + +.light-green.lighten-3 { + background-color: #c5e1a5 !important; +} + +.light-green-text.text-lighten-3 { + color: #c5e1a5 !important; +} + +.light-green.lighten-2 { + background-color: #aed581 !important; +} + +.light-green-text.text-lighten-2 { + color: #aed581 !important; +} + +.light-green.lighten-1 { + background-color: #9ccc65 !important; +} + +.light-green-text.text-lighten-1 { + color: #9ccc65 !important; +} + +.light-green.darken-1 { + background-color: #7cb342 !important; +} + +.light-green-text.text-darken-1 { + color: #7cb342 !important; +} + +.light-green.darken-2 { + background-color: #689f38 !important; +} + +.light-green-text.text-darken-2 { + color: #689f38 !important; +} + +.light-green.darken-3 { + background-color: #558b2f !important; +} + +.light-green-text.text-darken-3 { + color: #558b2f !important; +} + +.light-green.darken-4 { + background-color: #33691e !important; +} + +.light-green-text.text-darken-4 { + color: #33691e !important; +} + +.light-green.accent-1 { + background-color: #ccff90 !important; +} + +.light-green-text.text-accent-1 { + color: #ccff90 !important; +} + +.light-green.accent-2 { + background-color: #b2ff59 !important; +} + +.light-green-text.text-accent-2 { + color: #b2ff59 !important; +} + +.light-green.accent-3 { + background-color: #76ff03 !important; +} + +.light-green-text.text-accent-3 { + color: #76ff03 !important; +} + +.light-green.accent-4 { + background-color: #64dd17 !important; +} + +.light-green-text.text-accent-4 { + color: #64dd17 !important; +} + +.lime { + background-color: #cddc39 !important; +} + +.lime-text { + color: #cddc39 !important; +} + +.lime.lighten-5 { + background-color: #f9fbe7 !important; +} + +.lime-text.text-lighten-5 { + color: #f9fbe7 !important; +} + +.lime.lighten-4 { + background-color: #f0f4c3 !important; +} + +.lime-text.text-lighten-4 { + color: #f0f4c3 !important; +} + +.lime.lighten-3 { + background-color: #e6ee9c !important; +} + +.lime-text.text-lighten-3 { + color: #e6ee9c !important; +} + +.lime.lighten-2 { + background-color: #dce775 !important; +} + +.lime-text.text-lighten-2 { + color: #dce775 !important; +} + +.lime.lighten-1 { + background-color: #d4e157 !important; +} + +.lime-text.text-lighten-1 { + color: #d4e157 !important; +} + +.lime.darken-1 { + background-color: #c0ca33 !important; +} + +.lime-text.text-darken-1 { + color: #c0ca33 !important; +} + +.lime.darken-2 { + background-color: #afb42b !important; +} + +.lime-text.text-darken-2 { + color: #afb42b !important; +} + +.lime.darken-3 { + background-color: #9e9d24 !important; +} + +.lime-text.text-darken-3 { + color: #9e9d24 !important; +} + +.lime.darken-4 { + background-color: #827717 !important; +} + +.lime-text.text-darken-4 { + color: #827717 !important; +} + +.lime.accent-1 { + background-color: #f4ff81 !important; +} + +.lime-text.text-accent-1 { + color: #f4ff81 !important; +} + +.lime.accent-2 { + background-color: #eeff41 !important; +} + +.lime-text.text-accent-2 { + color: #eeff41 !important; +} + +.lime.accent-3 { + background-color: #c6ff00 !important; +} + +.lime-text.text-accent-3 { + color: #c6ff00 !important; +} + +.lime.accent-4 { + background-color: #aeea00 !important; +} + +.lime-text.text-accent-4 { + color: #aeea00 !important; +} + +.yellow { + background-color: #ffeb3b !important; +} + +.yellow-text { + color: #ffeb3b !important; +} + +.yellow.lighten-5 { + background-color: #fffde7 !important; +} + +.yellow-text.text-lighten-5 { + color: #fffde7 !important; +} + +.yellow.lighten-4 { + background-color: #fff9c4 !important; +} + +.yellow-text.text-lighten-4 { + color: #fff9c4 !important; +} + +.yellow.lighten-3 { + background-color: #fff59d !important; +} + +.yellow-text.text-lighten-3 { + color: #fff59d !important; +} + +.yellow.lighten-2 { + background-color: #fff176 !important; +} + +.yellow-text.text-lighten-2 { + color: #fff176 !important; +} + +.yellow.lighten-1 { + background-color: #ffee58 !important; +} + +.yellow-text.text-lighten-1 { + color: #ffee58 !important; +} + +.yellow.darken-1 { + background-color: #fdd835 !important; +} + +.yellow-text.text-darken-1 { + color: #fdd835 !important; +} + +.yellow.darken-2 { + background-color: #fbc02d !important; +} + +.yellow-text.text-darken-2 { + color: #fbc02d !important; +} + +.yellow.darken-3 { + background-color: #f9a825 !important; +} + +.yellow-text.text-darken-3 { + color: #f9a825 !important; +} + +.yellow.darken-4 { + background-color: #f57f17 !important; +} + +.yellow-text.text-darken-4 { + color: #f57f17 !important; +} + +.yellow.accent-1 { + background-color: #ffff8d !important; +} + +.yellow-text.text-accent-1 { + color: #ffff8d !important; +} + +.yellow.accent-2 { + background-color: #ffff00 !important; +} + +.yellow-text.text-accent-2 { + color: #ffff00 !important; +} + +.yellow.accent-3 { + background-color: #ffea00 !important; +} + +.yellow-text.text-accent-3 { + color: #ffea00 !important; +} + +.yellow.accent-4 { + background-color: #ffd600 !important; +} + +.yellow-text.text-accent-4 { + color: #ffd600 !important; +} + +.amber { + background-color: #ffc107 !important; +} + +.amber-text { + color: #ffc107 !important; +} + +.amber.lighten-5 { + background-color: #fff8e1 !important; +} + +.amber-text.text-lighten-5 { + color: #fff8e1 !important; +} + +.amber.lighten-4 { + background-color: #ffecb3 !important; +} + +.amber-text.text-lighten-4 { + color: #ffecb3 !important; +} + +.amber.lighten-3 { + background-color: #ffe082 !important; +} + +.amber-text.text-lighten-3 { + color: #ffe082 !important; +} + +.amber.lighten-2 { + background-color: #ffd54f !important; +} + +.amber-text.text-lighten-2 { + color: #ffd54f !important; +} + +.amber.lighten-1 { + background-color: #ffca28 !important; +} + +.amber-text.text-lighten-1 { + color: #ffca28 !important; +} + +.amber.darken-1 { + background-color: #ffb300 !important; +} + +.amber-text.text-darken-1 { + color: #ffb300 !important; +} + +.amber.darken-2 { + background-color: #ffa000 !important; +} + +.amber-text.text-darken-2 { + color: #ffa000 !important; +} + +.amber.darken-3 { + background-color: #ff8f00 !important; +} + +.amber-text.text-darken-3 { + color: #ff8f00 !important; +} + +.amber.darken-4 { + background-color: #ff6f00 !important; +} + +.amber-text.text-darken-4 { + color: #ff6f00 !important; +} + +.amber.accent-1 { + background-color: #ffe57f !important; +} + +.amber-text.text-accent-1 { + color: #ffe57f !important; +} + +.amber.accent-2 { + background-color: #ffd740 !important; +} + +.amber-text.text-accent-2 { + color: #ffd740 !important; +} + +.amber.accent-3 { + background-color: #ffc400 !important; +} + +.amber-text.text-accent-3 { + color: #ffc400 !important; +} + +.amber.accent-4 { + background-color: #ffab00 !important; +} + +.amber-text.text-accent-4 { + color: #ffab00 !important; +} + +.orange { + background-color: #ff9800 !important; +} + +.orange-text { + color: #ff9800 !important; +} + +.orange.lighten-5 { + background-color: #fff3e0 !important; +} + +.orange-text.text-lighten-5 { + color: #fff3e0 !important; +} + +.orange.lighten-4 { + background-color: #ffe0b2 !important; +} + +.orange-text.text-lighten-4 { + color: #ffe0b2 !important; +} + +.orange.lighten-3 { + background-color: #ffcc80 !important; +} + +.orange-text.text-lighten-3 { + color: #ffcc80 !important; +} + +.orange.lighten-2 { + background-color: #ffb74d !important; +} + +.orange-text.text-lighten-2 { + color: #ffb74d !important; +} + +.orange.lighten-1 { + background-color: #ffa726 !important; +} + +.orange-text.text-lighten-1 { + color: #ffa726 !important; +} + +.orange.darken-1 { + background-color: #fb8c00 !important; +} + +.orange-text.text-darken-1 { + color: #fb8c00 !important; +} + +.orange.darken-2 { + background-color: #f57c00 !important; +} + +.orange-text.text-darken-2 { + color: #f57c00 !important; +} + +.orange.darken-3 { + background-color: #ef6c00 !important; +} + +.orange-text.text-darken-3 { + color: #ef6c00 !important; +} + +.orange.darken-4 { + background-color: #e65100 !important; +} + +.orange-text.text-darken-4 { + color: #e65100 !important; +} + +.orange.accent-1 { + background-color: #ffd180 !important; +} + +.orange-text.text-accent-1 { + color: #ffd180 !important; +} + +.orange.accent-2 { + background-color: #ffab40 !important; +} + +.orange-text.text-accent-2 { + color: #ffab40 !important; +} + +.orange.accent-3 { + background-color: #ff9100 !important; +} + +.orange-text.text-accent-3 { + color: #ff9100 !important; +} + +.orange.accent-4 { + background-color: #ff6d00 !important; +} + +.orange-text.text-accent-4 { + color: #ff6d00 !important; +} + +.deep-orange { + background-color: #ff5722 !important; +} + +.deep-orange-text { + color: #ff5722 !important; +} + +.deep-orange.lighten-5 { + background-color: #fbe9e7 !important; +} + +.deep-orange-text.text-lighten-5 { + color: #fbe9e7 !important; +} + +.deep-orange.lighten-4 { + background-color: #ffccbc !important; +} + +.deep-orange-text.text-lighten-4 { + color: #ffccbc !important; +} + +.deep-orange.lighten-3 { + background-color: #ffab91 !important; +} + +.deep-orange-text.text-lighten-3 { + color: #ffab91 !important; +} + +.deep-orange.lighten-2 { + background-color: #ff8a65 !important; +} + +.deep-orange-text.text-lighten-2 { + color: #ff8a65 !important; +} + +.deep-orange.lighten-1 { + background-color: #ff7043 !important; +} + +.deep-orange-text.text-lighten-1 { + color: #ff7043 !important; +} + +.deep-orange.darken-1 { + background-color: #f4511e !important; +} + +.deep-orange-text.text-darken-1 { + color: #f4511e !important; +} + +.deep-orange.darken-2 { + background-color: #e64a19 !important; +} + +.deep-orange-text.text-darken-2 { + color: #e64a19 !important; +} + +.deep-orange.darken-3 { + background-color: #d84315 !important; +} + +.deep-orange-text.text-darken-3 { + color: #d84315 !important; +} + +.deep-orange.darken-4 { + background-color: #bf360c !important; +} + +.deep-orange-text.text-darken-4 { + color: #bf360c !important; +} + +.deep-orange.accent-1 { + background-color: #ff9e80 !important; +} + +.deep-orange-text.text-accent-1 { + color: #ff9e80 !important; +} + +.deep-orange.accent-2 { + background-color: #ff6e40 !important; +} + +.deep-orange-text.text-accent-2 { + color: #ff6e40 !important; +} + +.deep-orange.accent-3 { + background-color: #ff3d00 !important; +} + +.deep-orange-text.text-accent-3 { + color: #ff3d00 !important; +} + +.deep-orange.accent-4 { + background-color: #dd2c00 !important; +} + +.deep-orange-text.text-accent-4 { + color: #dd2c00 !important; +} + +.brown { + background-color: #795548 !important; +} + +.brown-text { + color: #795548 !important; +} + +.brown.lighten-5 { + background-color: #efebe9 !important; +} + +.brown-text.text-lighten-5 { + color: #efebe9 !important; +} + +.brown.lighten-4 { + background-color: #d7ccc8 !important; +} + +.brown-text.text-lighten-4 { + color: #d7ccc8 !important; +} + +.brown.lighten-3 { + background-color: #bcaaa4 !important; +} + +.brown-text.text-lighten-3 { + color: #bcaaa4 !important; +} + +.brown.lighten-2 { + background-color: #a1887f !important; +} + +.brown-text.text-lighten-2 { + color: #a1887f !important; +} + +.brown.lighten-1 { + background-color: #8d6e63 !important; +} + +.brown-text.text-lighten-1 { + color: #8d6e63 !important; +} + +.brown.darken-1 { + background-color: #6d4c41 !important; +} + +.brown-text.text-darken-1 { + color: #6d4c41 !important; +} + +.brown.darken-2 { + background-color: #5d4037 !important; +} + +.brown-text.text-darken-2 { + color: #5d4037 !important; +} + +.brown.darken-3 { + background-color: #4e342e !important; +} + +.brown-text.text-darken-3 { + color: #4e342e !important; +} + +.brown.darken-4 { + background-color: #3e2723 !important; +} + +.brown-text.text-darken-4 { + color: #3e2723 !important; +} + +.blue-grey { + background-color: #607d8b !important; +} + +.blue-grey-text { + color: #607d8b !important; +} + +.blue-grey.lighten-5 { + background-color: #eceff1 !important; +} + +.blue-grey-text.text-lighten-5 { + color: #eceff1 !important; +} + +.blue-grey.lighten-4 { + background-color: #cfd8dc !important; +} + +.blue-grey-text.text-lighten-4 { + color: #cfd8dc !important; +} + +.blue-grey.lighten-3 { + background-color: #b0bec5 !important; +} + +.blue-grey-text.text-lighten-3 { + color: #b0bec5 !important; +} + +.blue-grey.lighten-2 { + background-color: #90a4ae !important; +} + +.blue-grey-text.text-lighten-2 { + color: #90a4ae !important; +} + +.blue-grey.lighten-1 { + background-color: #78909c !important; +} + +.blue-grey-text.text-lighten-1 { + color: #78909c !important; +} + +.blue-grey.darken-1 { + background-color: #546e7a !important; +} + +.blue-grey-text.text-darken-1 { + color: #546e7a !important; +} + +.blue-grey.darken-2 { + background-color: #455a64 !important; +} + +.blue-grey-text.text-darken-2 { + color: #455a64 !important; +} + +.blue-grey.darken-3 { + background-color: #37474f !important; +} + +.blue-grey-text.text-darken-3 { + color: #37474f !important; +} + +.blue-grey.darken-4 { + background-color: #263238 !important; +} + +.blue-grey-text.text-darken-4 { + color: #263238 !important; +} + +.grey { + background-color: #9e9e9e !important; +} + +.grey-text { + color: #9e9e9e !important; +} + +.grey.lighten-5 { + background-color: #fafafa !important; +} + +.grey-text.text-lighten-5 { + color: #fafafa !important; +} + +.grey.lighten-4 { + background-color: #f5f5f5 !important; +} + +.grey-text.text-lighten-4 { + color: #f5f5f5 !important; +} + +.grey.lighten-3 { + background-color: #eeeeee !important; +} + +.grey-text.text-lighten-3 { + color: #eeeeee !important; +} + +.grey.lighten-2 { + background-color: #e0e0e0 !important; +} + +.grey-text.text-lighten-2 { + color: #e0e0e0 !important; +} + +.grey.lighten-1 { + background-color: #bdbdbd !important; +} + +.grey-text.text-lighten-1 { + color: #bdbdbd !important; +} + +.grey.darken-1 { + background-color: #757575 !important; +} + +.grey-text.text-darken-1 { + color: #757575 !important; +} + +.grey.darken-2 { + background-color: #616161 !important; +} + +.grey-text.text-darken-2 { + color: #616161 !important; +} + +.grey.darken-3 { + background-color: #424242 !important; +} + +.grey-text.text-darken-3 { + color: #424242 !important; +} + +.grey.darken-4 { + background-color: #212121 !important; +} + +.grey-text.text-darken-4 { + color: #212121 !important; +} + +.black { + background-color: #000000 !important; +} + +.black-text { + color: #000000 !important; +} + +.white { + background-color: #FFFFFF !important; +} + +.white-text { + color: #FFFFFF !important; +} + +.transparent { + background-color: transparent !important; +} + +.transparent-text { + color: transparent !important; +} + +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ +/* Document + ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ +html { + line-height: 1.15; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers (opinionated). + */ +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ +figcaption, +figure, +main { + /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ +a { + background-color: transparent; + /* 1 */ + -webkit-text-decoration-skip: objects; + /* 2 */ +} + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + /* 1 */ + text-decoration: underline; + /* 2 */ + -webkit-text-decoration: underline dotted; + -moz-text-decoration: underline dotted; + text-decoration: underline dotted; + /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; + /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* 1 */ + color: inherit; + /* 2 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + white-space: normal; + /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ +[type="checkbox"], +[type="radio"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ +details, +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ +template { + display: none; +} + +/* Hidden + ========================================================================== */ +/** + * Add the correct display in IE 10-. + */ +[hidden] { + display: none; +} + +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +*, *:before, *:after { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +button, +input, +optgroup, +select, +textarea { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; +} + +ul:not(.browser-default) { + padding-left: 0; + list-style-type: none; +} + +ul:not(.browser-default) > li { + list-style-type: none; +} + +a { + color: #039be5; + text-decoration: none; + -webkit-tap-highlight-color: transparent; +} + +.valign-wrapper { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; +} + +.clearfix { + clear: both; +} + +.z-depth-0 { + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +/* 2dp elevation modified*/ +.z-depth-1, nav, .card-panel, .card, .toast, .btn, .btn-large, .btn-small, .btn-floating, .dropdown-content, .collapsible, .sidenav { + -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); +} + +.z-depth-1-half, .btn:hover, .btn-large:hover, .btn-small:hover, .btn-floating:hover { + -webkit-box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); +} + +/* 6dp elevation modified*/ +.z-depth-2 { + -webkit-box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); + box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); +} + +/* 12dp elevation modified*/ +.z-depth-3 { + -webkit-box-shadow: 0 8px 17px 2px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); + box-shadow: 0 8px 17px 2px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); +} + +/* 16dp elevation */ +.z-depth-4 { + -webkit-box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -7px rgba(0, 0, 0, 0.2); + box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -7px rgba(0, 0, 0, 0.2); +} + +/* 24dp elevation */ +.z-depth-5, .modal { + -webkit-box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2); + box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2); +} + +.hoverable { + -webkit-transition: -webkit-box-shadow .25s; + transition: -webkit-box-shadow .25s; + transition: box-shadow .25s; + transition: box-shadow .25s, -webkit-box-shadow .25s; +} + +.hoverable:hover { + -webkit-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +.divider { + height: 1px; + overflow: hidden; + background-color: #e0e0e0; +} + +blockquote { + margin: 20px 0; + padding-left: 1.5rem; + border-left: 5px solid #ee6e73; +} + +i { + line-height: inherit; +} + +i.left { + float: left; + margin-right: 15px; +} + +i.right { + float: right; + margin-left: 15px; +} + +i.tiny { + font-size: 1rem; +} + +i.small { + font-size: 2rem; +} + +i.medium { + font-size: 4rem; +} + +i.large { + font-size: 6rem; +} + +img.responsive-img, +video.responsive-video { + max-width: 100%; + height: auto; +} + +.pagination li { + display: inline-block; + border-radius: 2px; + text-align: center; + vertical-align: top; + height: 30px; +} + +.pagination li a { + color: #444; + display: inline-block; + font-size: 1.2rem; + padding: 0 10px; + line-height: 30px; +} + +.pagination li.active a { + color: #fff; +} + +.pagination li.active { + background-color: #ee6e73; +} + +.pagination li.disabled a { + cursor: default; + color: #999; +} + +.pagination li i { + font-size: 2rem; +} + +.pagination li.pages ul li { + display: inline-block; + float: none; +} + +@media only screen and (max-width: 992px) { + .pagination { + width: 100%; + } + .pagination li.prev, + .pagination li.next { + width: 10%; + } + .pagination li.pages { + width: 80%; + overflow: hidden; + white-space: nowrap; + } +} + +.breadcrumb { + font-size: 18px; + color: rgba(255, 255, 255, 0.7); +} + +.breadcrumb i, +.breadcrumb [class^="mdi-"], .breadcrumb [class*="mdi-"], +.breadcrumb i.material-icons { + display: inline-block; + float: left; + font-size: 24px; +} + +.breadcrumb:before { + content: '\E5CC'; + color: rgba(255, 255, 255, 0.7); + vertical-align: top; + display: inline-block; + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 25px; + margin: 0 10px 0 8px; + -webkit-font-smoothing: antialiased; +} + +.breadcrumb:first-child:before { + display: none; +} + +.breadcrumb:last-child { + color: #fff; +} + +.parallax-container { + position: relative; + overflow: hidden; + height: 500px; +} + +.parallax-container .parallax { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; +} + +.parallax-container .parallax img { + opacity: 0; + position: absolute; + left: 50%; + bottom: 0; + min-width: 100%; + min-height: 100%; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} + +.pin-top, .pin-bottom { + position: relative; +} + +.pinned { + position: fixed !important; +} + +/********************* + Transition Classes +**********************/ +ul.staggered-list li { + opacity: 0; +} + +.fade-in { + opacity: 0; + -webkit-transform-origin: 0 50%; + transform-origin: 0 50%; +} + +/********************* + Media Query Classes +**********************/ +@media only screen and (max-width: 600px) { + .hide-on-small-only, .hide-on-small-and-down { + display: none !important; + } +} + +@media only screen and (max-width: 992px) { + .hide-on-med-and-down { + display: none !important; + } +} + +@media only screen and (min-width: 601px) { + .hide-on-med-and-up { + display: none !important; + } +} + +@media only screen and (min-width: 600px) and (max-width: 992px) { + .hide-on-med-only { + display: none !important; + } +} + +@media only screen and (min-width: 993px) { + .hide-on-large-only { + display: none !important; + } +} + +@media only screen and (min-width: 1201px) { + .hide-on-extra-large-only { + display: none !important; + } +} + +@media only screen and (min-width: 1201px) { + .show-on-extra-large { + display: block !important; + } +} + +@media only screen and (min-width: 993px) { + .show-on-large { + display: block !important; + } +} + +@media only screen and (min-width: 600px) and (max-width: 992px) { + .show-on-medium { + display: block !important; + } +} + +@media only screen and (max-width: 600px) { + .show-on-small { + display: block !important; + } +} + +@media only screen and (min-width: 601px) { + .show-on-medium-and-up { + display: block !important; + } +} + +@media only screen and (max-width: 992px) { + .show-on-medium-and-down { + display: block !important; + } +} + +@media only screen and (max-width: 600px) { + .center-on-small-only { + text-align: center; + } +} + +.page-footer { + padding-top: 20px; + color: #fff; + background-color: #ee6e73; +} + +.page-footer .footer-copyright { + overflow: hidden; + min-height: 50px; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 10px 0px; + color: rgba(255, 255, 255, 0.8); + background-color: rgba(51, 51, 51, 0.08); +} + +table, th, td { + border: none; +} + +table { + width: 100%; + display: table; + border-collapse: collapse; + border-spacing: 0; +} + +table.striped tr { + border-bottom: none; +} + +table.striped > tbody > tr:nth-child(odd) { + background-color: rgba(242, 242, 242, 0.5); +} + +table.striped > tbody > tr > td { + border-radius: 0; +} + +table.highlight > tbody > tr { + -webkit-transition: background-color .25s ease; + transition: background-color .25s ease; +} + +table.highlight > tbody > tr:hover { + background-color: rgba(242, 242, 242, 0.5); +} + +table.centered thead tr th, table.centered tbody tr td { + text-align: center; +} + +tr { + border-bottom: 1px solid rgba(0, 0, 0, 0.12); +} + +td, th { + padding: 15px 5px; + display: table-cell; + text-align: left; + vertical-align: middle; + border-radius: 2px; +} + +@media only screen and (max-width: 992px) { + table.responsive-table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + display: block; + position: relative; + /* sort out borders */ + } + table.responsive-table td:empty:before { + content: '\00a0'; + } + table.responsive-table th, + table.responsive-table td { + margin: 0; + vertical-align: top; + } + table.responsive-table th { + text-align: left; + } + table.responsive-table thead { + display: block; + float: left; + } + table.responsive-table thead tr { + display: block; + padding: 0 10px 0 0; + } + table.responsive-table thead tr th::before { + content: "\00a0"; + } + table.responsive-table tbody { + display: block; + width: auto; + position: relative; + overflow-x: auto; + white-space: nowrap; + } + table.responsive-table tbody tr { + display: inline-block; + vertical-align: top; + } + table.responsive-table th { + display: block; + text-align: right; + } + table.responsive-table td { + display: block; + min-height: 1.25em; + text-align: left; + } + table.responsive-table tr { + border-bottom: none; + padding: 0 10px; + } + table.responsive-table thead { + border: 0; + border-right: 1px solid rgba(0, 0, 0, 0.12); + } +} + +.collection { + margin: 0.5rem 0 1rem 0; + border: 1px solid #e0e0e0; + border-radius: 2px; + overflow: hidden; + position: relative; +} + +.collection .collection-item { + background-color: #fff; + line-height: 1.5rem; + padding: 10px 20px; + margin: 0; + border-bottom: 1px solid #e0e0e0; +} + +.collection .collection-item.avatar { + min-height: 84px; + padding-left: 72px; + position: relative; +} + +.collection .collection-item.avatar:not(.circle-clipper) > .circle, +.collection .collection-item.avatar :not(.circle-clipper) > .circle { + position: absolute; + width: 42px; + height: 42px; + overflow: hidden; + left: 15px; + display: inline-block; + vertical-align: middle; +} + +.collection .collection-item.avatar i.circle { + font-size: 18px; + line-height: 42px; + color: #fff; + background-color: #999; + text-align: center; +} + +.collection .collection-item.avatar .title { + font-size: 16px; +} + +.collection .collection-item.avatar p { + margin: 0; +} + +.collection .collection-item.avatar .secondary-content { + position: absolute; + top: 16px; + right: 16px; +} + +.collection .collection-item:last-child { + border-bottom: none; +} + +.collection .collection-item.active { + background-color: #26a69a; + color: #eafaf9; +} + +.collection .collection-item.active .secondary-content { + color: #fff; +} + +.collection a.collection-item { + display: block; + -webkit-transition: .25s; + transition: .25s; + color: #26a69a; +} + +.collection a.collection-item:not(.active):hover { + background-color: #ddd; +} + +.collection.with-header .collection-header { + background-color: #fff; + border-bottom: 1px solid #e0e0e0; + padding: 10px 20px; +} + +.collection.with-header .collection-item { + padding-left: 30px; +} + +.collection.with-header .collection-item.avatar { + padding-left: 72px; +} + +.secondary-content { + float: right; + color: #26a69a; +} + +.collapsible .collection { + margin: 0; + border: none; +} + +.video-container { + position: relative; + padding-bottom: 56.25%; + height: 0; + overflow: hidden; +} + +.video-container iframe, .video-container object, .video-container embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.progress { + position: relative; + height: 4px; + display: block; + width: 100%; + background-color: #acece6; + border-radius: 2px; + margin: 0.5rem 0 1rem 0; + overflow: hidden; +} + +.progress .determinate { + position: absolute; + top: 0; + left: 0; + bottom: 0; + background-color: #26a69a; + -webkit-transition: width .3s linear; + transition: width .3s linear; +} + +.progress .indeterminate { + background-color: #26a69a; +} + +.progress .indeterminate:before { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + -webkit-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; + animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; +} + +.progress .indeterminate:after { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + -webkit-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; + animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; + -webkit-animation-delay: 1.15s; + animation-delay: 1.15s; +} + +@-webkit-keyframes indeterminate { + 0% { + left: -35%; + right: 100%; + } + 60% { + left: 100%; + right: -90%; + } + 100% { + left: 100%; + right: -90%; + } +} + +@keyframes indeterminate { + 0% { + left: -35%; + right: 100%; + } + 60% { + left: 100%; + right: -90%; + } + 100% { + left: 100%; + right: -90%; + } +} + +@-webkit-keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } +} + +@keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } +} + +/******************* + Utility Classes +*******************/ +.hide { + display: none !important; +} + +.left-align { + text-align: left; +} + +.right-align { + text-align: right; +} + +.center, .center-align { + text-align: center; +} + +.left { + float: left !important; +} + +.right { + float: right !important; +} + +.no-select, input[type=range], +input[type=range] + .thumb { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.circle { + border-radius: 50%; +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +.truncate { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.no-padding { + padding: 0 !important; +} + +span.badge { + min-width: 3rem; + padding: 0 6px; + margin-left: 14px; + text-align: center; + font-size: 1rem; + line-height: 22px; + height: 22px; + color: #757575; + float: right; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +span.badge.new { + font-weight: 300; + font-size: 0.8rem; + color: #fff; + background-color: #26a69a; + border-radius: 2px; +} + +span.badge.new:after { + content: " new"; +} + +span.badge[data-badge-caption]::after { + content: " " attr(data-badge-caption); +} + +nav ul a span.badge { + display: inline-block; + float: none; + margin-left: 4px; + line-height: 22px; + height: 22px; + -webkit-font-smoothing: auto; +} + +.collection-item span.badge { + margin-top: calc(0.75rem - 11px); +} + +.collapsible span.badge { + margin-left: auto; +} + +.sidenav span.badge { + margin-top: calc(24px - 11px); +} + +table span.badge { + display: inline-block; + float: none; + margin-left: auto; +} + +/* This is needed for some mobile phones to display the Google Icon font properly */ +.material-icons { + text-rendering: optimizeLegibility; + -webkit-font-feature-settings: 'liga'; + -moz-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; +} + +.container { + margin: 0 auto; + max-width: 1280px; + width: 90%; +} + +@media only screen and (min-width: 601px) { + .container { + width: 85%; + } +} + +@media only screen and (min-width: 993px) { + .container { + width: 70%; + } +} + +.col .row { + margin-left: -0.75rem; + margin-right: -0.75rem; +} + +.section { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.section.no-pad { + padding: 0; +} + +.section.no-pad-bot { + padding-bottom: 0; +} + +.section.no-pad-top { + padding-top: 0; +} + +.row { + margin-left: auto; + margin-right: auto; + margin-bottom: 20px; +} + +.row:after { + content: ""; + display: table; + clear: both; +} + +.row .col { + float: left; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0 0.75rem; + min-height: 1px; +} + +.row .col[class*="push-"], .row .col[class*="pull-"] { + position: relative; +} + +.row .col.s1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.offset-s1 { + margin-left: 8.3333333333%; +} + +.row .col.pull-s1 { + right: 8.3333333333%; +} + +.row .col.push-s1 { + left: 8.3333333333%; +} + +.row .col.offset-s2 { + margin-left: 16.6666666667%; +} + +.row .col.pull-s2 { + right: 16.6666666667%; +} + +.row .col.push-s2 { + left: 16.6666666667%; +} + +.row .col.offset-s3 { + margin-left: 25%; +} + +.row .col.pull-s3 { + right: 25%; +} + +.row .col.push-s3 { + left: 25%; +} + +.row .col.offset-s4 { + margin-left: 33.3333333333%; +} + +.row .col.pull-s4 { + right: 33.3333333333%; +} + +.row .col.push-s4 { + left: 33.3333333333%; +} + +.row .col.offset-s5 { + margin-left: 41.6666666667%; +} + +.row .col.pull-s5 { + right: 41.6666666667%; +} + +.row .col.push-s5 { + left: 41.6666666667%; +} + +.row .col.offset-s6 { + margin-left: 50%; +} + +.row .col.pull-s6 { + right: 50%; +} + +.row .col.push-s6 { + left: 50%; +} + +.row .col.offset-s7 { + margin-left: 58.3333333333%; +} + +.row .col.pull-s7 { + right: 58.3333333333%; +} + +.row .col.push-s7 { + left: 58.3333333333%; +} + +.row .col.offset-s8 { + margin-left: 66.6666666667%; +} + +.row .col.pull-s8 { + right: 66.6666666667%; +} + +.row .col.push-s8 { + left: 66.6666666667%; +} + +.row .col.offset-s9 { + margin-left: 75%; +} + +.row .col.pull-s9 { + right: 75%; +} + +.row .col.push-s9 { + left: 75%; +} + +.row .col.offset-s10 { + margin-left: 83.3333333333%; +} + +.row .col.pull-s10 { + right: 83.3333333333%; +} + +.row .col.push-s10 { + left: 83.3333333333%; +} + +.row .col.offset-s11 { + margin-left: 91.6666666667%; +} + +.row .col.pull-s11 { + right: 91.6666666667%; +} + +.row .col.push-s11 { + left: 91.6666666667%; +} + +.row .col.offset-s12 { + margin-left: 100%; +} + +.row .col.pull-s12 { + right: 100%; +} + +.row .col.push-s12 { + left: 100%; +} + +@media only screen and (min-width: 601px) { + .row .col.m1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.offset-m1 { + margin-left: 8.3333333333%; + } + .row .col.pull-m1 { + right: 8.3333333333%; + } + .row .col.push-m1 { + left: 8.3333333333%; + } + .row .col.offset-m2 { + margin-left: 16.6666666667%; + } + .row .col.pull-m2 { + right: 16.6666666667%; + } + .row .col.push-m2 { + left: 16.6666666667%; + } + .row .col.offset-m3 { + margin-left: 25%; + } + .row .col.pull-m3 { + right: 25%; + } + .row .col.push-m3 { + left: 25%; + } + .row .col.offset-m4 { + margin-left: 33.3333333333%; + } + .row .col.pull-m4 { + right: 33.3333333333%; + } + .row .col.push-m4 { + left: 33.3333333333%; + } + .row .col.offset-m5 { + margin-left: 41.6666666667%; + } + .row .col.pull-m5 { + right: 41.6666666667%; + } + .row .col.push-m5 { + left: 41.6666666667%; + } + .row .col.offset-m6 { + margin-left: 50%; + } + .row .col.pull-m6 { + right: 50%; + } + .row .col.push-m6 { + left: 50%; + } + .row .col.offset-m7 { + margin-left: 58.3333333333%; + } + .row .col.pull-m7 { + right: 58.3333333333%; + } + .row .col.push-m7 { + left: 58.3333333333%; + } + .row .col.offset-m8 { + margin-left: 66.6666666667%; + } + .row .col.pull-m8 { + right: 66.6666666667%; + } + .row .col.push-m8 { + left: 66.6666666667%; + } + .row .col.offset-m9 { + margin-left: 75%; + } + .row .col.pull-m9 { + right: 75%; + } + .row .col.push-m9 { + left: 75%; + } + .row .col.offset-m10 { + margin-left: 83.3333333333%; + } + .row .col.pull-m10 { + right: 83.3333333333%; + } + .row .col.push-m10 { + left: 83.3333333333%; + } + .row .col.offset-m11 { + margin-left: 91.6666666667%; + } + .row .col.pull-m11 { + right: 91.6666666667%; + } + .row .col.push-m11 { + left: 91.6666666667%; + } + .row .col.offset-m12 { + margin-left: 100%; + } + .row .col.pull-m12 { + right: 100%; + } + .row .col.push-m12 { + left: 100%; + } +} + +@media only screen and (min-width: 993px) { + .row .col.l1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.offset-l1 { + margin-left: 8.3333333333%; + } + .row .col.pull-l1 { + right: 8.3333333333%; + } + .row .col.push-l1 { + left: 8.3333333333%; + } + .row .col.offset-l2 { + margin-left: 16.6666666667%; + } + .row .col.pull-l2 { + right: 16.6666666667%; + } + .row .col.push-l2 { + left: 16.6666666667%; + } + .row .col.offset-l3 { + margin-left: 25%; + } + .row .col.pull-l3 { + right: 25%; + } + .row .col.push-l3 { + left: 25%; + } + .row .col.offset-l4 { + margin-left: 33.3333333333%; + } + .row .col.pull-l4 { + right: 33.3333333333%; + } + .row .col.push-l4 { + left: 33.3333333333%; + } + .row .col.offset-l5 { + margin-left: 41.6666666667%; + } + .row .col.pull-l5 { + right: 41.6666666667%; + } + .row .col.push-l5 { + left: 41.6666666667%; + } + .row .col.offset-l6 { + margin-left: 50%; + } + .row .col.pull-l6 { + right: 50%; + } + .row .col.push-l6 { + left: 50%; + } + .row .col.offset-l7 { + margin-left: 58.3333333333%; + } + .row .col.pull-l7 { + right: 58.3333333333%; + } + .row .col.push-l7 { + left: 58.3333333333%; + } + .row .col.offset-l8 { + margin-left: 66.6666666667%; + } + .row .col.pull-l8 { + right: 66.6666666667%; + } + .row .col.push-l8 { + left: 66.6666666667%; + } + .row .col.offset-l9 { + margin-left: 75%; + } + .row .col.pull-l9 { + right: 75%; + } + .row .col.push-l9 { + left: 75%; + } + .row .col.offset-l10 { + margin-left: 83.3333333333%; + } + .row .col.pull-l10 { + right: 83.3333333333%; + } + .row .col.push-l10 { + left: 83.3333333333%; + } + .row .col.offset-l11 { + margin-left: 91.6666666667%; + } + .row .col.pull-l11 { + right: 91.6666666667%; + } + .row .col.push-l11 { + left: 91.6666666667%; + } + .row .col.offset-l12 { + margin-left: 100%; + } + .row .col.pull-l12 { + right: 100%; + } + .row .col.push-l12 { + left: 100%; + } +} + +@media only screen and (min-width: 1201px) { + .row .col.xl1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.offset-xl1 { + margin-left: 8.3333333333%; + } + .row .col.pull-xl1 { + right: 8.3333333333%; + } + .row .col.push-xl1 { + left: 8.3333333333%; + } + .row .col.offset-xl2 { + margin-left: 16.6666666667%; + } + .row .col.pull-xl2 { + right: 16.6666666667%; + } + .row .col.push-xl2 { + left: 16.6666666667%; + } + .row .col.offset-xl3 { + margin-left: 25%; + } + .row .col.pull-xl3 { + right: 25%; + } + .row .col.push-xl3 { + left: 25%; + } + .row .col.offset-xl4 { + margin-left: 33.3333333333%; + } + .row .col.pull-xl4 { + right: 33.3333333333%; + } + .row .col.push-xl4 { + left: 33.3333333333%; + } + .row .col.offset-xl5 { + margin-left: 41.6666666667%; + } + .row .col.pull-xl5 { + right: 41.6666666667%; + } + .row .col.push-xl5 { + left: 41.6666666667%; + } + .row .col.offset-xl6 { + margin-left: 50%; + } + .row .col.pull-xl6 { + right: 50%; + } + .row .col.push-xl6 { + left: 50%; + } + .row .col.offset-xl7 { + margin-left: 58.3333333333%; + } + .row .col.pull-xl7 { + right: 58.3333333333%; + } + .row .col.push-xl7 { + left: 58.3333333333%; + } + .row .col.offset-xl8 { + margin-left: 66.6666666667%; + } + .row .col.pull-xl8 { + right: 66.6666666667%; + } + .row .col.push-xl8 { + left: 66.6666666667%; + } + .row .col.offset-xl9 { + margin-left: 75%; + } + .row .col.pull-xl9 { + right: 75%; + } + .row .col.push-xl9 { + left: 75%; + } + .row .col.offset-xl10 { + margin-left: 83.3333333333%; + } + .row .col.pull-xl10 { + right: 83.3333333333%; + } + .row .col.push-xl10 { + left: 83.3333333333%; + } + .row .col.offset-xl11 { + margin-left: 91.6666666667%; + } + .row .col.pull-xl11 { + right: 91.6666666667%; + } + .row .col.push-xl11 { + left: 91.6666666667%; + } + .row .col.offset-xl12 { + margin-left: 100%; + } + .row .col.pull-xl12 { + right: 100%; + } + .row .col.push-xl12 { + left: 100%; + } +} + +nav { + color: #fff; + background-color: #ee6e73; + width: 100%; + height: 56px; + line-height: 56px; +} + +nav.nav-extended { + height: auto; +} + +nav.nav-extended .nav-wrapper { + min-height: 56px; + height: auto; +} + +nav.nav-extended .nav-content { + position: relative; + line-height: normal; +} + +nav a { + color: #fff; +} + +nav i, +nav [class^="mdi-"], nav [class*="mdi-"], +nav i.material-icons { + display: block; + font-size: 24px; + height: 56px; + line-height: 56px; +} + +nav .nav-wrapper { + position: relative; + height: 100%; +} + +@media only screen and (min-width: 993px) { + nav a.sidenav-trigger { + display: none; + } +} + +nav .sidenav-trigger { + float: left; + position: relative; + z-index: 1; + height: 56px; + margin: 0 18px; +} + +nav .sidenav-trigger i { + height: 56px; + line-height: 56px; +} + +nav .brand-logo { + position: absolute; + color: #fff; + display: inline-block; + font-size: 2.1rem; + padding: 0; +} + +nav .brand-logo.center { + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} + +@media only screen and (max-width: 992px) { + nav .brand-logo { + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + } + nav .brand-logo.left, nav .brand-logo.right { + padding: 0; + -webkit-transform: none; + transform: none; + } + nav .brand-logo.left { + left: 0.5rem; + } + nav .brand-logo.right { + right: 0.5rem; + left: auto; + } +} + +nav .brand-logo.right { + right: 0.5rem; + padding: 0; +} + +nav .brand-logo i, +nav .brand-logo [class^="mdi-"], nav .brand-logo [class*="mdi-"], +nav .brand-logo i.material-icons { + float: left; + margin-right: 15px; +} + +nav .nav-title { + display: inline-block; + font-size: 32px; + padding: 28px 0; +} + +nav ul { + margin: 0; +} + +nav ul li { + -webkit-transition: background-color .3s; + transition: background-color .3s; + float: left; + padding: 0; +} + +nav ul li.active { + background-color: rgba(0, 0, 0, 0.1); +} + +nav ul a { + -webkit-transition: background-color .3s; + transition: background-color .3s; + font-size: 1rem; + color: #fff; + display: block; + padding: 0 15px; + cursor: pointer; +} + +nav ul a.btn, nav ul a.btn-large, nav ul a.btn-small, nav ul a.btn-large, nav ul a.btn-flat, nav ul a.btn-floating { + margin-top: -2px; + margin-left: 15px; + margin-right: 15px; +} + +nav ul a.btn > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-small > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-flat > .material-icons, nav ul a.btn-floating > .material-icons { + height: inherit; + line-height: inherit; +} + +nav ul a:hover { + background-color: rgba(0, 0, 0, 0.1); +} + +nav ul.left { + float: left; +} + +nav form { + height: 100%; +} + +nav .input-field { + margin: 0; + height: 100%; +} + +nav .input-field input { + height: 100%; + font-size: 1.2rem; + border: none; + padding-left: 2rem; +} + +nav .input-field input:focus, nav .input-field input[type=text]:valid, nav .input-field input[type=password]:valid, nav .input-field input[type=email]:valid, nav .input-field input[type=url]:valid, nav .input-field input[type=date]:valid { + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +nav .input-field label { + top: 0; + left: 0; +} + +nav .input-field label i { + color: rgba(255, 255, 255, 0.7); + -webkit-transition: color .3s; + transition: color .3s; +} + +nav .input-field label.active i { + color: #fff; +} + +.navbar-fixed { + position: relative; + height: 56px; + z-index: 997; +} + +.navbar-fixed nav { + position: fixed; +} + +@media only screen and (min-width: 601px) { + nav.nav-extended .nav-wrapper { + min-height: 64px; + } + nav, nav .nav-wrapper i, nav a.sidenav-trigger, nav a.sidenav-trigger i { + height: 64px; + line-height: 64px; + } + .navbar-fixed { + height: 64px; + } +} + +a { + text-decoration: none; +} + +html { + line-height: 1.5; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-weight: normal; + color: rgba(0, 0, 0, 0.87); +} + +@media only screen and (min-width: 0) { + html { + font-size: 14px; + } +} + +@media only screen and (min-width: 992px) { + html { + font-size: 14.5px; + } +} + +@media only screen and (min-width: 1200px) { + html { + font-size: 15px; + } +} + +h1, h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.3; +} + +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + font-weight: inherit; +} + +h1 { + font-size: 4.2rem; + line-height: 110%; + margin: 2.8rem 0 1.68rem 0; +} + +h2 { + font-size: 3.56rem; + line-height: 110%; + margin: 2.3733333333rem 0 1.424rem 0; +} + +h3 { + font-size: 2.92rem; + line-height: 110%; + margin: 1.9466666667rem 0 1.168rem 0; +} + +h4 { + font-size: 2.28rem; + line-height: 110%; + margin: 1.52rem 0 0.912rem 0; +} + +h5 { + font-size: 1.64rem; + line-height: 110%; + margin: 1.0933333333rem 0 0.656rem 0; +} + +h6 { + font-size: 1.15rem; + line-height: 110%; + margin: 0.7666666667rem 0 0.46rem 0; +} + +em { + font-style: italic; +} + +strong { + font-weight: 500; +} + +small { + font-size: 75%; +} + +.light { + font-weight: 300; +} + +.thin { + font-weight: 200; +} + +@media only screen and (min-width: 360px) { + .flow-text { + font-size: 1.2rem; + } +} + +@media only screen and (min-width: 390px) { + .flow-text { + font-size: 1.224rem; + } +} + +@media only screen and (min-width: 420px) { + .flow-text { + font-size: 1.248rem; + } +} + +@media only screen and (min-width: 450px) { + .flow-text { + font-size: 1.272rem; + } +} + +@media only screen and (min-width: 480px) { + .flow-text { + font-size: 1.296rem; + } +} + +@media only screen and (min-width: 510px) { + .flow-text { + font-size: 1.32rem; + } +} + +@media only screen and (min-width: 540px) { + .flow-text { + font-size: 1.344rem; + } +} + +@media only screen and (min-width: 570px) { + .flow-text { + font-size: 1.368rem; + } +} + +@media only screen and (min-width: 600px) { + .flow-text { + font-size: 1.392rem; + } +} + +@media only screen and (min-width: 630px) { + .flow-text { + font-size: 1.416rem; + } +} + +@media only screen and (min-width: 660px) { + .flow-text { + font-size: 1.44rem; + } +} + +@media only screen and (min-width: 690px) { + .flow-text { + font-size: 1.464rem; + } +} + +@media only screen and (min-width: 720px) { + .flow-text { + font-size: 1.488rem; + } +} + +@media only screen and (min-width: 750px) { + .flow-text { + font-size: 1.512rem; + } +} + +@media only screen and (min-width: 780px) { + .flow-text { + font-size: 1.536rem; + } +} + +@media only screen and (min-width: 810px) { + .flow-text { + font-size: 1.56rem; + } +} + +@media only screen and (min-width: 840px) { + .flow-text { + font-size: 1.584rem; + } +} + +@media only screen and (min-width: 870px) { + .flow-text { + font-size: 1.608rem; + } +} + +@media only screen and (min-width: 900px) { + .flow-text { + font-size: 1.632rem; + } +} + +@media only screen and (min-width: 930px) { + .flow-text { + font-size: 1.656rem; + } +} + +@media only screen and (min-width: 960px) { + .flow-text { + font-size: 1.68rem; + } +} + +@media only screen and (max-width: 360px) { + .flow-text { + font-size: 1.2rem; + } +} + +.scale-transition { + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; + transition: -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; + transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; + transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; +} + +.scale-transition.scale-out { + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transition: -webkit-transform .2s !important; + transition: -webkit-transform .2s !important; + transition: transform .2s !important; + transition: transform .2s, -webkit-transform .2s !important; +} + +.scale-transition.scale-in { + -webkit-transform: scale(1); + transform: scale(1); +} + +.card-panel { + -webkit-transition: -webkit-box-shadow .25s; + transition: -webkit-box-shadow .25s; + transition: box-shadow .25s; + transition: box-shadow .25s, -webkit-box-shadow .25s; + padding: 24px; + margin: 0.5rem 0 1rem 0; + border-radius: 2px; + background-color: #fff; +} + +.card { + position: relative; + margin: 0.5rem 0 1rem 0; + background-color: #fff; + -webkit-transition: -webkit-box-shadow .25s; + transition: -webkit-box-shadow .25s; + transition: box-shadow .25s; + transition: box-shadow .25s, -webkit-box-shadow .25s; + border-radius: 2px; +} + +.card .card-title { + font-size: 24px; + font-weight: 300; +} + +.card .card-title.activator { + cursor: pointer; +} + +.card.small, .card.medium, .card.large { + position: relative; +} + +.card.small .card-image, .card.medium .card-image, .card.large .card-image { + max-height: 60%; + overflow: hidden; +} + +.card.small .card-image + .card-content, .card.medium .card-image + .card-content, .card.large .card-image + .card-content { + max-height: 40%; +} + +.card.small .card-content, .card.medium .card-content, .card.large .card-content { + max-height: 100%; + overflow: hidden; +} + +.card.small .card-action, .card.medium .card-action, .card.large .card-action { + position: absolute; + bottom: 0; + left: 0; + right: 0; +} + +.card.small { + height: 300px; +} + +.card.medium { + height: 400px; +} + +.card.large { + height: 500px; +} + +.card.horizontal { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.card.horizontal.small .card-image, .card.horizontal.medium .card-image, .card.horizontal.large .card-image { + height: 100%; + max-height: none; + overflow: visible; +} + +.card.horizontal.small .card-image img, .card.horizontal.medium .card-image img, .card.horizontal.large .card-image img { + height: 100%; +} + +.card.horizontal .card-image { + max-width: 50%; +} + +.card.horizontal .card-image img { + border-radius: 2px 0 0 2px; + max-width: 100%; + width: auto; +} + +.card.horizontal .card-stacked { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + position: relative; +} + +.card.horizontal .card-stacked .card-content { + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.card.sticky-action .card-action { + z-index: 2; +} + +.card.sticky-action .card-reveal { + z-index: 1; + padding-bottom: 64px; +} + +.card .card-image { + position: relative; +} + +.card .card-image img { + display: block; + border-radius: 2px 2px 0 0; + position: relative; + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; +} + +.card .card-image .card-title { + color: #fff; + position: absolute; + bottom: 0; + left: 0; + max-width: 100%; + padding: 24px; +} + +.card .card-content { + padding: 24px; + border-radius: 0 0 2px 2px; +} + +.card .card-content p { + margin: 0; +} + +.card .card-content .card-title { + display: block; + line-height: 32px; + margin-bottom: 8px; +} + +.card .card-content .card-title i { + line-height: 32px; +} + +.card .card-action { + background-color: inherit; + border-top: 1px solid rgba(160, 160, 160, 0.2); + position: relative; + padding: 16px 24px; +} + +.card .card-action:last-child { + border-radius: 0 0 2px 2px; +} + +.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating) { + color: #ffab40; + margin-right: 24px; + -webkit-transition: color .3s ease; + transition: color .3s ease; + text-transform: uppercase; +} + +.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover { + color: #ffd8a6; +} + +.card .card-reveal { + padding: 24px; + position: absolute; + background-color: #fff; + width: 100%; + overflow-y: auto; + left: 0; + top: 100%; + height: 100%; + z-index: 3; + display: none; +} + +.card .card-reveal .card-title { + cursor: pointer; + display: block; +} + +#toast-container { + display: block; + position: fixed; + z-index: 10000; +} + +@media only screen and (max-width: 600px) { + #toast-container { + min-width: 100%; + bottom: 0%; + } +} + +@media only screen and (min-width: 601px) and (max-width: 992px) { + #toast-container { + left: 5%; + bottom: 7%; + max-width: 90%; + } +} + +@media only screen and (min-width: 993px) { + #toast-container { + top: 10%; + right: 7%; + max-width: 86%; + } +} + +.toast { + border-radius: 2px; + top: 35px; + width: auto; + margin-top: 10px; + position: relative; + max-width: 100%; + height: auto; + min-height: 48px; + line-height: 1.5em; + background-color: #323232; + padding: 10px 25px; + font-size: 1.1rem; + font-weight: 300; + color: #fff; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + cursor: default; +} + +.toast .toast-action { + color: #eeff41; + font-weight: 500; + margin-right: -25px; + margin-left: 3rem; +} + +.toast.rounded { + border-radius: 24px; +} + +@media only screen and (max-width: 600px) { + .toast { + width: 100%; + border-radius: 0; + } +} + +.tabs { + position: relative; + overflow-x: auto; + overflow-y: hidden; + height: 48px; + width: 100%; + background-color: #fff; + margin: 0 auto; + white-space: nowrap; +} + +.tabs.tabs-transparent { + background-color: transparent; +} + +.tabs.tabs-transparent .tab a, +.tabs.tabs-transparent .tab.disabled a, +.tabs.tabs-transparent .tab.disabled a:hover { + color: rgba(255, 255, 255, 0.7); +} + +.tabs.tabs-transparent .tab a:hover, +.tabs.tabs-transparent .tab a.active { + color: #fff; +} + +.tabs.tabs-transparent .indicator { + background-color: #fff; +} + +.tabs.tabs-fixed-width { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.tabs.tabs-fixed-width .tab { + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.tabs .tab { + display: inline-block; + text-align: center; + line-height: 48px; + height: 48px; + padding: 0; + margin: 0; + text-transform: uppercase; +} + +.tabs .tab a { + color: rgba(238, 110, 115, 0.7); + display: block; + width: 100%; + height: 100%; + padding: 0 24px; + font-size: 14px; + text-overflow: ellipsis; + overflow: hidden; + -webkit-transition: color .28s ease, background-color .28s ease; + transition: color .28s ease, background-color .28s ease; +} + +.tabs .tab a:focus, .tabs .tab a:focus.active { + background-color: rgba(246, 178, 181, 0.2); + outline: none; +} + +.tabs .tab a:hover, .tabs .tab a.active { + background-color: transparent; + color: #ee6e73; +} + +.tabs .tab.disabled a, +.tabs .tab.disabled a:hover { + color: rgba(238, 110, 115, 0.4); + cursor: default; +} + +.tabs .indicator { + position: absolute; + bottom: 0; + height: 2px; + background-color: #f6b2b5; + will-change: left, right; +} + +@media only screen and (max-width: 992px) { + .tabs { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + } + .tabs .tab { + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + } + .tabs .tab a { + padding: 0 12px; + } +} + +.material-tooltip { + padding: 10px 8px; + font-size: 1rem; + z-index: 2000; + background-color: transparent; + border-radius: 2px; + color: #fff; + min-height: 36px; + line-height: 120%; + opacity: 0; + position: absolute; + text-align: center; + max-width: calc(100% - 4px); + overflow: hidden; + left: 0; + top: 0; + pointer-events: none; + visibility: hidden; + background-color: #323232; +} + +.backdrop { + position: absolute; + opacity: 0; + height: 7px; + width: 14px; + border-radius: 0 0 50% 50%; + background-color: #323232; + z-index: -1; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + visibility: hidden; +} + +.btn, .btn-large, .btn-small, +.btn-flat { + border: none; + border-radius: 2px; + display: inline-block; + height: 36px; + line-height: 36px; + padding: 0 16px; + text-transform: uppercase; + vertical-align: middle; + -webkit-tap-highlight-color: transparent; +} + +.btn.disabled, .disabled.btn-large, .disabled.btn-small, +.btn-floating.disabled, +.btn-large.disabled, +.btn-small.disabled, +.btn-flat.disabled, +.btn:disabled, +.btn-large:disabled, +.btn-small:disabled, +.btn-floating:disabled, +.btn-large:disabled, +.btn-small:disabled, +.btn-flat:disabled, +.btn[disabled], +.btn-large[disabled], +.btn-small[disabled], +.btn-floating[disabled], +.btn-large[disabled], +.btn-small[disabled], +.btn-flat[disabled] { + pointer-events: none; + background-color: #DFDFDF !important; + -webkit-box-shadow: none; + box-shadow: none; + color: #9F9F9F !important; + cursor: default; +} + +.btn.disabled:hover, .disabled.btn-large:hover, .disabled.btn-small:hover, +.btn-floating.disabled:hover, +.btn-large.disabled:hover, +.btn-small.disabled:hover, +.btn-flat.disabled:hover, +.btn:disabled:hover, +.btn-large:disabled:hover, +.btn-small:disabled:hover, +.btn-floating:disabled:hover, +.btn-large:disabled:hover, +.btn-small:disabled:hover, +.btn-flat:disabled:hover, +.btn[disabled]:hover, +.btn-large[disabled]:hover, +.btn-small[disabled]:hover, +.btn-floating[disabled]:hover, +.btn-large[disabled]:hover, +.btn-small[disabled]:hover, +.btn-flat[disabled]:hover { + background-color: #DFDFDF !important; + color: #9F9F9F !important; +} + +.btn, .btn-large, .btn-small, +.btn-floating, +.btn-large, +.btn-small, +.btn-flat { + font-size: 14px; + outline: 0; +} + +.btn i, .btn-large i, .btn-small i, +.btn-floating i, +.btn-large i, +.btn-small i, +.btn-flat i { + font-size: 1.3rem; + line-height: inherit; +} + +.btn:focus, .btn-large:focus, .btn-small:focus, +.btn-floating:focus { + background-color: #1d7d74; +} + +.btn, .btn-large, .btn-small { + text-decoration: none; + color: #fff; + background-color: #26a69a; + text-align: center; + letter-spacing: .5px; + -webkit-transition: background-color .2s ease-out; + transition: background-color .2s ease-out; + cursor: pointer; +} + +.btn:hover, .btn-large:hover, .btn-small:hover { + background-color: #2bbbad; +} + +.btn-floating { + display: inline-block; + color: #fff; + position: relative; + overflow: hidden; + z-index: 1; + width: 40px; + height: 40px; + line-height: 40px; + padding: 0; + background-color: #26a69a; + border-radius: 50%; + -webkit-transition: background-color .3s; + transition: background-color .3s; + cursor: pointer; + vertical-align: middle; +} + +.btn-floating:hover { + background-color: #26a69a; +} + +.btn-floating:before { + border-radius: 0; +} + +.btn-floating.btn-large { + width: 56px; + height: 56px; + padding: 0; +} + +.btn-floating.btn-large.halfway-fab { + bottom: -28px; +} + +.btn-floating.btn-large i { + line-height: 56px; +} + +.btn-floating.btn-small { + width: 32.4px; + height: 32.4px; +} + +.btn-floating.btn-small.halfway-fab { + bottom: -16.2px; +} + +.btn-floating.btn-small i { + line-height: 32.4px; +} + +.btn-floating.halfway-fab { + position: absolute; + right: 24px; + bottom: -20px; +} + +.btn-floating.halfway-fab.left { + right: auto; + left: 24px; +} + +.btn-floating i { + width: inherit; + display: inline-block; + text-align: center; + color: #fff; + font-size: 1.6rem; + line-height: 40px; +} + +button.btn-floating { + border: none; +} + +.fixed-action-btn { + position: fixed; + right: 23px; + bottom: 23px; + padding-top: 15px; + margin-bottom: 0; + z-index: 997; +} + +.fixed-action-btn.active ul { + visibility: visible; +} + +.fixed-action-btn.direction-left, .fixed-action-btn.direction-right { + padding: 0 0 0 15px; +} + +.fixed-action-btn.direction-left ul, .fixed-action-btn.direction-right ul { + text-align: right; + right: 64px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + height: 100%; + left: auto; + /*width 100% only goes to width of button container */ + width: 500px; +} + +.fixed-action-btn.direction-left ul li, .fixed-action-btn.direction-right ul li { + display: inline-block; + margin: 7.5px 15px 0 0; +} + +.fixed-action-btn.direction-right { + padding: 0 15px 0 0; +} + +.fixed-action-btn.direction-right ul { + text-align: left; + direction: rtl; + left: 64px; + right: auto; +} + +.fixed-action-btn.direction-right ul li { + margin: 7.5px 0 0 15px; +} + +.fixed-action-btn.direction-bottom { + padding: 0 0 15px 0; +} + +.fixed-action-btn.direction-bottom ul { + top: 64px; + bottom: auto; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: reverse; + -webkit-flex-direction: column-reverse; + -ms-flex-direction: column-reverse; + flex-direction: column-reverse; +} + +.fixed-action-btn.direction-bottom ul li { + margin: 15px 0 0 0; +} + +.fixed-action-btn.toolbar { + padding: 0; + height: 56px; +} + +.fixed-action-btn.toolbar.active > a i { + opacity: 0; +} + +.fixed-action-btn.toolbar ul { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + top: 0; + bottom: 0; + z-index: 1; +} + +.fixed-action-btn.toolbar ul li { + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: inline-block; + margin: 0; + height: 100%; + -webkit-transition: none; + transition: none; +} + +.fixed-action-btn.toolbar ul li a { + display: block; + overflow: hidden; + position: relative; + width: 100%; + height: 100%; + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + line-height: 56px; + z-index: 1; +} + +.fixed-action-btn.toolbar ul li a i { + line-height: inherit; +} + +.fixed-action-btn ul { + left: 0; + right: 0; + text-align: center; + position: absolute; + bottom: 64px; + margin: 0; + visibility: hidden; +} + +.fixed-action-btn ul li { + margin-bottom: 15px; +} + +.fixed-action-btn ul a.btn-floating { + opacity: 0; +} + +.fixed-action-btn .fab-backdrop { + position: absolute; + top: 0; + left: 0; + z-index: -1; + width: 40px; + height: 40px; + background-color: #26a69a; + border-radius: 50%; + -webkit-transform: scale(0); + transform: scale(0); +} + +.btn-flat { + -webkit-box-shadow: none; + box-shadow: none; + background-color: transparent; + color: #343434; + cursor: pointer; + -webkit-transition: background-color .2s; + transition: background-color .2s; +} + +.btn-flat:focus, .btn-flat:hover { + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-flat:focus { + background-color: rgba(0, 0, 0, 0.1); +} + +.btn-flat.disabled, .btn-flat.btn-flat[disabled] { + background-color: transparent !important; + color: #b3b2b2 !important; + cursor: default; +} + +.btn-large { + height: 54px; + line-height: 54px; + font-size: 15px; + padding: 0 28px; +} + +.btn-large i { + font-size: 1.6rem; +} + +.btn-small { + height: 32.4px; + line-height: 32.4px; + font-size: 13px; +} + +.btn-small i { + font-size: 1.2rem; +} + +.btn-block { + display: block; +} + +.dropdown-content { + background-color: #fff; + margin: 0; + display: none; + min-width: 100px; + overflow-y: auto; + opacity: 0; + position: absolute; + left: 0; + top: 0; + z-index: 9999; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} + +.dropdown-content:focus { + outline: 0; +} + +.dropdown-content li { + clear: both; + color: rgba(0, 0, 0, 0.87); + cursor: pointer; + min-height: 50px; + line-height: 1.5rem; + width: 100%; + text-align: left; +} + +.dropdown-content li:hover, .dropdown-content li.active { + background-color: #eee; +} + +.dropdown-content li:focus { + outline: none; +} + +.dropdown-content li.divider { + min-height: 0; + height: 1px; +} + +.dropdown-content li > a, .dropdown-content li > span { + font-size: 16px; + color: #26a69a; + display: block; + line-height: 22px; + padding: 14px 16px; +} + +.dropdown-content li > span > label { + top: 1px; + left: 0; + height: 18px; +} + +.dropdown-content li > a > i { + height: inherit; + line-height: inherit; + float: left; + margin: 0 24px 0 0; + width: 24px; +} + +body.keyboard-focused .dropdown-content li:focus { + background-color: #dadada; +} + +.input-field.col .dropdown-content [type="checkbox"] + label { + top: 1px; + left: 0; + height: 18px; + -webkit-transform: none; + transform: none; +} + +.dropdown-trigger { + cursor: pointer; +} + +/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */ +.waves-effect { + position: relative; + cursor: pointer; + display: inline-block; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + vertical-align: middle; + z-index: 1; + -webkit-transition: .3s ease-out; + transition: .3s ease-out; +} + +.waves-effect .waves-ripple { + position: absolute; + border-radius: 50%; + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + opacity: 0; + background: rgba(0, 0, 0, 0.2); + -webkit-transition: all 0.7s ease-out; + transition: all 0.7s ease-out; + -webkit-transition-property: opacity, -webkit-transform; + transition-property: opacity, -webkit-transform; + transition-property: transform, opacity; + transition-property: transform, opacity, -webkit-transform; + -webkit-transform: scale(0); + transform: scale(0); + pointer-events: none; +} + +.waves-effect.waves-light .waves-ripple { + background-color: rgba(255, 255, 255, 0.45); +} + +.waves-effect.waves-red .waves-ripple { + background-color: rgba(244, 67, 54, 0.7); +} + +.waves-effect.waves-yellow .waves-ripple { + background-color: rgba(255, 235, 59, 0.7); +} + +.waves-effect.waves-orange .waves-ripple { + background-color: rgba(255, 152, 0, 0.7); +} + +.waves-effect.waves-purple .waves-ripple { + background-color: rgba(156, 39, 176, 0.7); +} + +.waves-effect.waves-green .waves-ripple { + background-color: rgba(76, 175, 80, 0.7); +} + +.waves-effect.waves-teal .waves-ripple { + background-color: rgba(0, 150, 136, 0.7); +} + +.waves-effect input[type="button"], .waves-effect input[type="reset"], .waves-effect input[type="submit"] { + border: 0; + font-style: normal; + font-size: inherit; + text-transform: inherit; + background: none; +} + +.waves-effect img { + position: relative; + z-index: -1; +} + +.waves-notransition { + -webkit-transition: none !important; + transition: none !important; +} + +.waves-circle { + -webkit-transform: translateZ(0); + transform: translateZ(0); + -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); +} + +.waves-input-wrapper { + border-radius: 0.2em; + vertical-align: bottom; +} + +.waves-input-wrapper .waves-button-input { + position: relative; + top: 0; + left: 0; + z-index: 1; +} + +.waves-circle { + text-align: center; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; + border-radius: 50%; + -webkit-mask-image: none; +} + +.waves-block { + display: block; +} + +/* Firefox Bug: link not triggered */ +.waves-effect .waves-ripple { + z-index: -1; +} + +.modal { + display: none; + position: fixed; + left: 0; + right: 0; + background-color: #fafafa; + padding: 0; + max-height: 70%; + width: 55%; + margin: auto; + overflow-y: auto; + border-radius: 2px; + will-change: top, opacity; +} + +.modal:focus { + outline: none; +} + +@media only screen and (max-width: 992px) { + .modal { + width: 80%; + } +} + +.modal h1, .modal h2, .modal h3, .modal h4 { + margin-top: 0; +} + +.modal .modal-content { + padding: 24px; +} + +.modal .modal-close { + cursor: pointer; +} + +.modal .modal-footer { + border-radius: 0 0 2px 2px; + background-color: #fafafa; + padding: 4px 6px; + height: 56px; + width: 100%; + text-align: right; +} + +.modal .modal-footer .btn, .modal .modal-footer .btn-large, .modal .modal-footer .btn-small, .modal .modal-footer .btn-flat { + margin: 6px 0; +} + +.modal-overlay { + position: fixed; + z-index: 999; + top: -25%; + left: 0; + bottom: 0; + right: 0; + height: 125%; + width: 100%; + background: #000; + display: none; + will-change: opacity; +} + +.modal.modal-fixed-footer { + padding: 0; + height: 70%; +} + +.modal.modal-fixed-footer .modal-content { + position: absolute; + height: calc(100% - 56px); + max-height: 100%; + width: 100%; + overflow-y: auto; +} + +.modal.modal-fixed-footer .modal-footer { + border-top: 1px solid rgba(0, 0, 0, 0.1); + position: absolute; + bottom: 0; +} + +.modal.bottom-sheet { + top: auto; + bottom: -100%; + margin: 0; + width: 100%; + max-height: 45%; + border-radius: 0; + will-change: bottom, opacity; +} + +.collapsible { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; + border-left: 1px solid #ddd; + margin: 0.5rem 0 1rem 0; +} + +.collapsible-header { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + cursor: pointer; + -webkit-tap-highlight-color: transparent; + line-height: 1.5; + padding: 1rem; + background-color: #fff; + border-bottom: 1px solid #ddd; +} + +.collapsible-header:focus { + outline: 0; +} + +.collapsible-header i { + width: 2rem; + font-size: 1.6rem; + display: inline-block; + text-align: center; + margin-right: 1rem; +} + +.keyboard-focused .collapsible-header:focus { + background-color: #eee; +} + +.collapsible-body { + display: none; + border-bottom: 1px solid #ddd; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 2rem; +} + +.sidenav .collapsible, +.sidenav.fixed .collapsible { + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.sidenav .collapsible li, +.sidenav.fixed .collapsible li { + padding: 0; +} + +.sidenav .collapsible-header, +.sidenav.fixed .collapsible-header { + background-color: transparent; + border: none; + line-height: inherit; + height: inherit; + padding: 0 16px; +} + +.sidenav .collapsible-header:hover, +.sidenav.fixed .collapsible-header:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.sidenav .collapsible-header i, +.sidenav.fixed .collapsible-header i { + line-height: inherit; +} + +.sidenav .collapsible-body, +.sidenav.fixed .collapsible-body { + border: 0; + background-color: #fff; +} + +.sidenav .collapsible-body li a, +.sidenav.fixed .collapsible-body li a { + padding: 0 23.5px 0 31px; +} + +.collapsible.popout { + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.collapsible.popout > li { + -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + margin: 0 24px; + -webkit-transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); +} + +.collapsible.popout > li.active { + -webkit-box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); + margin: 16px 0; +} + +.chip { + display: inline-block; + height: 32px; + font-size: 13px; + font-weight: 500; + color: rgba(0, 0, 0, 0.6); + line-height: 32px; + padding: 0 12px; + border-radius: 16px; + background-color: #e4e4e4; + margin-bottom: 5px; + margin-right: 5px; +} + +.chip:focus { + outline: none; + background-color: #26a69a; + color: #fff; +} + +.chip > img { + float: left; + margin: 0 8px 0 -12px; + height: 32px; + width: 32px; + border-radius: 50%; +} + +.chip .close { + cursor: pointer; + float: right; + font-size: 16px; + line-height: 32px; + padding-left: 8px; +} + +.chips { + border: none; + border-bottom: 1px solid #9e9e9e; + -webkit-box-shadow: none; + box-shadow: none; + margin: 0 0 8px 0; + min-height: 45px; + outline: none; + -webkit-transition: all .3s; + transition: all .3s; +} + +.chips.focus { + border-bottom: 1px solid #26a69a; + -webkit-box-shadow: 0 1px 0 0 #26a69a; + box-shadow: 0 1px 0 0 #26a69a; +} + +.chips:hover { + cursor: text; +} + +.chips .input { + background: none; + border: 0; + color: rgba(0, 0, 0, 0.6); + display: inline-block; + font-size: 16px; + height: 3rem; + line-height: 32px; + outline: 0; + margin: 0; + padding: 0 !important; + width: 120px !important; +} + +.chips .input:focus { + border: 0 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +.chips .autocomplete-content { + margin-top: 0; + margin-bottom: 0; +} + +.prefix ~ .chips { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.chips:empty ~ label { + font-size: 0.8rem; + -webkit-transform: translateY(-140%); + transform: translateY(-140%); +} + +.materialboxed { + display: block; + cursor: -webkit-zoom-in; + cursor: zoom-in; + position: relative; + -webkit-transition: opacity .4s; + transition: opacity .4s; + -webkit-backface-visibility: hidden; +} + +.materialboxed:hover:not(.active) { + opacity: .8; +} + +.materialboxed.active { + cursor: -webkit-zoom-out; + cursor: zoom-out; +} + +#materialbox-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #292929; + z-index: 1000; + will-change: opacity; +} + +.materialbox-caption { + position: fixed; + display: none; + color: #fff; + line-height: 50px; + bottom: 0; + left: 0; + width: 100%; + text-align: center; + padding: 0% 15%; + height: 50px; + z-index: 1000; + -webkit-font-smoothing: antialiased; +} + +select:focus { + outline: 1px solid #c9f3ef; +} + +button:focus { + outline: none; + background-color: #2ab7a9; +} + +label { + font-size: 0.8rem; + color: #9e9e9e; +} + +/* Text Inputs + Textarea + ========================================================================== */ +/* Style Placeholders */ +::-webkit-input-placeholder { + color: #d1d1d1; +} +::-moz-placeholder { + color: #d1d1d1; +} +:-ms-input-placeholder { + color: #d1d1d1; +} +::-ms-input-placeholder { + color: #d1d1d1; +} +::placeholder { + color: #d1d1d1; +} + +/* Text inputs */ +input:not([type]), +input[type=text]:not(.browser-default), +input[type=password]:not(.browser-default), +input[type=email]:not(.browser-default), +input[type=url]:not(.browser-default), +input[type=time]:not(.browser-default), +input[type=date]:not(.browser-default), +input[type=datetime]:not(.browser-default), +input[type=datetime-local]:not(.browser-default), +input[type=tel]:not(.browser-default), +input[type=number]:not(.browser-default), +input[type=search]:not(.browser-default), +textarea.materialize-textarea { + background-color: transparent; + border: none; + border-bottom: 1px solid #9e9e9e; + border-radius: 0; + outline: none; + height: 3rem; + width: 100%; + font-size: 16px; + margin: 0 0 8px 0; + padding: 0; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-box-sizing: content-box; + box-sizing: content-box; + -webkit-transition: border .3s, -webkit-box-shadow .3s; + transition: border .3s, -webkit-box-shadow .3s; + transition: box-shadow .3s, border .3s; + transition: box-shadow .3s, border .3s, -webkit-box-shadow .3s; +} + +input:not([type]):disabled, input:not([type])[readonly="readonly"], +input[type=text]:not(.browser-default):disabled, +input[type=text]:not(.browser-default)[readonly="readonly"], +input[type=password]:not(.browser-default):disabled, +input[type=password]:not(.browser-default)[readonly="readonly"], +input[type=email]:not(.browser-default):disabled, +input[type=email]:not(.browser-default)[readonly="readonly"], +input[type=url]:not(.browser-default):disabled, +input[type=url]:not(.browser-default)[readonly="readonly"], +input[type=time]:not(.browser-default):disabled, +input[type=time]:not(.browser-default)[readonly="readonly"], +input[type=date]:not(.browser-default):disabled, +input[type=date]:not(.browser-default)[readonly="readonly"], +input[type=datetime]:not(.browser-default):disabled, +input[type=datetime]:not(.browser-default)[readonly="readonly"], +input[type=datetime-local]:not(.browser-default):disabled, +input[type=datetime-local]:not(.browser-default)[readonly="readonly"], +input[type=tel]:not(.browser-default):disabled, +input[type=tel]:not(.browser-default)[readonly="readonly"], +input[type=number]:not(.browser-default):disabled, +input[type=number]:not(.browser-default)[readonly="readonly"], +input[type=search]:not(.browser-default):disabled, +input[type=search]:not(.browser-default)[readonly="readonly"], +textarea.materialize-textarea:disabled, +textarea.materialize-textarea[readonly="readonly"] { + color: rgba(0, 0, 0, 0.42); + border-bottom: 1px dotted rgba(0, 0, 0, 0.42); +} + +input:not([type]):disabled + label, +input:not([type])[readonly="readonly"] + label, +input[type=text]:not(.browser-default):disabled + label, +input[type=text]:not(.browser-default)[readonly="readonly"] + label, +input[type=password]:not(.browser-default):disabled + label, +input[type=password]:not(.browser-default)[readonly="readonly"] + label, +input[type=email]:not(.browser-default):disabled + label, +input[type=email]:not(.browser-default)[readonly="readonly"] + label, +input[type=url]:not(.browser-default):disabled + label, +input[type=url]:not(.browser-default)[readonly="readonly"] + label, +input[type=time]:not(.browser-default):disabled + label, +input[type=time]:not(.browser-default)[readonly="readonly"] + label, +input[type=date]:not(.browser-default):disabled + label, +input[type=date]:not(.browser-default)[readonly="readonly"] + label, +input[type=datetime]:not(.browser-default):disabled + label, +input[type=datetime]:not(.browser-default)[readonly="readonly"] + label, +input[type=datetime-local]:not(.browser-default):disabled + label, +input[type=datetime-local]:not(.browser-default)[readonly="readonly"] + label, +input[type=tel]:not(.browser-default):disabled + label, +input[type=tel]:not(.browser-default)[readonly="readonly"] + label, +input[type=number]:not(.browser-default):disabled + label, +input[type=number]:not(.browser-default)[readonly="readonly"] + label, +input[type=search]:not(.browser-default):disabled + label, +input[type=search]:not(.browser-default)[readonly="readonly"] + label, +textarea.materialize-textarea:disabled + label, +textarea.materialize-textarea[readonly="readonly"] + label { + color: rgba(0, 0, 0, 0.42); +} + +input:not([type]):focus:not([readonly]), +input[type=text]:not(.browser-default):focus:not([readonly]), +input[type=password]:not(.browser-default):focus:not([readonly]), +input[type=email]:not(.browser-default):focus:not([readonly]), +input[type=url]:not(.browser-default):focus:not([readonly]), +input[type=time]:not(.browser-default):focus:not([readonly]), +input[type=date]:not(.browser-default):focus:not([readonly]), +input[type=datetime]:not(.browser-default):focus:not([readonly]), +input[type=datetime-local]:not(.browser-default):focus:not([readonly]), +input[type=tel]:not(.browser-default):focus:not([readonly]), +input[type=number]:not(.browser-default):focus:not([readonly]), +input[type=search]:not(.browser-default):focus:not([readonly]), +textarea.materialize-textarea:focus:not([readonly]) { + border-bottom: 1px solid #26a69a; + -webkit-box-shadow: 0 1px 0 0 #26a69a; + box-shadow: 0 1px 0 0 #26a69a; +} + +input:not([type]):focus:not([readonly]) + label, +input[type=text]:not(.browser-default):focus:not([readonly]) + label, +input[type=password]:not(.browser-default):focus:not([readonly]) + label, +input[type=email]:not(.browser-default):focus:not([readonly]) + label, +input[type=url]:not(.browser-default):focus:not([readonly]) + label, +input[type=time]:not(.browser-default):focus:not([readonly]) + label, +input[type=date]:not(.browser-default):focus:not([readonly]) + label, +input[type=datetime]:not(.browser-default):focus:not([readonly]) + label, +input[type=datetime-local]:not(.browser-default):focus:not([readonly]) + label, +input[type=tel]:not(.browser-default):focus:not([readonly]) + label, +input[type=number]:not(.browser-default):focus:not([readonly]) + label, +input[type=search]:not(.browser-default):focus:not([readonly]) + label, +textarea.materialize-textarea:focus:not([readonly]) + label { + color: #26a69a; +} + +input:not([type]):focus.valid ~ label, +input[type=text]:not(.browser-default):focus.valid ~ label, +input[type=password]:not(.browser-default):focus.valid ~ label, +input[type=email]:not(.browser-default):focus.valid ~ label, +input[type=url]:not(.browser-default):focus.valid ~ label, +input[type=time]:not(.browser-default):focus.valid ~ label, +input[type=date]:not(.browser-default):focus.valid ~ label, +input[type=datetime]:not(.browser-default):focus.valid ~ label, +input[type=datetime-local]:not(.browser-default):focus.valid ~ label, +input[type=tel]:not(.browser-default):focus.valid ~ label, +input[type=number]:not(.browser-default):focus.valid ~ label, +input[type=search]:not(.browser-default):focus.valid ~ label, +textarea.materialize-textarea:focus.valid ~ label { + color: #4CAF50; +} + +input:not([type]):focus.invalid ~ label, +input[type=text]:not(.browser-default):focus.invalid ~ label, +input[type=password]:not(.browser-default):focus.invalid ~ label, +input[type=email]:not(.browser-default):focus.invalid ~ label, +input[type=url]:not(.browser-default):focus.invalid ~ label, +input[type=time]:not(.browser-default):focus.invalid ~ label, +input[type=date]:not(.browser-default):focus.invalid ~ label, +input[type=datetime]:not(.browser-default):focus.invalid ~ label, +input[type=datetime-local]:not(.browser-default):focus.invalid ~ label, +input[type=tel]:not(.browser-default):focus.invalid ~ label, +input[type=number]:not(.browser-default):focus.invalid ~ label, +input[type=search]:not(.browser-default):focus.invalid ~ label, +textarea.materialize-textarea:focus.invalid ~ label { + color: #F44336; +} + +input:not([type]).validate + label, +input[type=text]:not(.browser-default).validate + label, +input[type=password]:not(.browser-default).validate + label, +input[type=email]:not(.browser-default).validate + label, +input[type=url]:not(.browser-default).validate + label, +input[type=time]:not(.browser-default).validate + label, +input[type=date]:not(.browser-default).validate + label, +input[type=datetime]:not(.browser-default).validate + label, +input[type=datetime-local]:not(.browser-default).validate + label, +input[type=tel]:not(.browser-default).validate + label, +input[type=number]:not(.browser-default).validate + label, +input[type=search]:not(.browser-default).validate + label, +textarea.materialize-textarea.validate + label { + width: 100%; +} + +/* Validation Sass Placeholders */ +input.valid:not([type]), input.valid:not([type]):focus, +input.valid[type=text]:not(.browser-default), +input.valid[type=text]:not(.browser-default):focus, +input.valid[type=password]:not(.browser-default), +input.valid[type=password]:not(.browser-default):focus, +input.valid[type=email]:not(.browser-default), +input.valid[type=email]:not(.browser-default):focus, +input.valid[type=url]:not(.browser-default), +input.valid[type=url]:not(.browser-default):focus, +input.valid[type=time]:not(.browser-default), +input.valid[type=time]:not(.browser-default):focus, +input.valid[type=date]:not(.browser-default), +input.valid[type=date]:not(.browser-default):focus, +input.valid[type=datetime]:not(.browser-default), +input.valid[type=datetime]:not(.browser-default):focus, +input.valid[type=datetime-local]:not(.browser-default), +input.valid[type=datetime-local]:not(.browser-default):focus, +input.valid[type=tel]:not(.browser-default), +input.valid[type=tel]:not(.browser-default):focus, +input.valid[type=number]:not(.browser-default), +input.valid[type=number]:not(.browser-default):focus, +input.valid[type=search]:not(.browser-default), +input.valid[type=search]:not(.browser-default):focus, +textarea.materialize-textarea.valid, +textarea.materialize-textarea.valid:focus, .select-wrapper.valid > input.select-dropdown { + border-bottom: 1px solid #4CAF50; + -webkit-box-shadow: 0 1px 0 0 #4CAF50; + box-shadow: 0 1px 0 0 #4CAF50; +} + +input.invalid:not([type]), input.invalid:not([type]):focus, +input.invalid[type=text]:not(.browser-default), +input.invalid[type=text]:not(.browser-default):focus, +input.invalid[type=password]:not(.browser-default), +input.invalid[type=password]:not(.browser-default):focus, +input.invalid[type=email]:not(.browser-default), +input.invalid[type=email]:not(.browser-default):focus, +input.invalid[type=url]:not(.browser-default), +input.invalid[type=url]:not(.browser-default):focus, +input.invalid[type=time]:not(.browser-default), +input.invalid[type=time]:not(.browser-default):focus, +input.invalid[type=date]:not(.browser-default), +input.invalid[type=date]:not(.browser-default):focus, +input.invalid[type=datetime]:not(.browser-default), +input.invalid[type=datetime]:not(.browser-default):focus, +input.invalid[type=datetime-local]:not(.browser-default), +input.invalid[type=datetime-local]:not(.browser-default):focus, +input.invalid[type=tel]:not(.browser-default), +input.invalid[type=tel]:not(.browser-default):focus, +input.invalid[type=number]:not(.browser-default), +input.invalid[type=number]:not(.browser-default):focus, +input.invalid[type=search]:not(.browser-default), +input.invalid[type=search]:not(.browser-default):focus, +textarea.materialize-textarea.invalid, +textarea.materialize-textarea.invalid:focus, .select-wrapper.invalid > input.select-dropdown, +.select-wrapper.invalid > input.select-dropdown:focus { + border-bottom: 1px solid #F44336; + -webkit-box-shadow: 0 1px 0 0 #F44336; + box-shadow: 0 1px 0 0 #F44336; +} + +input:not([type]).valid ~ .helper-text[data-success], +input:not([type]):focus.valid ~ .helper-text[data-success], +input:not([type]).invalid ~ .helper-text[data-error], +input:not([type]):focus.invalid ~ .helper-text[data-error], +input[type=text]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=text]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=text]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=text]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=password]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=password]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=password]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=password]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=email]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=email]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=email]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=email]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=url]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=url]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=url]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=url]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=time]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=time]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=time]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=time]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=date]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=date]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=date]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=date]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=datetime]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=datetime]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=datetime-local]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=tel]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=tel]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=tel]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=number]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=number]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=number]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=number]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=search]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=search]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=search]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=search]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +textarea.materialize-textarea.valid ~ .helper-text[data-success], +textarea.materialize-textarea:focus.valid ~ .helper-text[data-success], +textarea.materialize-textarea.invalid ~ .helper-text[data-error], +textarea.materialize-textarea:focus.invalid ~ .helper-text[data-error], .select-wrapper.valid .helper-text[data-success], +.select-wrapper.invalid ~ .helper-text[data-error] { + color: transparent; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; +} + +input:not([type]).valid ~ .helper-text:after, +input:not([type]):focus.valid ~ .helper-text:after, +input[type=text]:not(.browser-default).valid ~ .helper-text:after, +input[type=text]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=password]:not(.browser-default).valid ~ .helper-text:after, +input[type=password]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=email]:not(.browser-default).valid ~ .helper-text:after, +input[type=email]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=url]:not(.browser-default).valid ~ .helper-text:after, +input[type=url]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=time]:not(.browser-default).valid ~ .helper-text:after, +input[type=time]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=date]:not(.browser-default).valid ~ .helper-text:after, +input[type=date]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=datetime]:not(.browser-default).valid ~ .helper-text:after, +input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default).valid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=tel]:not(.browser-default).valid ~ .helper-text:after, +input[type=tel]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=number]:not(.browser-default).valid ~ .helper-text:after, +input[type=number]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=search]:not(.browser-default).valid ~ .helper-text:after, +input[type=search]:not(.browser-default):focus.valid ~ .helper-text:after, +textarea.materialize-textarea.valid ~ .helper-text:after, +textarea.materialize-textarea:focus.valid ~ .helper-text:after, .select-wrapper.valid ~ .helper-text:after { + content: attr(data-success); + color: #4CAF50; +} + +input:not([type]).invalid ~ .helper-text:after, +input:not([type]):focus.invalid ~ .helper-text:after, +input[type=text]:not(.browser-default).invalid ~ .helper-text:after, +input[type=text]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=password]:not(.browser-default).invalid ~ .helper-text:after, +input[type=password]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=email]:not(.browser-default).invalid ~ .helper-text:after, +input[type=email]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=url]:not(.browser-default).invalid ~ .helper-text:after, +input[type=url]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=time]:not(.browser-default).invalid ~ .helper-text:after, +input[type=time]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=date]:not(.browser-default).invalid ~ .helper-text:after, +input[type=date]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=datetime]:not(.browser-default).invalid ~ .helper-text:after, +input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=tel]:not(.browser-default).invalid ~ .helper-text:after, +input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=number]:not(.browser-default).invalid ~ .helper-text:after, +input[type=number]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=search]:not(.browser-default).invalid ~ .helper-text:after, +input[type=search]:not(.browser-default):focus.invalid ~ .helper-text:after, +textarea.materialize-textarea.invalid ~ .helper-text:after, +textarea.materialize-textarea:focus.invalid ~ .helper-text:after, .select-wrapper.invalid ~ .helper-text:after { + content: attr(data-error); + color: #F44336; +} + +input:not([type]) + label:after, +input[type=text]:not(.browser-default) + label:after, +input[type=password]:not(.browser-default) + label:after, +input[type=email]:not(.browser-default) + label:after, +input[type=url]:not(.browser-default) + label:after, +input[type=time]:not(.browser-default) + label:after, +input[type=date]:not(.browser-default) + label:after, +input[type=datetime]:not(.browser-default) + label:after, +input[type=datetime-local]:not(.browser-default) + label:after, +input[type=tel]:not(.browser-default) + label:after, +input[type=number]:not(.browser-default) + label:after, +input[type=search]:not(.browser-default) + label:after, +textarea.materialize-textarea + label:after, .select-wrapper + label:after { + display: block; + content: ""; + position: absolute; + top: 100%; + left: 0; + opacity: 0; + -webkit-transition: .2s opacity ease-out, .2s color ease-out; + transition: .2s opacity ease-out, .2s color ease-out; +} + +.input-field { + position: relative; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.input-field.inline { + display: inline-block; + vertical-align: middle; + margin-left: 5px; +} + +.input-field.inline input, +.input-field.inline .select-dropdown { + margin-bottom: 1rem; +} + +.input-field.col label { + left: 0.75rem; +} + +.input-field.col .prefix ~ label, +.input-field.col .prefix ~ .validate ~ label { + width: calc(100% - 3rem - 1.5rem); +} + +.input-field > label { + color: #9e9e9e; + position: absolute; + top: 0; + left: 0; + font-size: 1rem; + cursor: text; + -webkit-transition: color .2s ease-out, -webkit-transform .2s ease-out; + transition: color .2s ease-out, -webkit-transform .2s ease-out; + transition: transform .2s ease-out, color .2s ease-out; + transition: transform .2s ease-out, color .2s ease-out, -webkit-transform .2s ease-out; + -webkit-transform-origin: 0% 100%; + transform-origin: 0% 100%; + text-align: initial; + -webkit-transform: translateY(12px); + transform: translateY(12px); +} + +.input-field > label:not(.label-icon).active { + -webkit-transform: translateY(-14px) scale(0.8); + transform: translateY(-14px) scale(0.8); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} + +.input-field > input[type]:-webkit-autofill:not(.browser-default):not([type="search"]) + label, +.input-field > input[type=date]:not(.browser-default) + label, +.input-field > input[type=time]:not(.browser-default) + label { + -webkit-transform: translateY(-14px) scale(0.8); + transform: translateY(-14px) scale(0.8); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} + +.input-field .helper-text { + position: relative; + min-height: 18px; + display: block; + font-size: 12px; + color: rgba(0, 0, 0, 0.54); +} + +.input-field .helper-text::after { + opacity: 1; + position: absolute; + top: 0; + left: 0; +} + +.input-field .prefix { + position: absolute; + width: 3rem; + font-size: 2rem; + -webkit-transition: color .2s; + transition: color .2s; + top: 0.5rem; +} + +.input-field .prefix.active { + color: #26a69a; +} + +.input-field .prefix ~ input, +.input-field .prefix ~ textarea, +.input-field .prefix ~ label, +.input-field .prefix ~ .validate ~ label, +.input-field .prefix ~ .helper-text, +.input-field .prefix ~ .autocomplete-content { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.input-field .prefix ~ label { + margin-left: 3rem; +} + +@media only screen and (max-width: 992px) { + .input-field .prefix ~ input { + width: 86%; + width: calc(100% - 3rem); + } +} + +@media only screen and (max-width: 600px) { + .input-field .prefix ~ input { + width: 80%; + width: calc(100% - 3rem); + } +} + +/* Search Field */ +.input-field input[type=search] { + display: block; + line-height: inherit; + -webkit-transition: .3s background-color; + transition: .3s background-color; +} + +.nav-wrapper .input-field input[type=search] { + height: inherit; + padding-left: 4rem; + width: calc(100% - 4rem); + border: 0; + -webkit-box-shadow: none; + box-shadow: none; +} + +.input-field input[type=search]:focus:not(.browser-default) { + background-color: #fff; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + color: #444; +} + +.input-field input[type=search]:focus:not(.browser-default) + label i, +.input-field input[type=search]:focus:not(.browser-default) ~ .mdi-navigation-close, +.input-field input[type=search]:focus:not(.browser-default) ~ .material-icons { + color: #444; +} + +.input-field input[type=search] + .label-icon { + -webkit-transform: none; + transform: none; + left: 1rem; +} + +.input-field input[type=search] ~ .mdi-navigation-close, +.input-field input[type=search] ~ .material-icons { + position: absolute; + top: 0; + right: 1rem; + color: transparent; + cursor: pointer; + font-size: 2rem; + -webkit-transition: .3s color; + transition: .3s color; +} + +/* Textarea */ +textarea { + width: 100%; + height: 3rem; + background-color: transparent; +} + +textarea.materialize-textarea { + line-height: normal; + overflow-y: hidden; + /* prevents scroll bar flash */ + padding: .8rem 0 .8rem 0; + /* prevents text jump on Enter keypress */ + resize: none; + min-height: 3rem; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.hiddendiv { + visibility: hidden; + white-space: pre-wrap; + word-wrap: break-word; + overflow-wrap: break-word; + /* future version of deprecated 'word-wrap' */ + padding-top: 1.2rem; + /* prevents text jump on Enter keypress */ + position: absolute; + top: 0; + z-index: -1; +} + +/* Autocomplete */ +.autocomplete-content li .highlight { + color: #444; +} + +.autocomplete-content li img { + height: 40px; + width: 40px; + margin: 5px 15px; +} + +/* Character Counter */ +.character-counter { + min-height: 18px; +} + +/* Radio Buttons + ========================================================================== */ +[type="radio"]:not(:checked), +[type="radio"]:checked { + position: absolute; + opacity: 0; + pointer-events: none; +} + +[type="radio"]:not(:checked) + span, +[type="radio"]:checked + span { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + -webkit-transition: .28s ease; + transition: .28s ease; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +[type="radio"] + span:before, +[type="radio"] + span:after { + content: ''; + position: absolute; + left: 0; + top: 0; + margin: 4px; + width: 16px; + height: 16px; + z-index: 0; + -webkit-transition: .28s ease; + transition: .28s ease; +} + +/* Unchecked styles */ +[type="radio"]:not(:checked) + span:before, +[type="radio"]:not(:checked) + span:after, +[type="radio"]:checked + span:before, +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:before, +[type="radio"].with-gap:checked + span:after { + border-radius: 50%; +} + +[type="radio"]:not(:checked) + span:before, +[type="radio"]:not(:checked) + span:after { + border: 2px solid #5a5a5a; +} + +[type="radio"]:not(:checked) + span:after { + -webkit-transform: scale(0); + transform: scale(0); +} + +/* Checked styles */ +[type="radio"]:checked + span:before { + border: 2px solid transparent; +} + +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:before, +[type="radio"].with-gap:checked + span:after { + border: 2px solid #26a69a; +} + +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:after { + background-color: #26a69a; +} + +[type="radio"]:checked + span:after { + -webkit-transform: scale(1.02); + transform: scale(1.02); +} + +/* Radio With gap */ +[type="radio"].with-gap:checked + span:after { + -webkit-transform: scale(0.5); + transform: scale(0.5); +} + +/* Focused styles */ +[type="radio"].tabbed:focus + span:before { + -webkit-box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); +} + +/* Disabled Radio With gap */ +[type="radio"].with-gap:disabled:checked + span:before { + border: 2px solid rgba(0, 0, 0, 0.42); +} + +[type="radio"].with-gap:disabled:checked + span:after { + border: none; + background-color: rgba(0, 0, 0, 0.42); +} + +/* Disabled style */ +[type="radio"]:disabled:not(:checked) + span:before, +[type="radio"]:disabled:checked + span:before { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.42); +} + +[type="radio"]:disabled + span { + color: rgba(0, 0, 0, 0.42); +} + +[type="radio"]:disabled:not(:checked) + span:before { + border-color: rgba(0, 0, 0, 0.42); +} + +[type="radio"]:disabled:checked + span:after { + background-color: rgba(0, 0, 0, 0.42); + border-color: #949494; +} + +/* Checkboxes + ========================================================================== */ +/* Remove default checkbox */ +[type="checkbox"]:not(:checked), +[type="checkbox"]:checked { + position: absolute; + opacity: 0; + pointer-events: none; +} + +[type="checkbox"] { + /* checkbox aspect */ +} + +[type="checkbox"] + span:not(.lever) { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +[type="checkbox"] + span:not(.lever):before, +[type="checkbox"]:not(.filled-in) + span:not(.lever):after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 18px; + z-index: 0; + border: 2px solid #5a5a5a; + border-radius: 1px; + margin-top: 3px; + -webkit-transition: .2s; + transition: .2s; +} + +[type="checkbox"]:not(.filled-in) + span:not(.lever):after { + border: 0; + -webkit-transform: scale(0); + transform: scale(0); +} + +[type="checkbox"]:not(:checked):disabled + span:not(.lever):before { + border: none; + background-color: rgba(0, 0, 0, 0.42); +} + +[type="checkbox"].tabbed:focus + span:not(.lever):after { + -webkit-transform: scale(1); + transform: scale(1); + border: 0; + border-radius: 50%; + -webkit-box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); + background-color: rgba(0, 0, 0, 0.1); +} + +[type="checkbox"]:checked + span:not(.lever):before { + top: -4px; + left: -5px; + width: 12px; + height: 22px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #26a69a; + border-bottom: 2px solid #26a69a; + -webkit-transform: rotate(40deg); + transform: rotate(40deg); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"]:checked:disabled + span:before { + border-right: 2px solid rgba(0, 0, 0, 0.42); + border-bottom: 2px solid rgba(0, 0, 0, 0.42); +} + +/* Indeterminate checkbox */ +[type="checkbox"]:indeterminate + span:not(.lever):before { + top: -11px; + left: -12px; + width: 10px; + height: 22px; + border-top: none; + border-left: none; + border-right: 2px solid #26a69a; + border-bottom: none; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"]:indeterminate:disabled + span:not(.lever):before { + border-right: 2px solid rgba(0, 0, 0, 0.42); + background-color: transparent; +} + +[type="checkbox"].filled-in + span:not(.lever):after { + border-radius: 2px; +} + +[type="checkbox"].filled-in + span:not(.lever):before, +[type="checkbox"].filled-in + span:not(.lever):after { + content: ''; + left: 0; + position: absolute; + /* .1s delay is for check animation */ + -webkit-transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; + transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; + z-index: 1; +} + +[type="checkbox"].filled-in:not(:checked) + span:not(.lever):before { + width: 0; + height: 0; + border: 3px solid transparent; + left: 6px; + top: 10px; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"].filled-in:not(:checked) + span:not(.lever):after { + height: 20px; + width: 20px; + background-color: transparent; + border: 2px solid #5a5a5a; + top: 0px; + z-index: 0; +} + +[type="checkbox"].filled-in:checked + span:not(.lever):before { + top: 0; + left: 1px; + width: 8px; + height: 13px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #fff; + border-bottom: 2px solid #fff; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"].filled-in:checked + span:not(.lever):after { + top: 0; + width: 20px; + height: 20px; + border: 2px solid #26a69a; + background-color: #26a69a; + z-index: 0; +} + +[type="checkbox"].filled-in.tabbed:focus + span:not(.lever):after { + border-radius: 2px; + border-color: #5a5a5a; + background-color: rgba(0, 0, 0, 0.1); +} + +[type="checkbox"].filled-in.tabbed:checked:focus + span:not(.lever):after { + border-radius: 2px; + background-color: #26a69a; + border-color: #26a69a; +} + +[type="checkbox"].filled-in:disabled:not(:checked) + span:not(.lever):before { + background-color: transparent; + border: 2px solid transparent; +} + +[type="checkbox"].filled-in:disabled:not(:checked) + span:not(.lever):after { + border-color: transparent; + background-color: #949494; +} + +[type="checkbox"].filled-in:disabled:checked + span:not(.lever):before { + background-color: transparent; +} + +[type="checkbox"].filled-in:disabled:checked + span:not(.lever):after { + background-color: #949494; + border-color: #949494; +} + +/* Switch + ========================================================================== */ +.switch, +.switch * { + -webkit-tap-highlight-color: transparent; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.switch label { + cursor: pointer; +} + +.switch label input[type=checkbox] { + opacity: 0; + width: 0; + height: 0; +} + +.switch label input[type=checkbox]:checked + .lever { + background-color: #84c7c1; +} + +.switch label input[type=checkbox]:checked + .lever:before, .switch label input[type=checkbox]:checked + .lever:after { + left: 18px; +} + +.switch label input[type=checkbox]:checked + .lever:after { + background-color: #26a69a; +} + +.switch label .lever { + content: ""; + display: inline-block; + position: relative; + width: 36px; + height: 14px; + background-color: rgba(0, 0, 0, 0.38); + border-radius: 15px; + margin-right: 10px; + -webkit-transition: background 0.3s ease; + transition: background 0.3s ease; + vertical-align: middle; + margin: 0 16px; +} + +.switch label .lever:before, .switch label .lever:after { + content: ""; + position: absolute; + display: inline-block; + width: 20px; + height: 20px; + border-radius: 50%; + left: 0; + top: -3px; + -webkit-transition: left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease; + transition: left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease; + transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease; + transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease; +} + +.switch label .lever:before { + background-color: rgba(38, 166, 154, 0.15); +} + +.switch label .lever:after { + background-color: #F1F1F1; + -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} + +input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before, +input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before { + -webkit-transform: scale(2.4); + transform: scale(2.4); + background-color: rgba(38, 166, 154, 0.15); +} + +input[type=checkbox]:not(:disabled) ~ .lever:active:before, +input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before { + -webkit-transform: scale(2.4); + transform: scale(2.4); + background-color: rgba(0, 0, 0, 0.08); +} + +.switch input[type=checkbox][disabled] + .lever { + cursor: default; + background-color: rgba(0, 0, 0, 0.12); +} + +.switch label input[type=checkbox][disabled] + .lever:after, +.switch label input[type=checkbox][disabled]:checked + .lever:after { + background-color: #949494; +} + +/* Select Field + ========================================================================== */ +select { + display: none; +} + +select.browser-default { + display: block; +} + +select { + background-color: rgba(255, 255, 255, 0.9); + width: 100%; + padding: 5px; + border: 1px solid #f2f2f2; + border-radius: 2px; + height: 3rem; +} + +.select-label { + position: absolute; +} + +.select-wrapper { + position: relative; +} + +.select-wrapper.valid + label, +.select-wrapper.invalid + label { + width: 100%; + pointer-events: none; +} + +.select-wrapper input.select-dropdown { + position: relative; + cursor: pointer; + background-color: transparent; + border: none; + border-bottom: 1px solid #9e9e9e; + outline: none; + height: 3rem; + line-height: 3rem; + width: 100%; + font-size: 16px; + margin: 0 0 8px 0; + padding: 0; + display: block; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 1; +} + +.select-wrapper input.select-dropdown:focus { + border-bottom: 1px solid #26a69a; +} + +.select-wrapper .caret { + position: absolute; + right: 0; + top: 0; + bottom: 0; + margin: auto 0; + z-index: 0; + fill: rgba(0, 0, 0, 0.87); +} + +.select-wrapper + label { + position: absolute; + top: -26px; + font-size: 0.8rem; +} + +select:disabled { + color: rgba(0, 0, 0, 0.42); +} + +.select-wrapper.disabled + label { + color: rgba(0, 0, 0, 0.42); +} + +.select-wrapper.disabled .caret { + fill: rgba(0, 0, 0, 0.42); +} + +.select-wrapper input.select-dropdown:disabled { + color: rgba(0, 0, 0, 0.42); + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.select-wrapper i { + color: rgba(0, 0, 0, 0.3); +} + +.select-dropdown li.disabled, +.select-dropdown li.disabled > span, +.select-dropdown li.optgroup { + color: rgba(0, 0, 0, 0.3); + background-color: transparent; +} + +body.keyboard-focused .select-dropdown.dropdown-content li:focus { + background-color: rgba(0, 0, 0, 0.08); +} + +.select-dropdown.dropdown-content li:hover { + background-color: rgba(0, 0, 0, 0.08); +} + +.select-dropdown.dropdown-content li.selected { + background-color: rgba(0, 0, 0, 0.03); +} + +.prefix ~ .select-wrapper { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.prefix ~ label { + margin-left: 3rem; +} + +.select-dropdown li img { + height: 40px; + width: 40px; + margin: 5px 15px; + float: right; +} + +.select-dropdown li.optgroup { + border-top: 1px solid #eee; +} + +.select-dropdown li.optgroup.selected > span { + color: rgba(0, 0, 0, 0.7); +} + +.select-dropdown li.optgroup > span { + color: rgba(0, 0, 0, 0.4); +} + +.select-dropdown li.optgroup ~ li.optgroup-option { + padding-left: 1rem; +} + +/* File Input + ========================================================================== */ +.file-field { + position: relative; +} + +.file-field .file-path-wrapper { + overflow: hidden; + padding-left: 10px; +} + +.file-field input.file-path { + width: 100%; +} + +.file-field .btn, .file-field .btn-large, .file-field .btn-small { + float: left; + height: 3rem; + line-height: 3rem; +} + +.file-field span { + cursor: pointer; +} + +.file-field input[type=file] { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + width: 100%; + margin: 0; + padding: 0; + font-size: 20px; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); +} + +.file-field input[type=file]::-webkit-file-upload-button { + display: none; +} + +/* Range + ========================================================================== */ +.range-field { + position: relative; +} + +input[type=range], +input[type=range] + .thumb { + cursor: pointer; +} + +input[type=range] { + position: relative; + background-color: transparent; + border: none; + outline: none; + width: 100%; + margin: 15px 0; + padding: 0; +} + +input[type=range]:focus { + outline: none; +} + +input[type=range] + .thumb { + position: absolute; + top: 10px; + left: 0; + border: none; + height: 0; + width: 0; + border-radius: 50%; + background-color: #26a69a; + margin-left: 7px; + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +input[type=range] + .thumb .value { + display: block; + width: 30px; + text-align: center; + color: #26a69a; + font-size: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +input[type=range] + .thumb.active { + border-radius: 50% 50% 50% 0; +} + +input[type=range] + .thumb.active .value { + color: #fff; + margin-left: -1px; + margin-top: 8px; + font-size: 10px; +} + +input[type=range] { + -webkit-appearance: none; +} + +input[type=range]::-webkit-slider-runnable-track { + height: 3px; + background: #c2c0c2; + border: none; +} + +input[type=range]::-webkit-slider-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #26a69a; + -webkit-transition: -webkit-box-shadow .3s; + transition: -webkit-box-shadow .3s; + transition: box-shadow .3s; + transition: box-shadow .3s, -webkit-box-shadow .3s; + -webkit-appearance: none; + background-color: #26a69a; + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + margin: -5px 0 0 0; +} + +.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb { + -webkit-box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26); + box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26); +} + +input[type=range] { + /* fix for FF unable to apply focus style bug */ + border: 1px solid white; + /*required for proper track sizing in FF*/ +} + +input[type=range]::-moz-range-track { + height: 3px; + background: #c2c0c2; + border: none; +} + +input[type=range]::-moz-focus-inner { + border: 0; +} + +input[type=range]::-moz-range-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #26a69a; + -webkit-transition: -webkit-box-shadow .3s; + transition: -webkit-box-shadow .3s; + transition: box-shadow .3s; + transition: box-shadow .3s, -webkit-box-shadow .3s; + margin-top: -5px; +} + +input[type=range]:-moz-focusring { + outline: 1px solid #fff; + outline-offset: -1px; +} + +.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb { + box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26); +} + +input[type=range]::-ms-track { + height: 3px; + background: transparent; + border-color: transparent; + border-width: 6px 0; + /*remove default tick marks*/ + color: transparent; +} + +input[type=range]::-ms-fill-lower { + background: #777; +} + +input[type=range]::-ms-fill-upper { + background: #ddd; +} + +input[type=range]::-ms-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #26a69a; + -webkit-transition: -webkit-box-shadow .3s; + transition: -webkit-box-shadow .3s; + transition: box-shadow .3s; + transition: box-shadow .3s, -webkit-box-shadow .3s; +} + +.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb { + box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26); +} + +/*************** + Nav List +***************/ +.table-of-contents.fixed { + position: fixed; +} + +.table-of-contents li { + padding: 2px 0; +} + +.table-of-contents a { + display: inline-block; + font-weight: 300; + color: #757575; + padding-left: 16px; + height: 1.5rem; + line-height: 1.5rem; + letter-spacing: .4; + display: inline-block; +} + +.table-of-contents a:hover { + color: #a8a8a8; + padding-left: 15px; + border-left: 1px solid #ee6e73; +} + +.table-of-contents a.active { + font-weight: 500; + padding-left: 14px; + border-left: 2px solid #ee6e73; +} + +.sidenav { + position: fixed; + width: 300px; + left: 0; + top: 0; + margin: 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + height: 100%; + height: calc(100% + 60px); + height: -moz-calc(100%); + padding-bottom: 60px; + background-color: #fff; + z-index: 999; + overflow-y: auto; + will-change: transform; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform: translateX(-105%); + transform: translateX(-105%); +} + +.sidenav.right-aligned { + right: 0; + -webkit-transform: translateX(105%); + transform: translateX(105%); + left: auto; + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.sidenav .collapsible { + margin: 0; +} + +.sidenav li { + float: none; + line-height: 48px; +} + +.sidenav li.active { + background-color: rgba(0, 0, 0, 0.05); +} + +.sidenav li > a { + color: rgba(0, 0, 0, 0.87); + display: block; + font-size: 14px; + font-weight: 500; + height: 48px; + line-height: 48px; + padding: 0 32px; +} + +.sidenav li > a:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.sidenav li > a.btn, .sidenav li > a.btn-large, .sidenav li > a.btn-small, .sidenav li > a.btn-large, .sidenav li > a.btn-flat, .sidenav li > a.btn-floating { + margin: 10px 15px; +} + +.sidenav li > a.btn, .sidenav li > a.btn-large, .sidenav li > a.btn-small, .sidenav li > a.btn-large, .sidenav li > a.btn-floating { + color: #fff; +} + +.sidenav li > a.btn-flat { + color: #343434; +} + +.sidenav li > a.btn:hover, .sidenav li > a.btn-large:hover, .sidenav li > a.btn-small:hover, .sidenav li > a.btn-large:hover { + background-color: #2bbbad; +} + +.sidenav li > a.btn-floating:hover { + background-color: #26a69a; +} + +.sidenav li > a > i, +.sidenav li > a > [class^="mdi-"], .sidenav li > a li > a > [class*="mdi-"], +.sidenav li > a > i.material-icons { + float: left; + height: 48px; + line-height: 48px; + margin: 0 32px 0 0; + width: 24px; + color: rgba(0, 0, 0, 0.54); +} + +.sidenav .divider { + margin: 8px 0 0 0; +} + +.sidenav .subheader { + cursor: initial; + pointer-events: none; + color: rgba(0, 0, 0, 0.54); + font-size: 14px; + font-weight: 500; + line-height: 48px; +} + +.sidenav .subheader:hover { + background-color: transparent; +} + +.sidenav .user-view { + position: relative; + padding: 32px 32px 0; + margin-bottom: 8px; +} + +.sidenav .user-view > a { + height: auto; + padding: 0; +} + +.sidenav .user-view > a:hover { + background-color: transparent; +} + +.sidenav .user-view .background { + overflow: hidden; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; +} + +.sidenav .user-view .circle, .sidenav .user-view .name, .sidenav .user-view .email { + display: block; +} + +.sidenav .user-view .circle { + height: 64px; + width: 64px; +} + +.sidenav .user-view .name, +.sidenav .user-view .email { + font-size: 14px; + line-height: 24px; +} + +.sidenav .user-view .name { + margin-top: 16px; + font-weight: 500; +} + +.sidenav .user-view .email { + padding-bottom: 16px; + font-weight: 400; +} + +.drag-target { + height: 100%; + width: 10px; + position: fixed; + top: 0; + z-index: 998; +} + +.drag-target.right-aligned { + right: 0; +} + +.sidenav.sidenav-fixed { + left: 0; + -webkit-transform: translateX(0); + transform: translateX(0); + position: fixed; +} + +.sidenav.sidenav-fixed.right-aligned { + right: 0; + left: auto; +} + +@media only screen and (max-width: 992px) { + .sidenav.sidenav-fixed { + -webkit-transform: translateX(-105%); + transform: translateX(-105%); + } + .sidenav.sidenav-fixed.right-aligned { + -webkit-transform: translateX(105%); + transform: translateX(105%); + } + .sidenav > a { + padding: 0 16px; + } + .sidenav .user-view { + padding: 16px 16px 0; + } +} + +.sidenav .collapsible-body > ul:not(.collapsible) > li.active, +.sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active { + background-color: #ee6e73; +} + +.sidenav .collapsible-body > ul:not(.collapsible) > li.active a, +.sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active a { + color: #fff; +} + +.sidenav .collapsible-body { + padding: 0; +} + +.sidenav-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + opacity: 0; + height: 120vh; + background-color: rgba(0, 0, 0, 0.5); + z-index: 997; + display: none; +} + +/* + @license + Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + Code distributed by Google as part of the polymer project is also + subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ +/**************************/ +/* STYLES FOR THE SPINNER */ +/**************************/ +/* + * Constants: + * STROKEWIDTH = 3px + * ARCSIZE = 270 degrees (amount of circle the arc takes up) + * ARCTIME = 1333ms (time it takes to expand and contract arc) + * ARCSTARTROT = 216 degrees (how much the start location of the arc + * should rotate each time, 216 gives us a + * 5 pointed star shape (it's 360/5 * 3). + * For a 7 pointed star, we might do + * 360/7 * 3 = 154.286) + * CONTAINERWIDTH = 28px + * SHRINK_TIME = 400ms + */ +.preloader-wrapper { + display: inline-block; + position: relative; + width: 50px; + height: 50px; +} + +.preloader-wrapper.small { + width: 36px; + height: 36px; +} + +.preloader-wrapper.big { + width: 64px; + height: 64px; +} + +.preloader-wrapper.active { + /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */ + -webkit-animation: container-rotate 1568ms linear infinite; + animation: container-rotate 1568ms linear infinite; +} + +@-webkit-keyframes container-rotate { + to { + -webkit-transform: rotate(360deg); + } +} + +@keyframes container-rotate { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.spinner-layer { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + border-color: #26a69a; +} + +.spinner-blue, +.spinner-blue-only { + border-color: #4285f4; +} + +.spinner-red, +.spinner-red-only { + border-color: #db4437; +} + +.spinner-yellow, +.spinner-yellow-only { + border-color: #f4b400; +} + +.spinner-green, +.spinner-green-only { + border-color: #0f9d58; +} + +/** + * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee): + * + * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't + * guarantee that the animation will start _exactly_ after that value. So we avoid using + * animation-delay and instead set custom keyframes for each color (as redundant as it + * seems). + * + * We write out each animation in full (instead of separating animation-name, + * animation-duration, etc.) because under the polyfill, Safari does not recognize those + * specific properties properly, treats them as -webkit-animation, and overrides the + * other animation rules. See https://github.com/Polymer/platform/issues/53. + */ +.active .spinner-layer.spinner-blue { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-red { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-yellow { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-green { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer, +.active .spinner-layer.spinner-blue-only, +.active .spinner-layer.spinner-red-only, +.active .spinner-layer.spinner-yellow-only, +.active .spinner-layer.spinner-green-only { + /* durations: 4 * ARCTIME */ + opacity: 1; + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +@-webkit-keyframes fill-unfill-rotate { + 12.5% { + -webkit-transform: rotate(135deg); + } + /* 0.5 * ARCSIZE */ + 25% { + -webkit-transform: rotate(270deg); + } + /* 1 * ARCSIZE */ + 37.5% { + -webkit-transform: rotate(405deg); + } + /* 1.5 * ARCSIZE */ + 50% { + -webkit-transform: rotate(540deg); + } + /* 2 * ARCSIZE */ + 62.5% { + -webkit-transform: rotate(675deg); + } + /* 2.5 * ARCSIZE */ + 75% { + -webkit-transform: rotate(810deg); + } + /* 3 * ARCSIZE */ + 87.5% { + -webkit-transform: rotate(945deg); + } + /* 3.5 * ARCSIZE */ + to { + -webkit-transform: rotate(1080deg); + } + /* 4 * ARCSIZE */ +} + +@keyframes fill-unfill-rotate { + 12.5% { + -webkit-transform: rotate(135deg); + transform: rotate(135deg); + } + /* 0.5 * ARCSIZE */ + 25% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } + /* 1 * ARCSIZE */ + 37.5% { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + /* 1.5 * ARCSIZE */ + 50% { + -webkit-transform: rotate(540deg); + transform: rotate(540deg); + } + /* 2 * ARCSIZE */ + 62.5% { + -webkit-transform: rotate(675deg); + transform: rotate(675deg); + } + /* 2.5 * ARCSIZE */ + 75% { + -webkit-transform: rotate(810deg); + transform: rotate(810deg); + } + /* 3 * ARCSIZE */ + 87.5% { + -webkit-transform: rotate(945deg); + transform: rotate(945deg); + } + /* 3.5 * ARCSIZE */ + to { + -webkit-transform: rotate(1080deg); + transform: rotate(1080deg); + } + /* 4 * ARCSIZE */ +} + +@-webkit-keyframes blue-fade-in-out { + from { + opacity: 1; + } + 25% { + opacity: 1; + } + 26% { + opacity: 0; + } + 89% { + opacity: 0; + } + 90% { + opacity: 1; + } + 100% { + opacity: 1; + } +} + +@keyframes blue-fade-in-out { + from { + opacity: 1; + } + 25% { + opacity: 1; + } + 26% { + opacity: 0; + } + 89% { + opacity: 0; + } + 90% { + opacity: 1; + } + 100% { + opacity: 1; + } +} + +@-webkit-keyframes red-fade-in-out { + from { + opacity: 0; + } + 15% { + opacity: 0; + } + 25% { + opacity: 1; + } + 50% { + opacity: 1; + } + 51% { + opacity: 0; + } +} + +@keyframes red-fade-in-out { + from { + opacity: 0; + } + 15% { + opacity: 0; + } + 25% { + opacity: 1; + } + 50% { + opacity: 1; + } + 51% { + opacity: 0; + } +} + +@-webkit-keyframes yellow-fade-in-out { + from { + opacity: 0; + } + 40% { + opacity: 0; + } + 50% { + opacity: 1; + } + 75% { + opacity: 1; + } + 76% { + opacity: 0; + } +} + +@keyframes yellow-fade-in-out { + from { + opacity: 0; + } + 40% { + opacity: 0; + } + 50% { + opacity: 1; + } + 75% { + opacity: 1; + } + 76% { + opacity: 0; + } +} + +@-webkit-keyframes green-fade-in-out { + from { + opacity: 0; + } + 65% { + opacity: 0; + } + 75% { + opacity: 1; + } + 90% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +@keyframes green-fade-in-out { + from { + opacity: 0; + } + 65% { + opacity: 0; + } + 75% { + opacity: 1; + } + 90% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +/** + * Patch the gap that appear between the two adjacent div.circle-clipper while the + * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11). + */ +.gap-patch { + position: absolute; + top: 0; + left: 45%; + width: 10%; + height: 100%; + overflow: hidden; + border-color: inherit; +} + +.gap-patch .circle { + width: 1000%; + left: -450%; +} + +.circle-clipper { + display: inline-block; + position: relative; + width: 50%; + height: 100%; + overflow: hidden; + border-color: inherit; +} + +.circle-clipper .circle { + width: 200%; + height: 100%; + border-width: 3px; + /* STROKEWIDTH */ + border-style: solid; + border-color: inherit; + border-bottom-color: transparent !important; + border-radius: 50%; + -webkit-animation: none; + animation: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; +} + +.circle-clipper.left .circle { + left: 0; + border-right-color: transparent !important; + -webkit-transform: rotate(129deg); + transform: rotate(129deg); +} + +.circle-clipper.right .circle { + left: -100%; + border-left-color: transparent !important; + -webkit-transform: rotate(-129deg); + transform: rotate(-129deg); +} + +.active .circle-clipper.left .circle { + /* duration: ARCTIME */ + -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .circle-clipper.right .circle { + /* duration: ARCTIME */ + -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +@-webkit-keyframes left-spin { + from { + -webkit-transform: rotate(130deg); + } + 50% { + -webkit-transform: rotate(-5deg); + } + to { + -webkit-transform: rotate(130deg); + } +} + +@keyframes left-spin { + from { + -webkit-transform: rotate(130deg); + transform: rotate(130deg); + } + 50% { + -webkit-transform: rotate(-5deg); + transform: rotate(-5deg); + } + to { + -webkit-transform: rotate(130deg); + transform: rotate(130deg); + } +} + +@-webkit-keyframes right-spin { + from { + -webkit-transform: rotate(-130deg); + } + 50% { + -webkit-transform: rotate(5deg); + } + to { + -webkit-transform: rotate(-130deg); + } +} + +@keyframes right-spin { + from { + -webkit-transform: rotate(-130deg); + transform: rotate(-130deg); + } + 50% { + -webkit-transform: rotate(5deg); + transform: rotate(5deg); + } + to { + -webkit-transform: rotate(-130deg); + transform: rotate(-130deg); + } +} + +#spinnerContainer.cooldown { + /* duration: SHRINK_TIME */ + -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); + animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); +} + +@-webkit-keyframes fade-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes fade-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +.slider { + position: relative; + height: 400px; + width: 100%; +} + +.slider.fullscreen { + height: 100%; + width: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.slider.fullscreen ul.slides { + height: 100%; +} + +.slider.fullscreen ul.indicators { + z-index: 2; + bottom: 30px; +} + +.slider .slides { + background-color: #9e9e9e; + margin: 0; + height: 400px; +} + +.slider .slides li { + opacity: 0; + position: absolute; + top: 0; + left: 0; + z-index: 1; + width: 100%; + height: inherit; + overflow: hidden; +} + +.slider .slides li img { + height: 100%; + width: 100%; + background-size: cover; + background-position: center; +} + +.slider .slides li .caption { + color: #fff; + position: absolute; + top: 15%; + left: 15%; + width: 70%; + opacity: 0; +} + +.slider .slides li .caption p { + color: #e0e0e0; +} + +.slider .slides li.active { + z-index: 2; +} + +.slider .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; +} + +.slider .indicators .indicator-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 16px; + width: 16px; + margin: 0 12px; + background-color: #e0e0e0; + -webkit-transition: background-color .3s; + transition: background-color .3s; + border-radius: 50%; +} + +.slider .indicators .indicator-item.active { + background-color: #4CAF50; +} + +.carousel { + overflow: hidden; + position: relative; + width: 100%; + height: 400px; + -webkit-perspective: 500px; + perspective: 500px; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; +} + +.carousel.carousel-slider { + top: 0; + left: 0; +} + +.carousel.carousel-slider .carousel-fixed-item { + position: absolute; + left: 0; + right: 0; + bottom: 20px; + z-index: 1; +} + +.carousel.carousel-slider .carousel-fixed-item.with-indicators { + bottom: 68px; +} + +.carousel.carousel-slider .carousel-item { + width: 100%; + height: 100%; + min-height: 400px; + position: absolute; + top: 0; + left: 0; +} + +.carousel.carousel-slider .carousel-item h2 { + font-size: 24px; + font-weight: 500; + line-height: 32px; +} + +.carousel.carousel-slider .carousel-item p { + font-size: 15px; +} + +.carousel .carousel-item { + visibility: hidden; + width: 200px; + height: 200px; + position: absolute; + top: 0; + left: 0; +} + +.carousel .carousel-item > img { + width: 100%; +} + +.carousel .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; +} + +.carousel .indicators .indicator-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 8px; + width: 8px; + margin: 24px 4px; + background-color: rgba(255, 255, 255, 0.5); + -webkit-transition: background-color .3s; + transition: background-color .3s; + border-radius: 50%; +} + +.carousel .indicators .indicator-item.active { + background-color: #fff; +} + +.carousel.scrolling .carousel-item .materialboxed, +.carousel .carousel-item:not(.active) .materialboxed { + pointer-events: none; +} + +.tap-target-wrapper { + width: 800px; + height: 800px; + position: fixed; + z-index: 1000; + visibility: hidden; + -webkit-transition: visibility 0s .3s; + transition: visibility 0s .3s; +} + +.tap-target-wrapper.open { + visibility: visible; + -webkit-transition: visibility 0s; + transition: visibility 0s; +} + +.tap-target-wrapper.open .tap-target { + -webkit-transform: scale(1); + transform: scale(1); + opacity: .95; + -webkit-transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); +} + +.tap-target-wrapper.open .tap-target-wave::before { + -webkit-transform: scale(1); + transform: scale(1); +} + +.tap-target-wrapper.open .tap-target-wave::after { + visibility: visible; + -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + -webkit-transition: opacity .3s, visibility 0s 1s, -webkit-transform .3s; + transition: opacity .3s, visibility 0s 1s, -webkit-transform .3s; + transition: opacity .3s, transform .3s, visibility 0s 1s; + transition: opacity .3s, transform .3s, visibility 0s 1s, -webkit-transform .3s; +} + +.tap-target { + position: absolute; + font-size: 1rem; + border-radius: 50%; + background-color: #ee6e73; + -webkit-box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2); + box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2); + width: 100%; + height: 100%; + opacity: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); +} + +.tap-target-content { + position: relative; + display: table-cell; +} + +.tap-target-wave { + position: absolute; + border-radius: 50%; + z-index: 10001; +} + +.tap-target-wave::before, .tap-target-wave::after { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #ffffff; +} + +.tap-target-wave::before { + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} + +.tap-target-wave::after { + visibility: hidden; + -webkit-transition: opacity .3s, visibility 0s, -webkit-transform .3s; + transition: opacity .3s, visibility 0s, -webkit-transform .3s; + transition: opacity .3s, transform .3s, visibility 0s; + transition: opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s; + z-index: -1; +} + +.tap-target-origin { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + z-index: 10002; + position: absolute !important; +} + +.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small), .tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover { + background: none; +} + +@media only screen and (max-width: 600px) { + .tap-target, .tap-target-wrapper { + width: 600px; + height: 600px; + } +} + +.pulse { + overflow: visible; + position: relative; +} + +.pulse::before { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: inherit; + border-radius: inherit; + -webkit-transition: opacity .3s, -webkit-transform .3s; + transition: opacity .3s, -webkit-transform .3s; + transition: opacity .3s, transform .3s; + transition: opacity .3s, transform .3s, -webkit-transform .3s; + -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + z-index: -1; +} + +@-webkit-keyframes pulse-animation { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } + 100% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } +} + +@keyframes pulse-animation { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } + 100% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } +} + +/* Modal */ +.datepicker-modal { + max-width: 325px; + min-width: 300px; + max-height: none; +} + +.datepicker-container.modal-content { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + padding: 0; +} + +.datepicker-controls { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + width: 280px; + margin: 0 auto; +} + +.datepicker-controls .selects-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.datepicker-controls .select-wrapper input { + border-bottom: none; + text-align: center; + margin: 0; +} + +.datepicker-controls .select-wrapper input:focus { + border-bottom: none; +} + +.datepicker-controls .select-wrapper .caret { + display: none; +} + +.datepicker-controls .select-year input { + width: 50px; +} + +.datepicker-controls .select-month input { + width: 70px; +} + +.month-prev, .month-next { + margin-top: 4px; + cursor: pointer; + background-color: transparent; + border: none; +} + +/* Date Display */ +.datepicker-date-display { + -webkit-box-flex: 1; + -webkit-flex: 1 auto; + -ms-flex: 1 auto; + flex: 1 auto; + background-color: #26a69a; + color: #fff; + padding: 20px 22px; + font-weight: 500; +} + +.datepicker-date-display .year-text { + display: block; + font-size: 1.5rem; + line-height: 25px; + color: rgba(255, 255, 255, 0.7); +} + +.datepicker-date-display .date-text { + display: block; + font-size: 2.8rem; + line-height: 47px; + font-weight: 500; +} + +/* Calendar */ +.datepicker-calendar-container { + -webkit-box-flex: 2.5; + -webkit-flex: 2.5 auto; + -ms-flex: 2.5 auto; + flex: 2.5 auto; +} + +.datepicker-table { + width: 280px; + font-size: 1rem; + margin: 0 auto; +} + +.datepicker-table thead { + border-bottom: none; +} + +.datepicker-table th { + padding: 10px 5px; + text-align: center; +} + +.datepicker-table tr { + border: none; +} + +.datepicker-table abbr { + text-decoration: none; + color: #999; +} + +.datepicker-table td { + border-radius: 50%; + padding: 0; +} + +.datepicker-table td.is-today { + color: #26a69a; +} + +.datepicker-table td.is-selected { + background-color: #26a69a; + color: #fff; +} + +.datepicker-table td.is-outside-current-month, .datepicker-table td.is-disabled { + color: rgba(0, 0, 0, 0.3); + pointer-events: none; +} + +.datepicker-day-button { + background-color: transparent; + border: none; + line-height: 38px; + display: block; + width: 100%; + border-radius: 50%; + padding: 0 5px; + cursor: pointer; + color: inherit; +} + +.datepicker-day-button:focus { + background-color: rgba(43, 161, 150, 0.25); +} + +/* Footer */ +.datepicker-footer { + width: 280px; + margin: 0 auto; + padding-bottom: 5px; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.datepicker-cancel, +.datepicker-clear, +.datepicker-today, +.datepicker-done { + color: #26a69a; + padding: 0 1rem; +} + +.datepicker-clear { + color: #F44336; +} + +/* Media Queries */ +@media only screen and (min-width: 601px) { + .datepicker-modal { + max-width: 625px; + } + .datepicker-container.modal-content { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + } + .datepicker-date-display { + -webkit-box-flex: 0; + -webkit-flex: 0 1 270px; + -ms-flex: 0 1 270px; + flex: 0 1 270px; + } + .datepicker-controls, + .datepicker-table, + .datepicker-footer { + width: 320px; + } + .datepicker-day-button { + line-height: 44px; + } +} + +/* Timepicker Containers */ +.timepicker-modal { + max-width: 325px; + max-height: none; +} + +.timepicker-container.modal-content { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + padding: 0; +} + +.text-primary { + color: white; +} + +/* Clock Digital Display */ +.timepicker-digital-display { + -webkit-box-flex: 1; + -webkit-flex: 1 auto; + -ms-flex: 1 auto; + flex: 1 auto; + background-color: #26a69a; + padding: 10px; + font-weight: 300; +} + +.timepicker-text-container { + font-size: 4rem; + font-weight: bold; + text-align: center; + color: rgba(255, 255, 255, 0.6); + font-weight: 400; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.timepicker-span-hours, +.timepicker-span-minutes, +.timepicker-span-am-pm div { + cursor: pointer; +} + +.timepicker-span-hours { + margin-right: 3px; +} + +.timepicker-span-minutes { + margin-left: 3px; +} + +.timepicker-display-am-pm { + font-size: 1.3rem; + position: absolute; + right: 1rem; + bottom: 1rem; + font-weight: 400; +} + +/* Analog Clock Display */ +.timepicker-analog-display { + -webkit-box-flex: 2.5; + -webkit-flex: 2.5 auto; + -ms-flex: 2.5 auto; + flex: 2.5 auto; +} + +.timepicker-plate { + background-color: #eee; + border-radius: 50%; + width: 270px; + height: 270px; + overflow: visible; + position: relative; + margin: auto; + margin-top: 25px; + margin-bottom: 5px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.timepicker-canvas, +.timepicker-dial { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +.timepicker-minutes { + visibility: hidden; +} + +.timepicker-tick { + border-radius: 50%; + color: rgba(0, 0, 0, 0.87); + line-height: 40px; + text-align: center; + width: 40px; + height: 40px; + position: absolute; + cursor: pointer; + font-size: 15px; +} + +.timepicker-tick.active, +.timepicker-tick:hover { + background-color: rgba(38, 166, 154, 0.25); +} + +.timepicker-dial { + -webkit-transition: opacity 350ms, -webkit-transform 350ms; + transition: opacity 350ms, -webkit-transform 350ms; + transition: transform 350ms, opacity 350ms; + transition: transform 350ms, opacity 350ms, -webkit-transform 350ms; +} + +.timepicker-dial-out { + opacity: 0; +} + +.timepicker-dial-out.timepicker-hours { + -webkit-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); +} + +.timepicker-dial-out.timepicker-minutes { + -webkit-transform: scale(0.8, 0.8); + transform: scale(0.8, 0.8); +} + +.timepicker-canvas { + -webkit-transition: opacity 175ms; + transition: opacity 175ms; +} + +.timepicker-canvas line { + stroke: #26a69a; + stroke-width: 4; + stroke-linecap: round; +} + +.timepicker-canvas-out { + opacity: 0.25; +} + +.timepicker-canvas-bearing { + stroke: none; + fill: #26a69a; +} + +.timepicker-canvas-bg { + stroke: none; + fill: #26a69a; +} + +/* Footer */ +.timepicker-footer { + margin: 0 auto; + padding: 5px 1rem; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.timepicker-clear { + color: #F44336; +} + +.timepicker-close { + color: #26a69a; +} + +.timepicker-clear, +.timepicker-close { + padding: 0 20px; +} + +/* Media Queries */ +@media only screen and (min-width: 601px) { + .timepicker-modal { + max-width: 600px; + } + .timepicker-container.modal-content { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + } + .timepicker-text-container { + top: 32%; + } + .timepicker-display-am-pm { + position: relative; + right: auto; + bottom: auto; + text-align: center; + margin-top: 1.2rem; + } +} diff --git a/pkgs/csslib/third_party/materialize/materialize.min.css b/pkgs/csslib/third_party/materialize/materialize.min.css new file mode 100644 index 000000000..74b1741b6 --- /dev/null +++ b/pkgs/csslib/third_party/materialize/materialize.min.css @@ -0,0 +1,13 @@ +/*! + * Materialize v1.0.0 (http://materializecss.com) + * Copyright 2014-2017 Materialize + * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) + */ +.materialize-red{background-color:#e51c23 !important}.materialize-red-text{color:#e51c23 !important}.materialize-red.lighten-5{background-color:#fdeaeb !important}.materialize-red-text.text-lighten-5{color:#fdeaeb !important}.materialize-red.lighten-4{background-color:#f8c1c3 !important}.materialize-red-text.text-lighten-4{color:#f8c1c3 !important}.materialize-red.lighten-3{background-color:#f3989b !important}.materialize-red-text.text-lighten-3{color:#f3989b !important}.materialize-red.lighten-2{background-color:#ee6e73 !important}.materialize-red-text.text-lighten-2{color:#ee6e73 !important}.materialize-red.lighten-1{background-color:#ea454b !important}.materialize-red-text.text-lighten-1{color:#ea454b !important}.materialize-red.darken-1{background-color:#d0181e !important}.materialize-red-text.text-darken-1{color:#d0181e !important}.materialize-red.darken-2{background-color:#b9151b !important}.materialize-red-text.text-darken-2{color:#b9151b !important}.materialize-red.darken-3{background-color:#a21318 !important}.materialize-red-text.text-darken-3{color:#a21318 !important}.materialize-red.darken-4{background-color:#8b1014 !important}.materialize-red-text.text-darken-4{color:#8b1014 !important}.red{background-color:#F44336 !important}.red-text{color:#F44336 !important}.red.lighten-5{background-color:#FFEBEE !important}.red-text.text-lighten-5{color:#FFEBEE !important}.red.lighten-4{background-color:#FFCDD2 !important}.red-text.text-lighten-4{color:#FFCDD2 !important}.red.lighten-3{background-color:#EF9A9A !important}.red-text.text-lighten-3{color:#EF9A9A !important}.red.lighten-2{background-color:#E57373 !important}.red-text.text-lighten-2{color:#E57373 !important}.red.lighten-1{background-color:#EF5350 !important}.red-text.text-lighten-1{color:#EF5350 !important}.red.darken-1{background-color:#E53935 !important}.red-text.text-darken-1{color:#E53935 !important}.red.darken-2{background-color:#D32F2F !important}.red-text.text-darken-2{color:#D32F2F !important}.red.darken-3{background-color:#C62828 !important}.red-text.text-darken-3{color:#C62828 !important}.red.darken-4{background-color:#B71C1C !important}.red-text.text-darken-4{color:#B71C1C !important}.red.accent-1{background-color:#FF8A80 !important}.red-text.text-accent-1{color:#FF8A80 !important}.red.accent-2{background-color:#FF5252 !important}.red-text.text-accent-2{color:#FF5252 !important}.red.accent-3{background-color:#FF1744 !important}.red-text.text-accent-3{color:#FF1744 !important}.red.accent-4{background-color:#D50000 !important}.red-text.text-accent-4{color:#D50000 !important}.pink{background-color:#e91e63 !important}.pink-text{color:#e91e63 !important}.pink.lighten-5{background-color:#fce4ec !important}.pink-text.text-lighten-5{color:#fce4ec !important}.pink.lighten-4{background-color:#f8bbd0 !important}.pink-text.text-lighten-4{color:#f8bbd0 !important}.pink.lighten-3{background-color:#f48fb1 !important}.pink-text.text-lighten-3{color:#f48fb1 !important}.pink.lighten-2{background-color:#f06292 !important}.pink-text.text-lighten-2{color:#f06292 !important}.pink.lighten-1{background-color:#ec407a !important}.pink-text.text-lighten-1{color:#ec407a !important}.pink.darken-1{background-color:#d81b60 !important}.pink-text.text-darken-1{color:#d81b60 !important}.pink.darken-2{background-color:#c2185b !important}.pink-text.text-darken-2{color:#c2185b !important}.pink.darken-3{background-color:#ad1457 !important}.pink-text.text-darken-3{color:#ad1457 !important}.pink.darken-4{background-color:#880e4f !important}.pink-text.text-darken-4{color:#880e4f !important}.pink.accent-1{background-color:#ff80ab !important}.pink-text.text-accent-1{color:#ff80ab !important}.pink.accent-2{background-color:#ff4081 !important}.pink-text.text-accent-2{color:#ff4081 !important}.pink.accent-3{background-color:#f50057 !important}.pink-text.text-accent-3{color:#f50057 !important}.pink.accent-4{background-color:#c51162 !important}.pink-text.text-accent-4{color:#c51162 !important}.purple{background-color:#9c27b0 !important}.purple-text{color:#9c27b0 !important}.purple.lighten-5{background-color:#f3e5f5 !important}.purple-text.text-lighten-5{color:#f3e5f5 !important}.purple.lighten-4{background-color:#e1bee7 !important}.purple-text.text-lighten-4{color:#e1bee7 !important}.purple.lighten-3{background-color:#ce93d8 !important}.purple-text.text-lighten-3{color:#ce93d8 !important}.purple.lighten-2{background-color:#ba68c8 !important}.purple-text.text-lighten-2{color:#ba68c8 !important}.purple.lighten-1{background-color:#ab47bc !important}.purple-text.text-lighten-1{color:#ab47bc !important}.purple.darken-1{background-color:#8e24aa !important}.purple-text.text-darken-1{color:#8e24aa !important}.purple.darken-2{background-color:#7b1fa2 !important}.purple-text.text-darken-2{color:#7b1fa2 !important}.purple.darken-3{background-color:#6a1b9a !important}.purple-text.text-darken-3{color:#6a1b9a !important}.purple.darken-4{background-color:#4a148c !important}.purple-text.text-darken-4{color:#4a148c !important}.purple.accent-1{background-color:#ea80fc !important}.purple-text.text-accent-1{color:#ea80fc !important}.purple.accent-2{background-color:#e040fb !important}.purple-text.text-accent-2{color:#e040fb !important}.purple.accent-3{background-color:#d500f9 !important}.purple-text.text-accent-3{color:#d500f9 !important}.purple.accent-4{background-color:#a0f !important}.purple-text.text-accent-4{color:#a0f !important}.deep-purple{background-color:#673ab7 !important}.deep-purple-text{color:#673ab7 !important}.deep-purple.lighten-5{background-color:#ede7f6 !important}.deep-purple-text.text-lighten-5{color:#ede7f6 !important}.deep-purple.lighten-4{background-color:#d1c4e9 !important}.deep-purple-text.text-lighten-4{color:#d1c4e9 !important}.deep-purple.lighten-3{background-color:#b39ddb !important}.deep-purple-text.text-lighten-3{color:#b39ddb !important}.deep-purple.lighten-2{background-color:#9575cd !important}.deep-purple-text.text-lighten-2{color:#9575cd !important}.deep-purple.lighten-1{background-color:#7e57c2 !important}.deep-purple-text.text-lighten-1{color:#7e57c2 !important}.deep-purple.darken-1{background-color:#5e35b1 !important}.deep-purple-text.text-darken-1{color:#5e35b1 !important}.deep-purple.darken-2{background-color:#512da8 !important}.deep-purple-text.text-darken-2{color:#512da8 !important}.deep-purple.darken-3{background-color:#4527a0 !important}.deep-purple-text.text-darken-3{color:#4527a0 !important}.deep-purple.darken-4{background-color:#311b92 !important}.deep-purple-text.text-darken-4{color:#311b92 !important}.deep-purple.accent-1{background-color:#b388ff !important}.deep-purple-text.text-accent-1{color:#b388ff !important}.deep-purple.accent-2{background-color:#7c4dff !important}.deep-purple-text.text-accent-2{color:#7c4dff !important}.deep-purple.accent-3{background-color:#651fff !important}.deep-purple-text.text-accent-3{color:#651fff !important}.deep-purple.accent-4{background-color:#6200ea !important}.deep-purple-text.text-accent-4{color:#6200ea !important}.indigo{background-color:#3f51b5 !important}.indigo-text{color:#3f51b5 !important}.indigo.lighten-5{background-color:#e8eaf6 !important}.indigo-text.text-lighten-5{color:#e8eaf6 !important}.indigo.lighten-4{background-color:#c5cae9 !important}.indigo-text.text-lighten-4{color:#c5cae9 !important}.indigo.lighten-3{background-color:#9fa8da !important}.indigo-text.text-lighten-3{color:#9fa8da !important}.indigo.lighten-2{background-color:#7986cb !important}.indigo-text.text-lighten-2{color:#7986cb !important}.indigo.lighten-1{background-color:#5c6bc0 !important}.indigo-text.text-lighten-1{color:#5c6bc0 !important}.indigo.darken-1{background-color:#3949ab !important}.indigo-text.text-darken-1{color:#3949ab !important}.indigo.darken-2{background-color:#303f9f !important}.indigo-text.text-darken-2{color:#303f9f !important}.indigo.darken-3{background-color:#283593 !important}.indigo-text.text-darken-3{color:#283593 !important}.indigo.darken-4{background-color:#1a237e !important}.indigo-text.text-darken-4{color:#1a237e !important}.indigo.accent-1{background-color:#8c9eff !important}.indigo-text.text-accent-1{color:#8c9eff !important}.indigo.accent-2{background-color:#536dfe !important}.indigo-text.text-accent-2{color:#536dfe !important}.indigo.accent-3{background-color:#3d5afe !important}.indigo-text.text-accent-3{color:#3d5afe !important}.indigo.accent-4{background-color:#304ffe !important}.indigo-text.text-accent-4{color:#304ffe !important}.blue{background-color:#2196F3 !important}.blue-text{color:#2196F3 !important}.blue.lighten-5{background-color:#E3F2FD !important}.blue-text.text-lighten-5{color:#E3F2FD !important}.blue.lighten-4{background-color:#BBDEFB !important}.blue-text.text-lighten-4{color:#BBDEFB !important}.blue.lighten-3{background-color:#90CAF9 !important}.blue-text.text-lighten-3{color:#90CAF9 !important}.blue.lighten-2{background-color:#64B5F6 !important}.blue-text.text-lighten-2{color:#64B5F6 !important}.blue.lighten-1{background-color:#42A5F5 !important}.blue-text.text-lighten-1{color:#42A5F5 !important}.blue.darken-1{background-color:#1E88E5 !important}.blue-text.text-darken-1{color:#1E88E5 !important}.blue.darken-2{background-color:#1976D2 !important}.blue-text.text-darken-2{color:#1976D2 !important}.blue.darken-3{background-color:#1565C0 !important}.blue-text.text-darken-3{color:#1565C0 !important}.blue.darken-4{background-color:#0D47A1 !important}.blue-text.text-darken-4{color:#0D47A1 !important}.blue.accent-1{background-color:#82B1FF !important}.blue-text.text-accent-1{color:#82B1FF !important}.blue.accent-2{background-color:#448AFF !important}.blue-text.text-accent-2{color:#448AFF !important}.blue.accent-3{background-color:#2979FF !important}.blue-text.text-accent-3{color:#2979FF !important}.blue.accent-4{background-color:#2962FF !important}.blue-text.text-accent-4{color:#2962FF !important}.light-blue{background-color:#03a9f4 !important}.light-blue-text{color:#03a9f4 !important}.light-blue.lighten-5{background-color:#e1f5fe !important}.light-blue-text.text-lighten-5{color:#e1f5fe !important}.light-blue.lighten-4{background-color:#b3e5fc !important}.light-blue-text.text-lighten-4{color:#b3e5fc !important}.light-blue.lighten-3{background-color:#81d4fa !important}.light-blue-text.text-lighten-3{color:#81d4fa !important}.light-blue.lighten-2{background-color:#4fc3f7 !important}.light-blue-text.text-lighten-2{color:#4fc3f7 !important}.light-blue.lighten-1{background-color:#29b6f6 !important}.light-blue-text.text-lighten-1{color:#29b6f6 !important}.light-blue.darken-1{background-color:#039be5 !important}.light-blue-text.text-darken-1{color:#039be5 !important}.light-blue.darken-2{background-color:#0288d1 !important}.light-blue-text.text-darken-2{color:#0288d1 !important}.light-blue.darken-3{background-color:#0277bd !important}.light-blue-text.text-darken-3{color:#0277bd !important}.light-blue.darken-4{background-color:#01579b !important}.light-blue-text.text-darken-4{color:#01579b !important}.light-blue.accent-1{background-color:#80d8ff !important}.light-blue-text.text-accent-1{color:#80d8ff !important}.light-blue.accent-2{background-color:#40c4ff !important}.light-blue-text.text-accent-2{color:#40c4ff !important}.light-blue.accent-3{background-color:#00b0ff !important}.light-blue-text.text-accent-3{color:#00b0ff !important}.light-blue.accent-4{background-color:#0091ea !important}.light-blue-text.text-accent-4{color:#0091ea !important}.cyan{background-color:#00bcd4 !important}.cyan-text{color:#00bcd4 !important}.cyan.lighten-5{background-color:#e0f7fa !important}.cyan-text.text-lighten-5{color:#e0f7fa !important}.cyan.lighten-4{background-color:#b2ebf2 !important}.cyan-text.text-lighten-4{color:#b2ebf2 !important}.cyan.lighten-3{background-color:#80deea !important}.cyan-text.text-lighten-3{color:#80deea !important}.cyan.lighten-2{background-color:#4dd0e1 !important}.cyan-text.text-lighten-2{color:#4dd0e1 !important}.cyan.lighten-1{background-color:#26c6da !important}.cyan-text.text-lighten-1{color:#26c6da !important}.cyan.darken-1{background-color:#00acc1 !important}.cyan-text.text-darken-1{color:#00acc1 !important}.cyan.darken-2{background-color:#0097a7 !important}.cyan-text.text-darken-2{color:#0097a7 !important}.cyan.darken-3{background-color:#00838f !important}.cyan-text.text-darken-3{color:#00838f !important}.cyan.darken-4{background-color:#006064 !important}.cyan-text.text-darken-4{color:#006064 !important}.cyan.accent-1{background-color:#84ffff !important}.cyan-text.text-accent-1{color:#84ffff !important}.cyan.accent-2{background-color:#18ffff !important}.cyan-text.text-accent-2{color:#18ffff !important}.cyan.accent-3{background-color:#00e5ff !important}.cyan-text.text-accent-3{color:#00e5ff !important}.cyan.accent-4{background-color:#00b8d4 !important}.cyan-text.text-accent-4{color:#00b8d4 !important}.teal{background-color:#009688 !important}.teal-text{color:#009688 !important}.teal.lighten-5{background-color:#e0f2f1 !important}.teal-text.text-lighten-5{color:#e0f2f1 !important}.teal.lighten-4{background-color:#b2dfdb !important}.teal-text.text-lighten-4{color:#b2dfdb !important}.teal.lighten-3{background-color:#80cbc4 !important}.teal-text.text-lighten-3{color:#80cbc4 !important}.teal.lighten-2{background-color:#4db6ac !important}.teal-text.text-lighten-2{color:#4db6ac !important}.teal.lighten-1{background-color:#26a69a !important}.teal-text.text-lighten-1{color:#26a69a !important}.teal.darken-1{background-color:#00897b !important}.teal-text.text-darken-1{color:#00897b !important}.teal.darken-2{background-color:#00796b !important}.teal-text.text-darken-2{color:#00796b !important}.teal.darken-3{background-color:#00695c !important}.teal-text.text-darken-3{color:#00695c !important}.teal.darken-4{background-color:#004d40 !important}.teal-text.text-darken-4{color:#004d40 !important}.teal.accent-1{background-color:#a7ffeb !important}.teal-text.text-accent-1{color:#a7ffeb !important}.teal.accent-2{background-color:#64ffda !important}.teal-text.text-accent-2{color:#64ffda !important}.teal.accent-3{background-color:#1de9b6 !important}.teal-text.text-accent-3{color:#1de9b6 !important}.teal.accent-4{background-color:#00bfa5 !important}.teal-text.text-accent-4{color:#00bfa5 !important}.green{background-color:#4CAF50 !important}.green-text{color:#4CAF50 !important}.green.lighten-5{background-color:#E8F5E9 !important}.green-text.text-lighten-5{color:#E8F5E9 !important}.green.lighten-4{background-color:#C8E6C9 !important}.green-text.text-lighten-4{color:#C8E6C9 !important}.green.lighten-3{background-color:#A5D6A7 !important}.green-text.text-lighten-3{color:#A5D6A7 !important}.green.lighten-2{background-color:#81C784 !important}.green-text.text-lighten-2{color:#81C784 !important}.green.lighten-1{background-color:#66BB6A !important}.green-text.text-lighten-1{color:#66BB6A !important}.green.darken-1{background-color:#43A047 !important}.green-text.text-darken-1{color:#43A047 !important}.green.darken-2{background-color:#388E3C !important}.green-text.text-darken-2{color:#388E3C !important}.green.darken-3{background-color:#2E7D32 !important}.green-text.text-darken-3{color:#2E7D32 !important}.green.darken-4{background-color:#1B5E20 !important}.green-text.text-darken-4{color:#1B5E20 !important}.green.accent-1{background-color:#B9F6CA !important}.green-text.text-accent-1{color:#B9F6CA !important}.green.accent-2{background-color:#69F0AE !important}.green-text.text-accent-2{color:#69F0AE !important}.green.accent-3{background-color:#00E676 !important}.green-text.text-accent-3{color:#00E676 !important}.green.accent-4{background-color:#00C853 !important}.green-text.text-accent-4{color:#00C853 !important}.light-green{background-color:#8bc34a !important}.light-green-text{color:#8bc34a !important}.light-green.lighten-5{background-color:#f1f8e9 !important}.light-green-text.text-lighten-5{color:#f1f8e9 !important}.light-green.lighten-4{background-color:#dcedc8 !important}.light-green-text.text-lighten-4{color:#dcedc8 !important}.light-green.lighten-3{background-color:#c5e1a5 !important}.light-green-text.text-lighten-3{color:#c5e1a5 !important}.light-green.lighten-2{background-color:#aed581 !important}.light-green-text.text-lighten-2{color:#aed581 !important}.light-green.lighten-1{background-color:#9ccc65 !important}.light-green-text.text-lighten-1{color:#9ccc65 !important}.light-green.darken-1{background-color:#7cb342 !important}.light-green-text.text-darken-1{color:#7cb342 !important}.light-green.darken-2{background-color:#689f38 !important}.light-green-text.text-darken-2{color:#689f38 !important}.light-green.darken-3{background-color:#558b2f !important}.light-green-text.text-darken-3{color:#558b2f !important}.light-green.darken-4{background-color:#33691e !important}.light-green-text.text-darken-4{color:#33691e !important}.light-green.accent-1{background-color:#ccff90 !important}.light-green-text.text-accent-1{color:#ccff90 !important}.light-green.accent-2{background-color:#b2ff59 !important}.light-green-text.text-accent-2{color:#b2ff59 !important}.light-green.accent-3{background-color:#76ff03 !important}.light-green-text.text-accent-3{color:#76ff03 !important}.light-green.accent-4{background-color:#64dd17 !important}.light-green-text.text-accent-4{color:#64dd17 !important}.lime{background-color:#cddc39 !important}.lime-text{color:#cddc39 !important}.lime.lighten-5{background-color:#f9fbe7 !important}.lime-text.text-lighten-5{color:#f9fbe7 !important}.lime.lighten-4{background-color:#f0f4c3 !important}.lime-text.text-lighten-4{color:#f0f4c3 !important}.lime.lighten-3{background-color:#e6ee9c !important}.lime-text.text-lighten-3{color:#e6ee9c !important}.lime.lighten-2{background-color:#dce775 !important}.lime-text.text-lighten-2{color:#dce775 !important}.lime.lighten-1{background-color:#d4e157 !important}.lime-text.text-lighten-1{color:#d4e157 !important}.lime.darken-1{background-color:#c0ca33 !important}.lime-text.text-darken-1{color:#c0ca33 !important}.lime.darken-2{background-color:#afb42b !important}.lime-text.text-darken-2{color:#afb42b !important}.lime.darken-3{background-color:#9e9d24 !important}.lime-text.text-darken-3{color:#9e9d24 !important}.lime.darken-4{background-color:#827717 !important}.lime-text.text-darken-4{color:#827717 !important}.lime.accent-1{background-color:#f4ff81 !important}.lime-text.text-accent-1{color:#f4ff81 !important}.lime.accent-2{background-color:#eeff41 !important}.lime-text.text-accent-2{color:#eeff41 !important}.lime.accent-3{background-color:#c6ff00 !important}.lime-text.text-accent-3{color:#c6ff00 !important}.lime.accent-4{background-color:#aeea00 !important}.lime-text.text-accent-4{color:#aeea00 !important}.yellow{background-color:#ffeb3b !important}.yellow-text{color:#ffeb3b !important}.yellow.lighten-5{background-color:#fffde7 !important}.yellow-text.text-lighten-5{color:#fffde7 !important}.yellow.lighten-4{background-color:#fff9c4 !important}.yellow-text.text-lighten-4{color:#fff9c4 !important}.yellow.lighten-3{background-color:#fff59d !important}.yellow-text.text-lighten-3{color:#fff59d !important}.yellow.lighten-2{background-color:#fff176 !important}.yellow-text.text-lighten-2{color:#fff176 !important}.yellow.lighten-1{background-color:#ffee58 !important}.yellow-text.text-lighten-1{color:#ffee58 !important}.yellow.darken-1{background-color:#fdd835 !important}.yellow-text.text-darken-1{color:#fdd835 !important}.yellow.darken-2{background-color:#fbc02d !important}.yellow-text.text-darken-2{color:#fbc02d !important}.yellow.darken-3{background-color:#f9a825 !important}.yellow-text.text-darken-3{color:#f9a825 !important}.yellow.darken-4{background-color:#f57f17 !important}.yellow-text.text-darken-4{color:#f57f17 !important}.yellow.accent-1{background-color:#ffff8d !important}.yellow-text.text-accent-1{color:#ffff8d !important}.yellow.accent-2{background-color:#ff0 !important}.yellow-text.text-accent-2{color:#ff0 !important}.yellow.accent-3{background-color:#ffea00 !important}.yellow-text.text-accent-3{color:#ffea00 !important}.yellow.accent-4{background-color:#ffd600 !important}.yellow-text.text-accent-4{color:#ffd600 !important}.amber{background-color:#ffc107 !important}.amber-text{color:#ffc107 !important}.amber.lighten-5{background-color:#fff8e1 !important}.amber-text.text-lighten-5{color:#fff8e1 !important}.amber.lighten-4{background-color:#ffecb3 !important}.amber-text.text-lighten-4{color:#ffecb3 !important}.amber.lighten-3{background-color:#ffe082 !important}.amber-text.text-lighten-3{color:#ffe082 !important}.amber.lighten-2{background-color:#ffd54f !important}.amber-text.text-lighten-2{color:#ffd54f !important}.amber.lighten-1{background-color:#ffca28 !important}.amber-text.text-lighten-1{color:#ffca28 !important}.amber.darken-1{background-color:#ffb300 !important}.amber-text.text-darken-1{color:#ffb300 !important}.amber.darken-2{background-color:#ffa000 !important}.amber-text.text-darken-2{color:#ffa000 !important}.amber.darken-3{background-color:#ff8f00 !important}.amber-text.text-darken-3{color:#ff8f00 !important}.amber.darken-4{background-color:#ff6f00 !important}.amber-text.text-darken-4{color:#ff6f00 !important}.amber.accent-1{background-color:#ffe57f !important}.amber-text.text-accent-1{color:#ffe57f !important}.amber.accent-2{background-color:#ffd740 !important}.amber-text.text-accent-2{color:#ffd740 !important}.amber.accent-3{background-color:#ffc400 !important}.amber-text.text-accent-3{color:#ffc400 !important}.amber.accent-4{background-color:#ffab00 !important}.amber-text.text-accent-4{color:#ffab00 !important}.orange{background-color:#ff9800 !important}.orange-text{color:#ff9800 !important}.orange.lighten-5{background-color:#fff3e0 !important}.orange-text.text-lighten-5{color:#fff3e0 !important}.orange.lighten-4{background-color:#ffe0b2 !important}.orange-text.text-lighten-4{color:#ffe0b2 !important}.orange.lighten-3{background-color:#ffcc80 !important}.orange-text.text-lighten-3{color:#ffcc80 !important}.orange.lighten-2{background-color:#ffb74d !important}.orange-text.text-lighten-2{color:#ffb74d !important}.orange.lighten-1{background-color:#ffa726 !important}.orange-text.text-lighten-1{color:#ffa726 !important}.orange.darken-1{background-color:#fb8c00 !important}.orange-text.text-darken-1{color:#fb8c00 !important}.orange.darken-2{background-color:#f57c00 !important}.orange-text.text-darken-2{color:#f57c00 !important}.orange.darken-3{background-color:#ef6c00 !important}.orange-text.text-darken-3{color:#ef6c00 !important}.orange.darken-4{background-color:#e65100 !important}.orange-text.text-darken-4{color:#e65100 !important}.orange.accent-1{background-color:#ffd180 !important}.orange-text.text-accent-1{color:#ffd180 !important}.orange.accent-2{background-color:#ffab40 !important}.orange-text.text-accent-2{color:#ffab40 !important}.orange.accent-3{background-color:#ff9100 !important}.orange-text.text-accent-3{color:#ff9100 !important}.orange.accent-4{background-color:#ff6d00 !important}.orange-text.text-accent-4{color:#ff6d00 !important}.deep-orange{background-color:#ff5722 !important}.deep-orange-text{color:#ff5722 !important}.deep-orange.lighten-5{background-color:#fbe9e7 !important}.deep-orange-text.text-lighten-5{color:#fbe9e7 !important}.deep-orange.lighten-4{background-color:#ffccbc !important}.deep-orange-text.text-lighten-4{color:#ffccbc !important}.deep-orange.lighten-3{background-color:#ffab91 !important}.deep-orange-text.text-lighten-3{color:#ffab91 !important}.deep-orange.lighten-2{background-color:#ff8a65 !important}.deep-orange-text.text-lighten-2{color:#ff8a65 !important}.deep-orange.lighten-1{background-color:#ff7043 !important}.deep-orange-text.text-lighten-1{color:#ff7043 !important}.deep-orange.darken-1{background-color:#f4511e !important}.deep-orange-text.text-darken-1{color:#f4511e !important}.deep-orange.darken-2{background-color:#e64a19 !important}.deep-orange-text.text-darken-2{color:#e64a19 !important}.deep-orange.darken-3{background-color:#d84315 !important}.deep-orange-text.text-darken-3{color:#d84315 !important}.deep-orange.darken-4{background-color:#bf360c !important}.deep-orange-text.text-darken-4{color:#bf360c !important}.deep-orange.accent-1{background-color:#ff9e80 !important}.deep-orange-text.text-accent-1{color:#ff9e80 !important}.deep-orange.accent-2{background-color:#ff6e40 !important}.deep-orange-text.text-accent-2{color:#ff6e40 !important}.deep-orange.accent-3{background-color:#ff3d00 !important}.deep-orange-text.text-accent-3{color:#ff3d00 !important}.deep-orange.accent-4{background-color:#dd2c00 !important}.deep-orange-text.text-accent-4{color:#dd2c00 !important}.brown{background-color:#795548 !important}.brown-text{color:#795548 !important}.brown.lighten-5{background-color:#efebe9 !important}.brown-text.text-lighten-5{color:#efebe9 !important}.brown.lighten-4{background-color:#d7ccc8 !important}.brown-text.text-lighten-4{color:#d7ccc8 !important}.brown.lighten-3{background-color:#bcaaa4 !important}.brown-text.text-lighten-3{color:#bcaaa4 !important}.brown.lighten-2{background-color:#a1887f !important}.brown-text.text-lighten-2{color:#a1887f !important}.brown.lighten-1{background-color:#8d6e63 !important}.brown-text.text-lighten-1{color:#8d6e63 !important}.brown.darken-1{background-color:#6d4c41 !important}.brown-text.text-darken-1{color:#6d4c41 !important}.brown.darken-2{background-color:#5d4037 !important}.brown-text.text-darken-2{color:#5d4037 !important}.brown.darken-3{background-color:#4e342e !important}.brown-text.text-darken-3{color:#4e342e !important}.brown.darken-4{background-color:#3e2723 !important}.brown-text.text-darken-4{color:#3e2723 !important}.blue-grey{background-color:#607d8b !important}.blue-grey-text{color:#607d8b !important}.blue-grey.lighten-5{background-color:#eceff1 !important}.blue-grey-text.text-lighten-5{color:#eceff1 !important}.blue-grey.lighten-4{background-color:#cfd8dc !important}.blue-grey-text.text-lighten-4{color:#cfd8dc !important}.blue-grey.lighten-3{background-color:#b0bec5 !important}.blue-grey-text.text-lighten-3{color:#b0bec5 !important}.blue-grey.lighten-2{background-color:#90a4ae !important}.blue-grey-text.text-lighten-2{color:#90a4ae !important}.blue-grey.lighten-1{background-color:#78909c !important}.blue-grey-text.text-lighten-1{color:#78909c !important}.blue-grey.darken-1{background-color:#546e7a !important}.blue-grey-text.text-darken-1{color:#546e7a !important}.blue-grey.darken-2{background-color:#455a64 !important}.blue-grey-text.text-darken-2{color:#455a64 !important}.blue-grey.darken-3{background-color:#37474f !important}.blue-grey-text.text-darken-3{color:#37474f !important}.blue-grey.darken-4{background-color:#263238 !important}.blue-grey-text.text-darken-4{color:#263238 !important}.grey{background-color:#9e9e9e !important}.grey-text{color:#9e9e9e !important}.grey.lighten-5{background-color:#fafafa !important}.grey-text.text-lighten-5{color:#fafafa !important}.grey.lighten-4{background-color:#f5f5f5 !important}.grey-text.text-lighten-4{color:#f5f5f5 !important}.grey.lighten-3{background-color:#eee !important}.grey-text.text-lighten-3{color:#eee !important}.grey.lighten-2{background-color:#e0e0e0 !important}.grey-text.text-lighten-2{color:#e0e0e0 !important}.grey.lighten-1{background-color:#bdbdbd !important}.grey-text.text-lighten-1{color:#bdbdbd !important}.grey.darken-1{background-color:#757575 !important}.grey-text.text-darken-1{color:#757575 !important}.grey.darken-2{background-color:#616161 !important}.grey-text.text-darken-2{color:#616161 !important}.grey.darken-3{background-color:#424242 !important}.grey-text.text-darken-3{color:#424242 !important}.grey.darken-4{background-color:#212121 !important}.grey-text.text-darken-4{color:#212121 !important}.black{background-color:#000 !important}.black-text{color:#000 !important}.white{background-color:#fff !important}.white-text{color:#fff !important}.transparent{background-color:rgba(0,0,0,0) !important}.transparent-text{color:rgba(0,0,0,0) !important}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,*:before,*:after{-webkit-box-sizing:inherit;box-sizing:inherit}button,input,optgroup,select,textarea{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.clearfix{clear:both}.z-depth-0{-webkit-box-shadow:none !important;box-shadow:none !important}.z-depth-1,nav,.card-panel,.card,.toast,.btn,.btn-large,.btn-small,.btn-floating,.dropdown-content,.collapsible,.sidenav{-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2);box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.z-depth-1-half,.btn:hover,.btn-large:hover,.btn-small:hover,.btn-floating:hover{-webkit-box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2);box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2)}.z-depth-2{-webkit-box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3);box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3)}.z-depth-3{-webkit-box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2);box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.z-depth-4{-webkit-box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2);box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2)}.z-depth-5,.modal{-webkit-box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2);box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2)}.hoverable{-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s}.hoverable:hover{-webkit-box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width: 992px){.pagination{width:100%}.pagination li.prev,.pagination li.next{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:rgba(255,255,255,0.7)}.breadcrumb i,.breadcrumb [class^="mdi-"],.breadcrumb [class*="mdi-"],.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:'\E5CC';color:rgba(255,255,255,0.7);vertical-align:top;display:inline-block;font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax-container .parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax-container .parallax img{opacity:0;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed !important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%}@media only screen and (max-width: 600px){.hide-on-small-only,.hide-on-small-and-down{display:none !important}}@media only screen and (max-width: 992px){.hide-on-med-and-down{display:none !important}}@media only screen and (min-width: 601px){.hide-on-med-and-up{display:none !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.hide-on-med-only{display:none !important}}@media only screen and (min-width: 993px){.hide-on-large-only{display:none !important}}@media only screen and (min-width: 1201px){.hide-on-extra-large-only{display:none !important}}@media only screen and (min-width: 1201px){.show-on-extra-large{display:block !important}}@media only screen and (min-width: 993px){.show-on-large{display:block !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.show-on-medium{display:block !important}}@media only screen and (max-width: 600px){.show-on-small{display:block !important}}@media only screen and (min-width: 601px){.show-on-medium-and-up{display:block !important}}@media only screen and (max-width: 992px){.show-on-medium-and-down{display:block !important}}@media only screen and (max-width: 600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;color:#fff;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:10px 0px;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:none}table{width:100%;display:table;border-collapse:collapse;border-spacing:0}table.striped tr{border-bottom:none}table.striped>tbody>tr:nth-child(odd){background-color:rgba(242,242,242,0.5)}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:rgba(242,242,242,0.5)}table.centered thead tr th,table.centered tbody tr td{text-align:center}tr{border-bottom:1px solid rgba(0,0,0,0.12)}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width: 992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:'\00a0'}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:"\00a0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{border-bottom:none;padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid rgba(0,0,0,0.12)}}.collection{margin:.5rem 0 1rem 0;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar:not(.circle-clipper)>.circle,.collection .collection-item.avatar :not(.circle-clipper)>.circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;-webkit-transition:.25s;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;background-color:#26a69a;-webkit-transition:width .3s linear;transition:width .3s linear}.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none !important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left !important}.right{float:right !important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0 !important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;-webkit-box-sizing:border-box;box-sizing:border-box}span.badge.new{font-weight:300;font-size:0.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]::after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px;-webkit-font-smoothing:auto}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collapsible span.badge{margin-left:auto}.sidenav span.badge{margin-top:calc(24px - 11px)}table span.badge{display:inline-block;float:none;margin-left:auto}.material-icons{text-rendering:optimizeLegibility;-webkit-font-feature-settings:'liga';-moz-font-feature-settings:'liga';font-feature-settings:'liga'}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width: 601px){.container{width:85%}}@media only screen and (min-width: 993px){.container{width:70%}}.col .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*="push-"],.row .col[class*="pull-"]{position:relative}.row .col.s1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.s7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width: 601px){.row .col.m1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.m7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width: 993px){.row .col.l1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.l7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width: 1201px){.row .col.xl1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.xl7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav i,nav [class^="mdi-"],nav [class*="mdi-"],nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width: 993px){nav a.sidenav-trigger{display:none}}nav .sidenav-trigger{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .sidenav-trigger i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width: 992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;-webkit-transform:none;transform:none}nav .brand-logo.left{left:0.5rem}nav .brand-logo.right{right:0.5rem;left:auto}}nav .brand-logo.right{right:0.5rem;padding:0}nav .brand-logo i,nav .brand-logo [class^="mdi-"],nav .brand-logo [class*="mdi-"],nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{-webkit-transition:background-color .3s;transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,0.1)}nav ul a{-webkit-transition:background-color .3s;transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-large,nav ul a.btn-small,nav ul a.btn-large,nav ul a.btn-flat,nav ul a.btn-floating{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-small>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,0.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=text]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=url]:valid,nav .input-field input[type=date]:valid{border:none;-webkit-box-shadow:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:rgba(255,255,255,0.7);-webkit-transition:color .3s;transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width: 601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.sidenav-trigger,nav a.sidenav-trigger i{height:64px;line-height:64px}.navbar-fixed{height:64px}}a{text-decoration:none}html{line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:normal;color:rgba(0,0,0,0.87)}@media only screen and (min-width: 0){html{font-size:14px}}@media only screen and (min-width: 992px){html{font-size:14.5px}}@media only screen and (min-width: 1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.3}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;line-height:110%;margin:2.8rem 0 1.68rem 0}h2{font-size:3.56rem;line-height:110%;margin:2.3733333333rem 0 1.424rem 0}h3{font-size:2.92rem;line-height:110%;margin:1.9466666667rem 0 1.168rem 0}h4{font-size:2.28rem;line-height:110%;margin:1.52rem 0 .912rem 0}h5{font-size:1.64rem;line-height:110%;margin:1.0933333333rem 0 .656rem 0}h6{font-size:1.15rem;line-height:110%;margin:.7666666667rem 0 .46rem 0}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light{font-weight:300}.thin{font-weight:200}@media only screen and (min-width: 360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width: 390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width: 420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width: 450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width: 480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width: 510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width: 540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width: 570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width: 600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width: 630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width: 660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width: 690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width: 720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width: 750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width: 780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width: 810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width: 840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width: 870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width: 900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width: 930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width: 960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width: 360px){.flow-text{font-size:1.2rem}}.scale-transition{-webkit-transition:-webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:-webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important}.scale-transition.scale-out{-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform .2s !important;transition:-webkit-transform .2s !important;transition:transform .2s !important;transition:transform .2s, -webkit-transform .2s !important}.scale-transition.scale-in{-webkit-transform:scale(1);transform:scale(1)}.card-panel{-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s;padding:24px;margin:.5rem 0 1rem 0;border-radius:2px;background-color:#fff}.card{position:relative;margin:.5rem 0 1rem 0;background-color:#fff;-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s;border-radius:2px}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.small,.card.medium,.card.large{position:relative}.card.small .card-image,.card.medium .card-image,.card.large .card-image{max-height:60%;overflow:hidden}.card.small .card-image+.card-content,.card.medium .card-image+.card-content,.card.large .card-image+.card-content{max-height:40%}.card.small .card-content,.card.medium .card-content,.card.large .card-content{max-height:100%;overflow:hidden}.card.small .card-action,.card.medium .card-action,.card.large .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.card.horizontal.small .card-image,.card.horizontal.medium .card-image,.card.horizontal.large .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.small .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.large .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.card.horizontal .card-stacked .card-content{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{background-color:inherit;border-top:1px solid rgba(160,160,160,0.2);position:relative;padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;-webkit-transition:color .3s ease;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width: 600px){#toast-container{min-width:100%;bottom:0%}}@media only screen and (min-width: 601px) and (max-width: 992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width: 993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;cursor:default}.toast .toast-action{color:#eeff41;font-weight:500;margin-right:-25px;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width: 600px){.toast{width:100%;border-radius:0}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab a,.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover{color:rgba(255,255,255,0.7)}.tabs.tabs-transparent .tab a:hover,.tabs.tabs-transparent .tab a.active{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.tabs-fixed-width .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(238,110,115,0.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;-webkit-transition:color .28s ease, background-color .28s ease;transition:color .28s ease, background-color .28s ease}.tabs .tab a:focus,.tabs .tab a:focus.active{background-color:rgba(246,178,181,0.2);outline:none}.tabs .tab a:hover,.tabs .tab a.active{background-color:transparent;color:#ee6e73}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(238,110,115,0.4);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left, right}@media only screen and (max-width: 992px){.tabs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;opacity:0;position:absolute;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none;visibility:hidden;background-color:#323232}.backdrop{position:absolute;opacity:0;height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 0%;transform-origin:50% 0%;visibility:hidden}.btn,.btn-large,.btn-small,.btn-flat{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 16px;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn.disabled,.disabled.btn-large,.disabled.btn-small,.btn-floating.disabled,.btn-large.disabled,.btn-small.disabled,.btn-flat.disabled,.btn:disabled,.btn-large:disabled,.btn-small:disabled,.btn-floating:disabled,.btn-large:disabled,.btn-small:disabled,.btn-flat:disabled,.btn[disabled],.btn-large[disabled],.btn-small[disabled],.btn-floating[disabled],.btn-large[disabled],.btn-small[disabled],.btn-flat[disabled]{pointer-events:none;background-color:#DFDFDF !important;-webkit-box-shadow:none;box-shadow:none;color:#9F9F9F !important;cursor:default}.btn.disabled:hover,.disabled.btn-large:hover,.disabled.btn-small:hover,.btn-floating.disabled:hover,.btn-large.disabled:hover,.btn-small.disabled:hover,.btn-flat.disabled:hover,.btn:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-floating:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-flat:disabled:hover,.btn[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-floating[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-flat[disabled]:hover{background-color:#DFDFDF !important;color:#9F9F9F !important}.btn,.btn-large,.btn-small,.btn-floating,.btn-large,.btn-small,.btn-flat{font-size:14px;outline:0}.btn i,.btn-large i,.btn-small i,.btn-floating i,.btn-large i,.btn-small i,.btn-flat i{font-size:1.3rem;line-height:inherit}.btn:focus,.btn-large:focus,.btn-small:focus,.btn-floating:focus{background-color:#1d7d74}.btn,.btn-large,.btn-small{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;-webkit-transition:background-color .2s ease-out;transition:background-color .2s ease-out;cursor:pointer}.btn:hover,.btn-large:hover,.btn-small:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;background-color:#26a69a;border-radius:50%;-webkit-transition:background-color .3s;transition:background-color .3s;cursor:pointer;vertical-align:middle}.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px;padding:0}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.btn-small{width:32.4px;height:32.4px}.btn-floating.btn-small.halfway-fab{bottom:-16.2px}.btn-floating.btn-small i{line-height:32.4px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:997}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.direction-left,.fixed-action-btn.direction-right{padding:0 0 0 15px}.fixed-action-btn.direction-left ul,.fixed-action-btn.direction-right ul{text-align:right;right:64px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.direction-left ul li,.fixed-action-btn.direction-right ul li{display:inline-block;margin:7.5px 15px 0 0}.fixed-action-btn.direction-right{padding:0 15px 0 0}.fixed-action-btn.direction-right ul{text-align:left;direction:rtl;left:64px;right:auto}.fixed-action-btn.direction-right ul li{margin:7.5px 0 0 15px}.fixed-action-btn.direction-bottom{padding:0 0 15px 0}.fixed-action-btn.direction-bottom ul{top:64px;bottom:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.fixed-action-btn.direction-bottom ul li{margin:15px 0 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;z-index:1}.fixed-action-btn.toolbar ul li{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;display:inline-block;margin:0;height:100%;-webkit-transition:none;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#26a69a;border-radius:50%;-webkit-transform:scale(0);transform:scale(0)}.btn-flat{-webkit-box-shadow:none;box-shadow:none;background-color:transparent;color:#343434;cursor:pointer;-webkit-transition:background-color .2s;transition:background-color .2s}.btn-flat:focus,.btn-flat:hover{-webkit-box-shadow:none;box-shadow:none}.btn-flat:focus{background-color:rgba(0,0,0,0.1)}.btn-flat.disabled,.btn-flat.btn-flat[disabled]{background-color:transparent !important;color:#b3b2b2 !important;cursor:default}.btn-large{height:54px;line-height:54px;font-size:15px;padding:0 28px}.btn-large i{font-size:1.6rem}.btn-small{height:32.4px;line-height:32.4px;font-size:13px}.btn-small i{font-size:1.2rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;overflow-y:auto;opacity:0;position:absolute;left:0;top:0;z-index:9999;-webkit-transform-origin:0 0;transform-origin:0 0}.dropdown-content:focus{outline:0}.dropdown-content li{clear:both;color:rgba(0,0,0,0.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left}.dropdown-content li:hover,.dropdown-content li.active{background-color:#eee}.dropdown-content li:focus{outline:none}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}body.keyboard-focused .dropdown-content li:focus{background-color:#dadada}.input-field.col .dropdown-content [type="checkbox"]+label{top:1px;left:0;height:18px;-webkit-transform:none;transform:none}.dropdown-trigger{cursor:pointer}/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;-webkit-transition:.3s ease-out;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,0.2);-webkit-transition:all 0.7s ease-out;transition:all 0.7s ease-out;-webkit-transition-property:opacity, -webkit-transform;transition-property:opacity, -webkit-transform;transition-property:transform, opacity;transition-property:transform, opacity, -webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,0.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,0.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,0.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,0.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,0.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,0.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,0.7)}.waves-effect input[type="button"],.waves-effect input[type="reset"],.waves-effect input[type="submit"]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{-webkit-transition:none !important;transition:none !important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.waves-input-wrapper{border-radius:0.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top, opacity}.modal:focus{outline:none}@media only screen and (max-width: 992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%;text-align:right}.modal .modal-footer .btn,.modal .modal-footer .btn-large,.modal .modal-footer .btn-small,.modal .modal-footer .btn-flat{margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-25%;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,0.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom, opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem 0}.collapsible-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;cursor:pointer;-webkit-tap-highlight-color:transparent;line-height:1.5;padding:1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header:focus{outline:0}.collapsible-header i{width:2rem;font-size:1.6rem;display:inline-block;text-align:center;margin-right:1rem}.keyboard-focused .collapsible-header:focus{background-color:#eee}.collapsible-body{display:none;border-bottom:1px solid #ddd;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2rem}.sidenav .collapsible,.sidenav.fixed .collapsible{border:none;-webkit-box-shadow:none;box-shadow:none}.sidenav .collapsible li,.sidenav.fixed .collapsible li{padding:0}.sidenav .collapsible-header,.sidenav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.sidenav .collapsible-header:hover,.sidenav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,0.05)}.sidenav .collapsible-header i,.sidenav.fixed .collapsible-header i{line-height:inherit}.sidenav .collapsible-body,.sidenav.fixed .collapsible-body{border:0;background-color:#fff}.sidenav .collapsible-body li a,.sidenav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;-webkit-box-shadow:none;box-shadow:none}.collapsible.popout>li{-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);margin:0 24px;-webkit-transition:margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94)}.collapsible.popout>li.active{-webkit-box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,0.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip:focus{outline:none;background-color:#26a69a;color:#fff}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:none;border-bottom:1px solid #9e9e9e;-webkit-box-shadow:none;box-shadow:none;margin:0 0 8px 0;min-height:45px;outline:none;-webkit-transition:all .3s;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;-webkit-box-shadow:0 1px 0 0 #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .input{background:none;border:0;color:rgba(0,0,0,0.6);display:inline-block;font-size:16px;height:3rem;line-height:32px;outline:0;margin:0;padding:0 !important;width:120px !important}.chips .input:focus{border:0 !important;-webkit-box-shadow:none !important;box-shadow:none !important}.chips .autocomplete-content{margin-top:0;margin-bottom:0}.prefix ~ .chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty ~ label{font-size:0.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.materialboxed{display:block;cursor:-webkit-zoom-in;cursor:zoom-in;position:relative;-webkit-transition:opacity .4s;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:-webkit-zoom-out;cursor:zoom-out}#materialbox-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#292929;z-index:1000;will-change:opacity}.materialbox-caption{position:fixed;display:none;color:#fff;line-height:50px;bottom:0;left:0;width:100%;text-align:center;padding:0% 15%;height:50px;z-index:1000;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}::-ms-input-placeholder{color:#d1d1d1}::placeholder{color:#d1d1d1}input:not([type]),input[type=text]:not(.browser-default),input[type=password]:not(.browser-default),input[type=email]:not(.browser-default),input[type=url]:not(.browser-default),input[type=time]:not(.browser-default),input[type=date]:not(.browser-default),input[type=datetime]:not(.browser-default),input[type=datetime-local]:not(.browser-default),input[type=tel]:not(.browser-default),input[type=number]:not(.browser-default),input[type=search]:not(.browser-default),textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:border .3s, -webkit-box-shadow .3s;transition:border .3s, -webkit-box-shadow .3s;transition:box-shadow .3s, border .3s;transition:box-shadow .3s, border .3s, -webkit-box-shadow .3s}input:not([type]):disabled,input:not([type])[readonly="readonly"],input[type=text]:not(.browser-default):disabled,input[type=text]:not(.browser-default)[readonly="readonly"],input[type=password]:not(.browser-default):disabled,input[type=password]:not(.browser-default)[readonly="readonly"],input[type=email]:not(.browser-default):disabled,input[type=email]:not(.browser-default)[readonly="readonly"],input[type=url]:not(.browser-default):disabled,input[type=url]:not(.browser-default)[readonly="readonly"],input[type=time]:not(.browser-default):disabled,input[type=time]:not(.browser-default)[readonly="readonly"],input[type=date]:not(.browser-default):disabled,input[type=date]:not(.browser-default)[readonly="readonly"],input[type=datetime]:not(.browser-default):disabled,input[type=datetime]:not(.browser-default)[readonly="readonly"],input[type=datetime-local]:not(.browser-default):disabled,input[type=datetime-local]:not(.browser-default)[readonly="readonly"],input[type=tel]:not(.browser-default):disabled,input[type=tel]:not(.browser-default)[readonly="readonly"],input[type=number]:not(.browser-default):disabled,input[type=number]:not(.browser-default)[readonly="readonly"],input[type=search]:not(.browser-default):disabled,input[type=search]:not(.browser-default)[readonly="readonly"],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly="readonly"]{color:rgba(0,0,0,0.42);border-bottom:1px dotted rgba(0,0,0,0.42)}input:not([type]):disabled+label,input:not([type])[readonly="readonly"]+label,input[type=text]:not(.browser-default):disabled+label,input[type=text]:not(.browser-default)[readonly="readonly"]+label,input[type=password]:not(.browser-default):disabled+label,input[type=password]:not(.browser-default)[readonly="readonly"]+label,input[type=email]:not(.browser-default):disabled+label,input[type=email]:not(.browser-default)[readonly="readonly"]+label,input[type=url]:not(.browser-default):disabled+label,input[type=url]:not(.browser-default)[readonly="readonly"]+label,input[type=time]:not(.browser-default):disabled+label,input[type=time]:not(.browser-default)[readonly="readonly"]+label,input[type=date]:not(.browser-default):disabled+label,input[type=date]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime]:not(.browser-default):disabled+label,input[type=datetime]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime-local]:not(.browser-default):disabled+label,input[type=datetime-local]:not(.browser-default)[readonly="readonly"]+label,input[type=tel]:not(.browser-default):disabled+label,input[type=tel]:not(.browser-default)[readonly="readonly"]+label,input[type=number]:not(.browser-default):disabled+label,input[type=number]:not(.browser-default)[readonly="readonly"]+label,input[type=search]:not(.browser-default):disabled+label,input[type=search]:not(.browser-default)[readonly="readonly"]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly="readonly"]+label{color:rgba(0,0,0,0.42)}input:not([type]):focus:not([readonly]),input[type=text]:not(.browser-default):focus:not([readonly]),input[type=password]:not(.browser-default):focus:not([readonly]),input[type=email]:not(.browser-default):focus:not([readonly]),input[type=url]:not(.browser-default):focus:not([readonly]),input[type=time]:not(.browser-default):focus:not([readonly]),input[type=date]:not(.browser-default):focus:not([readonly]),input[type=datetime]:not(.browser-default):focus:not([readonly]),input[type=datetime-local]:not(.browser-default):focus:not([readonly]),input[type=tel]:not(.browser-default):focus:not([readonly]),input[type=number]:not(.browser-default):focus:not([readonly]),input[type=search]:not(.browser-default):focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;-webkit-box-shadow:0 1px 0 0 #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=text]:not(.browser-default):focus:not([readonly])+label,input[type=password]:not(.browser-default):focus:not([readonly])+label,input[type=email]:not(.browser-default):focus:not([readonly])+label,input[type=url]:not(.browser-default):focus:not([readonly])+label,input[type=time]:not(.browser-default):focus:not([readonly])+label,input[type=date]:not(.browser-default):focus:not([readonly])+label,input[type=datetime]:not(.browser-default):focus:not([readonly])+label,input[type=datetime-local]:not(.browser-default):focus:not([readonly])+label,input[type=tel]:not(.browser-default):focus:not([readonly])+label,input[type=number]:not(.browser-default):focus:not([readonly])+label,input[type=search]:not(.browser-default):focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]):focus.valid ~ label,input[type=text]:not(.browser-default):focus.valid ~ label,input[type=password]:not(.browser-default):focus.valid ~ label,input[type=email]:not(.browser-default):focus.valid ~ label,input[type=url]:not(.browser-default):focus.valid ~ label,input[type=time]:not(.browser-default):focus.valid ~ label,input[type=date]:not(.browser-default):focus.valid ~ label,input[type=datetime]:not(.browser-default):focus.valid ~ label,input[type=datetime-local]:not(.browser-default):focus.valid ~ label,input[type=tel]:not(.browser-default):focus.valid ~ label,input[type=number]:not(.browser-default):focus.valid ~ label,input[type=search]:not(.browser-default):focus.valid ~ label,textarea.materialize-textarea:focus.valid ~ label{color:#4CAF50}input:not([type]):focus.invalid ~ label,input[type=text]:not(.browser-default):focus.invalid ~ label,input[type=password]:not(.browser-default):focus.invalid ~ label,input[type=email]:not(.browser-default):focus.invalid ~ label,input[type=url]:not(.browser-default):focus.invalid ~ label,input[type=time]:not(.browser-default):focus.invalid ~ label,input[type=date]:not(.browser-default):focus.invalid ~ label,input[type=datetime]:not(.browser-default):focus.invalid ~ label,input[type=datetime-local]:not(.browser-default):focus.invalid ~ label,input[type=tel]:not(.browser-default):focus.invalid ~ label,input[type=number]:not(.browser-default):focus.invalid ~ label,input[type=search]:not(.browser-default):focus.invalid ~ label,textarea.materialize-textarea:focus.invalid ~ label{color:#F44336}input:not([type]).validate+label,input[type=text]:not(.browser-default).validate+label,input[type=password]:not(.browser-default).validate+label,input[type=email]:not(.browser-default).validate+label,input[type=url]:not(.browser-default).validate+label,input[type=time]:not(.browser-default).validate+label,input[type=date]:not(.browser-default).validate+label,input[type=datetime]:not(.browser-default).validate+label,input[type=datetime-local]:not(.browser-default).validate+label,input[type=tel]:not(.browser-default).validate+label,input[type=number]:not(.browser-default).validate+label,input[type=search]:not(.browser-default).validate+label,textarea.materialize-textarea.validate+label{width:100%}input.valid:not([type]),input.valid:not([type]):focus,input.valid[type=text]:not(.browser-default),input.valid[type=text]:not(.browser-default):focus,input.valid[type=password]:not(.browser-default),input.valid[type=password]:not(.browser-default):focus,input.valid[type=email]:not(.browser-default),input.valid[type=email]:not(.browser-default):focus,input.valid[type=url]:not(.browser-default),input.valid[type=url]:not(.browser-default):focus,input.valid[type=time]:not(.browser-default),input.valid[type=time]:not(.browser-default):focus,input.valid[type=date]:not(.browser-default),input.valid[type=date]:not(.browser-default):focus,input.valid[type=datetime]:not(.browser-default),input.valid[type=datetime]:not(.browser-default):focus,input.valid[type=datetime-local]:not(.browser-default),input.valid[type=datetime-local]:not(.browser-default):focus,input.valid[type=tel]:not(.browser-default),input.valid[type=tel]:not(.browser-default):focus,input.valid[type=number]:not(.browser-default),input.valid[type=number]:not(.browser-default):focus,input.valid[type=search]:not(.browser-default),input.valid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.valid,textarea.materialize-textarea.valid:focus,.select-wrapper.valid>input.select-dropdown{border-bottom:1px solid #4CAF50;-webkit-box-shadow:0 1px 0 0 #4CAF50;box-shadow:0 1px 0 0 #4CAF50}input.invalid:not([type]),input.invalid:not([type]):focus,input.invalid[type=text]:not(.browser-default),input.invalid[type=text]:not(.browser-default):focus,input.invalid[type=password]:not(.browser-default),input.invalid[type=password]:not(.browser-default):focus,input.invalid[type=email]:not(.browser-default),input.invalid[type=email]:not(.browser-default):focus,input.invalid[type=url]:not(.browser-default),input.invalid[type=url]:not(.browser-default):focus,input.invalid[type=time]:not(.browser-default),input.invalid[type=time]:not(.browser-default):focus,input.invalid[type=date]:not(.browser-default),input.invalid[type=date]:not(.browser-default):focus,input.invalid[type=datetime]:not(.browser-default),input.invalid[type=datetime]:not(.browser-default):focus,input.invalid[type=datetime-local]:not(.browser-default),input.invalid[type=datetime-local]:not(.browser-default):focus,input.invalid[type=tel]:not(.browser-default),input.invalid[type=tel]:not(.browser-default):focus,input.invalid[type=number]:not(.browser-default),input.invalid[type=number]:not(.browser-default):focus,input.invalid[type=search]:not(.browser-default),input.invalid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.invalid,textarea.materialize-textarea.invalid:focus,.select-wrapper.invalid>input.select-dropdown,.select-wrapper.invalid>input.select-dropdown:focus{border-bottom:1px solid #F44336;-webkit-box-shadow:0 1px 0 0 #F44336;box-shadow:0 1px 0 0 #F44336}input:not([type]).valid ~ .helper-text[data-success],input:not([type]):focus.valid ~ .helper-text[data-success],input:not([type]).invalid ~ .helper-text[data-error],input:not([type]):focus.invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default).valid ~ .helper-text[data-success],input[type=text]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=text]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default).valid ~ .helper-text[data-success],input[type=password]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=password]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default).valid ~ .helper-text[data-success],input[type=email]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=email]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default).valid ~ .helper-text[data-success],input[type=url]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=url]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default).valid ~ .helper-text[data-success],input[type=time]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=time]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default).valid ~ .helper-text[data-success],input[type=date]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=date]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default).valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default).valid ~ .helper-text[data-success],input[type=number]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=number]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default).valid ~ .helper-text[data-success],input[type=search]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=search]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default):focus.invalid ~ .helper-text[data-error],textarea.materialize-textarea.valid ~ .helper-text[data-success],textarea.materialize-textarea:focus.valid ~ .helper-text[data-success],textarea.materialize-textarea.invalid ~ .helper-text[data-error],textarea.materialize-textarea:focus.invalid ~ .helper-text[data-error],.select-wrapper.valid .helper-text[data-success],.select-wrapper.invalid ~ .helper-text[data-error]{color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}input:not([type]).valid ~ .helper-text:after,input:not([type]):focus.valid ~ .helper-text:after,input[type=text]:not(.browser-default).valid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=password]:not(.browser-default).valid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=email]:not(.browser-default).valid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=url]:not(.browser-default).valid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=time]:not(.browser-default).valid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=date]:not(.browser-default).valid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=tel]:not(.browser-default).valid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=number]:not(.browser-default).valid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=search]:not(.browser-default).valid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.valid ~ .helper-text:after,textarea.materialize-textarea.valid ~ .helper-text:after,textarea.materialize-textarea:focus.valid ~ .helper-text:after,.select-wrapper.valid ~ .helper-text:after{content:attr(data-success);color:#4CAF50}input:not([type]).invalid ~ .helper-text:after,input:not([type]):focus.invalid ~ .helper-text:after,input[type=text]:not(.browser-default).invalid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=password]:not(.browser-default).invalid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=email]:not(.browser-default).invalid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=url]:not(.browser-default).invalid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=time]:not(.browser-default).invalid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=date]:not(.browser-default).invalid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=tel]:not(.browser-default).invalid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=number]:not(.browser-default).invalid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=search]:not(.browser-default).invalid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.invalid ~ .helper-text:after,textarea.materialize-textarea.invalid ~ .helper-text:after,textarea.materialize-textarea:focus.invalid ~ .helper-text:after,.select-wrapper.invalid ~ .helper-text:after{content:attr(data-error);color:#F44336}input:not([type])+label:after,input[type=text]:not(.browser-default)+label:after,input[type=password]:not(.browser-default)+label:after,input[type=email]:not(.browser-default)+label:after,input[type=url]:not(.browser-default)+label:after,input[type=time]:not(.browser-default)+label:after,input[type=date]:not(.browser-default)+label:after,input[type=datetime]:not(.browser-default)+label:after,input[type=datetime-local]:not(.browser-default)+label:after,input[type=tel]:not(.browser-default)+label:after,input[type=number]:not(.browser-default)+label:after,input[type=search]:not(.browser-default)+label:after,textarea.materialize-textarea+label:after,.select-wrapper+label:after{display:block;content:"";position:absolute;top:100%;left:0;opacity:0;-webkit-transition:.2s opacity ease-out, .2s color ease-out;transition:.2s opacity ease-out, .2s color ease-out}.input-field{position:relative;margin-top:1rem;margin-bottom:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline input,.input-field.inline .select-dropdown{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix ~ label,.input-field.col .prefix ~ .validate ~ label{width:calc(100% - 3rem - 1.5rem)}.input-field>label{color:#9e9e9e;position:absolute;top:0;left:0;font-size:1rem;cursor:text;-webkit-transition:color .2s ease-out, -webkit-transform .2s ease-out;transition:color .2s ease-out, -webkit-transform .2s ease-out;transition:transform .2s ease-out, color .2s ease-out;transition:transform .2s ease-out, color .2s ease-out, -webkit-transform .2s ease-out;-webkit-transform-origin:0% 100%;transform-origin:0% 100%;text-align:initial;-webkit-transform:translateY(12px);transform:translateY(12px)}.input-field>label:not(.label-icon).active{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field>input[type]:-webkit-autofill:not(.browser-default):not([type="search"])+label,.input-field>input[type=date]:not(.browser-default)+label,.input-field>input[type=time]:not(.browser-default)+label{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field .helper-text{position:relative;min-height:18px;display:block;font-size:12px;color:rgba(0,0,0,0.54)}.input-field .helper-text::after{opacity:1;position:absolute;top:0;left:0}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;-webkit-transition:color .2s;transition:color .2s;top:.5rem}.input-field .prefix.active{color:#26a69a}.input-field .prefix ~ input,.input-field .prefix ~ textarea,.input-field .prefix ~ label,.input-field .prefix ~ .validate ~ label,.input-field .prefix ~ .helper-text,.input-field .prefix ~ .autocomplete-content{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix ~ label{margin-left:3rem}@media only screen and (max-width: 992px){.input-field .prefix ~ input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width: 600px){.input-field .prefix ~ input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;-webkit-transition:.3s background-color;transition:.3s background-color}.nav-wrapper .input-field input[type=search]{height:inherit;padding-left:4rem;width:calc(100% - 4rem);border:0;-webkit-box-shadow:none;box-shadow:none}.input-field input[type=search]:focus:not(.browser-default){background-color:#fff;border:0;-webkit-box-shadow:none;box-shadow:none;color:#444}.input-field input[type=search]:focus:not(.browser-default)+label i,.input-field input[type=search]:focus:not(.browser-default) ~ .mdi-navigation-close,.input-field input[type=search]:focus:not(.browser-default) ~ .material-icons{color:#444}.input-field input[type=search]+.label-icon{-webkit-transform:none;transform:none;left:1rem}.input-field input[type=search] ~ .mdi-navigation-close,.input-field input[type=search] ~ .material-icons{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;-webkit-transition:.3s color;transition:.3s color}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{line-height:normal;overflow-y:hidden;padding:.8rem 0 .8rem 0;resize:none;min-height:3rem;-webkit-box-sizing:border-box;box-sizing:border-box}.hiddendiv{visibility:hidden;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0;z-index:-1}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}.character-counter{min-height:18px}[type="radio"]:not(:checked),[type="radio"]:checked{position:absolute;opacity:0;pointer-events:none}[type="radio"]:not(:checked)+span,[type="radio"]:checked+span{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-transition:.28s ease;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="radio"]+span:before,[type="radio"]+span:after{content:'';position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;-webkit-transition:.28s ease;transition:.28s ease}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after,[type="radio"]:checked+span:before,[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border-radius:50%}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after{border:2px solid #5a5a5a}[type="radio"]:not(:checked)+span:after{-webkit-transform:scale(0);transform:scale(0)}[type="radio"]:checked+span:before{border:2px solid transparent}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border:2px solid #26a69a}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:after{background-color:#26a69a}[type="radio"]:checked+span:after{-webkit-transform:scale(1.02);transform:scale(1.02)}[type="radio"].with-gap:checked+span:after{-webkit-transform:scale(0.5);transform:scale(0.5)}[type="radio"].tabbed:focus+span:before{-webkit-box-shadow:0 0 0 10px rgba(0,0,0,0.1);box-shadow:0 0 0 10px rgba(0,0,0,0.1)}[type="radio"].with-gap:disabled:checked+span:before{border:2px solid rgba(0,0,0,0.42)}[type="radio"].with-gap:disabled:checked+span:after{border:none;background-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before,[type="radio"]:disabled:checked+span:before{background-color:transparent;border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled+span{color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before{border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:checked+span:after{background-color:rgba(0,0,0,0.42);border-color:#949494}[type="checkbox"]:not(:checked),[type="checkbox"]:checked{position:absolute;opacity:0;pointer-events:none}[type="checkbox"]+span:not(.lever){position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="checkbox"]+span:not(.lever):before,[type="checkbox"]:not(.filled-in)+span:not(.lever):after{content:'';position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:3px;-webkit-transition:.2s;transition:.2s}[type="checkbox"]:not(.filled-in)+span:not(.lever):after{border:0;-webkit-transform:scale(0);transform:scale(0)}[type="checkbox"]:not(:checked):disabled+span:not(.lever):before{border:none;background-color:rgba(0,0,0,0.42)}[type="checkbox"].tabbed:focus+span:not(.lever):after{-webkit-transform:scale(1);transform:scale(1);border:0;border-radius:50%;-webkit-box-shadow:0 0 0 10px rgba(0,0,0,0.1);box-shadow:0 0 0 10px rgba(0,0,0,0.1);background-color:rgba(0,0,0,0.1)}[type="checkbox"]:checked+span:not(.lever):before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:checked:disabled+span:before{border-right:2px solid rgba(0,0,0,0.42);border-bottom:2px solid rgba(0,0,0,0.42)}[type="checkbox"]:indeterminate+span:not(.lever):before{top:-11px;left:-12px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:indeterminate:disabled+span:not(.lever):before{border-right:2px solid rgba(0,0,0,0.42);background-color:transparent}[type="checkbox"].filled-in+span:not(.lever):after{border-radius:2px}[type="checkbox"].filled-in+span:not(.lever):before,[type="checkbox"].filled-in+span:not(.lever):after{content:'';left:0;position:absolute;-webkit-transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;z-index:1}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0px;z-index:0}[type="checkbox"].filled-in:checked+span:not(.lever):before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:checked+span:not(.lever):after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type="checkbox"].filled-in.tabbed:focus+span:not(.lever):after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,0.1)}[type="checkbox"].filled-in.tabbed:checked:focus+span:not(.lever):after{border-radius:2px;background-color:#26a69a;border-color:#26a69a}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):before{background-color:transparent;border:2px solid transparent}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):after{border-color:transparent;background-color:#949494}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):before{background-color:transparent}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):after{background-color:#949494;border-color:#949494}.switch,.switch *{-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:before,.switch label input[type=checkbox]:checked+.lever:after{left:18px}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a}.switch label .lever{content:"";display:inline-block;position:relative;width:36px;height:14px;background-color:rgba(0,0,0,0.38);border-radius:15px;margin-right:10px;-webkit-transition:background 0.3s ease;transition:background 0.3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:before,.switch label .lever:after{content:"";position:absolute;display:inline-block;width:20px;height:20px;border-radius:50%;left:0;top:-3px;-webkit-transition:left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;transition:left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;transition:left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease;transition:left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease}.switch label .lever:before{background-color:rgba(38,166,154,0.15)}.switch label .lever:after{background-color:#F1F1F1;-webkit-box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before,input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(38,166,154,0.15)}input[type=checkbox]:not(:disabled) ~ .lever:active:before,input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(0,0,0,0.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default;background-color:rgba(0,0,0,0.12)}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#949494}select{display:none}select.browser-default{display:block}select{background-color:rgba(255,255,255,0.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper.valid+label,.select-wrapper.invalid+label{width:100%;pointer-events:none}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.select-wrapper input.select-dropdown:focus{border-bottom:1px solid #26a69a}.select-wrapper .caret{position:absolute;right:0;top:0;bottom:0;margin:auto 0;z-index:0;fill:rgba(0,0,0,0.87)}.select-wrapper+label{position:absolute;top:-26px;font-size:.8rem}select:disabled{color:rgba(0,0,0,0.42)}.select-wrapper.disabled+label{color:rgba(0,0,0,0.42)}.select-wrapper.disabled .caret{fill:rgba(0,0,0,0.42)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,0.42);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-wrapper i{color:rgba(0,0,0,0.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,0.3);background-color:transparent}body.keyboard-focused .select-dropdown.dropdown-content li:focus{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li:hover{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li.selected{background-color:rgba(0,0,0,0.03)}.prefix ~ .select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix ~ label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,0.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,0.4)}.select-dropdown li.optgroup ~ li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large,.file-field .btn-small{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.file-field input[type=file]::-webkit-file-upload-button{display:none}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:none}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;margin-left:7px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s;-webkit-appearance:none;background-color:#26a69a;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;margin:-5px 0 0 0}.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 10px rgba(38,166,154,0.26);box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]{border:1px solid white}input[type=range]::-moz-range-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-moz-focus-inner{border:0}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s}.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{display:inline-block;font-weight:300;color:#757575;padding-left:16px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:15px;border-left:1px solid #ee6e73}.table-of-contents a.active{font-weight:500;padding-left:14px;border-left:2px solid #ee6e73}.sidenav{position:fixed;width:300px;left:0;top:0;margin:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);height:100%;height:calc(100% + 60px);height:-moz-calc(100%);padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.right-aligned{right:0;-webkit-transform:translateX(105%);transform:translateX(105%);left:auto;-webkit-transform:translateX(100%);transform:translateX(100%)}.sidenav .collapsible{margin:0}.sidenav li{float:none;line-height:48px}.sidenav li.active{background-color:rgba(0,0,0,0.05)}.sidenav li>a{color:rgba(0,0,0,0.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.sidenav li>a:hover{background-color:rgba(0,0,0,0.05)}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-flat,.sidenav li>a.btn-floating{margin:10px 15px}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-floating{color:#fff}.sidenav li>a.btn-flat{color:#343434}.sidenav li>a.btn:hover,.sidenav li>a.btn-large:hover,.sidenav li>a.btn-small:hover,.sidenav li>a.btn-large:hover{background-color:#2bbbad}.sidenav li>a.btn-floating:hover{background-color:#26a69a}.sidenav li>a>i,.sidenav li>a>[class^="mdi-"],.sidenav li>a li>a>[class*="mdi-"],.sidenav li>a>i.material-icons{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,0.54)}.sidenav .divider{margin:8px 0 0 0}.sidenav .subheader{cursor:initial;pointer-events:none;color:rgba(0,0,0,0.54);font-size:14px;font-weight:500;line-height:48px}.sidenav .subheader:hover{background-color:transparent}.sidenav .user-view{position:relative;padding:32px 32px 0;margin-bottom:8px}.sidenav .user-view>a{height:auto;padding:0}.sidenav .user-view>a:hover{background-color:transparent}.sidenav .user-view .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.sidenav .user-view .circle,.sidenav .user-view .name,.sidenav .user-view .email{display:block}.sidenav .user-view .circle{height:64px;width:64px}.sidenav .user-view .name,.sidenav .user-view .email{font-size:14px;line-height:24px}.sidenav .user-view .name{margin-top:16px;font-weight:500}.sidenav .user-view .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.drag-target.right-aligned{right:0}.sidenav.sidenav-fixed{left:0;-webkit-transform:translateX(0);transform:translateX(0);position:fixed}.sidenav.sidenav-fixed.right-aligned{right:0;left:auto}@media only screen and (max-width: 992px){.sidenav.sidenav-fixed{-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.sidenav-fixed.right-aligned{-webkit-transform:translateX(105%);transform:translateX(105%)}.sidenav>a{padding:0 16px}.sidenav .user-view{padding:16px 16px 0}}.sidenav .collapsible-body>ul:not(.collapsible)>li.active,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#ee6e73}.sidenav .collapsible-body>ul:not(.collapsible)>li.active a,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.sidenav .collapsible-body{padding:0}.sidenav-overlay{position:fixed;top:0;left:0;right:0;opacity:0;height:120vh;background-color:rgba(0,0,0,0.5);z-index:997;display:none}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent !important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent !important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent !important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1)}@-webkit-keyframes fade-out{from{opacity:1}to{opacity:0}}@keyframes fade-out{from{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:center}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;-webkit-transition:background-color .3s;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4CAF50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;-webkit-perspective:500px;perspective:500px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform-origin:0% 50%;transform-origin:0% 50%}.carousel.carousel-slider{top:0;left:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{visibility:hidden;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:rgba(255,255,255,0.5);-webkit-transition:background-color .3s;transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel.scrolling .carousel-item .materialboxed,.carousel .carousel-item:not(.active) .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;-webkit-transition:visibility 0s .3s;transition:visibility 0s .3s}.tap-target-wrapper.open{visibility:visible;-webkit-transition:visibility 0s;transition:visibility 0s}.tap-target-wrapper.open .tap-target{-webkit-transform:scale(1);transform:scale(1);opacity:.95;-webkit-transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1)}.tap-target-wrapper.open .tap-target-wave::before{-webkit-transform:scale(1);transform:scale(1)}.tap-target-wrapper.open .tap-target-wave::after{visibility:visible;-webkit-animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;-webkit-transition:opacity .3s, visibility 0s 1s, -webkit-transform .3s;transition:opacity .3s, visibility 0s 1s, -webkit-transform .3s;transition:opacity .3s, transform .3s, visibility 0s 1s;transition:opacity .3s, transform .3s, visibility 0s 1s, -webkit-transform .3s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#ee6e73;-webkit-box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);width:100%;height:100%;opacity:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1)}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave::before,.tap-target-wave::after{content:'';display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#ffffff}.tap-target-wave::before{-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s, -webkit-transform .3s}.tap-target-wave::after{visibility:hidden;-webkit-transition:opacity .3s, visibility 0s, -webkit-transform .3s;transition:opacity .3s, visibility 0s, -webkit-transform .3s;transition:opacity .3s, transform .3s, visibility 0s;transition:opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s;z-index:-1}.tap-target-origin{top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);z-index:10002;position:absolute !important}.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small),.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover{background:none}@media only screen and (max-width: 600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:visible;position:relative}.pulse::before{content:'';display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;-webkit-transition:opacity .3s, -webkit-transform .3s;transition:opacity .3s, -webkit-transform .3s;transition:opacity .3s, transform .3s;transition:opacity .3s, transform .3s, -webkit-transform .3s;-webkit-animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;z-index:-1}@-webkit-keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}100%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}@keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}100%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}.datepicker-modal{max-width:325px;min-width:300px;max-height:none}.datepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.datepicker-controls{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:280px;margin:0 auto}.datepicker-controls .selects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.datepicker-controls .select-wrapper input{border-bottom:none;text-align:center;margin:0}.datepicker-controls .select-wrapper input:focus{border-bottom:none}.datepicker-controls .select-wrapper .caret{display:none}.datepicker-controls .select-year input{width:50px}.datepicker-controls .select-month input{width:70px}.month-prev,.month-next{margin-top:4px;cursor:pointer;background-color:transparent;border:none}.datepicker-date-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;color:#fff;padding:20px 22px;font-weight:500}.datepicker-date-display .year-text{display:block;font-size:1.5rem;line-height:25px;color:rgba(255,255,255,0.7)}.datepicker-date-display .date-text{display:block;font-size:2.8rem;line-height:47px;font-weight:500}.datepicker-calendar-container{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.datepicker-table{width:280px;font-size:1rem;margin:0 auto}.datepicker-table thead{border-bottom:none}.datepicker-table th{padding:10px 5px;text-align:center}.datepicker-table tr{border:none}.datepicker-table abbr{text-decoration:none;color:#999}.datepicker-table td{border-radius:50%;padding:0}.datepicker-table td.is-today{color:#26a69a}.datepicker-table td.is-selected{background-color:#26a69a;color:#fff}.datepicker-table td.is-outside-current-month,.datepicker-table td.is-disabled{color:rgba(0,0,0,0.3);pointer-events:none}.datepicker-day-button{background-color:transparent;border:none;line-height:38px;display:block;width:100%;border-radius:50%;padding:0 5px;cursor:pointer;color:inherit}.datepicker-day-button:focus{background-color:rgba(43,161,150,0.25)}.datepicker-footer{width:280px;margin:0 auto;padding-bottom:5px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.datepicker-cancel,.datepicker-clear,.datepicker-today,.datepicker-done{color:#26a69a;padding:0 1rem}.datepicker-clear{color:#F44336}@media only screen and (min-width: 601px){.datepicker-modal{max-width:625px}.datepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.datepicker-date-display{-webkit-box-flex:0;-webkit-flex:0 1 270px;-ms-flex:0 1 270px;flex:0 1 270px}.datepicker-controls,.datepicker-table,.datepicker-footer{width:320px}.datepicker-day-button{line-height:44px}}.timepicker-modal{max-width:325px;max-height:none}.timepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.text-primary{color:#fff}.timepicker-digital-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;padding:10px;font-weight:300}.timepicker-text-container{font-size:4rem;font-weight:bold;text-align:center;color:rgba(255,255,255,0.6);font-weight:400;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-span-hours,.timepicker-span-minutes,.timepicker-span-am-pm div{cursor:pointer}.timepicker-span-hours{margin-right:3px}.timepicker-span-minutes{margin-left:3px}.timepicker-display-am-pm{font-size:1.3rem;position:absolute;right:1rem;bottom:1rem;font-weight:400}.timepicker-analog-display{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.timepicker-plate{background-color:#eee;border-radius:50%;width:270px;height:270px;overflow:visible;position:relative;margin:auto;margin-top:25px;margin-bottom:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-canvas,.timepicker-dial{position:absolute;left:0;right:0;top:0;bottom:0}.timepicker-minutes{visibility:hidden}.timepicker-tick{border-radius:50%;color:rgba(0,0,0,0.87);line-height:40px;text-align:center;width:40px;height:40px;position:absolute;cursor:pointer;font-size:15px}.timepicker-tick.active,.timepicker-tick:hover{background-color:rgba(38,166,154,0.25)}.timepicker-dial{-webkit-transition:opacity 350ms, -webkit-transform 350ms;transition:opacity 350ms, -webkit-transform 350ms;transition:transform 350ms, opacity 350ms;transition:transform 350ms, opacity 350ms, -webkit-transform 350ms}.timepicker-dial-out{opacity:0}.timepicker-dial-out.timepicker-hours{-webkit-transform:scale(1.1, 1.1);transform:scale(1.1, 1.1)}.timepicker-dial-out.timepicker-minutes{-webkit-transform:scale(0.8, 0.8);transform:scale(0.8, 0.8)}.timepicker-canvas{-webkit-transition:opacity 175ms;transition:opacity 175ms}.timepicker-canvas line{stroke:#26a69a;stroke-width:4;stroke-linecap:round}.timepicker-canvas-out{opacity:0.25}.timepicker-canvas-bearing{stroke:none;fill:#26a69a}.timepicker-canvas-bg{stroke:none;fill:#26a69a}.timepicker-footer{margin:0 auto;padding:5px 1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.timepicker-clear{color:#F44336}.timepicker-close{color:#26a69a}.timepicker-clear,.timepicker-close{padding:0 20px}@media only screen and (min-width: 601px){.timepicker-modal{max-width:600px}.timepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.timepicker-text-container{top:32%}.timepicker-display-am-pm{position:relative;right:auto;bottom:auto;text-align:center;margin-top:1.2rem}} diff --git a/pkgs/csslib/third_party/mdc/LICENSE b/pkgs/csslib/third_party/mdc/LICENSE new file mode 100644 index 000000000..032483888 --- /dev/null +++ b/pkgs/csslib/third_party/mdc/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2014-2020 Google, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pkgs/csslib/third_party/mdc/README.md b/pkgs/csslib/third_party/mdc/README.md new file mode 100644 index 000000000..f388348b8 --- /dev/null +++ b/pkgs/csslib/third_party/mdc/README.md @@ -0,0 +1,7 @@ +This folder contains sample css files from the open-source project +https://github.com/material-components/material-components-web. + +The generated .css files were retrieved from: +https://unpkg.com/browse/material-components-web@12.0.0/dist/ + +This code was included under the terms in the `LICENSE` file. \ No newline at end of file diff --git a/pkgs/csslib/third_party/mdc/material-components-web.css b/pkgs/csslib/third_party/mdc/material-components-web.css new file mode 100644 index 000000000..2099afef3 --- /dev/null +++ b/pkgs/csslib/third_party/mdc/material-components-web.css @@ -0,0 +1,16511 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://github.com/material-components/material-components-web/blob/master/LICENSE + */ +@charset "UTF-8"; +.mdc-banner__text { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} + +.mdc-banner__graphic { + color: #fff; + /* @alternate */ + color: var(--mdc-theme-surface, #fff); +} + +.mdc-banner__graphic { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-theme-primary, #6200ee); +} + +.mdc-banner__graphic { + border-radius: 50%; +} + +.mdc-banner__content, +.mdc-banner__fixed { + min-width: 344px; +} +@media (max-width: 480px), (max-width: 344px) { + .mdc-banner__content, +.mdc-banner__fixed { + min-width: 100%; + } +} + +.mdc-banner__content { + max-width: 720px; +} + +.mdc-banner { + z-index: 1; + border-bottom-style: solid; + border-bottom-width: 1px; + box-sizing: border-box; + display: none; + flex-shrink: 0; + height: 0; + position: relative; + width: 100%; +} +@media (max-width: 480px) { + .mdc-banner .mdc-banner__fixed { + left: 0; + right: 0; + } + .mdc-banner .mdc-banner__text { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 36px; + } + [dir=rtl] .mdc-banner .mdc-banner__text, .mdc-banner .mdc-banner__text[dir=rtl] { + /* @noflip */ + margin-left: 36px; + /* @noflip */ + margin-right: 16px; + } +} +@media (max-width: 480px) { + .mdc-banner.mdc-banner--mobile-stacked .mdc-banner__content { + flex-wrap: wrap; + } + .mdc-banner.mdc-banner--mobile-stacked .mdc-banner__graphic { + margin-bottom: 12px; + } + .mdc-banner.mdc-banner--mobile-stacked .mdc-banner__text { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 8px; + padding-bottom: 4px; + } + [dir=rtl] .mdc-banner.mdc-banner--mobile-stacked .mdc-banner__text, .mdc-banner.mdc-banner--mobile-stacked .mdc-banner__text[dir=rtl] { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 16px; + } + + .mdc-banner.mdc-banner--mobile-stacked .mdc-banner__actions { + margin-left: auto; + } +} + +.mdc-banner--opening, +.mdc-banner--open, +.mdc-banner--closing { + display: flex; +} + +.mdc-banner--open { + transition: height 300ms ease; +} +.mdc-banner--open .mdc-banner__content { + transition: -webkit-transform 300ms ease; + transition: transform 300ms ease; + transition: transform 300ms ease, -webkit-transform 300ms ease; + -webkit-transform: translateY(0); + transform: translateY(0); +} + +.mdc-banner--closing { + transition: height 250ms ease; +} +.mdc-banner--closing .mdc-banner__content { + transition: -webkit-transform 250ms ease; + transition: transform 250ms ease; + transition: transform 250ms ease, -webkit-transform 250ms ease; +} + +.mdc-banner--centered .mdc-banner__content { + left: 0; + margin-left: auto; + margin-right: auto; + right: 0; +} + +.mdc-banner__fixed { + border-bottom-style: solid; + border-bottom-width: 1px; + box-sizing: border-box; + height: inherit; + position: fixed; + width: 100%; +} + +.mdc-banner__content { + display: flex; + min-height: 52px; + position: absolute; + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + width: 100%; +} + +.mdc-banner__graphic-text-wrapper { + display: flex; + width: 100%; +} + +.mdc-banner__graphic { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + flex-shrink: 0; + height: 40px; + margin-top: 16px; + margin-bottom: 16px; + text-align: center; + width: 40px; +} +[dir=rtl] .mdc-banner__graphic, .mdc-banner__graphic[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-banner__icon { + position: relative; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} + +.mdc-banner__text { + /* @noflip */ + margin-left: 24px; + /* @noflip */ + margin-right: 90px; + align-self: center; + flex-grow: 1; + padding-top: 16px; + padding-bottom: 16px; +} +[dir=rtl] .mdc-banner__text, .mdc-banner__text[dir=rtl] { + /* @noflip */ + margin-left: 90px; + /* @noflip */ + margin-right: 24px; +} + +.mdc-banner__actions { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 8px; + align-self: flex-end; + display: flex; + flex-shrink: 0; + padding-bottom: 8px; + padding-top: 8px; +} +[dir=rtl] .mdc-banner__actions, .mdc-banner__actions[dir=rtl] { + /* @noflip */ + padding-left: 8px; + /* @noflip */ + padding-right: 0; +} + +.mdc-banner__secondary-action { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 8px; +} +[dir=rtl] .mdc-banner__secondary-action, .mdc-banner__secondary-action[dir=rtl] { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 0; +} + +.mdc-banner { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); + border-bottom-color: rgba(0, 0, 0, 0.12); +} +.mdc-banner .mdc-banner__fixed { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); +} +.mdc-banner .mdc-banner__fixed { + border-bottom-color: rgba(0, 0, 0, 0.12); +} + +.mdc-banner__text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); +} + +.mdc-banner__primary-action:not(:disabled) { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} +.mdc-banner__primary-action::before, .mdc-banner__primary-action::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-banner__primary-action:hover::before, .mdc-banner__primary-action.mdc-ripple-surface--hover::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-banner__primary-action.mdc-ripple-upgraded--background-focused::before, .mdc-banner__primary-action:not(.mdc-ripple-upgraded):focus::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-banner__primary-action:not(.mdc-ripple-upgraded)::after { + transition: opacity 150ms linear; +} +.mdc-banner__primary-action:not(.mdc-ripple-upgraded):active::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-banner__primary-action.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} + +.mdc-banner__secondary-action { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 8px; +} +.mdc-banner__secondary-action:not(:disabled) { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} +.mdc-banner__secondary-action::before, .mdc-banner__secondary-action::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-banner__secondary-action:hover::before, .mdc-banner__secondary-action.mdc-ripple-surface--hover::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-banner__secondary-action.mdc-ripple-upgraded--background-focused::before, .mdc-banner__secondary-action:not(.mdc-ripple-upgraded):focus::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-banner__secondary-action:not(.mdc-ripple-upgraded)::after { + transition: opacity 150ms linear; +} +.mdc-banner__secondary-action:not(.mdc-ripple-upgraded):active::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-banner__secondary-action.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +[dir=rtl] .mdc-banner__secondary-action, .mdc-banner__secondary-action[dir=rtl] { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 0; +} + +.mdc-touch-target-wrapper { + display: inline; +} + +.mdc-elevation-overlay { + position: absolute; + border-radius: inherit; + pointer-events: none; + opacity: 0; + /* @alternate */ + opacity: var(--mdc-elevation-overlay-opacity, 0); + transition: opacity 280ms cubic-bezier(0.4, 0, 0.2, 1); + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-elevation-overlay-color, #fff); +} + +.mdc-button { + /* @alternate */ + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + min-width: 64px; + border: none; + outline: none; + /* @alternate */ + line-height: inherit; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-appearance: none; + overflow: visible; + vertical-align: middle; + background: transparent; +} +.mdc-button .mdc-elevation-overlay { + width: 100%; + height: 100%; + top: 0; + /* @noflip */ + left: 0; +} +.mdc-button::-moz-focus-inner { + padding: 0; + border: 0; +} +.mdc-button:active { + outline: none; +} +.mdc-button:hover { + cursor: pointer; +} +.mdc-button:disabled { + cursor: default; + pointer-events: none; +} +.mdc-button .mdc-button__icon { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 8px; + display: inline-block; + position: relative; + vertical-align: top; +} +[dir=rtl] .mdc-button .mdc-button__icon, .mdc-button .mdc-button__icon[dir=rtl] { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 0; +} + +.mdc-button .mdc-button__touch { + position: absolute; + top: 50%; + height: 48px; + left: 0; + right: 0; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} + +.mdc-button__label + .mdc-button__icon { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 0; +} +[dir=rtl] .mdc-button__label + .mdc-button__icon, .mdc-button__label + .mdc-button__icon[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 8px; +} + +svg.mdc-button__icon { + fill: currentColor; +} + +.mdc-button--raised .mdc-button__icon, +.mdc-button--unelevated .mdc-button__icon, +.mdc-button--outlined .mdc-button__icon { + /* @noflip */ + margin-left: -4px; + /* @noflip */ + margin-right: 8px; +} +[dir=rtl] .mdc-button--raised .mdc-button__icon, [dir=rtl] .mdc-button--unelevated .mdc-button__icon, [dir=rtl] .mdc-button--outlined .mdc-button__icon, .mdc-button--raised .mdc-button__icon[dir=rtl], .mdc-button--unelevated .mdc-button__icon[dir=rtl], .mdc-button--outlined .mdc-button__icon[dir=rtl] { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: -4px; +} + +.mdc-button--raised .mdc-button__label + .mdc-button__icon, +.mdc-button--unelevated .mdc-button__label + .mdc-button__icon, +.mdc-button--outlined .mdc-button__label + .mdc-button__icon { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: -4px; +} +[dir=rtl] .mdc-button--raised .mdc-button__label + .mdc-button__icon, [dir=rtl] .mdc-button--unelevated .mdc-button__label + .mdc-button__icon, [dir=rtl] .mdc-button--outlined .mdc-button__label + .mdc-button__icon, .mdc-button--raised .mdc-button__label + .mdc-button__icon[dir=rtl], .mdc-button--unelevated .mdc-button__label + .mdc-button__icon[dir=rtl], .mdc-button--outlined .mdc-button__label + .mdc-button__icon[dir=rtl] { + /* @noflip */ + margin-left: -4px; + /* @noflip */ + margin-right: 8px; +} + +.mdc-button--touch { + margin-top: 6px; + margin-bottom: 6px; +} + +.mdc-button { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + text-decoration: none; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-button-text-decoration, none); + text-decoration: var(--mdc-typography-button-text-decoration, none); +} + +@-webkit-keyframes mdc-ripple-fg-radius-in { + from { + -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1); + transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1); + } + to { + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + } +} + +@keyframes mdc-ripple-fg-radius-in { + from { + -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1); + transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1); + } + to { + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + } +} +@-webkit-keyframes mdc-ripple-fg-opacity-in { + from { + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + opacity: 0; + } + to { + opacity: var(--mdc-ripple-fg-opacity, 0); + } +} +@keyframes mdc-ripple-fg-opacity-in { + from { + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + opacity: 0; + } + to { + opacity: var(--mdc-ripple-fg-opacity, 0); + } +} +@-webkit-keyframes mdc-ripple-fg-opacity-out { + from { + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + opacity: var(--mdc-ripple-fg-opacity, 0); + } + to { + opacity: 0; + } +} +@keyframes mdc-ripple-fg-opacity-out { + from { + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + opacity: var(--mdc-ripple-fg-opacity, 0); + } + to { + opacity: 0; + } +} +.mdc-button { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-button .mdc-button__ripple::before, +.mdc-button .mdc-button__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-button .mdc-button__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-button .mdc-button__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-button.mdc-ripple-upgraded .mdc-button__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-button.mdc-ripple-upgraded .mdc-button__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-button.mdc-ripple-upgraded--unbounded .mdc-button__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-button.mdc-ripple-upgraded--foreground-activation .mdc-button__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-button.mdc-ripple-upgraded--foreground-deactivation .mdc-button__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-button .mdc-button__ripple::before, +.mdc-button .mdc-button__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-button.mdc-ripple-upgraded .mdc-button__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-button .mdc-button__ripple { + position: absolute; + box-sizing: content-box; + width: 100%; + height: 100%; + overflow: hidden; +} +.mdc-button:not(.mdc-button--outlined) .mdc-button__ripple { + top: 0; + left: 0; +} + +.mdc-button--raised { + transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.mdc-button--outlined { + border-style: solid; +} + +.mdc-button { + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-button-font-size, 0.875rem); + letter-spacing: 0.0892857143em; + /* @alternate */ + letter-spacing: var(--mdc-typography-button-letter-spacing, 0.0892857143em); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-button-font-weight, 500); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-button-text-transform, uppercase); + height: 36px; + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); + padding: 0 8px 0 8px; +} +.mdc-button:not(:disabled) { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} +.mdc-button:disabled { + color: rgba(0, 0, 0, 0.38); +} +.mdc-button .mdc-button__icon { + font-size: 1.125rem; + height: 1.125rem; + width: 1.125rem; +} +.mdc-button .mdc-button__ripple::before, +.mdc-button .mdc-button__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-button:hover .mdc-button__ripple::before, .mdc-button.mdc-ripple-surface--hover .mdc-button__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-button.mdc-ripple-upgraded--background-focused .mdc-button__ripple::before, .mdc-button:not(.mdc-ripple-upgraded):focus .mdc-button__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-button:not(.mdc-ripple-upgraded) .mdc-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-button:not(.mdc-ripple-upgraded):active .mdc-button__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-button.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-button .mdc-button__ripple { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); +} + +.mdc-button--unelevated { + padding: 0 16px 0 16px; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-button-font-size, 0.875rem); + letter-spacing: 0.0892857143em; + /* @alternate */ + letter-spacing: var(--mdc-typography-button-letter-spacing, 0.0892857143em); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-button-font-weight, 500); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-button-text-transform, uppercase); + height: 36px; + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); +} +.mdc-button--unelevated.mdc-button--icon-trailing { + padding: 0 12px 0 16px; +} +.mdc-button--unelevated.mdc-button--icon-leading { + padding: 0 16px 0 12px; +} +.mdc-button--unelevated:not(:disabled) { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-button--unelevated:disabled { + background-color: rgba(0, 0, 0, 0.12); +} +.mdc-button--unelevated:not(:disabled) { + color: #fff; + /* @alternate */ + color: var(--mdc-theme-on-primary, #fff); +} +.mdc-button--unelevated:disabled { + color: rgba(0, 0, 0, 0.38); +} +.mdc-button--unelevated .mdc-button__icon { + font-size: 1.125rem; + height: 1.125rem; + width: 1.125rem; +} +.mdc-button--unelevated .mdc-button__ripple::before, +.mdc-button--unelevated .mdc-button__ripple::after { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-on-primary, #fff)); +} +.mdc-button--unelevated:hover .mdc-button__ripple::before, .mdc-button--unelevated.mdc-ripple-surface--hover .mdc-button__ripple::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.08); +} +.mdc-button--unelevated.mdc-ripple-upgraded--background-focused .mdc-button__ripple::before, .mdc-button--unelevated:not(.mdc-ripple-upgraded):focus .mdc-button__ripple::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +.mdc-button--unelevated:not(.mdc-ripple-upgraded) .mdc-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-button--unelevated:not(.mdc-ripple-upgraded):active .mdc-button__ripple::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-button--unelevated.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-button--unelevated .mdc-button__ripple { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); +} + +.mdc-button--raised { + padding: 0 16px 0 16px; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-button-font-size, 0.875rem); + letter-spacing: 0.0892857143em; + /* @alternate */ + letter-spacing: var(--mdc-typography-button-letter-spacing, 0.0892857143em); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-button-font-weight, 500); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-button-text-transform, uppercase); + height: 36px; + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); + /* @alternate */ + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} +.mdc-button--raised.mdc-button--icon-trailing { + padding: 0 12px 0 16px; +} +.mdc-button--raised.mdc-button--icon-leading { + padding: 0 16px 0 12px; +} +.mdc-button--raised:not(:disabled) { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-button--raised:disabled { + background-color: rgba(0, 0, 0, 0.12); +} +.mdc-button--raised:not(:disabled) { + color: #fff; + /* @alternate */ + color: var(--mdc-theme-on-primary, #fff); +} +.mdc-button--raised:disabled { + color: rgba(0, 0, 0, 0.38); +} +.mdc-button--raised .mdc-button__icon { + font-size: 1.125rem; + height: 1.125rem; + width: 1.125rem; +} +.mdc-button--raised .mdc-button__ripple::before, +.mdc-button--raised .mdc-button__ripple::after { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-on-primary, #fff)); +} +.mdc-button--raised:hover .mdc-button__ripple::before, .mdc-button--raised.mdc-ripple-surface--hover .mdc-button__ripple::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.08); +} +.mdc-button--raised.mdc-ripple-upgraded--background-focused .mdc-button__ripple::before, .mdc-button--raised:not(.mdc-ripple-upgraded):focus .mdc-button__ripple::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +.mdc-button--raised:not(.mdc-ripple-upgraded) .mdc-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-button--raised:not(.mdc-ripple-upgraded):active .mdc-button__ripple::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-button--raised.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-button--raised .mdc-button__ripple { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); +} +.mdc-button--raised.mdc-ripple-upgraded--background-focused, .mdc-button--raised:not(.mdc-ripple-upgraded):focus { + /* @alternate */ + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); +} +.mdc-button--raised:hover { + /* @alternate */ + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); +} +.mdc-button--raised:not(:disabled):active { + /* @alternate */ + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.mdc-button--raised:disabled { + /* @alternate */ + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); +} +.mdc-button--outlined { + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-button-font-size, 0.875rem); + letter-spacing: 0.0892857143em; + /* @alternate */ + letter-spacing: var(--mdc-typography-button-letter-spacing, 0.0892857143em); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-button-font-weight, 500); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-button-text-transform, uppercase); + height: 36px; + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); + padding: 0 15px 0 15px; + border-width: 1px; +} +.mdc-button--outlined:not(:disabled) { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} +.mdc-button--outlined:disabled { + color: rgba(0, 0, 0, 0.38); +} +.mdc-button--outlined .mdc-button__icon { + font-size: 1.125rem; + height: 1.125rem; + width: 1.125rem; +} +.mdc-button--outlined .mdc-button__ripple::before, +.mdc-button--outlined .mdc-button__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-button--outlined:hover .mdc-button__ripple::before, .mdc-button--outlined.mdc-ripple-surface--hover .mdc-button__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-button--outlined.mdc-ripple-upgraded--background-focused .mdc-button__ripple::before, .mdc-button--outlined:not(.mdc-ripple-upgraded):focus .mdc-button__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-button--outlined:not(.mdc-ripple-upgraded) .mdc-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-button--outlined:not(.mdc-ripple-upgraded):active .mdc-button__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-button--outlined.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-button--outlined .mdc-button__ripple { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); +} +.mdc-button--outlined:not(:disabled) { + border-color: rgba(0, 0, 0, 0.12); +} +.mdc-button--outlined:disabled { + border-color: rgba(0, 0, 0, 0.12); +} +.mdc-button--outlined.mdc-button--icon-trailing { + padding: 0 11px 0 15px; +} +.mdc-button--outlined.mdc-button--icon-leading { + padding: 0 15px 0 11px; +} +.mdc-button--outlined .mdc-button__ripple { + top: -1px; + left: -1px; + border: 1px solid transparent; +} +.mdc-button--outlined .mdc-button__touch { + left: -1px; + width: calc(100% + 2 * 1px); +} + +.mdc-card { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-medium, 4px); + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); + /* @alternate */ + position: relative; + /* @alternate */ + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); + display: flex; + flex-direction: column; + box-sizing: border-box; +} +.mdc-card .mdc-elevation-overlay { + width: 100%; + height: 100%; + top: 0; + /* @noflip */ + left: 0; +} +.mdc-card::after { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-medium, 4px); + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 1px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; + pointer-events: none; +} + +.mdc-card--outlined { + /* @alternate */ + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); + border-width: 1px; + border-style: solid; + border-color: #e0e0e0; +} +.mdc-card--outlined::after { + border: none; +} + +.mdc-card__content { + border-radius: inherit; + height: 100%; +} + +.mdc-card__media { + position: relative; + box-sizing: border-box; + background-repeat: no-repeat; + background-position: center; + background-size: cover; +} +.mdc-card__media::before { + display: block; + content: ""; +} + +.mdc-card__media:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} + +.mdc-card__media:last-child { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; +} + +.mdc-card__media--square::before { + margin-top: 100%; +} + +.mdc-card__media--16-9::before { + margin-top: 56.25%; +} + +.mdc-card__media-content { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + box-sizing: border-box; +} + +.mdc-card__primary-action { + display: flex; + flex-direction: column; + box-sizing: border-box; + position: relative; + outline: none; + color: inherit; + text-decoration: none; + cursor: pointer; + overflow: hidden; +} + +.mdc-card__primary-action:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} + +.mdc-card__primary-action:last-child { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; +} + +.mdc-card__actions { + display: flex; + flex-direction: row; + align-items: center; + box-sizing: border-box; + min-height: 52px; + padding: 8px; +} + +.mdc-card__actions--full-bleed { + padding: 0; +} + +.mdc-card__action-buttons, +.mdc-card__action-icons { + display: flex; + flex-direction: row; + align-items: center; + box-sizing: border-box; +} + +.mdc-card__action-icons { + color: rgba(0, 0, 0, 0.6); + flex-grow: 1; + justify-content: flex-end; +} + +.mdc-card__action-buttons + .mdc-card__action-icons { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; +} +[dir=rtl] .mdc-card__action-buttons + .mdc-card__action-icons, .mdc-card__action-buttons + .mdc-card__action-icons[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-card__action { + display: inline-flex; + flex-direction: row; + align-items: center; + box-sizing: border-box; + justify-content: center; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mdc-card__action:focus { + outline: none; +} + +.mdc-card__action--button { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 8px; + padding: 0 8px; +} +[dir=rtl] .mdc-card__action--button, .mdc-card__action--button[dir=rtl] { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 0; +} + +.mdc-card__action--button:last-child { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0; +} +[dir=rtl] .mdc-card__action--button:last-child, .mdc-card__action--button:last-child[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0; +} + +.mdc-card__actions--full-bleed .mdc-card__action--button { + justify-content: space-between; + width: 100%; + height: auto; + max-height: none; + margin: 0; + padding: 8px 16px; + /* @noflip */ + text-align: left; +} +[dir=rtl] .mdc-card__actions--full-bleed .mdc-card__action--button, .mdc-card__actions--full-bleed .mdc-card__action--button[dir=rtl] { + /* @noflip */ + text-align: right; +} + +.mdc-card__action--icon { + margin: -6px 0; + padding: 12px; +} + +.mdc-card__action--icon:not(:disabled) { + color: rgba(0, 0, 0, 0.6); +} + +.mdc-card__primary-action { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-card__primary-action .mdc-card__ripple::before, +.mdc-card__primary-action .mdc-card__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-card__primary-action .mdc-card__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-card__primary-action .mdc-card__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-card__primary-action.mdc-ripple-upgraded .mdc-card__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-card__primary-action.mdc-ripple-upgraded .mdc-card__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-card__primary-action.mdc-ripple-upgraded--unbounded .mdc-card__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-card__primary-action.mdc-ripple-upgraded--foreground-activation .mdc-card__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-card__primary-action.mdc-ripple-upgraded--foreground-deactivation .mdc-card__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-card__primary-action .mdc-card__ripple::before, +.mdc-card__primary-action .mdc-card__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-card__primary-action.mdc-ripple-upgraded .mdc-card__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-card__primary-action .mdc-card__ripple::before, .mdc-card__primary-action .mdc-card__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +.mdc-card__primary-action:hover .mdc-card__ripple::before, .mdc-card__primary-action.mdc-ripple-surface--hover .mdc-card__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-card__primary-action.mdc-ripple-upgraded--background-focused .mdc-card__ripple::before, .mdc-card__primary-action:not(.mdc-ripple-upgraded):focus .mdc-card__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-card__primary-action:not(.mdc-ripple-upgraded) .mdc-card__ripple::after { + transition: opacity 150ms linear; +} +.mdc-card__primary-action:not(.mdc-ripple-upgraded):active .mdc-card__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-card__primary-action.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-card__primary-action .mdc-card__ripple { + box-sizing: content-box; + height: 100%; + overflow: hidden; + left: 0; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; +} +.mdc-card__primary-action.mdc-ripple-upgraded--background-focused::after, .mdc-card__primary-action:not(.mdc-ripple-upgraded):focus::after { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 5px double transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} + +.mdc-checkbox { + padding: calc((40px - 18px) / 2); + /* @alternate */ + padding: calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2); + margin: calc((40px - 40px) / 2); + /* @alternate */ + margin: calc((var(--mdc-checkbox-touch-target-size, 40px) - 40px) / 2); +} +.mdc-checkbox .mdc-checkbox__ripple::before, .mdc-checkbox .mdc-checkbox__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +.mdc-checkbox:hover .mdc-checkbox__ripple::before, .mdc-checkbox.mdc-ripple-surface--hover .mdc-checkbox__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-checkbox.mdc-ripple-upgraded--background-focused .mdc-checkbox__ripple::before, .mdc-checkbox:not(.mdc-ripple-upgraded):focus .mdc-checkbox__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-checkbox:not(.mdc-ripple-upgraded) .mdc-checkbox__ripple::after { + transition: opacity 150ms linear; +} +.mdc-checkbox:not(.mdc-ripple-upgraded):active .mdc-checkbox__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-checkbox.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::before, .mdc-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::after { + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-secondary, #018786)); +} +.mdc-checkbox.mdc-checkbox--selected:hover .mdc-checkbox__ripple::before, .mdc-checkbox.mdc-checkbox--selected.mdc-ripple-surface--hover .mdc-checkbox__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded--background-focused .mdc-checkbox__ripple::before, .mdc-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):focus .mdc-checkbox__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded) .mdc-checkbox__ripple::after { + transition: opacity 150ms linear; +} +.mdc-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):active .mdc-checkbox__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::before, +.mdc-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::after { + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-secondary, #018786)); +} +.mdc-checkbox .mdc-checkbox__background { + top: calc((40px - 18px) / 2); + /* @alternate */ + top: calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2); + left: calc((40px - 18px) / 2); + /* @alternate */ + left: calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2); +} +.mdc-checkbox .mdc-checkbox__native-control { + top: calc((40px - 40px) / 2); + /* @alternate */ + top: calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2); + right: calc((40px - 40px) / 2); + /* @alternate */ + right: calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2); + left: calc((40px - 40px) / 2); + /* @alternate */ + left: calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2); + width: 40px; + /* @alternate */ + width: var(--mdc-checkbox-touch-target-size, 40px); + height: 40px; + /* @alternate */ + height: var(--mdc-checkbox-touch-target-size, 40px); +} +.mdc-checkbox .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate=true]) ~ .mdc-checkbox__background { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; +} +.mdc-checkbox .mdc-checkbox__native-control:enabled:checked ~ .mdc-checkbox__background, +.mdc-checkbox .mdc-checkbox__native-control:enabled:indeterminate ~ .mdc-checkbox__background, +.mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true]:enabled ~ .mdc-checkbox__background { + border-color: #018786; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); +} +@-webkit-keyframes mdc-checkbox-fade-in-background-8A000000FF01878600000000FF018786 { + 0% { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; + } + 50% { + border-color: #018786; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); + } +} +@keyframes mdc-checkbox-fade-in-background-8A000000FF01878600000000FF018786 { + 0% { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; + } + 50% { + border-color: #018786; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); + } +} +@-webkit-keyframes mdc-checkbox-fade-out-background-8A000000FF01878600000000FF018786 { + 0%, 80% { + border-color: #018786; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); + } + 100% { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; + } +} +@keyframes mdc-checkbox-fade-out-background-8A000000FF01878600000000FF018786 { + 0%, 80% { + border-color: #018786; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786)); + } + 100% { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; + } +} +.mdc-checkbox.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background, .mdc-checkbox.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background { + -webkit-animation-name: mdc-checkbox-fade-in-background-8A000000FF01878600000000FF018786; + animation-name: mdc-checkbox-fade-in-background-8A000000FF01878600000000FF018786; +} +.mdc-checkbox.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background, .mdc-checkbox.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background { + -webkit-animation-name: mdc-checkbox-fade-out-background-8A000000FF01878600000000FF018786; + animation-name: mdc-checkbox-fade-out-background-8A000000FF01878600000000FF018786; +} +.mdc-checkbox .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true]) ~ .mdc-checkbox__background { + border-color: rgba(0, 0, 0, 0.38); + /* @alternate */ + border-color: var(--mdc-checkbox-disabled-color, rgba(0, 0, 0, 0.38)); + background-color: transparent; +} +.mdc-checkbox .mdc-checkbox__native-control[disabled]:checked ~ .mdc-checkbox__background, +.mdc-checkbox .mdc-checkbox__native-control[disabled]:indeterminate ~ .mdc-checkbox__background, +.mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true][disabled] ~ .mdc-checkbox__background { + border-color: transparent; + background-color: rgba(0, 0, 0, 0.38); + /* @alternate */ + background-color: var(--mdc-checkbox-disabled-color, rgba(0, 0, 0, 0.38)); +} +.mdc-checkbox .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background .mdc-checkbox__checkmark { + color: #fff; + /* @alternate */ + color: var(--mdc-checkbox-ink-color, #fff); +} +.mdc-checkbox .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background .mdc-checkbox__mixedmark { + border-color: #fff; + /* @alternate */ + border-color: var(--mdc-checkbox-ink-color, #fff); +} +.mdc-checkbox .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background .mdc-checkbox__checkmark { + color: #fff; + /* @alternate */ + color: var(--mdc-checkbox-ink-color, #fff); +} +.mdc-checkbox .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background .mdc-checkbox__mixedmark { + border-color: #fff; + /* @alternate */ + border-color: var(--mdc-checkbox-ink-color, #fff); +} + +@-webkit-keyframes mdc-checkbox-unchecked-checked-checkmark-path { + 0%, 50% { + stroke-dashoffset: 29.7833385; + } + 50% { + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } + 100% { + stroke-dashoffset: 0; + } +} + +@keyframes mdc-checkbox-unchecked-checked-checkmark-path { + 0%, 50% { + stroke-dashoffset: 29.7833385; + } + 50% { + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } + 100% { + stroke-dashoffset: 0; + } +} +@-webkit-keyframes mdc-checkbox-unchecked-indeterminate-mixedmark { + 0%, 68.2% { + -webkit-transform: scaleX(0); + transform: scaleX(0); + } + 68.2% { + -webkit-animation-timing-function: cubic-bezier(0, 0, 0, 1); + animation-timing-function: cubic-bezier(0, 0, 0, 1); + } + 100% { + -webkit-transform: scaleX(1); + transform: scaleX(1); + } +} +@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark { + 0%, 68.2% { + -webkit-transform: scaleX(0); + transform: scaleX(0); + } + 68.2% { + -webkit-animation-timing-function: cubic-bezier(0, 0, 0, 1); + animation-timing-function: cubic-bezier(0, 0, 0, 1); + } + 100% { + -webkit-transform: scaleX(1); + transform: scaleX(1); + } +} +@-webkit-keyframes mdc-checkbox-checked-unchecked-checkmark-path { + from { + -webkit-animation-timing-function: cubic-bezier(0.4, 0, 1, 1); + animation-timing-function: cubic-bezier(0.4, 0, 1, 1); + opacity: 1; + stroke-dashoffset: 0; + } + to { + opacity: 0; + stroke-dashoffset: -29.7833385; + } +} +@keyframes mdc-checkbox-checked-unchecked-checkmark-path { + from { + -webkit-animation-timing-function: cubic-bezier(0.4, 0, 1, 1); + animation-timing-function: cubic-bezier(0.4, 0, 1, 1); + opacity: 1; + stroke-dashoffset: 0; + } + to { + opacity: 0; + stroke-dashoffset: -29.7833385; + } +} +@-webkit-keyframes mdc-checkbox-checked-indeterminate-checkmark { + from { + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + opacity: 1; + } + to { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + opacity: 0; + } +} +@keyframes mdc-checkbox-checked-indeterminate-checkmark { + from { + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + opacity: 1; + } + to { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + opacity: 0; + } +} +@-webkit-keyframes mdc-checkbox-indeterminate-checked-checkmark { + from { + -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1); + animation-timing-function: cubic-bezier(0.14, 0, 0, 1); + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + opacity: 0; + } + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + opacity: 1; + } +} +@keyframes mdc-checkbox-indeterminate-checked-checkmark { + from { + -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1); + animation-timing-function: cubic-bezier(0.14, 0, 0, 1); + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + opacity: 0; + } + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + opacity: 1; + } +} +@-webkit-keyframes mdc-checkbox-checked-indeterminate-mixedmark { + from { + -webkit-animation-timing-function: mdc-animation-deceleration-curve-timing-function; + animation-timing-function: mdc-animation-deceleration-curve-timing-function; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + opacity: 0; + } + to { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + opacity: 1; + } +} +@keyframes mdc-checkbox-checked-indeterminate-mixedmark { + from { + -webkit-animation-timing-function: mdc-animation-deceleration-curve-timing-function; + animation-timing-function: mdc-animation-deceleration-curve-timing-function; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + opacity: 0; + } + to { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + opacity: 1; + } +} +@-webkit-keyframes mdc-checkbox-indeterminate-checked-mixedmark { + from { + -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1); + animation-timing-function: cubic-bezier(0.14, 0, 0, 1); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + opacity: 1; + } + to { + -webkit-transform: rotate(315deg); + transform: rotate(315deg); + opacity: 0; + } +} +@keyframes mdc-checkbox-indeterminate-checked-mixedmark { + from { + -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1); + animation-timing-function: cubic-bezier(0.14, 0, 0, 1); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + opacity: 1; + } + to { + -webkit-transform: rotate(315deg); + transform: rotate(315deg); + opacity: 0; + } +} +@-webkit-keyframes mdc-checkbox-indeterminate-unchecked-mixedmark { + 0% { + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-transform: scaleX(1); + transform: scaleX(1); + opacity: 1; + } + 32.8%, 100% { + -webkit-transform: scaleX(0); + transform: scaleX(0); + opacity: 0; + } +} +@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark { + 0% { + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-transform: scaleX(1); + transform: scaleX(1); + opacity: 1; + } + 32.8%, 100% { + -webkit-transform: scaleX(0); + transform: scaleX(0); + opacity: 0; + } +} +.mdc-checkbox { + display: inline-block; + position: relative; + flex: 0 0 18px; + box-sizing: content-box; + width: 18px; + height: 18px; + line-height: 0; + white-space: nowrap; + cursor: pointer; + vertical-align: bottom; +} + +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true]) ~ .mdc-checkbox__background { + border-color: GrayText; + /* @alternate */ + border-color: var(--mdc-checkbox-disabled-color, GrayText); + background-color: transparent; + } + + .mdc-checkbox__native-control[disabled]:checked ~ .mdc-checkbox__background, +.mdc-checkbox__native-control[disabled]:indeterminate ~ .mdc-checkbox__background, +.mdc-checkbox__native-control[data-indeterminate=true][disabled] ~ .mdc-checkbox__background { + border-color: GrayText; + background-color: transparent; + /* @alternate */ + background-color: var(--mdc-checkbox-disabled-color, transparent); + } + + .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background .mdc-checkbox__checkmark { + color: GrayText; + /* @alternate */ + color: var(--mdc-checkbox-ink-color, GrayText); + } + .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background .mdc-checkbox__mixedmark { + border-color: GrayText; + /* @alternate */ + border-color: var(--mdc-checkbox-ink-color, GrayText); + } + + .mdc-checkbox__mixedmark { + margin: 0 1px; + } +} +.mdc-checkbox--disabled { + cursor: default; + pointer-events: none; +} + +.mdc-checkbox__background { + display: inline-flex; + position: absolute; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 18px; + height: 18px; + border: 2px solid currentColor; + border-radius: 2px; + background-color: transparent; + pointer-events: none; + will-change: background-color, border-color; + transition: background-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), border-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} + +.mdc-checkbox__checkmark { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + opacity: 0; + transition: opacity 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} +.mdc-checkbox--upgraded .mdc-checkbox__checkmark { + opacity: 1; +} + +.mdc-checkbox__checkmark-path { + transition: stroke-dashoffset 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + stroke: currentColor; + stroke-width: 3.12px; + stroke-dashoffset: 29.7833385; + stroke-dasharray: 29.7833385; +} + +.mdc-checkbox__mixedmark { + width: 100%; + height: 0; + -webkit-transform: scaleX(0) rotate(0deg); + transform: scaleX(0) rotate(0deg); + border-width: 1px; + border-style: solid; + opacity: 0; + transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} + +.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background, .mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background, .mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background, .mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background { + -webkit-animation-duration: 180ms; + animation-duration: 180ms; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; +} +.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path { + -webkit-animation: mdc-checkbox-unchecked-checked-checkmark-path 180ms linear 0s; + animation: mdc-checkbox-unchecked-checked-checkmark-path 180ms linear 0s; + transition: none; +} +.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark { + -webkit-animation: mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear 0s; + animation: mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear 0s; + transition: none; +} +.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path { + -webkit-animation: mdc-checkbox-checked-unchecked-checkmark-path 90ms linear 0s; + animation: mdc-checkbox-checked-unchecked-checkmark-path 90ms linear 0s; + transition: none; +} +.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark { + -webkit-animation: mdc-checkbox-checked-indeterminate-checkmark 90ms linear 0s; + animation: mdc-checkbox-checked-indeterminate-checkmark 90ms linear 0s; + transition: none; +} +.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark { + -webkit-animation: mdc-checkbox-checked-indeterminate-mixedmark 90ms linear 0s; + animation: mdc-checkbox-checked-indeterminate-mixedmark 90ms linear 0s; + transition: none; +} +.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark { + -webkit-animation: mdc-checkbox-indeterminate-checked-checkmark 500ms linear 0s; + animation: mdc-checkbox-indeterminate-checked-checkmark 500ms linear 0s; + transition: none; +} +.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark { + -webkit-animation: mdc-checkbox-indeterminate-checked-mixedmark 500ms linear 0s; + animation: mdc-checkbox-indeterminate-checked-mixedmark 500ms linear 0s; + transition: none; +} +.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark { + -webkit-animation: mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear 0s; + animation: mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear 0s; + transition: none; +} + +.mdc-checkbox__native-control:checked ~ .mdc-checkbox__background, +.mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background, +.mdc-checkbox__native-control[data-indeterminate=true] ~ .mdc-checkbox__background { + transition: border-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1), background-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1); +} +.mdc-checkbox__native-control:checked ~ .mdc-checkbox__background .mdc-checkbox__checkmark-path, +.mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background .mdc-checkbox__checkmark-path, +.mdc-checkbox__native-control[data-indeterminate=true] ~ .mdc-checkbox__background .mdc-checkbox__checkmark-path { + stroke-dashoffset: 0; +} + +.mdc-checkbox__native-control { + position: absolute; + margin: 0; + padding: 0; + opacity: 0; + cursor: inherit; +} +.mdc-checkbox__native-control:disabled { + cursor: default; + pointer-events: none; +} + +.mdc-checkbox--touch { + margin: calc((48px - 40px) / 2); + /* @alternate */ + margin: calc((var(--mdc-checkbox-state-layer-size, 48px) - var(--mdc-checkbox-state-layer-size, 40px)) / 2); +} +.mdc-checkbox--touch .mdc-checkbox__native-control { + top: calc((40px - 48px) / 2); + /* @alternate */ + top: calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 48px)) / 2); + right: calc((40px - 48px) / 2); + /* @alternate */ + right: calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 48px)) / 2); + left: calc((40px - 48px) / 2); + /* @alternate */ + left: calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 48px)) / 2); + width: 48px; + /* @alternate */ + width: var(--mdc-checkbox-state-layer-size, 48px); + height: 48px; + /* @alternate */ + height: var(--mdc-checkbox-state-layer-size, 48px); +} + +.mdc-checkbox__native-control:checked ~ .mdc-checkbox__background .mdc-checkbox__checkmark { + transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1); + opacity: 1; +} +.mdc-checkbox__native-control:checked ~ .mdc-checkbox__background .mdc-checkbox__mixedmark { + -webkit-transform: scaleX(1) rotate(-45deg); + transform: scaleX(1) rotate(-45deg); +} + +.mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background .mdc-checkbox__checkmark, +.mdc-checkbox__native-control[data-indeterminate=true] ~ .mdc-checkbox__background .mdc-checkbox__checkmark { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + opacity: 0; + transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} +.mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background .mdc-checkbox__mixedmark, +.mdc-checkbox__native-control[data-indeterminate=true] ~ .mdc-checkbox__background .mdc-checkbox__mixedmark { + -webkit-transform: scaleX(1) rotate(0deg); + transform: scaleX(1) rotate(0deg); + opacity: 1; +} + +.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__background, +.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__checkmark, +.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__checkmark-path, +.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__mixedmark { + transition: none; +} + +.mdc-checkbox { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-checkbox .mdc-checkbox__ripple::before, +.mdc-checkbox .mdc-checkbox__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-checkbox .mdc-checkbox__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-checkbox .mdc-checkbox__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-checkbox.mdc-ripple-upgraded--unbounded .mdc-checkbox__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-checkbox.mdc-ripple-upgraded--foreground-activation .mdc-checkbox__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-checkbox.mdc-ripple-upgraded--foreground-deactivation .mdc-checkbox__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-checkbox .mdc-checkbox__ripple::before, +.mdc-checkbox .mdc-checkbox__ripple::after { + top: calc(50% - 50%); + /* @noflip */ + left: calc(50% - 50%); + width: 100%; + height: 100%; +} +.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::before, +.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::after { + top: var(--mdc-ripple-top, calc(50% - 50%)); + /* @noflip */ + left: var(--mdc-ripple-left, calc(50% - 50%)); + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-checkbox { + z-index: 0; +} +.mdc-checkbox .mdc-checkbox__ripple::before, +.mdc-checkbox .mdc-checkbox__ripple::after { + z-index: -1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, -1); +} + +.mdc-checkbox__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.mdc-deprecated-chip-trailing-action__touch { + position: absolute; + top: 50%; + height: 48px; + /* @noflip */ + left: 50%; + width: 48px; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.mdc-deprecated-chip-trailing-action { + border: none; + display: inline-flex; + position: relative; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 0; + outline: none; + cursor: pointer; + -webkit-appearance: none; + background: none; +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__icon { + height: 18px; + width: 18px; + font-size: 18px; +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__touch { + width: 26px; +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__icon { + fill: currentColor; + color: inherit; +} + +.mdc-deprecated-chip-trailing-action { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::before, +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded--unbounded .mdc-deprecated-chip-trailing-action__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded--foreground-activation .mdc-deprecated-chip-trailing-action__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded--foreground-deactivation .mdc-deprecated-chip-trailing-action__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::before, +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::after { + top: calc(50% - 50%); + /* @noflip */ + left: calc(50% - 50%); + width: 100%; + height: 100%; +} +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::before, +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::after { + top: var(--mdc-ripple-top, calc(50% - 50%)); + /* @noflip */ + left: var(--mdc-ripple-left, calc(50% - 50%)); + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::before, .mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-on-surface, #000)); +} +.mdc-deprecated-chip-trailing-action:hover .mdc-deprecated-chip-trailing-action__ripple::before, .mdc-deprecated-chip-trailing-action.mdc-ripple-surface--hover .mdc-deprecated-chip-trailing-action__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded--background-focused .mdc-deprecated-chip-trailing-action__ripple::before, .mdc-deprecated-chip-trailing-action:not(.mdc-ripple-upgraded):focus .mdc-deprecated-chip-trailing-action__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-deprecated-chip-trailing-action:not(.mdc-ripple-upgraded) .mdc-deprecated-chip-trailing-action__ripple::after { + transition: opacity 150ms linear; +} +.mdc-deprecated-chip-trailing-action:not(.mdc-ripple-upgraded):active .mdc-deprecated-chip-trailing-action__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple { + position: absolute; + box-sizing: content-box; + width: 100%; + height: 100%; + overflow: hidden; +} + +.mdc-chip__icon--leading { + color: rgba(0, 0, 0, 0.54); +} + +.mdc-deprecated-chip-trailing-action { + color: #000; +} + +.mdc-chip__icon--trailing { + color: rgba(0, 0, 0, 0.54); +} +.mdc-chip__icon--trailing:hover { + color: rgba(0, 0, 0, 0.62); +} +.mdc-chip__icon--trailing:focus { + color: rgba(0, 0, 0, 0.87); +} + +.mdc-chip__icon.mdc-chip__icon--leading:not(.mdc-chip__icon--leading-hidden) { + width: 20px; + height: 20px; + font-size: 20px; +} + +.mdc-deprecated-chip-trailing-action__icon { + height: 18px; + width: 18px; + font-size: 18px; +} + +.mdc-chip__icon.mdc-chip__icon--trailing { + width: 18px; + height: 18px; + font-size: 18px; +} + +.mdc-deprecated-chip-trailing-action { + /* @noflip */ + margin-left: 4px; + /* @noflip */ + margin-right: -4px; +} +[dir=rtl] .mdc-deprecated-chip-trailing-action, .mdc-deprecated-chip-trailing-action[dir=rtl] { + /* @noflip */ + margin-left: -4px; + /* @noflip */ + margin-right: 4px; +} + +.mdc-chip__icon--trailing { + /* @noflip */ + margin-left: 4px; + /* @noflip */ + margin-right: -4px; +} +[dir=rtl] .mdc-chip__icon--trailing, .mdc-chip__icon--trailing[dir=rtl] { + /* @noflip */ + margin-left: -4px; + /* @noflip */ + margin-right: 4px; +} + +.mdc-chip { + border-radius: 16px; + background-color: #e0e0e0; + color: rgba(0, 0, 0, 0.87); + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + height: 32px; + /* @alternate */ + position: relative; + display: inline-flex; + align-items: center; + box-sizing: border-box; + padding: 0 12px; + border-width: 0; + outline: none; + cursor: pointer; + -webkit-appearance: none; +} +.mdc-chip .mdc-chip__ripple { + border-radius: 16px; +} +.mdc-chip:hover { + color: rgba(0, 0, 0, 0.87); +} +.mdc-chip.mdc-chip--selected .mdc-chip__checkmark, +.mdc-chip .mdc-chip__icon--leading:not(.mdc-chip__icon--leading-hidden) { + /* @noflip */ + margin-left: -4px; + /* @noflip */ + margin-right: 4px; +} +[dir=rtl] .mdc-chip.mdc-chip--selected .mdc-chip__checkmark, [dir=rtl] .mdc-chip .mdc-chip__icon--leading:not(.mdc-chip__icon--leading-hidden), .mdc-chip.mdc-chip--selected .mdc-chip__checkmark[dir=rtl], .mdc-chip .mdc-chip__icon--leading:not(.mdc-chip__icon--leading-hidden)[dir=rtl] { + /* @noflip */ + margin-left: 4px; + /* @noflip */ + margin-right: -4px; +} + +.mdc-chip .mdc-elevation-overlay { + width: 100%; + height: 100%; + top: 0; + /* @noflip */ + left: 0; +} +.mdc-chip::-moz-focus-inner { + padding: 0; + border: 0; +} +.mdc-chip:hover { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} +.mdc-chip .mdc-chip__touch { + position: absolute; + top: 50%; + height: 48px; + left: 0; + right: 0; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} + +.mdc-chip--exit { + transition: opacity 75ms cubic-bezier(0.4, 0, 0.2, 1), width 150ms cubic-bezier(0, 0, 0.2, 1), padding 100ms linear, margin 100ms linear; + opacity: 0; +} + +.mdc-chip__overflow { + text-overflow: ellipsis; + overflow: hidden; +} + +.mdc-chip__text { + white-space: nowrap; +} + +.mdc-chip__icon { + border-radius: 50%; + outline: none; + vertical-align: middle; +} + +.mdc-chip__checkmark { + height: 20px; +} + +.mdc-chip__checkmark-path { + transition: stroke-dashoffset 150ms 50ms cubic-bezier(0.4, 0, 0.6, 1); + stroke-width: 2px; + stroke-dashoffset: 29.7833385; + stroke-dasharray: 29.7833385; +} + +.mdc-chip__primary-action:focus { + outline: none; +} + +.mdc-chip--selected .mdc-chip__checkmark-path { + stroke-dashoffset: 0; +} + +.mdc-chip__icon--leading, +.mdc-chip__icon--trailing { + position: relative; +} + +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected .mdc-chip__icon--leading { + color: rgba(98, 0, 238, 0.54); +} +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:hover { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} +.mdc-chip-set--choice .mdc-chip .mdc-chip__checkmark-path { + stroke: #6200ee; + /* @alternate */ + stroke: var(--mdc-theme-primary, #6200ee); +} +.mdc-chip-set--choice .mdc-chip--selected { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); +} + +.mdc-chip__checkmark-svg { + width: 0; + height: 20px; + transition: width 150ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.mdc-chip--selected .mdc-chip__checkmark-svg { + width: 20px; +} + +.mdc-chip-set--filter .mdc-chip__icon--leading { + transition: opacity 75ms linear; + transition-delay: -50ms; + opacity: 1; +} +.mdc-chip-set--filter .mdc-chip__icon--leading + .mdc-chip__checkmark { + transition: opacity 75ms linear; + transition-delay: 80ms; + opacity: 0; +} +.mdc-chip-set--filter .mdc-chip__icon--leading + .mdc-chip__checkmark .mdc-chip__checkmark-svg { + transition: width 0ms; +} +.mdc-chip-set--filter .mdc-chip--selected .mdc-chip__icon--leading { + opacity: 0; +} +.mdc-chip-set--filter .mdc-chip--selected .mdc-chip__icon--leading + .mdc-chip__checkmark { + width: 0; + opacity: 1; +} +.mdc-chip-set--filter .mdc-chip__icon--leading-hidden.mdc-chip__icon--leading { + width: 0; + opacity: 0; +} +.mdc-chip-set--filter .mdc-chip__icon--leading-hidden.mdc-chip__icon--leading + .mdc-chip__checkmark { + width: 20px; +} + +.mdc-chip { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-chip .mdc-chip__ripple::before, +.mdc-chip .mdc-chip__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-chip .mdc-chip__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-chip .mdc-chip__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-chip.mdc-ripple-upgraded .mdc-chip__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-chip.mdc-ripple-upgraded .mdc-chip__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-chip.mdc-ripple-upgraded--unbounded .mdc-chip__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-chip.mdc-ripple-upgraded--foreground-activation .mdc-chip__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-chip.mdc-ripple-upgraded--foreground-deactivation .mdc-chip__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-chip .mdc-chip__ripple::before, +.mdc-chip .mdc-chip__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-chip.mdc-ripple-upgraded .mdc-chip__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-chip .mdc-chip__ripple::before, .mdc-chip .mdc-chip__ripple::after { + background-color: rgba(0, 0, 0, 0.87); + /* @alternate */ + background-color: var(--mdc-ripple-color, rgba(0, 0, 0, 0.87)); +} +.mdc-chip:hover .mdc-chip__ripple::before, .mdc-chip.mdc-ripple-surface--hover .mdc-chip__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-chip.mdc-ripple-upgraded--background-focused .mdc-chip__ripple::before, .mdc-chip.mdc-ripple-upgraded:focus-within .mdc-chip__ripple::before, .mdc-chip:not(.mdc-ripple-upgraded):focus .mdc-chip__ripple::before, .mdc-chip:not(.mdc-ripple-upgraded):focus-within .mdc-chip__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-chip:not(.mdc-ripple-upgraded) .mdc-chip__ripple::after { + transition: opacity 150ms linear; +} +.mdc-chip:not(.mdc-ripple-upgraded):active .mdc-chip__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-chip.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-chip .mdc-chip__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + overflow: hidden; +} + +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected .mdc-chip__ripple::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-selected-opacity, 0.08); +} +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected .mdc-chip__ripple::before, .mdc-chip-set--choice .mdc-chip.mdc-chip--selected .mdc-chip__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:hover .mdc-chip__ripple::before, .mdc-chip-set--choice .mdc-chip.mdc-chip--selected.mdc-ripple-surface--hover .mdc-chip__ripple::before { + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.12); +} +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected.mdc-ripple-upgraded--background-focused .mdc-chip__ripple::before, .mdc-chip-set--choice .mdc-chip.mdc-chip--selected.mdc-ripple-upgraded:focus-within .mdc-chip__ripple::before, .mdc-chip-set--choice .mdc-chip.mdc-chip--selected:not(.mdc-ripple-upgraded):focus .mdc-chip__ripple::before, .mdc-chip-set--choice .mdc-chip.mdc-chip--selected:not(.mdc-ripple-upgraded):focus-within .mdc-chip__ripple::before { + transition-duration: 75ms; + opacity: 0.2; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.2); +} +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:not(.mdc-ripple-upgraded) .mdc-chip__ripple::after { + transition: opacity 150ms linear; +} +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:not(.mdc-ripple-upgraded):active .mdc-chip__ripple::after { + transition-duration: 75ms; + opacity: 0.2; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.2); +} +.mdc-chip-set--choice .mdc-chip.mdc-chip--selected.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.2); +} + +@-webkit-keyframes mdc-chip-entry { + from { + -webkit-transform: scale(0.8); + transform: scale(0.8); + opacity: 0.4; + } + to { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} + +@keyframes mdc-chip-entry { + from { + -webkit-transform: scale(0.8); + transform: scale(0.8); + opacity: 0.4; + } + to { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +.mdc-chip-set { + padding: 4px; + display: flex; + flex-wrap: wrap; + box-sizing: border-box; +} +.mdc-chip-set .mdc-chip { + margin: 4px; +} +.mdc-chip-set .mdc-chip--touch { + margin-top: 8px; + margin-bottom: 8px; +} + +.mdc-chip-set--input .mdc-chip { + -webkit-animation: mdc-chip-entry 100ms cubic-bezier(0, 0, 0.2, 1); + animation: mdc-chip-entry 100ms cubic-bezier(0, 0, 0.2, 1); +} + +.mdc-circular-progress__determinate-circle, +.mdc-circular-progress__indeterminate-circle-graphic { + stroke: #6200ee; + /* @alternate */ + stroke: var(--mdc-theme-primary, #6200ee); +} + +.mdc-circular-progress__determinate-track { + stroke: transparent; +} + +@-webkit-keyframes mdc-circular-progress-container-rotate { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes mdc-circular-progress-container-rotate { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-webkit-keyframes mdc-circular-progress-spinner-layer-rotate { + 12.5% { + -webkit-transform: rotate(135deg); + transform: rotate(135deg); + } + 25% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } + 37.5% { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + 50% { + -webkit-transform: rotate(540deg); + transform: rotate(540deg); + } + 62.5% { + -webkit-transform: rotate(675deg); + transform: rotate(675deg); + } + 75% { + -webkit-transform: rotate(810deg); + transform: rotate(810deg); + } + 87.5% { + -webkit-transform: rotate(945deg); + transform: rotate(945deg); + } + 100% { + -webkit-transform: rotate(1080deg); + transform: rotate(1080deg); + } +} +@keyframes mdc-circular-progress-spinner-layer-rotate { + 12.5% { + -webkit-transform: rotate(135deg); + transform: rotate(135deg); + } + 25% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } + 37.5% { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + 50% { + -webkit-transform: rotate(540deg); + transform: rotate(540deg); + } + 62.5% { + -webkit-transform: rotate(675deg); + transform: rotate(675deg); + } + 75% { + -webkit-transform: rotate(810deg); + transform: rotate(810deg); + } + 87.5% { + -webkit-transform: rotate(945deg); + transform: rotate(945deg); + } + 100% { + -webkit-transform: rotate(1080deg); + transform: rotate(1080deg); + } +} +@-webkit-keyframes mdc-circular-progress-color-1-fade-in-out { + from { + opacity: 0.99; + } + 25% { + opacity: 0.99; + } + 26% { + opacity: 0; + } + 89% { + opacity: 0; + } + 90% { + opacity: 0.99; + } + to { + opacity: 0.99; + } +} +@keyframes mdc-circular-progress-color-1-fade-in-out { + from { + opacity: 0.99; + } + 25% { + opacity: 0.99; + } + 26% { + opacity: 0; + } + 89% { + opacity: 0; + } + 90% { + opacity: 0.99; + } + to { + opacity: 0.99; + } +} +@-webkit-keyframes mdc-circular-progress-color-2-fade-in-out { + from { + opacity: 0; + } + 15% { + opacity: 0; + } + 25% { + opacity: 0.99; + } + 50% { + opacity: 0.99; + } + 51% { + opacity: 0; + } + to { + opacity: 0; + } +} +@keyframes mdc-circular-progress-color-2-fade-in-out { + from { + opacity: 0; + } + 15% { + opacity: 0; + } + 25% { + opacity: 0.99; + } + 50% { + opacity: 0.99; + } + 51% { + opacity: 0; + } + to { + opacity: 0; + } +} +@-webkit-keyframes mdc-circular-progress-color-3-fade-in-out { + from { + opacity: 0; + } + 40% { + opacity: 0; + } + 50% { + opacity: 0.99; + } + 75% { + opacity: 0.99; + } + 76% { + opacity: 0; + } + to { + opacity: 0; + } +} +@keyframes mdc-circular-progress-color-3-fade-in-out { + from { + opacity: 0; + } + 40% { + opacity: 0; + } + 50% { + opacity: 0.99; + } + 75% { + opacity: 0.99; + } + 76% { + opacity: 0; + } + to { + opacity: 0; + } +} +@-webkit-keyframes mdc-circular-progress-color-4-fade-in-out { + from { + opacity: 0; + } + 65% { + opacity: 0; + } + 75% { + opacity: 0.99; + } + 90% { + opacity: 0.99; + } + to { + opacity: 0; + } +} +@keyframes mdc-circular-progress-color-4-fade-in-out { + from { + opacity: 0; + } + 65% { + opacity: 0; + } + 75% { + opacity: 0.99; + } + 90% { + opacity: 0.99; + } + to { + opacity: 0; + } +} +@-webkit-keyframes mdc-circular-progress-left-spin { + from { + -webkit-transform: rotate(265deg); + transform: rotate(265deg); + } + 50% { + -webkit-transform: rotate(130deg); + transform: rotate(130deg); + } + to { + -webkit-transform: rotate(265deg); + transform: rotate(265deg); + } +} +@keyframes mdc-circular-progress-left-spin { + from { + -webkit-transform: rotate(265deg); + transform: rotate(265deg); + } + 50% { + -webkit-transform: rotate(130deg); + transform: rotate(130deg); + } + to { + -webkit-transform: rotate(265deg); + transform: rotate(265deg); + } +} +@-webkit-keyframes mdc-circular-progress-right-spin { + from { + -webkit-transform: rotate(-265deg); + transform: rotate(-265deg); + } + 50% { + -webkit-transform: rotate(-130deg); + transform: rotate(-130deg); + } + to { + -webkit-transform: rotate(-265deg); + transform: rotate(-265deg); + } +} +@keyframes mdc-circular-progress-right-spin { + from { + -webkit-transform: rotate(-265deg); + transform: rotate(-265deg); + } + 50% { + -webkit-transform: rotate(-130deg); + transform: rotate(-130deg); + } + to { + -webkit-transform: rotate(-265deg); + transform: rotate(-265deg); + } +} +.mdc-circular-progress { + display: inline-flex; + position: relative; + /* @noflip */ + direction: ltr; + line-height: 0; + transition: opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} + +.mdc-circular-progress__determinate-container, +.mdc-circular-progress__indeterminate-circle-graphic, +.mdc-circular-progress__indeterminate-container, +.mdc-circular-progress__spinner-layer { + position: absolute; + width: 100%; + height: 100%; +} + +.mdc-circular-progress__determinate-container { + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); +} + +.mdc-circular-progress__indeterminate-container { + font-size: 0; + letter-spacing: 0; + white-space: nowrap; + opacity: 0; +} + +.mdc-circular-progress__determinate-circle-graphic, +.mdc-circular-progress__indeterminate-circle-graphic { + fill: transparent; +} + +.mdc-circular-progress__determinate-circle { + transition: stroke-dashoffset 500ms 0ms cubic-bezier(0, 0, 0.2, 1); +} + +.mdc-circular-progress__gap-patch { + position: absolute; + top: 0; + /* @noflip */ + left: 47.5%; + box-sizing: border-box; + width: 5%; + height: 100%; + overflow: hidden; +} +.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic { + /* @noflip */ + left: -900%; + width: 2000%; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} + +.mdc-circular-progress__circle-clipper { + display: inline-flex; + position: relative; + width: 50%; + height: 100%; + overflow: hidden; +} +.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic { + width: 200%; +} + +.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic { + /* @noflip */ + left: -100%; +} + +.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container { + opacity: 0; +} +.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container { + opacity: 1; +} +.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container { + -webkit-animation: mdc-circular-progress-container-rotate 1568.2352941176ms linear infinite; + animation: mdc-circular-progress-container-rotate 1568.2352941176ms linear infinite; +} +.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer { + -webkit-animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} +.mdc-circular-progress--indeterminate .mdc-circular-progress__color-1 { + -webkit-animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdc-circular-progress-color-1-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdc-circular-progress-color-1-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} +.mdc-circular-progress--indeterminate .mdc-circular-progress__color-2 { + -webkit-animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdc-circular-progress-color-2-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdc-circular-progress-color-2-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} +.mdc-circular-progress--indeterminate .mdc-circular-progress__color-3 { + -webkit-animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdc-circular-progress-color-3-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdc-circular-progress-color-3-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} +.mdc-circular-progress--indeterminate .mdc-circular-progress__color-4 { + -webkit-animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdc-circular-progress-color-4-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdc-circular-progress-color-4-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} +.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic { + /* @noflip */ + -webkit-animation: mdc-circular-progress-left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: mdc-circular-progress-left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} +.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic { + /* @noflip */ + -webkit-animation: mdc-circular-progress-right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: mdc-circular-progress-right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.mdc-circular-progress--closed { + opacity: 0; +} + +.mdc-floating-label { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + position: absolute; + /* @noflip */ + left: 0; + /* @noflip */ + -webkit-transform-origin: left top; + /* @noflip */ + transform-origin: left top; + line-height: 1.15rem; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; + cursor: text; + overflow: hidden; + /* @alternate */ + will-change: transform; + transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1), color 150ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1), color 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1); +} +[dir=rtl] .mdc-floating-label, .mdc-floating-label[dir=rtl] { + /* @noflip */ + right: 0; + /* @noflip */ + left: auto; + /* @noflip */ + -webkit-transform-origin: right top; + /* @noflip */ + transform-origin: right top; + /* @noflip */ + text-align: right; +} + +.mdc-floating-label--float-above { + cursor: auto; +} + +.mdc-floating-label--required::after { + /* @noflip */ + margin-left: 1px; + /* @noflip */ + margin-right: 0px; + content: "*"; +} +[dir=rtl] .mdc-floating-label--required::after, .mdc-floating-label--required[dir=rtl]::after { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 1px; +} + +.mdc-floating-label--float-above { + -webkit-transform: translateY(-106%) scale(0.75); + transform: translateY(-106%) scale(0.75); +} + +.mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-standard 250ms 1; + animation: mdc-floating-label-shake-float-above-standard 250ms 1; +} + +@-webkit-keyframes mdc-floating-label-shake-float-above-standard { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-106%) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-106%) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-106%) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-106%) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-106%) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-106%) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-106%) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-106%) scale(0.75); + } +} + +@keyframes mdc-floating-label-shake-float-above-standard { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-106%) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-106%) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-106%) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-106%) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-106%) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-106%) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-106%) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-106%) scale(0.75); + } +} +.mdc-line-ripple::before, .mdc-line-ripple::after { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + border-bottom-style: solid; + content: ""; +} +.mdc-line-ripple::before { + border-bottom-width: 1px; + z-index: 1; +} +.mdc-line-ripple::after { + -webkit-transform: scaleX(0); + transform: scaleX(0); + border-bottom-width: 2px; + opacity: 0; + z-index: 2; +} +.mdc-line-ripple::after { + transition: opacity 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), opacity 180ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), opacity 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.mdc-line-ripple--active::after { + -webkit-transform: scaleX(1); + transform: scaleX(1); + opacity: 1; +} + +.mdc-line-ripple--deactivating::after { + opacity: 0; +} + +.mdc-notched-outline { + display: flex; + position: absolute; + top: 0; + right: 0; + left: 0; + box-sizing: border-box; + width: 100%; + max-width: 100%; + height: 100%; + /* @noflip */ + text-align: left; + pointer-events: none; +} +[dir=rtl] .mdc-notched-outline, .mdc-notched-outline[dir=rtl] { + /* @noflip */ + text-align: right; +} + +.mdc-notched-outline__leading, .mdc-notched-outline__notch, .mdc-notched-outline__trailing { + box-sizing: border-box; + height: 100%; + border-top: 1px solid; + border-bottom: 1px solid; + pointer-events: none; +} +.mdc-notched-outline__leading { + /* @noflip */ + border-left: 1px solid; + /* @noflip */ + border-right: none; + width: 12px; +} +[dir=rtl] .mdc-notched-outline__leading, .mdc-notched-outline__leading[dir=rtl] { + /* @noflip */ + border-left: none; + /* @noflip */ + border-right: 1px solid; +} + +.mdc-notched-outline__trailing { + /* @noflip */ + border-left: none; + /* @noflip */ + border-right: 1px solid; + flex-grow: 1; +} +[dir=rtl] .mdc-notched-outline__trailing, .mdc-notched-outline__trailing[dir=rtl] { + /* @noflip */ + border-left: 1px solid; + /* @noflip */ + border-right: none; +} + +.mdc-notched-outline__notch { + flex: 0 0 auto; + width: auto; + max-width: calc(100% - 12px * 2); +} +.mdc-notched-outline .mdc-floating-label { + display: inline-block; + position: relative; + max-width: 100%; +} +.mdc-notched-outline .mdc-floating-label--float-above { + text-overflow: clip; +} +.mdc-notched-outline--upgraded .mdc-floating-label--float-above { + max-width: calc(100% / 0.75); +} + +.mdc-notched-outline--notched .mdc-notched-outline__notch { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 8px; + border-top: none; +} +[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch, .mdc-notched-outline--notched .mdc-notched-outline__notch[dir=rtl] { + /* @noflip */ + padding-left: 8px; + /* @noflip */ + padding-right: 0; +} + +.mdc-notched-outline--no-label .mdc-notched-outline__notch { + display: none; +} + +.mdc-select { + display: inline-flex; + position: relative; +} +.mdc-select:not(.mdc-select--disabled) .mdc-select__selected-text { + color: rgba(0, 0, 0, 0.87); +} +.mdc-select.mdc-select--disabled .mdc-select__selected-text { + color: rgba(0, 0, 0, 0.38); +} +.mdc-select:not(.mdc-select--disabled) .mdc-floating-label { + color: rgba(0, 0, 0, 0.6); +} +.mdc-select:not(.mdc-select--disabled).mdc-select--focused .mdc-floating-label { + color: rgba(98, 0, 238, 0.87); +} +.mdc-select.mdc-select--disabled .mdc-floating-label { + color: rgba(0, 0, 0, 0.38); +} +.mdc-select:not(.mdc-select--disabled) .mdc-select__dropdown-icon { + fill: rgba(0, 0, 0, 0.54); +} +.mdc-select:not(.mdc-select--disabled).mdc-select--focused .mdc-select__dropdown-icon { + fill: #6200ee; + /* @alternate */ + fill: var(--mdc-theme-primary, #6200ee); +} +.mdc-select.mdc-select--disabled .mdc-select__dropdown-icon { + fill: rgba(0, 0, 0, 0.38); +} +.mdc-select:not(.mdc-select--disabled) + .mdc-select-helper-text { + color: rgba(0, 0, 0, 0.6); +} +.mdc-select.mdc-select--disabled + .mdc-select-helper-text { + color: rgba(0, 0, 0, 0.38); +} +.mdc-select:not(.mdc-select--disabled) .mdc-select__icon { + color: rgba(0, 0, 0, 0.54); +} +.mdc-select.mdc-select--disabled .mdc-select__icon { + color: rgba(0, 0, 0, 0.38); +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-select.mdc-select--disabled .mdc-select__selected-text { + color: GrayText; + } + .mdc-select.mdc-select--disabled .mdc-select__dropdown-icon { + fill: red; + } + .mdc-select.mdc-select--disabled .mdc-floating-label { + color: GrayText; + } + .mdc-select.mdc-select--disabled .mdc-line-ripple::before { + border-bottom-color: GrayText; + } + .mdc-select.mdc-select--disabled .mdc-notched-outline__leading, +.mdc-select.mdc-select--disabled .mdc-notched-outline__notch, +.mdc-select.mdc-select--disabled .mdc-notched-outline__trailing { + border-color: GrayText; + } + .mdc-select.mdc-select--disabled .mdc-select__icon { + color: GrayText; + } + .mdc-select.mdc-select--disabled + .mdc-select-helper-text { + color: GrayText; + } +} +.mdc-select .mdc-floating-label { + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + pointer-events: none; +} +.mdc-select .mdc-select__anchor { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-select .mdc-select__anchor, .mdc-select .mdc-select__anchor[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 16px; +} + +.mdc-select.mdc-select--with-leading-icon .mdc-select__anchor { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-select.mdc-select--with-leading-icon .mdc-select__anchor, .mdc-select.mdc-select--with-leading-icon .mdc-select__anchor[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 0; +} + +.mdc-select .mdc-select__icon { + width: 24px; + height: 24px; + font-size: 24px; +} +.mdc-select .mdc-select__dropdown-icon { + width: 24px; + height: 24px; +} +.mdc-select .mdc-select__menu .mdc-deprecated-list-item { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; +} +[dir=rtl] .mdc-select .mdc-select__menu .mdc-deprecated-list-item, .mdc-select .mdc-select__menu .mdc-deprecated-list-item[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; +} + +.mdc-select .mdc-select__menu .mdc-deprecated-list-item__graphic { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 12px; +} +[dir=rtl] .mdc-select .mdc-select__menu .mdc-deprecated-list-item__graphic, .mdc-select .mdc-select__menu .mdc-deprecated-list-item__graphic[dir=rtl] { + /* @noflip */ + margin-left: 12px; + /* @noflip */ + margin-right: 0; +} + +.mdc-select__dropdown-icon { + /* @noflip */ + margin-left: 12px; + /* @noflip */ + margin-right: 12px; + display: inline-flex; + position: relative; + align-self: center; + align-items: center; + justify-content: center; + flex-shrink: 0; + pointer-events: none; +} +.mdc-select__dropdown-icon .mdc-select__dropdown-icon-active, +.mdc-select__dropdown-icon .mdc-select__dropdown-icon-inactive { + position: absolute; + top: 0; + left: 0; +} +.mdc-select__dropdown-icon .mdc-select__dropdown-icon-graphic { + width: 41.6666666667%; + height: 20.8333333333%; +} +.mdc-select__dropdown-icon .mdc-select__dropdown-icon-inactive { + opacity: 1; + transition: opacity 75ms linear 75ms; +} +.mdc-select__dropdown-icon .mdc-select__dropdown-icon-active { + opacity: 0; + transition: opacity 75ms linear; +} +[dir=rtl] .mdc-select__dropdown-icon, .mdc-select__dropdown-icon[dir=rtl] { + /* @noflip */ + margin-left: 12px; + /* @noflip */ + margin-right: 12px; +} + +.mdc-select--activated .mdc-select__dropdown-icon .mdc-select__dropdown-icon-inactive { + opacity: 0; + transition: opacity 49.5ms linear; +} +.mdc-select--activated .mdc-select__dropdown-icon .mdc-select__dropdown-icon-active { + opacity: 1; + transition: opacity 100.5ms linear 49.5ms; +} + +.mdc-select__anchor { + width: 200px; + min-width: 0; + flex: 1 1 auto; + position: relative; + box-sizing: border-box; + overflow: hidden; + outline: none; + cursor: pointer; +} +.mdc-select__anchor .mdc-floating-label--float-above { + -webkit-transform: translateY(-106%) scale(0.75); + transform: translateY(-106%) scale(0.75); +} + +.mdc-select__selected-text-container { + display: flex; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + pointer-events: none; + box-sizing: border-box; + width: auto; + min-width: 0; + flex-grow: 1; + height: 28px; + border: none; + outline: none; + padding: 0; + background-color: transparent; + color: inherit; +} + +.mdc-select__selected-text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + line-height: 1.75rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle1-line-height, 1.75rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + display: block; + width: 100%; + /* @noflip */ + text-align: left; +} +[dir=rtl] .mdc-select__selected-text, .mdc-select__selected-text[dir=rtl] { + /* @noflip */ + text-align: right; +} + +.mdc-select--invalid:not(.mdc-select--disabled) .mdc-floating-label { + color: #b00020; + /* @alternate */ + color: var(--mdc-theme-error, #b00020); +} +.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-floating-label { + color: #b00020; + /* @alternate */ + color: var(--mdc-theme-error, #b00020); +} +.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--invalid + .mdc-select-helper-text--validation-msg { + color: #b00020; + /* @alternate */ + color: var(--mdc-theme-error, #b00020); +} +.mdc-select--invalid:not(.mdc-select--disabled) .mdc-select__dropdown-icon { + fill: #b00020; + /* @alternate */ + fill: var(--mdc-theme-error, #b00020); +} +.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-select__dropdown-icon { + fill: #b00020; + /* @alternate */ + fill: var(--mdc-theme-error, #b00020); +} +.mdc-select--disabled { + cursor: default; + pointer-events: none; +} + +.mdc-select--with-leading-icon .mdc-select__menu .mdc-deprecated-list-item { + /* @noflip */ + padding-left: 12px; + /* @noflip */ + padding-right: 12px; +} +[dir=rtl] .mdc-select--with-leading-icon .mdc-select__menu .mdc-deprecated-list-item, .mdc-select--with-leading-icon .mdc-select__menu .mdc-deprecated-list-item[dir=rtl] { + /* @noflip */ + padding-left: 12px; + /* @noflip */ + padding-right: 12px; +} + +.mdc-select__menu .mdc-deprecated-list .mdc-select__icon { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0; +} +[dir=rtl] .mdc-select__menu .mdc-deprecated-list .mdc-select__icon, .mdc-select__menu .mdc-deprecated-list .mdc-select__icon[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0; +} + +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected, +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--activated { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-deprecated-list-item__graphic, +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--activated .mdc-deprecated-list-item__graphic { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} + +.mdc-select--filled .mdc-select__anchor { + height: 56px; + display: flex; + align-items: baseline; +} +.mdc-select--filled .mdc-select__anchor::before { + display: inline-block; + width: 0; + height: 40px; + content: ""; + vertical-align: 0; +} +.mdc-select--filled.mdc-select--no-label .mdc-select__anchor .mdc-select__selected-text::before { + content: "​"; +} +.mdc-select--filled.mdc-select--no-label .mdc-select__anchor .mdc-select__selected-text-container { + height: 100%; + display: inline-flex; + align-items: center; +} +.mdc-select--filled.mdc-select--no-label .mdc-select__anchor::before { + display: none; +} +.mdc-select--filled .mdc-select__anchor { + border-top-left-radius: 4px; + /* @alternate */ + border-top-left-radius: var(--mdc-shape-small, 4px); + border-top-right-radius: 4px; + /* @alternate */ + border-top-right-radius: var(--mdc-shape-small, 4px); + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.mdc-select--filled:not(.mdc-select--disabled) .mdc-select__anchor { + background-color: whitesmoke; +} +.mdc-select--filled.mdc-select--disabled .mdc-select__anchor { + background-color: #fafafa; +} +.mdc-select--filled:not(.mdc-select--disabled) .mdc-line-ripple::before { + border-bottom-color: rgba(0, 0, 0, 0.42); +} +.mdc-select--filled:not(.mdc-select--disabled):hover .mdc-line-ripple::before { + border-bottom-color: rgba(0, 0, 0, 0.87); +} +.mdc-select--filled:not(.mdc-select--disabled) .mdc-line-ripple::after { + border-bottom-color: #6200ee; + /* @alternate */ + border-bottom-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-select--filled.mdc-select--disabled .mdc-line-ripple::before { + border-bottom-color: rgba(0, 0, 0, 0.06); +} +.mdc-select--filled .mdc-floating-label { + max-width: calc(100% - 64px); +} +.mdc-select--filled .mdc-floating-label--float-above { + max-width: calc(100% / 0.75 - 64px / 0.75); +} +.mdc-select--filled .mdc-menu-surface--is-open-below { + border-top-left-radius: 0px; + border-top-right-radius: 0px; +} +.mdc-select--filled.mdc-select--focused.mdc-line-ripple::after { + -webkit-transform: scale(1, 2); + transform: scale(1, 2); + opacity: 1; +} +.mdc-select--filled .mdc-floating-label { + /* @noflip */ + left: 16px; + /* @noflip */ + right: initial; +} +[dir=rtl] .mdc-select--filled .mdc-floating-label, .mdc-select--filled .mdc-floating-label[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 16px; +} + +.mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label { + /* @noflip */ + left: 48px; + /* @noflip */ + right: initial; +} +[dir=rtl] .mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label, .mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 48px; +} + +.mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label { + max-width: calc(100% - 96px); +} +.mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label--float-above { + max-width: calc(100% / 0.75 - 96px / 0.75); +} + +.mdc-select--invalid:not(.mdc-select--disabled) .mdc-line-ripple::before { + border-bottom-color: #b00020; + /* @alternate */ + border-bottom-color: var(--mdc-theme-error, #b00020); +} +.mdc-select--invalid:not(.mdc-select--disabled):hover .mdc-line-ripple::before { + border-bottom-color: #b00020; + /* @alternate */ + border-bottom-color: var(--mdc-theme-error, #b00020); +} +.mdc-select--invalid:not(.mdc-select--disabled) .mdc-line-ripple::after { + border-bottom-color: #b00020; + /* @alternate */ + border-bottom-color: var(--mdc-theme-error, #b00020); +} +.mdc-select--outlined { + border: none; +} +.mdc-select--outlined .mdc-select__anchor { + height: 56px; +} +.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--float-above { + -webkit-transform: translateY(-37.25px) scale(1); + transform: translateY(-37.25px) scale(1); +} +.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--float-above { + font-size: 0.75rem; +} +.mdc-select--outlined .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + -webkit-transform: translateY(-34.75px) scale(0.75); + transform: translateY(-34.75px) scale(0.75); +} +.mdc-select--outlined .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + font-size: 1rem; +} +.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-select-outlined-56px 250ms 1; + animation: mdc-floating-label-shake-float-above-select-outlined-56px 250ms 1; +} +@-webkit-keyframes mdc-floating-label-shake-float-above-select-outlined-56px { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + } +} +@keyframes mdc-floating-label-shake-float-above-select-outlined-56px { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + } +} +.mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__leading { + /* @noflip */ + border-top-left-radius: 4px; + /* @alternate */ + /* @noflip */ + border-top-left-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-top-right-radius: 0; + /* @noflip */ + border-bottom-right-radius: 0; + /* @noflip */ + border-bottom-left-radius: 4px; + /* @alternate */ + /* @noflip */ + border-bottom-left-radius: var(--mdc-shape-small, 4px); +} +[dir=rtl] .mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__leading, .mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__leading[dir=rtl] { + /* @noflip */ + border-top-left-radius: 0; + /* @noflip */ + border-top-right-radius: 4px; + /* @alternate */ + /* @noflip */ + border-top-right-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-bottom-right-radius: 4px; + /* @alternate */ + /* @noflip */ + border-bottom-right-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-bottom-left-radius: 0; +} + +@supports (top: max(0%)) { + .mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__leading { + width: max(12px, var(--mdc-shape-small, 4px)); + } +} +@supports (top: max(0%)) { + .mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__notch { + max-width: calc(100% - max(12px, var(--mdc-shape-small, 4px)) * 2); + } +} +.mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__trailing { + /* @noflip */ + border-top-left-radius: 0; + /* @noflip */ + border-top-right-radius: 4px; + /* @alternate */ + /* @noflip */ + border-top-right-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-bottom-right-radius: 4px; + /* @alternate */ + /* @noflip */ + border-bottom-right-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-bottom-left-radius: 0; +} +[dir=rtl] .mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__trailing, .mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__trailing[dir=rtl] { + /* @noflip */ + border-top-left-radius: 4px; + /* @alternate */ + /* @noflip */ + border-top-left-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-top-right-radius: 0; + /* @noflip */ + border-bottom-right-radius: 0; + /* @noflip */ + border-bottom-left-radius: 4px; + /* @alternate */ + /* @noflip */ + border-bottom-left-radius: var(--mdc-shape-small, 4px); +} + +@supports (top: max(0%)) { + .mdc-select--outlined .mdc-select__anchor { + /* @noflip */ + padding-left: max(16px, calc(var(--mdc-shape-small, 4px) + 4px)); + } +} +[dir=rtl] .mdc-select--outlined .mdc-select__anchor, .mdc-select--outlined .mdc-select__anchor[dir=rtl] { + /* @noflip */ + padding-left: 0; +} +@supports (top: max(0%)) { + [dir=rtl] .mdc-select--outlined .mdc-select__anchor, .mdc-select--outlined .mdc-select__anchor[dir=rtl] { + /* @noflip */ + padding-right: max(16px, calc(var(--mdc-shape-small, 4px) + 4px)); + } +} + +@supports (top: max(0%)) { + .mdc-select--outlined + .mdc-select-helper-text { + /* @noflip */ + margin-left: max(16px, calc(var(--mdc-shape-small, 4px) + 4px)); + } +} +[dir=rtl] .mdc-select--outlined + .mdc-select-helper-text, .mdc-select--outlined + .mdc-select-helper-text[dir=rtl] { + /* @noflip */ + margin-left: 0; +} +@supports (top: max(0%)) { + [dir=rtl] .mdc-select--outlined + .mdc-select-helper-text, .mdc-select--outlined + .mdc-select-helper-text[dir=rtl] { + /* @noflip */ + margin-right: max(16px, calc(var(--mdc-shape-small, 4px) + 4px)); + } +} + +.mdc-select--outlined:not(.mdc-select--disabled) .mdc-select__anchor { + background-color: transparent; +} +.mdc-select--outlined.mdc-select--disabled .mdc-select__anchor { + background-color: transparent; +} +.mdc-select--outlined:not(.mdc-select--disabled) .mdc-notched-outline__leading, +.mdc-select--outlined:not(.mdc-select--disabled) .mdc-notched-outline__notch, +.mdc-select--outlined:not(.mdc-select--disabled) .mdc-notched-outline__trailing { + border-color: rgba(0, 0, 0, 0.38); +} +.mdc-select--outlined:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__leading, +.mdc-select--outlined:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__notch, +.mdc-select--outlined:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__trailing { + border-color: rgba(0, 0, 0, 0.87); +} +.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__leading, +.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__notch, +.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__trailing { + border-width: 2px; +} +.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__leading, +.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__notch, +.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__trailing { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-select--outlined.mdc-select--disabled .mdc-notched-outline__leading, +.mdc-select--outlined.mdc-select--disabled .mdc-notched-outline__notch, +.mdc-select--outlined.mdc-select--disabled .mdc-notched-outline__trailing { + border-color: rgba(0, 0, 0, 0.06); +} +.mdc-select--outlined .mdc-select__anchor :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch { + max-width: calc(100% - 60px); +} +.mdc-select--outlined .mdc-select__anchor { + display: flex; + align-items: baseline; + overflow: visible; +} +.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-select-outlined 250ms 1; + animation: mdc-floating-label-shake-float-above-select-outlined 250ms 1; +} +.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--float-above { + -webkit-transform: translateY(-37.25px) scale(1); + transform: translateY(-37.25px) scale(1); +} +.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--float-above { + font-size: 0.75rem; +} +.mdc-select--outlined .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + -webkit-transform: translateY(-34.75px) scale(0.75); + transform: translateY(-34.75px) scale(0.75); +} +.mdc-select--outlined .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + font-size: 1rem; +} +.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--notched .mdc-notched-outline__notch { + padding-top: 1px; +} +.mdc-select--outlined .mdc-select__anchor .mdc-select__selected-text::before { + content: "​"; +} +.mdc-select--outlined .mdc-select__anchor .mdc-select__selected-text-container { + height: 100%; + display: inline-flex; + align-items: center; +} +.mdc-select--outlined .mdc-select__anchor::before { + display: none; +} +.mdc-select--outlined .mdc-select__selected-text-container { + display: flex; + border: none; + z-index: 1; + background-color: transparent; +} +.mdc-select--outlined .mdc-select__icon { + z-index: 2; +} +.mdc-select--outlined .mdc-floating-label { + line-height: 1.15rem; + /* @noflip */ + left: 4px; + /* @noflip */ + right: initial; +} +[dir=rtl] .mdc-select--outlined .mdc-floating-label, .mdc-select--outlined .mdc-floating-label[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 4px; +} + +.mdc-select--outlined.mdc-select--focused .mdc-notched-outline--notched .mdc-notched-outline__notch { + padding-top: 2px; +} +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled) .mdc-notched-outline__leading, +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled) .mdc-notched-outline__notch, +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled) .mdc-notched-outline__trailing { + border-color: #b00020; + /* @alternate */ + border-color: var(--mdc-theme-error, #b00020); +} +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__leading, +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__notch, +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__trailing { + border-color: #b00020; + /* @alternate */ + border-color: var(--mdc-theme-error, #b00020); +} +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__leading, +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__notch, +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__trailing { + border-width: 2px; +} +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__leading, +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__notch, +.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__trailing { + border-color: #b00020; + /* @alternate */ + border-color: var(--mdc-theme-error, #b00020); +} +.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label { + /* @noflip */ + left: 36px; + /* @noflip */ + right: initial; +} +[dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label, .mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 36px; +} + +.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--float-above { + -webkit-transform: translateY(-37.25px) translateX(-32px) scale(1); + transform: translateY(-37.25px) translateX(-32px) scale(1); +} +[dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--float-above, .mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--float-above[dir=rtl] { + -webkit-transform: translateY(-37.25px) translateX(32px) scale(1); + transform: translateY(-37.25px) translateX(32px) scale(1); +} + +.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--float-above { + font-size: 0.75rem; +} +.mdc-select--outlined.mdc-select--with-leading-icon.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-select--outlined.mdc-select--with-leading-icon .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + -webkit-transform: translateY(-34.75px) translateX(-32px) scale(0.75); + transform: translateY(-34.75px) translateX(-32px) scale(0.75); +} +[dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon.mdc-notched-outline--upgraded .mdc-floating-label--float-above, [dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon .mdc-notched-outline--upgraded .mdc-floating-label--float-above, .mdc-select--outlined.mdc-select--with-leading-icon.mdc-notched-outline--upgraded .mdc-floating-label--float-above[dir=rtl], .mdc-select--outlined.mdc-select--with-leading-icon .mdc-notched-outline--upgraded .mdc-floating-label--float-above[dir=rtl] { + -webkit-transform: translateY(-34.75px) translateX(32px) scale(0.75); + transform: translateY(-34.75px) translateX(32px) scale(0.75); +} + +.mdc-select--outlined.mdc-select--with-leading-icon.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-select--outlined.mdc-select--with-leading-icon .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + font-size: 1rem; +} +.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px 250ms 1; + animation: mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px 250ms 1; +} +@-webkit-keyframes mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px { + 0% { + -webkit-transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + } +} +@keyframes mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px { + 0% { + -webkit-transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + } +} +[dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--shake, .mdc-select--outlined.mdc-select--with-leading-icon[dir=rtl] .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px 250ms 1; + animation: mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px 250ms 1; +} + +@-webkit-keyframes mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px-rtl { + 0% { + -webkit-transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + } +} + +@keyframes mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px-rtl { + 0% { + -webkit-transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + } +} +.mdc-select--outlined.mdc-select--with-leading-icon .mdc-select__anchor :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch { + max-width: calc(100% - 96px); +} +.mdc-select--outlined .mdc-menu-surface { + margin-bottom: 8px; +} +.mdc-select--outlined.mdc-select--no-label .mdc-menu-surface, +.mdc-select--outlined .mdc-menu-surface--is-open-below { + margin-bottom: 0; +} + +.mdc-select__anchor { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-select__anchor .mdc-select__ripple::before, +.mdc-select__anchor .mdc-select__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-select__anchor .mdc-select__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-select__anchor .mdc-select__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-select__anchor.mdc-ripple-upgraded .mdc-select__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-select__anchor.mdc-ripple-upgraded .mdc-select__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-select__anchor.mdc-ripple-upgraded--unbounded .mdc-select__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-select__anchor.mdc-ripple-upgraded--foreground-activation .mdc-select__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-select__anchor.mdc-ripple-upgraded--foreground-deactivation .mdc-select__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-select__anchor .mdc-select__ripple::before, +.mdc-select__anchor .mdc-select__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-select__anchor.mdc-ripple-upgraded .mdc-select__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-select__anchor .mdc-select__ripple::before, +.mdc-select__anchor .mdc-select__ripple::after { + background-color: rgba(0, 0, 0, 0.87); + /* @alternate */ + background-color: var(--mdc-ripple-color, rgba(0, 0, 0, 0.87)); +} +.mdc-select__anchor:hover .mdc-select__ripple::before, .mdc-select__anchor.mdc-ripple-surface--hover .mdc-select__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-select__anchor.mdc-ripple-upgraded--background-focused .mdc-select__ripple::before, .mdc-select__anchor:not(.mdc-ripple-upgraded):focus .mdc-select__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-select__anchor .mdc-select__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::before, .mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-on-surface, #000)); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:hover .mdc-deprecated-list-item__ripple::before, .mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-surface--hover .mdc-deprecated-list-item__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before, .mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded) .mdc-deprecated-list-item__ripple::after { + transition: opacity 150ms linear; +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-deprecated-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-list-item__ripple::before, .mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-list-item__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-on-surface, #000)); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:hover .mdc-list-item__ripple::before, .mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-surface--hover .mdc-list-item__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before, .mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after { + transition: opacity 150ms linear; +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} + +.mdc-select-helper-text { + margin: 0; + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.75rem; + /* @alternate */ + font-size: var(--mdc-typography-caption-font-size, 0.75rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-caption-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: 0.0333333333em; + /* @alternate */ + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-caption-text-transform, inherit); + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +[dir=rtl] .mdc-select-helper-text, .mdc-select-helper-text[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} + +.mdc-select-helper-text::before { + display: inline-block; + width: 0; + height: 16px; + content: ""; + vertical-align: 0; +} + +.mdc-select-helper-text--validation-msg { + opacity: 0; + transition: opacity 180ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.mdc-select--invalid + .mdc-select-helper-text--validation-msg, +.mdc-select-helper-text--validation-msg-persistent { + opacity: 1; +} + +.mdc-select--with-leading-icon .mdc-select__icon { + display: inline-block; + box-sizing: border-box; + border: none; + text-decoration: none; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + flex-shrink: 0; + align-self: center; + background-color: transparent; + fill: currentColor; +} +.mdc-select--with-leading-icon .mdc-select__icon { + /* @noflip */ + margin-left: 12px; + /* @noflip */ + margin-right: 12px; +} +[dir=rtl] .mdc-select--with-leading-icon .mdc-select__icon, .mdc-select--with-leading-icon .mdc-select__icon[dir=rtl] { + /* @noflip */ + margin-left: 12px; + /* @noflip */ + margin-right: 12px; +} + +.mdc-select__icon:not([tabindex]), +.mdc-select__icon[tabindex="-1"] { + cursor: default; + pointer-events: none; +} + +.mdc-data-table__content { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); +} + +.mdc-data-table { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-medium, 4px); + border-width: 1px; + border-style: solid; + border-color: rgba(0, 0, 0, 0.12); + -webkit-overflow-scrolling: touch; + display: inline-flex; + flex-direction: column; + box-sizing: border-box; + position: relative; +} +.mdc-data-table .mdc-data-table__header-cell:first-child { + border-top-left-radius: 4px; + /* @alternate */ + border-top-left-radius: var(--mdc-shape-medium, 4px); +} +[dir=rtl] .mdc-data-table .mdc-data-table__header-cell:first-child, .mdc-data-table .mdc-data-table__header-cell:first-child[dir=rtl] { + border-top-right-radius: 4px; + /* @alternate */ + border-top-right-radius: var(--mdc-shape-medium, 4px); + border-top-left-radius: 0; +} + +.mdc-data-table .mdc-data-table__header-cell:last-child { + border-top-right-radius: 4px; + /* @alternate */ + border-top-right-radius: var(--mdc-shape-medium, 4px); +} +[dir=rtl] .mdc-data-table .mdc-data-table__header-cell:last-child, .mdc-data-table .mdc-data-table__header-cell:last-child[dir=rtl] { + border-top-left-radius: 4px; + /* @alternate */ + border-top-left-radius: var(--mdc-shape-medium, 4px); + border-top-right-radius: 0; +} + +.mdc-data-table__row { + background-color: inherit; +} + +.mdc-data-table__header-cell { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); +} + +.mdc-data-table__row--selected { + background-color: rgba(98, 0, 238, 0.04); +} + +.mdc-data-table__pagination-rows-per-page-select:not(.mdc-select--disabled) .mdc-notched-outline__leading, +.mdc-data-table__pagination-rows-per-page-select:not(.mdc-select--disabled) .mdc-notched-outline__notch, +.mdc-data-table__pagination-rows-per-page-select:not(.mdc-select--disabled) .mdc-notched-outline__trailing { + border-color: rgba(0, 0, 0, 0.12); +} +.mdc-data-table__cell, +.mdc-data-table__header-cell { + border-bottom-color: rgba(0, 0, 0, 0.12); +} + +.mdc-data-table__pagination { + border-top-color: rgba(0, 0, 0, 0.12); +} + +.mdc-data-table__cell, +.mdc-data-table__header-cell { + border-bottom-width: 1px; + border-bottom-style: solid; +} + +.mdc-data-table__pagination { + border-top-width: 1px; + border-top-style: solid; +} + +.mdc-data-table__row:last-child .mdc-data-table__cell { + border-bottom: none; +} + +.mdc-data-table__row:not(.mdc-data-table__row--selected):hover { + background-color: rgba(0, 0, 0, 0.04); +} + +.mdc-data-table__header-cell { + color: rgba(0, 0, 0, 0.87); +} + +.mdc-data-table__pagination-total, +.mdc-data-table__pagination-rows-per-page-label, +.mdc-data-table__cell { + color: rgba(0, 0, 0, 0.87); +} + +.mdc-data-table__row { + height: 52px; +} + +.mdc-data-table__pagination { + min-height: 52px; +} + +.mdc-data-table__header-row { + height: 56px; +} + +.mdc-data-table__cell, +.mdc-data-table__header-cell { + padding: 0 16px 0 16px; +} + +.mdc-data-table__header-cell--checkbox, +.mdc-data-table__cell--checkbox { + /* @noflip */ + padding-left: 4px; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-data-table__header-cell--checkbox, [dir=rtl] .mdc-data-table__cell--checkbox, .mdc-data-table__header-cell--checkbox[dir=rtl], .mdc-data-table__cell--checkbox[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 4px; +} + +.mdc-data-table__sort-icon-button { + color: rgba(0, 0, 0, 0.6); +} +.mdc-data-table__sort-icon-button .mdc-icon-button__ripple::before, .mdc-data-table__sort-icon-button .mdc-icon-button__ripple::after { + background-color: rgba(0, 0, 0, 0.6); + /* @alternate */ + background-color: var(--mdc-ripple-color, rgba(0, 0, 0, 0.6)); +} +.mdc-data-table__sort-icon-button:hover .mdc-icon-button__ripple::before, .mdc-data-table__sort-icon-button.mdc-ripple-surface--hover .mdc-icon-button__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-data-table__sort-icon-button.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before, .mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-data-table__sort-icon-button.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} + +.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button { + color: rgba(0, 0, 0, 0.87); +} +.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button .mdc-icon-button__ripple::before, .mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button .mdc-icon-button__ripple::after { + background-color: rgba(0, 0, 0, 0.87); + /* @alternate */ + background-color: var(--mdc-ripple-color, rgba(0, 0, 0, 0.87)); +} +.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button:hover .mdc-icon-button__ripple::before, .mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button.mdc-ripple-surface--hover .mdc-icon-button__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before, .mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} + +.mdc-data-table__table-container { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + width: 100%; +} + +.mdc-data-table__table { + min-width: 100%; + border: 0; + white-space: nowrap; + border-spacing: 0; + /** + * With table-layout:fixed, table and column widths are defined by the width + * of the first row of cells. Cells in subsequent rows do not affect column + * widths. This results in a predictable table layout and may also speed up + * rendering. + */ + table-layout: fixed; +} + +.mdc-data-table__cell { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + box-sizing: border-box; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; +} +[dir=rtl] .mdc-data-table__cell, .mdc-data-table__cell[dir=rtl] { + /* @noflip */ + text-align: right; +} + +.mdc-data-table__cell--numeric { + text-align: right; +} +[dir=rtl] .mdc-data-table__cell--numeric, .mdc-data-table__cell--numeric[dir=rtl] { + /* @noflip */ + text-align: left; +} + +.mdc-data-table__cell--checkbox { + width: 1px; +} + +.mdc-data-table__header-cell { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle2-font-size, 0.875rem); + line-height: 1.375rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle2-line-height, 1.375rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle2-font-weight, 500); + letter-spacing: 0.0071428571em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle2-text-transform, inherit); + box-sizing: border-box; + text-overflow: ellipsis; + overflow: hidden; + outline: none; + /* @noflip */ + text-align: left; +} +[dir=rtl] .mdc-data-table__header-cell, .mdc-data-table__header-cell[dir=rtl] { + /* @noflip */ + text-align: right; +} + +.mdc-data-table__header-cell--checkbox { + width: 1px; +} + +.mdc-data-table__header-cell--numeric { + text-align: right; +} +[dir=rtl] .mdc-data-table__header-cell--numeric, .mdc-data-table__header-cell--numeric[dir=rtl] { + /* @noflip */ + text-align: left; +} + +.mdc-data-table__sort-icon-button { + width: 28px; + height: 28px; + padding: 2px; + -webkit-transform: rotate(0.0001deg); + transform: rotate(0.0001deg); + /* @noflip */ + margin-left: 4px; + /* @noflip */ + margin-right: 0; + transition: -webkit-transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0; +} +.mdc-data-table__sort-icon-button.mdc-icon-button--touch { + margin-top: 0; + margin-bottom: 0; +} +.mdc-data-table__sort-icon-button.mdc-icon-button--touch .mdc-icon-button__touch { + display: none; +} +[dir=rtl] .mdc-data-table__sort-icon-button, .mdc-data-table__sort-icon-button[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 4px; +} + +.mdc-data-table__header-cell--numeric .mdc-data-table__sort-icon-button { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 4px; +} +[dir=rtl] .mdc-data-table__header-cell--numeric .mdc-data-table__sort-icon-button, .mdc-data-table__header-cell--numeric .mdc-data-table__sort-icon-button[dir=rtl] { + /* @noflip */ + margin-left: 4px; + /* @noflip */ + margin-right: 0; +} + +.mdc-data-table__header-cell--sorted-descending .mdc-data-table__sort-icon-button { + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); +} +.mdc-data-table__sort-icon-button:focus, .mdc-data-table__header-cell:hover .mdc-data-table__sort-icon-button, .mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button { + opacity: 1; +} + +.mdc-data-table__header-cell-wrapper { + align-items: center; + display: inline-flex; + vertical-align: middle; +} + +.mdc-data-table__header-cell--with-sort { + cursor: pointer; +} + +.mdc-data-table__sort-status-label { + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + overflow: hidden; + position: absolute; + white-space: nowrap; + /* added line */ + width: 1px; +} + +.mdc-data-table__progress-indicator { + display: none; + position: absolute; + width: 100%; +} +.mdc-data-table--in-progress .mdc-data-table__progress-indicator { + display: block; +} + +.mdc-data-table__scrim { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); + height: 100%; + opacity: 0.32; + position: absolute; + top: 0; + width: 100%; +} + +.mdc-data-table--sticky-header .mdc-data-table__header-cell { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1; +} + +.mdc-data-table__pagination { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + box-sizing: border-box; + display: flex; + justify-content: flex-end; +} + +.mdc-data-table__pagination-trailing { + /* @noflip */ + margin-left: 4px; + /* @noflip */ + margin-right: 0; + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-end; +} +[dir=rtl] .mdc-data-table__pagination-trailing, .mdc-data-table__pagination-trailing[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 4px; +} + +.mdc-data-table__pagination-navigation { + align-items: center; + display: flex; +} + +.mdc-data-table__pagination-button { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 4px; +} +[dir=rtl] .mdc-data-table__pagination-button .mdc-button__icon, .mdc-data-table__pagination-button .mdc-button__icon[dir=rtl] { + /* @noflip */ + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} + +[dir=rtl] .mdc-data-table__pagination-button, .mdc-data-table__pagination-button[dir=rtl] { + /* @noflip */ + margin-left: 4px; + /* @noflip */ + margin-right: 0; +} + +.mdc-data-table__pagination-total { + /* @noflip */ + margin-left: 14px; + /* @noflip */ + margin-right: 36px; + white-space: nowrap; +} +[dir=rtl] .mdc-data-table__pagination-total, .mdc-data-table__pagination-total[dir=rtl] { + /* @noflip */ + margin-left: 36px; + /* @noflip */ + margin-right: 14px; +} + +.mdc-data-table__pagination-rows-per-page { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 22px; + align-items: center; + display: inline-flex; +} +[dir=rtl] .mdc-data-table__pagination-rows-per-page, .mdc-data-table__pagination-rows-per-page[dir=rtl] { + /* @noflip */ + margin-left: 22px; + /* @noflip */ + margin-right: 0; +} + +.mdc-data-table__pagination-rows-per-page-label { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 12px; + white-space: nowrap; +} +[dir=rtl] .mdc-data-table__pagination-rows-per-page-label, .mdc-data-table__pagination-rows-per-page-label[dir=rtl] { + /* @noflip */ + margin-left: 12px; + /* @noflip */ + margin-right: 0; +} + +.mdc-data-table__pagination-rows-per-page-select { + min-width: 80px; + /* @alternate */ + min-width: var(--mdc-menu-min-width, 80px); + margin: 8px 0; +} +.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor { + width: 100%; + min-width: 80px; +} +.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor { + height: 36px; +} +.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-floating-label--float-above { + -webkit-transform: translateY(-27.25px) scale(1); + transform: translateY(-27.25px) scale(1); +} +.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-floating-label--float-above { + font-size: 0.75rem; +} +.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + -webkit-transform: translateY(-24.75px) scale(0.75); + transform: translateY(-24.75px) scale(0.75); +} +.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + font-size: 1rem; +} +.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-select-outlined-36px 250ms 1; + animation: mdc-floating-label-shake-float-above-select-outlined-36px 250ms 1; +} +@-webkit-keyframes mdc-floating-label-shake-float-above-select-outlined-36px { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + } +} +@keyframes mdc-floating-label-shake-float-above-select-outlined-36px { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + } +} +.mdc-data-table__pagination-rows-per-page-select .mdc-select__dropdown-icon { + width: 20px; + height: 20px; +} +.mdc-data-table__pagination-rows-per-page-select.mdc-select--outlined .mdc-select__anchor :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch { + max-width: calc(100% - 56px); +} +.mdc-data-table__pagination-rows-per-page-select .mdc-deprecated-list-item { + height: 36px; +} + +.mdc-data-table__header-row-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::before, .mdc-data-table__header-row-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::after, +.mdc-data-table__row-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::before, +.mdc-data-table__row-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-data-table__header-row-checkbox.mdc-checkbox--selected:hover .mdc-checkbox__ripple::before, .mdc-data-table__header-row-checkbox.mdc-checkbox--selected.mdc-ripple-surface--hover .mdc-checkbox__ripple::before, +.mdc-data-table__row-checkbox.mdc-checkbox--selected:hover .mdc-checkbox__ripple::before, +.mdc-data-table__row-checkbox.mdc-checkbox--selected.mdc-ripple-surface--hover .mdc-checkbox__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-data-table__header-row-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded--background-focused .mdc-checkbox__ripple::before, .mdc-data-table__header-row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):focus .mdc-checkbox__ripple::before, +.mdc-data-table__row-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded--background-focused .mdc-checkbox__ripple::before, +.mdc-data-table__row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):focus .mdc-checkbox__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-data-table__header-row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded) .mdc-checkbox__ripple::after, +.mdc-data-table__row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded) .mdc-checkbox__ripple::after { + transition: opacity 150ms linear; +} +.mdc-data-table__header-row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):active .mdc-checkbox__ripple::after, +.mdc-data-table__row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):active .mdc-checkbox__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-data-table__header-row-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded, +.mdc-data-table__row-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-data-table__header-row-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::before, +.mdc-data-table__header-row-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::after, +.mdc-data-table__row-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::before, +.mdc-data-table__row-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-data-table__header-row-checkbox .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate=true]) ~ .mdc-checkbox__background, +.mdc-data-table__row-checkbox .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate=true]) ~ .mdc-checkbox__background { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; +} +.mdc-data-table__header-row-checkbox .mdc-checkbox__native-control:enabled:checked ~ .mdc-checkbox__background, +.mdc-data-table__header-row-checkbox .mdc-checkbox__native-control:enabled:indeterminate ~ .mdc-checkbox__background, +.mdc-data-table__header-row-checkbox .mdc-checkbox__native-control[data-indeterminate=true]:enabled ~ .mdc-checkbox__background, +.mdc-data-table__row-checkbox .mdc-checkbox__native-control:enabled:checked ~ .mdc-checkbox__background, +.mdc-data-table__row-checkbox .mdc-checkbox__native-control:enabled:indeterminate ~ .mdc-checkbox__background, +.mdc-data-table__row-checkbox .mdc-checkbox__native-control[data-indeterminate=true]:enabled ~ .mdc-checkbox__background { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); +} +@-webkit-keyframes mdc-checkbox-fade-in-background-8A000000FF6200EE00000000FF6200EE { + 0% { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; + } + 50% { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); + } +} +@keyframes mdc-checkbox-fade-in-background-8A000000FF6200EE00000000FF6200EE { + 0% { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; + } + 50% { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); + } +} +@-webkit-keyframes mdc-checkbox-fade-out-background-8A000000FF6200EE00000000FF6200EE { + 0%, 80% { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); + } + 100% { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; + } +} +@keyframes mdc-checkbox-fade-out-background-8A000000FF6200EE00000000FF6200EE { + 0%, 80% { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee)); + } + 100% { + border-color: rgba(0, 0, 0, 0.54); + /* @alternate */ + border-color: var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54)); + background-color: transparent; + } +} +.mdc-data-table__header-row-checkbox.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background, .mdc-data-table__header-row-checkbox.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background, +.mdc-data-table__row-checkbox.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background, +.mdc-data-table__row-checkbox.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background { + -webkit-animation-name: mdc-checkbox-fade-in-background-8A000000FF6200EE00000000FF6200EE; + animation-name: mdc-checkbox-fade-in-background-8A000000FF6200EE00000000FF6200EE; +} +.mdc-data-table__header-row-checkbox.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background, .mdc-data-table__header-row-checkbox.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background, +.mdc-data-table__row-checkbox.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background, +.mdc-data-table__row-checkbox.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__native-control:enabled ~ .mdc-checkbox__background { + -webkit-animation-name: mdc-checkbox-fade-out-background-8A000000FF6200EE00000000FF6200EE; + animation-name: mdc-checkbox-fade-out-background-8A000000FF6200EE00000000FF6200EE; +} + +.mdc-dialog, +.mdc-dialog__scrim { + position: fixed; + top: 0; + left: 0; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 100%; + height: 100%; +} + +.mdc-dialog { + display: none; + z-index: 7; + /* @alternate */ + z-index: var(--mdc-dialog-z-index, 7); +} +.mdc-dialog .mdc-dialog__surface { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); +} +.mdc-dialog .mdc-dialog__scrim { + background-color: rgba(0, 0, 0, 0.32); +} +.mdc-dialog .mdc-dialog__surface-scrim { + background-color: rgba(0, 0, 0, 0.32); +} +.mdc-dialog .mdc-dialog__title { + color: rgba(0, 0, 0, 0.87); +} +.mdc-dialog .mdc-dialog__content { + color: rgba(0, 0, 0, 0.6); +} +.mdc-dialog .mdc-dialog__close { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} +.mdc-dialog .mdc-dialog__close .mdc-icon-button__ripple::before, .mdc-dialog .mdc-dialog__close .mdc-icon-button__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-on-surface, #000)); +} +.mdc-dialog .mdc-dialog__close:hover .mdc-icon-button__ripple::before, .mdc-dialog .mdc-dialog__close.mdc-ripple-surface--hover .mdc-icon-button__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-dialog .mdc-dialog__close.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before, .mdc-dialog .mdc-dialog__close:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-dialog .mdc-dialog__close:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-dialog .mdc-dialog__close:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-dialog .mdc-dialog__close.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-dialog.mdc-dialog--scrollable .mdc-dialog__title, .mdc-dialog.mdc-dialog--scrollable .mdc-dialog__actions, .mdc-dialog.mdc-dialog--scrollable.mdc-dialog-scroll-divider-footer .mdc-dialog__actions { + border-color: rgba(0, 0, 0, 0.12); +} +.mdc-dialog.mdc-dialog--scrollable .mdc-dialog__title { + border-bottom: 1px solid rgba(0, 0, 0, 0.12); + margin-bottom: 0; +} +.mdc-dialog.mdc-dialog-scroll-divider-header.mdc-dialog--fullscreen .mdc-dialog__header { + /* @alternate */ + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} +.mdc-dialog .mdc-dialog__content { + padding: 20px 24px 20px 24px; +} +.mdc-dialog .mdc-dialog__surface { + min-width: 280px; +} +@media (max-width: 592px) { + .mdc-dialog .mdc-dialog__surface { + max-width: calc(100vw - 32px); + } +} +@media (min-width: 592px) { + .mdc-dialog .mdc-dialog__surface { + max-width: 560px; + } +} +.mdc-dialog .mdc-dialog__surface { + max-height: calc(100% - 32px); +} +@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { + .mdc-dialog .mdc-dialog__container { + /* stylelint-disable */ + /* stylelint-enable*/ + } +} +.mdc-dialog .mdc-dialog__surface { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-medium, 4px); +} +@media (max-width: 960px) and (max-height: 1440px) { + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface { + max-height: 560px; + max-width: 560px; + } + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close { + right: -12px; + } +} +@media (max-width: 720px) and (max-height: 1023px) and (max-width: 672px) { + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface { + max-width: calc(100vw - 112px); + } +} +@media (max-width: 720px) and (max-height: 1023px) and (min-width: 672px) { + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface { + max-width: 560px; + } +} +@media (max-width: 720px) and (max-height: 1023px) and (max-height: 720px) { + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface { + max-height: calc(100vh - 160px); + } +} +@media (max-width: 720px) and (max-height: 1023px) and (min-height: 720px) { + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface { + max-height: 560px; + } +} +@media (max-width: 720px) and (max-height: 1023px) { + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close { + right: -12px; + } +} +@media (max-width: 720px) and (max-height: 400px) { + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface { + height: 100%; + max-height: 100vh; + max-width: 100vw; + width: 100%; + border-radius: 0; + } + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close { + order: -1; + left: -12px; + } + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__header { + padding: 0 16px 9px; + justify-content: flex-start; + } + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__title { + margin-left: calc(16px - 2 * 12px); + } +} +@media (max-width: 600px) and (max-height: 960px) { + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface { + height: 100%; + max-height: 100vh; + max-width: 100vw; + width: 100vw; + border-radius: 0; + } + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close { + order: -1; + left: -12px; + } + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__header { + padding: 0 16px 9px; + justify-content: flex-start; + } + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__title { + margin-left: calc(16px - 2 * 12px); + } +} +@media (min-width: 960px) and (min-height: 1440px) { + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface { + max-width: calc(100vw - 400px); + } + .mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close { + right: -12px; + } +} +.mdc-dialog.mdc-dialog__scrim--hidden .mdc-dialog__scrim { + opacity: 0; +} + +.mdc-dialog__scrim { + opacity: 0; + z-index: -1; +} + +.mdc-dialog__container { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-around; + box-sizing: border-box; + height: 100%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + opacity: 0; + pointer-events: none; +} + +.mdc-dialog__surface { + /* @alternate */ + position: relative; + /* @alternate */ + box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12); + display: flex; + flex-direction: column; + flex-grow: 0; + flex-shrink: 0; + box-sizing: border-box; + max-width: 100%; + max-height: 100%; + pointer-events: auto; + overflow-y: auto; +} +.mdc-dialog__surface .mdc-elevation-overlay { + width: 100%; + height: 100%; + top: 0; + /* @noflip */ + left: 0; +} +[dir=rtl] .mdc-dialog__surface, .mdc-dialog__surface[dir=rtl] { + /* @noflip */ + text-align: right; +} + +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-dialog__surface { + outline: 2px solid windowText; + } +} +.mdc-dialog__surface::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 2px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} +@media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) { + .mdc-dialog__surface::before { + content: none; + } +} + +.mdc-dialog__title { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1.25rem; + /* @alternate */ + font-size: var(--mdc-typography-headline6-font-size, 1.25rem); + line-height: 2rem; + /* @alternate */ + line-height: var(--mdc-typography-headline6-line-height, 2rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-headline6-font-weight, 500); + letter-spacing: 0.0125em; + /* @alternate */ + letter-spacing: var(--mdc-typography-headline6-letter-spacing, 0.0125em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-headline6-text-decoration, inherit); + text-decoration: var(--mdc-typography-headline6-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-headline6-text-transform, inherit); + position: relative; + flex-shrink: 0; + box-sizing: border-box; + margin: 0 0 1px; + padding: 0 24px 9px; +} +.mdc-dialog__title::before { + display: inline-block; + width: 0; + height: 40px; + content: ""; + vertical-align: 0; +} +[dir=rtl] .mdc-dialog__title, .mdc-dialog__title[dir=rtl] { + /* @noflip */ + text-align: right; +} + +.mdc-dialog--scrollable .mdc-dialog__title { + margin-bottom: 1px; + padding-bottom: 15px; +} + +.mdc-dialog--fullscreen .mdc-dialog__header { + align-items: baseline; + border-bottom: 1px solid transparent; + display: inline-flex; + justify-content: space-between; + padding: 0 24px 9px; + z-index: 1; +} +.mdc-dialog--fullscreen .mdc-dialog__header .mdc-dialog__close { + right: -12px; +} +.mdc-dialog--fullscreen .mdc-dialog__title { + margin-bottom: 0; + padding: 0; + border-bottom: 0; +} +.mdc-dialog--fullscreen.mdc-dialog--scrollable .mdc-dialog__title { + border-bottom: 0; + margin-bottom: 0; +} +.mdc-dialog--fullscreen .mdc-dialog__close { + top: 5px; +} +.mdc-dialog--fullscreen.mdc-dialog--scrollable .mdc-dialog__actions { + border-top: 1px solid transparent; +} + +.mdc-dialog__content { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-body1-font-size, 1rem); + line-height: 1.5rem; + /* @alternate */ + line-height: var(--mdc-typography-body1-line-height, 1.5rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body1-font-weight, 400); + letter-spacing: 0.03125em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body1-letter-spacing, 0.03125em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body1-text-decoration, inherit); + text-decoration: var(--mdc-typography-body1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body1-text-transform, inherit); + flex-grow: 1; + box-sizing: border-box; + margin: 0; + overflow: auto; + -webkit-overflow-scrolling: touch; +} +.mdc-dialog__content > :first-child { + margin-top: 0; +} +.mdc-dialog__content > :last-child { + margin-bottom: 0; +} + +.mdc-dialog__title + .mdc-dialog__content, +.mdc-dialog__header + .mdc-dialog__content { + padding-top: 0; +} + +.mdc-dialog--scrollable .mdc-dialog__title + .mdc-dialog__content { + padding-top: 8px; + padding-bottom: 8px; +} + +.mdc-dialog__content .mdc-deprecated-list:first-child:last-child { + padding: 6px 0 0; +} + +.mdc-dialog--scrollable .mdc-dialog__content .mdc-deprecated-list:first-child:last-child { + padding: 0; +} + +.mdc-dialog__actions { + display: flex; + position: relative; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + box-sizing: border-box; + min-height: 52px; + margin: 0; + padding: 8px; + border-top: 1px solid transparent; +} +.mdc-dialog--stacked .mdc-dialog__actions { + flex-direction: column; + align-items: flex-end; +} + +.mdc-dialog__button { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 0; + max-width: 100%; + /* @noflip */ + text-align: right; +} +[dir=rtl] .mdc-dialog__button, .mdc-dialog__button[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 8px; +} + +.mdc-dialog__button:first-child { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0; +} +[dir=rtl] .mdc-dialog__button:first-child, .mdc-dialog__button:first-child[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0; +} + +[dir=rtl] .mdc-dialog__button, .mdc-dialog__button[dir=rtl] { + /* @noflip */ + text-align: left; +} + +.mdc-dialog--stacked .mdc-dialog__button:not(:first-child) { + margin-top: 12px; +} + +.mdc-dialog--open, +.mdc-dialog--opening, +.mdc-dialog--closing { + display: flex; +} + +.mdc-dialog--opening .mdc-dialog__scrim { + transition: opacity 150ms linear; +} +.mdc-dialog--opening .mdc-dialog__container { + transition: opacity 75ms linear, -webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 75ms linear, transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 75ms linear, transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1); +} + +.mdc-dialog--closing .mdc-dialog__scrim, +.mdc-dialog--closing .mdc-dialog__container { + transition: opacity 75ms linear; +} +.mdc-dialog--closing .mdc-dialog__container { + -webkit-transform: none; + transform: none; +} + +.mdc-dialog--open .mdc-dialog__scrim { + opacity: 1; +} +.mdc-dialog--open .mdc-dialog__container { + -webkit-transform: none; + transform: none; + opacity: 1; +} +.mdc-dialog--open.mdc-dialog__surface-scrim--shown .mdc-dialog__surface-scrim { + opacity: 1; + z-index: 1; +} +.mdc-dialog--open.mdc-dialog__surface-scrim--hiding .mdc-dialog__surface-scrim { + transition: opacity 75ms linear; +} +.mdc-dialog--open.mdc-dialog__surface-scrim--showing .mdc-dialog__surface-scrim { + transition: opacity 150ms linear; +} + +.mdc-dialog__surface-scrim { + display: none; + opacity: 0; + position: absolute; + width: 100%; + height: 100%; +} +.mdc-dialog__surface-scrim--shown .mdc-dialog__surface-scrim, .mdc-dialog__surface-scrim--showing .mdc-dialog__surface-scrim, .mdc-dialog__surface-scrim--hiding .mdc-dialog__surface-scrim { + display: block; +} + +.mdc-dialog-scroll-lock { + overflow: hidden; +} + +.mdc-drawer { + border-color: rgba(0, 0, 0, 0.12); + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); + /* @noflip */ + border-top-left-radius: 0; + /* @noflip */ + border-top-right-radius: 0; + /* @alternate */ + /* @noflip */ + border-top-right-radius: var(--mdc-shape-large, 0); + /* @noflip */ + border-bottom-right-radius: 0; + /* @alternate */ + /* @noflip */ + border-bottom-right-radius: var(--mdc-shape-large, 0); + /* @noflip */ + border-bottom-left-radius: 0; + z-index: 6; + width: 256px; + display: flex; + flex-direction: column; + flex-shrink: 0; + box-sizing: border-box; + height: 100%; + /* @noflip */ + border-right-width: 1px; + /* @noflip */ + border-right-style: solid; + overflow: hidden; + transition-property: -webkit-transform; + transition-property: transform; + transition-property: transform, -webkit-transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.mdc-drawer .mdc-drawer__title { + color: rgba(0, 0, 0, 0.87); +} +.mdc-drawer .mdc-deprecated-list-group__subheader { + color: rgba(0, 0, 0, 0.6); +} +.mdc-drawer .mdc-drawer__subtitle { + color: rgba(0, 0, 0, 0.6); +} +.mdc-drawer .mdc-deprecated-list-item__graphic { + color: rgba(0, 0, 0, 0.6); +} +.mdc-drawer .mdc-deprecated-list-item { + color: rgba(0, 0, 0, 0.87); +} +.mdc-drawer .mdc-deprecated-list-item--activated .mdc-deprecated-list-item__graphic { + color: #6200ee; +} +.mdc-drawer .mdc-deprecated-list-item--activated { + color: rgba(98, 0, 238, 0.87); +} +[dir=rtl] .mdc-drawer, .mdc-drawer[dir=rtl] { + /* @noflip */ + border-top-left-radius: 0; + /* @alternate */ + /* @noflip */ + border-top-left-radius: var(--mdc-shape-large, 0); + /* @noflip */ + border-top-right-radius: 0; + /* @noflip */ + border-bottom-right-radius: 0; + /* @noflip */ + border-bottom-left-radius: 0; + /* @alternate */ + /* @noflip */ + border-bottom-left-radius: var(--mdc-shape-large, 0); +} + +.mdc-drawer .mdc-deprecated-list-item { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); +} +.mdc-drawer.mdc-drawer--open:not(.mdc-drawer--closing) + .mdc-drawer-app-content { + /* @noflip */ + margin-left: 256px; + /* @noflip */ + margin-right: 0; +} +[dir=rtl] .mdc-drawer.mdc-drawer--open:not(.mdc-drawer--closing) + .mdc-drawer-app-content, .mdc-drawer.mdc-drawer--open:not(.mdc-drawer--closing) + .mdc-drawer-app-content[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 256px; +} + +[dir=rtl] .mdc-drawer, .mdc-drawer[dir=rtl] { + /* @noflip */ + border-right-width: 0; + /* @noflip */ + border-left-width: 1px; + /* @noflip */ + border-right-style: none; + /* @noflip */ + border-left-style: solid; +} + +.mdc-drawer .mdc-deprecated-list-item { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle2-font-size, 0.875rem); + line-height: 1.375rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle2-line-height, 1.375rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle2-font-weight, 500); + letter-spacing: 0.0071428571em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle2-text-transform, inherit); + height: calc(48px - 2 * 4px); + margin: 8px 8px; + padding: 0 8px; +} +.mdc-drawer .mdc-deprecated-list-item:nth-child(1) { + margin-top: 2px; +} +.mdc-drawer .mdc-deprecated-list-item:nth-last-child(1) { + margin-bottom: 0; +} +.mdc-drawer .mdc-deprecated-list-group__subheader { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin: 0; + padding: 0 16px; +} +.mdc-drawer .mdc-deprecated-list-group__subheader::before { + display: inline-block; + width: 0; + height: 24px; + content: ""; + vertical-align: 0; +} +.mdc-drawer .mdc-deprecated-list-divider { + margin: 3px 0 4px; +} +.mdc-drawer .mdc-deprecated-list-item__text, +.mdc-drawer .mdc-deprecated-list-item__graphic { + pointer-events: none; +} + +.mdc-drawer--animate { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} +[dir=rtl] .mdc-drawer--animate, .mdc-drawer--animate[dir=rtl] { + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.mdc-drawer--opening { + -webkit-transform: translateX(0); + transform: translateX(0); + transition-duration: 250ms; +} +[dir=rtl] .mdc-drawer--opening, .mdc-drawer--opening[dir=rtl] { + -webkit-transform: translateX(0); + transform: translateX(0); +} + +.mdc-drawer--closing { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + transition-duration: 200ms; +} +[dir=rtl] .mdc-drawer--closing, .mdc-drawer--closing[dir=rtl] { + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.mdc-drawer__header { + flex-shrink: 0; + box-sizing: border-box; + min-height: 64px; + padding: 0 16px 4px; +} + +.mdc-drawer__title { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1.25rem; + /* @alternate */ + font-size: var(--mdc-typography-headline6-font-size, 1.25rem); + line-height: 2rem; + /* @alternate */ + line-height: var(--mdc-typography-headline6-line-height, 2rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-headline6-font-weight, 500); + letter-spacing: 0.0125em; + /* @alternate */ + letter-spacing: var(--mdc-typography-headline6-letter-spacing, 0.0125em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-headline6-text-decoration, inherit); + text-decoration: var(--mdc-typography-headline6-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-headline6-text-transform, inherit); + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-drawer__title::before { + display: inline-block; + width: 0; + height: 36px; + content: ""; + vertical-align: 0; +} +.mdc-drawer__title::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} + +.mdc-drawer__subtitle { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: 0; +} +.mdc-drawer__subtitle::before { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: 0; +} + +.mdc-drawer__content { + height: 100%; + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} + +.mdc-drawer--dismissible { + /* @noflip */ + left: 0; + /* @noflip */ + right: initial; + display: none; + position: absolute; +} +[dir=rtl] .mdc-drawer--dismissible, .mdc-drawer--dismissible[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 0; +} + +.mdc-drawer--dismissible.mdc-drawer--open { + display: flex; +} + +.mdc-drawer-app-content { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0; + position: relative; +} +[dir=rtl] .mdc-drawer-app-content, .mdc-drawer-app-content[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0; +} + +.mdc-drawer--modal { + /* @alternate */ + box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); + /* @noflip */ + left: 0; + /* @noflip */ + right: initial; + display: none; + position: fixed; +} +.mdc-drawer--modal + .mdc-drawer-scrim { + background-color: rgba(0, 0, 0, 0.32); +} +[dir=rtl] .mdc-drawer--modal, .mdc-drawer--modal[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 0; +} + +.mdc-drawer--modal.mdc-drawer--open { + display: flex; +} + +.mdc-drawer-scrim { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 5; + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.mdc-drawer--open + .mdc-drawer-scrim { + display: block; +} +.mdc-drawer--animate + .mdc-drawer-scrim { + opacity: 0; +} +.mdc-drawer--opening + .mdc-drawer-scrim { + transition-duration: 250ms; + opacity: 1; +} +.mdc-drawer--closing + .mdc-drawer-scrim { + transition-duration: 200ms; + opacity: 0; +} + +.mdc-elevation--z0 { + /* @alternate */ + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z1 { + /* @alternate */ + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z2 { + /* @alternate */ + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z3 { + /* @alternate */ + box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z4 { + /* @alternate */ + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z5 { + /* @alternate */ + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14), 0px 1px 14px 0px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z6 { + /* @alternate */ + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z7 { + /* @alternate */ + box-shadow: 0px 4px 5px -2px rgba(0, 0, 0, 0.2), 0px 7px 10px 1px rgba(0, 0, 0, 0.14), 0px 2px 16px 1px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z8 { + /* @alternate */ + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z9 { + /* @alternate */ + box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.2), 0px 9px 12px 1px rgba(0, 0, 0, 0.14), 0px 3px 16px 2px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z10 { + /* @alternate */ + box-shadow: 0px 6px 6px -3px rgba(0, 0, 0, 0.2), 0px 10px 14px 1px rgba(0, 0, 0, 0.14), 0px 4px 18px 3px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z11 { + /* @alternate */ + box-shadow: 0px 6px 7px -4px rgba(0, 0, 0, 0.2), 0px 11px 15px 1px rgba(0, 0, 0, 0.14), 0px 4px 20px 3px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z12 { + /* @alternate */ + box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z13 { + /* @alternate */ + box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 13px 19px 2px rgba(0, 0, 0, 0.14), 0px 5px 24px 4px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z14 { + /* @alternate */ + box-shadow: 0px 7px 9px -4px rgba(0, 0, 0, 0.2), 0px 14px 21px 2px rgba(0, 0, 0, 0.14), 0px 5px 26px 4px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z15 { + /* @alternate */ + box-shadow: 0px 8px 9px -5px rgba(0, 0, 0, 0.2), 0px 15px 22px 2px rgba(0, 0, 0, 0.14), 0px 6px 28px 5px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z16 { + /* @alternate */ + box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z17 { + /* @alternate */ + box-shadow: 0px 8px 11px -5px rgba(0, 0, 0, 0.2), 0px 17px 26px 2px rgba(0, 0, 0, 0.14), 0px 6px 32px 5px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z18 { + /* @alternate */ + box-shadow: 0px 9px 11px -5px rgba(0, 0, 0, 0.2), 0px 18px 28px 2px rgba(0, 0, 0, 0.14), 0px 7px 34px 6px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z19 { + /* @alternate */ + box-shadow: 0px 9px 12px -6px rgba(0, 0, 0, 0.2), 0px 19px 29px 2px rgba(0, 0, 0, 0.14), 0px 7px 36px 6px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z20 { + /* @alternate */ + box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 20px 31px 3px rgba(0, 0, 0, 0.14), 0px 8px 38px 7px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z21 { + /* @alternate */ + box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 21px 33px 3px rgba(0, 0, 0, 0.14), 0px 8px 40px 7px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z22 { + /* @alternate */ + box-shadow: 0px 10px 14px -6px rgba(0, 0, 0, 0.2), 0px 22px 35px 3px rgba(0, 0, 0, 0.14), 0px 8px 42px 7px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z23 { + /* @alternate */ + box-shadow: 0px 11px 14px -7px rgba(0, 0, 0, 0.2), 0px 23px 36px 3px rgba(0, 0, 0, 0.14), 0px 9px 44px 8px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation--z24 { + /* @alternate */ + box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12); +} + +.mdc-elevation-transition { + transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1); + will-change: box-shadow; +} + +.mdc-fab { + /* @alternate */ + position: relative; + display: inline-flex; + position: relative; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 56px; + height: 56px; + padding: 0; + border: none; + fill: currentColor; + text-decoration: none; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-appearance: none; + -webkit-appearance: none; + overflow: visible; + transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), opacity 15ms linear 30ms, -webkit-transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), opacity 15ms linear 30ms, transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), opacity 15ms linear 30ms, transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1); +} +.mdc-fab .mdc-elevation-overlay { + width: 100%; + height: 100%; + top: 0; + /* @noflip */ + left: 0; +} +.mdc-fab::-moz-focus-inner { + padding: 0; + border: 0; +} +.mdc-fab:hover { + /* @alternate */ + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.mdc-fab.mdc-ripple-upgraded--background-focused, .mdc-fab:not(.mdc-ripple-upgraded):focus { + /* @alternate */ + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.mdc-fab:active, .mdc-fab:focus:active { + /* @alternate */ + box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); +} +.mdc-fab:active, .mdc-fab:focus { + outline: none; +} +.mdc-fab:hover { + cursor: pointer; +} +.mdc-fab > svg { + width: 100%; +} + +.mdc-fab--mini { + width: 40px; + height: 40px; +} + +.mdc-fab--extended { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-button-font-size, 0.875rem); + line-height: 2.25rem; + /* @alternate */ + line-height: var(--mdc-typography-button-line-height, 2.25rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-button-font-weight, 500); + letter-spacing: 0.0892857143em; + /* @alternate */ + letter-spacing: var(--mdc-typography-button-letter-spacing, 0.0892857143em); + text-decoration: none; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-button-text-decoration, none); + text-decoration: var(--mdc-typography-button-text-decoration, none); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-button-text-transform, uppercase); + border-radius: 24px; + /* @noflip */ + padding-left: 20px; + /* @noflip */ + padding-right: 20px; + width: auto; + max-width: 100%; + height: 48px; + /* @alternate */ + line-height: normal; +} +.mdc-fab--extended .mdc-fab__ripple { + border-radius: 24px; +} +.mdc-fab--extended .mdc-fab__icon { + /* @noflip */ + margin-left: calc(12px - 20px); + /* @noflip */ + margin-right: 12px; +} +[dir=rtl] .mdc-fab--extended .mdc-fab__icon, .mdc-fab--extended .mdc-fab__icon[dir=rtl] { + /* @noflip */ + margin-left: 12px; + /* @noflip */ + margin-right: calc(12px - 20px); +} + +.mdc-fab--extended .mdc-fab__label + .mdc-fab__icon { + /* @noflip */ + margin-left: 12px; + /* @noflip */ + margin-right: calc(12px - 20px); +} +[dir=rtl] .mdc-fab--extended .mdc-fab__label + .mdc-fab__icon, .mdc-fab--extended .mdc-fab__label + .mdc-fab__icon[dir=rtl] { + /* @noflip */ + margin-left: calc(12px - 20px); + /* @noflip */ + margin-right: 12px; +} + +.mdc-fab--touch { + margin-top: 4px; + margin-bottom: 4px; + margin-right: 4px; + margin-left: 4px; +} +.mdc-fab--touch .mdc-fab__touch { + position: absolute; + top: 50%; + height: 48px; + /* @noflip */ + left: 50%; + width: 48px; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.mdc-fab::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 1px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} + +.mdc-fab__label { + justify-content: flex-start; + text-overflow: ellipsis; + white-space: nowrap; + overflow-x: hidden; + overflow-y: visible; +} + +.mdc-fab__icon { + transition: -webkit-transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1); + transition: transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1); + transition: transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1); + fill: currentColor; + will-change: transform; +} + +.mdc-fab .mdc-fab__icon { + display: inline-flex; + align-items: center; + justify-content: center; +} + +.mdc-fab--exited { + -webkit-transform: scale(0); + transform: scale(0); + opacity: 0; + transition: opacity 15ms linear 150ms, -webkit-transform 180ms 0ms cubic-bezier(0.4, 0, 1, 1); + transition: opacity 15ms linear 150ms, transform 180ms 0ms cubic-bezier(0.4, 0, 1, 1); + transition: opacity 15ms linear 150ms, transform 180ms 0ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 180ms 0ms cubic-bezier(0.4, 0, 1, 1); +} +.mdc-fab--exited .mdc-fab__icon { + -webkit-transform: scale(0); + transform: scale(0); + transition: -webkit-transform 135ms 0ms cubic-bezier(0.4, 0, 1, 1); + transition: transform 135ms 0ms cubic-bezier(0.4, 0, 1, 1); + transition: transform 135ms 0ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 135ms 0ms cubic-bezier(0.4, 0, 1, 1); +} + +.mdc-fab { + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-theme-secondary, #018786); + /* @alternate */ + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); +} +.mdc-fab .mdc-fab__icon { + width: 24px; + height: 24px; + font-size: 24px; +} +.mdc-fab, .mdc-fab:not(:disabled) .mdc-fab__icon, .mdc-fab:not(:disabled) .mdc-fab__label, .mdc-fab:disabled .mdc-fab__icon, .mdc-fab:disabled .mdc-fab__label { + color: #fff; + /* @alternate */ + color: var(--mdc-theme-on-secondary, #fff); +} +.mdc-fab:not(.mdc-fab--extended) { + border-radius: 50%; +} +.mdc-fab:not(.mdc-fab--extended) .mdc-fab__ripple { + border-radius: 50%; +} + +.mdc-fab { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-fab .mdc-fab__ripple::before, +.mdc-fab .mdc-fab__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-fab .mdc-fab__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-fab .mdc-fab__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-fab.mdc-ripple-upgraded .mdc-fab__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-fab.mdc-ripple-upgraded .mdc-fab__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-fab.mdc-ripple-upgraded--unbounded .mdc-fab__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-fab.mdc-ripple-upgraded--foreground-activation .mdc-fab__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-fab.mdc-ripple-upgraded--foreground-deactivation .mdc-fab__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-fab .mdc-fab__ripple::before, +.mdc-fab .mdc-fab__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-fab.mdc-ripple-upgraded .mdc-fab__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-fab .mdc-fab__ripple::before, .mdc-fab .mdc-fab__ripple::after { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-on-secondary, #fff)); +} +.mdc-fab:hover .mdc-fab__ripple::before, .mdc-fab.mdc-ripple-surface--hover .mdc-fab__ripple::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.08); +} +.mdc-fab.mdc-ripple-upgraded--background-focused .mdc-fab__ripple::before, .mdc-fab:not(.mdc-ripple-upgraded):focus .mdc-fab__ripple::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +.mdc-fab:not(.mdc-ripple-upgraded) .mdc-fab__ripple::after { + transition: opacity 150ms linear; +} +.mdc-fab:not(.mdc-ripple-upgraded):active .mdc-fab__ripple::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-fab.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-fab .mdc-fab__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + overflow: hidden; +} +.mdc-fab { + z-index: 0; +} +.mdc-fab .mdc-fab__ripple::before, +.mdc-fab .mdc-fab__ripple::after { + z-index: -1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, -1); +} + +.mdc-form-field { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + color: rgba(0, 0, 0, 0.87); + /* @alternate */ + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); + display: inline-flex; + align-items: center; + vertical-align: middle; +} +.mdc-form-field > label { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: auto; + /* @noflip */ + padding-left: 4px; + /* @noflip */ + padding-right: 0; + order: 0; +} +[dir=rtl] .mdc-form-field > label, .mdc-form-field > label[dir=rtl] { + /* @noflip */ + margin-left: auto; + /* @noflip */ + margin-right: 0; +} + +[dir=rtl] .mdc-form-field > label, .mdc-form-field > label[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 4px; +} + +.mdc-form-field--nowrap > label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.mdc-form-field--align-end > label { + /* @noflip */ + margin-left: auto; + /* @noflip */ + margin-right: 0; + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 4px; + order: -1; +} +[dir=rtl] .mdc-form-field--align-end > label, .mdc-form-field--align-end > label[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: auto; +} + +[dir=rtl] .mdc-form-field--align-end > label, .mdc-form-field--align-end > label[dir=rtl] { + /* @noflip */ + padding-left: 4px; + /* @noflip */ + padding-right: 0; +} + +.mdc-form-field--space-between { + justify-content: space-between; +} +.mdc-form-field--space-between > label { + margin: 0; +} +[dir=rtl] .mdc-form-field--space-between > label, .mdc-form-field--space-between > label[dir=rtl] { + margin: 0; +} + +.mdc-icon-button { + display: inline-block; + position: relative; + box-sizing: border-box; + border: none; + outline: none; + background-color: transparent; + fill: currentColor; + color: inherit; + font-size: 24px; + text-decoration: none; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 48px; + height: 48px; + padding: 12px; +} +.mdc-icon-button svg, +.mdc-icon-button img { + width: 24px; + height: 24px; +} +.mdc-icon-button:disabled { + color: rgba(0, 0, 0, 0.38); + /* @alternate */ + color: var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38)); +} +.mdc-icon-button:disabled { + cursor: default; + pointer-events: none; +} +.mdc-icon-button .mdc-icon-button__touch { + position: absolute; + top: 50%; + height: 48px; + /* @noflip */ + left: 50%; + width: 48px; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.mdc-icon-button__icon { + display: inline-block; +} +.mdc-icon-button__icon.mdc-icon-button__icon--on { + display: none; +} + +.mdc-icon-button--on .mdc-icon-button__icon { + display: none; +} +.mdc-icon-button--on .mdc-icon-button__icon.mdc-icon-button__icon--on { + display: inline-block; +} + +.mdc-icon-button--touch { + margin-top: 0px; + margin-bottom: 0px; +} + +.mdc-icon-button { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-icon-button .mdc-icon-button__ripple::before, +.mdc-icon-button .mdc-icon-button__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-icon-button .mdc-icon-button__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-icon-button .mdc-icon-button__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-icon-button.mdc-ripple-upgraded--unbounded .mdc-icon-button__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-icon-button.mdc-ripple-upgraded--foreground-activation .mdc-icon-button__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-icon-button.mdc-ripple-upgraded--foreground-deactivation .mdc-icon-button__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-icon-button .mdc-icon-button__ripple::before, +.mdc-icon-button .mdc-icon-button__ripple::after { + top: calc(50% - 50%); + /* @noflip */ + left: calc(50% - 50%); + width: 100%; + height: 100%; +} +.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::before, +.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::after { + top: var(--mdc-ripple-top, calc(50% - 50%)); + /* @noflip */ + left: var(--mdc-ripple-left, calc(50% - 50%)); + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-icon-button .mdc-icon-button__ripple::before, .mdc-icon-button .mdc-icon-button__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +.mdc-icon-button:hover .mdc-icon-button__ripple::before, .mdc-icon-button.mdc-ripple-surface--hover .mdc-icon-button__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-icon-button.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before, .mdc-icon-button:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-icon-button:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-icon-button:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-icon-button.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-icon-button .mdc-icon-button__ripple { + pointer-events: none; + z-index: 1; +} + +.mdc-image-list { + display: flex; + flex-wrap: wrap; + margin: 0 auto; + padding: 0; +} + +.mdc-image-list__item, +.mdc-image-list__image-aspect-container { + position: relative; + box-sizing: border-box; +} + +.mdc-image-list__item { + list-style-type: none; +} + +.mdc-image-list__image { + width: 100%; +} + +.mdc-image-list__image-aspect-container .mdc-image-list__image { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + height: 100%; + background-repeat: no-repeat; + background-position: center; + background-size: cover; +} + +.mdc-image-list__image-aspect-container { + padding-bottom: calc(100% / 1); +} + +.mdc-image-list__image { + border-radius: 0; +} + +.mdc-image-list--with-text-protection .mdc-image-list__supporting { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.mdc-image-list__supporting { + color: rgba(0, 0, 0, 0.87); + /* @alternate */ + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); + display: flex; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + padding: 8px 0; + line-height: 24px; +} + +.mdc-image-list__label { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + line-height: 1.75rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle1-line-height, 1.75rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.mdc-image-list--with-text-protection .mdc-image-list__supporting { + position: absolute; + bottom: 0; + width: 100%; + height: 48px; + padding: 0 16px; + background: rgba(0, 0, 0, 0.6); + color: #fff; +} + +.mdc-image-list--masonry { + display: block; +} +.mdc-image-list--masonry .mdc-image-list__item { + -webkit-column-break-inside: avoid; + break-inside: avoid-column; +} +.mdc-image-list--masonry .mdc-image-list__image { + display: block; + height: auto; +} + +:root { + --mdc-layout-grid-margin-desktop: 24px; + --mdc-layout-grid-gutter-desktop: 24px; + --mdc-layout-grid-column-width-desktop: 72px; + --mdc-layout-grid-margin-tablet: 16px; + --mdc-layout-grid-gutter-tablet: 16px; + --mdc-layout-grid-column-width-tablet: 72px; + --mdc-layout-grid-margin-phone: 16px; + --mdc-layout-grid-gutter-phone: 16px; + --mdc-layout-grid-column-width-phone: 72px; +} + +@media (min-width: 840px) { + .mdc-layout-grid { + box-sizing: border-box; + margin: 0 auto; + padding: 24px; + padding: var(--mdc-layout-grid-margin-desktop, 24px); + } +} +@media (min-width: 600px) and (max-width: 839px) { + .mdc-layout-grid { + box-sizing: border-box; + margin: 0 auto; + padding: 16px; + padding: var(--mdc-layout-grid-margin-tablet, 16px); + } +} +@media (max-width: 599px) { + .mdc-layout-grid { + box-sizing: border-box; + margin: 0 auto; + padding: 16px; + padding: var(--mdc-layout-grid-margin-phone, 16px); + } +} + +@media (min-width: 840px) { + .mdc-layout-grid__inner { + display: flex; + flex-flow: row wrap; + align-items: stretch; + margin: -12px; + margin: calc(var(--mdc-layout-grid-gutter-desktop, 24px) / 2 * -1); + } + @supports (display: grid) { + .mdc-layout-grid__inner { + display: grid; + margin: 0; + grid-gap: 24px; + grid-gap: var(--mdc-layout-grid-gutter-desktop, 24px); + grid-template-columns: repeat(12, minmax(0, 1fr)); + } + } +} +@media (min-width: 600px) and (max-width: 839px) { + .mdc-layout-grid__inner { + display: flex; + flex-flow: row wrap; + align-items: stretch; + margin: -8px; + margin: calc(var(--mdc-layout-grid-gutter-tablet, 16px) / 2 * -1); + } + @supports (display: grid) { + .mdc-layout-grid__inner { + display: grid; + margin: 0; + grid-gap: 16px; + grid-gap: var(--mdc-layout-grid-gutter-tablet, 16px); + grid-template-columns: repeat(8, minmax(0, 1fr)); + } + } +} +@media (max-width: 599px) { + .mdc-layout-grid__inner { + display: flex; + flex-flow: row wrap; + align-items: stretch; + margin: -8px; + margin: calc(var(--mdc-layout-grid-gutter-phone, 16px) / 2 * -1); + } + @supports (display: grid) { + .mdc-layout-grid__inner { + display: grid; + margin: 0; + grid-gap: 16px; + grid-gap: var(--mdc-layout-grid-gutter-phone, 16px); + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + } +} + +@media (min-width: 840px) { + .mdc-layout-grid__cell { + width: calc(33.3333333333% - 24px); + width: calc(33.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px)); + box-sizing: border-box; + margin: 12px; + margin: calc(var(--mdc-layout-grid-gutter-desktop, 24px) / 2); + } + @supports (display: grid) { + .mdc-layout-grid__cell { + width: auto; + grid-column-end: span 4; + } + } + @supports (display: grid) { + .mdc-layout-grid__cell { + margin: 0; + } + } + .mdc-layout-grid__cell--span-1, +.mdc-layout-grid__cell--span-1-desktop { + width: calc(8.3333333333% - 24px); + width: calc(8.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-1, +.mdc-layout-grid__cell--span-1-desktop { + width: auto; + grid-column-end: span 1; + } + } + + .mdc-layout-grid__cell--span-2, +.mdc-layout-grid__cell--span-2-desktop { + width: calc(16.6666666667% - 24px); + width: calc(16.6666666667% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-2, +.mdc-layout-grid__cell--span-2-desktop { + width: auto; + grid-column-end: span 2; + } + } + + .mdc-layout-grid__cell--span-3, +.mdc-layout-grid__cell--span-3-desktop { + width: calc(25% - 24px); + width: calc(25% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-3, +.mdc-layout-grid__cell--span-3-desktop { + width: auto; + grid-column-end: span 3; + } + } + + .mdc-layout-grid__cell--span-4, +.mdc-layout-grid__cell--span-4-desktop { + width: calc(33.3333333333% - 24px); + width: calc(33.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-4, +.mdc-layout-grid__cell--span-4-desktop { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-5, +.mdc-layout-grid__cell--span-5-desktop { + width: calc(41.6666666667% - 24px); + width: calc(41.6666666667% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-5, +.mdc-layout-grid__cell--span-5-desktop { + width: auto; + grid-column-end: span 5; + } + } + + .mdc-layout-grid__cell--span-6, +.mdc-layout-grid__cell--span-6-desktop { + width: calc(50% - 24px); + width: calc(50% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-6, +.mdc-layout-grid__cell--span-6-desktop { + width: auto; + grid-column-end: span 6; + } + } + + .mdc-layout-grid__cell--span-7, +.mdc-layout-grid__cell--span-7-desktop { + width: calc(58.3333333333% - 24px); + width: calc(58.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-7, +.mdc-layout-grid__cell--span-7-desktop { + width: auto; + grid-column-end: span 7; + } + } + + .mdc-layout-grid__cell--span-8, +.mdc-layout-grid__cell--span-8-desktop { + width: calc(66.6666666667% - 24px); + width: calc(66.6666666667% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-8, +.mdc-layout-grid__cell--span-8-desktop { + width: auto; + grid-column-end: span 8; + } + } + + .mdc-layout-grid__cell--span-9, +.mdc-layout-grid__cell--span-9-desktop { + width: calc(75% - 24px); + width: calc(75% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-9, +.mdc-layout-grid__cell--span-9-desktop { + width: auto; + grid-column-end: span 9; + } + } + + .mdc-layout-grid__cell--span-10, +.mdc-layout-grid__cell--span-10-desktop { + width: calc(83.3333333333% - 24px); + width: calc(83.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-10, +.mdc-layout-grid__cell--span-10-desktop { + width: auto; + grid-column-end: span 10; + } + } + + .mdc-layout-grid__cell--span-11, +.mdc-layout-grid__cell--span-11-desktop { + width: calc(91.6666666667% - 24px); + width: calc(91.6666666667% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-11, +.mdc-layout-grid__cell--span-11-desktop { + width: auto; + grid-column-end: span 11; + } + } + + .mdc-layout-grid__cell--span-12, +.mdc-layout-grid__cell--span-12-desktop { + width: calc(100% - 24px); + width: calc(100% - var(--mdc-layout-grid-gutter-desktop, 24px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-12, +.mdc-layout-grid__cell--span-12-desktop { + width: auto; + grid-column-end: span 12; + } + } +} +@media (min-width: 600px) and (max-width: 839px) { + .mdc-layout-grid__cell { + width: calc(50% - 16px); + width: calc(50% - var(--mdc-layout-grid-gutter-tablet, 16px)); + box-sizing: border-box; + margin: 8px; + margin: calc(var(--mdc-layout-grid-gutter-tablet, 16px) / 2); + } + @supports (display: grid) { + .mdc-layout-grid__cell { + width: auto; + grid-column-end: span 4; + } + } + @supports (display: grid) { + .mdc-layout-grid__cell { + margin: 0; + } + } + .mdc-layout-grid__cell--span-1, +.mdc-layout-grid__cell--span-1-tablet { + width: calc(12.5% - 16px); + width: calc(12.5% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-1, +.mdc-layout-grid__cell--span-1-tablet { + width: auto; + grid-column-end: span 1; + } + } + + .mdc-layout-grid__cell--span-2, +.mdc-layout-grid__cell--span-2-tablet { + width: calc(25% - 16px); + width: calc(25% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-2, +.mdc-layout-grid__cell--span-2-tablet { + width: auto; + grid-column-end: span 2; + } + } + + .mdc-layout-grid__cell--span-3, +.mdc-layout-grid__cell--span-3-tablet { + width: calc(37.5% - 16px); + width: calc(37.5% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-3, +.mdc-layout-grid__cell--span-3-tablet { + width: auto; + grid-column-end: span 3; + } + } + + .mdc-layout-grid__cell--span-4, +.mdc-layout-grid__cell--span-4-tablet { + width: calc(50% - 16px); + width: calc(50% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-4, +.mdc-layout-grid__cell--span-4-tablet { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-5, +.mdc-layout-grid__cell--span-5-tablet { + width: calc(62.5% - 16px); + width: calc(62.5% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-5, +.mdc-layout-grid__cell--span-5-tablet { + width: auto; + grid-column-end: span 5; + } + } + + .mdc-layout-grid__cell--span-6, +.mdc-layout-grid__cell--span-6-tablet { + width: calc(75% - 16px); + width: calc(75% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-6, +.mdc-layout-grid__cell--span-6-tablet { + width: auto; + grid-column-end: span 6; + } + } + + .mdc-layout-grid__cell--span-7, +.mdc-layout-grid__cell--span-7-tablet { + width: calc(87.5% - 16px); + width: calc(87.5% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-7, +.mdc-layout-grid__cell--span-7-tablet { + width: auto; + grid-column-end: span 7; + } + } + + .mdc-layout-grid__cell--span-8, +.mdc-layout-grid__cell--span-8-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-8, +.mdc-layout-grid__cell--span-8-tablet { + width: auto; + grid-column-end: span 8; + } + } + + .mdc-layout-grid__cell--span-9, +.mdc-layout-grid__cell--span-9-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-9, +.mdc-layout-grid__cell--span-9-tablet { + width: auto; + grid-column-end: span 8; + } + } + + .mdc-layout-grid__cell--span-10, +.mdc-layout-grid__cell--span-10-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-10, +.mdc-layout-grid__cell--span-10-tablet { + width: auto; + grid-column-end: span 8; + } + } + + .mdc-layout-grid__cell--span-11, +.mdc-layout-grid__cell--span-11-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-11, +.mdc-layout-grid__cell--span-11-tablet { + width: auto; + grid-column-end: span 8; + } + } + + .mdc-layout-grid__cell--span-12, +.mdc-layout-grid__cell--span-12-tablet { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-12, +.mdc-layout-grid__cell--span-12-tablet { + width: auto; + grid-column-end: span 8; + } + } +} +@media (max-width: 599px) { + .mdc-layout-grid__cell { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + box-sizing: border-box; + margin: 8px; + margin: calc(var(--mdc-layout-grid-gutter-phone, 16px) / 2); + } + @supports (display: grid) { + .mdc-layout-grid__cell { + width: auto; + grid-column-end: span 4; + } + } + @supports (display: grid) { + .mdc-layout-grid__cell { + margin: 0; + } + } + .mdc-layout-grid__cell--span-1, +.mdc-layout-grid__cell--span-1-phone { + width: calc(25% - 16px); + width: calc(25% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-1, +.mdc-layout-grid__cell--span-1-phone { + width: auto; + grid-column-end: span 1; + } + } + + .mdc-layout-grid__cell--span-2, +.mdc-layout-grid__cell--span-2-phone { + width: calc(50% - 16px); + width: calc(50% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-2, +.mdc-layout-grid__cell--span-2-phone { + width: auto; + grid-column-end: span 2; + } + } + + .mdc-layout-grid__cell--span-3, +.mdc-layout-grid__cell--span-3-phone { + width: calc(75% - 16px); + width: calc(75% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-3, +.mdc-layout-grid__cell--span-3-phone { + width: auto; + grid-column-end: span 3; + } + } + + .mdc-layout-grid__cell--span-4, +.mdc-layout-grid__cell--span-4-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-4, +.mdc-layout-grid__cell--span-4-phone { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-5, +.mdc-layout-grid__cell--span-5-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-5, +.mdc-layout-grid__cell--span-5-phone { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-6, +.mdc-layout-grid__cell--span-6-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-6, +.mdc-layout-grid__cell--span-6-phone { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-7, +.mdc-layout-grid__cell--span-7-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-7, +.mdc-layout-grid__cell--span-7-phone { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-8, +.mdc-layout-grid__cell--span-8-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-8, +.mdc-layout-grid__cell--span-8-phone { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-9, +.mdc-layout-grid__cell--span-9-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-9, +.mdc-layout-grid__cell--span-9-phone { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-10, +.mdc-layout-grid__cell--span-10-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-10, +.mdc-layout-grid__cell--span-10-phone { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-11, +.mdc-layout-grid__cell--span-11-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-11, +.mdc-layout-grid__cell--span-11-phone { + width: auto; + grid-column-end: span 4; + } + } + + .mdc-layout-grid__cell--span-12, +.mdc-layout-grid__cell--span-12-phone { + width: calc(100% - 16px); + width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); + } + @supports (display: grid) { + .mdc-layout-grid__cell--span-12, +.mdc-layout-grid__cell--span-12-phone { + width: auto; + grid-column-end: span 4; + } + } +} +.mdc-layout-grid__cell--order-1 { + order: 1; +} +.mdc-layout-grid__cell--order-2 { + order: 2; +} +.mdc-layout-grid__cell--order-3 { + order: 3; +} +.mdc-layout-grid__cell--order-4 { + order: 4; +} +.mdc-layout-grid__cell--order-5 { + order: 5; +} +.mdc-layout-grid__cell--order-6 { + order: 6; +} +.mdc-layout-grid__cell--order-7 { + order: 7; +} +.mdc-layout-grid__cell--order-8 { + order: 8; +} +.mdc-layout-grid__cell--order-9 { + order: 9; +} +.mdc-layout-grid__cell--order-10 { + order: 10; +} +.mdc-layout-grid__cell--order-11 { + order: 11; +} +.mdc-layout-grid__cell--order-12 { + order: 12; +} +.mdc-layout-grid__cell--align-top { + align-self: flex-start; +} +@supports (display: grid) { + .mdc-layout-grid__cell--align-top { + align-self: start; + } +} +.mdc-layout-grid__cell--align-middle { + align-self: center; +} +.mdc-layout-grid__cell--align-bottom { + align-self: flex-end; +} +@supports (display: grid) { + .mdc-layout-grid__cell--align-bottom { + align-self: end; + } +} + +@media (min-width: 840px) { + .mdc-layout-grid--fixed-column-width { + width: 1176px; + width: calc( var(--mdc-layout-grid-column-width-desktop, 72px) * 12 + var(--mdc-layout-grid-gutter-desktop, 24px) * 11 + var(--mdc-layout-grid-margin-desktop, 24px) * 2 ); + } +} +@media (min-width: 600px) and (max-width: 839px) { + .mdc-layout-grid--fixed-column-width { + width: 720px; + width: calc( var(--mdc-layout-grid-column-width-tablet, 72px) * 8 + var(--mdc-layout-grid-gutter-tablet, 16px) * 7 + var(--mdc-layout-grid-margin-tablet, 16px) * 2 ); + } +} +@media (max-width: 599px) { + .mdc-layout-grid--fixed-column-width { + width: 368px; + width: calc( var(--mdc-layout-grid-column-width-phone, 72px) * 4 + var(--mdc-layout-grid-gutter-phone, 16px) * 3 + var(--mdc-layout-grid-margin-phone, 16px) * 2 ); + } +} + +.mdc-layout-grid--align-left { + margin-right: auto; + margin-left: 0; +} + +.mdc-layout-grid--align-right { + margin-right: 0; + margin-left: auto; +} + +@-webkit-keyframes mdc-linear-progress-primary-indeterminate-translate { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(0); + transform: translateX(0); + } + 59.15% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(83.67142%); + transform: translateX(83.67142%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-primary-half, 83.67142%)); + transform: translateX(var(--mdc-linear-progress-primary-half, 83.67142%)); + } + 100% { + -webkit-transform: translateX(200.611057%); + transform: translateX(200.611057%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-primary-full, 200.611057%)); + transform: translateX(var(--mdc-linear-progress-primary-full, 200.611057%)); + } +} + +@keyframes mdc-linear-progress-primary-indeterminate-translate { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(0); + transform: translateX(0); + } + 59.15% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(83.67142%); + transform: translateX(83.67142%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-primary-half, 83.67142%)); + transform: translateX(var(--mdc-linear-progress-primary-half, 83.67142%)); + } + 100% { + -webkit-transform: translateX(200.611057%); + transform: translateX(200.611057%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-primary-full, 200.611057%)); + transform: translateX(var(--mdc-linear-progress-primary-full, 200.611057%)); + } +} +@-webkit-keyframes mdc-linear-progress-primary-indeterminate-scale { + 0% { + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } + 36.65% { + -webkit-animation-timing-function: cubic-bezier(0.334731, 0.12482, 0.785844, 1); + animation-timing-function: cubic-bezier(0.334731, 0.12482, 0.785844, 1); + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } + 69.15% { + -webkit-animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1); + animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1); + -webkit-transform: scaleX(0.661479); + transform: scaleX(0.661479); + } + 100% { + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } +} +@keyframes mdc-linear-progress-primary-indeterminate-scale { + 0% { + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } + 36.65% { + -webkit-animation-timing-function: cubic-bezier(0.334731, 0.12482, 0.785844, 1); + animation-timing-function: cubic-bezier(0.334731, 0.12482, 0.785844, 1); + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } + 69.15% { + -webkit-animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1); + animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1); + -webkit-transform: scaleX(0.661479); + transform: scaleX(0.661479); + } + 100% { + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } +} +@-webkit-keyframes mdc-linear-progress-secondary-indeterminate-translate { + 0% { + -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685); + animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685); + -webkit-transform: translateX(0); + transform: translateX(0); + } + 25% { + -webkit-animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712); + animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712); + -webkit-transform: translateX(37.651913%); + transform: translateX(37.651913%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-quarter, 37.651913%)); + transform: translateX(var(--mdc-linear-progress-secondary-quarter, 37.651913%)); + } + 48.35% { + -webkit-animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026); + animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026); + -webkit-transform: translateX(84.386165%); + transform: translateX(84.386165%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-half, 84.386165%)); + transform: translateX(var(--mdc-linear-progress-secondary-half, 84.386165%)); + } + 100% { + -webkit-transform: translateX(160.277782%); + transform: translateX(160.277782%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-full, 160.277782%)); + transform: translateX(var(--mdc-linear-progress-secondary-full, 160.277782%)); + } +} +@keyframes mdc-linear-progress-secondary-indeterminate-translate { + 0% { + -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685); + animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685); + -webkit-transform: translateX(0); + transform: translateX(0); + } + 25% { + -webkit-animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712); + animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712); + -webkit-transform: translateX(37.651913%); + transform: translateX(37.651913%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-quarter, 37.651913%)); + transform: translateX(var(--mdc-linear-progress-secondary-quarter, 37.651913%)); + } + 48.35% { + -webkit-animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026); + animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026); + -webkit-transform: translateX(84.386165%); + transform: translateX(84.386165%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-half, 84.386165%)); + transform: translateX(var(--mdc-linear-progress-secondary-half, 84.386165%)); + } + 100% { + -webkit-transform: translateX(160.277782%); + transform: translateX(160.277782%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-full, 160.277782%)); + transform: translateX(var(--mdc-linear-progress-secondary-full, 160.277782%)); + } +} +@-webkit-keyframes mdc-linear-progress-secondary-indeterminate-scale { + 0% { + -webkit-animation-timing-function: cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971); + animation-timing-function: cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971); + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } + 19.15% { + -webkit-animation-timing-function: cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315); + animation-timing-function: cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315); + -webkit-transform: scaleX(0.457104); + transform: scaleX(0.457104); + } + 44.15% { + -webkit-animation-timing-function: cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179); + animation-timing-function: cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179); + -webkit-transform: scaleX(0.72796); + transform: scaleX(0.72796); + } + 100% { + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } +} +@keyframes mdc-linear-progress-secondary-indeterminate-scale { + 0% { + -webkit-animation-timing-function: cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971); + animation-timing-function: cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971); + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } + 19.15% { + -webkit-animation-timing-function: cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315); + animation-timing-function: cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315); + -webkit-transform: scaleX(0.457104); + transform: scaleX(0.457104); + } + 44.15% { + -webkit-animation-timing-function: cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179); + animation-timing-function: cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179); + -webkit-transform: scaleX(0.72796); + transform: scaleX(0.72796); + } + 100% { + -webkit-transform: scaleX(0.08); + transform: scaleX(0.08); + } +} +@-webkit-keyframes mdc-linear-progress-buffering { + from { + -webkit-transform: rotate(180deg) translateX(-10px); + transform: rotate(180deg) translateX(-10px); + } +} +@keyframes mdc-linear-progress-buffering { + from { + -webkit-transform: rotate(180deg) translateX(-10px); + transform: rotate(180deg) translateX(-10px); + } +} +@-webkit-keyframes mdc-linear-progress-primary-indeterminate-translate-reverse { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(0); + transform: translateX(0); + } + 59.15% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(-83.67142%); + transform: translateX(-83.67142%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-primary-half-neg, -83.67142%)); + transform: translateX(var(--mdc-linear-progress-primary-half-neg, -83.67142%)); + } + 100% { + -webkit-transform: translateX(-200.611057%); + transform: translateX(-200.611057%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-primary-full-neg, -200.611057%)); + transform: translateX(var(--mdc-linear-progress-primary-full-neg, -200.611057%)); + } +} +@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(0); + transform: translateX(0); + } + 59.15% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(-83.67142%); + transform: translateX(-83.67142%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-primary-half-neg, -83.67142%)); + transform: translateX(var(--mdc-linear-progress-primary-half-neg, -83.67142%)); + } + 100% { + -webkit-transform: translateX(-200.611057%); + transform: translateX(-200.611057%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-primary-full-neg, -200.611057%)); + transform: translateX(var(--mdc-linear-progress-primary-full-neg, -200.611057%)); + } +} +@-webkit-keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse { + 0% { + -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685); + animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685); + -webkit-transform: translateX(0); + transform: translateX(0); + } + 25% { + -webkit-animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712); + animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712); + -webkit-transform: translateX(-37.651913%); + transform: translateX(-37.651913%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-quarter-neg, -37.651913%)); + transform: translateX(var(--mdc-linear-progress-secondary-quarter-neg, -37.651913%)); + } + 48.35% { + -webkit-animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026); + animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026); + -webkit-transform: translateX(-84.386165%); + transform: translateX(-84.386165%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-half-neg, -84.386165%)); + transform: translateX(var(--mdc-linear-progress-secondary-half-neg, -84.386165%)); + } + 100% { + -webkit-transform: translateX(-160.277782%); + transform: translateX(-160.277782%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-full-neg, -160.277782%)); + transform: translateX(var(--mdc-linear-progress-secondary-full-neg, -160.277782%)); + } +} +@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse { + 0% { + -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685); + animation-timing-function: cubic-bezier(0.15, 0, 0.515058, 0.409685); + -webkit-transform: translateX(0); + transform: translateX(0); + } + 25% { + -webkit-animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712); + animation-timing-function: cubic-bezier(0.31033, 0.284058, 0.8, 0.733712); + -webkit-transform: translateX(-37.651913%); + transform: translateX(-37.651913%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-quarter-neg, -37.651913%)); + transform: translateX(var(--mdc-linear-progress-secondary-quarter-neg, -37.651913%)); + } + 48.35% { + -webkit-animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026); + animation-timing-function: cubic-bezier(0.4, 0.627035, 0.6, 0.902026); + -webkit-transform: translateX(-84.386165%); + transform: translateX(-84.386165%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-half-neg, -84.386165%)); + transform: translateX(var(--mdc-linear-progress-secondary-half-neg, -84.386165%)); + } + 100% { + -webkit-transform: translateX(-160.277782%); + transform: translateX(-160.277782%); + /* @alternate */ + -webkit-transform: translateX(var(--mdc-linear-progress-secondary-full-neg, -160.277782%)); + transform: translateX(var(--mdc-linear-progress-secondary-full-neg, -160.277782%)); + } +} +@-webkit-keyframes mdc-linear-progress-buffering-reverse { + from { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } +} +@keyframes mdc-linear-progress-buffering-reverse { + from { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } +} +.mdc-linear-progress { + position: relative; + width: 100%; + height: 4px; + -webkit-transform: translateZ(0); + transform: translateZ(0); + outline: 1px solid transparent; + overflow: hidden; + transition: opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} +.mdc-linear-progress__bar { + position: absolute; + width: 100%; + height: 100%; + -webkit-animation: none; + animation: none; + -webkit-transform-origin: top left; + transform-origin: top left; + transition: -webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} +.mdc-linear-progress__bar-inner { + display: inline-block; + position: absolute; + width: 100%; + -webkit-animation: none; + animation: none; + border-top: 4px solid; +} +.mdc-linear-progress__buffer { + display: flex; + position: absolute; + width: 100%; + height: 100%; +} +.mdc-linear-progress__buffer-dots { + background-repeat: repeat-x; + background-size: 10px 4px; + flex: auto; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + -webkit-animation: mdc-linear-progress-buffering 250ms infinite linear; + animation: mdc-linear-progress-buffering 250ms infinite linear; +} +.mdc-linear-progress__buffer-bar { + flex: 0 1 100%; + transition: flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} +.mdc-linear-progress__primary-bar { + -webkit-transform: scaleX(0); + transform: scaleX(0); +} +.mdc-linear-progress__secondary-bar { + display: none; +} +.mdc-linear-progress--indeterminate .mdc-linear-progress__bar { + transition: none; +} +.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar { + left: -145.166611%; +} +.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar { + left: -54.888891%; + display: block; +} +.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar { + -webkit-animation: mdc-linear-progress-primary-indeterminate-translate 2s infinite linear; + animation: mdc-linear-progress-primary-indeterminate-translate 2s infinite linear; +} +.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar > .mdc-linear-progress__bar-inner { + -webkit-animation: mdc-linear-progress-primary-indeterminate-scale 2s infinite linear; + animation: mdc-linear-progress-primary-indeterminate-scale 2s infinite linear; +} +.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar { + -webkit-animation: mdc-linear-progress-secondary-indeterminate-translate 2s infinite linear; + animation: mdc-linear-progress-secondary-indeterminate-translate 2s infinite linear; +} +.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar > .mdc-linear-progress__bar-inner { + -webkit-animation: mdc-linear-progress-secondary-indeterminate-scale 2s infinite linear; + animation: mdc-linear-progress-secondary-indeterminate-scale 2s infinite linear; +} +[dir=rtl] .mdc-linear-progress:not([dir=ltr]) .mdc-linear-progress__bar, .mdc-linear-progress[dir=rtl]:not([dir=ltr]) .mdc-linear-progress__bar { + /* @noflip */ + right: 0; + /* @noflip */ + -webkit-transform-origin: center right; + /* @noflip */ + transform-origin: center right; +} +[dir=rtl] .mdc-linear-progress:not([dir=ltr]).mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar, .mdc-linear-progress[dir=rtl]:not([dir=ltr]).mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar { + -webkit-animation-name: mdc-linear-progress-primary-indeterminate-translate-reverse; + animation-name: mdc-linear-progress-primary-indeterminate-translate-reverse; +} +[dir=rtl] .mdc-linear-progress:not([dir=ltr]).mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar, .mdc-linear-progress[dir=rtl]:not([dir=ltr]).mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar { + -webkit-animation-name: mdc-linear-progress-secondary-indeterminate-translate-reverse; + animation-name: mdc-linear-progress-secondary-indeterminate-translate-reverse; +} +[dir=rtl] .mdc-linear-progress:not([dir=ltr]) .mdc-linear-progress__buffer-dots, .mdc-linear-progress[dir=rtl]:not([dir=ltr]) .mdc-linear-progress__buffer-dots { + -webkit-animation: mdc-linear-progress-buffering-reverse 250ms infinite linear; + animation: mdc-linear-progress-buffering-reverse 250ms infinite linear; + -webkit-transform: rotate(0); + transform: rotate(0); +} +[dir=rtl] .mdc-linear-progress:not([dir=ltr]).mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar, .mdc-linear-progress[dir=rtl]:not([dir=ltr]).mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar { + /* @noflip */ + right: -145.166611%; + /* @noflip */ + left: auto; +} +[dir=rtl] .mdc-linear-progress:not([dir=ltr]).mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar, .mdc-linear-progress[dir=rtl]:not([dir=ltr]).mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar { + /* @noflip */ + right: -54.888891%; + /* @noflip */ + left: auto; +} + +.mdc-linear-progress--closed { + opacity: 0; +} +.mdc-linear-progress--closed-animation-off .mdc-linear-progress__buffer-dots { + -webkit-animation: none; + animation: none; +} +.mdc-linear-progress--closed-animation-off.mdc-linear-progress--indeterminate .mdc-linear-progress__bar, +.mdc-linear-progress--closed-animation-off.mdc-linear-progress--indeterminate .mdc-linear-progress__bar .mdc-linear-progress__bar-inner { + -webkit-animation: none; + animation: none; +} + +.mdc-linear-progress__bar-inner { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-theme-primary, #6200ee); +} + +.mdc-linear-progress__buffer-dots { + background-image: url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' enable-background='new 0 0 5 2' xml:space='preserve' viewBox='0 0 5 2' preserveAspectRatio='none slice'%3E%3Ccircle cx='1' cy='1' r='1' fill='%23e6e6e6'/%3E%3C/svg%3E"); +} + +.mdc-linear-progress__buffer-bar { + background-color: #e6e6e6; +} + +.mdc-deprecated-list { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + line-height: 1.75rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle1-line-height, 1.75rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + /* @alternate */ + line-height: 1.5rem; + margin: 0; + padding: 8px 0; + list-style-type: none; + color: rgba(0, 0, 0, 0.87); + /* @alternate */ + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); +} +.mdc-deprecated-list:focus { + outline: none; +} + +.mdc-deprecated-list-item { + height: 48px; +} + +.mdc-deprecated-list-item__secondary-text { + color: rgba(0, 0, 0, 0.54); + /* @alternate */ + color: var(--mdc-theme-text-secondary-on-background, rgba(0, 0, 0, 0.54)); +} + +.mdc-deprecated-list-item__graphic { + background-color: transparent; +} + +.mdc-deprecated-list-item__graphic { + color: rgba(0, 0, 0, 0.38); + /* @alternate */ + color: var(--mdc-theme-text-icon-on-background, rgba(0, 0, 0, 0.38)); +} + +.mdc-deprecated-list-item__meta { + color: rgba(0, 0, 0, 0.38); + /* @alternate */ + color: var(--mdc-theme-text-hint-on-background, rgba(0, 0, 0, 0.38)); +} + +.mdc-deprecated-list-group__subheader { + color: rgba(0, 0, 0, 0.87); + /* @alternate */ + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); +} + +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__text { + opacity: 0.38; +} + +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__text, +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__primary-text, +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__secondary-text { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} + +.mdc-deprecated-list-item--selected, +.mdc-deprecated-list-item--activated { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} +.mdc-deprecated-list-item--selected .mdc-deprecated-list-item__graphic, +.mdc-deprecated-list-item--activated .mdc-deprecated-list-item__graphic { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} + +.mdc-deprecated-list--dense { + padding-top: 4px; + padding-bottom: 4px; + font-size: 0.812rem; +} + +.mdc-deprecated-list-item { + display: flex; + position: relative; + align-items: center; + justify-content: flex-start; + overflow: hidden; + padding: 0; + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; + height: 48px; +} +.mdc-deprecated-list-item:focus { + outline: none; +} +.mdc-deprecated-list-item:not(.mdc-deprecated-list-item--selected):focus::before, .mdc-deprecated-list-item.mdc-ripple-upgraded--background-focused::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 1px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} +.mdc-deprecated-list-item.mdc-deprecated-list-item--selected::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 3px double transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} +[dir=rtl] .mdc-deprecated-list-item, .mdc-deprecated-list-item[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; +} + +.mdc-deprecated-list--icon-list .mdc-deprecated-list-item { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; + height: 56px; +} +[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-item, .mdc-deprecated-list--icon-list .mdc-deprecated-list-item[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; +} + +.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; + height: 56px; +} +[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-item, .mdc-deprecated-list--avatar-list .mdc-deprecated-list-item[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; +} + +.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; + height: 56px; +} +[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item, .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; +} + +.mdc-deprecated-list--image-list .mdc-deprecated-list-item { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; + height: 72px; +} +[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-item, .mdc-deprecated-list--image-list .mdc-deprecated-list-item[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; +} + +.mdc-deprecated-list--video-list .mdc-deprecated-list-item { + /* @noflip */ + padding-left: 0px; + /* @noflip */ + padding-right: 16px; + height: 72px; +} +[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-item, .mdc-deprecated-list--video-list .mdc-deprecated-list-item[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 0px; +} + +.mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; + width: 20px; + height: 20px; +} +[dir=rtl] .mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic, .mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; +} + +.mdc-deprecated-list-item__graphic { + flex-shrink: 0; + align-items: center; + justify-content: center; + fill: currentColor; + -o-object-fit: cover; + object-fit: cover; + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 32px; + width: 24px; + height: 24px; +} +[dir=rtl] .mdc-deprecated-list-item__graphic, .mdc-deprecated-list-item__graphic[dir=rtl] { + /* @noflip */ + margin-left: 32px; + /* @noflip */ + margin-right: 0; +} + +.mdc-deprecated-list--icon-list .mdc-deprecated-list-item__graphic { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 32px; + width: 24px; + height: 24px; +} +[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-item__graphic, .mdc-deprecated-list--icon-list .mdc-deprecated-list-item__graphic[dir=rtl] { + /* @noflip */ + margin-left: 32px; + /* @noflip */ + margin-right: 0; +} + +.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__graphic { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; + width: 40px; + height: 40px; + border-radius: 50%; +} +[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__graphic, .mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__graphic[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; +} + +.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__graphic { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; + width: 40px; + height: 40px; +} +[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__graphic, .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__graphic[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; +} + +.mdc-deprecated-list--image-list .mdc-deprecated-list-item__graphic { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; + width: 56px; + height: 56px; +} +[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-item__graphic, .mdc-deprecated-list--image-list .mdc-deprecated-list-item__graphic[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; +} + +.mdc-deprecated-list--video-list .mdc-deprecated-list-item__graphic { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; + width: 100px; + height: 56px; +} +[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-item__graphic, .mdc-deprecated-list--video-list .mdc-deprecated-list-item__graphic[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; +} + +.mdc-deprecated-list .mdc-deprecated-list-item__graphic { + display: inline-flex; +} + +.mdc-deprecated-list-item__meta { + /* @noflip */ + margin-left: auto; + /* @noflip */ + margin-right: 0; +} +.mdc-deprecated-list-item__meta:not(.material-icons) { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.75rem; + /* @alternate */ + font-size: var(--mdc-typography-caption-font-size, 0.75rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-caption-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: 0.0333333333em; + /* @alternate */ + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-caption-text-transform, inherit); +} +.mdc-deprecated-list-item[dir=rtl] .mdc-deprecated-list-item__meta, [dir=rtl] .mdc-deprecated-list-item .mdc-deprecated-list-item__meta { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: auto; +} + +.mdc-deprecated-list-item__text { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.mdc-deprecated-list-item__text[for] { + pointer-events: none; +} + +.mdc-deprecated-list-item__primary-text { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-deprecated-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-deprecated-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-deprecated-list--video-list .mdc-deprecated-list-item__primary-text, .mdc-deprecated-list--image-list .mdc-deprecated-list-item__primary-text, .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__primary-text, .mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__primary-text, .mdc-deprecated-list--icon-list .mdc-deprecated-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-deprecated-list--video-list .mdc-deprecated-list-item__primary-text::before, .mdc-deprecated-list--image-list .mdc-deprecated-list-item__primary-text::before, .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__primary-text::before, .mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__primary-text::before, .mdc-deprecated-list--icon-list .mdc-deprecated-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-deprecated-list--video-list .mdc-deprecated-list-item__primary-text::after, .mdc-deprecated-list--image-list .mdc-deprecated-list-item__primary-text::after, .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__primary-text::after, .mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__primary-text::after, .mdc-deprecated-list--icon-list .mdc-deprecated-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-deprecated-list--dense .mdc-deprecated-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-deprecated-list--dense .mdc-deprecated-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 24px; + content: ""; + vertical-align: 0; +} +.mdc-deprecated-list--dense .mdc-deprecated-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} + +.mdc-deprecated-list-item__secondary-text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-deprecated-list-item__secondary-text::before { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: 0; +} +.mdc-deprecated-list--dense .mdc-deprecated-list-item__secondary-text { + font-size: inherit; +} + +.mdc-deprecated-list--dense .mdc-deprecated-list-item { + height: 40px; +} + +.mdc-deprecated-list--two-line .mdc-deprecated-list-item__text { + align-self: flex-start; +} + +.mdc-deprecated-list--two-line .mdc-deprecated-list-item { + height: 64px; +} +.mdc-deprecated-list--two-line.mdc-deprecated-list--video-list .mdc-deprecated-list-item, .mdc-deprecated-list--two-line.mdc-deprecated-list--image-list .mdc-deprecated-list-item, .mdc-deprecated-list--two-line.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item, .mdc-deprecated-list--two-line.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item, .mdc-deprecated-list--two-line.mdc-deprecated-list--icon-list .mdc-deprecated-list-item { + height: 72px; +} +.mdc-deprecated-list--two-line.mdc-deprecated-list--icon-list .mdc-deprecated-list-item__graphic { + align-self: flex-start; + margin-top: 16px; +} + +.mdc-deprecated-list--two-line.mdc-deprecated-list--dense .mdc-deprecated-list-item, +.mdc-deprecated-list--avatar-list.mdc-deprecated-list--dense .mdc-deprecated-list-item { + height: 60px; +} + +.mdc-deprecated-list--avatar-list.mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; + width: 36px; + height: 36px; +} +[dir=rtl] .mdc-deprecated-list--avatar-list.mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic, .mdc-deprecated-list--avatar-list.mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; +} + +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item { + cursor: pointer; +} + +a.mdc-deprecated-list-item { + color: inherit; + text-decoration: none; +} + +.mdc-deprecated-list-divider { + height: 0; + margin: 0; + border: none; + border-bottom-width: 1px; + border-bottom-style: solid; +} + +.mdc-deprecated-list-divider { + border-bottom-color: rgba(0, 0, 0, 0.12); +} + +.mdc-deprecated-list-divider--padded { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 32px); +} +[dir=rtl] .mdc-deprecated-list-divider--padded, .mdc-deprecated-list-divider--padded[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list-divider--inset { + /* @noflip */ + margin-left: 72px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 72px); +} +[dir=rtl] .mdc-deprecated-list-divider--inset, .mdc-deprecated-list-divider--inset[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 72px; +} + +.mdc-deprecated-list-divider--inset.mdc-deprecated-list-divider--padded { + /* @noflip */ + margin-left: 72px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 88px); +} +[dir=rtl] .mdc-deprecated-list-divider--inset.mdc-deprecated-list-divider--padded, .mdc-deprecated-list-divider--inset.mdc-deprecated-list-divider--padded[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 72px; +} + +.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 16px); +} +[dir=rtl] .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading, .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list .mdc-deprecated-list-divider--inset-trailing { + width: calc(100% - 16px); +} +.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 32px); +} +[dir=rtl] .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing, .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 16px); +} +[dir=rtl] .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding, .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 32px); +} +[dir=rtl] .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding, .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading { + /* @noflip */ + margin-left: 72px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 72px); +} +[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading, .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 72px; +} + +.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-trailing { + width: calc(100% - 16px); +} +.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing { + /* @noflip */ + margin-left: 72px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 88px); +} +[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing, .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 72px; +} + +.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 16px); +} +[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding, .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 32px); +} +[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding, .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading { + /* @noflip */ + margin-left: 72px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 72px); +} +[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading, .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 72px; +} + +.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-trailing { + width: calc(100% - 16px); +} +.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing { + /* @noflip */ + margin-left: 72px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 88px); +} +[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing, .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 72px; +} + +.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 16px); +} +[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding, .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 32px); +} +[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding, .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading { + /* @noflip */ + margin-left: 72px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 72px); +} +[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading, .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 72px; +} + +.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-trailing { + width: calc(100% - 16px); +} +.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing { + /* @noflip */ + margin-left: 72px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 88px); +} +[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing, .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 72px; +} + +.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 16px); +} +[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding, .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 32px); +} +[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding, .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading { + /* @noflip */ + margin-left: 88px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 88px); +} +[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading, .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 88px; +} + +.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-trailing { + width: calc(100% - 16px); +} +.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing { + /* @noflip */ + margin-left: 88px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 104px); +} +[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing, .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 88px; +} + +.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 16px); +} +[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding, .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 32px); +} +[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding, .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} + +.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading { + /* @noflip */ + margin-left: 116px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 116px); +} +[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading, .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 116px; +} + +.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-trailing { + width: calc(100% - 16px); +} +.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing { + /* @noflip */ + margin-left: 116px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 132px); +} +[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing, .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 116px; +} + +.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding { + /* @noflip */ + margin-left: 0px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 0px); +} +[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding, .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0px; +} + +.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding { + /* @noflip */ + margin-left: 0px; + /* @noflip */ + margin-right: 0; + width: calc(100% - 16px); +} +[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding, .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 0px; +} + +.mdc-deprecated-list-group .mdc-deprecated-list { + padding: 0; +} + +.mdc-deprecated-list-group__subheader { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + line-height: 1.75rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle1-line-height, 1.75rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + margin: calc( (3rem - 1.5rem) / 2 ) 16px; +} + +.mdc-list-item__primary-text { + color: rgba(0, 0, 0, 0.87); + /* @alternate */ + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); +} + +.mdc-list-item__secondary-text { + color: rgba(0, 0, 0, 0.54); + /* @alternate */ + color: var(--mdc-theme-text-secondary-on-background, rgba(0, 0, 0, 0.54)); +} + +.mdc-list-item__overline-text { + color: rgba(0, 0, 0, 0.38); + /* @alternate */ + color: var(--mdc-theme-text-hint-on-background, rgba(0, 0, 0, 0.38)); +} + +.mdc-list-item--with-leading-icon .mdc-list-item__start, +.mdc-list-item--with-trailing-icon .mdc-list-item__end { + background-color: transparent; +} + +.mdc-list-item--with-leading-icon .mdc-list-item__start, +.mdc-list-item--with-trailing-icon .mdc-list-item__end { + color: rgba(0, 0, 0, 0.38); + /* @alternate */ + color: var(--mdc-theme-text-icon-on-background, rgba(0, 0, 0, 0.38)); +} + +.mdc-list-item__end { + color: rgba(0, 0, 0, 0.38); + /* @alternate */ + color: var(--mdc-theme-text-hint-on-background, rgba(0, 0, 0, 0.38)); +} + +.mdc-list-item--disabled .mdc-list-item__start, +.mdc-list-item--disabled .mdc-list-item__content, +.mdc-list-item--disabled .mdc-list-item__end { + opacity: 0.38; +} + +.mdc-list-item--disabled .mdc-list-item__primary-text { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} +.mdc-list-item--disabled .mdc-list-item__secondary-text { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} +.mdc-list-item--disabled .mdc-list-item__overline-text { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} +.mdc-list-item--disabled.mdc-list-item--with-leading-icon .mdc-list-item__start { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} +.mdc-list-item--disabled.mdc-list-item--with-trailing-icon .mdc-list-item__end { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} +.mdc-list-item--disabled.mdc-list-item--with-trailing-meta .mdc-list-item__end { + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); +} + +.mdc-list-item--selected .mdc-list-item__primary-text, +.mdc-list-item--activated .mdc-list-item__primary-text { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} +.mdc-list-item--selected.mdc-list-item--with-leading-icon .mdc-list-item__start, +.mdc-list-item--activated.mdc-list-item--with-leading-icon .mdc-list-item__start { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} + +.mdc-deprecated-list-group__subheader { + color: rgba(0, 0, 0, 0.87); + /* @alternate */ + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); +} + +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-list-divider::after { + content: ""; + display: block; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: white; + } +} +.mdc-list { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + line-height: 1.75rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle1-line-height, 1.75rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + /* @alternate */ + line-height: 1.5rem; + margin: 0; + padding: 8px 0; + list-style-type: none; +} +.mdc-list:focus { + outline: none; +} + +.mdc-list-item { + display: flex; + position: relative; + align-items: center; + justify-content: flex-start; + overflow: hidden; + padding: 0; + align-items: stretch; + cursor: pointer; +} +.mdc-list-item:focus { + outline: none; +} +.mdc-list-item.mdc-list-item--with-one-line { + height: 48px; +} +.mdc-list-item.mdc-list-item--with-two-lines { + height: 64px; +} +.mdc-list-item.mdc-list-item--with-three-lines { + height: 88px; +} +.mdc-list-item.mdc-list-item--with-one-line .mdc-list-item__start { + align-self: center; + margin-top: 0; +} +.mdc-list-item.mdc-list-item--with-two-lines .mdc-list-item__start { + align-self: flex-start; + margin-top: 16px; +} +.mdc-list-item.mdc-list-item--with-three-lines .mdc-list-item__start { + align-self: flex-start; + margin-top: 16px; +} +.mdc-list-item.mdc-list-item--with-one-line .mdc-list-item__end { + align-self: center; + margin-top: 0; +} +.mdc-list-item.mdc-list-item--with-two-lines .mdc-list-item__end { + align-self: center; + margin-top: 0; +} +.mdc-list-item.mdc-list-item--with-three-lines .mdc-list-item__end { + align-self: flex-start; + margin-top: 16px; +} +.mdc-list-item.mdc-list-item--disabled, .mdc-list-item.mdc-list-item--non-interactive { + cursor: auto; +} +.mdc-list-item:not(.mdc-list-item--selected):focus::before, .mdc-list-item.mdc-ripple-upgraded--background-focused::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 1px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} +.mdc-list-item.mdc-list-item--selected::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 3px double transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} +.mdc-list-item.mdc-list-item--selected:focus::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 3px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} + +a.mdc-list-item { + color: inherit; + text-decoration: none; +} + +.mdc-list-item__start { + fill: currentColor; + flex-shrink: 0; + pointer-events: none; +} + +.mdc-list-item__end { + flex-shrink: 0; + pointer-events: none; +} + +.mdc-list-item__content { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + align-self: center; + flex: 1; + pointer-events: none; +} +.mdc-list-item--with-two-lines .mdc-list-item__content, .mdc-list-item--with-three-lines .mdc-list-item__content { + align-self: stretch; +} +.mdc-list-item__content[for] { + pointer-events: none; +} + +.mdc-list-item__primary-text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + line-height: 1.75rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle1-line-height, 1.75rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.mdc-list-item--with-two-lines .mdc-list-item__primary-text, .mdc-list-item--with-three-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before, .mdc-list-item--with-three-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after, .mdc-list-item--with-three-lines .mdc-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} + +.mdc-list-item__secondary-text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item__secondary-text::before { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-three-lines .mdc-list-item__secondary-text { + white-space: normal; + line-height: 20px; +} +.mdc-list-item--with-overline .mdc-list-item__secondary-text { + white-space: nowrap; + line-height: auto; +} + +.mdc-list-item__overline-text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-overline-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.75rem; + /* @alternate */ + font-size: var(--mdc-typography-overline-font-size, 0.75rem); + line-height: 2rem; + /* @alternate */ + line-height: var(--mdc-typography-overline-line-height, 2rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-overline-font-weight, 500); + letter-spacing: 0.1666666667em; + /* @alternate */ + letter-spacing: var(--mdc-typography-overline-letter-spacing, 0.1666666667em); + text-decoration: none; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-overline-text-decoration, none); + text-decoration: var(--mdc-typography-overline-text-decoration, none); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-overline-text-transform, uppercase); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.mdc-list-item--with-two-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 24px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-three-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-three-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-three-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} + +.mdc-list-item--with-leading-avatar.mdc-list-item { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-item--with-leading-avatar.mdc-list-item, .mdc-list-item--with-leading-avatar.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} + +.mdc-list-item--with-leading-avatar .mdc-list-item__start { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} +[dir=rtl] .mdc-list-item--with-leading-avatar .mdc-list-item__start, .mdc-list-item--with-leading-avatar .mdc-list-item__start[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} + +.mdc-list-item--with-leading-avatar .mdc-list-item__start { + width: 40px; + height: 40px; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-one-line { + height: 56px; +} +.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines { + height: 72px; +} +.mdc-list-item--with-leading-avatar .mdc-list-item__start { + border-radius: 50%; +} + +.mdc-list-item--with-leading-icon .mdc-list-item__start { + width: 24px; + height: 24px; +} +.mdc-list-item--with-leading-icon.mdc-list-item { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-item--with-leading-icon.mdc-list-item, .mdc-list-item--with-leading-icon.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} + +.mdc-list-item--with-leading-icon .mdc-list-item__start { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 32px; +} +[dir=rtl] .mdc-list-item--with-leading-icon .mdc-list-item__start, .mdc-list-item--with-leading-icon .mdc-list-item__start[dir=rtl] { + /* @noflip */ + margin-left: 32px; + /* @noflip */ + margin-right: 16px; +} + +.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-icon.mdc-list-item--with-one-line { + height: 56px; +} +.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines { + height: 72px; +} + +.mdc-list-item--with-leading-thumbnail.mdc-list-item { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-item--with-leading-thumbnail.mdc-list-item, .mdc-list-item--with-leading-thumbnail.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} + +.mdc-list-item--with-leading-thumbnail .mdc-list-item__start { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} +[dir=rtl] .mdc-list-item--with-leading-thumbnail .mdc-list-item__start, .mdc-list-item--with-leading-thumbnail .mdc-list-item__start[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} + +.mdc-list-item--with-leading-thumbnail .mdc-list-item__start { + width: 40px; + height: 40px; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-one-line { + height: 56px; +} +.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines { + height: 72px; +} + +.mdc-list-item--with-leading-image.mdc-list-item { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-item--with-leading-image.mdc-list-item, .mdc-list-item--with-leading-image.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} + +.mdc-list-item--with-leading-image .mdc-list-item__start { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} +[dir=rtl] .mdc-list-item--with-leading-image .mdc-list-item__start, .mdc-list-item--with-leading-image .mdc-list-item__start[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} + +.mdc-list-item--with-leading-image .mdc-list-item__start { + width: 56px; + height: 56px; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-one-line { + height: 72px; +} +.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines { + height: 72px; +} + +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__start { + align-self: flex-start; + margin-top: 8px; +} +.mdc-list-item--with-leading-video.mdc-list-item { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-item--with-leading-video.mdc-list-item, .mdc-list-item--with-leading-video.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} + +.mdc-list-item--with-leading-video .mdc-list-item__start { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 16px; +} +[dir=rtl] .mdc-list-item--with-leading-video .mdc-list-item__start, .mdc-list-item--with-leading-video .mdc-list-item__start[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 0; +} + +.mdc-list-item--with-leading-video .mdc-list-item__start { + width: 100px; + height: 56px; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-one-line { + height: 72px; +} +.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines { + height: 72px; +} + +.mdc-list-item--with-leading-checkbox.mdc-list-item { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-item--with-leading-checkbox.mdc-list-item, .mdc-list-item--with-leading-checkbox.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} + +.mdc-list-item--with-leading-checkbox .mdc-list-item__start { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 24px; +} +[dir=rtl] .mdc-list-item--with-leading-checkbox .mdc-list-item__start, .mdc-list-item--with-leading-checkbox .mdc-list-item__start[dir=rtl] { + /* @noflip */ + margin-left: 24px; + /* @noflip */ + margin-right: 8px; +} + +.mdc-list-item--with-leading-checkbox .mdc-list-item__start { + width: 40px; + height: 40px; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__start { + align-self: flex-start; + margin-top: 8px; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-one-line { + height: 56px; +} +.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines { + height: 72px; +} + +.mdc-list-item--with-leading-radio.mdc-list-item { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-item--with-leading-radio.mdc-list-item, .mdc-list-item--with-leading-radio.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} + +.mdc-list-item--with-leading-radio .mdc-list-item__start { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 24px; +} +[dir=rtl] .mdc-list-item--with-leading-radio .mdc-list-item__start, .mdc-list-item--with-leading-radio .mdc-list-item__start[dir=rtl] { + /* @noflip */ + margin-left: 24px; + /* @noflip */ + margin-right: 8px; +} + +.mdc-list-item--with-leading-radio .mdc-list-item__start { + width: 40px; + height: 40px; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__start { + align-self: flex-start; + margin-top: 8px; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-one-line { + height: 56px; +} +.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines { + height: 72px; +} + +.mdc-list-item--with-leading-switch.mdc-list-item { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-item--with-leading-switch.mdc-list-item, .mdc-list-item--with-leading-switch.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} + +.mdc-list-item--with-leading-switch .mdc-list-item__start { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} +[dir=rtl] .mdc-list-item--with-leading-switch .mdc-list-item__start, .mdc-list-item--with-leading-switch .mdc-list-item__start[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} + +.mdc-list-item--with-leading-switch .mdc-list-item__start { + width: 36px; + height: 20px; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__start { + align-self: flex-start; + margin-top: 16px; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__overline-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin-bottom: -20px; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: -20px; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 32px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-one-line { + height: 56px; +} +.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines { + height: 72px; +} + +.mdc-list-item--with-trailing-icon.mdc-list-item { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-list-item--with-trailing-icon.mdc-list-item, .mdc-list-item--with-trailing-icon.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} + +.mdc-list-item--with-trailing-icon .mdc-list-item__end { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} +[dir=rtl] .mdc-list-item--with-trailing-icon .mdc-list-item__end, .mdc-list-item--with-trailing-icon .mdc-list-item__end[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} + +.mdc-list-item--with-trailing-icon .mdc-list-item__end { + width: 24px; + height: 24px; +} + +.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end { + align-self: flex-start; + margin-top: 0; +} +.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end { + align-self: flex-start; + margin-top: 0; +} +.mdc-list-item--with-trailing-meta.mdc-list-item { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-list-item--with-trailing-meta.mdc-list-item, .mdc-list-item--with-trailing-meta.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} + +.mdc-list-item--with-trailing-meta .mdc-list-item__end { + /* @noflip */ + margin-left: 28px; + /* @noflip */ + margin-right: 16px; +} +[dir=rtl] .mdc-list-item--with-trailing-meta .mdc-list-item__end, .mdc-list-item--with-trailing-meta .mdc-list-item__end[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 28px; +} + +.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-trailing-meta .mdc-list-item__end { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.75rem; + /* @alternate */ + font-size: var(--mdc-typography-caption-font-size, 0.75rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-caption-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: 0.0333333333em; + /* @alternate */ + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-caption-text-transform, inherit); +} + +.mdc-list-item--with-trailing-checkbox.mdc-list-item { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-list-item--with-trailing-checkbox.mdc-list-item, .mdc-list-item--with-trailing-checkbox.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} + +.mdc-list-item--with-trailing-checkbox .mdc-list-item__end { + /* @noflip */ + margin-left: 24px; + /* @noflip */ + margin-right: 8px; +} +[dir=rtl] .mdc-list-item--with-trailing-checkbox .mdc-list-item__end, .mdc-list-item--with-trailing-checkbox .mdc-list-item__end[dir=rtl] { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 24px; +} + +.mdc-list-item--with-trailing-checkbox .mdc-list-item__end { + width: 40px; + height: 40px; +} +.mdc-list-item--with-trailing-checkbox.mdc-list-item--with-three-lines .mdc-list-item__end { + align-self: flex-start; + margin-top: 8px; +} + +.mdc-list-item--with-trailing-radio.mdc-list-item { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-list-item--with-trailing-radio.mdc-list-item, .mdc-list-item--with-trailing-radio.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} + +.mdc-list-item--with-trailing-radio .mdc-list-item__end { + /* @noflip */ + margin-left: 24px; + /* @noflip */ + margin-right: 8px; +} +[dir=rtl] .mdc-list-item--with-trailing-radio .mdc-list-item__end, .mdc-list-item--with-trailing-radio .mdc-list-item__end[dir=rtl] { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 24px; +} + +.mdc-list-item--with-trailing-radio .mdc-list-item__end { + width: 40px; + height: 40px; +} +.mdc-list-item--with-trailing-radio.mdc-list-item--with-three-lines .mdc-list-item__end { + align-self: flex-start; + margin-top: 8px; +} + +.mdc-list-item--with-trailing-switch.mdc-list-item { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-list-item--with-trailing-switch.mdc-list-item, .mdc-list-item--with-trailing-switch.mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: auto; +} + +.mdc-list-item--with-trailing-switch .mdc-list-item__end { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} +[dir=rtl] .mdc-list-item--with-trailing-switch .mdc-list-item__end, .mdc-list-item--with-trailing-switch .mdc-list-item__end[dir=rtl] { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 16px; +} + +.mdc-list-item--with-trailing-switch .mdc-list-item__end { + width: 36px; + height: 20px; +} +.mdc-list-item--with-trailing-switch.mdc-list-item--with-three-lines .mdc-list-item__end { + align-self: flex-start; + margin-top: 16px; +} + +.mdc-list-item--with-overline.mdc-list-item--with-two-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-overline.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: 0; +} +.mdc-list-item--with-overline.mdc-list-item--with-three-lines .mdc-list-item__primary-text { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; +} +.mdc-list-item--with-overline.mdc-list-item--with-three-lines .mdc-list-item__primary-text::before { + display: inline-block; + width: 0; + height: 20px; + content: ""; + vertical-align: 0; +} + +.mdc-list-item { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; +} +[dir=rtl] .mdc-list-item, .mdc-list-item[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 16px; +} + +.mdc-list-group .mdc-deprecated-list { + padding: 0; +} + +.mdc-list-group__subheader { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + line-height: 1.75rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle1-line-height, 1.75rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + margin: calc( (3rem - 1.5rem) / 2 ) 16px; +} + +.mdc-list-divider { + background-color: rgba(0, 0, 0, 0.12); +} + +.mdc-list-divider { + height: 1px; + padding: 0; + background-clip: content-box; +} + +.mdc-list-divider.mdc-list-divider--with-leading-inset, +.mdc-list-divider--with-leading-text.mdc-list-divider--with-leading-inset, +.mdc-list-divider--with-leading-icon.mdc-list-divider--with-leading-inset, +.mdc-list-divider--with-leading-image.mdc-list-divider--with-leading-inset, +.mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-leading-inset, +.mdc-list-divider--with-leading-avatar.mdc-list-divider--with-leading-inset, +.mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-leading-inset, +.mdc-list-divider--with-leading-switch.mdc-list-divider--with-leading-inset, +.mdc-list-divider--with-leading-radio.mdc-list-divider--with-leading-inset { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-divider.mdc-list-divider--with-leading-inset, [dir=rtl] .mdc-list-divider--with-leading-text.mdc-list-divider--with-leading-inset, [dir=rtl] .mdc-list-divider--with-leading-icon.mdc-list-divider--with-leading-inset, [dir=rtl] .mdc-list-divider--with-leading-image.mdc-list-divider--with-leading-inset, [dir=rtl] .mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-leading-inset, [dir=rtl] .mdc-list-divider--with-leading-avatar.mdc-list-divider--with-leading-inset, [dir=rtl] .mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-leading-inset, [dir=rtl] .mdc-list-divider--with-leading-switch.mdc-list-divider--with-leading-inset, [dir=rtl] .mdc-list-divider--with-leading-radio.mdc-list-divider--with-leading-inset, .mdc-list-divider.mdc-list-divider--with-leading-inset[dir=rtl], .mdc-list-divider--with-leading-text.mdc-list-divider--with-leading-inset[dir=rtl], .mdc-list-divider--with-leading-icon.mdc-list-divider--with-leading-inset[dir=rtl], .mdc-list-divider--with-leading-image.mdc-list-divider--with-leading-inset[dir=rtl], .mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-leading-inset[dir=rtl], .mdc-list-divider--with-leading-avatar.mdc-list-divider--with-leading-inset[dir=rtl], .mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-leading-inset[dir=rtl], .mdc-list-divider--with-leading-switch.mdc-list-divider--with-leading-inset[dir=rtl], .mdc-list-divider--with-leading-radio.mdc-list-divider--with-leading-inset[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 16px; +} + +.mdc-list-divider.mdc-list-divider--with-trailing-inset, +.mdc-list-divider--with-leading-text.mdc-list-divider--with-trailing-inset, +.mdc-list-divider--with-leading-icon.mdc-list-divider--with-trailing-inset, +.mdc-list-divider--with-leading-image.mdc-list-divider--with-trailing-inset, +.mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-trailing-inset, +.mdc-list-divider--with-leading-avatar.mdc-list-divider--with-trailing-inset, +.mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-trailing-inset, +.mdc-list-divider--with-leading-switch.mdc-list-divider--with-trailing-inset, +.mdc-list-divider--with-leading-radio.mdc-list-divider--with-trailing-inset { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 16px; +} +[dir=rtl] .mdc-list-divider.mdc-list-divider--with-trailing-inset, [dir=rtl] .mdc-list-divider--with-leading-text.mdc-list-divider--with-trailing-inset, [dir=rtl] .mdc-list-divider--with-leading-icon.mdc-list-divider--with-trailing-inset, [dir=rtl] .mdc-list-divider--with-leading-image.mdc-list-divider--with-trailing-inset, [dir=rtl] .mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-trailing-inset, [dir=rtl] .mdc-list-divider--with-leading-avatar.mdc-list-divider--with-trailing-inset, [dir=rtl] .mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-trailing-inset, [dir=rtl] .mdc-list-divider--with-leading-switch.mdc-list-divider--with-trailing-inset, [dir=rtl] .mdc-list-divider--with-leading-radio.mdc-list-divider--with-trailing-inset, .mdc-list-divider.mdc-list-divider--with-trailing-inset[dir=rtl], .mdc-list-divider--with-leading-text.mdc-list-divider--with-trailing-inset[dir=rtl], .mdc-list-divider--with-leading-icon.mdc-list-divider--with-trailing-inset[dir=rtl], .mdc-list-divider--with-leading-image.mdc-list-divider--with-trailing-inset[dir=rtl], .mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-trailing-inset[dir=rtl], .mdc-list-divider--with-leading-avatar.mdc-list-divider--with-trailing-inset[dir=rtl], .mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-trailing-inset[dir=rtl], .mdc-list-divider--with-leading-switch.mdc-list-divider--with-trailing-inset[dir=rtl], .mdc-list-divider--with-leading-radio.mdc-list-divider--with-trailing-inset[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: auto; +} + +.mdc-list-divider--with-leading-video.mdc-list-divider--with-leading-inset { + /* @noflip */ + padding-left: 0px; + /* @noflip */ + padding-right: auto; +} +[dir=rtl] .mdc-list-divider--with-leading-video.mdc-list-divider--with-leading-inset, .mdc-list-divider--with-leading-video.mdc-list-divider--with-leading-inset[dir=rtl] { + /* @noflip */ + padding-left: auto; + /* @noflip */ + padding-right: 0px; +} + +[dir=rtl] .mdc-list-divider, .mdc-list-divider[dir=rtl] { + padding: 0; +} + +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::before, +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--unbounded .mdc-deprecated-list-item__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--foreground-activation .mdc-deprecated-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--foreground-deactivation .mdc-deprecated-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::before, +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--unbounded .mdc-list-item__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--foreground-activation .mdc-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--foreground-deactivation .mdc-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::before, +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::before, +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:hover .mdc-deprecated-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-surface--hover .mdc-deprecated-list-item__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded) .mdc-deprecated-list-item__ripple::after { + transition: opacity 150ms linear; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded):active .mdc-deprecated-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:hover .mdc-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-surface--hover .mdc-list-item__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after { + transition: opacity 150ms linear; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-deprecated-list-item__ripple::before { + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-activated-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-deprecated-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-deprecated-list-item__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:hover .mdc-deprecated-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-surface--hover .mdc-deprecated-list-item__ripple::before { + opacity: 0.16; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.16); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded) .mdc-deprecated-list-item__ripple::after { + transition: opacity 150ms linear; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded):active .mdc-deprecated-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-list-item__ripple::before { + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-activated-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-list-item__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:hover .mdc-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-surface--hover .mdc-list-item__ripple::before { + opacity: 0.16; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.16); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after { + transition: opacity 150ms linear; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-selected-opacity, 0.08); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:hover .mdc-deprecated-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-surface--hover .mdc-deprecated-list-item__ripple::before { + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.2; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.2); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded) .mdc-deprecated-list-item__ripple::after { + transition: opacity 150ms linear; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-deprecated-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.2; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.2); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.2); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-list-item__ripple::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-selected-opacity, 0.08); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-list-item__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:hover .mdc-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-surface--hover .mdc-list-item__ripple::before { + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.12); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before, :not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.2; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.2); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after { + transition: opacity 150ms linear; +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.2; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.2); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.2); +} +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple, +:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.mdc-deprecated-list-item--disabled { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::before, +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--unbounded .mdc-deprecated-list-item__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--foreground-activation .mdc-deprecated-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--foreground-deactivation .mdc-deprecated-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::before, +.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--unbounded .mdc-list-item__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--foreground-activation .mdc-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--foreground-deactivation .mdc-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::before, +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::before, +.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::before, +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::before, +.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before, .mdc-deprecated-list-item--disabled:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before, .mdc-deprecated-list-item--disabled:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple, +.mdc-deprecated-list-item--disabled .mdc-list-item__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +:not(.mdc-list-item--disabled).mdc-list-item { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::before, +:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded--unbounded .mdc-list-item__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded--foreground-activation .mdc-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded--foreground-deactivation .mdc-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::before, +:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::before, :not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +:not(.mdc-list-item--disabled).mdc-list-item:hover .mdc-list-item__ripple::before, :not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-surface--hover .mdc-list-item__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before, :not(.mdc-list-item--disabled).mdc-list-item:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +:not(.mdc-list-item--disabled).mdc-list-item:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after { + transition: opacity 150ms linear; +} +:not(.mdc-list-item--disabled).mdc-list-item:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +:not(.mdc-list-item--disabled).mdc-list-item--activated .mdc-list-item__ripple::before { + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-activated-opacity, 0.12); +} +:not(.mdc-list-item--disabled).mdc-list-item--activated .mdc-list-item__ripple::before, :not(.mdc-list-item--disabled).mdc-list-item--activated .mdc-list-item__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +:not(.mdc-list-item--disabled).mdc-list-item--activated:hover .mdc-list-item__ripple::before, :not(.mdc-list-item--disabled).mdc-list-item--activated.mdc-ripple-surface--hover .mdc-list-item__ripple::before { + opacity: 0.16; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.16); +} +:not(.mdc-list-item--disabled).mdc-list-item--activated.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before, :not(.mdc-list-item--disabled).mdc-list-item--activated:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +:not(.mdc-list-item--disabled).mdc-list-item--activated:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after { + transition: opacity 150ms linear; +} +:not(.mdc-list-item--disabled).mdc-list-item--activated:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +:not(.mdc-list-item--disabled).mdc-list-item--activated.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} +:not(.mdc-list-item--disabled).mdc-list-item--selected .mdc-list-item__ripple::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-selected-opacity, 0.08); +} +:not(.mdc-list-item--disabled).mdc-list-item--selected .mdc-list-item__ripple::before, :not(.mdc-list-item--disabled).mdc-list-item--selected .mdc-list-item__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +:not(.mdc-list-item--disabled).mdc-list-item--selected:hover .mdc-list-item__ripple::before, :not(.mdc-list-item--disabled).mdc-list-item--selected.mdc-ripple-surface--hover .mdc-list-item__ripple::before { + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.12); +} +:not(.mdc-list-item--disabled).mdc-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before, :not(.mdc-list-item--disabled).mdc-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.2; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.2); +} +:not(.mdc-list-item--disabled).mdc-list-item--selected:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after { + transition: opacity 150ms linear; +} +:not(.mdc-list-item--disabled).mdc-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after { + transition-duration: 75ms; + opacity: 0.2; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.2); +} +:not(.mdc-list-item--disabled).mdc-list-item--selected.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.2); +} +:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.mdc-list-item--disabled { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-list-item--disabled .mdc-list-item__ripple::before, +.mdc-list-item--disabled .mdc-list-item__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-list-item--disabled .mdc-list-item__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-list-item--disabled .mdc-list-item__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-list-item--disabled.mdc-ripple-upgraded--unbounded .mdc-list-item__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-list-item--disabled.mdc-ripple-upgraded--foreground-activation .mdc-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-list-item--disabled.mdc-ripple-upgraded--foreground-deactivation .mdc-list-item__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-list-item--disabled .mdc-list-item__ripple::before, +.mdc-list-item--disabled .mdc-list-item__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-list-item--disabled .mdc-list-item__ripple::before, +.mdc-list-item--disabled .mdc-list-item__ripple::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +.mdc-list-item--disabled.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before, .mdc-list-item--disabled:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-list-item--disabled .mdc-list-item__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.mdc-menu { + min-width: 112px; + /* @alternate */ + min-width: var(--mdc-menu-min-width, 112px); +} +.mdc-menu .mdc-deprecated-list-item__meta { + color: rgba(0, 0, 0, 0.87); +} +.mdc-menu .mdc-deprecated-list-item__graphic { + color: rgba(0, 0, 0, 0.87); +} +.mdc-menu .mdc-deprecated-list { + color: rgba(0, 0, 0, 0.87); + /* @alternate */ + position: relative; +} +.mdc-menu .mdc-deprecated-list .mdc-elevation-overlay { + width: 100%; + height: 100%; + top: 0; + /* @noflip */ + left: 0; +} +.mdc-menu .mdc-deprecated-list-divider { + margin: 8px 0; +} +.mdc-menu .mdc-deprecated-list-item { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mdc-menu .mdc-deprecated-list-item--disabled { + cursor: auto; +} +.mdc-menu a.mdc-deprecated-list-item .mdc-deprecated-list-item__text, +.mdc-menu a.mdc-deprecated-list-item .mdc-deprecated-list-item__graphic { + pointer-events: none; +} + +.mdc-menu__selection-group { + padding: 0; + fill: currentColor; +} +.mdc-menu__selection-group .mdc-deprecated-list-item { + /* @noflip */ + padding-left: 56px; + /* @noflip */ + padding-right: 16px; +} +[dir=rtl] .mdc-menu__selection-group .mdc-deprecated-list-item, .mdc-menu__selection-group .mdc-deprecated-list-item[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 56px; +} + +.mdc-menu__selection-group .mdc-menu__selection-group-icon { + /* @noflip */ + left: 16px; + /* @noflip */ + right: initial; + display: none; + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +[dir=rtl] .mdc-menu__selection-group .mdc-menu__selection-group-icon, .mdc-menu__selection-group .mdc-menu__selection-group-icon[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 16px; +} + +.mdc-menu-item--selected .mdc-menu__selection-group-icon { + display: inline; +} + +.mdc-menu-surface { + display: none; + position: absolute; + box-sizing: border-box; + max-width: calc(100vw - 32px); + /* @alternate */ + max-width: var(--mdc-menu-max-width, calc(100vw - 32px)); + max-height: calc(100vh - 32px); + /* @alternate */ + max-height: var(--mdc-menu-max-height, calc(100vh - 32px)); + margin: 0; + padding: 0; + -webkit-transform: scale(1); + transform: scale(1); + -webkit-transform-origin: top left; + transform-origin: top left; + opacity: 0; + overflow: auto; + will-change: transform, opacity; + z-index: 8; + transition: opacity 0.03s linear, height 250ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.12s cubic-bezier(0, 0, 0.2, 1); + transition: opacity 0.03s linear, transform 0.12s cubic-bezier(0, 0, 0.2, 1), height 250ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 0.03s linear, transform 0.12s cubic-bezier(0, 0, 0.2, 1), height 250ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.12s cubic-bezier(0, 0, 0.2, 1); + /* @alternate */ + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); + color: #000; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000); + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-medium, 4px); + /* @noflip */ + transform-origin-left: top left; + /* @noflip */ + transform-origin-right: top right; +} +.mdc-menu-surface:focus { + outline: none; +} +.mdc-menu-surface--animating-open { + display: inline-block; + -webkit-transform: scale(0.8); + transform: scale(0.8); + opacity: 0; +} +.mdc-menu-surface--open { + display: inline-block; + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; +} +.mdc-menu-surface--animating-closed { + display: inline-block; + opacity: 0; + transition: opacity 0.075s linear; +} +[dir=rtl] .mdc-menu-surface, .mdc-menu-surface[dir=rtl] { + /* @noflip */ + transform-origin-left: top right; + /* @noflip */ + transform-origin-right: top left; +} + +.mdc-menu-surface--anchor { + position: relative; + overflow: visible; +} + +.mdc-menu-surface--fixed { + position: fixed; +} + +.mdc-menu-surface--fullwidth { + width: 100%; +} + +.mdc-radio { + padding: calc((40px - 20px) / 2); +} +.mdc-radio .mdc-radio__native-control:enabled:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle { + border-color: rgba(0, 0, 0, 0.54); +} +.mdc-radio .mdc-radio__native-control:enabled:checked + .mdc-radio__background .mdc-radio__outer-circle { + border-color: #018786; + /* @alternate */ + border-color: var(--mdc-theme-secondary, #018786); +} +.mdc-radio .mdc-radio__native-control:enabled + .mdc-radio__background .mdc-radio__inner-circle { + border-color: #018786; + /* @alternate */ + border-color: var(--mdc-theme-secondary, #018786); +} +.mdc-radio [aria-disabled=true] .mdc-radio__native-control:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle, +.mdc-radio .mdc-radio__native-control:disabled:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle { + border-color: rgba(0, 0, 0, 0.38); +} +.mdc-radio [aria-disabled=true] .mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__outer-circle, +.mdc-radio .mdc-radio__native-control:disabled:checked + .mdc-radio__background .mdc-radio__outer-circle { + border-color: rgba(0, 0, 0, 0.38); +} +.mdc-radio [aria-disabled=true] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle, +.mdc-radio .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle { + border-color: rgba(0, 0, 0, 0.38); +} +.mdc-radio .mdc-radio__background::before { + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-theme-secondary, #018786); +} +.mdc-radio .mdc-radio__background::before { + top: calc(-1 * (40px - 20px) / 2); + left: calc(-1 * (40px - 20px) / 2); + width: 40px; + height: 40px; +} +.mdc-radio .mdc-radio__native-control { + top: calc((40px - 40px) / 2); + right: calc((40px - 40px) / 2); + left: calc((40px - 40px) / 2); + width: 40px; + height: 40px; +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-radio [aria-disabled=true] .mdc-radio__native-control:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle, +.mdc-radio .mdc-radio__native-control:disabled:not(:checked) + .mdc-radio__background .mdc-radio__outer-circle { + border-color: GrayText; + } + .mdc-radio [aria-disabled=true] .mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__outer-circle, +.mdc-radio .mdc-radio__native-control:disabled:checked + .mdc-radio__background .mdc-radio__outer-circle { + border-color: GrayText; + } + .mdc-radio [aria-disabled=true] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle, +.mdc-radio .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle { + border-color: GrayText; + } +} + +.mdc-radio { + display: inline-block; + position: relative; + flex: 0 0 auto; + box-sizing: content-box; + width: 20px; + height: 20px; + cursor: pointer; + /* @alternate */ + will-change: opacity, transform, border-color, color; +} +.mdc-radio__background { + display: inline-block; + position: relative; + box-sizing: border-box; + width: 20px; + height: 20px; +} +.mdc-radio__background::before { + position: absolute; + -webkit-transform: scale(0, 0); + transform: scale(0, 0); + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; + transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} +.mdc-radio__outer-circle { + position: absolute; + top: 0; + left: 0; + box-sizing: border-box; + width: 100%; + height: 100%; + border-width: 2px; + border-style: solid; + border-radius: 50%; + transition: border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} +.mdc-radio__inner-circle { + position: absolute; + top: 0; + left: 0; + box-sizing: border-box; + width: 100%; + height: 100%; + -webkit-transform: scale(0, 0); + transform: scale(0, 0); + border-width: 10px; + border-style: solid; + border-radius: 50%; + transition: border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1); + transition: transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1); +} +.mdc-radio__native-control { + position: absolute; + margin: 0; + padding: 0; + opacity: 0; + cursor: inherit; + z-index: 1; +} +.mdc-radio--touch { + margin-top: 4px; + margin-bottom: 4px; + margin-right: 4px; + margin-left: 4px; +} +.mdc-radio--touch .mdc-radio__native-control { + top: calc((40px - 48px) / 2); + right: calc((40px - 48px) / 2); + left: calc((40px - 48px) / 2); + width: 48px; + height: 48px; +} + +.mdc-radio__native-control:checked + .mdc-radio__background, +.mdc-radio__native-control:disabled + .mdc-radio__background { + transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); +} +.mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__outer-circle, +.mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__outer-circle { + transition: border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1); +} +.mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__inner-circle, +.mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle { + transition: border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); +} + +.mdc-radio--disabled { + cursor: default; + pointer-events: none; +} + +.mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__inner-circle { + -webkit-transform: scale(0.5); + transform: scale(0.5); + transition: border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); +} + +.mdc-radio__native-control:disabled + .mdc-radio__background, +[aria-disabled=true] .mdc-radio__native-control + .mdc-radio__background { + cursor: default; +} + +.mdc-radio__native-control:focus + .mdc-radio__background::before { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.12; + transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); +} + +.mdc-radio { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-radio .mdc-radio__ripple::before, +.mdc-radio .mdc-radio__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-radio .mdc-radio__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-radio .mdc-radio__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-radio.mdc-ripple-upgraded--unbounded .mdc-radio__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-radio.mdc-ripple-upgraded--foreground-activation .mdc-radio__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-radio.mdc-ripple-upgraded--foreground-deactivation .mdc-radio__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-radio .mdc-radio__ripple::before, +.mdc-radio .mdc-radio__ripple::after { + top: calc(50% - 50%); + /* @noflip */ + left: calc(50% - 50%); + width: 100%; + height: 100%; +} +.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::before, +.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::after { + top: var(--mdc-ripple-top, calc(50% - 50%)); + /* @noflip */ + left: var(--mdc-ripple-left, calc(50% - 50%)); + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-radio .mdc-radio__ripple::before, .mdc-radio .mdc-radio__ripple::after { + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-secondary, #018786)); +} +.mdc-radio:hover .mdc-radio__ripple::before, .mdc-radio.mdc-ripple-surface--hover .mdc-radio__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-radio.mdc-ripple-upgraded--background-focused .mdc-radio__ripple::before, .mdc-radio:not(.mdc-ripple-upgraded):focus .mdc-radio__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-radio:not(.mdc-ripple-upgraded) .mdc-radio__ripple::after { + transition: opacity 150ms linear; +} +.mdc-radio:not(.mdc-ripple-upgraded):active .mdc-radio__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-radio.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-radio.mdc-ripple-upgraded .mdc-radio__background::before, .mdc-radio.mdc-ripple-upgraded--background-focused .mdc-radio__background::before { + content: none; +} + +.mdc-radio__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.mdc-ripple-surface { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; + position: relative; + outline: none; + overflow: hidden; +} +.mdc-ripple-surface::before, .mdc-ripple-surface::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-ripple-surface::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-ripple-surface::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-ripple-surface.mdc-ripple-upgraded::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-ripple-surface.mdc-ripple-upgraded::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-ripple-surface.mdc-ripple-upgraded--unbounded::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-ripple-surface.mdc-ripple-upgraded--foreground-activation::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-ripple-surface.mdc-ripple-upgraded--foreground-deactivation::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-ripple-surface::before, .mdc-ripple-surface::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-ripple-surface.mdc-ripple-upgraded::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} + +.mdc-ripple-surface[data-mdc-ripple-is-unbounded], +.mdc-ripple-upgraded--unbounded { + overflow: visible; +} +.mdc-ripple-surface[data-mdc-ripple-is-unbounded]::before, .mdc-ripple-surface[data-mdc-ripple-is-unbounded]::after, +.mdc-ripple-upgraded--unbounded::before, +.mdc-ripple-upgraded--unbounded::after { + top: calc(50% - 50%); + /* @noflip */ + left: calc(50% - 50%); + width: 100%; + height: 100%; +} +.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::before, .mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::after, +.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::before, +.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::after { + top: var(--mdc-ripple-top, calc(50% - 50%)); + /* @noflip */ + left: var(--mdc-ripple-left, calc(50% - 50%)); + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::after, +.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} + +.mdc-ripple-surface::before, .mdc-ripple-surface::after { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-ripple-color, #000); +} +.mdc-ripple-surface:hover::before, .mdc-ripple-surface.mdc-ripple-surface--hover::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-ripple-surface.mdc-ripple-upgraded--background-focused::before, .mdc-ripple-surface:not(.mdc-ripple-upgraded):focus::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-ripple-surface:not(.mdc-ripple-upgraded)::after { + transition: opacity 150ms linear; +} +.mdc-ripple-surface:not(.mdc-ripple-upgraded):active::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-ripple-surface.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} + +.mdc-segmented-button { + display: inline-block; + font-size: 0; +} + +.mdc-segmented-button__segment { + border-color: rgba(0, 0, 0, 0.12); + /* @alternate */ + border-color: var(--mdc-segmented-button-outline-color, rgba(0, 0, 0, 0.12)); +} + +.mdc-segmented-button__segment { + color: rgba(0, 0, 0, 0.6); + /* @alternate */ + color: var(--mdc-segmented-button-unselected-ink-color, rgba(0, 0, 0, 0.6)); +} + +.mdc-segmented-button__segment { + background-color: white; + /* @alternate */ + background-color: var(--mdc-segmented-button-unselected-container-fill-color, white); +} + +.mdc-segmented-button__segment--selected { + color: #6200ee; + /* @alternate */ + color: var(--mdc-segmented-button-selected-ink-color, #6200ee); +} + +.mdc-segmented-button__segment--selected { + background-color: rgba(98, 0, 238, 0.08); + /* @alternate */ + background-color: var(--mdc-segmented-button-selected-container-fill-color, rgba(98, 0, 238, 0.08)); +} + +.mdc-segmented-button__segment { + /* @alternate */ + position: relative; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-button-font-size, 0.875rem); + line-height: 2.25rem; + /* @alternate */ + line-height: var(--mdc-typography-button-line-height, 2.25rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-button-font-weight, 500); + letter-spacing: 0.0892857143em; + /* @alternate */ + letter-spacing: var(--mdc-typography-button-letter-spacing, 0.0892857143em); + text-decoration: none; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-button-text-decoration, none); + text-decoration: var(--mdc-typography-button-text-decoration, none); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-button-text-transform, uppercase); + display: inline-flex; + vertical-align: top; + align-items: center; + height: 36px; + min-width: 48px; + padding: 0 12px; + border-width: 1px 0 1px 1px; +} +.mdc-segmented-button__segment .mdc-elevation-overlay { + width: 100%; + height: 100%; + top: 0; + /* @noflip */ + left: 0; +} +.mdc-segmented-button__segment:hover { + cursor: pointer; +} +.mdc-segmented-button__segment:focus { + outline-width: 0; +} +.mdc-segmented-button__segment:first-child { + border-radius: 4px 0 0 4px; +} +.mdc-segmented-button__segment:last-child { + border-right-width: 1px; + border-radius: 0 4px 4px 0; +} +.mdc-segmented-button__segment .mdc-segmented-button__segment__touch { + position: absolute; + top: 50%; + height: 48px; + left: 0; + right: 0; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.mdc-segmented-button__segment .mdc-segmented-button__segment--touch { + margin-top: 0px; + margin-bottom: 0px; +} + +.mdc-touch-target-wrapper .mdc-segmented-button__segment { + border-radius: 0; + border-right-width: 0; +} +.mdc-touch-target-wrapper:first-child .mdc-segmented-button__segment { + border-radius: 4px 0 0 4px; +} +.mdc-touch-target-wrapper:last-child .mdc-segmented-button__segment { + border-right-width: 1px; + border-radius: 0 4px 4px 0; +} + +.mdc-segmented-button__icon { + width: 24px; + font-size: 18px; +} + +.mdc-segmented-button__icon + .mdc-segmented-button__label { + padding-left: 6px; +} + +.mdc-segmented-button__segment { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; + overflow: hidden; +} +.mdc-segmented-button__segment .mdc-segmented-button__ripple::before, +.mdc-segmented-button__segment .mdc-segmented-button__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-segmented-button__segment .mdc-segmented-button__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-segmented-button__segment .mdc-segmented-button__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-segmented-button__segment.mdc-ripple-upgraded .mdc-segmented-button__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-segmented-button__segment.mdc-ripple-upgraded .mdc-segmented-button__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-segmented-button__segment.mdc-ripple-upgraded--unbounded .mdc-segmented-button__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-segmented-button__segment.mdc-ripple-upgraded--foreground-activation .mdc-segmented-button__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-segmented-button__segment.mdc-ripple-upgraded--foreground-deactivation .mdc-segmented-button__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-segmented-button__segment .mdc-segmented-button__ripple::before, +.mdc-segmented-button__segment .mdc-segmented-button__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-segmented-button__segment.mdc-ripple-upgraded .mdc-segmented-button__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-segmented-button__segment .mdc-segmented-button__ripple::before, .mdc-segmented-button__segment .mdc-segmented-button__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, #6200ee); +} +.mdc-segmented-button__segment:hover .mdc-segmented-button__ripple::before, .mdc-segmented-button__segment.mdc-ripple-surface--hover .mdc-segmented-button__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-segmented-button__segment.mdc-ripple-upgraded--background-focused .mdc-segmented-button__ripple::before, .mdc-segmented-button__segment.mdc-ripple-upgraded:focus-within .mdc-segmented-button__ripple::before, .mdc-segmented-button__segment:not(.mdc-ripple-upgraded):focus .mdc-segmented-button__ripple::before, .mdc-segmented-button__segment:not(.mdc-ripple-upgraded):focus-within .mdc-segmented-button__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-segmented-button__segment:not(.mdc-ripple-upgraded) .mdc-segmented-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-segmented-button__segment:not(.mdc-ripple-upgraded):active .mdc-segmented-button__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-segmented-button__segment.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-segmented-button__segment .mdc-segmented-button__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.mdc-slider__thumb { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-slider__thumb::before, .mdc-slider__thumb::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-slider__thumb::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-slider__thumb::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-slider__thumb.mdc-ripple-upgraded::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-slider__thumb.mdc-ripple-upgraded::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-slider__thumb.mdc-ripple-upgraded--unbounded::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-slider__thumb.mdc-ripple-upgraded--foreground-activation::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-slider__thumb.mdc-ripple-upgraded--foreground-deactivation::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-slider__thumb::before, .mdc-slider__thumb::after { + top: calc(50% - 50%); + /* @noflip */ + left: calc(50% - 50%); + width: 100%; + height: 100%; +} +.mdc-slider__thumb.mdc-ripple-upgraded::before, .mdc-slider__thumb.mdc-ripple-upgraded::after { + top: var(--mdc-ripple-top, calc(50% - 50%)); + /* @noflip */ + left: var(--mdc-ripple-left, calc(50% - 50%)); + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-slider__thumb.mdc-ripple-upgraded::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-slider__thumb::before, .mdc-slider__thumb::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-slider__thumb:hover::before, .mdc-slider__thumb.mdc-ripple-surface--hover::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-slider__thumb.mdc-ripple-upgraded--background-focused::before, .mdc-slider__thumb:not(.mdc-ripple-upgraded):focus::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-slider__thumb:not(.mdc-ripple-upgraded)::after { + transition: opacity 150ms linear; +} +.mdc-slider__thumb:not(.mdc-ripple-upgraded):active::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-slider__thumb.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} + +.mdc-slider { + cursor: pointer; + height: 48px; + margin: 0 24px; + position: relative; + touch-action: pan-y; +} +.mdc-slider .mdc-slider__track { + height: 4px; + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + width: 100%; +} +.mdc-slider .mdc-slider__track--active, +.mdc-slider .mdc-slider__track--inactive { + display: flex; + height: 100%; + position: absolute; + width: 100%; +} +.mdc-slider .mdc-slider__track--active { + border-radius: 3px; + height: 6px; + overflow: hidden; + top: -1px; +} +.mdc-slider .mdc-slider__track--active_fill { + border-top: 6px solid; + box-sizing: border-box; + height: 100%; + width: 100%; + position: relative; + /* @noflip */ + -webkit-transform-origin: left; + /* @noflip */ + transform-origin: left; +} +[dir=rtl] .mdc-slider .mdc-slider__track--active_fill, .mdc-slider .mdc-slider__track--active_fill[dir=rtl] { + /* @noflip */ + -webkit-transform-origin: right; + /* @noflip */ + transform-origin: right; +} + +.mdc-slider .mdc-slider__track--inactive { + border-radius: 2px; + height: 4px; + left: 0; + top: 0; +} +.mdc-slider .mdc-slider__track--inactive::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 1px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} +.mdc-slider .mdc-slider__track--active_fill { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-slider.mdc-slider--disabled .mdc-slider__track--active_fill { + border-color: #000; + /* @alternate */ + border-color: var(--mdc-theme-on-surface, #000); +} +.mdc-slider .mdc-slider__track--inactive { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-theme-primary, #6200ee); + opacity: 0.24; +} +.mdc-slider.mdc-slider--disabled .mdc-slider__track--inactive { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-theme-on-surface, #000); + opacity: 0.24; +} +.mdc-slider .mdc-slider__value-indicator-container { + bottom: 44px; + /* @noflip */ + left: 50%; + pointer-events: none; + position: absolute; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} +.mdc-slider .mdc-slider__value-indicator { + transition: -webkit-transform 100ms 0ms cubic-bezier(0.4, 0, 1, 1); + transition: transform 100ms 0ms cubic-bezier(0.4, 0, 1, 1); + transition: transform 100ms 0ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 100ms 0ms cubic-bezier(0.4, 0, 1, 1); + align-items: center; + border-radius: 4px; + display: flex; + height: 32px; + padding: 0 12px; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: bottom; + transform-origin: bottom; +} +.mdc-slider .mdc-slider__value-indicator::before { + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid; + bottom: -5px; + content: ""; + height: 0; + /* @noflip */ + left: 50%; + position: absolute; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + width: 0; +} +.mdc-slider .mdc-slider__value-indicator::after { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 1px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} +.mdc-slider .mdc-slider__thumb--with-indicator .mdc-slider__value-indicator-container { + pointer-events: auto; +} +.mdc-slider .mdc-slider__thumb--with-indicator .mdc-slider__value-indicator { + transition: -webkit-transform 100ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: transform 100ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: transform 100ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 100ms 0ms cubic-bezier(0, 0, 0.2, 1); + -webkit-transform: scale(1); + transform: scale(1); +} +@media (prefers-reduced-motion) { + .mdc-slider .mdc-slider__value-indicator, +.mdc-slider .mdc-slider__thumb--with-indicator .mdc-slider__value-indicator { + transition: none; + } +} +.mdc-slider .mdc-slider__value-indicator-text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle2-font-size, 0.875rem); + line-height: 1.375rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle2-line-height, 1.375rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle2-font-weight, 500); + letter-spacing: 0.0071428571em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle2-text-transform, inherit); +} +.mdc-slider .mdc-slider__value-indicator { + background-color: #000; + opacity: 0.6; +} +.mdc-slider .mdc-slider__value-indicator::before { + border-top-color: #000; +} +.mdc-slider .mdc-slider__value-indicator { + color: #fff; + /* @alternate */ + color: var(--mdc-theme-on-primary, #fff); +} +.mdc-slider .mdc-slider__thumb { + display: flex; + height: 48px; + /* @noflip */ + left: -24px; + outline: none; + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 48px; +} +.mdc-slider .mdc-slider__thumb--top { + z-index: 1; +} +.mdc-slider .mdc-slider__thumb--top .mdc-slider__thumb-knob, .mdc-slider .mdc-slider__thumb--top.mdc-slider__thumb:hover .mdc-slider__thumb-knob, .mdc-slider .mdc-slider__thumb--top.mdc-slider__thumb--focused .mdc-slider__thumb-knob { + border-style: solid; + border-width: 1px; + box-sizing: content-box; +} +.mdc-slider .mdc-slider__thumb-knob { + /* @alternate */ + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); + border: 10px solid; + border-radius: 50%; + box-sizing: border-box; + height: 20px; + /* @noflip */ + left: 50%; + position: absolute; + top: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + width: 20px; +} +.mdc-slider .mdc-slider__thumb-knob { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-theme-primary, #6200ee); + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-slider .mdc-slider__thumb--top .mdc-slider__thumb-knob, .mdc-slider .mdc-slider__thumb--top.mdc-slider__thumb:hover .mdc-slider__thumb-knob, .mdc-slider .mdc-slider__thumb--top.mdc-slider__thumb--focused .mdc-slider__thumb-knob { + border-color: #fff; +} +.mdc-slider.mdc-slider--disabled .mdc-slider__thumb-knob { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-theme-on-surface, #000); + border-color: #000; + /* @alternate */ + border-color: var(--mdc-theme-on-surface, #000); +} +.mdc-slider.mdc-slider--disabled .mdc-slider__thumb--top .mdc-slider__thumb-knob, .mdc-slider.mdc-slider--disabled .mdc-slider__thumb--top.mdc-slider__thumb:hover .mdc-slider__thumb-knob, .mdc-slider.mdc-slider--disabled .mdc-slider__thumb--top.mdc-slider__thumb--focused .mdc-slider__thumb-knob { + border-color: #fff; +} +.mdc-slider .mdc-slider__thumb::before, .mdc-slider .mdc-slider__thumb::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-slider .mdc-slider__thumb:hover::before, .mdc-slider .mdc-slider__thumb.mdc-ripple-surface--hover::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-slider .mdc-slider__thumb.mdc-ripple-upgraded--background-focused::before, .mdc-slider .mdc-slider__thumb:not(.mdc-ripple-upgraded):focus::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-slider .mdc-slider__thumb:not(.mdc-ripple-upgraded)::after { + transition: opacity 150ms linear; +} +.mdc-slider .mdc-slider__thumb:not(.mdc-ripple-upgraded):active::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-slider .mdc-slider__thumb.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-slider .mdc-slider__tick-marks { + align-items: center; + box-sizing: border-box; + display: flex; + height: 100%; + justify-content: space-between; + padding: 0 1px; + position: absolute; + width: 100%; +} +.mdc-slider .mdc-slider__tick-mark--active, +.mdc-slider .mdc-slider__tick-mark--inactive { + border-radius: 50%; + height: 2px; + width: 2px; +} +.mdc-slider .mdc-slider__tick-mark--active { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-on-primary, #fff); + opacity: 0.6; +} +.mdc-slider.mdc-slider--disabled .mdc-slider__tick-mark--active { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-on-primary, #fff); + opacity: 0.6; +} +.mdc-slider .mdc-slider__tick-mark--inactive { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-theme-primary, #6200ee); + opacity: 0.6; +} +.mdc-slider.mdc-slider--disabled .mdc-slider__tick-mark--inactive { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-theme-on-surface, #000); + opacity: 0.6; +} +.mdc-slider.mdc-slider--disabled { + opacity: 0.38; + cursor: auto; +} +.mdc-slider.mdc-slider--disabled .mdc-slider__thumb { + pointer-events: none; +} +.mdc-slider--discrete .mdc-slider__thumb, +.mdc-slider--discrete .mdc-slider__track--active_fill { + transition: -webkit-transform 80ms ease; + transition: transform 80ms ease; + transition: transform 80ms ease, -webkit-transform 80ms ease; +} +@media (prefers-reduced-motion) { + .mdc-slider--discrete .mdc-slider__thumb, +.mdc-slider--discrete .mdc-slider__track--active_fill { + transition: none; + } +} + +.mdc-slider__input { + cursor: pointer; + left: 0; + margin: 0; + height: 100%; + opacity: 0; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; +} + +.mdc-snackbar { + z-index: 8; + margin: 8px; + display: none; + position: fixed; + right: 0; + bottom: 0; + left: 0; + align-items: center; + justify-content: center; + box-sizing: border-box; + pointer-events: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +.mdc-snackbar__surface { + background-color: #333333; +} + +.mdc-snackbar__label { + color: rgba(255, 255, 255, 0.87); +} + +.mdc-snackbar__surface { + min-width: 344px; +} +@media (max-width: 480px), (max-width: 344px) { + .mdc-snackbar__surface { + min-width: 100%; + } +} + +.mdc-snackbar__surface { + max-width: 672px; +} + +.mdc-snackbar__surface { + /* @alternate */ + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); +} + +.mdc-snackbar__surface { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); +} + +.mdc-snackbar--opening, +.mdc-snackbar--open, +.mdc-snackbar--closing { + display: flex; +} + +.mdc-snackbar--open .mdc-snackbar__label, +.mdc-snackbar--open .mdc-snackbar__actions { + visibility: visible; +} + +.mdc-snackbar--leading { + justify-content: flex-start; +} + +.mdc-snackbar--stacked .mdc-snackbar__label { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 8px; + padding-bottom: 12px; +} +[dir=rtl] .mdc-snackbar--stacked .mdc-snackbar__label, .mdc-snackbar--stacked .mdc-snackbar__label[dir=rtl] { + /* @noflip */ + padding-left: 8px; + /* @noflip */ + padding-right: 16px; +} + +.mdc-snackbar--stacked .mdc-snackbar__surface { + flex-direction: column; + align-items: flex-start; +} +.mdc-snackbar--stacked .mdc-snackbar__actions { + align-self: flex-end; + margin-bottom: 8px; +} + +.mdc-snackbar__surface { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 8px; + display: flex; + align-items: center; + justify-content: flex-start; + box-sizing: border-box; + -webkit-transform: scale(0.8); + transform: scale(0.8); + opacity: 0; +} +.mdc-snackbar__surface::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 1px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} +[dir=rtl] .mdc-snackbar__surface, .mdc-snackbar__surface[dir=rtl] { + /* @noflip */ + padding-left: 8px; + /* @noflip */ + padding-right: 0; +} + +.mdc-snackbar--open .mdc-snackbar__surface { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + pointer-events: auto; + transition: opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1); +} +.mdc-snackbar--closing .mdc-snackbar__surface { + -webkit-transform: scale(1); + transform: scale(1); + transition: opacity 75ms 0ms cubic-bezier(0.4, 0, 1, 1); +} + +.mdc-snackbar__label { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 8px; + width: 100%; + flex-grow: 1; + box-sizing: border-box; + margin: 0; + visibility: hidden; + padding-top: 14px; + padding-bottom: 14px; +} +[dir=rtl] .mdc-snackbar__label, .mdc-snackbar__label[dir=rtl] { + /* @noflip */ + padding-left: 8px; + /* @noflip */ + padding-right: 16px; +} + +.mdc-snackbar__label::before { + display: inline; + content: attr(data-mdc-snackbar-label-text); +} + +.mdc-snackbar__actions { + display: flex; + flex-shrink: 0; + align-items: center; + box-sizing: border-box; + visibility: hidden; +} + +.mdc-snackbar__action:not(:disabled) { + color: #bb86fc; +} +.mdc-snackbar__action::before, .mdc-snackbar__action::after { + background-color: #bb86fc; + /* @alternate */ + background-color: var(--mdc-ripple-color, #bb86fc); +} +.mdc-snackbar__action:hover::before, .mdc-snackbar__action.mdc-ripple-surface--hover::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.08); +} +.mdc-snackbar__action.mdc-ripple-upgraded--background-focused::before, .mdc-snackbar__action:not(.mdc-ripple-upgraded):focus::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +.mdc-snackbar__action:not(.mdc-ripple-upgraded)::after { + transition: opacity 150ms linear; +} +.mdc-snackbar__action:not(.mdc-ripple-upgraded):active::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-snackbar__action.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} + +.mdc-snackbar__dismiss { + color: rgba(255, 255, 255, 0.87); +} +.mdc-snackbar__dismiss .mdc-icon-button__ripple::before, .mdc-snackbar__dismiss .mdc-icon-button__ripple::after { + background-color: rgba(255, 255, 255, 0.87); + /* @alternate */ + background-color: var(--mdc-ripple-color, rgba(255, 255, 255, 0.87)); +} +.mdc-snackbar__dismiss:hover .mdc-icon-button__ripple::before, .mdc-snackbar__dismiss.mdc-ripple-surface--hover .mdc-icon-button__ripple::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.08); +} +.mdc-snackbar__dismiss.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before, .mdc-snackbar__dismiss:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +.mdc-snackbar__dismiss:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after { + transition: opacity 150ms linear; +} +.mdc-snackbar__dismiss:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-snackbar__dismiss.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} + +.mdc-snackbar__dismiss.mdc-snackbar__dismiss { + width: 36px; + height: 36px; + padding: 6px; + font-size: 18px; +} + +.mdc-snackbar__action + .mdc-snackbar__dismiss { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 0; +} +[dir=rtl] .mdc-snackbar__action + .mdc-snackbar__dismiss, .mdc-snackbar__action + .mdc-snackbar__dismiss[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: 8px; +} + +.mdc-switch__thumb-underlay { + /* @noflip */ + left: -14px; + /* @noflip */ + right: initial; + top: -17px; + width: 48px; + height: 48px; +} +[dir=rtl] .mdc-switch__thumb-underlay, .mdc-switch__thumb-underlay[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: -14px; +} + +.mdc-switch__native-control { + width: 64px; + height: 48px; +} + +.mdc-switch { + display: inline-block; + position: relative; + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mdc-switch.mdc-switch--checked .mdc-switch__track { + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-theme-secondary, #018786); +} +.mdc-switch.mdc-switch--checked .mdc-switch__thumb { + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-theme-secondary, #018786); + border-color: #018786; + /* @alternate */ + border-color: var(--mdc-theme-secondary, #018786); +} +.mdc-switch:not(.mdc-switch--checked) .mdc-switch__track { + background-color: #000; + /* @alternate */ + background-color: var(--mdc-theme-on-surface, #000); +} +.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); + border-color: #fff; + /* @alternate */ + border-color: var(--mdc-theme-surface, #fff); +} + +.mdc-switch__native-control { + /* @noflip */ + left: 0; + /* @noflip */ + right: initial; + position: absolute; + top: 0; + margin: 0; + opacity: 0; + cursor: pointer; + pointer-events: auto; + transition: -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1); +} +[dir=rtl] .mdc-switch__native-control, .mdc-switch__native-control[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 0; +} + +.mdc-switch__track { + box-sizing: border-box; + width: 36px; + height: 14px; + border: 1px solid transparent; + border-radius: 7px; + opacity: 0.38; + transition: opacity 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), border-color 90ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.mdc-switch__thumb-underlay { + display: flex; + position: absolute; + align-items: center; + justify-content: center; + -webkit-transform: translateX(0); + transform: translateX(0); + transition: background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), border-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), border-color 90ms cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), border-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.mdc-switch__thumb { + /* @alternate */ + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + box-sizing: border-box; + width: 20px; + height: 20px; + border: 10px solid; + border-radius: 50%; + pointer-events: none; + z-index: 1; +} + +.mdc-switch--checked .mdc-switch__track { + opacity: 0.54; +} +.mdc-switch--checked .mdc-switch__thumb-underlay { + -webkit-transform: translateX(16px); + transform: translateX(16px); +} +[dir=rtl] .mdc-switch--checked .mdc-switch__thumb-underlay, .mdc-switch--checked .mdc-switch__thumb-underlay[dir=rtl] { + -webkit-transform: translateX(-16px); + transform: translateX(-16px); +} + +.mdc-switch--checked .mdc-switch__native-control { + -webkit-transform: translateX(-16px); + transform: translateX(-16px); +} +[dir=rtl] .mdc-switch--checked .mdc-switch__native-control, .mdc-switch--checked .mdc-switch__native-control[dir=rtl] { + -webkit-transform: translateX(16px); + transform: translateX(16px); +} + +.mdc-switch--disabled { + opacity: 0.38; + pointer-events: none; +} +.mdc-switch--disabled .mdc-switch__thumb { + border-width: 1px; +} +.mdc-switch--disabled .mdc-switch__native-control { + cursor: default; + pointer-events: none; +} + +.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay::before, .mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay::after { + background-color: #9e9e9e; + /* @alternate */ + background-color: var(--mdc-ripple-color, #9e9e9e); +} +.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay:hover::before, .mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay.mdc-ripple-surface--hover::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.08); +} +.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay.mdc-ripple-upgraded--background-focused::before, .mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded):focus::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded)::after { + transition: opacity 150ms linear; +} +.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded):active::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} + +.mdc-switch__thumb-underlay { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-switch__thumb-underlay::before, .mdc-switch__thumb-underlay::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-switch__thumb-underlay::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-switch__thumb-underlay::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-switch__thumb-underlay.mdc-ripple-upgraded::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-switch__thumb-underlay.mdc-ripple-upgraded::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-switch__thumb-underlay.mdc-ripple-upgraded--unbounded::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-switch__thumb-underlay.mdc-ripple-upgraded--foreground-activation::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-switch__thumb-underlay.mdc-ripple-upgraded--foreground-deactivation::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-switch__thumb-underlay::before, .mdc-switch__thumb-underlay::after { + top: calc(50% - 50%); + /* @noflip */ + left: calc(50% - 50%); + width: 100%; + height: 100%; +} +.mdc-switch__thumb-underlay.mdc-ripple-upgraded::before, .mdc-switch__thumb-underlay.mdc-ripple-upgraded::after { + top: var(--mdc-ripple-top, calc(50% - 50%)); + /* @noflip */ + left: var(--mdc-ripple-left, calc(50% - 50%)); + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-switch__thumb-underlay.mdc-ripple-upgraded::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-switch__thumb-underlay::before, .mdc-switch__thumb-underlay::after { + background-color: #018786; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-secondary, #018786)); +} +.mdc-switch__thumb-underlay:hover::before, .mdc-switch__thumb-underlay.mdc-ripple-surface--hover::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-switch__thumb-underlay.mdc-ripple-upgraded--background-focused::before, .mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded):focus::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded)::after { + transition: opacity 150ms linear; +} +.mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded):active::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-switch__thumb-underlay.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} + +.mdc-tab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-button-font-size, 0.875rem); + line-height: 2.25rem; + /* @alternate */ + line-height: var(--mdc-typography-button-line-height, 2.25rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-button-font-weight, 500); + letter-spacing: 0.0892857143em; + /* @alternate */ + letter-spacing: var(--mdc-typography-button-letter-spacing, 0.0892857143em); + text-decoration: none; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-button-text-decoration, none); + text-decoration: var(--mdc-typography-button-text-decoration, none); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-button-text-transform, uppercase); + position: relative; +} +.mdc-tab .mdc-tab__text-label { + color: rgba(0, 0, 0, 0.6); +} +.mdc-tab .mdc-tab__icon { + color: rgba(0, 0, 0, 0.54); + fill: currentColor; +} + +.mdc-tab__content { + position: relative; +} + +.mdc-tab__icon { + width: 24px; + height: 24px; + font-size: 24px; +} + +.mdc-tab--active .mdc-tab__text-label { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} +.mdc-tab--active .mdc-tab__icon { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); + fill: currentColor; +} + +.mdc-tab { + background: none; +} + +.mdc-tab { + min-width: 90px; + padding-right: 24px; + padding-left: 24px; + display: flex; + flex: 1 0 auto; + justify-content: center; + box-sizing: border-box; + margin: 0; + padding-top: 0; + padding-bottom: 0; + border: none; + outline: none; + text-align: center; + white-space: nowrap; + cursor: pointer; + -webkit-appearance: none; + z-index: 1; +} +.mdc-tab::-moz-focus-inner { + padding: 0; + border: 0; +} + +.mdc-tab--min-width { + flex: 0 1 auto; +} + +.mdc-tab__content { + display: flex; + align-items: center; + justify-content: center; + height: inherit; + pointer-events: none; +} + +.mdc-tab__text-label { + transition: 150ms color linear; + display: inline-block; + line-height: 1; + z-index: 2; +} + +.mdc-tab__icon { + transition: 150ms color linear; + z-index: 2; +} + +.mdc-tab--stacked .mdc-tab__content { + flex-direction: column; + align-items: center; + justify-content: center; +} +.mdc-tab--stacked .mdc-tab__text-label { + padding-top: 6px; + padding-bottom: 4px; +} + +.mdc-tab--active .mdc-tab__text-label, +.mdc-tab--active .mdc-tab__icon { + transition-delay: 100ms; +} + +.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon + .mdc-tab__text-label { + /* @noflip */ + padding-left: 8px; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon + .mdc-tab__text-label, .mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon + .mdc-tab__text-label[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 8px; +} + +.mdc-tab { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +.mdc-tab .mdc-tab__ripple::before, +.mdc-tab .mdc-tab__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-tab .mdc-tab__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-tab .mdc-tab__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-tab.mdc-ripple-upgraded .mdc-tab__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-tab.mdc-ripple-upgraded .mdc-tab__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-tab.mdc-ripple-upgraded--unbounded .mdc-tab__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-tab.mdc-ripple-upgraded--foreground-activation .mdc-tab__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-tab.mdc-ripple-upgraded--foreground-deactivation .mdc-tab__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-tab .mdc-tab__ripple::before, +.mdc-tab .mdc-tab__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-tab.mdc-ripple-upgraded .mdc-tab__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} +.mdc-tab .mdc-tab__ripple::before, .mdc-tab .mdc-tab__ripple::after { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee)); +} +.mdc-tab:hover .mdc-tab__ripple::before, .mdc-tab.mdc-ripple-surface--hover .mdc-tab__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-tab.mdc-ripple-upgraded--background-focused .mdc-tab__ripple::before, .mdc-tab:not(.mdc-ripple-upgraded):focus .mdc-tab__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-tab:not(.mdc-ripple-upgraded) .mdc-tab__ripple::after { + transition: opacity 150ms linear; +} +.mdc-tab:not(.mdc-ripple-upgraded):active .mdc-tab__ripple::after { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.12); +} +.mdc-tab.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.12); +} + +.mdc-tab__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow: hidden; + will-change: transform, opacity; +} + +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +.mdc-tab-bar { + width: 100%; +} + +.mdc-tab { + height: 48px; +} + +.mdc-tab--stacked { + height: 72px; +} + +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +.mdc-tab-indicator .mdc-tab-indicator__content--underline { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-tab-indicator .mdc-tab-indicator__content--icon { + color: #018786; + /* @alternate */ + color: var(--mdc-theme-secondary, #018786); +} +.mdc-tab-indicator .mdc-tab-indicator__content--underline { + border-top-width: 2px; +} +.mdc-tab-indicator .mdc-tab-indicator__content--icon { + height: 34px; + font-size: 34px; +} + +.mdc-tab-indicator { + display: flex; + position: absolute; + top: 0; + left: 0; + justify-content: center; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 1; +} + +.mdc-tab-indicator__content { + -webkit-transform-origin: left; + transform-origin: left; + opacity: 0; +} + +.mdc-tab-indicator__content--underline { + align-self: flex-end; + box-sizing: border-box; + width: 100%; + border-top-style: solid; +} + +.mdc-tab-indicator__content--icon { + align-self: center; + margin: 0 auto; +} + +.mdc-tab-indicator--active .mdc-tab-indicator__content { + opacity: 1; +} + +.mdc-tab-indicator .mdc-tab-indicator__content { + transition: 250ms -webkit-transform cubic-bezier(0.4, 0, 0.2, 1); + transition: 250ms transform cubic-bezier(0.4, 0, 0.2, 1); + transition: 250ms transform cubic-bezier(0.4, 0, 0.2, 1), 250ms -webkit-transform cubic-bezier(0.4, 0, 0.2, 1); +} + +.mdc-tab-indicator--no-transition .mdc-tab-indicator__content { + transition: none; +} + +.mdc-tab-indicator--fade .mdc-tab-indicator__content { + transition: 150ms opacity linear; +} + +.mdc-tab-indicator--active.mdc-tab-indicator--fade .mdc-tab-indicator__content { + transition-delay: 100ms; +} + +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +.mdc-tab-scroller { + overflow-y: hidden; +} +.mdc-tab-scroller.mdc-tab-scroller--animating .mdc-tab-scroller__scroll-content { + transition: 250ms -webkit-transform cubic-bezier(0.4, 0, 0.2, 1); + transition: 250ms transform cubic-bezier(0.4, 0, 0.2, 1); + transition: 250ms transform cubic-bezier(0.4, 0, 0.2, 1), 250ms -webkit-transform cubic-bezier(0.4, 0, 0.2, 1); +} + +.mdc-tab-scroller__test { + position: absolute; + top: -9999px; + width: 100px; + height: 100px; + overflow-x: scroll; +} + +.mdc-tab-scroller__scroll-area { + -webkit-overflow-scrolling: touch; + display: flex; + overflow-x: hidden; +} + +.mdc-tab-scroller__scroll-area::-webkit-scrollbar, +.mdc-tab-scroller__test::-webkit-scrollbar { + display: none; +} + +.mdc-tab-scroller__scroll-area--scroll { + overflow-x: scroll; +} + +.mdc-tab-scroller__scroll-content { + position: relative; + display: flex; + flex: 1 0 auto; + -webkit-transform: none; + transform: none; + will-change: transform; +} + +.mdc-tab-scroller--align-start .mdc-tab-scroller__scroll-content { + justify-content: flex-start; +} + +.mdc-tab-scroller--align-end .mdc-tab-scroller__scroll-content { + justify-content: flex-end; +} + +.mdc-tab-scroller--align-center .mdc-tab-scroller__scroll-content { + justify-content: center; +} + +.mdc-tab-scroller--animating .mdc-tab-scroller__scroll-area { + -webkit-overflow-scrolling: auto; +} + +.mdc-text-field--filled { + --mdc-ripple-fg-size: 0; + --mdc-ripple-left: 0; + --mdc-ripple-top: 0; + --mdc-ripple-fg-scale: 1; + --mdc-ripple-fg-translate-end: 0; + --mdc-ripple-fg-translate-start: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + will-change: transform, opacity; +} +.mdc-text-field--filled .mdc-text-field__ripple::before, +.mdc-text-field--filled .mdc-text-field__ripple::after { + position: absolute; + border-radius: 50%; + opacity: 0; + pointer-events: none; + content: ""; +} +.mdc-text-field--filled .mdc-text-field__ripple::before { + transition: opacity 15ms linear, background-color 15ms linear; + z-index: 1; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 1); +} +.mdc-text-field--filled .mdc-text-field__ripple::after { + z-index: 0; + /* @alternate */ + z-index: var(--mdc-ripple-z-index, 0); +} +.mdc-text-field--filled.mdc-ripple-upgraded .mdc-text-field__ripple::before { + -webkit-transform: scale(var(--mdc-ripple-fg-scale, 1)); + transform: scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-text-field--filled.mdc-ripple-upgraded .mdc-text-field__ripple::after { + top: 0; + /* @noflip */ + left: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: center center; + transform-origin: center center; +} +.mdc-text-field--filled.mdc-ripple-upgraded--unbounded .mdc-text-field__ripple::after { + top: var(--mdc-ripple-top, 0); + /* @noflip */ + left: var(--mdc-ripple-left, 0); +} +.mdc-text-field--filled.mdc-ripple-upgraded--foreground-activation .mdc-text-field__ripple::after { + -webkit-animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; + animation: mdc-ripple-fg-radius-in 225ms forwards, mdc-ripple-fg-opacity-in 75ms forwards; +} +.mdc-text-field--filled.mdc-ripple-upgraded--foreground-deactivation .mdc-text-field__ripple::after { + -webkit-animation: mdc-ripple-fg-opacity-out 150ms; + animation: mdc-ripple-fg-opacity-out 150ms; + -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); + transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); +} +.mdc-text-field--filled .mdc-text-field__ripple::before, +.mdc-text-field--filled .mdc-text-field__ripple::after { + top: calc(50% - 100%); + /* @noflip */ + left: calc(50% - 100%); + width: 200%; + height: 200%; +} +.mdc-text-field--filled.mdc-ripple-upgraded .mdc-text-field__ripple::after { + width: var(--mdc-ripple-fg-size, 100%); + height: var(--mdc-ripple-fg-size, 100%); +} + +.mdc-text-field__ripple { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.mdc-text-field { + border-top-left-radius: 4px; + /* @alternate */ + border-top-left-radius: var(--mdc-shape-small, 4px); + border-top-right-radius: 4px; + /* @alternate */ + border-top-right-radius: var(--mdc-shape-small, 4px); + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + display: inline-flex; + align-items: baseline; + padding: 0 16px; + position: relative; + box-sizing: border-box; + overflow: hidden; + /* @alternate */ + will-change: opacity, transform, color; +} +.mdc-text-field:not(.mdc-text-field--disabled) .mdc-floating-label { + color: rgba(0, 0, 0, 0.6); +} +.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input { + color: rgba(0, 0, 0, 0.87); +} +@media all { + .mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, 0.54); + } + .mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); + } + .mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input::-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); + } + .mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder { + color: rgba(0, 0, 0, 0.54); + } +} +@media all { + .mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); + } +} +.mdc-text-field .mdc-text-field__input { + caret-color: #6200ee; + /* @alternate */ + caret-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-text-field:not(.mdc-text-field--disabled) + .mdc-text-field-helper-line .mdc-text-field-helper-text { + color: rgba(0, 0, 0, 0.6); +} +.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field-character-counter, +.mdc-text-field:not(.mdc-text-field--disabled) + .mdc-text-field-helper-line .mdc-text-field-character-counter { + color: rgba(0, 0, 0, 0.6); +} +.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__icon--leading { + color: rgba(0, 0, 0, 0.54); +} +.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__icon--trailing { + color: rgba(0, 0, 0, 0.54); +} +.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__affix--prefix { + color: rgba(0, 0, 0, 0.6); +} +.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__affix--suffix { + color: rgba(0, 0, 0, 0.6); +} +.mdc-text-field .mdc-floating-label { + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + pointer-events: none; +} + +.mdc-text-field__input { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + height: 28px; + transition: opacity 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + width: 100%; + min-width: 0; + border: none; + border-radius: 0; + background: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 0; +} +.mdc-text-field__input::-ms-clear { + display: none; +} +.mdc-text-field__input::-webkit-calendar-picker-indicator { + display: none; +} +.mdc-text-field__input:focus { + outline: none; +} +.mdc-text-field__input:invalid { + box-shadow: none; +} +@media all { + .mdc-text-field__input::-webkit-input-placeholder { + transition: opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0; + } + .mdc-text-field__input:-ms-input-placeholder { + transition: opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0; + } + .mdc-text-field__input::-ms-input-placeholder { + transition: opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0; + } + .mdc-text-field__input::placeholder { + transition: opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0; + } +} +@media all { + .mdc-text-field__input:-ms-input-placeholder { + transition: opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0; + } +} +@media all { + .mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder, .mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder { + transition-delay: 40ms; + transition-duration: 110ms; + opacity: 1; + } + .mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder, .mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder { + transition-delay: 40ms; + transition-duration: 110ms; + opacity: 1; + } + .mdc-text-field--no-label .mdc-text-field__input::-ms-input-placeholder, .mdc-text-field--focused .mdc-text-field__input::-ms-input-placeholder { + transition-delay: 40ms; + transition-duration: 110ms; + opacity: 1; + } + .mdc-text-field--no-label .mdc-text-field__input::placeholder, .mdc-text-field--focused .mdc-text-field__input::placeholder { + transition-delay: 40ms; + transition-duration: 110ms; + opacity: 1; + } +} +@media all { + .mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder, .mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder { + transition-delay: 40ms; + transition-duration: 110ms; + opacity: 1; + } +} + +.mdc-text-field__affix { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); + height: 28px; + transition: opacity 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0; + white-space: nowrap; +} +.mdc-text-field--label-floating .mdc-text-field__affix, .mdc-text-field--no-label .mdc-text-field__affix { + opacity: 1; +} +@supports (-webkit-hyphens: none) { + .mdc-text-field--outlined .mdc-text-field__affix { + align-items: center; + align-self: center; + display: inline-flex; + height: 100%; + } +} + +.mdc-text-field__affix--prefix { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 2px; +} +[dir=rtl] .mdc-text-field__affix--prefix, .mdc-text-field__affix--prefix[dir=rtl] { + /* @noflip */ + padding-left: 2px; + /* @noflip */ + padding-right: 0; +} + +.mdc-text-field--end-aligned .mdc-text-field__affix--prefix { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 12px; +} +[dir=rtl] .mdc-text-field--end-aligned .mdc-text-field__affix--prefix, .mdc-text-field--end-aligned .mdc-text-field__affix--prefix[dir=rtl] { + /* @noflip */ + padding-left: 12px; + /* @noflip */ + padding-right: 0; +} + +.mdc-text-field__affix--suffix { + /* @noflip */ + padding-left: 12px; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-text-field__affix--suffix, .mdc-text-field__affix--suffix[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 12px; +} + +.mdc-text-field--end-aligned .mdc-text-field__affix--suffix { + /* @noflip */ + padding-left: 2px; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-text-field--end-aligned .mdc-text-field__affix--suffix, .mdc-text-field--end-aligned .mdc-text-field__affix--suffix[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 2px; +} + +.mdc-text-field--filled { + height: 56px; +} +.mdc-text-field--filled .mdc-text-field__ripple::before, +.mdc-text-field--filled .mdc-text-field__ripple::after { + background-color: rgba(0, 0, 0, 0.87); + /* @alternate */ + background-color: var(--mdc-ripple-color, rgba(0, 0, 0, 0.87)); +} +.mdc-text-field--filled:hover .mdc-text-field__ripple::before, .mdc-text-field--filled.mdc-ripple-surface--hover .mdc-text-field__ripple::before { + opacity: 0.04; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.04); +} +.mdc-text-field--filled.mdc-ripple-upgraded--background-focused .mdc-text-field__ripple::before, .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before { + transition-duration: 75ms; + opacity: 0.12; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.12); +} +.mdc-text-field--filled::before { + display: inline-block; + width: 0; + height: 40px; + content: ""; + vertical-align: 0; +} +.mdc-text-field--filled:not(.mdc-text-field--disabled) { + background-color: whitesmoke; +} +.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before { + border-bottom-color: rgba(0, 0, 0, 0.42); +} +.mdc-text-field--filled:not(.mdc-text-field--disabled):hover .mdc-line-ripple::before { + border-bottom-color: rgba(0, 0, 0, 0.87); +} +.mdc-text-field--filled .mdc-line-ripple::after { + border-bottom-color: #6200ee; + /* @alternate */ + border-bottom-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-text-field--filled .mdc-floating-label { + /* @noflip */ + left: 16px; + /* @noflip */ + right: initial; +} +[dir=rtl] .mdc-text-field--filled .mdc-floating-label, .mdc-text-field--filled .mdc-floating-label[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 16px; +} + +.mdc-text-field--filled .mdc-floating-label--float-above { + -webkit-transform: translateY(-106%) scale(0.75); + transform: translateY(-106%) scale(0.75); +} +.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input { + height: 100%; +} +.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label { + display: none; +} +.mdc-text-field--filled.mdc-text-field--no-label::before { + display: none; +} +@supports (-webkit-hyphens: none) { + .mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__affix { + align-items: center; + align-self: center; + display: inline-flex; + height: 100%; + } +} + +.mdc-text-field--outlined { + height: 56px; + overflow: visible; +} +.mdc-text-field--outlined .mdc-floating-label--float-above { + -webkit-transform: translateY(-37.25px) scale(1); + transform: translateY(-37.25px) scale(1); +} +.mdc-text-field--outlined .mdc-floating-label--float-above { + font-size: 0.75rem; +} +.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + -webkit-transform: translateY(-34.75px) scale(0.75); + transform: translateY(-34.75px) scale(0.75); +} +.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + font-size: 1rem; +} +.mdc-text-field--outlined .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-text-field-outlined 250ms 1; + animation: mdc-floating-label-shake-float-above-text-field-outlined 250ms 1; +} +@-webkit-keyframes mdc-floating-label-shake-float-above-text-field-outlined { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + } +} +@keyframes mdc-floating-label-shake-float-above-text-field-outlined { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75); + } +} +.mdc-text-field--outlined .mdc-text-field__input { + height: 100%; +} +.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading, +.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch, +.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing { + border-color: rgba(0, 0, 0, 0.38); +} +.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__leading, +.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__notch, +.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__trailing { + border-color: rgba(0, 0, 0, 0.87); +} +.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading, +.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch, +.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing { + border-color: #6200ee; + /* @alternate */ + border-color: var(--mdc-theme-primary, #6200ee); +} +.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading { + /* @noflip */ + border-top-left-radius: 4px; + /* @alternate */ + /* @noflip */ + border-top-left-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-top-right-radius: 0; + /* @noflip */ + border-bottom-right-radius: 0; + /* @noflip */ + border-bottom-left-radius: 4px; + /* @alternate */ + /* @noflip */ + border-bottom-left-radius: var(--mdc-shape-small, 4px); +} +[dir=rtl] .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading, .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading[dir=rtl] { + /* @noflip */ + border-top-left-radius: 0; + /* @noflip */ + border-top-right-radius: 4px; + /* @alternate */ + /* @noflip */ + border-top-right-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-bottom-right-radius: 4px; + /* @alternate */ + /* @noflip */ + border-bottom-right-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-bottom-left-radius: 0; +} + +@supports (top: max(0%)) { + .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading { + width: max(12px, var(--mdc-shape-small, 4px)); + } +} +@supports (top: max(0%)) { + .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch { + max-width: calc(100% - max(12px, var(--mdc-shape-small, 4px)) * 2); + } +} +.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing { + /* @noflip */ + border-top-left-radius: 0; + /* @noflip */ + border-top-right-radius: 4px; + /* @alternate */ + /* @noflip */ + border-top-right-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-bottom-right-radius: 4px; + /* @alternate */ + /* @noflip */ + border-bottom-right-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-bottom-left-radius: 0; +} +[dir=rtl] .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing, .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing[dir=rtl] { + /* @noflip */ + border-top-left-radius: 4px; + /* @alternate */ + /* @noflip */ + border-top-left-radius: var(--mdc-shape-small, 4px); + /* @noflip */ + border-top-right-radius: 0; + /* @noflip */ + border-bottom-right-radius: 0; + /* @noflip */ + border-bottom-left-radius: 4px; + /* @alternate */ + /* @noflip */ + border-bottom-left-radius: var(--mdc-shape-small, 4px); +} + +@supports (top: max(0%)) { + .mdc-text-field--outlined { + /* @noflip */ + padding-left: max(16px, calc(var(--mdc-shape-small, 4px) + 4px)); + } +} +@supports (top: max(0%)) { + .mdc-text-field--outlined { + /* @noflip */ + padding-right: max(16px, var(--mdc-shape-small, 4px)); + } +} +@supports (top: max(0%)) { + .mdc-text-field--outlined + .mdc-text-field-helper-line { + /* @noflip */ + padding-left: max(16px, calc(var(--mdc-shape-small, 4px) + 4px)); + } +} +@supports (top: max(0%)) { + .mdc-text-field--outlined + .mdc-text-field-helper-line { + /* @noflip */ + padding-right: max(16px, var(--mdc-shape-small, 4px)); + } +} +.mdc-text-field--outlined.mdc-text-field--with-leading-icon { + /* @noflip */ + padding-left: 0; +} +@supports (top: max(0%)) { + .mdc-text-field--outlined.mdc-text-field--with-leading-icon { + /* @noflip */ + padding-right: max(16px, var(--mdc-shape-small, 4px)); + } +} +[dir=rtl] .mdc-text-field--outlined.mdc-text-field--with-leading-icon, .mdc-text-field--outlined.mdc-text-field--with-leading-icon[dir=rtl] { + /* @noflip */ + padding-right: 0; +} +@supports (top: max(0%)) { + [dir=rtl] .mdc-text-field--outlined.mdc-text-field--with-leading-icon, .mdc-text-field--outlined.mdc-text-field--with-leading-icon[dir=rtl] { + /* @noflip */ + padding-left: max(16px, var(--mdc-shape-small, 4px)); + } +} + +.mdc-text-field--outlined.mdc-text-field--with-trailing-icon { + /* @noflip */ + padding-right: 0; +} +@supports (top: max(0%)) { + .mdc-text-field--outlined.mdc-text-field--with-trailing-icon { + /* @noflip */ + padding-left: max(16px, calc(var(--mdc-shape-small, 4px) + 4px)); + } +} +[dir=rtl] .mdc-text-field--outlined.mdc-text-field--with-trailing-icon, .mdc-text-field--outlined.mdc-text-field--with-trailing-icon[dir=rtl] { + /* @noflip */ + padding-left: 0; +} +@supports (top: max(0%)) { + [dir=rtl] .mdc-text-field--outlined.mdc-text-field--with-trailing-icon, .mdc-text-field--outlined.mdc-text-field--with-trailing-icon[dir=rtl] { + /* @noflip */ + padding-right: max(16px, calc(var(--mdc-shape-small, 4px) + 4px)); + } +} + +.mdc-text-field--outlined.mdc-text-field--with-leading-icon.mdc-text-field--with-trailing-icon { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 0; +} +.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch { + padding-top: 1px; +} +.mdc-text-field--outlined .mdc-text-field__ripple::before, +.mdc-text-field--outlined .mdc-text-field__ripple::after { + content: none; +} +.mdc-text-field--outlined .mdc-floating-label { + /* @noflip */ + left: 4px; + /* @noflip */ + right: initial; +} +[dir=rtl] .mdc-text-field--outlined .mdc-floating-label, .mdc-text-field--outlined .mdc-floating-label[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 4px; +} + +.mdc-text-field--outlined .mdc-text-field__input { + display: flex; + border: none !important; + background-color: transparent; +} +.mdc-text-field--outlined .mdc-notched-outline { + z-index: 1; +} + +.mdc-text-field--textarea { + flex-direction: column; + align-items: center; + width: auto; + height: auto; + padding: 0; + transition: none; +} +.mdc-text-field--textarea .mdc-floating-label { + top: 19px; +} +.mdc-text-field--textarea .mdc-floating-label:not(.mdc-floating-label--float-above) { + -webkit-transform: none; + transform: none; +} +.mdc-text-field--textarea .mdc-text-field__input { + flex-grow: 1; + height: auto; + min-height: 1.5rem; + overflow-x: hidden; + overflow-y: auto; + box-sizing: border-box; + resize: none; + padding: 0 16px; + line-height: 1.5rem; +} +.mdc-text-field--textarea.mdc-text-field--filled::before { + display: none; +} +.mdc-text-field--textarea.mdc-text-field--filled .mdc-floating-label--float-above { + -webkit-transform: translateY(-10.25px) scale(0.75); + transform: translateY(-10.25px) scale(0.75); +} +.mdc-text-field--textarea.mdc-text-field--filled .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-textarea-filled 250ms 1; + animation: mdc-floating-label-shake-float-above-textarea-filled 250ms 1; +} +@-webkit-keyframes mdc-floating-label-shake-float-above-textarea-filled { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-10.25px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-10.25px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-10.25px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-10.25px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75); + } +} +@keyframes mdc-floating-label-shake-float-above-textarea-filled { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-10.25px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-10.25px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-10.25px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-10.25px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75); + } +} +.mdc-text-field--textarea.mdc-text-field--filled .mdc-text-field__input { + margin-top: 23px; + margin-bottom: 9px; +} +.mdc-text-field--textarea.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input { + margin-top: 16px; + margin-bottom: 16px; +} +.mdc-text-field--textarea.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch { + padding-top: 0; +} +.mdc-text-field--textarea.mdc-text-field--outlined .mdc-floating-label--float-above { + -webkit-transform: translateY(-27.25px) scale(1); + transform: translateY(-27.25px) scale(1); +} +.mdc-text-field--textarea.mdc-text-field--outlined .mdc-floating-label--float-above { + font-size: 0.75rem; +} +.mdc-text-field--textarea.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-text-field--textarea.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + -webkit-transform: translateY(-24.75px) scale(0.75); + transform: translateY(-24.75px) scale(0.75); +} +.mdc-text-field--textarea.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-text-field--textarea.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + font-size: 1rem; +} +.mdc-text-field--textarea.mdc-text-field--outlined .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-textarea-outlined 250ms 1; + animation: mdc-floating-label-shake-float-above-textarea-outlined 250ms 1; +} +@-webkit-keyframes mdc-floating-label-shake-float-above-textarea-outlined { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + } +} +@keyframes mdc-floating-label-shake-float-above-textarea-outlined { + 0% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + transform: translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75); + } +} +.mdc-text-field--textarea.mdc-text-field--outlined .mdc-text-field__input { + margin-top: 16px; + margin-bottom: 16px; +} +.mdc-text-field--textarea.mdc-text-field--outlined .mdc-floating-label { + top: 18px; +} +.mdc-text-field--textarea.mdc-text-field--with-internal-counter .mdc-text-field__input { + margin-bottom: 2px; +} +.mdc-text-field--textarea.mdc-text-field--with-internal-counter .mdc-text-field-character-counter { + align-self: flex-end; + padding: 0 16px; +} +.mdc-text-field--textarea.mdc-text-field--with-internal-counter .mdc-text-field-character-counter::after { + display: inline-block; + width: 0; + height: 16px; + content: ""; + vertical-align: -16px; +} +.mdc-text-field--textarea.mdc-text-field--with-internal-counter .mdc-text-field-character-counter::before { + display: none; +} + +.mdc-text-field__resizer { + align-self: stretch; + display: inline-flex; + flex-direction: column; + flex-grow: 1; + max-height: 100%; + max-width: 100%; + min-height: 56px; + min-width: -webkit-fit-content; + min-width: -moz-fit-content; + min-width: fit-content; + /* @alternate */ + min-width: -moz-available; + /* @alternate */ + min-width: -webkit-fill-available; + overflow: hidden; + resize: both; +} +.mdc-text-field--filled .mdc-text-field__resizer { + -webkit-transform: translateY(-1px); + transform: translateY(-1px); +} +.mdc-text-field--filled .mdc-text-field__resizer .mdc-text-field__input, +.mdc-text-field--filled .mdc-text-field__resizer .mdc-text-field-character-counter { + -webkit-transform: translateY(1px); + transform: translateY(1px); +} +.mdc-text-field--outlined .mdc-text-field__resizer { + -webkit-transform: translateX(-1px) translateY(-1px); + transform: translateX(-1px) translateY(-1px); +} +[dir=rtl] .mdc-text-field--outlined .mdc-text-field__resizer, .mdc-text-field--outlined .mdc-text-field__resizer[dir=rtl] { + -webkit-transform: translateX(1px) translateY(-1px); + transform: translateX(1px) translateY(-1px); +} + +.mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field__input, +.mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field-character-counter { + -webkit-transform: translateX(1px) translateY(1px); + transform: translateX(1px) translateY(1px); +} +[dir=rtl] .mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field__input, [dir=rtl] .mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field-character-counter, .mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field__input[dir=rtl], .mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field-character-counter[dir=rtl] { + -webkit-transform: translateX(-1px) translateY(1px); + transform: translateX(-1px) translateY(1px); +} + +.mdc-text-field--with-leading-icon { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 16px; +} +[dir=rtl] .mdc-text-field--with-leading-icon, .mdc-text-field--with-leading-icon[dir=rtl] { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 0; +} + +.mdc-text-field--with-leading-icon.mdc-text-field--filled .mdc-floating-label { + max-width: calc(100% - 48px); + /* @noflip */ + left: 48px; + /* @noflip */ + right: initial; +} +[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--filled .mdc-floating-label, .mdc-text-field--with-leading-icon.mdc-text-field--filled .mdc-floating-label[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 48px; +} + +.mdc-text-field--with-leading-icon.mdc-text-field--filled .mdc-floating-label--float-above { + max-width: calc(100% / 0.75 - 64px / 0.75); +} +.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label { + /* @noflip */ + left: 36px; + /* @noflip */ + right: initial; +} +[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label, .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label[dir=rtl] { + /* @noflip */ + left: initial; + /* @noflip */ + right: 36px; +} + +.mdc-text-field--with-leading-icon.mdc-text-field--outlined :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch { + max-width: calc(100% - 60px); +} +.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--float-above { + -webkit-transform: translateY(-37.25px) translateX(-32px) scale(1); + transform: translateY(-37.25px) translateX(-32px) scale(1); +} +[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--float-above, .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--float-above[dir=rtl] { + -webkit-transform: translateY(-37.25px) translateX(32px) scale(1); + transform: translateY(-37.25px) translateX(32px) scale(1); +} + +.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--float-above { + font-size: 0.75rem; +} +.mdc-text-field--with-leading-icon.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + -webkit-transform: translateY(-34.75px) translateX(-32px) scale(0.75); + transform: translateY(-34.75px) translateX(-32px) scale(0.75); +} +[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above, [dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above, .mdc-text-field--with-leading-icon.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above[dir=rtl], .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above[dir=rtl] { + -webkit-transform: translateY(-34.75px) translateX(32px) scale(0.75); + transform: translateY(-34.75px) translateX(32px) scale(0.75); +} + +.mdc-text-field--with-leading-icon.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above, +.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above { + font-size: 1rem; +} +.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-text-field-outlined-leading-icon 250ms 1; + animation: mdc-floating-label-shake-float-above-text-field-outlined-leading-icon 250ms 1; +} +@-webkit-keyframes mdc-floating-label-shake-float-above-text-field-outlined-leading-icon { + 0% { + -webkit-transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + } +} +@keyframes mdc-floating-label-shake-float-above-text-field-outlined-leading-icon { + 0% { + -webkit-transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75); + } +} +[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--shake, .mdc-text-field--with-leading-icon.mdc-text-field--outlined[dir=rtl] .mdc-floating-label--shake { + -webkit-animation: mdc-floating-label-shake-float-above-text-field-outlined-leading-icon 250ms 1; + animation: mdc-floating-label-shake-float-above-text-field-outlined-leading-icon 250ms 1; +} + +@-webkit-keyframes mdc-floating-label-shake-float-above-text-field-outlined-leading-icon-rtl { + 0% { + -webkit-transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + } +} + +@keyframes mdc-floating-label-shake-float-above-text-field-outlined-leading-icon-rtl { + 0% { + -webkit-transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + } + 33% { + -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + animation-timing-function: cubic-bezier(0.5, 0, 0.701732, 0.495819); + -webkit-transform: translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75); + } + 66% { + -webkit-animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + animation-timing-function: cubic-bezier(0.302435, 0.381352, 0.55, 0.956352); + -webkit-transform: translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75); + } + 100% { + -webkit-transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + transform: translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75); + } +} + +.mdc-text-field--with-trailing-icon { + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-text-field--with-trailing-icon, .mdc-text-field--with-trailing-icon[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 16px; +} + +.mdc-text-field--with-trailing-icon.mdc-text-field--filled .mdc-floating-label { + max-width: calc(100% - 64px); +} +.mdc-text-field--with-trailing-icon.mdc-text-field--filled .mdc-floating-label--float-above { + max-width: calc(100% / 0.75 - 64px / 0.75); +} +.mdc-text-field--with-trailing-icon.mdc-text-field--outlined :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch { + max-width: calc(100% - 60px); +} + +.mdc-text-field--with-leading-icon.mdc-text-field--with-trailing-icon { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 0; +} +.mdc-text-field--with-leading-icon.mdc-text-field--with-trailing-icon.mdc-text-field--filled .mdc-floating-label { + max-width: calc(100% - 96px); +} +.mdc-text-field--with-leading-icon.mdc-text-field--with-trailing-icon.mdc-text-field--filled .mdc-floating-label--float-above { + max-width: calc(100% / 0.75 - 96px / 0.75); +} + +.mdc-text-field-helper-line { + display: flex; + justify-content: space-between; + box-sizing: border-box; +} +.mdc-text-field + .mdc-text-field-helper-line { + padding-right: 16px; + padding-left: 16px; +} + +.mdc-form-field > .mdc-text-field + label { + align-self: flex-start; +} + +.mdc-text-field--focused:not(.mdc-text-field--disabled) .mdc-floating-label { + color: rgba(98, 0, 238, 0.87); +} +.mdc-text-field--focused .mdc-notched-outline__leading, +.mdc-text-field--focused .mdc-notched-outline__notch, +.mdc-text-field--focused .mdc-notched-outline__trailing { + border-width: 2px; +} +.mdc-text-field--focused + .mdc-text-field-helper-line .mdc-text-field-helper-text:not(.mdc-text-field-helper-text--validation-msg) { + opacity: 1; +} +.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch { + padding-top: 2px; +} +.mdc-text-field--focused.mdc-text-field--outlined.mdc-text-field--textarea .mdc-notched-outline--notched .mdc-notched-outline__notch { + padding-top: 0; +} + +.mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-line-ripple::before { + border-bottom-color: #b00020; + /* @alternate */ + border-bottom-color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after { + border-bottom-color: #b00020; + /* @alternate */ + border-bottom-color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-floating-label { + color: #b00020; + /* @alternate */ + color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid:not(.mdc-text-field--disabled).mdc-text-field--invalid + .mdc-text-field-helper-line .mdc-text-field-helper-text--validation-msg { + color: #b00020; + /* @alternate */ + color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid .mdc-text-field__input { + caret-color: #b00020; + /* @alternate */ + caret-color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__icon--trailing { + color: #b00020; + /* @alternate */ + color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::before { + border-bottom-color: #b00020; + /* @alternate */ + border-bottom-color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-notched-outline__leading, +.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-notched-outline__notch, +.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing { + border-color: #b00020; + /* @alternate */ + border-color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__leading, +.mdc-text-field--invalid:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__notch, +.mdc-text-field--invalid:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__trailing { + border-color: #b00020; + /* @alternate */ + border-color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading, +.mdc-text-field--invalid:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch, +.mdc-text-field--invalid:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing { + border-color: #b00020; + /* @alternate */ + border-color: var(--mdc-theme-error, #b00020); +} +.mdc-text-field--invalid + .mdc-text-field-helper-line .mdc-text-field-helper-text--validation-msg { + opacity: 1; +} + +.mdc-text-field--disabled { + pointer-events: none; +} +.mdc-text-field--disabled .mdc-text-field__input { + color: rgba(0, 0, 0, 0.38); +} +@media all { + .mdc-text-field--disabled .mdc-text-field__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, 0.38); + } + .mdc-text-field--disabled .mdc-text-field__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.38); + } + .mdc-text-field--disabled .mdc-text-field__input::-ms-input-placeholder { + color: rgba(0, 0, 0, 0.38); + } + .mdc-text-field--disabled .mdc-text-field__input::placeholder { + color: rgba(0, 0, 0, 0.38); + } +} +@media all { + .mdc-text-field--disabled .mdc-text-field__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.38); + } +} +.mdc-text-field--disabled .mdc-floating-label { + color: rgba(0, 0, 0, 0.38); +} +.mdc-text-field--disabled + .mdc-text-field-helper-line .mdc-text-field-helper-text { + color: rgba(0, 0, 0, 0.38); +} +.mdc-text-field--disabled .mdc-text-field-character-counter, +.mdc-text-field--disabled + .mdc-text-field-helper-line .mdc-text-field-character-counter { + color: rgba(0, 0, 0, 0.38); +} +.mdc-text-field--disabled .mdc-text-field__icon--leading { + color: rgba(0, 0, 0, 0.3); +} +.mdc-text-field--disabled .mdc-text-field__icon--trailing { + color: rgba(0, 0, 0, 0.3); +} +.mdc-text-field--disabled .mdc-text-field__affix--prefix { + color: rgba(0, 0, 0, 0.38); +} +.mdc-text-field--disabled .mdc-text-field__affix--suffix { + color: rgba(0, 0, 0, 0.38); +} +.mdc-text-field--disabled .mdc-line-ripple::before { + border-bottom-color: rgba(0, 0, 0, 0.06); +} +.mdc-text-field--disabled .mdc-notched-outline__leading, +.mdc-text-field--disabled .mdc-notched-outline__notch, +.mdc-text-field--disabled .mdc-notched-outline__trailing { + border-color: rgba(0, 0, 0, 0.06); +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-text-field__input::-webkit-input-placeholder { + color: GrayText; + } + .mdc-text-field--disabled .mdc-text-field__input:-ms-input-placeholder { + color: GrayText; + } + .mdc-text-field--disabled .mdc-text-field__input::-ms-input-placeholder { + color: GrayText; + } + .mdc-text-field--disabled .mdc-text-field__input::placeholder { + color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-text-field__input:-ms-input-placeholder { + color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-floating-label { + color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled + .mdc-text-field-helper-line .mdc-text-field-helper-text { + color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-text-field-character-counter, +.mdc-text-field--disabled + .mdc-text-field-helper-line .mdc-text-field-character-counter { + color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-text-field__icon--leading { + color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-text-field__icon--trailing { + color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-text-field__affix--prefix { + color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-text-field__affix--suffix { + color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-line-ripple::before { + border-bottom-color: GrayText; + } +} +@media screen and (forced-colors: active), (-ms-high-contrast: active) { + .mdc-text-field--disabled .mdc-notched-outline__leading, +.mdc-text-field--disabled .mdc-notched-outline__notch, +.mdc-text-field--disabled .mdc-notched-outline__trailing { + border-color: GrayText; + } +} +@media screen and (forced-colors: active) { + .mdc-text-field--disabled .mdc-text-field__input { + background-color: Window; + } + .mdc-text-field--disabled .mdc-floating-label { + z-index: 1; + } +} +.mdc-text-field--disabled .mdc-floating-label { + cursor: default; +} +.mdc-text-field--disabled.mdc-text-field--filled { + background-color: #fafafa; +} +.mdc-text-field--disabled.mdc-text-field--filled .mdc-text-field__ripple { + display: none; +} +.mdc-text-field--disabled .mdc-text-field__input { + pointer-events: auto; +} + +.mdc-text-field--end-aligned .mdc-text-field__input { + /* @noflip */ + text-align: right; +} +[dir=rtl] .mdc-text-field--end-aligned .mdc-text-field__input, .mdc-text-field--end-aligned .mdc-text-field__input[dir=rtl] { + /* @noflip */ + text-align: left; +} + +[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__input, +[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix, .mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__input, +.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix { + /* @noflip */ + direction: ltr; +} +[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix--prefix, .mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix--prefix { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 2px; +} +[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix--suffix, .mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix--suffix { + /* @noflip */ + padding-left: 12px; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__icon--leading, .mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__icon--leading { + order: 1; +} +[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix--suffix, .mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix--suffix { + order: 2; +} +[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__input, .mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__input { + order: 3; +} +[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix--prefix, .mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix--prefix { + order: 4; +} +[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__icon--trailing, .mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__icon--trailing { + order: 5; +} + +[dir=rtl] .mdc-text-field--ltr-text.mdc-text-field--end-aligned .mdc-text-field__input, .mdc-text-field--ltr-text.mdc-text-field--end-aligned[dir=rtl] .mdc-text-field__input { + /* @noflip */ + text-align: right; +} +[dir=rtl] .mdc-text-field--ltr-text.mdc-text-field--end-aligned .mdc-text-field__affix--prefix, .mdc-text-field--ltr-text.mdc-text-field--end-aligned[dir=rtl] .mdc-text-field__affix--prefix { + /* @noflip */ + padding-right: 12px; +} +[dir=rtl] .mdc-text-field--ltr-text.mdc-text-field--end-aligned .mdc-text-field__affix--suffix, .mdc-text-field--ltr-text.mdc-text-field--end-aligned[dir=rtl] .mdc-text-field__affix--suffix { + /* @noflip */ + padding-left: 2px; +} + +.mdc-text-field-helper-text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.75rem; + /* @alternate */ + font-size: var(--mdc-typography-caption-font-size, 0.75rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-caption-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: 0.0333333333em; + /* @alternate */ + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-caption-text-transform, inherit); + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + margin: 0; + opacity: 0; + will-change: opacity; + transition: opacity 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1); +} +.mdc-text-field-helper-text::before { + display: inline-block; + width: 0; + height: 16px; + content: ""; + vertical-align: 0; +} + +.mdc-text-field-helper-text--persistent { + transition: none; + opacity: 1; + will-change: initial; +} + +.mdc-text-field-character-counter { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.75rem; + /* @alternate */ + font-size: var(--mdc-typography-caption-font-size, 0.75rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-caption-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: 0.0333333333em; + /* @alternate */ + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-caption-text-transform, inherit); + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + /* @noflip */ + margin-left: auto; + /* @noflip */ + margin-right: 0; + /* @noflip */ + padding-left: 16px; + /* @noflip */ + padding-right: 0; + white-space: nowrap; +} +.mdc-text-field-character-counter::before { + display: inline-block; + width: 0; + height: 16px; + content: ""; + vertical-align: 0; +} +[dir=rtl] .mdc-text-field-character-counter, .mdc-text-field-character-counter[dir=rtl] { + /* @noflip */ + margin-left: 0; + /* @noflip */ + margin-right: auto; +} + +[dir=rtl] .mdc-text-field-character-counter, .mdc-text-field-character-counter[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 16px; +} + +.mdc-text-field__icon { + align-self: center; + cursor: pointer; +} +.mdc-text-field__icon:not([tabindex]), .mdc-text-field__icon[tabindex="-1"] { + cursor: default; + pointer-events: none; +} +.mdc-text-field__icon svg { + display: block; +} + +.mdc-text-field__icon--leading { + /* @noflip */ + margin-left: 16px; + /* @noflip */ + margin-right: 8px; +} +[dir=rtl] .mdc-text-field__icon--leading, .mdc-text-field__icon--leading[dir=rtl] { + /* @noflip */ + margin-left: 8px; + /* @noflip */ + margin-right: 16px; +} + +.mdc-text-field__icon--trailing { + padding: 12px; + /* @noflip */ + margin-left: 0px; + /* @noflip */ + margin-right: 0px; +} +[dir=rtl] .mdc-text-field__icon--trailing, .mdc-text-field__icon--trailing[dir=rtl] { + /* @noflip */ + margin-left: 0px; + /* @noflip */ + margin-right: 0px; +} + +:root { + --mdc-theme-primary: #6200ee; + --mdc-theme-secondary: #018786; + --mdc-theme-background: #fff; + --mdc-theme-surface: #fff; + --mdc-theme-error: #b00020; + --mdc-theme-on-primary: #fff; + --mdc-theme-on-secondary: #fff; + --mdc-theme-on-surface: #000; + --mdc-theme-on-error: #fff; + --mdc-theme-text-primary-on-background: rgba(0, 0, 0, 0.87); + --mdc-theme-text-secondary-on-background: rgba(0, 0, 0, 0.54); + --mdc-theme-text-hint-on-background: rgba(0, 0, 0, 0.38); + --mdc-theme-text-disabled-on-background: rgba(0, 0, 0, 0.38); + --mdc-theme-text-icon-on-background: rgba(0, 0, 0, 0.38); + --mdc-theme-text-primary-on-light: rgba(0, 0, 0, 0.87); + --mdc-theme-text-secondary-on-light: rgba(0, 0, 0, 0.54); + --mdc-theme-text-hint-on-light: rgba(0, 0, 0, 0.38); + --mdc-theme-text-disabled-on-light: rgba(0, 0, 0, 0.38); + --mdc-theme-text-icon-on-light: rgba(0, 0, 0, 0.38); + --mdc-theme-text-primary-on-dark: white; + --mdc-theme-text-secondary-on-dark: rgba(255, 255, 255, 0.7); + --mdc-theme-text-hint-on-dark: rgba(255, 255, 255, 0.5); + --mdc-theme-text-disabled-on-dark: rgba(255, 255, 255, 0.5); + --mdc-theme-text-icon-on-dark: rgba(255, 255, 255, 0.5); +} + +.mdc-theme--primary { + color: #6200ee !important; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee) !important; +} + +.mdc-theme--secondary { + color: #018786 !important; + /* @alternate */ + color: var(--mdc-theme-secondary, #018786) !important; +} + +.mdc-theme--background { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-background, #fff); +} + +.mdc-theme--surface { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-theme-surface, #fff); +} + +.mdc-theme--error { + color: #b00020 !important; + /* @alternate */ + color: var(--mdc-theme-error, #b00020) !important; +} + +.mdc-theme--on-primary { + color: #fff !important; + /* @alternate */ + color: var(--mdc-theme-on-primary, #fff) !important; +} + +.mdc-theme--on-secondary { + color: #fff !important; + /* @alternate */ + color: var(--mdc-theme-on-secondary, #fff) !important; +} + +.mdc-theme--on-surface { + color: #000 !important; + /* @alternate */ + color: var(--mdc-theme-on-surface, #000) !important; +} + +.mdc-theme--on-error { + color: #fff !important; + /* @alternate */ + color: var(--mdc-theme-on-error, #fff) !important; +} + +.mdc-theme--text-primary-on-background { + color: rgba(0, 0, 0, 0.87) !important; + /* @alternate */ + color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)) !important; +} + +.mdc-theme--text-secondary-on-background { + color: rgba(0, 0, 0, 0.54) !important; + /* @alternate */ + color: var(--mdc-theme-text-secondary-on-background, rgba(0, 0, 0, 0.54)) !important; +} + +.mdc-theme--text-hint-on-background { + color: rgba(0, 0, 0, 0.38) !important; + /* @alternate */ + color: var(--mdc-theme-text-hint-on-background, rgba(0, 0, 0, 0.38)) !important; +} + +.mdc-theme--text-disabled-on-background { + color: rgba(0, 0, 0, 0.38) !important; + /* @alternate */ + color: var(--mdc-theme-text-disabled-on-background, rgba(0, 0, 0, 0.38)) !important; +} + +.mdc-theme--text-icon-on-background { + color: rgba(0, 0, 0, 0.38) !important; + /* @alternate */ + color: var(--mdc-theme-text-icon-on-background, rgba(0, 0, 0, 0.38)) !important; +} + +.mdc-theme--text-primary-on-light { + color: rgba(0, 0, 0, 0.87) !important; + /* @alternate */ + color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)) !important; +} + +.mdc-theme--text-secondary-on-light { + color: rgba(0, 0, 0, 0.54) !important; + /* @alternate */ + color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)) !important; +} + +.mdc-theme--text-hint-on-light { + color: rgba(0, 0, 0, 0.38) !important; + /* @alternate */ + color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38)) !important; +} + +.mdc-theme--text-disabled-on-light { + color: rgba(0, 0, 0, 0.38) !important; + /* @alternate */ + color: var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38)) !important; +} + +.mdc-theme--text-icon-on-light { + color: rgba(0, 0, 0, 0.38) !important; + /* @alternate */ + color: var(--mdc-theme-text-icon-on-light, rgba(0, 0, 0, 0.38)) !important; +} + +.mdc-theme--text-primary-on-dark { + color: white !important; + /* @alternate */ + color: var(--mdc-theme-text-primary-on-dark, white) !important; +} + +.mdc-theme--text-secondary-on-dark { + color: rgba(255, 255, 255, 0.7) !important; + /* @alternate */ + color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)) !important; +} + +.mdc-theme--text-hint-on-dark { + color: rgba(255, 255, 255, 0.5) !important; + /* @alternate */ + color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)) !important; +} + +.mdc-theme--text-disabled-on-dark { + color: rgba(255, 255, 255, 0.5) !important; + /* @alternate */ + color: var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5)) !important; +} + +.mdc-theme--text-icon-on-dark { + color: rgba(255, 255, 255, 0.5) !important; + /* @alternate */ + color: var(--mdc-theme-text-icon-on-dark, rgba(255, 255, 255, 0.5)) !important; +} + +.mdc-theme--primary-bg { + background-color: #6200ee !important; + /* @alternate */ + background-color: var(--mdc-theme-primary, #6200ee) !important; +} + +.mdc-theme--secondary-bg { + background-color: #018786 !important; + /* @alternate */ + background-color: var(--mdc-theme-secondary, #018786) !important; +} + +.mdc-tooltip__surface { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); +} + +.mdc-tooltip__caret-surface-top, +.mdc-tooltip__caret-surface-bottom { + border-radius: 4px; + /* @alternate */ + border-radius: var(--mdc-shape-small, 4px); +} + +.mdc-tooltip__surface { + color: white; + /* @alternate */ + color: var(--mdc-theme-text-primary-on-dark, white); +} + +.mdc-tooltip__surface { + background-color: rgba(0, 0, 0, 0.6); +} + +.mdc-tooltip__surface { + word-break: break-all; + /* @alternate */ + word-break: var(--mdc-tooltip-word-break, normal); + overflow-wrap: anywhere; +} + +.mdc-tooltip { + z-index: 9; +} + +.mdc-tooltip--showing-transition .mdc-tooltip__surface-animation { + transition: opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1); + transition: opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1); +} + +.mdc-tooltip--hide-transition .mdc-tooltip__surface-animation { + transition: opacity 75ms 0ms cubic-bezier(0.4, 0, 1, 1); +} + +.mdc-tooltip__title { + color: rgba(0, 0, 0, 0.87); + /* @alternate */ + color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); +} + +.mdc-tooltip__content { + color: rgba(0, 0, 0, 0.6); +} + +.mdc-tooltip__content-link { + color: #6200ee; + /* @alternate */ + color: var(--mdc-theme-primary, #6200ee); +} + +.mdc-tooltip { + position: fixed; + display: none; +} +.mdc-tooltip.mdc-tooltip--rich .mdc-tooltip__surface { + background-color: #fff; +} +.mdc-tooltip.mdc-tooltip--rich .mdc-tooltip__caret-surface-top, +.mdc-tooltip.mdc-tooltip--rich .mdc-tooltip__caret-surface-bottom { + background-color: #fff; +} + +.mdc-tooltip-wrapper--rich { + position: relative; +} + +.mdc-tooltip--shown, +.mdc-tooltip--showing, +.mdc-tooltip--hide { + display: inline-flex; +} +.mdc-tooltip--shown.mdc-tooltip--rich, +.mdc-tooltip--showing.mdc-tooltip--rich, +.mdc-tooltip--hide.mdc-tooltip--rich { + display: inline-block; + /* @noflip */ + left: -320px; + position: absolute; +} + +.mdc-tooltip__surface { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.75rem; + /* @alternate */ + font-size: var(--mdc-typography-caption-font-size, 0.75rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: 0.0333333333em; + /* @alternate */ + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-caption-text-transform, inherit); + line-height: 16px; + padding: 4px 8px; + min-width: 40px; + max-width: 200px; + min-height: 24px; + max-height: 40vh; + box-sizing: border-box; + overflow: hidden; + text-align: center; +} +.mdc-tooltip__surface::before { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 100%; + top: 0; + left: 0; + border: 1px solid transparent; + border-radius: inherit; + content: ""; + pointer-events: none; +} +.mdc-tooltip--rich .mdc-tooltip__surface { + /* @alternate */ + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + align-items: flex-start; + border-radius: 4px; + display: flex; + flex-direction: column; + line-height: 20px; + min-height: 24px; + min-width: 40px; + max-width: 320px; + position: relative; +} +.mdc-tooltip--rich .mdc-tooltip__surface .mdc-elevation-overlay { + width: 100%; + height: 100%; + top: 0; + /* @noflip */ + left: 0; +} +.mdc-tooltip--multiline .mdc-tooltip__surface { + /* @noflip */ + text-align: left; +} +[dir=rtl] .mdc-tooltip--multiline .mdc-tooltip__surface, .mdc-tooltip--multiline .mdc-tooltip__surface[dir=rtl] { + /* @noflip */ + text-align: right; +} + +.mdc-tooltip__surface .mdc-tooltip__title { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle2-font-size, 0.875rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle2-font-weight, 500); + letter-spacing: 0.0071428571em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle2-text-transform, inherit); + margin: 0 8px; +} +.mdc-tooltip__surface .mdc-tooltip__title::before { + display: inline-block; + width: 0; + height: 28px; + content: ""; + vertical-align: 0; +} +.mdc-tooltip__surface .mdc-tooltip__content { + display: block; + margin-top: 0; + /* @alternate */ + line-height: normal; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); + max-width: calc(100% - 2 * 8px); + margin: 0 8px 16px 8px; + /* @noflip */ + text-align: left; +} +.mdc-tooltip__surface .mdc-tooltip__content::before { + display: inline-block; + width: 0; + height: 24px; + content: ""; + vertical-align: 0; +} +[dir=rtl] .mdc-tooltip__surface .mdc-tooltip__content, .mdc-tooltip__surface .mdc-tooltip__content[dir=rtl] { + /* @noflip */ + text-align: right; +} + +.mdc-tooltip__surface .mdc-tooltip__content-link { + text-decoration: none; +} + +.mdc-tooltip__surface-animation { + opacity: 0; + -webkit-transform: scale(0.8); + transform: scale(0.8); + will-change: transform, opacity; +} +.mdc-tooltip--shown .mdc-tooltip__surface-animation { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; +} +.mdc-tooltip--hide .mdc-tooltip__surface-animation { + -webkit-transform: scale(1); + transform: scale(1); +} + +.mdc-tooltip__caret-surface-top, +.mdc-tooltip__caret-surface-bottom { + position: absolute; + height: 24px; + width: 24px; + -webkit-transform: rotate(35deg) skewY(20deg) scaleX(0.9396926208); + transform: rotate(35deg) skewY(20deg) scaleX(0.9396926208); +} +.mdc-tooltip__caret-surface-top .mdc-elevation-overlay, +.mdc-tooltip__caret-surface-bottom .mdc-elevation-overlay { + width: 100%; + height: 100%; + top: 0; + /* @noflip */ + left: 0; +} + +.mdc-tooltip__caret-surface-bottom { + /* @alternate */ + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + outline: 1px solid transparent; + z-index: -1; +} + +.mdc-top-app-bar { + background-color: #6200ee; + /* @alternate */ + background-color: var(--mdc-theme-primary, #6200ee); + color: white; + display: flex; + position: fixed; + flex-direction: column; + justify-content: space-between; + box-sizing: border-box; + width: 100%; + z-index: 4; +} +.mdc-top-app-bar .mdc-top-app-bar__action-item, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon { + color: #fff; + /* @alternate */ + color: var(--mdc-theme-on-primary, #fff); +} +.mdc-top-app-bar .mdc-top-app-bar__action-item::before, .mdc-top-app-bar .mdc-top-app-bar__action-item::after, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon::before, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon::after { + background-color: #fff; + /* @alternate */ + background-color: var(--mdc-ripple-color, var(--mdc-theme-on-primary, #fff)); +} +.mdc-top-app-bar .mdc-top-app-bar__action-item:hover::before, .mdc-top-app-bar .mdc-top-app-bar__action-item.mdc-ripple-surface--hover::before, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon:hover::before, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon.mdc-ripple-surface--hover::before { + opacity: 0.08; + /* @alternate */ + opacity: var(--mdc-ripple-hover-opacity, 0.08); +} +.mdc-top-app-bar .mdc-top-app-bar__action-item.mdc-ripple-upgraded--background-focused::before, .mdc-top-app-bar .mdc-top-app-bar__action-item:not(.mdc-ripple-upgraded):focus::before, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon.mdc-ripple-upgraded--background-focused::before, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon:not(.mdc-ripple-upgraded):focus::before { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-focus-opacity, 0.24); +} +.mdc-top-app-bar .mdc-top-app-bar__action-item:not(.mdc-ripple-upgraded)::after, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon:not(.mdc-ripple-upgraded)::after { + transition: opacity 150ms linear; +} +.mdc-top-app-bar .mdc-top-app-bar__action-item:not(.mdc-ripple-upgraded):active::after, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon:not(.mdc-ripple-upgraded):active::after { + transition-duration: 75ms; + opacity: 0.24; + /* @alternate */ + opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-top-app-bar .mdc-top-app-bar__action-item.mdc-ripple-upgraded, +.mdc-top-app-bar .mdc-top-app-bar__navigation-icon.mdc-ripple-upgraded { + --mdc-ripple-fg-opacity: var(--mdc-ripple-press-opacity, 0.24); +} +.mdc-top-app-bar__row { + display: flex; + position: relative; + box-sizing: border-box; + width: 100%; + height: 64px; +} +.mdc-top-app-bar__section { + display: inline-flex; + flex: 1 1 auto; + align-items: center; + min-width: 0; + padding: 8px 12px; + z-index: 1; +} +.mdc-top-app-bar__section--align-start { + justify-content: flex-start; + order: -1; +} +.mdc-top-app-bar__section--align-end { + justify-content: flex-end; + order: 1; +} +.mdc-top-app-bar__title { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1.25rem; + /* @alternate */ + font-size: var(--mdc-typography-headline6-font-size, 1.25rem); + line-height: 2rem; + /* @alternate */ + line-height: var(--mdc-typography-headline6-line-height, 2rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-headline6-font-weight, 500); + letter-spacing: 0.0125em; + /* @alternate */ + letter-spacing: var(--mdc-typography-headline6-letter-spacing, 0.0125em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-headline6-text-decoration, inherit); + text-decoration: var(--mdc-typography-headline6-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-headline6-text-transform, inherit); + /* @noflip */ + padding-left: 20px; + /* @noflip */ + padding-right: 0; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + z-index: 1; +} +[dir=rtl] .mdc-top-app-bar__title, .mdc-top-app-bar__title[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 20px; +} + +.mdc-top-app-bar--short-collapsed { + /* @noflip */ + border-top-left-radius: 0; + /* @noflip */ + border-top-right-radius: 0; + /* @noflip */ + border-bottom-right-radius: 24px; + /* @noflip */ + border-bottom-left-radius: 0; +} +[dir=rtl] .mdc-top-app-bar--short-collapsed, .mdc-top-app-bar--short-collapsed[dir=rtl] { + /* @noflip */ + border-top-left-radius: 0; + /* @noflip */ + border-top-right-radius: 0; + /* @noflip */ + border-bottom-right-radius: 0; + /* @noflip */ + border-bottom-left-radius: 24px; +} + +.mdc-top-app-bar--short { + top: 0; + /* @noflip */ + right: auto; + /* @noflip */ + left: 0; + width: 100%; + transition: width 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +[dir=rtl] .mdc-top-app-bar--short, .mdc-top-app-bar--short[dir=rtl] { + /* @noflip */ + right: 0; + /* @noflip */ + left: auto; +} + +.mdc-top-app-bar--short .mdc-top-app-bar__row { + height: 56px; +} +.mdc-top-app-bar--short .mdc-top-app-bar__section { + padding: 4px; +} +.mdc-top-app-bar--short .mdc-top-app-bar__title { + transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1); + opacity: 1; +} + +.mdc-top-app-bar--short-collapsed { + /* @alternate */ + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); + width: 56px; + transition: width 300ms cubic-bezier(0.4, 0, 0.2, 1); +} +.mdc-top-app-bar--short-collapsed .mdc-top-app-bar__title { + display: none; +} +.mdc-top-app-bar--short-collapsed .mdc-top-app-bar__action-item { + transition: padding 150ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.mdc-top-app-bar--short-collapsed.mdc-top-app-bar--short-has-action-item { + width: 112px; +} +.mdc-top-app-bar--short-collapsed.mdc-top-app-bar--short-has-action-item .mdc-top-app-bar__section--align-end { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 12px; +} +[dir=rtl] .mdc-top-app-bar--short-collapsed.mdc-top-app-bar--short-has-action-item .mdc-top-app-bar__section--align-end, .mdc-top-app-bar--short-collapsed.mdc-top-app-bar--short-has-action-item .mdc-top-app-bar__section--align-end[dir=rtl] { + /* @noflip */ + padding-left: 12px; + /* @noflip */ + padding-right: 0; +} + +.mdc-top-app-bar--dense .mdc-top-app-bar__row { + height: 48px; +} +.mdc-top-app-bar--dense .mdc-top-app-bar__section { + padding: 0 4px; +} +.mdc-top-app-bar--dense .mdc-top-app-bar__title { + /* @noflip */ + padding-left: 12px; + /* @noflip */ + padding-right: 0; +} +[dir=rtl] .mdc-top-app-bar--dense .mdc-top-app-bar__title, .mdc-top-app-bar--dense .mdc-top-app-bar__title[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 12px; +} + +.mdc-top-app-bar--prominent .mdc-top-app-bar__row { + height: 128px; +} +.mdc-top-app-bar--prominent .mdc-top-app-bar__title { + align-self: flex-end; + padding-bottom: 2px; +} +.mdc-top-app-bar--prominent .mdc-top-app-bar__action-item, +.mdc-top-app-bar--prominent .mdc-top-app-bar__navigation-icon { + align-self: flex-start; +} + +.mdc-top-app-bar--fixed { + transition: box-shadow 200ms linear; +} + +.mdc-top-app-bar--fixed-scrolled { + /* @alternate */ + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); + transition: box-shadow 200ms linear; +} + +.mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__row { + height: 96px; +} +.mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__section { + padding: 0 12px; +} +.mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__title { + /* @noflip */ + padding-left: 20px; + /* @noflip */ + padding-right: 0; + padding-bottom: 9px; +} +[dir=rtl] .mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__title, .mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__title[dir=rtl] { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 20px; +} + +.mdc-top-app-bar--fixed-adjust { + padding-top: 64px; +} + +.mdc-top-app-bar--dense-fixed-adjust { + padding-top: 48px; +} + +.mdc-top-app-bar--short-fixed-adjust { + padding-top: 56px; +} + +.mdc-top-app-bar--prominent-fixed-adjust { + padding-top: 128px; +} + +.mdc-top-app-bar--dense-prominent-fixed-adjust { + padding-top: 96px; +} + +@media (max-width: 599px) { + .mdc-top-app-bar__row { + height: 56px; + } + + .mdc-top-app-bar__section { + padding: 4px; + } + + .mdc-top-app-bar--short { + transition: width 200ms cubic-bezier(0.4, 0, 0.2, 1); + } + + .mdc-top-app-bar--short-collapsed { + transition: width 250ms cubic-bezier(0.4, 0, 0.2, 1); + } + .mdc-top-app-bar--short-collapsed .mdc-top-app-bar__section--align-end { + /* @noflip */ + padding-left: 0; + /* @noflip */ + padding-right: 12px; + } + [dir=rtl] .mdc-top-app-bar--short-collapsed .mdc-top-app-bar__section--align-end, .mdc-top-app-bar--short-collapsed .mdc-top-app-bar__section--align-end[dir=rtl] { + /* @noflip */ + padding-left: 12px; + /* @noflip */ + padding-right: 0; + } + + .mdc-top-app-bar--prominent .mdc-top-app-bar__title { + padding-bottom: 6px; + } + + .mdc-top-app-bar--fixed-adjust { + padding-top: 56px; + } +} +.mdc-typography { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-font-family, Roboto, sans-serif); +} + +.mdc-typography--headline1 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-headline1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 6rem; + /* @alternate */ + font-size: var(--mdc-typography-headline1-font-size, 6rem); + line-height: 6rem; + /* @alternate */ + line-height: var(--mdc-typography-headline1-line-height, 6rem); + font-weight: 300; + /* @alternate */ + font-weight: var(--mdc-typography-headline1-font-weight, 300); + letter-spacing: -0.015625em; + /* @alternate */ + letter-spacing: var(--mdc-typography-headline1-letter-spacing, -0.015625em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-headline1-text-decoration, inherit); + text-decoration: var(--mdc-typography-headline1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-headline1-text-transform, inherit); +} + +.mdc-typography--headline2 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-headline2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 3.75rem; + /* @alternate */ + font-size: var(--mdc-typography-headline2-font-size, 3.75rem); + line-height: 3.75rem; + /* @alternate */ + line-height: var(--mdc-typography-headline2-line-height, 3.75rem); + font-weight: 300; + /* @alternate */ + font-weight: var(--mdc-typography-headline2-font-weight, 300); + letter-spacing: -0.0083333333em; + /* @alternate */ + letter-spacing: var(--mdc-typography-headline2-letter-spacing, -0.0083333333em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-headline2-text-decoration, inherit); + text-decoration: var(--mdc-typography-headline2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-headline2-text-transform, inherit); +} + +.mdc-typography--headline3 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-headline3-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 3rem; + /* @alternate */ + font-size: var(--mdc-typography-headline3-font-size, 3rem); + line-height: 3.125rem; + /* @alternate */ + line-height: var(--mdc-typography-headline3-line-height, 3.125rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-headline3-font-weight, 400); + letter-spacing: normal; + /* @alternate */ + letter-spacing: var(--mdc-typography-headline3-letter-spacing, normal); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-headline3-text-decoration, inherit); + text-decoration: var(--mdc-typography-headline3-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-headline3-text-transform, inherit); +} + +.mdc-typography--headline4 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-headline4-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 2.125rem; + /* @alternate */ + font-size: var(--mdc-typography-headline4-font-size, 2.125rem); + line-height: 2.5rem; + /* @alternate */ + line-height: var(--mdc-typography-headline4-line-height, 2.5rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-headline4-font-weight, 400); + letter-spacing: 0.0073529412em; + /* @alternate */ + letter-spacing: var(--mdc-typography-headline4-letter-spacing, 0.0073529412em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-headline4-text-decoration, inherit); + text-decoration: var(--mdc-typography-headline4-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-headline4-text-transform, inherit); +} + +.mdc-typography--headline5 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-headline5-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1.5rem; + /* @alternate */ + font-size: var(--mdc-typography-headline5-font-size, 1.5rem); + line-height: 2rem; + /* @alternate */ + line-height: var(--mdc-typography-headline5-line-height, 2rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-headline5-font-weight, 400); + letter-spacing: normal; + /* @alternate */ + letter-spacing: var(--mdc-typography-headline5-letter-spacing, normal); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-headline5-text-decoration, inherit); + text-decoration: var(--mdc-typography-headline5-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-headline5-text-transform, inherit); +} + +.mdc-typography--headline6 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1.25rem; + /* @alternate */ + font-size: var(--mdc-typography-headline6-font-size, 1.25rem); + line-height: 2rem; + /* @alternate */ + line-height: var(--mdc-typography-headline6-line-height, 2rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-headline6-font-weight, 500); + letter-spacing: 0.0125em; + /* @alternate */ + letter-spacing: var(--mdc-typography-headline6-letter-spacing, 0.0125em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-headline6-text-decoration, inherit); + text-decoration: var(--mdc-typography-headline6-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-headline6-text-transform, inherit); +} + +.mdc-typography--subtitle1 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle1-font-size, 1rem); + line-height: 1.75rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle1-line-height, 1.75rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle1-font-weight, 400); + letter-spacing: 0.009375em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle1-text-transform, inherit); +} + +.mdc-typography--subtitle2 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-subtitle2-font-size, 0.875rem); + line-height: 1.375rem; + /* @alternate */ + line-height: var(--mdc-typography-subtitle2-line-height, 1.375rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-subtitle2-font-weight, 500); + letter-spacing: 0.0071428571em; + /* @alternate */ + letter-spacing: var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-decoration: var(--mdc-typography-subtitle2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-subtitle2-text-transform, inherit); +} + +.mdc-typography--body1 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 1rem; + /* @alternate */ + font-size: var(--mdc-typography-body1-font-size, 1rem); + line-height: 1.5rem; + /* @alternate */ + line-height: var(--mdc-typography-body1-line-height, 1.5rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body1-font-weight, 400); + letter-spacing: 0.03125em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body1-letter-spacing, 0.03125em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body1-text-decoration, inherit); + text-decoration: var(--mdc-typography-body1-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body1-text-transform, inherit); +} + +.mdc-typography--body2 { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-body2-font-size, 0.875rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-body2-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-body2-font-weight, 400); + letter-spacing: 0.0178571429em; + /* @alternate */ + letter-spacing: var(--mdc-typography-body2-letter-spacing, 0.0178571429em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-decoration: var(--mdc-typography-body2-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-body2-text-transform, inherit); +} + +.mdc-typography--caption { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.75rem; + /* @alternate */ + font-size: var(--mdc-typography-caption-font-size, 0.75rem); + line-height: 1.25rem; + /* @alternate */ + line-height: var(--mdc-typography-caption-line-height, 1.25rem); + font-weight: 400; + /* @alternate */ + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: 0.0333333333em; + /* @alternate */ + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + text-decoration: inherit; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: inherit; + /* @alternate */ + text-transform: var(--mdc-typography-caption-text-transform, inherit); +} + +.mdc-typography--button { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.875rem; + /* @alternate */ + font-size: var(--mdc-typography-button-font-size, 0.875rem); + line-height: 2.25rem; + /* @alternate */ + line-height: var(--mdc-typography-button-line-height, 2.25rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-button-font-weight, 500); + letter-spacing: 0.0892857143em; + /* @alternate */ + letter-spacing: var(--mdc-typography-button-letter-spacing, 0.0892857143em); + text-decoration: none; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-button-text-decoration, none); + text-decoration: var(--mdc-typography-button-text-decoration, none); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-button-text-transform, uppercase); +} + +.mdc-typography--overline { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: Roboto, sans-serif; + /* @alternate */ + font-family: var(--mdc-typography-overline-font-family, var(--mdc-typography-font-family, Roboto, sans-serif)); + font-size: 0.75rem; + /* @alternate */ + font-size: var(--mdc-typography-overline-font-size, 0.75rem); + line-height: 2rem; + /* @alternate */ + line-height: var(--mdc-typography-overline-line-height, 2rem); + font-weight: 500; + /* @alternate */ + font-weight: var(--mdc-typography-overline-font-weight, 500); + letter-spacing: 0.1666666667em; + /* @alternate */ + letter-spacing: var(--mdc-typography-overline-letter-spacing, 0.1666666667em); + text-decoration: none; + /* @alternate */ + -webkit-text-decoration: var(--mdc-typography-overline-text-decoration, none); + text-decoration: var(--mdc-typography-overline-text-decoration, none); + text-transform: uppercase; + /* @alternate */ + text-transform: var(--mdc-typography-overline-text-transform, uppercase); +} + +/*# sourceMappingURL=material-components-web.css.map*/ \ No newline at end of file diff --git a/pkgs/csslib/third_party/mdc/material-components-web.min.css b/pkgs/csslib/third_party/mdc/material-components-web.min.css new file mode 100644 index 000000000..7194839a5 --- /dev/null +++ b/pkgs/csslib/third_party/mdc/material-components-web.min.css @@ -0,0 +1,10 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://github.com/material-components/material-components-web/blob/master/LICENSE + */ + .mdc-banner__text{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-banner__graphic{color:#fff;color:var(--mdc-theme-surface, #fff)}.mdc-banner__graphic{background-color:#6200ee;background-color:var(--mdc-theme-primary, #6200ee)}.mdc-banner__graphic{border-radius:50%}.mdc-banner__content,.mdc-banner__fixed{min-width:344px}@media(max-width: 480px),(max-width: 344px){.mdc-banner__content,.mdc-banner__fixed{min-width:100%}}.mdc-banner__content{max-width:720px}.mdc-banner{z-index:1;border-bottom-style:solid;border-bottom-width:1px;box-sizing:border-box;display:none;flex-shrink:0;height:0;position:relative;width:100%}@media(max-width: 480px){.mdc-banner .mdc-banner__fixed{left:0;right:0}.mdc-banner .mdc-banner__text{margin-left:16px;margin-right:36px}[dir=rtl] .mdc-banner .mdc-banner__text,.mdc-banner .mdc-banner__text[dir=rtl]{margin-left:36px;margin-right:16px}}@media(max-width: 480px){.mdc-banner.mdc-banner--mobile-stacked .mdc-banner__content{flex-wrap:wrap}.mdc-banner.mdc-banner--mobile-stacked .mdc-banner__graphic{margin-bottom:12px}.mdc-banner.mdc-banner--mobile-stacked .mdc-banner__text{margin-left:16px;margin-right:8px;padding-bottom:4px}[dir=rtl] .mdc-banner.mdc-banner--mobile-stacked .mdc-banner__text,.mdc-banner.mdc-banner--mobile-stacked .mdc-banner__text[dir=rtl]{margin-left:8px;margin-right:16px}.mdc-banner.mdc-banner--mobile-stacked .mdc-banner__actions{margin-left:auto}}.mdc-banner--opening,.mdc-banner--open,.mdc-banner--closing{display:flex}.mdc-banner--open{transition:height 300ms ease}.mdc-banner--open .mdc-banner__content{transition:-webkit-transform 300ms ease;transition:transform 300ms ease;transition:transform 300ms ease, -webkit-transform 300ms ease;-webkit-transform:translateY(0);transform:translateY(0)}.mdc-banner--closing{transition:height 250ms ease}.mdc-banner--closing .mdc-banner__content{transition:-webkit-transform 250ms ease;transition:transform 250ms ease;transition:transform 250ms ease, -webkit-transform 250ms ease}.mdc-banner--centered .mdc-banner__content{left:0;margin-left:auto;margin-right:auto;right:0}.mdc-banner__fixed{border-bottom-style:solid;border-bottom-width:1px;box-sizing:border-box;height:inherit;position:fixed;width:100%}.mdc-banner__content{display:flex;min-height:52px;position:absolute;-webkit-transform:translateY(-100%);transform:translateY(-100%);width:100%}.mdc-banner__graphic-text-wrapper{display:flex;width:100%}.mdc-banner__graphic{margin-left:16px;margin-right:0;flex-shrink:0;height:40px;margin-top:16px;margin-bottom:16px;text-align:center;width:40px}[dir=rtl] .mdc-banner__graphic,.mdc-banner__graphic[dir=rtl]{margin-left:0;margin-right:16px}.mdc-banner__icon{position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mdc-banner__text{margin-left:24px;margin-right:90px;align-self:center;flex-grow:1;padding-top:16px;padding-bottom:16px}[dir=rtl] .mdc-banner__text,.mdc-banner__text[dir=rtl]{margin-left:90px;margin-right:24px}.mdc-banner__actions{padding-left:0;padding-right:8px;align-self:flex-end;display:flex;flex-shrink:0;padding-bottom:8px;padding-top:8px}[dir=rtl] .mdc-banner__actions,.mdc-banner__actions[dir=rtl]{padding-left:8px;padding-right:0}.mdc-banner__secondary-action{margin-left:0;margin-right:8px}[dir=rtl] .mdc-banner__secondary-action,.mdc-banner__secondary-action[dir=rtl]{margin-left:8px;margin-right:0}.mdc-banner{background-color:#fff;background-color:var(--mdc-theme-surface, #fff);border-bottom-color:rgba(0, 0, 0, 0.12)}.mdc-banner .mdc-banner__fixed{background-color:#fff;background-color:var(--mdc-theme-surface, #fff)}.mdc-banner .mdc-banner__fixed{border-bottom-color:rgba(0, 0, 0, 0.12)}.mdc-banner__text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit)}.mdc-banner__primary-action:not(:disabled){color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-banner__primary-action::before,.mdc-banner__primary-action::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-banner__primary-action:hover::before,.mdc-banner__primary-action.mdc-ripple-surface--hover::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-banner__primary-action.mdc-ripple-upgraded--background-focused::before,.mdc-banner__primary-action:not(.mdc-ripple-upgraded):focus::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-banner__primary-action:not(.mdc-ripple-upgraded)::after{transition:opacity 150ms linear}.mdc-banner__primary-action:not(.mdc-ripple-upgraded):active::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-banner__primary-action.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-banner__secondary-action{margin-left:0;margin-right:8px}.mdc-banner__secondary-action:not(:disabled){color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-banner__secondary-action::before,.mdc-banner__secondary-action::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-banner__secondary-action:hover::before,.mdc-banner__secondary-action.mdc-ripple-surface--hover::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-banner__secondary-action.mdc-ripple-upgraded--background-focused::before,.mdc-banner__secondary-action:not(.mdc-ripple-upgraded):focus::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-banner__secondary-action:not(.mdc-ripple-upgraded)::after{transition:opacity 150ms linear}.mdc-banner__secondary-action:not(.mdc-ripple-upgraded):active::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-banner__secondary-action.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}[dir=rtl] .mdc-banner__secondary-action,.mdc-banner__secondary-action[dir=rtl]{margin-left:8px;margin-right:0}.mdc-touch-target-wrapper{display:inline}.mdc-elevation-overlay{position:absolute;border-radius:inherit;pointer-events:none;opacity:0;opacity:var(--mdc-elevation-overlay-opacity, 0);transition:opacity 280ms cubic-bezier(0.4, 0, 0.2, 1);background-color:#fff;background-color:var(--mdc-elevation-overlay-color, #fff)}.mdc-button{position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:transparent}.mdc-button .mdc-elevation-overlay{width:100%;height:100%;top:0;left:0}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button .mdc-button__icon{margin-left:0;margin-right:8px;display:inline-block;position:relative;vertical-align:top}[dir=rtl] .mdc-button .mdc-button__icon,.mdc-button .mdc-button__icon[dir=rtl]{margin-left:8px;margin-right:0}.mdc-button .mdc-button__touch{position:absolute;top:50%;height:48px;left:0;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mdc-button__label+.mdc-button__icon{margin-left:8px;margin-right:0}[dir=rtl] .mdc-button__label+.mdc-button__icon,.mdc-button__label+.mdc-button__icon[dir=rtl]{margin-left:0;margin-right:8px}svg.mdc-button__icon{fill:currentColor}.mdc-button--raised .mdc-button__icon,.mdc-button--unelevated .mdc-button__icon,.mdc-button--outlined .mdc-button__icon{margin-left:-4px;margin-right:8px}[dir=rtl] .mdc-button--raised .mdc-button__icon,[dir=rtl] .mdc-button--unelevated .mdc-button__icon,[dir=rtl] .mdc-button--outlined .mdc-button__icon,.mdc-button--raised .mdc-button__icon[dir=rtl],.mdc-button--unelevated .mdc-button__icon[dir=rtl],.mdc-button--outlined .mdc-button__icon[dir=rtl]{margin-left:8px;margin-right:-4px}.mdc-button--raised .mdc-button__label+.mdc-button__icon,.mdc-button--unelevated .mdc-button__label+.mdc-button__icon,.mdc-button--outlined .mdc-button__label+.mdc-button__icon{margin-left:8px;margin-right:-4px}[dir=rtl] .mdc-button--raised .mdc-button__label+.mdc-button__icon,[dir=rtl] .mdc-button--unelevated .mdc-button__label+.mdc-button__icon,[dir=rtl] .mdc-button--outlined .mdc-button__label+.mdc-button__icon,.mdc-button--raised .mdc-button__label+.mdc-button__icon[dir=rtl],.mdc-button--unelevated .mdc-button__label+.mdc-button__icon[dir=rtl],.mdc-button--outlined .mdc-button__label+.mdc-button__icon[dir=rtl]{margin-left:-4px;margin-right:8px}.mdc-button--touch{margin-top:6px;margin-bottom:6px}.mdc-button{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));text-decoration:none;-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none)}@-webkit-keyframes mdc-ripple-fg-radius-in{from{-webkit-animation-timing-function:cubic-bezier(0.4, 0, 0.2, 1);animation-timing-function:cubic-bezier(0.4, 0, 0.2, 1);-webkit-transform:translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);transform:translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1)}to{-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}}@keyframes mdc-ripple-fg-radius-in{from{-webkit-animation-timing-function:cubic-bezier(0.4, 0, 0.2, 1);animation-timing-function:cubic-bezier(0.4, 0, 0.2, 1);-webkit-transform:translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);transform:translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1)}to{-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}}@-webkit-keyframes mdc-ripple-fg-opacity-in{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:0}to{opacity:var(--mdc-ripple-fg-opacity, 0)}}@keyframes mdc-ripple-fg-opacity-in{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:0}to{opacity:var(--mdc-ripple-fg-opacity, 0)}}@-webkit-keyframes mdc-ripple-fg-opacity-out{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:var(--mdc-ripple-fg-opacity, 0)}to{opacity:0}}@keyframes mdc-ripple-fg-opacity-out{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:var(--mdc-ripple-fg-opacity, 0)}to{opacity:0}}.mdc-button{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-button .mdc-button__ripple::before,.mdc-button .mdc-button__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-button .mdc-button__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-button .mdc-button__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-button.mdc-ripple-upgraded .mdc-button__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-button.mdc-ripple-upgraded .mdc-button__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-button.mdc-ripple-upgraded--unbounded .mdc-button__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-button.mdc-ripple-upgraded--foreground-activation .mdc-button__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-button.mdc-ripple-upgraded--foreground-deactivation .mdc-button__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-button .mdc-button__ripple::before,.mdc-button .mdc-button__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-button.mdc-ripple-upgraded .mdc-button__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-button .mdc-button__ripple{position:absolute;box-sizing:content-box;width:100%;height:100%;overflow:hidden}.mdc-button:not(.mdc-button--outlined) .mdc-button__ripple{top:0;left:0}.mdc-button--raised{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-button--outlined{border-style:solid}.mdc-button{font-family:Roboto, sans-serif;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-button-font-size, 0.875rem);letter-spacing:0.0892857143em;letter-spacing:var(--mdc-typography-button-letter-spacing, 0.0892857143em);font-weight:500;font-weight:var(--mdc-typography-button-font-weight, 500);text-transform:uppercase;text-transform:var(--mdc-typography-button-text-transform, uppercase);height:36px;border-radius:4px;border-radius:var(--mdc-shape-small, 4px);padding:0 8px 0 8px}.mdc-button:not(:disabled){color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-button:disabled{color:rgba(0, 0, 0, 0.38)}.mdc-button .mdc-button__icon{font-size:1.125rem;height:1.125rem;width:1.125rem}.mdc-button .mdc-button__ripple::before,.mdc-button .mdc-button__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-button:hover .mdc-button__ripple::before,.mdc-button.mdc-ripple-surface--hover .mdc-button__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-button.mdc-ripple-upgraded--background-focused .mdc-button__ripple::before,.mdc-button:not(.mdc-ripple-upgraded):focus .mdc-button__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-button:not(.mdc-ripple-upgraded) .mdc-button__ripple::after{transition:opacity 150ms linear}.mdc-button:not(.mdc-ripple-upgraded):active .mdc-button__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-button.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-button .mdc-button__ripple{border-radius:4px;border-radius:var(--mdc-shape-small, 4px)}.mdc-button--unelevated{padding:0 16px 0 16px;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-button-font-size, 0.875rem);letter-spacing:0.0892857143em;letter-spacing:var(--mdc-typography-button-letter-spacing, 0.0892857143em);font-weight:500;font-weight:var(--mdc-typography-button-font-weight, 500);text-transform:uppercase;text-transform:var(--mdc-typography-button-text-transform, uppercase);height:36px;border-radius:4px;border-radius:var(--mdc-shape-small, 4px)}.mdc-button--unelevated.mdc-button--icon-trailing{padding:0 12px 0 16px}.mdc-button--unelevated.mdc-button--icon-leading{padding:0 16px 0 12px}.mdc-button--unelevated:not(:disabled){background-color:#6200ee;background-color:var(--mdc-theme-primary, #6200ee)}.mdc-button--unelevated:disabled{background-color:rgba(0, 0, 0, 0.12)}.mdc-button--unelevated:not(:disabled){color:#fff;color:var(--mdc-theme-on-primary, #fff)}.mdc-button--unelevated:disabled{color:rgba(0, 0, 0, 0.38)}.mdc-button--unelevated .mdc-button__icon{font-size:1.125rem;height:1.125rem;width:1.125rem}.mdc-button--unelevated .mdc-button__ripple::before,.mdc-button--unelevated .mdc-button__ripple::after{background-color:#fff;background-color:var(--mdc-ripple-color, var(--mdc-theme-on-primary, #fff))}.mdc-button--unelevated:hover .mdc-button__ripple::before,.mdc-button--unelevated.mdc-ripple-surface--hover .mdc-button__ripple::before{opacity:0.08;opacity:var(--mdc-ripple-hover-opacity, 0.08)}.mdc-button--unelevated.mdc-ripple-upgraded--background-focused .mdc-button__ripple::before,.mdc-button--unelevated:not(.mdc-ripple-upgraded):focus .mdc-button__ripple::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}.mdc-button--unelevated:not(.mdc-ripple-upgraded) .mdc-button__ripple::after{transition:opacity 150ms linear}.mdc-button--unelevated:not(.mdc-ripple-upgraded):active .mdc-button__ripple::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-button--unelevated.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-button--unelevated .mdc-button__ripple{border-radius:4px;border-radius:var(--mdc-shape-small, 4px)}.mdc-button--raised{padding:0 16px 0 16px;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-button-font-size, 0.875rem);letter-spacing:0.0892857143em;letter-spacing:var(--mdc-typography-button-letter-spacing, 0.0892857143em);font-weight:500;font-weight:var(--mdc-typography-button-font-weight, 500);text-transform:uppercase;text-transform:var(--mdc-typography-button-text-transform, uppercase);height:36px;border-radius:4px;border-radius:var(--mdc-shape-small, 4px);box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0,0,0,.12)}.mdc-button--raised.mdc-button--icon-trailing{padding:0 12px 0 16px}.mdc-button--raised.mdc-button--icon-leading{padding:0 16px 0 12px}.mdc-button--raised:not(:disabled){background-color:#6200ee;background-color:var(--mdc-theme-primary, #6200ee)}.mdc-button--raised:disabled{background-color:rgba(0, 0, 0, 0.12)}.mdc-button--raised:not(:disabled){color:#fff;color:var(--mdc-theme-on-primary, #fff)}.mdc-button--raised:disabled{color:rgba(0, 0, 0, 0.38)}.mdc-button--raised .mdc-button__icon{font-size:1.125rem;height:1.125rem;width:1.125rem}.mdc-button--raised .mdc-button__ripple::before,.mdc-button--raised .mdc-button__ripple::after{background-color:#fff;background-color:var(--mdc-ripple-color, var(--mdc-theme-on-primary, #fff))}.mdc-button--raised:hover .mdc-button__ripple::before,.mdc-button--raised.mdc-ripple-surface--hover .mdc-button__ripple::before{opacity:0.08;opacity:var(--mdc-ripple-hover-opacity, 0.08)}.mdc-button--raised.mdc-ripple-upgraded--background-focused .mdc-button__ripple::before,.mdc-button--raised:not(.mdc-ripple-upgraded):focus .mdc-button__ripple::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}.mdc-button--raised:not(.mdc-ripple-upgraded) .mdc-button__ripple::after{transition:opacity 150ms linear}.mdc-button--raised:not(.mdc-ripple-upgraded):active .mdc-button__ripple::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-button--raised.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-button--raised .mdc-button__ripple{border-radius:4px;border-radius:var(--mdc-shape-small, 4px)}.mdc-button--raised.mdc-ripple-upgraded--background-focused,.mdc-button--raised:not(.mdc-ripple-upgraded):focus{box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0,0,0,.12)}.mdc-button--raised:hover{box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0,0,0,.12)}.mdc-button--raised:not(:disabled):active{box-shadow:0px 5px 5px -3px rgba(0, 0, 0, 0.2),0px 8px 10px 1px rgba(0, 0, 0, 0.14),0px 3px 14px 2px rgba(0,0,0,.12)}.mdc-button--raised:disabled{box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0,0,0,.12)}.mdc-button--outlined{font-family:Roboto, sans-serif;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-button-font-size, 0.875rem);letter-spacing:0.0892857143em;letter-spacing:var(--mdc-typography-button-letter-spacing, 0.0892857143em);font-weight:500;font-weight:var(--mdc-typography-button-font-weight, 500);text-transform:uppercase;text-transform:var(--mdc-typography-button-text-transform, uppercase);height:36px;border-radius:4px;border-radius:var(--mdc-shape-small, 4px);padding:0 15px 0 15px;border-width:1px}.mdc-button--outlined:not(:disabled){color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-button--outlined:disabled{color:rgba(0, 0, 0, 0.38)}.mdc-button--outlined .mdc-button__icon{font-size:1.125rem;height:1.125rem;width:1.125rem}.mdc-button--outlined .mdc-button__ripple::before,.mdc-button--outlined .mdc-button__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-button--outlined:hover .mdc-button__ripple::before,.mdc-button--outlined.mdc-ripple-surface--hover .mdc-button__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-button--outlined.mdc-ripple-upgraded--background-focused .mdc-button__ripple::before,.mdc-button--outlined:not(.mdc-ripple-upgraded):focus .mdc-button__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-button--outlined:not(.mdc-ripple-upgraded) .mdc-button__ripple::after{transition:opacity 150ms linear}.mdc-button--outlined:not(.mdc-ripple-upgraded):active .mdc-button__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-button--outlined.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-button--outlined .mdc-button__ripple{border-radius:4px;border-radius:var(--mdc-shape-small, 4px)}.mdc-button--outlined:not(:disabled){border-color:rgba(0, 0, 0, 0.12)}.mdc-button--outlined:disabled{border-color:rgba(0, 0, 0, 0.12)}.mdc-button--outlined.mdc-button--icon-trailing{padding:0 11px 0 15px}.mdc-button--outlined.mdc-button--icon-leading{padding:0 15px 0 11px}.mdc-button--outlined .mdc-button__ripple{top:-1px;left:-1px;border:1px solid transparent}.mdc-button--outlined .mdc-button__touch{left:-1px;width:calc(100% + 2 * 1px)}.mdc-card{border-radius:4px;border-radius:var(--mdc-shape-medium, 4px);background-color:#fff;background-color:var(--mdc-theme-surface, #fff);position:relative;box-shadow:0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14),0px 1px 3px 0px rgba(0,0,0,.12);display:flex;flex-direction:column;box-sizing:border-box}.mdc-card .mdc-elevation-overlay{width:100%;height:100%;top:0;left:0}.mdc-card::after{border-radius:4px;border-radius:var(--mdc-shape-medium, 4px);position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid transparent;border-radius:inherit;content:"";pointer-events:none;pointer-events:none}.mdc-card--outlined{box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0,0,0,.12);border-width:1px;border-style:solid;border-color:#e0e0e0}.mdc-card--outlined::after{border:none}.mdc-card__content{border-radius:inherit;height:100%}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media::before{display:block;content:""}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mdc-card__media--square::before{margin-top:100%}.mdc-card__media--16-9::before{margin-top:56.25%}.mdc-card__media-content{position:absolute;top:0;right:0;bottom:0;left:0;box-sizing:border-box}.mdc-card__primary-action{display:flex;flex-direction:column;box-sizing:border-box;position:relative;outline:none;color:inherit;text-decoration:none;cursor:pointer;overflow:hidden}.mdc-card__primary-action:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__primary-action:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mdc-card__actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px;padding:8px}.mdc-card__actions--full-bleed{padding:0}.mdc-card__action-buttons,.mdc-card__action-icons{display:flex;flex-direction:row;align-items:center;box-sizing:border-box}.mdc-card__action-icons{color:rgba(0, 0, 0, 0.6);flex-grow:1;justify-content:flex-end}.mdc-card__action-buttons+.mdc-card__action-icons{margin-left:16px;margin-right:0}[dir=rtl] .mdc-card__action-buttons+.mdc-card__action-icons,.mdc-card__action-buttons+.mdc-card__action-icons[dir=rtl]{margin-left:0;margin-right:16px}.mdc-card__action{display:inline-flex;flex-direction:row;align-items:center;box-sizing:border-box;justify-content:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdc-card__action:focus{outline:none}.mdc-card__action--button{margin-left:0;margin-right:8px;padding:0 8px}[dir=rtl] .mdc-card__action--button,.mdc-card__action--button[dir=rtl]{margin-left:8px;margin-right:0}.mdc-card__action--button:last-child{margin-left:0;margin-right:0}[dir=rtl] .mdc-card__action--button:last-child,.mdc-card__action--button:last-child[dir=rtl]{margin-left:0;margin-right:0}.mdc-card__actions--full-bleed .mdc-card__action--button{justify-content:space-between;width:100%;height:auto;max-height:none;margin:0;padding:8px 16px;text-align:left}[dir=rtl] .mdc-card__actions--full-bleed .mdc-card__action--button,.mdc-card__actions--full-bleed .mdc-card__action--button[dir=rtl]{text-align:right}.mdc-card__action--icon{margin:-6px 0;padding:12px}.mdc-card__action--icon:not(:disabled){color:rgba(0, 0, 0, 0.6)}.mdc-card__primary-action{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-card__primary-action .mdc-card__ripple::before,.mdc-card__primary-action .mdc-card__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-card__primary-action .mdc-card__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-card__primary-action .mdc-card__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-card__primary-action.mdc-ripple-upgraded .mdc-card__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-card__primary-action.mdc-ripple-upgraded .mdc-card__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-card__primary-action.mdc-ripple-upgraded--unbounded .mdc-card__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-card__primary-action.mdc-ripple-upgraded--foreground-activation .mdc-card__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-card__primary-action.mdc-ripple-upgraded--foreground-deactivation .mdc-card__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-card__primary-action .mdc-card__ripple::before,.mdc-card__primary-action .mdc-card__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-card__primary-action.mdc-ripple-upgraded .mdc-card__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-card__primary-action .mdc-card__ripple::before,.mdc-card__primary-action .mdc-card__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}.mdc-card__primary-action:hover .mdc-card__ripple::before,.mdc-card__primary-action.mdc-ripple-surface--hover .mdc-card__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-card__primary-action.mdc-ripple-upgraded--background-focused .mdc-card__ripple::before,.mdc-card__primary-action:not(.mdc-ripple-upgraded):focus .mdc-card__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-card__primary-action:not(.mdc-ripple-upgraded) .mdc-card__ripple::after{transition:opacity 150ms linear}.mdc-card__primary-action:not(.mdc-ripple-upgraded):active .mdc-card__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-card__primary-action.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-card__primary-action .mdc-card__ripple{box-sizing:content-box;height:100%;overflow:hidden;left:0;pointer-events:none;position:absolute;top:0;width:100%}.mdc-card__primary-action.mdc-ripple-upgraded--background-focused::after,.mdc-card__primary-action:not(.mdc-ripple-upgraded):focus::after{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:5px double transparent;border-radius:inherit;content:"";pointer-events:none}.mdc-checkbox{padding:calc((40px - 18px) / 2);padding:calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2);margin:calc((40px - 40px) / 2);margin:calc((var(--mdc-checkbox-touch-target-size, 40px) - 40px) / 2)}.mdc-checkbox .mdc-checkbox__ripple::before,.mdc-checkbox .mdc-checkbox__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}.mdc-checkbox:hover .mdc-checkbox__ripple::before,.mdc-checkbox.mdc-ripple-surface--hover .mdc-checkbox__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-checkbox.mdc-ripple-upgraded--background-focused .mdc-checkbox__ripple::before,.mdc-checkbox:not(.mdc-ripple-upgraded):focus .mdc-checkbox__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-checkbox:not(.mdc-ripple-upgraded) .mdc-checkbox__ripple::after{transition:opacity 150ms linear}.mdc-checkbox:not(.mdc-ripple-upgraded):active .mdc-checkbox__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-checkbox.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::before,.mdc-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::after{background-color:#018786;background-color:var(--mdc-ripple-color, var(--mdc-theme-secondary, #018786))}.mdc-checkbox.mdc-checkbox--selected:hover .mdc-checkbox__ripple::before,.mdc-checkbox.mdc-checkbox--selected.mdc-ripple-surface--hover .mdc-checkbox__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded--background-focused .mdc-checkbox__ripple::before,.mdc-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):focus .mdc-checkbox__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded) .mdc-checkbox__ripple::after{transition:opacity 150ms linear}.mdc-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):active .mdc-checkbox__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::before,.mdc-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::after{background-color:#018786;background-color:var(--mdc-ripple-color, var(--mdc-theme-secondary, #018786))}.mdc-checkbox .mdc-checkbox__background{top:calc((40px - 18px) / 2);top:calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2);left:calc((40px - 18px) / 2);left:calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2)}.mdc-checkbox .mdc-checkbox__native-control{top:calc((40px - 40px) / 2);top:calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2);right:calc((40px - 40px) / 2);right:calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2);left:calc((40px - 40px) / 2);left:calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2);width:40px;width:var(--mdc-checkbox-touch-target-size, 40px);height:40px;height:var(--mdc-checkbox-touch-target-size, 40px)}.mdc-checkbox .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}.mdc-checkbox .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox .mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background,.mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true]:enabled~.mdc-checkbox__background{border-color:#018786;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786));background-color:#018786;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786))}@-webkit-keyframes mdc-checkbox-fade-in-background-8A000000FF01878600000000FF018786{0%{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}50%{border-color:#018786;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786));background-color:#018786;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786))}}@keyframes mdc-checkbox-fade-in-background-8A000000FF01878600000000FF018786{0%{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}50%{border-color:#018786;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786));background-color:#018786;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786))}}@-webkit-keyframes mdc-checkbox-fade-out-background-8A000000FF01878600000000FF018786{0%,80%{border-color:#018786;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786));background-color:#018786;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786))}100%{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}}@keyframes mdc-checkbox-fade-out-background-8A000000FF01878600000000FF018786{0%,80%{border-color:#018786;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786));background-color:#018786;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #018786))}100%{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}}.mdc-checkbox.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-checkbox.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{-webkit-animation-name:mdc-checkbox-fade-in-background-8A000000FF01878600000000FF018786;animation-name:mdc-checkbox-fade-in-background-8A000000FF01878600000000FF018786}.mdc-checkbox.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-checkbox.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{-webkit-animation-name:mdc-checkbox-fade-out-background-8A000000FF01878600000000FF018786;animation-name:mdc-checkbox-fade-out-background-8A000000FF01878600000000FF018786}.mdc-checkbox .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:rgba(0, 0, 0, 0.38);border-color:var(--mdc-checkbox-disabled-color, rgba(0, 0, 0, 0.38));background-color:transparent}.mdc-checkbox .mdc-checkbox__native-control[disabled]:checked~.mdc-checkbox__background,.mdc-checkbox .mdc-checkbox__native-control[disabled]:indeterminate~.mdc-checkbox__background,.mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true][disabled]~.mdc-checkbox__background{border-color:transparent;background-color:rgba(0, 0, 0, 0.38);background-color:var(--mdc-checkbox-disabled-color, rgba(0, 0, 0, 0.38))}.mdc-checkbox .mdc-checkbox__native-control:enabled~.mdc-checkbox__background .mdc-checkbox__checkmark{color:#fff;color:var(--mdc-checkbox-ink-color, #fff)}.mdc-checkbox .mdc-checkbox__native-control:enabled~.mdc-checkbox__background .mdc-checkbox__mixedmark{border-color:#fff;border-color:var(--mdc-checkbox-ink-color, #fff)}.mdc-checkbox .mdc-checkbox__native-control:disabled~.mdc-checkbox__background .mdc-checkbox__checkmark{color:#fff;color:var(--mdc-checkbox-ink-color, #fff)}.mdc-checkbox .mdc-checkbox__native-control:disabled~.mdc-checkbox__background .mdc-checkbox__mixedmark{border-color:#fff;border-color:var(--mdc-checkbox-ink-color, #fff)}@-webkit-keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{-webkit-animation-timing-function:cubic-bezier(0, 0, 0.2, 1);animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{-webkit-animation-timing-function:cubic-bezier(0, 0, 0.2, 1);animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@-webkit-keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{-webkit-transform:scaleX(0);transform:scaleX(0)}68.2%{-webkit-animation-timing-function:cubic-bezier(0, 0, 0, 1);animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{-webkit-transform:scaleX(0);transform:scaleX(0)}68.2%{-webkit-animation-timing-function:cubic-bezier(0, 0, 0, 1);animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{-webkit-animation-timing-function:cubic-bezier(0.4, 0, 1, 1);animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{-webkit-animation-timing-function:cubic-bezier(0.4, 0, 1, 1);animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@-webkit-keyframes mdc-checkbox-checked-indeterminate-checkmark{from{-webkit-animation-timing-function:cubic-bezier(0, 0, 0.2, 1);animation-timing-function:cubic-bezier(0, 0, 0.2, 1);-webkit-transform:rotate(0deg);transform:rotate(0deg);opacity:1}to{-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{-webkit-animation-timing-function:cubic-bezier(0, 0, 0.2, 1);animation-timing-function:cubic-bezier(0, 0, 0.2, 1);-webkit-transform:rotate(0deg);transform:rotate(0deg);opacity:1}to{-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}}@-webkit-keyframes mdc-checkbox-indeterminate-checked-checkmark{from{-webkit-animation-timing-function:cubic-bezier(0.14, 0, 0, 1);animation-timing-function:cubic-bezier(0.14, 0, 0, 1);-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}to{-webkit-transform:rotate(360deg);transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{-webkit-animation-timing-function:cubic-bezier(0.14, 0, 0, 1);animation-timing-function:cubic-bezier(0.14, 0, 0, 1);-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}to{-webkit-transform:rotate(360deg);transform:rotate(360deg);opacity:1}}@-webkit-keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{-webkit-animation-timing-function:mdc-animation-deceleration-curve-timing-function;animation-timing-function:mdc-animation-deceleration-curve-timing-function;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}to{-webkit-transform:rotate(0deg);transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{-webkit-animation-timing-function:mdc-animation-deceleration-curve-timing-function;animation-timing-function:mdc-animation-deceleration-curve-timing-function;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}to{-webkit-transform:rotate(0deg);transform:rotate(0deg);opacity:1}}@-webkit-keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{-webkit-animation-timing-function:cubic-bezier(0.14, 0, 0, 1);animation-timing-function:cubic-bezier(0.14, 0, 0, 1);-webkit-transform:rotate(0deg);transform:rotate(0deg);opacity:1}to{-webkit-transform:rotate(315deg);transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{-webkit-animation-timing-function:cubic-bezier(0.14, 0, 0, 1);animation-timing-function:cubic-bezier(0.14, 0, 0, 1);-webkit-transform:rotate(0deg);transform:rotate(0deg);opacity:1}to{-webkit-transform:rotate(315deg);transform:rotate(315deg);opacity:0}}@-webkit-keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-transform:scaleX(1);transform:scaleX(1);opacity:1}32.8%,100%{-webkit-transform:scaleX(0);transform:scaleX(0);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-transform:scaleX(1);transform:scaleX(1);opacity:1}32.8%,100%{-webkit-transform:scaleX(0);transform:scaleX(0);opacity:0}}.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:GrayText;border-color:var(--mdc-checkbox-disabled-color, GrayText);background-color:transparent}.mdc-checkbox__native-control[disabled]:checked~.mdc-checkbox__background,.mdc-checkbox__native-control[disabled]:indeterminate~.mdc-checkbox__background,.mdc-checkbox__native-control[data-indeterminate=true][disabled]~.mdc-checkbox__background{border-color:GrayText;background-color:transparent;background-color:var(--mdc-checkbox-disabled-color, transparent)}.mdc-checkbox__native-control:disabled~.mdc-checkbox__background .mdc-checkbox__checkmark{color:GrayText;color:var(--mdc-checkbox-ink-color, GrayText)}.mdc-checkbox__native-control:disabled~.mdc-checkbox__background .mdc-checkbox__mixedmark{border-color:GrayText;border-color:var(--mdc-checkbox-ink-color, GrayText)}.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled{cursor:default;pointer-events:none}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:transparent;pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox--upgraded .mdc-checkbox__checkmark{opacity:1}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;-webkit-transform:scaleX(0) rotate(0deg);transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),-webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),-webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{-webkit-animation-duration:180ms;animation-duration:180ms;-webkit-animation-timing-function:linear;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{-webkit-animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear 0s;animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear 0s;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{-webkit-animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear 0s;animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear 0s;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{-webkit-animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear 0s;animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear 0s;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{-webkit-animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear 0s;animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear 0s;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{-webkit-animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear 0s;animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear 0s;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{-webkit-animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear 0s;animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear 0s;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{-webkit-animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear 0s;animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear 0s;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{-webkit-animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear 0s;animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear 0s;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background,.mdc-checkbox__native-control[data-indeterminate=true]~.mdc-checkbox__background{transition:border-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background .mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background .mdc-checkbox__checkmark-path,.mdc-checkbox__native-control[data-indeterminate=true]~.mdc-checkbox__background .mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit}.mdc-checkbox__native-control:disabled{cursor:default;pointer-events:none}.mdc-checkbox--touch{margin:calc((48px - 40px) / 2);margin:calc((var(--mdc-checkbox-state-layer-size, 48px) - var(--mdc-checkbox-state-layer-size, 40px)) / 2)}.mdc-checkbox--touch .mdc-checkbox__native-control{top:calc((40px - 48px) / 2);top:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 48px)) / 2);right:calc((40px - 48px) / 2);right:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 48px)) / 2);left:calc((40px - 48px) / 2);left:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 48px)) / 2);width:48px;width:var(--mdc-checkbox-state-layer-size, 48px);height:48px;height:var(--mdc-checkbox-state-layer-size, 48px)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background .mdc-checkbox__checkmark{transition:opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background .mdc-checkbox__mixedmark{-webkit-transform:scaleX(1) rotate(-45deg);transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background .mdc-checkbox__checkmark,.mdc-checkbox__native-control[data-indeterminate=true]~.mdc-checkbox__background .mdc-checkbox__checkmark{-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0;transition:opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),-webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),-webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background .mdc-checkbox__mixedmark,.mdc-checkbox__native-control[data-indeterminate=true]~.mdc-checkbox__background .mdc-checkbox__mixedmark{-webkit-transform:scaleX(1) rotate(0deg);transform:scaleX(1) rotate(0deg);opacity:1}.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__background,.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__checkmark,.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__checkmark-path,.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__mixedmark{transition:none}.mdc-checkbox{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-checkbox .mdc-checkbox__ripple::before,.mdc-checkbox .mdc-checkbox__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-checkbox .mdc-checkbox__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-checkbox .mdc-checkbox__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-checkbox.mdc-ripple-upgraded--unbounded .mdc-checkbox__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-checkbox.mdc-ripple-upgraded--foreground-activation .mdc-checkbox__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-checkbox.mdc-ripple-upgraded--foreground-deactivation .mdc-checkbox__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-checkbox .mdc-checkbox__ripple::before,.mdc-checkbox .mdc-checkbox__ripple::after{top:calc(50% - 50%);left:calc(50% - 50%);width:100%;height:100%}.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::before,.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::after{top:var(--mdc-ripple-top, calc(50% - 50%));left:var(--mdc-ripple-left, calc(50% - 50%));width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-checkbox.mdc-ripple-upgraded .mdc-checkbox__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-checkbox{z-index:0}.mdc-checkbox .mdc-checkbox__ripple::before,.mdc-checkbox .mdc-checkbox__ripple::after{z-index:-1;z-index:var(--mdc-ripple-z-index, -1)}.mdc-checkbox__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.mdc-deprecated-chip-trailing-action__touch{position:absolute;top:50%;height:48px;left:50%;width:48px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.mdc-deprecated-chip-trailing-action{border:none;display:inline-flex;position:relative;align-items:center;justify-content:center;box-sizing:border-box;padding:0;outline:none;cursor:pointer;-webkit-appearance:none;background:none}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__icon{height:18px;width:18px;font-size:18px}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__touch{width:26px}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__icon{fill:currentColor;color:inherit}.mdc-deprecated-chip-trailing-action{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::before,.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded--unbounded .mdc-deprecated-chip-trailing-action__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded--foreground-activation .mdc-deprecated-chip-trailing-action__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded--foreground-deactivation .mdc-deprecated-chip-trailing-action__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::before,.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::after{top:calc(50% - 50%);left:calc(50% - 50%);width:100%;height:100%}.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::before,.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::after{top:var(--mdc-ripple-top, calc(50% - 50%));left:var(--mdc-ripple-left, calc(50% - 50%));width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded .mdc-deprecated-chip-trailing-action__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::before,.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, var(--mdc-theme-on-surface, #000))}.mdc-deprecated-chip-trailing-action:hover .mdc-deprecated-chip-trailing-action__ripple::before,.mdc-deprecated-chip-trailing-action.mdc-ripple-surface--hover .mdc-deprecated-chip-trailing-action__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded--background-focused .mdc-deprecated-chip-trailing-action__ripple::before,.mdc-deprecated-chip-trailing-action:not(.mdc-ripple-upgraded):focus .mdc-deprecated-chip-trailing-action__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-deprecated-chip-trailing-action:not(.mdc-ripple-upgraded) .mdc-deprecated-chip-trailing-action__ripple::after{transition:opacity 150ms linear}.mdc-deprecated-chip-trailing-action:not(.mdc-ripple-upgraded):active .mdc-deprecated-chip-trailing-action__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-deprecated-chip-trailing-action.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-deprecated-chip-trailing-action .mdc-deprecated-chip-trailing-action__ripple{position:absolute;box-sizing:content-box;width:100%;height:100%;overflow:hidden}.mdc-chip__icon--leading{color:rgba(0,0,0,.54)}.mdc-deprecated-chip-trailing-action{color:#000}.mdc-chip__icon--trailing{color:rgba(0,0,0,.54)}.mdc-chip__icon--trailing:hover{color:rgba(0,0,0,.62)}.mdc-chip__icon--trailing:focus{color:rgba(0,0,0,.87)}.mdc-chip__icon.mdc-chip__icon--leading:not(.mdc-chip__icon--leading-hidden){width:20px;height:20px;font-size:20px}.mdc-deprecated-chip-trailing-action__icon{height:18px;width:18px;font-size:18px}.mdc-chip__icon.mdc-chip__icon--trailing{width:18px;height:18px;font-size:18px}.mdc-deprecated-chip-trailing-action{margin-left:4px;margin-right:-4px}[dir=rtl] .mdc-deprecated-chip-trailing-action,.mdc-deprecated-chip-trailing-action[dir=rtl]{margin-left:-4px;margin-right:4px}.mdc-chip__icon--trailing{margin-left:4px;margin-right:-4px}[dir=rtl] .mdc-chip__icon--trailing,.mdc-chip__icon--trailing[dir=rtl]{margin-left:-4px;margin-right:4px}.mdc-chip{border-radius:16px;background-color:#e0e0e0;color:rgba(0, 0, 0, 0.87);-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);height:32px;position:relative;display:inline-flex;align-items:center;box-sizing:border-box;padding:0 12px;border-width:0;outline:none;cursor:pointer;-webkit-appearance:none}.mdc-chip .mdc-chip__ripple{border-radius:16px}.mdc-chip:hover{color:rgba(0, 0, 0, 0.87)}.mdc-chip.mdc-chip--selected .mdc-chip__checkmark,.mdc-chip .mdc-chip__icon--leading:not(.mdc-chip__icon--leading-hidden){margin-left:-4px;margin-right:4px}[dir=rtl] .mdc-chip.mdc-chip--selected .mdc-chip__checkmark,[dir=rtl] .mdc-chip .mdc-chip__icon--leading:not(.mdc-chip__icon--leading-hidden),.mdc-chip.mdc-chip--selected .mdc-chip__checkmark[dir=rtl],.mdc-chip .mdc-chip__icon--leading:not(.mdc-chip__icon--leading-hidden)[dir=rtl]{margin-left:4px;margin-right:-4px}.mdc-chip .mdc-elevation-overlay{width:100%;height:100%;top:0;left:0}.mdc-chip::-moz-focus-inner{padding:0;border:0}.mdc-chip:hover{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-chip .mdc-chip__touch{position:absolute;top:50%;height:48px;left:0;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mdc-chip--exit{transition:opacity 75ms cubic-bezier(0.4, 0, 0.2, 1),width 150ms cubic-bezier(0, 0, 0.2, 1),padding 100ms linear,margin 100ms linear;opacity:0}.mdc-chip__overflow{text-overflow:ellipsis;overflow:hidden}.mdc-chip__text{white-space:nowrap}.mdc-chip__icon{border-radius:50%;outline:none;vertical-align:middle}.mdc-chip__checkmark{height:20px}.mdc-chip__checkmark-path{transition:stroke-dashoffset 150ms 50ms cubic-bezier(0.4, 0, 0.6, 1);stroke-width:2px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-chip__primary-action:focus{outline:none}.mdc-chip--selected .mdc-chip__checkmark-path{stroke-dashoffset:0}.mdc-chip__icon--leading,.mdc-chip__icon--trailing{position:relative}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected{color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected .mdc-chip__icon--leading{color:rgba(98,0,238,.54)}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:hover{color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-chip-set--choice .mdc-chip .mdc-chip__checkmark-path{stroke:#6200ee;stroke:var(--mdc-theme-primary, #6200ee)}.mdc-chip-set--choice .mdc-chip--selected{background-color:#fff;background-color:var(--mdc-theme-surface, #fff)}.mdc-chip__checkmark-svg{width:0;height:20px;transition:width 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-chip--selected .mdc-chip__checkmark-svg{width:20px}.mdc-chip-set--filter .mdc-chip__icon--leading{transition:opacity 75ms linear;transition-delay:-50ms;opacity:1}.mdc-chip-set--filter .mdc-chip__icon--leading+.mdc-chip__checkmark{transition:opacity 75ms linear;transition-delay:80ms;opacity:0}.mdc-chip-set--filter .mdc-chip__icon--leading+.mdc-chip__checkmark .mdc-chip__checkmark-svg{transition:width 0ms}.mdc-chip-set--filter .mdc-chip--selected .mdc-chip__icon--leading{opacity:0}.mdc-chip-set--filter .mdc-chip--selected .mdc-chip__icon--leading+.mdc-chip__checkmark{width:0;opacity:1}.mdc-chip-set--filter .mdc-chip__icon--leading-hidden.mdc-chip__icon--leading{width:0;opacity:0}.mdc-chip-set--filter .mdc-chip__icon--leading-hidden.mdc-chip__icon--leading+.mdc-chip__checkmark{width:20px}.mdc-chip{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-chip .mdc-chip__ripple::before,.mdc-chip .mdc-chip__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-chip .mdc-chip__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-chip .mdc-chip__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-chip.mdc-ripple-upgraded .mdc-chip__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-chip.mdc-ripple-upgraded .mdc-chip__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-chip.mdc-ripple-upgraded--unbounded .mdc-chip__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-chip.mdc-ripple-upgraded--foreground-activation .mdc-chip__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-chip.mdc-ripple-upgraded--foreground-deactivation .mdc-chip__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-chip .mdc-chip__ripple::before,.mdc-chip .mdc-chip__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-chip.mdc-ripple-upgraded .mdc-chip__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-chip .mdc-chip__ripple::before,.mdc-chip .mdc-chip__ripple::after{background-color:rgba(0, 0, 0, 0.87);background-color:var(--mdc-ripple-color, rgba(0, 0, 0, 0.87))}.mdc-chip:hover .mdc-chip__ripple::before,.mdc-chip.mdc-ripple-surface--hover .mdc-chip__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-chip.mdc-ripple-upgraded--background-focused .mdc-chip__ripple::before,.mdc-chip.mdc-ripple-upgraded:focus-within .mdc-chip__ripple::before,.mdc-chip:not(.mdc-ripple-upgraded):focus .mdc-chip__ripple::before,.mdc-chip:not(.mdc-ripple-upgraded):focus-within .mdc-chip__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-chip:not(.mdc-ripple-upgraded) .mdc-chip__ripple::after{transition:opacity 150ms linear}.mdc-chip:not(.mdc-ripple-upgraded):active .mdc-chip__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-chip.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-chip .mdc-chip__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected .mdc-chip__ripple::before{opacity:0.08;opacity:var(--mdc-ripple-selected-opacity, 0.08)}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected .mdc-chip__ripple::before,.mdc-chip-set--choice .mdc-chip.mdc-chip--selected .mdc-chip__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:hover .mdc-chip__ripple::before,.mdc-chip-set--choice .mdc-chip.mdc-chip--selected.mdc-ripple-surface--hover .mdc-chip__ripple::before{opacity:0.12;opacity:var(--mdc-ripple-hover-opacity, 0.12)}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected.mdc-ripple-upgraded--background-focused .mdc-chip__ripple::before,.mdc-chip-set--choice .mdc-chip.mdc-chip--selected.mdc-ripple-upgraded:focus-within .mdc-chip__ripple::before,.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:not(.mdc-ripple-upgraded):focus .mdc-chip__ripple::before,.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:not(.mdc-ripple-upgraded):focus-within .mdc-chip__ripple::before{transition-duration:75ms;opacity:0.2;opacity:var(--mdc-ripple-focus-opacity, 0.2)}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:not(.mdc-ripple-upgraded) .mdc-chip__ripple::after{transition:opacity 150ms linear}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected:not(.mdc-ripple-upgraded):active .mdc-chip__ripple::after{transition-duration:75ms;opacity:0.2;opacity:var(--mdc-ripple-press-opacity, 0.2)}.mdc-chip-set--choice .mdc-chip.mdc-chip--selected.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.2)}@-webkit-keyframes mdc-chip-entry{from{-webkit-transform:scale(0.8);transform:scale(0.8);opacity:.4}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes mdc-chip-entry{from{-webkit-transform:scale(0.8);transform:scale(0.8);opacity:.4}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.mdc-chip-set{padding:4px;display:flex;flex-wrap:wrap;box-sizing:border-box}.mdc-chip-set .mdc-chip{margin:4px}.mdc-chip-set .mdc-chip--touch{margin-top:8px;margin-bottom:8px}.mdc-chip-set--input .mdc-chip{-webkit-animation:mdc-chip-entry 100ms cubic-bezier(0, 0, 0.2, 1);animation:mdc-chip-entry 100ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__determinate-circle,.mdc-circular-progress__indeterminate-circle-graphic{stroke:#6200ee;stroke:var(--mdc-theme-primary, #6200ee)}.mdc-circular-progress__determinate-track{stroke:transparent}@-webkit-keyframes mdc-circular-progress-container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes mdc-circular-progress-container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}100%{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}100%{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes mdc-circular-progress-color-1-fade-in-out{from{opacity:.99}25%{opacity:.99}26%{opacity:0}89%{opacity:0}90%{opacity:.99}to{opacity:.99}}@keyframes mdc-circular-progress-color-1-fade-in-out{from{opacity:.99}25%{opacity:.99}26%{opacity:0}89%{opacity:0}90%{opacity:.99}to{opacity:.99}}@-webkit-keyframes mdc-circular-progress-color-2-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:.99}50%{opacity:.99}51%{opacity:0}to{opacity:0}}@keyframes mdc-circular-progress-color-2-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:.99}50%{opacity:.99}51%{opacity:0}to{opacity:0}}@-webkit-keyframes mdc-circular-progress-color-3-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:.99}75%{opacity:.99}76%{opacity:0}to{opacity:0}}@keyframes mdc-circular-progress-color-3-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:.99}75%{opacity:.99}76%{opacity:0}to{opacity:0}}@-webkit-keyframes mdc-circular-progress-color-4-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:.99}90%{opacity:.99}to{opacity:0}}@keyframes mdc-circular-progress-color-4-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:.99}90%{opacity:.99}to{opacity:0}}@-webkit-keyframes mdc-circular-progress-left-spin{from{-webkit-transform:rotate(265deg);transform:rotate(265deg)}50%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}to{-webkit-transform:rotate(265deg);transform:rotate(265deg)}}@keyframes mdc-circular-progress-left-spin{from{-webkit-transform:rotate(265deg);transform:rotate(265deg)}50%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}to{-webkit-transform:rotate(265deg);transform:rotate(265deg)}}@-webkit-keyframes mdc-circular-progress-right-spin{from{-webkit-transform:rotate(-265deg);transform:rotate(-265deg)}50%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}to{-webkit-transform:rotate(-265deg);transform:rotate(-265deg)}}@keyframes mdc-circular-progress-right-spin{from{-webkit-transform:rotate(-265deg);transform:rotate(-265deg)}50%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}to{-webkit-transform:rotate(-265deg);transform:rotate(-265deg)}}.mdc-circular-progress{display:inline-flex;position:relative;direction:ltr;line-height:0;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:transparent}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{-webkit-animation:mdc-circular-progress-container-rotate 1568.2352941176ms linear infinite;animation:mdc-circular-progress-container-rotate 1568.2352941176ms linear infinite}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{-webkit-animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__color-1{-webkit-animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,mdc-circular-progress-color-1-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,mdc-circular-progress-color-1-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__color-2{-webkit-animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,mdc-circular-progress-color-2-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,mdc-circular-progress-color-2-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__color-3{-webkit-animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,mdc-circular-progress-color-3-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,mdc-circular-progress-color-3-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__color-4{-webkit-animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,mdc-circular-progress-color-4-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,mdc-circular-progress-color-4-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{-webkit-animation:mdc-circular-progress-left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:mdc-circular-progress-left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{-webkit-animation:mdc-circular-progress-right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:mdc-circular-progress-right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--closed{opacity:0}.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);position:absolute;left:0;-webkit-transform-origin:left top;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform;transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1),-webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1),-webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1)}[dir=rtl] .mdc-floating-label,.mdc-floating-label[dir=rtl]{right:0;left:auto;-webkit-transform-origin:right top;transform-origin:right top;text-align:right}.mdc-floating-label--float-above{cursor:auto}.mdc-floating-label--required::after{margin-left:1px;margin-right:0px;content:"*"}[dir=rtl] .mdc-floating-label--required::after,.mdc-floating-label--required[dir=rtl]::after{margin-left:0;margin-right:1px}.mdc-floating-label--float-above{-webkit-transform:translateY(-106%) scale(0.75);transform:translateY(-106%) scale(0.75)}.mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-standard 250ms 1;animation:mdc-floating-label-shake-float-above-standard 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-standard{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-106%) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-106%) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-106%) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-106%) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-106%) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-106%) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-106%) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-106%) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-standard{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-106%) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-106%) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-106%) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-106%) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-106%) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-106%) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-106%) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-106%) scale(0.75)}}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:""}.mdc-line-ripple::before{border-bottom-width:1px;z-index:1}.mdc-line-ripple::after{-webkit-transform:scaleX(0);transform:scaleX(0);border-bottom-width:2px;opacity:0;z-index:2}.mdc-line-ripple::after{transition:opacity 180ms cubic-bezier(0.4, 0, 0.2, 1),-webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1),-webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-line-ripple--active::after{-webkit-transform:scaleX(1);transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline,.mdc-notched-outline[dir=rtl]{text-align:right}.mdc-notched-outline__leading,.mdc-notched-outline__notch,.mdc-notched-outline__trailing{box-sizing:border-box;height:100%;border-top:1px solid;border-bottom:1px solid;pointer-events:none}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;width:12px}[dir=rtl] .mdc-notched-outline__leading,.mdc-notched-outline__leading[dir=rtl]{border-left:none;border-right:1px solid}.mdc-notched-outline__trailing{border-left:none;border-right:1px solid;flex-grow:1}[dir=rtl] .mdc-notched-outline__trailing,.mdc-notched-outline__trailing[dir=rtl]{border-left:1px solid;border-right:none}.mdc-notched-outline__notch{flex:0 0 auto;width:auto;max-width:calc(100% - 12px * 2)}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(100% / 0.75)}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch,.mdc-notched-outline--notched .mdc-notched-outline__notch[dir=rtl]{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-select{display:inline-flex;position:relative}.mdc-select:not(.mdc-select--disabled) .mdc-select__selected-text{color:rgba(0, 0, 0, 0.87)}.mdc-select.mdc-select--disabled .mdc-select__selected-text{color:rgba(0, 0, 0, 0.38)}.mdc-select:not(.mdc-select--disabled) .mdc-floating-label{color:rgba(0, 0, 0, 0.6)}.mdc-select:not(.mdc-select--disabled).mdc-select--focused .mdc-floating-label{color:rgba(98, 0, 238, 0.87)}.mdc-select.mdc-select--disabled .mdc-floating-label{color:rgba(0, 0, 0, 0.38)}.mdc-select:not(.mdc-select--disabled) .mdc-select__dropdown-icon{fill:rgba(0, 0, 0, 0.54)}.mdc-select:not(.mdc-select--disabled).mdc-select--focused .mdc-select__dropdown-icon{fill:#6200ee;fill:var(--mdc-theme-primary, #6200ee)}.mdc-select.mdc-select--disabled .mdc-select__dropdown-icon{fill:rgba(0, 0, 0, 0.38)}.mdc-select:not(.mdc-select--disabled)+.mdc-select-helper-text{color:rgba(0, 0, 0, 0.6)}.mdc-select.mdc-select--disabled+.mdc-select-helper-text{color:rgba(0, 0, 0, 0.38)}.mdc-select:not(.mdc-select--disabled) .mdc-select__icon{color:rgba(0, 0, 0, 0.54)}.mdc-select.mdc-select--disabled .mdc-select__icon{color:rgba(0, 0, 0, 0.38)}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-select.mdc-select--disabled .mdc-select__selected-text{color:GrayText}.mdc-select.mdc-select--disabled .mdc-select__dropdown-icon{fill:red}.mdc-select.mdc-select--disabled .mdc-floating-label{color:GrayText}.mdc-select.mdc-select--disabled .mdc-line-ripple::before{border-bottom-color:GrayText}.mdc-select.mdc-select--disabled .mdc-notched-outline__leading,.mdc-select.mdc-select--disabled .mdc-notched-outline__notch,.mdc-select.mdc-select--disabled .mdc-notched-outline__trailing{border-color:GrayText}.mdc-select.mdc-select--disabled .mdc-select__icon{color:GrayText}.mdc-select.mdc-select--disabled+.mdc-select-helper-text{color:GrayText}}.mdc-select .mdc-floating-label{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);pointer-events:none}.mdc-select .mdc-select__anchor{padding-left:16px;padding-right:0}[dir=rtl] .mdc-select .mdc-select__anchor,.mdc-select .mdc-select__anchor[dir=rtl]{padding-left:0;padding-right:16px}.mdc-select.mdc-select--with-leading-icon .mdc-select__anchor{padding-left:0;padding-right:0}[dir=rtl] .mdc-select.mdc-select--with-leading-icon .mdc-select__anchor,.mdc-select.mdc-select--with-leading-icon .mdc-select__anchor[dir=rtl]{padding-left:0;padding-right:0}.mdc-select .mdc-select__icon{width:24px;height:24px;font-size:24px}.mdc-select .mdc-select__dropdown-icon{width:24px;height:24px}.mdc-select .mdc-select__menu .mdc-deprecated-list-item{padding-left:16px;padding-right:16px}[dir=rtl] .mdc-select .mdc-select__menu .mdc-deprecated-list-item,.mdc-select .mdc-select__menu .mdc-deprecated-list-item[dir=rtl]{padding-left:16px;padding-right:16px}.mdc-select .mdc-select__menu .mdc-deprecated-list-item__graphic{margin-left:0;margin-right:12px}[dir=rtl] .mdc-select .mdc-select__menu .mdc-deprecated-list-item__graphic,.mdc-select .mdc-select__menu .mdc-deprecated-list-item__graphic[dir=rtl]{margin-left:12px;margin-right:0}.mdc-select__dropdown-icon{margin-left:12px;margin-right:12px;display:inline-flex;position:relative;align-self:center;align-items:center;justify-content:center;flex-shrink:0;pointer-events:none}.mdc-select__dropdown-icon .mdc-select__dropdown-icon-active,.mdc-select__dropdown-icon .mdc-select__dropdown-icon-inactive{position:absolute;top:0;left:0}.mdc-select__dropdown-icon .mdc-select__dropdown-icon-graphic{width:41.6666666667%;height:20.8333333333%}.mdc-select__dropdown-icon .mdc-select__dropdown-icon-inactive{opacity:1;transition:opacity 75ms linear 75ms}.mdc-select__dropdown-icon .mdc-select__dropdown-icon-active{opacity:0;transition:opacity 75ms linear}[dir=rtl] .mdc-select__dropdown-icon,.mdc-select__dropdown-icon[dir=rtl]{margin-left:12px;margin-right:12px}.mdc-select--activated .mdc-select__dropdown-icon .mdc-select__dropdown-icon-inactive{opacity:0;transition:opacity 49.5ms linear}.mdc-select--activated .mdc-select__dropdown-icon .mdc-select__dropdown-icon-active{opacity:1;transition:opacity 100.5ms linear 49.5ms}.mdc-select__anchor{width:200px;min-width:0;flex:1 1 auto;position:relative;box-sizing:border-box;overflow:hidden;outline:none;cursor:pointer}.mdc-select__anchor .mdc-floating-label--float-above{-webkit-transform:translateY(-106%) scale(0.75);transform:translateY(-106%) scale(0.75)}.mdc-select__selected-text-container{display:flex;-webkit-appearance:none;-moz-appearance:none;appearance:none;pointer-events:none;box-sizing:border-box;width:auto;min-width:0;flex-grow:1;height:28px;border:none;outline:none;padding:0;background-color:transparent;color:inherit}.mdc-select__selected-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);line-height:1.75rem;line-height:var(--mdc-typography-subtitle1-line-height, 1.75rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;width:100%;text-align:left}[dir=rtl] .mdc-select__selected-text,.mdc-select__selected-text[dir=rtl]{text-align:right}.mdc-select--invalid:not(.mdc-select--disabled) .mdc-floating-label{color:#b00020;color:var(--mdc-theme-error, #b00020)}.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-floating-label{color:#b00020;color:var(--mdc-theme-error, #b00020)}.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--invalid+.mdc-select-helper-text--validation-msg{color:#b00020;color:var(--mdc-theme-error, #b00020)}.mdc-select--invalid:not(.mdc-select--disabled) .mdc-select__dropdown-icon{fill:#b00020;fill:var(--mdc-theme-error, #b00020)}.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-select__dropdown-icon{fill:#b00020;fill:var(--mdc-theme-error, #b00020)}.mdc-select--disabled{cursor:default;pointer-events:none}.mdc-select--with-leading-icon .mdc-select__menu .mdc-deprecated-list-item{padding-left:12px;padding-right:12px}[dir=rtl] .mdc-select--with-leading-icon .mdc-select__menu .mdc-deprecated-list-item,.mdc-select--with-leading-icon .mdc-select__menu .mdc-deprecated-list-item[dir=rtl]{padding-left:12px;padding-right:12px}.mdc-select__menu .mdc-deprecated-list .mdc-select__icon{margin-left:0;margin-right:0}[dir=rtl] .mdc-select__menu .mdc-deprecated-list .mdc-select__icon,.mdc-select__menu .mdc-deprecated-list .mdc-select__icon[dir=rtl]{margin-left:0;margin-right:0}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected,.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--activated{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-deprecated-list-item__graphic,.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--activated .mdc-deprecated-list-item__graphic{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-select--filled .mdc-select__anchor{height:56px;display:flex;align-items:baseline}.mdc-select--filled .mdc-select__anchor::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}.mdc-select--filled.mdc-select--no-label .mdc-select__anchor .mdc-select__selected-text::before{content:"​"}.mdc-select--filled.mdc-select--no-label .mdc-select__anchor .mdc-select__selected-text-container{height:100%;display:inline-flex;align-items:center}.mdc-select--filled.mdc-select--no-label .mdc-select__anchor::before{display:none}.mdc-select--filled .mdc-select__anchor{border-top-left-radius:4px;border-top-left-radius:var(--mdc-shape-small, 4px);border-top-right-radius:4px;border-top-right-radius:var(--mdc-shape-small, 4px);border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-select--filled:not(.mdc-select--disabled) .mdc-select__anchor{background-color:whitesmoke}.mdc-select--filled.mdc-select--disabled .mdc-select__anchor{background-color:#fafafa}.mdc-select--filled:not(.mdc-select--disabled) .mdc-line-ripple::before{border-bottom-color:rgba(0, 0, 0, 0.42)}.mdc-select--filled:not(.mdc-select--disabled):hover .mdc-line-ripple::before{border-bottom-color:rgba(0, 0, 0, 0.87)}.mdc-select--filled:not(.mdc-select--disabled) .mdc-line-ripple::after{border-bottom-color:#6200ee;border-bottom-color:var(--mdc-theme-primary, #6200ee)}.mdc-select--filled.mdc-select--disabled .mdc-line-ripple::before{border-bottom-color:rgba(0, 0, 0, 0.06)}.mdc-select--filled .mdc-floating-label{max-width:calc(100% - 64px)}.mdc-select--filled .mdc-floating-label--float-above{max-width:calc(100% / 0.75 - 64px / 0.75)}.mdc-select--filled .mdc-menu-surface--is-open-below{border-top-left-radius:0px;border-top-right-radius:0px}.mdc-select--filled.mdc-select--focused.mdc-line-ripple::after{-webkit-transform:scale(1, 2);transform:scale(1, 2);opacity:1}.mdc-select--filled .mdc-floating-label{left:16px;right:initial}[dir=rtl] .mdc-select--filled .mdc-floating-label,.mdc-select--filled .mdc-floating-label[dir=rtl]{left:initial;right:16px}.mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label{left:48px;right:initial}[dir=rtl] .mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label,.mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label[dir=rtl]{left:initial;right:48px}.mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label{max-width:calc(100% - 96px)}.mdc-select--filled.mdc-select--with-leading-icon .mdc-floating-label--float-above{max-width:calc(100% / 0.75 - 96px / 0.75)}.mdc-select--invalid:not(.mdc-select--disabled) .mdc-line-ripple::before{border-bottom-color:#b00020;border-bottom-color:var(--mdc-theme-error, #b00020)}.mdc-select--invalid:not(.mdc-select--disabled):hover .mdc-line-ripple::before{border-bottom-color:#b00020;border-bottom-color:var(--mdc-theme-error, #b00020)}.mdc-select--invalid:not(.mdc-select--disabled) .mdc-line-ripple::after{border-bottom-color:#b00020;border-bottom-color:var(--mdc-theme-error, #b00020)}.mdc-select--outlined{border:none}.mdc-select--outlined .mdc-select__anchor{height:56px}.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--float-above{-webkit-transform:translateY(-37.25px) scale(1);transform:translateY(-37.25px) scale(1)}.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--float-above{font-size:.75rem}.mdc-select--outlined .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above{-webkit-transform:translateY(-34.75px) scale(0.75);transform:translateY(-34.75px) scale(0.75)}.mdc-select--outlined .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-select-outlined-56px 250ms 1;animation:mdc-floating-label-shake-float-above-select-outlined-56px 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-select-outlined-56px{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-select-outlined-56px{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75)}}.mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__leading{border-top-left-radius:4px;border-top-left-radius:var(--mdc-shape-small, 4px);border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-bottom-left-radius:var(--mdc-shape-small, 4px)}[dir=rtl] .mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__leading,.mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__leading[dir=rtl]{border-top-left-radius:0;border-top-right-radius:4px;border-top-right-radius:var(--mdc-shape-small, 4px);border-bottom-right-radius:4px;border-bottom-right-radius:var(--mdc-shape-small, 4px);border-bottom-left-radius:0}@supports(top: max(0%)){.mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px, var(--mdc-shape-small, 4px))}}@supports(top: max(0%)){.mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:calc(100% - max(12px, var(--mdc-shape-small, 4px)) * 2)}}.mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__trailing{border-top-left-radius:0;border-top-right-radius:4px;border-top-right-radius:var(--mdc-shape-small, 4px);border-bottom-right-radius:4px;border-bottom-right-radius:var(--mdc-shape-small, 4px);border-bottom-left-radius:0}[dir=rtl] .mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__trailing,.mdc-select--outlined .mdc-notched-outline .mdc-notched-outline__trailing[dir=rtl]{border-top-left-radius:4px;border-top-left-radius:var(--mdc-shape-small, 4px);border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-bottom-left-radius:var(--mdc-shape-small, 4px)}@supports(top: max(0%)){.mdc-select--outlined .mdc-select__anchor{padding-left:max(16px, calc(var(--mdc-shape-small, 4px) + 4px))}}[dir=rtl] .mdc-select--outlined .mdc-select__anchor,.mdc-select--outlined .mdc-select__anchor[dir=rtl]{padding-left:0}@supports(top: max(0%)){[dir=rtl] .mdc-select--outlined .mdc-select__anchor,.mdc-select--outlined .mdc-select__anchor[dir=rtl]{padding-right:max(16px, calc(var(--mdc-shape-small, 4px) + 4px))}}@supports(top: max(0%)){.mdc-select--outlined+.mdc-select-helper-text{margin-left:max(16px, calc(var(--mdc-shape-small, 4px) + 4px))}}[dir=rtl] .mdc-select--outlined+.mdc-select-helper-text,.mdc-select--outlined+.mdc-select-helper-text[dir=rtl]{margin-left:0}@supports(top: max(0%)){[dir=rtl] .mdc-select--outlined+.mdc-select-helper-text,.mdc-select--outlined+.mdc-select-helper-text[dir=rtl]{margin-right:max(16px, calc(var(--mdc-shape-small, 4px) + 4px))}}.mdc-select--outlined:not(.mdc-select--disabled) .mdc-select__anchor{background-color:transparent}.mdc-select--outlined.mdc-select--disabled .mdc-select__anchor{background-color:transparent}.mdc-select--outlined:not(.mdc-select--disabled) .mdc-notched-outline__leading,.mdc-select--outlined:not(.mdc-select--disabled) .mdc-notched-outline__notch,.mdc-select--outlined:not(.mdc-select--disabled) .mdc-notched-outline__trailing{border-color:rgba(0, 0, 0, 0.38)}.mdc-select--outlined:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__leading,.mdc-select--outlined:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__notch,.mdc-select--outlined:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__trailing{border-color:rgba(0, 0, 0, 0.87)}.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__leading,.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__notch,.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__trailing{border-width:2px}.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__leading,.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__notch,.mdc-select--outlined:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__trailing{border-color:#6200ee;border-color:var(--mdc-theme-primary, #6200ee)}.mdc-select--outlined.mdc-select--disabled .mdc-notched-outline__leading,.mdc-select--outlined.mdc-select--disabled .mdc-notched-outline__notch,.mdc-select--outlined.mdc-select--disabled .mdc-notched-outline__trailing{border-color:rgba(0, 0, 0, 0.06)}.mdc-select--outlined .mdc-select__anchor :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mdc-select--outlined .mdc-select__anchor{display:flex;align-items:baseline;overflow:visible}.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-select-outlined 250ms 1;animation:mdc-floating-label-shake-float-above-select-outlined 250ms 1}.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--float-above{-webkit-transform:translateY(-37.25px) scale(1);transform:translateY(-37.25px) scale(1)}.mdc-select--outlined .mdc-select__anchor .mdc-floating-label--float-above{font-size:.75rem}.mdc-select--outlined .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above{-webkit-transform:translateY(-34.75px) scale(0.75);transform:translateY(-34.75px) scale(0.75)}.mdc-select--outlined .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-select--outlined .mdc-select__anchor .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-select--outlined .mdc-select__anchor .mdc-select__selected-text::before{content:"​"}.mdc-select--outlined .mdc-select__anchor .mdc-select__selected-text-container{height:100%;display:inline-flex;align-items:center}.mdc-select--outlined .mdc-select__anchor::before{display:none}.mdc-select--outlined .mdc-select__selected-text-container{display:flex;border:none;z-index:1;background-color:transparent}.mdc-select--outlined .mdc-select__icon{z-index:2}.mdc-select--outlined .mdc-floating-label{line-height:1.15rem;left:4px;right:initial}[dir=rtl] .mdc-select--outlined .mdc-floating-label,.mdc-select--outlined .mdc-floating-label[dir=rtl]{left:initial;right:4px}.mdc-select--outlined.mdc-select--focused .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled) .mdc-notched-outline__leading,.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled) .mdc-notched-outline__notch,.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled) .mdc-notched-outline__trailing{border-color:#b00020;border-color:var(--mdc-theme-error, #b00020)}.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__leading,.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__notch,.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled):not(.mdc-select--focused) .mdc-select__anchor:hover .mdc-notched-outline .mdc-notched-outline__trailing{border-color:#b00020;border-color:var(--mdc-theme-error, #b00020)}.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__leading,.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__notch,.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__trailing{border-width:2px}.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__leading,.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__notch,.mdc-select--outlined.mdc-select--invalid:not(.mdc-select--disabled).mdc-select--focused .mdc-notched-outline .mdc-notched-outline__trailing{border-color:#b00020;border-color:var(--mdc-theme-error, #b00020)}.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label{left:36px;right:initial}[dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label,.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label[dir=rtl]{left:initial;right:36px}.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--float-above{-webkit-transform:translateY(-37.25px) translateX(-32px) scale(1);transform:translateY(-37.25px) translateX(-32px) scale(1)}[dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--float-above,.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--float-above[dir=rtl]{-webkit-transform:translateY(-37.25px) translateX(32px) scale(1);transform:translateY(-37.25px) translateX(32px) scale(1)}.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--float-above{font-size:.75rem}.mdc-select--outlined.mdc-select--with-leading-icon.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-select--outlined.mdc-select--with-leading-icon .mdc-notched-outline--upgraded .mdc-floating-label--float-above{-webkit-transform:translateY(-34.75px) translateX(-32px) scale(0.75);transform:translateY(-34.75px) translateX(-32px) scale(0.75)}[dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon.mdc-notched-outline--upgraded .mdc-floating-label--float-above,[dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon .mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-select--outlined.mdc-select--with-leading-icon.mdc-notched-outline--upgraded .mdc-floating-label--float-above[dir=rtl],.mdc-select--outlined.mdc-select--with-leading-icon .mdc-notched-outline--upgraded .mdc-floating-label--float-above[dir=rtl]{-webkit-transform:translateY(-34.75px) translateX(32px) scale(0.75);transform:translateY(-34.75px) translateX(32px) scale(0.75)}.mdc-select--outlined.mdc-select--with-leading-icon.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-select--outlined.mdc-select--with-leading-icon .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px 250ms 1;animation:mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px{0%{-webkit-transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px{0%{-webkit-transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75)}}[dir=rtl] .mdc-select--outlined.mdc-select--with-leading-icon .mdc-floating-label--shake,.mdc-select--outlined.mdc-select--with-leading-icon[dir=rtl] .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px 250ms 1;animation:mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px-rtl{0%{-webkit-transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-select-outlined-leading-icon-56px-rtl{0%{-webkit-transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75)}}.mdc-select--outlined.mdc-select--with-leading-icon .mdc-select__anchor :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch{max-width:calc(100% - 96px)}.mdc-select--outlined .mdc-menu-surface{margin-bottom:8px}.mdc-select--outlined.mdc-select--no-label .mdc-menu-surface,.mdc-select--outlined .mdc-menu-surface--is-open-below{margin-bottom:0}.mdc-select__anchor{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-select__anchor .mdc-select__ripple::before,.mdc-select__anchor .mdc-select__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-select__anchor .mdc-select__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-select__anchor .mdc-select__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-select__anchor.mdc-ripple-upgraded .mdc-select__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-select__anchor.mdc-ripple-upgraded .mdc-select__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-select__anchor.mdc-ripple-upgraded--unbounded .mdc-select__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-select__anchor.mdc-ripple-upgraded--foreground-activation .mdc-select__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-select__anchor.mdc-ripple-upgraded--foreground-deactivation .mdc-select__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-select__anchor .mdc-select__ripple::before,.mdc-select__anchor .mdc-select__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-select__anchor.mdc-ripple-upgraded .mdc-select__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-select__anchor .mdc-select__ripple::before,.mdc-select__anchor .mdc-select__ripple::after{background-color:rgba(0, 0, 0, 0.87);background-color:var(--mdc-ripple-color, rgba(0, 0, 0, 0.87))}.mdc-select__anchor:hover .mdc-select__ripple::before,.mdc-select__anchor.mdc-ripple-surface--hover .mdc-select__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-select__anchor.mdc-ripple-upgraded--background-focused .mdc-select__ripple::before,.mdc-select__anchor:not(.mdc-ripple-upgraded):focus .mdc-select__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-select__anchor .mdc-select__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::before,.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, var(--mdc-theme-on-surface, #000))}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:hover .mdc-deprecated-list-item__ripple::before,.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-surface--hover .mdc-deprecated-list-item__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before,.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded) .mdc-deprecated-list-item__ripple::after{transition:opacity 150ms linear}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-deprecated-list-item__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-list-item__ripple::before,.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected .mdc-list-item__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, var(--mdc-theme-on-surface, #000))}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:hover .mdc-list-item__ripple::before,.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-surface--hover .mdc-list-item__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before,.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after{transition:opacity 150ms linear}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-select__menu .mdc-deprecated-list .mdc-deprecated-list-item--selected.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-select-helper-text{margin:0;margin-left:16px;margin-right:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.75rem;font-size:var(--mdc-typography-caption-font-size, 0.75rem);line-height:1.25rem;line-height:var(--mdc-typography-caption-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:0.0333333333em;letter-spacing:var(--mdc-typography-caption-letter-spacing, 0.0333333333em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-caption-text-transform, inherit);display:block;margin-top:0;line-height:normal}[dir=rtl] .mdc-select-helper-text,.mdc-select-helper-text[dir=rtl]{margin-left:16px;margin-right:16px}.mdc-select-helper-text::before{display:inline-block;width:0;height:16px;content:"";vertical-align:0}.mdc-select-helper-text--validation-msg{opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-select--invalid+.mdc-select-helper-text--validation-msg,.mdc-select-helper-text--validation-msg-persistent{opacity:1}.mdc-select--with-leading-icon .mdc-select__icon{display:inline-block;box-sizing:border-box;border:none;text-decoration:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex-shrink:0;align-self:center;background-color:transparent;fill:currentColor}.mdc-select--with-leading-icon .mdc-select__icon{margin-left:12px;margin-right:12px}[dir=rtl] .mdc-select--with-leading-icon .mdc-select__icon,.mdc-select--with-leading-icon .mdc-select__icon[dir=rtl]{margin-left:12px;margin-right:12px}.mdc-select__icon:not([tabindex]),.mdc-select__icon[tabindex="-1"]{cursor:default;pointer-events:none}.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit)}.mdc-data-table{background-color:#fff;background-color:var(--mdc-theme-surface, #fff);border-radius:4px;border-radius:var(--mdc-shape-medium, 4px);border-width:1px;border-style:solid;border-color:rgba(0,0,0,.12);-webkit-overflow-scrolling:touch;display:inline-flex;flex-direction:column;box-sizing:border-box;position:relative}.mdc-data-table .mdc-data-table__header-cell:first-child{border-top-left-radius:4px;border-top-left-radius:var(--mdc-shape-medium, 4px)}[dir=rtl] .mdc-data-table .mdc-data-table__header-cell:first-child,.mdc-data-table .mdc-data-table__header-cell:first-child[dir=rtl]{border-top-right-radius:4px;border-top-right-radius:var(--mdc-shape-medium, 4px);border-top-left-radius:0}.mdc-data-table .mdc-data-table__header-cell:last-child{border-top-right-radius:4px;border-top-right-radius:var(--mdc-shape-medium, 4px)}[dir=rtl] .mdc-data-table .mdc-data-table__header-cell:last-child,.mdc-data-table .mdc-data-table__header-cell:last-child[dir=rtl]{border-top-left-radius:4px;border-top-left-radius:var(--mdc-shape-medium, 4px);border-top-right-radius:0}.mdc-data-table__row{background-color:inherit}.mdc-data-table__header-cell{background-color:#fff;background-color:var(--mdc-theme-surface, #fff)}.mdc-data-table__row--selected{background-color:rgba(98, 0, 238, 0.04)}.mdc-data-table__pagination-rows-per-page-select:not(.mdc-select--disabled) .mdc-notched-outline__leading,.mdc-data-table__pagination-rows-per-page-select:not(.mdc-select--disabled) .mdc-notched-outline__notch,.mdc-data-table__pagination-rows-per-page-select:not(.mdc-select--disabled) .mdc-notched-outline__trailing{border-color:rgba(0, 0, 0, 0.12)}.mdc-data-table__cell,.mdc-data-table__header-cell{border-bottom-color:rgba(0,0,0,.12)}.mdc-data-table__pagination{border-top-color:rgba(0,0,0,.12)}.mdc-data-table__cell,.mdc-data-table__header-cell{border-bottom-width:1px;border-bottom-style:solid}.mdc-data-table__pagination{border-top-width:1px;border-top-style:solid}.mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:none}.mdc-data-table__row:not(.mdc-data-table__row--selected):hover{background-color:rgba(0, 0, 0, 0.04)}.mdc-data-table__header-cell{color:rgba(0, 0, 0, 0.87)}.mdc-data-table__pagination-total,.mdc-data-table__pagination-rows-per-page-label,.mdc-data-table__cell{color:rgba(0, 0, 0, 0.87)}.mdc-data-table__row{height:52px}.mdc-data-table__pagination{min-height:52px}.mdc-data-table__header-row{height:56px}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px 0 16px}.mdc-data-table__header-cell--checkbox,.mdc-data-table__cell--checkbox{padding-left:4px;padding-right:0}[dir=rtl] .mdc-data-table__header-cell--checkbox,[dir=rtl] .mdc-data-table__cell--checkbox,.mdc-data-table__header-cell--checkbox[dir=rtl],.mdc-data-table__cell--checkbox[dir=rtl]{padding-left:0;padding-right:4px}.mdc-data-table__sort-icon-button{color:rgba(0, 0, 0, 0.6)}.mdc-data-table__sort-icon-button .mdc-icon-button__ripple::before,.mdc-data-table__sort-icon-button .mdc-icon-button__ripple::after{background-color:rgba(0, 0, 0, 0.6);background-color:var(--mdc-ripple-color, rgba(0, 0, 0, 0.6))}.mdc-data-table__sort-icon-button:hover .mdc-icon-button__ripple::before,.mdc-data-table__sort-icon-button.mdc-ripple-surface--hover .mdc-icon-button__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-data-table__sort-icon-button.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before,.mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after{transition:opacity 150ms linear}.mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-data-table__sort-icon-button.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button{color:rgba(0, 0, 0, 0.87)}.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button .mdc-icon-button__ripple::before,.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button .mdc-icon-button__ripple::after{background-color:rgba(0, 0, 0, 0.87);background-color:var(--mdc-ripple-color, rgba(0, 0, 0, 0.87))}.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button:hover .mdc-icon-button__ripple::before,.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button.mdc-ripple-surface--hover .mdc-icon-button__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before,.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after{transition:opacity 150ms linear}.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-data-table__table-container{-webkit-overflow-scrolling:touch;overflow-x:auto;width:100%}.mdc-data-table__table{min-width:100%;border:0;white-space:nowrap;border-spacing:0;table-layout:fixed}.mdc-data-table__cell{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);box-sizing:border-box;overflow:hidden;text-align:left;text-overflow:ellipsis}[dir=rtl] .mdc-data-table__cell,.mdc-data-table__cell[dir=rtl]{text-align:right}.mdc-data-table__cell--numeric{text-align:right}[dir=rtl] .mdc-data-table__cell--numeric,.mdc-data-table__cell--numeric[dir=rtl]{text-align:left}.mdc-data-table__cell--checkbox{width:1px}.mdc-data-table__header-cell{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-subtitle2-font-size, 0.875rem);line-height:1.375rem;line-height:var(--mdc-typography-subtitle2-line-height, 1.375rem);font-weight:500;font-weight:var(--mdc-typography-subtitle2-font-weight, 500);letter-spacing:0.0071428571em;letter-spacing:var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle2-text-transform, inherit);box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:left}[dir=rtl] .mdc-data-table__header-cell,.mdc-data-table__header-cell[dir=rtl]{text-align:right}.mdc-data-table__header-cell--checkbox{width:1px}.mdc-data-table__header-cell--numeric{text-align:right}[dir=rtl] .mdc-data-table__header-cell--numeric,.mdc-data-table__header-cell--numeric[dir=rtl]{text-align:left}.mdc-data-table__sort-icon-button{width:28px;height:28px;padding:2px;-webkit-transform:rotate(0.0001deg);transform:rotate(0.0001deg);margin-left:4px;margin-right:0;transition:-webkit-transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);opacity:0}.mdc-data-table__sort-icon-button.mdc-icon-button--touch{margin-top:0;margin-bottom:0}.mdc-data-table__sort-icon-button.mdc-icon-button--touch .mdc-icon-button__touch{display:none}[dir=rtl] .mdc-data-table__sort-icon-button,.mdc-data-table__sort-icon-button[dir=rtl]{margin-left:0;margin-right:4px}.mdc-data-table__header-cell--numeric .mdc-data-table__sort-icon-button{margin-left:0;margin-right:4px}[dir=rtl] .mdc-data-table__header-cell--numeric .mdc-data-table__sort-icon-button,.mdc-data-table__header-cell--numeric .mdc-data-table__sort-icon-button[dir=rtl]{margin-left:4px;margin-right:0}.mdc-data-table__header-cell--sorted-descending .mdc-data-table__sort-icon-button{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.mdc-data-table__sort-icon-button:focus,.mdc-data-table__header-cell:hover .mdc-data-table__sort-icon-button,.mdc-data-table__header-cell--sorted .mdc-data-table__sort-icon-button{opacity:1}.mdc-data-table__header-cell-wrapper{align-items:center;display:inline-flex;vertical-align:middle}.mdc-data-table__header-cell--with-sort{cursor:pointer}.mdc-data-table__sort-status-label{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.mdc-data-table__progress-indicator{display:none;position:absolute;width:100%}.mdc-data-table--in-progress .mdc-data-table__progress-indicator{display:block}.mdc-data-table__scrim{background-color:#fff;background-color:var(--mdc-theme-surface, #fff);height:100%;opacity:.32;position:absolute;top:0;width:100%}.mdc-data-table--sticky-header .mdc-data-table__header-cell{position:-webkit-sticky;position:sticky;top:0;z-index:1}.mdc-data-table__pagination{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);box-sizing:border-box;display:flex;justify-content:flex-end}.mdc-data-table__pagination-trailing{margin-left:4px;margin-right:0;align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-end}[dir=rtl] .mdc-data-table__pagination-trailing,.mdc-data-table__pagination-trailing[dir=rtl]{margin-left:0;margin-right:4px}.mdc-data-table__pagination-navigation{align-items:center;display:flex}.mdc-data-table__pagination-button{margin-left:0;margin-right:4px}[dir=rtl] .mdc-data-table__pagination-button .mdc-button__icon,.mdc-data-table__pagination-button .mdc-button__icon[dir=rtl]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}[dir=rtl] .mdc-data-table__pagination-button,.mdc-data-table__pagination-button[dir=rtl]{margin-left:4px;margin-right:0}.mdc-data-table__pagination-total{margin-left:14px;margin-right:36px;white-space:nowrap}[dir=rtl] .mdc-data-table__pagination-total,.mdc-data-table__pagination-total[dir=rtl]{margin-left:36px;margin-right:14px}.mdc-data-table__pagination-rows-per-page{margin-left:0;margin-right:22px;align-items:center;display:inline-flex}[dir=rtl] .mdc-data-table__pagination-rows-per-page,.mdc-data-table__pagination-rows-per-page[dir=rtl]{margin-left:22px;margin-right:0}.mdc-data-table__pagination-rows-per-page-label{margin-left:0;margin-right:12px;white-space:nowrap}[dir=rtl] .mdc-data-table__pagination-rows-per-page-label,.mdc-data-table__pagination-rows-per-page-label[dir=rtl]{margin-left:12px;margin-right:0}.mdc-data-table__pagination-rows-per-page-select{min-width:80px;min-width:var(--mdc-menu-min-width, 80px);margin:8px 0}.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor{width:100%;min-width:80px}.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor{height:36px}.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-floating-label--float-above{-webkit-transform:translateY(-27.25px) scale(1);transform:translateY(-27.25px) scale(1)}.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-floating-label--float-above{font-size:.75rem}.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above{-webkit-transform:translateY(-24.75px) scale(0.75);transform:translateY(-24.75px) scale(0.75)}.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-data-table__pagination-rows-per-page-select .mdc-select__anchor .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-select-outlined-36px 250ms 1;animation:mdc-floating-label-shake-float-above-select-outlined-36px 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-select-outlined-36px{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-select-outlined-36px{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75)}}.mdc-data-table__pagination-rows-per-page-select .mdc-select__dropdown-icon{width:20px;height:20px}.mdc-data-table__pagination-rows-per-page-select.mdc-select--outlined .mdc-select__anchor :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch{max-width:calc(100% - 56px)}.mdc-data-table__pagination-rows-per-page-select .mdc-deprecated-list-item{height:36px}.mdc-data-table__header-row-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::before,.mdc-data-table__header-row-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::after,.mdc-data-table__row-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::before,.mdc-data-table__row-checkbox.mdc-checkbox--selected .mdc-checkbox__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-data-table__header-row-checkbox.mdc-checkbox--selected:hover .mdc-checkbox__ripple::before,.mdc-data-table__header-row-checkbox.mdc-checkbox--selected.mdc-ripple-surface--hover .mdc-checkbox__ripple::before,.mdc-data-table__row-checkbox.mdc-checkbox--selected:hover .mdc-checkbox__ripple::before,.mdc-data-table__row-checkbox.mdc-checkbox--selected.mdc-ripple-surface--hover .mdc-checkbox__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-data-table__header-row-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded--background-focused .mdc-checkbox__ripple::before,.mdc-data-table__header-row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):focus .mdc-checkbox__ripple::before,.mdc-data-table__row-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded--background-focused .mdc-checkbox__ripple::before,.mdc-data-table__row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):focus .mdc-checkbox__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-data-table__header-row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded) .mdc-checkbox__ripple::after,.mdc-data-table__row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded) .mdc-checkbox__ripple::after{transition:opacity 150ms linear}.mdc-data-table__header-row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):active .mdc-checkbox__ripple::after,.mdc-data-table__row-checkbox.mdc-checkbox--selected:not(.mdc-ripple-upgraded):active .mdc-checkbox__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-data-table__header-row-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded,.mdc-data-table__row-checkbox.mdc-checkbox--selected.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-data-table__header-row-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::before,.mdc-data-table__header-row-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::after,.mdc-data-table__row-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::before,.mdc-data-table__row-checkbox.mdc-ripple-upgraded--background-focused.mdc-checkbox--selected .mdc-checkbox__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-data-table__header-row-checkbox .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background,.mdc-data-table__row-checkbox .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}.mdc-data-table__header-row-checkbox .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-data-table__header-row-checkbox .mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background,.mdc-data-table__header-row-checkbox .mdc-checkbox__native-control[data-indeterminate=true]:enabled~.mdc-checkbox__background,.mdc-data-table__row-checkbox .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-data-table__row-checkbox .mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background,.mdc-data-table__row-checkbox .mdc-checkbox__native-control[data-indeterminate=true]:enabled~.mdc-checkbox__background{border-color:#6200ee;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee));background-color:#6200ee;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee))}@-webkit-keyframes mdc-checkbox-fade-in-background-8A000000FF6200EE00000000FF6200EE{0%{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}50%{border-color:#6200ee;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee));background-color:#6200ee;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee))}}@keyframes mdc-checkbox-fade-in-background-8A000000FF6200EE00000000FF6200EE{0%{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}50%{border-color:#6200ee;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee));background-color:#6200ee;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee))}}@-webkit-keyframes mdc-checkbox-fade-out-background-8A000000FF6200EE00000000FF6200EE{0%,80%{border-color:#6200ee;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee));background-color:#6200ee;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee))}100%{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}}@keyframes mdc-checkbox-fade-out-background-8A000000FF6200EE00000000FF6200EE{0%,80%{border-color:#6200ee;border-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee));background-color:#6200ee;background-color:var(--mdc-checkbox-checked-color, var(--mdc-theme-secondary, #6200ee))}100%{border-color:rgba(0, 0, 0, 0.54);border-color:var(--mdc-checkbox-unchecked-color, rgba(0, 0, 0, 0.54));background-color:transparent}}.mdc-data-table__header-row-checkbox.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-data-table__header-row-checkbox.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-data-table__row-checkbox.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-data-table__row-checkbox.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{-webkit-animation-name:mdc-checkbox-fade-in-background-8A000000FF6200EE00000000FF6200EE;animation-name:mdc-checkbox-fade-in-background-8A000000FF6200EE00000000FF6200EE}.mdc-data-table__header-row-checkbox.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-data-table__header-row-checkbox.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-data-table__row-checkbox.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-data-table__row-checkbox.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{-webkit-animation-name:mdc-checkbox-fade-out-background-8A000000FF6200EE00000000FF6200EE;animation-name:mdc-checkbox-fade-out-background-8A000000FF6200EE00000000FF6200EE}.mdc-dialog,.mdc-dialog__scrim{position:fixed;top:0;left:0;align-items:center;justify-content:center;box-sizing:border-box;width:100%;height:100%}.mdc-dialog{display:none;z-index:7;z-index:var(--mdc-dialog-z-index, 7)}.mdc-dialog .mdc-dialog__surface{background-color:#fff;background-color:var(--mdc-theme-surface, #fff)}.mdc-dialog .mdc-dialog__scrim{background-color:rgba(0,0,0,.32)}.mdc-dialog .mdc-dialog__surface-scrim{background-color:rgba(0,0,0,.32)}.mdc-dialog .mdc-dialog__title{color:rgba(0,0,0,.87)}.mdc-dialog .mdc-dialog__content{color:rgba(0,0,0,.6)}.mdc-dialog .mdc-dialog__close{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-dialog .mdc-dialog__close .mdc-icon-button__ripple::before,.mdc-dialog .mdc-dialog__close .mdc-icon-button__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, var(--mdc-theme-on-surface, #000))}.mdc-dialog .mdc-dialog__close:hover .mdc-icon-button__ripple::before,.mdc-dialog .mdc-dialog__close.mdc-ripple-surface--hover .mdc-icon-button__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-dialog .mdc-dialog__close.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before,.mdc-dialog .mdc-dialog__close:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-dialog .mdc-dialog__close:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after{transition:opacity 150ms linear}.mdc-dialog .mdc-dialog__close:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-dialog .mdc-dialog__close.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-dialog.mdc-dialog--scrollable .mdc-dialog__title,.mdc-dialog.mdc-dialog--scrollable .mdc-dialog__actions,.mdc-dialog.mdc-dialog--scrollable.mdc-dialog-scroll-divider-footer .mdc-dialog__actions{border-color:rgba(0,0,0,.12)}.mdc-dialog.mdc-dialog--scrollable .mdc-dialog__title{border-bottom:1px solid rgba(0,0,0,.12);margin-bottom:0}.mdc-dialog.mdc-dialog-scroll-divider-header.mdc-dialog--fullscreen .mdc-dialog__header{box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0,0,0,.12)}.mdc-dialog .mdc-dialog__content{padding:20px 24px 20px 24px}.mdc-dialog .mdc-dialog__surface{min-width:280px}@media(max-width: 592px){.mdc-dialog .mdc-dialog__surface{max-width:calc(100vw - 32px)}}@media(min-width: 592px){.mdc-dialog .mdc-dialog__surface{max-width:560px}}.mdc-dialog .mdc-dialog__surface{max-height:calc(100% - 32px)}.mdc-dialog .mdc-dialog__surface{border-radius:4px;border-radius:var(--mdc-shape-medium, 4px)}@media(max-width: 960px)and (max-height: 1440px){.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface{max-height:560px;max-width:560px}.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close{right:-12px}}@media(max-width: 720px)and (max-height: 1023px)and (max-width: 672px){.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface{max-width:calc(100vw - 112px)}}@media(max-width: 720px)and (max-height: 1023px)and (min-width: 672px){.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface{max-width:560px}}@media(max-width: 720px)and (max-height: 1023px)and (max-height: 720px){.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface{max-height:calc(100vh - 160px)}}@media(max-width: 720px)and (max-height: 1023px)and (min-height: 720px){.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface{max-height:560px}}@media(max-width: 720px)and (max-height: 1023px){.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close{right:-12px}}@media(max-width: 720px)and (max-height: 400px){.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface{height:100%;max-height:100vh;max-width:100vw;width:100%;border-radius:0}.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close{order:-1;left:-12px}.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__header{padding:0 16px 9px;justify-content:flex-start}.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__title{margin-left:calc(16px - 2 * 12px)}}@media(max-width: 600px)and (max-height: 960px){.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface{height:100%;max-height:100vh;max-width:100vw;width:100vw;border-radius:0}.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close{order:-1;left:-12px}.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__header{padding:0 16px 9px;justify-content:flex-start}.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__title{margin-left:calc(16px - 2 * 12px)}}@media(min-width: 960px)and (min-height: 1440px){.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface{max-width:calc(100vw - 400px)}.mdc-dialog.mdc-dialog--fullscreen .mdc-dialog__surface .mdc-dialog__close{right:-12px}}.mdc-dialog.mdc-dialog__scrim--hidden .mdc-dialog__scrim{opacity:0}.mdc-dialog__scrim{opacity:0;z-index:-1}.mdc-dialog__container{display:flex;flex-direction:row;align-items:center;justify-content:space-around;box-sizing:border-box;height:100%;-webkit-transform:scale(0.8);transform:scale(0.8);opacity:0;pointer-events:none}.mdc-dialog__surface{position:relative;box-shadow:0px 11px 15px -7px rgba(0, 0, 0, 0.2),0px 24px 38px 3px rgba(0, 0, 0, 0.14),0px 9px 46px 8px rgba(0,0,0,.12);display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;box-sizing:border-box;max-width:100%;max-height:100%;pointer-events:auto;overflow-y:auto}.mdc-dialog__surface .mdc-elevation-overlay{width:100%;height:100%;top:0;left:0}[dir=rtl] .mdc-dialog__surface,.mdc-dialog__surface[dir=rtl]{text-align:right}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-dialog__surface{outline:2px solid windowText}}.mdc-dialog__surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:2px solid transparent;border-radius:inherit;content:"";pointer-events:none}@media screen and (-ms-high-contrast: active),screen and (-ms-high-contrast: none){.mdc-dialog__surface::before{content:none}}.mdc-dialog__title{display:block;margin-top:0;line-height:normal;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1.25rem;font-size:var(--mdc-typography-headline6-font-size, 1.25rem);line-height:2rem;line-height:var(--mdc-typography-headline6-line-height, 2rem);font-weight:500;font-weight:var(--mdc-typography-headline6-font-weight, 500);letter-spacing:0.0125em;letter-spacing:var(--mdc-typography-headline6-letter-spacing, 0.0125em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-headline6-text-transform, inherit);position:relative;flex-shrink:0;box-sizing:border-box;margin:0 0 1px;padding:0 24px 9px}.mdc-dialog__title::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}[dir=rtl] .mdc-dialog__title,.mdc-dialog__title[dir=rtl]{text-align:right}.mdc-dialog--scrollable .mdc-dialog__title{margin-bottom:1px;padding-bottom:15px}.mdc-dialog--fullscreen .mdc-dialog__header{align-items:baseline;border-bottom:1px solid transparent;display:inline-flex;justify-content:space-between;padding:0 24px 9px;z-index:1}.mdc-dialog--fullscreen .mdc-dialog__header .mdc-dialog__close{right:-12px}.mdc-dialog--fullscreen .mdc-dialog__title{margin-bottom:0;padding:0;border-bottom:0}.mdc-dialog--fullscreen.mdc-dialog--scrollable .mdc-dialog__title{border-bottom:0;margin-bottom:0}.mdc-dialog--fullscreen .mdc-dialog__close{top:5px}.mdc-dialog--fullscreen.mdc-dialog--scrollable .mdc-dialog__actions{border-top:1px solid transparent}.mdc-dialog__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-body1-font-size, 1rem);line-height:1.5rem;line-height:var(--mdc-typography-body1-line-height, 1.5rem);font-weight:400;font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:0.03125em;letter-spacing:var(--mdc-typography-body1-letter-spacing, 0.03125em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body1-text-transform, inherit);flex-grow:1;box-sizing:border-box;margin:0;overflow:auto;-webkit-overflow-scrolling:touch}.mdc-dialog__content>:first-child{margin-top:0}.mdc-dialog__content>:last-child{margin-bottom:0}.mdc-dialog__title+.mdc-dialog__content,.mdc-dialog__header+.mdc-dialog__content{padding-top:0}.mdc-dialog--scrollable .mdc-dialog__title+.mdc-dialog__content{padding-top:8px;padding-bottom:8px}.mdc-dialog__content .mdc-deprecated-list:first-child:last-child{padding:6px 0 0}.mdc-dialog--scrollable .mdc-dialog__content .mdc-deprecated-list:first-child:last-child{padding:0}.mdc-dialog__actions{display:flex;position:relative;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;box-sizing:border-box;min-height:52px;margin:0;padding:8px;border-top:1px solid transparent}.mdc-dialog--stacked .mdc-dialog__actions{flex-direction:column;align-items:flex-end}.mdc-dialog__button{margin-left:8px;margin-right:0;max-width:100%;text-align:right}[dir=rtl] .mdc-dialog__button,.mdc-dialog__button[dir=rtl]{margin-left:0;margin-right:8px}.mdc-dialog__button:first-child{margin-left:0;margin-right:0}[dir=rtl] .mdc-dialog__button:first-child,.mdc-dialog__button:first-child[dir=rtl]{margin-left:0;margin-right:0}[dir=rtl] .mdc-dialog__button,.mdc-dialog__button[dir=rtl]{text-align:left}.mdc-dialog--stacked .mdc-dialog__button:not(:first-child){margin-top:12px}.mdc-dialog--open,.mdc-dialog--opening,.mdc-dialog--closing{display:flex}.mdc-dialog--opening .mdc-dialog__scrim{transition:opacity 150ms linear}.mdc-dialog--opening .mdc-dialog__container{transition:opacity 75ms linear,-webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 75ms linear,transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 75ms linear,transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-dialog--closing .mdc-dialog__scrim,.mdc-dialog--closing .mdc-dialog__container{transition:opacity 75ms linear}.mdc-dialog--closing .mdc-dialog__container{-webkit-transform:none;transform:none}.mdc-dialog--open .mdc-dialog__scrim{opacity:1}.mdc-dialog--open .mdc-dialog__container{-webkit-transform:none;transform:none;opacity:1}.mdc-dialog--open.mdc-dialog__surface-scrim--shown .mdc-dialog__surface-scrim{opacity:1;z-index:1}.mdc-dialog--open.mdc-dialog__surface-scrim--hiding .mdc-dialog__surface-scrim{transition:opacity 75ms linear}.mdc-dialog--open.mdc-dialog__surface-scrim--showing .mdc-dialog__surface-scrim{transition:opacity 150ms linear}.mdc-dialog__surface-scrim{display:none;opacity:0;position:absolute;width:100%;height:100%}.mdc-dialog__surface-scrim--shown .mdc-dialog__surface-scrim,.mdc-dialog__surface-scrim--showing .mdc-dialog__surface-scrim,.mdc-dialog__surface-scrim--hiding .mdc-dialog__surface-scrim{display:block}.mdc-dialog-scroll-lock{overflow:hidden}.mdc-drawer{border-color:rgba(0, 0, 0, 0.12);background-color:#fff;background-color:var(--mdc-theme-surface, #fff);border-top-left-radius:0;border-top-right-radius:0;border-top-right-radius:var(--mdc-shape-large, 0);border-bottom-right-radius:0;border-bottom-right-radius:var(--mdc-shape-large, 0);border-bottom-left-radius:0;z-index:6;width:256px;display:flex;flex-direction:column;flex-shrink:0;box-sizing:border-box;height:100%;border-right-width:1px;border-right-style:solid;overflow:hidden;transition-property:-webkit-transform;transition-property:transform;transition-property:transform, -webkit-transform;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1)}.mdc-drawer .mdc-drawer__title{color:rgba(0, 0, 0, 0.87)}.mdc-drawer .mdc-deprecated-list-group__subheader{color:rgba(0, 0, 0, 0.6)}.mdc-drawer .mdc-drawer__subtitle{color:rgba(0, 0, 0, 0.6)}.mdc-drawer .mdc-deprecated-list-item__graphic{color:rgba(0, 0, 0, 0.6)}.mdc-drawer .mdc-deprecated-list-item{color:rgba(0, 0, 0, 0.87)}.mdc-drawer .mdc-deprecated-list-item--activated .mdc-deprecated-list-item__graphic{color:#6200ee}.mdc-drawer .mdc-deprecated-list-item--activated{color:rgba(98, 0, 238, 0.87)}[dir=rtl] .mdc-drawer,.mdc-drawer[dir=rtl]{border-top-left-radius:0;border-top-left-radius:var(--mdc-shape-large, 0);border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom-left-radius:var(--mdc-shape-large, 0)}.mdc-drawer .mdc-deprecated-list-item{border-radius:4px;border-radius:var(--mdc-shape-small, 4px)}.mdc-drawer.mdc-drawer--open:not(.mdc-drawer--closing)+.mdc-drawer-app-content{margin-left:256px;margin-right:0}[dir=rtl] .mdc-drawer.mdc-drawer--open:not(.mdc-drawer--closing)+.mdc-drawer-app-content,.mdc-drawer.mdc-drawer--open:not(.mdc-drawer--closing)+.mdc-drawer-app-content[dir=rtl]{margin-left:0;margin-right:256px}[dir=rtl] .mdc-drawer,.mdc-drawer[dir=rtl]{border-right-width:0;border-left-width:1px;border-right-style:none;border-left-style:solid}.mdc-drawer .mdc-deprecated-list-item{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-subtitle2-font-size, 0.875rem);line-height:1.375rem;line-height:var(--mdc-typography-subtitle2-line-height, 1.375rem);font-weight:500;font-weight:var(--mdc-typography-subtitle2-font-weight, 500);letter-spacing:0.0071428571em;letter-spacing:var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle2-text-transform, inherit);height:calc(48px - 2 * 4px);margin:8px 8px;padding:0 8px}.mdc-drawer .mdc-deprecated-list-item:nth-child(1){margin-top:2px}.mdc-drawer .mdc-deprecated-list-item:nth-last-child(1){margin-bottom:0}.mdc-drawer .mdc-deprecated-list-group__subheader{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);display:block;margin-top:0;line-height:normal;margin:0;padding:0 16px}.mdc-drawer .mdc-deprecated-list-group__subheader::before{display:inline-block;width:0;height:24px;content:"";vertical-align:0}.mdc-drawer .mdc-deprecated-list-divider{margin:3px 0 4px}.mdc-drawer .mdc-deprecated-list-item__text,.mdc-drawer .mdc-deprecated-list-item__graphic{pointer-events:none}.mdc-drawer--animate{-webkit-transform:translateX(-100%);transform:translateX(-100%)}[dir=rtl] .mdc-drawer--animate,.mdc-drawer--animate[dir=rtl]{-webkit-transform:translateX(100%);transform:translateX(100%)}.mdc-drawer--opening{-webkit-transform:translateX(0);transform:translateX(0);transition-duration:250ms}[dir=rtl] .mdc-drawer--opening,.mdc-drawer--opening[dir=rtl]{-webkit-transform:translateX(0);transform:translateX(0)}.mdc-drawer--closing{-webkit-transform:translateX(-100%);transform:translateX(-100%);transition-duration:200ms}[dir=rtl] .mdc-drawer--closing,.mdc-drawer--closing[dir=rtl]{-webkit-transform:translateX(100%);transform:translateX(100%)}.mdc-drawer__header{flex-shrink:0;box-sizing:border-box;min-height:64px;padding:0 16px 4px}.mdc-drawer__title{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1.25rem;font-size:var(--mdc-typography-headline6-font-size, 1.25rem);line-height:2rem;line-height:var(--mdc-typography-headline6-line-height, 2rem);font-weight:500;font-weight:var(--mdc-typography-headline6-font-weight, 500);letter-spacing:0.0125em;letter-spacing:var(--mdc-typography-headline6-letter-spacing, 0.0125em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-headline6-text-transform, inherit);display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-drawer__title::before{display:inline-block;width:0;height:36px;content:"";vertical-align:0}.mdc-drawer__title::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-drawer__subtitle{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);display:block;margin-top:0;line-height:normal;margin-bottom:0}.mdc-drawer__subtitle::before{display:inline-block;width:0;height:20px;content:"";vertical-align:0}.mdc-drawer__content{height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}.mdc-drawer--dismissible{left:0;right:initial;display:none;position:absolute}[dir=rtl] .mdc-drawer--dismissible,.mdc-drawer--dismissible[dir=rtl]{left:initial;right:0}.mdc-drawer--dismissible.mdc-drawer--open{display:flex}.mdc-drawer-app-content{margin-left:0;margin-right:0;position:relative}[dir=rtl] .mdc-drawer-app-content,.mdc-drawer-app-content[dir=rtl]{margin-left:0;margin-right:0}.mdc-drawer--modal{box-shadow:0px 8px 10px -5px rgba(0, 0, 0, 0.2),0px 16px 24px 2px rgba(0, 0, 0, 0.14),0px 6px 30px 5px rgba(0,0,0,.12);left:0;right:initial;display:none;position:fixed}.mdc-drawer--modal+.mdc-drawer-scrim{background-color:rgba(0, 0, 0, 0.32)}[dir=rtl] .mdc-drawer--modal,.mdc-drawer--modal[dir=rtl]{left:initial;right:0}.mdc-drawer--modal.mdc-drawer--open{display:flex}.mdc-drawer-scrim{display:none;position:fixed;top:0;left:0;width:100%;height:100%;z-index:5;transition-property:opacity;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1)}.mdc-drawer--open+.mdc-drawer-scrim{display:block}.mdc-drawer--animate+.mdc-drawer-scrim{opacity:0}.mdc-drawer--opening+.mdc-drawer-scrim{transition-duration:250ms;opacity:1}.mdc-drawer--closing+.mdc-drawer-scrim{transition-duration:200ms;opacity:0}.mdc-elevation--z0{box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0,0,0,.12)}.mdc-elevation--z1{box-shadow:0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14),0px 1px 3px 0px rgba(0,0,0,.12)}.mdc-elevation--z2{box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0,0,0,.12)}.mdc-elevation--z3{box-shadow:0px 3px 3px -2px rgba(0, 0, 0, 0.2),0px 3px 4px 0px rgba(0, 0, 0, 0.14),0px 1px 8px 0px rgba(0,0,0,.12)}.mdc-elevation--z4{box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0,0,0,.12)}.mdc-elevation--z5{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 5px 8px 0px rgba(0, 0, 0, 0.14),0px 1px 14px 0px rgba(0,0,0,.12)}.mdc-elevation--z6{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 6px 10px 0px rgba(0, 0, 0, 0.14),0px 1px 18px 0px rgba(0,0,0,.12)}.mdc-elevation--z7{box-shadow:0px 4px 5px -2px rgba(0, 0, 0, 0.2),0px 7px 10px 1px rgba(0, 0, 0, 0.14),0px 2px 16px 1px rgba(0,0,0,.12)}.mdc-elevation--z8{box-shadow:0px 5px 5px -3px rgba(0, 0, 0, 0.2),0px 8px 10px 1px rgba(0, 0, 0, 0.14),0px 3px 14px 2px rgba(0,0,0,.12)}.mdc-elevation--z9{box-shadow:0px 5px 6px -3px rgba(0, 0, 0, 0.2),0px 9px 12px 1px rgba(0, 0, 0, 0.14),0px 3px 16px 2px rgba(0,0,0,.12)}.mdc-elevation--z10{box-shadow:0px 6px 6px -3px rgba(0, 0, 0, 0.2),0px 10px 14px 1px rgba(0, 0, 0, 0.14),0px 4px 18px 3px rgba(0,0,0,.12)}.mdc-elevation--z11{box-shadow:0px 6px 7px -4px rgba(0, 0, 0, 0.2),0px 11px 15px 1px rgba(0, 0, 0, 0.14),0px 4px 20px 3px rgba(0,0,0,.12)}.mdc-elevation--z12{box-shadow:0px 7px 8px -4px rgba(0, 0, 0, 0.2),0px 12px 17px 2px rgba(0, 0, 0, 0.14),0px 5px 22px 4px rgba(0,0,0,.12)}.mdc-elevation--z13{box-shadow:0px 7px 8px -4px rgba(0, 0, 0, 0.2),0px 13px 19px 2px rgba(0, 0, 0, 0.14),0px 5px 24px 4px rgba(0,0,0,.12)}.mdc-elevation--z14{box-shadow:0px 7px 9px -4px rgba(0, 0, 0, 0.2),0px 14px 21px 2px rgba(0, 0, 0, 0.14),0px 5px 26px 4px rgba(0,0,0,.12)}.mdc-elevation--z15{box-shadow:0px 8px 9px -5px rgba(0, 0, 0, 0.2),0px 15px 22px 2px rgba(0, 0, 0, 0.14),0px 6px 28px 5px rgba(0,0,0,.12)}.mdc-elevation--z16{box-shadow:0px 8px 10px -5px rgba(0, 0, 0, 0.2),0px 16px 24px 2px rgba(0, 0, 0, 0.14),0px 6px 30px 5px rgba(0,0,0,.12)}.mdc-elevation--z17{box-shadow:0px 8px 11px -5px rgba(0, 0, 0, 0.2),0px 17px 26px 2px rgba(0, 0, 0, 0.14),0px 6px 32px 5px rgba(0,0,0,.12)}.mdc-elevation--z18{box-shadow:0px 9px 11px -5px rgba(0, 0, 0, 0.2),0px 18px 28px 2px rgba(0, 0, 0, 0.14),0px 7px 34px 6px rgba(0,0,0,.12)}.mdc-elevation--z19{box-shadow:0px 9px 12px -6px rgba(0, 0, 0, 0.2),0px 19px 29px 2px rgba(0, 0, 0, 0.14),0px 7px 36px 6px rgba(0,0,0,.12)}.mdc-elevation--z20{box-shadow:0px 10px 13px -6px rgba(0, 0, 0, 0.2),0px 20px 31px 3px rgba(0, 0, 0, 0.14),0px 8px 38px 7px rgba(0,0,0,.12)}.mdc-elevation--z21{box-shadow:0px 10px 13px -6px rgba(0, 0, 0, 0.2),0px 21px 33px 3px rgba(0, 0, 0, 0.14),0px 8px 40px 7px rgba(0,0,0,.12)}.mdc-elevation--z22{box-shadow:0px 10px 14px -6px rgba(0, 0, 0, 0.2),0px 22px 35px 3px rgba(0, 0, 0, 0.14),0px 8px 42px 7px rgba(0,0,0,.12)}.mdc-elevation--z23{box-shadow:0px 11px 14px -7px rgba(0, 0, 0, 0.2),0px 23px 36px 3px rgba(0, 0, 0, 0.14),0px 9px 44px 8px rgba(0,0,0,.12)}.mdc-elevation--z24{box-shadow:0px 11px 15px -7px rgba(0, 0, 0, 0.2),0px 24px 38px 3px rgba(0, 0, 0, 0.14),0px 9px 46px 8px rgba(0,0,0,.12)}.mdc-elevation-transition{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);will-change:box-shadow}.mdc-fab{position:relative;display:inline-flex;position:relative;align-items:center;justify-content:center;box-sizing:border-box;width:56px;height:56px;padding:0;border:none;fill:currentColor;text-decoration:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;overflow:visible;transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,-webkit-transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-fab .mdc-elevation-overlay{width:100%;height:100%;top:0;left:0}.mdc-fab::-moz-focus-inner{padding:0;border:0}.mdc-fab:hover{box-shadow:0px 5px 5px -3px rgba(0, 0, 0, 0.2),0px 8px 10px 1px rgba(0, 0, 0, 0.14),0px 3px 14px 2px rgba(0,0,0,.12)}.mdc-fab.mdc-ripple-upgraded--background-focused,.mdc-fab:not(.mdc-ripple-upgraded):focus{box-shadow:0px 5px 5px -3px rgba(0, 0, 0, 0.2),0px 8px 10px 1px rgba(0, 0, 0, 0.14),0px 3px 14px 2px rgba(0,0,0,.12)}.mdc-fab:active,.mdc-fab:focus:active{box-shadow:0px 7px 8px -4px rgba(0, 0, 0, 0.2),0px 12px 17px 2px rgba(0, 0, 0, 0.14),0px 5px 22px 4px rgba(0,0,0,.12)}.mdc-fab:active,.mdc-fab:focus{outline:none}.mdc-fab:hover{cursor:pointer}.mdc-fab>svg{width:100%}.mdc-fab--mini{width:40px;height:40px}.mdc-fab--extended{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-button-font-size, 0.875rem);line-height:2.25rem;line-height:var(--mdc-typography-button-line-height, 2.25rem);font-weight:500;font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:0.0892857143em;letter-spacing:var(--mdc-typography-button-letter-spacing, 0.0892857143em);text-decoration:none;-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:uppercase;text-transform:var(--mdc-typography-button-text-transform, uppercase);border-radius:24px;padding-left:20px;padding-right:20px;width:auto;max-width:100%;height:48px;line-height:normal}.mdc-fab--extended .mdc-fab__ripple{border-radius:24px}.mdc-fab--extended .mdc-fab__icon{margin-left:calc(12px - 20px);margin-right:12px}[dir=rtl] .mdc-fab--extended .mdc-fab__icon,.mdc-fab--extended .mdc-fab__icon[dir=rtl]{margin-left:12px;margin-right:calc(12px - 20px)}.mdc-fab--extended .mdc-fab__label+.mdc-fab__icon{margin-left:12px;margin-right:calc(12px - 20px)}[dir=rtl] .mdc-fab--extended .mdc-fab__label+.mdc-fab__icon,.mdc-fab--extended .mdc-fab__label+.mdc-fab__icon[dir=rtl]{margin-left:calc(12px - 20px);margin-right:12px}.mdc-fab--touch{margin-top:4px;margin-bottom:4px;margin-right:4px;margin-left:4px}.mdc-fab--touch .mdc-fab__touch{position:absolute;top:50%;height:48px;left:50%;width:48px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.mdc-fab::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid transparent;border-radius:inherit;content:"";pointer-events:none}.mdc-fab__label{justify-content:flex-start;text-overflow:ellipsis;white-space:nowrap;overflow-x:hidden;overflow-y:visible}.mdc-fab__icon{transition:-webkit-transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mdc-fab .mdc-fab__icon{display:inline-flex;align-items:center;justify-content:center}.mdc-fab--exited{-webkit-transform:scale(0);transform:scale(0);opacity:0;transition:opacity 15ms linear 150ms,-webkit-transform 180ms 0ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 15ms linear 150ms,transform 180ms 0ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 15ms linear 150ms,transform 180ms 0ms cubic-bezier(0.4, 0, 1, 1),-webkit-transform 180ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-fab--exited .mdc-fab__icon{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform 135ms 0ms cubic-bezier(0.4, 0, 1, 1);transition:transform 135ms 0ms cubic-bezier(0.4, 0, 1, 1);transition:transform 135ms 0ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 135ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-fab{background-color:#018786;background-color:var(--mdc-theme-secondary, #018786);box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 6px 10px 0px rgba(0, 0, 0, 0.14),0px 1px 18px 0px rgba(0,0,0,.12)}.mdc-fab .mdc-fab__icon{width:24px;height:24px;font-size:24px}.mdc-fab,.mdc-fab:not(:disabled) .mdc-fab__icon,.mdc-fab:not(:disabled) .mdc-fab__label,.mdc-fab:disabled .mdc-fab__icon,.mdc-fab:disabled .mdc-fab__label{color:#fff;color:var(--mdc-theme-on-secondary, #fff)}.mdc-fab:not(.mdc-fab--extended){border-radius:50%}.mdc-fab:not(.mdc-fab--extended) .mdc-fab__ripple{border-radius:50%}.mdc-fab{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-fab .mdc-fab__ripple::before,.mdc-fab .mdc-fab__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-fab .mdc-fab__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-fab .mdc-fab__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-fab.mdc-ripple-upgraded .mdc-fab__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-fab.mdc-ripple-upgraded .mdc-fab__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-fab.mdc-ripple-upgraded--unbounded .mdc-fab__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-fab.mdc-ripple-upgraded--foreground-activation .mdc-fab__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-fab.mdc-ripple-upgraded--foreground-deactivation .mdc-fab__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-fab .mdc-fab__ripple::before,.mdc-fab .mdc-fab__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-fab.mdc-ripple-upgraded .mdc-fab__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-fab .mdc-fab__ripple::before,.mdc-fab .mdc-fab__ripple::after{background-color:#fff;background-color:var(--mdc-ripple-color, var(--mdc-theme-on-secondary, #fff))}.mdc-fab:hover .mdc-fab__ripple::before,.mdc-fab.mdc-ripple-surface--hover .mdc-fab__ripple::before{opacity:0.08;opacity:var(--mdc-ripple-hover-opacity, 0.08)}.mdc-fab.mdc-ripple-upgraded--background-focused .mdc-fab__ripple::before,.mdc-fab:not(.mdc-ripple-upgraded):focus .mdc-fab__ripple::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}.mdc-fab:not(.mdc-ripple-upgraded) .mdc-fab__ripple::after{transition:opacity 150ms linear}.mdc-fab:not(.mdc-ripple-upgraded):active .mdc-fab__ripple::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-fab.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-fab .mdc-fab__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden}.mdc-fab{z-index:0}.mdc-fab .mdc-fab__ripple::before,.mdc-fab .mdc-fab__ripple::after{z-index:-1;z-index:var(--mdc-ripple-z-index, -1)}.mdc-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);color:rgba(0, 0, 0, 0.87);color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87));display:inline-flex;align-items:center;vertical-align:middle}.mdc-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mdc-form-field>label,.mdc-form-field>label[dir=rtl]{margin-left:auto;margin-right:0}[dir=rtl] .mdc-form-field>label,.mdc-form-field>label[dir=rtl]{padding-left:0;padding-right:4px}.mdc-form-field--nowrap>label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end>label,.mdc-form-field--align-end>label[dir=rtl]{margin-left:0;margin-right:auto}[dir=rtl] .mdc-form-field--align-end>label,.mdc-form-field--align-end>label[dir=rtl]{padding-left:4px;padding-right:0}.mdc-form-field--space-between{justify-content:space-between}.mdc-form-field--space-between>label{margin:0}[dir=rtl] .mdc-form-field--space-between>label,.mdc-form-field--space-between>label[dir=rtl]{margin:0}.mdc-icon-button{display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:transparent;fill:currentColor;color:inherit;font-size:24px;text-decoration:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:48px;height:48px;padding:12px}.mdc-icon-button svg,.mdc-icon-button img{width:24px;height:24px}.mdc-icon-button:disabled{color:rgba(0, 0, 0, 0.38);color:var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38))}.mdc-icon-button:disabled{cursor:default;pointer-events:none}.mdc-icon-button .mdc-icon-button__touch{position:absolute;top:50%;height:48px;left:50%;width:48px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.mdc-icon-button__icon{display:inline-block}.mdc-icon-button__icon.mdc-icon-button__icon--on{display:none}.mdc-icon-button--on .mdc-icon-button__icon{display:none}.mdc-icon-button--on .mdc-icon-button__icon.mdc-icon-button__icon--on{display:inline-block}.mdc-icon-button--touch{margin-top:0px;margin-bottom:0px}.mdc-icon-button{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-icon-button .mdc-icon-button__ripple::before,.mdc-icon-button .mdc-icon-button__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-icon-button .mdc-icon-button__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-icon-button .mdc-icon-button__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-icon-button.mdc-ripple-upgraded--unbounded .mdc-icon-button__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-icon-button.mdc-ripple-upgraded--foreground-activation .mdc-icon-button__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-icon-button.mdc-ripple-upgraded--foreground-deactivation .mdc-icon-button__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-icon-button .mdc-icon-button__ripple::before,.mdc-icon-button .mdc-icon-button__ripple::after{top:calc(50% - 50%);left:calc(50% - 50%);width:100%;height:100%}.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::before,.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::after{top:var(--mdc-ripple-top, calc(50% - 50%));left:var(--mdc-ripple-left, calc(50% - 50%));width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-icon-button.mdc-ripple-upgraded .mdc-icon-button__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-icon-button .mdc-icon-button__ripple::before,.mdc-icon-button .mdc-icon-button__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}.mdc-icon-button:hover .mdc-icon-button__ripple::before,.mdc-icon-button.mdc-ripple-surface--hover .mdc-icon-button__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-icon-button.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before,.mdc-icon-button:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-icon-button:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after{transition:opacity 150ms linear}.mdc-icon-button:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-icon-button.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-icon-button .mdc-icon-button__ripple{pointer-events:none;z-index:1}.mdc-image-list{display:flex;flex-wrap:wrap;margin:0 auto;padding:0}.mdc-image-list__item,.mdc-image-list__image-aspect-container{position:relative;box-sizing:border-box}.mdc-image-list__item{list-style-type:none}.mdc-image-list__image{width:100%}.mdc-image-list__image-aspect-container .mdc-image-list__image{position:absolute;top:0;right:0;bottom:0;left:0;height:100%;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-image-list__image-aspect-container{padding-bottom:calc(100% / 1)}.mdc-image-list__image{border-radius:0}.mdc-image-list--with-text-protection .mdc-image-list__supporting{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-image-list__supporting{color:rgba(0, 0, 0, 0.87);color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87));display:flex;align-items:center;justify-content:space-between;box-sizing:border-box;padding:8px 0;line-height:24px}.mdc-image-list__label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);line-height:1.75rem;line-height:var(--mdc-typography-subtitle1-line-height, 1.75rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mdc-image-list--with-text-protection .mdc-image-list__supporting{position:absolute;bottom:0;width:100%;height:48px;padding:0 16px;background:rgba(0,0,0,.6);color:#fff}.mdc-image-list--masonry{display:block}.mdc-image-list--masonry .mdc-image-list__item{-webkit-column-break-inside:avoid;break-inside:avoid-column}.mdc-image-list--masonry .mdc-image-list__image{display:block;height:auto}:root{--mdc-layout-grid-margin-desktop: 24px;--mdc-layout-grid-gutter-desktop: 24px;--mdc-layout-grid-column-width-desktop: 72px;--mdc-layout-grid-margin-tablet: 16px;--mdc-layout-grid-gutter-tablet: 16px;--mdc-layout-grid-column-width-tablet: 72px;--mdc-layout-grid-margin-phone: 16px;--mdc-layout-grid-gutter-phone: 16px;--mdc-layout-grid-column-width-phone: 72px}@media(min-width: 840px){.mdc-layout-grid{box-sizing:border-box;margin:0 auto;padding:24px;padding:var(--mdc-layout-grid-margin-desktop, 24px)}}@media(min-width: 600px)and (max-width: 839px){.mdc-layout-grid{box-sizing:border-box;margin:0 auto;padding:16px;padding:var(--mdc-layout-grid-margin-tablet, 16px)}}@media(max-width: 599px){.mdc-layout-grid{box-sizing:border-box;margin:0 auto;padding:16px;padding:var(--mdc-layout-grid-margin-phone, 16px)}}@media(min-width: 840px){.mdc-layout-grid__inner{display:flex;flex-flow:row wrap;align-items:stretch;margin:-12px;margin:calc(var(--mdc-layout-grid-gutter-desktop, 24px) / 2 * -1)}@supports(display: grid){.mdc-layout-grid__inner{display:grid;margin:0;grid-gap:24px;grid-gap:var(--mdc-layout-grid-gutter-desktop, 24px);grid-template-columns:repeat(12, minmax(0, 1fr))}}}@media(min-width: 600px)and (max-width: 839px){.mdc-layout-grid__inner{display:flex;flex-flow:row wrap;align-items:stretch;margin:-8px;margin:calc(var(--mdc-layout-grid-gutter-tablet, 16px) / 2 * -1)}@supports(display: grid){.mdc-layout-grid__inner{display:grid;margin:0;grid-gap:16px;grid-gap:var(--mdc-layout-grid-gutter-tablet, 16px);grid-template-columns:repeat(8, minmax(0, 1fr))}}}@media(max-width: 599px){.mdc-layout-grid__inner{display:flex;flex-flow:row wrap;align-items:stretch;margin:-8px;margin:calc(var(--mdc-layout-grid-gutter-phone, 16px) / 2 * -1)}@supports(display: grid){.mdc-layout-grid__inner{display:grid;margin:0;grid-gap:16px;grid-gap:var(--mdc-layout-grid-gutter-phone, 16px);grid-template-columns:repeat(4, minmax(0, 1fr))}}}@media(min-width: 840px){.mdc-layout-grid__cell{width:calc(33.3333333333% - 24px);width:calc(33.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px));box-sizing:border-box;margin:12px;margin:calc(var(--mdc-layout-grid-gutter-desktop, 24px) / 2)}@supports(display: grid){.mdc-layout-grid__cell{width:auto;grid-column-end:span 4}}@supports(display: grid){.mdc-layout-grid__cell{margin:0}}.mdc-layout-grid__cell--span-1,.mdc-layout-grid__cell--span-1-desktop{width:calc(8.3333333333% - 24px);width:calc(8.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-1,.mdc-layout-grid__cell--span-1-desktop{width:auto;grid-column-end:span 1}}.mdc-layout-grid__cell--span-2,.mdc-layout-grid__cell--span-2-desktop{width:calc(16.6666666667% - 24px);width:calc(16.6666666667% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-2,.mdc-layout-grid__cell--span-2-desktop{width:auto;grid-column-end:span 2}}.mdc-layout-grid__cell--span-3,.mdc-layout-grid__cell--span-3-desktop{width:calc(25% - 24px);width:calc(25% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-3,.mdc-layout-grid__cell--span-3-desktop{width:auto;grid-column-end:span 3}}.mdc-layout-grid__cell--span-4,.mdc-layout-grid__cell--span-4-desktop{width:calc(33.3333333333% - 24px);width:calc(33.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-4,.mdc-layout-grid__cell--span-4-desktop{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-5,.mdc-layout-grid__cell--span-5-desktop{width:calc(41.6666666667% - 24px);width:calc(41.6666666667% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-5,.mdc-layout-grid__cell--span-5-desktop{width:auto;grid-column-end:span 5}}.mdc-layout-grid__cell--span-6,.mdc-layout-grid__cell--span-6-desktop{width:calc(50% - 24px);width:calc(50% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-6,.mdc-layout-grid__cell--span-6-desktop{width:auto;grid-column-end:span 6}}.mdc-layout-grid__cell--span-7,.mdc-layout-grid__cell--span-7-desktop{width:calc(58.3333333333% - 24px);width:calc(58.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-7,.mdc-layout-grid__cell--span-7-desktop{width:auto;grid-column-end:span 7}}.mdc-layout-grid__cell--span-8,.mdc-layout-grid__cell--span-8-desktop{width:calc(66.6666666667% - 24px);width:calc(66.6666666667% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-8,.mdc-layout-grid__cell--span-8-desktop{width:auto;grid-column-end:span 8}}.mdc-layout-grid__cell--span-9,.mdc-layout-grid__cell--span-9-desktop{width:calc(75% - 24px);width:calc(75% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-9,.mdc-layout-grid__cell--span-9-desktop{width:auto;grid-column-end:span 9}}.mdc-layout-grid__cell--span-10,.mdc-layout-grid__cell--span-10-desktop{width:calc(83.3333333333% - 24px);width:calc(83.3333333333% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-10,.mdc-layout-grid__cell--span-10-desktop{width:auto;grid-column-end:span 10}}.mdc-layout-grid__cell--span-11,.mdc-layout-grid__cell--span-11-desktop{width:calc(91.6666666667% - 24px);width:calc(91.6666666667% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-11,.mdc-layout-grid__cell--span-11-desktop{width:auto;grid-column-end:span 11}}.mdc-layout-grid__cell--span-12,.mdc-layout-grid__cell--span-12-desktop{width:calc(100% - 24px);width:calc(100% - var(--mdc-layout-grid-gutter-desktop, 24px))}@supports(display: grid){.mdc-layout-grid__cell--span-12,.mdc-layout-grid__cell--span-12-desktop{width:auto;grid-column-end:span 12}}}@media(min-width: 600px)and (max-width: 839px){.mdc-layout-grid__cell{width:calc(50% - 16px);width:calc(50% - var(--mdc-layout-grid-gutter-tablet, 16px));box-sizing:border-box;margin:8px;margin:calc(var(--mdc-layout-grid-gutter-tablet, 16px) / 2)}@supports(display: grid){.mdc-layout-grid__cell{width:auto;grid-column-end:span 4}}@supports(display: grid){.mdc-layout-grid__cell{margin:0}}.mdc-layout-grid__cell--span-1,.mdc-layout-grid__cell--span-1-tablet{width:calc(12.5% - 16px);width:calc(12.5% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-1,.mdc-layout-grid__cell--span-1-tablet{width:auto;grid-column-end:span 1}}.mdc-layout-grid__cell--span-2,.mdc-layout-grid__cell--span-2-tablet{width:calc(25% - 16px);width:calc(25% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-2,.mdc-layout-grid__cell--span-2-tablet{width:auto;grid-column-end:span 2}}.mdc-layout-grid__cell--span-3,.mdc-layout-grid__cell--span-3-tablet{width:calc(37.5% - 16px);width:calc(37.5% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-3,.mdc-layout-grid__cell--span-3-tablet{width:auto;grid-column-end:span 3}}.mdc-layout-grid__cell--span-4,.mdc-layout-grid__cell--span-4-tablet{width:calc(50% - 16px);width:calc(50% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-4,.mdc-layout-grid__cell--span-4-tablet{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-5,.mdc-layout-grid__cell--span-5-tablet{width:calc(62.5% - 16px);width:calc(62.5% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-5,.mdc-layout-grid__cell--span-5-tablet{width:auto;grid-column-end:span 5}}.mdc-layout-grid__cell--span-6,.mdc-layout-grid__cell--span-6-tablet{width:calc(75% - 16px);width:calc(75% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-6,.mdc-layout-grid__cell--span-6-tablet{width:auto;grid-column-end:span 6}}.mdc-layout-grid__cell--span-7,.mdc-layout-grid__cell--span-7-tablet{width:calc(87.5% - 16px);width:calc(87.5% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-7,.mdc-layout-grid__cell--span-7-tablet{width:auto;grid-column-end:span 7}}.mdc-layout-grid__cell--span-8,.mdc-layout-grid__cell--span-8-tablet{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-8,.mdc-layout-grid__cell--span-8-tablet{width:auto;grid-column-end:span 8}}.mdc-layout-grid__cell--span-9,.mdc-layout-grid__cell--span-9-tablet{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-9,.mdc-layout-grid__cell--span-9-tablet{width:auto;grid-column-end:span 8}}.mdc-layout-grid__cell--span-10,.mdc-layout-grid__cell--span-10-tablet{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-10,.mdc-layout-grid__cell--span-10-tablet{width:auto;grid-column-end:span 8}}.mdc-layout-grid__cell--span-11,.mdc-layout-grid__cell--span-11-tablet{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-11,.mdc-layout-grid__cell--span-11-tablet{width:auto;grid-column-end:span 8}}.mdc-layout-grid__cell--span-12,.mdc-layout-grid__cell--span-12-tablet{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-12,.mdc-layout-grid__cell--span-12-tablet{width:auto;grid-column-end:span 8}}}@media(max-width: 599px){.mdc-layout-grid__cell{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px));box-sizing:border-box;margin:8px;margin:calc(var(--mdc-layout-grid-gutter-phone, 16px) / 2)}@supports(display: grid){.mdc-layout-grid__cell{width:auto;grid-column-end:span 4}}@supports(display: grid){.mdc-layout-grid__cell{margin:0}}.mdc-layout-grid__cell--span-1,.mdc-layout-grid__cell--span-1-phone{width:calc(25% - 16px);width:calc(25% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-1,.mdc-layout-grid__cell--span-1-phone{width:auto;grid-column-end:span 1}}.mdc-layout-grid__cell--span-2,.mdc-layout-grid__cell--span-2-phone{width:calc(50% - 16px);width:calc(50% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-2,.mdc-layout-grid__cell--span-2-phone{width:auto;grid-column-end:span 2}}.mdc-layout-grid__cell--span-3,.mdc-layout-grid__cell--span-3-phone{width:calc(75% - 16px);width:calc(75% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-3,.mdc-layout-grid__cell--span-3-phone{width:auto;grid-column-end:span 3}}.mdc-layout-grid__cell--span-4,.mdc-layout-grid__cell--span-4-phone{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-4,.mdc-layout-grid__cell--span-4-phone{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-5,.mdc-layout-grid__cell--span-5-phone{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-5,.mdc-layout-grid__cell--span-5-phone{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-6,.mdc-layout-grid__cell--span-6-phone{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-6,.mdc-layout-grid__cell--span-6-phone{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-7,.mdc-layout-grid__cell--span-7-phone{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-7,.mdc-layout-grid__cell--span-7-phone{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-8,.mdc-layout-grid__cell--span-8-phone{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-8,.mdc-layout-grid__cell--span-8-phone{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-9,.mdc-layout-grid__cell--span-9-phone{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-9,.mdc-layout-grid__cell--span-9-phone{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-10,.mdc-layout-grid__cell--span-10-phone{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-10,.mdc-layout-grid__cell--span-10-phone{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-11,.mdc-layout-grid__cell--span-11-phone{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-11,.mdc-layout-grid__cell--span-11-phone{width:auto;grid-column-end:span 4}}.mdc-layout-grid__cell--span-12,.mdc-layout-grid__cell--span-12-phone{width:calc(100% - 16px);width:calc(100% - var(--mdc-layout-grid-gutter-phone, 16px))}@supports(display: grid){.mdc-layout-grid__cell--span-12,.mdc-layout-grid__cell--span-12-phone{width:auto;grid-column-end:span 4}}}.mdc-layout-grid__cell--order-1{order:1}.mdc-layout-grid__cell--order-2{order:2}.mdc-layout-grid__cell--order-3{order:3}.mdc-layout-grid__cell--order-4{order:4}.mdc-layout-grid__cell--order-5{order:5}.mdc-layout-grid__cell--order-6{order:6}.mdc-layout-grid__cell--order-7{order:7}.mdc-layout-grid__cell--order-8{order:8}.mdc-layout-grid__cell--order-9{order:9}.mdc-layout-grid__cell--order-10{order:10}.mdc-layout-grid__cell--order-11{order:11}.mdc-layout-grid__cell--order-12{order:12}.mdc-layout-grid__cell--align-top{align-self:flex-start}@supports(display: grid){.mdc-layout-grid__cell--align-top{align-self:start}}.mdc-layout-grid__cell--align-middle{align-self:center}.mdc-layout-grid__cell--align-bottom{align-self:flex-end}@supports(display: grid){.mdc-layout-grid__cell--align-bottom{align-self:end}}@media(min-width: 840px){.mdc-layout-grid--fixed-column-width{width:1176px;width:calc( var(--mdc-layout-grid-column-width-desktop, 72px) * 12 + var(--mdc-layout-grid-gutter-desktop, 24px) * 11 + var(--mdc-layout-grid-margin-desktop, 24px) * 2 )}}@media(min-width: 600px)and (max-width: 839px){.mdc-layout-grid--fixed-column-width{width:720px;width:calc( var(--mdc-layout-grid-column-width-tablet, 72px) * 8 + var(--mdc-layout-grid-gutter-tablet, 16px) * 7 + var(--mdc-layout-grid-margin-tablet, 16px) * 2 )}}@media(max-width: 599px){.mdc-layout-grid--fixed-column-width{width:368px;width:calc( var(--mdc-layout-grid-column-width-phone, 72px) * 4 + var(--mdc-layout-grid-gutter-phone, 16px) * 3 + var(--mdc-layout-grid-margin-phone, 16px) * 2 )}}.mdc-layout-grid--align-left{margin-right:auto;margin-left:0}.mdc-layout-grid--align-right{margin-right:0;margin-left:auto}@-webkit-keyframes mdc-linear-progress-primary-indeterminate-translate{0%{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(0);transform:translateX(0)}59.15%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(83.67142%);transform:translateX(83.67142%);-webkit-transform:translateX(var(--mdc-linear-progress-primary-half, 83.67142%));transform:translateX(var(--mdc-linear-progress-primary-half, 83.67142%))}100%{-webkit-transform:translateX(200.611057%);transform:translateX(200.611057%);-webkit-transform:translateX(var(--mdc-linear-progress-primary-full, 200.611057%));transform:translateX(var(--mdc-linear-progress-primary-full, 200.611057%))}}@keyframes mdc-linear-progress-primary-indeterminate-translate{0%{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(0);transform:translateX(0)}59.15%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(83.67142%);transform:translateX(83.67142%);-webkit-transform:translateX(var(--mdc-linear-progress-primary-half, 83.67142%));transform:translateX(var(--mdc-linear-progress-primary-half, 83.67142%))}100%{-webkit-transform:translateX(200.611057%);transform:translateX(200.611057%);-webkit-transform:translateX(var(--mdc-linear-progress-primary-full, 200.611057%));transform:translateX(var(--mdc-linear-progress-primary-full, 200.611057%))}}@-webkit-keyframes mdc-linear-progress-primary-indeterminate-scale{0%{-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}36.65%{-webkit-animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}69.15%{-webkit-animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);-webkit-transform:scaleX(0.661479);transform:scaleX(0.661479)}100%{-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}}@keyframes mdc-linear-progress-primary-indeterminate-scale{0%{-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}36.65%{-webkit-animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}69.15%{-webkit-animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);-webkit-transform:scaleX(0.661479);transform:scaleX(0.661479)}100%{-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}}@-webkit-keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{-webkit-animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);-webkit-transform:translateX(0);transform:translateX(0)}25%{-webkit-animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);-webkit-transform:translateX(37.651913%);transform:translateX(37.651913%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-quarter, 37.651913%));transform:translateX(var(--mdc-linear-progress-secondary-quarter, 37.651913%))}48.35%{-webkit-animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);-webkit-transform:translateX(84.386165%);transform:translateX(84.386165%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-half, 84.386165%));transform:translateX(var(--mdc-linear-progress-secondary-half, 84.386165%))}100%{-webkit-transform:translateX(160.277782%);transform:translateX(160.277782%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-full, 160.277782%));transform:translateX(var(--mdc-linear-progress-secondary-full, 160.277782%))}}@keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{-webkit-animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);-webkit-transform:translateX(0);transform:translateX(0)}25%{-webkit-animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);-webkit-transform:translateX(37.651913%);transform:translateX(37.651913%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-quarter, 37.651913%));transform:translateX(var(--mdc-linear-progress-secondary-quarter, 37.651913%))}48.35%{-webkit-animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);-webkit-transform:translateX(84.386165%);transform:translateX(84.386165%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-half, 84.386165%));transform:translateX(var(--mdc-linear-progress-secondary-half, 84.386165%))}100%{-webkit-transform:translateX(160.277782%);transform:translateX(160.277782%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-full, 160.277782%));transform:translateX(var(--mdc-linear-progress-secondary-full, 160.277782%))}}@-webkit-keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{-webkit-animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}19.15%{-webkit-animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);-webkit-transform:scaleX(0.457104);transform:scaleX(0.457104)}44.15%{-webkit-animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);-webkit-transform:scaleX(0.72796);transform:scaleX(0.72796)}100%{-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}}@keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{-webkit-animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}19.15%{-webkit-animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);-webkit-transform:scaleX(0.457104);transform:scaleX(0.457104)}44.15%{-webkit-animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);-webkit-transform:scaleX(0.72796);transform:scaleX(0.72796)}100%{-webkit-transform:scaleX(0.08);transform:scaleX(0.08)}}@-webkit-keyframes mdc-linear-progress-buffering{from{-webkit-transform:rotate(180deg) translateX(-10px);transform:rotate(180deg) translateX(-10px)}}@keyframes mdc-linear-progress-buffering{from{-webkit-transform:rotate(180deg) translateX(-10px);transform:rotate(180deg) translateX(-10px)}}@-webkit-keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(0);transform:translateX(0)}59.15%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(-83.67142%);transform:translateX(-83.67142%);-webkit-transform:translateX(var(--mdc-linear-progress-primary-half-neg, -83.67142%));transform:translateX(var(--mdc-linear-progress-primary-half-neg, -83.67142%))}100%{-webkit-transform:translateX(-200.611057%);transform:translateX(-200.611057%);-webkit-transform:translateX(var(--mdc-linear-progress-primary-full-neg, -200.611057%));transform:translateX(var(--mdc-linear-progress-primary-full-neg, -200.611057%))}}@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(0);transform:translateX(0)}59.15%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(-83.67142%);transform:translateX(-83.67142%);-webkit-transform:translateX(var(--mdc-linear-progress-primary-half-neg, -83.67142%));transform:translateX(var(--mdc-linear-progress-primary-half-neg, -83.67142%))}100%{-webkit-transform:translateX(-200.611057%);transform:translateX(-200.611057%);-webkit-transform:translateX(var(--mdc-linear-progress-primary-full-neg, -200.611057%));transform:translateX(var(--mdc-linear-progress-primary-full-neg, -200.611057%))}}@-webkit-keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{-webkit-animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);-webkit-transform:translateX(0);transform:translateX(0)}25%{-webkit-animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);-webkit-transform:translateX(-37.651913%);transform:translateX(-37.651913%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-quarter-neg, -37.651913%));transform:translateX(var(--mdc-linear-progress-secondary-quarter-neg, -37.651913%))}48.35%{-webkit-animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);-webkit-transform:translateX(-84.386165%);transform:translateX(-84.386165%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-half-neg, -84.386165%));transform:translateX(var(--mdc-linear-progress-secondary-half-neg, -84.386165%))}100%{-webkit-transform:translateX(-160.277782%);transform:translateX(-160.277782%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-full-neg, -160.277782%));transform:translateX(var(--mdc-linear-progress-secondary-full-neg, -160.277782%))}}@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{-webkit-animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);-webkit-transform:translateX(0);transform:translateX(0)}25%{-webkit-animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);-webkit-transform:translateX(-37.651913%);transform:translateX(-37.651913%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-quarter-neg, -37.651913%));transform:translateX(var(--mdc-linear-progress-secondary-quarter-neg, -37.651913%))}48.35%{-webkit-animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);-webkit-transform:translateX(-84.386165%);transform:translateX(-84.386165%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-half-neg, -84.386165%));transform:translateX(var(--mdc-linear-progress-secondary-half-neg, -84.386165%))}100%{-webkit-transform:translateX(-160.277782%);transform:translateX(-160.277782%);-webkit-transform:translateX(var(--mdc-linear-progress-secondary-full-neg, -160.277782%));transform:translateX(var(--mdc-linear-progress-secondary-full-neg, -160.277782%))}}@-webkit-keyframes mdc-linear-progress-buffering-reverse{from{-webkit-transform:translateX(-10px);transform:translateX(-10px)}}@keyframes mdc-linear-progress-buffering-reverse{from{-webkit-transform:translateX(-10px);transform:translateX(-10px)}}.mdc-linear-progress{position:relative;width:100%;height:4px;-webkit-transform:translateZ(0);transform:translateZ(0);outline:1px solid transparent;overflow:hidden;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-linear-progress__bar{position:absolute;width:100%;height:100%;-webkit-animation:none;animation:none;-webkit-transform-origin:top left;transform-origin:top left;transition:-webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-linear-progress__bar-inner{display:inline-block;position:absolute;width:100%;-webkit-animation:none;animation:none;border-top:4px solid}.mdc-linear-progress__buffer{display:flex;position:absolute;width:100%;height:100%}.mdc-linear-progress__buffer-dots{background-repeat:repeat-x;background-size:10px 4px;flex:auto;-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-animation:mdc-linear-progress-buffering 250ms infinite linear;animation:mdc-linear-progress-buffering 250ms infinite linear}.mdc-linear-progress__buffer-bar{flex:0 1 100%;transition:flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-linear-progress__primary-bar{-webkit-transform:scaleX(0);transform:scaleX(0)}.mdc-linear-progress__secondary-bar{display:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__bar{transition:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{left:-145.166611%}.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{left:-54.888891%;display:block}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{-webkit-animation:mdc-linear-progress-primary-indeterminate-translate 2s infinite linear;animation:mdc-linear-progress-primary-indeterminate-translate 2s infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar>.mdc-linear-progress__bar-inner{-webkit-animation:mdc-linear-progress-primary-indeterminate-scale 2s infinite linear;animation:mdc-linear-progress-primary-indeterminate-scale 2s infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{-webkit-animation:mdc-linear-progress-secondary-indeterminate-translate 2s infinite linear;animation:mdc-linear-progress-secondary-indeterminate-translate 2s infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar>.mdc-linear-progress__bar-inner{-webkit-animation:mdc-linear-progress-secondary-indeterminate-scale 2s infinite linear;animation:mdc-linear-progress-secondary-indeterminate-scale 2s infinite linear}[dir=rtl] .mdc-linear-progress:not([dir=ltr]) .mdc-linear-progress__bar,.mdc-linear-progress[dir=rtl]:not([dir=ltr]) .mdc-linear-progress__bar{right:0;-webkit-transform-origin:center right;transform-origin:center right}[dir=rtl] .mdc-linear-progress:not([dir=ltr]).mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar,.mdc-linear-progress[dir=rtl]:not([dir=ltr]).mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{-webkit-animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse;animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress:not([dir=ltr]).mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar,.mdc-linear-progress[dir=rtl]:not([dir=ltr]).mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{-webkit-animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse;animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress:not([dir=ltr]) .mdc-linear-progress__buffer-dots,.mdc-linear-progress[dir=rtl]:not([dir=ltr]) .mdc-linear-progress__buffer-dots{-webkit-animation:mdc-linear-progress-buffering-reverse 250ms infinite linear;animation:mdc-linear-progress-buffering-reverse 250ms infinite linear;-webkit-transform:rotate(0);transform:rotate(0)}[dir=rtl] .mdc-linear-progress:not([dir=ltr]).mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar,.mdc-linear-progress[dir=rtl]:not([dir=ltr]).mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{right:-145.166611%;left:auto}[dir=rtl] .mdc-linear-progress:not([dir=ltr]).mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar,.mdc-linear-progress[dir=rtl]:not([dir=ltr]).mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{right:-54.888891%;left:auto}.mdc-linear-progress--closed{opacity:0}.mdc-linear-progress--closed-animation-off .mdc-linear-progress__buffer-dots{-webkit-animation:none;animation:none}.mdc-linear-progress--closed-animation-off.mdc-linear-progress--indeterminate .mdc-linear-progress__bar,.mdc-linear-progress--closed-animation-off.mdc-linear-progress--indeterminate .mdc-linear-progress__bar .mdc-linear-progress__bar-inner{-webkit-animation:none;animation:none}.mdc-linear-progress__bar-inner{border-color:#6200ee;border-color:var(--mdc-theme-primary, #6200ee)}.mdc-linear-progress__buffer-dots{background-image:url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' enable-background='new 0 0 5 2' xml:space='preserve' viewBox='0 0 5 2' preserveAspectRatio='none slice'%3E%3Ccircle cx='1' cy='1' r='1' fill='%23e6e6e6'/%3E%3C/svg%3E")}.mdc-linear-progress__buffer-bar{background-color:#e6e6e6}.mdc-deprecated-list{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);line-height:1.75rem;line-height:var(--mdc-typography-subtitle1-line-height, 1.75rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);line-height:1.5rem;margin:0;padding:8px 0;list-style-type:none;color:rgba(0, 0, 0, 0.87);color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87))}.mdc-deprecated-list:focus{outline:none}.mdc-deprecated-list-item{height:48px}.mdc-deprecated-list-item__secondary-text{color:rgba(0, 0, 0, 0.54);color:var(--mdc-theme-text-secondary-on-background, rgba(0, 0, 0, 0.54))}.mdc-deprecated-list-item__graphic{background-color:transparent}.mdc-deprecated-list-item__graphic{color:rgba(0, 0, 0, 0.38);color:var(--mdc-theme-text-icon-on-background, rgba(0, 0, 0, 0.38))}.mdc-deprecated-list-item__meta{color:rgba(0, 0, 0, 0.38);color:var(--mdc-theme-text-hint-on-background, rgba(0, 0, 0, 0.38))}.mdc-deprecated-list-group__subheader{color:rgba(0, 0, 0, 0.87);color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87))}.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__text{opacity:.38}.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__text,.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__primary-text,.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__secondary-text{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-deprecated-list-item--selected,.mdc-deprecated-list-item--activated{color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-deprecated-list-item--selected .mdc-deprecated-list-item__graphic,.mdc-deprecated-list-item--activated .mdc-deprecated-list-item__graphic{color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-deprecated-list--dense{padding-top:4px;padding-bottom:4px;font-size:.812rem}.mdc-deprecated-list-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;padding-left:16px;padding-right:16px;height:48px}.mdc-deprecated-list-item:focus{outline:none}.mdc-deprecated-list-item:not(.mdc-deprecated-list-item--selected):focus::before,.mdc-deprecated-list-item.mdc-ripple-upgraded--background-focused::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid transparent;border-radius:inherit;content:"";pointer-events:none}.mdc-deprecated-list-item.mdc-deprecated-list-item--selected::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:3px double transparent;border-radius:inherit;content:"";pointer-events:none}[dir=rtl] .mdc-deprecated-list-item,.mdc-deprecated-list-item[dir=rtl]{padding-left:16px;padding-right:16px}.mdc-deprecated-list--icon-list .mdc-deprecated-list-item{padding-left:16px;padding-right:16px;height:56px}[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-item,.mdc-deprecated-list--icon-list .mdc-deprecated-list-item[dir=rtl]{padding-left:16px;padding-right:16px}.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item{padding-left:16px;padding-right:16px;height:56px}[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-item,.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item[dir=rtl]{padding-left:16px;padding-right:16px}.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item{padding-left:16px;padding-right:16px;height:56px}[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item,.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item[dir=rtl]{padding-left:16px;padding-right:16px}.mdc-deprecated-list--image-list .mdc-deprecated-list-item{padding-left:16px;padding-right:16px;height:72px}[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-item,.mdc-deprecated-list--image-list .mdc-deprecated-list-item[dir=rtl]{padding-left:16px;padding-right:16px}.mdc-deprecated-list--video-list .mdc-deprecated-list-item{padding-left:0px;padding-right:16px;height:72px}[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-item,.mdc-deprecated-list--video-list .mdc-deprecated-list-item[dir=rtl]{padding-left:16px;padding-right:0px}.mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic{margin-left:0;margin-right:16px;width:20px;height:20px}[dir=rtl] .mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic,.mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic[dir=rtl]{margin-left:16px;margin-right:0}.mdc-deprecated-list-item__graphic{flex-shrink:0;align-items:center;justify-content:center;fill:currentColor;-o-object-fit:cover;object-fit:cover;margin-left:0;margin-right:32px;width:24px;height:24px}[dir=rtl] .mdc-deprecated-list-item__graphic,.mdc-deprecated-list-item__graphic[dir=rtl]{margin-left:32px;margin-right:0}.mdc-deprecated-list--icon-list .mdc-deprecated-list-item__graphic{margin-left:0;margin-right:32px;width:24px;height:24px}[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-item__graphic,.mdc-deprecated-list--icon-list .mdc-deprecated-list-item__graphic[dir=rtl]{margin-left:32px;margin-right:0}.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__graphic{margin-left:0;margin-right:16px;width:40px;height:40px;border-radius:50%}[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__graphic,.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__graphic[dir=rtl]{margin-left:16px;margin-right:0}.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__graphic{margin-left:0;margin-right:16px;width:40px;height:40px}[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__graphic,.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__graphic[dir=rtl]{margin-left:16px;margin-right:0}.mdc-deprecated-list--image-list .mdc-deprecated-list-item__graphic{margin-left:0;margin-right:16px;width:56px;height:56px}[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-item__graphic,.mdc-deprecated-list--image-list .mdc-deprecated-list-item__graphic[dir=rtl]{margin-left:16px;margin-right:0}.mdc-deprecated-list--video-list .mdc-deprecated-list-item__graphic{margin-left:0;margin-right:16px;width:100px;height:56px}[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-item__graphic,.mdc-deprecated-list--video-list .mdc-deprecated-list-item__graphic[dir=rtl]{margin-left:16px;margin-right:0}.mdc-deprecated-list .mdc-deprecated-list-item__graphic{display:inline-flex}.mdc-deprecated-list-item__meta{margin-left:auto;margin-right:0}.mdc-deprecated-list-item__meta:not(.material-icons){-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.75rem;font-size:var(--mdc-typography-caption-font-size, 0.75rem);line-height:1.25rem;line-height:var(--mdc-typography-caption-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:0.0333333333em;letter-spacing:var(--mdc-typography-caption-letter-spacing, 0.0333333333em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-caption-text-transform, inherit)}.mdc-deprecated-list-item[dir=rtl] .mdc-deprecated-list-item__meta,[dir=rtl] .mdc-deprecated-list-item .mdc-deprecated-list-item__meta{margin-left:0;margin-right:auto}.mdc-deprecated-list-item__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mdc-deprecated-list-item__text[for]{pointer-events:none}.mdc-deprecated-list-item__primary-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-deprecated-list-item__primary-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-deprecated-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-deprecated-list--video-list .mdc-deprecated-list-item__primary-text,.mdc-deprecated-list--image-list .mdc-deprecated-list-item__primary-text,.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__primary-text,.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__primary-text,.mdc-deprecated-list--icon-list .mdc-deprecated-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-deprecated-list--video-list .mdc-deprecated-list-item__primary-text::before,.mdc-deprecated-list--image-list .mdc-deprecated-list-item__primary-text::before,.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__primary-text::before,.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__primary-text::before,.mdc-deprecated-list--icon-list .mdc-deprecated-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-deprecated-list--video-list .mdc-deprecated-list-item__primary-text::after,.mdc-deprecated-list--image-list .mdc-deprecated-list-item__primary-text::after,.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item__primary-text::after,.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item__primary-text::after,.mdc-deprecated-list--icon-list .mdc-deprecated-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-deprecated-list--dense .mdc-deprecated-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-deprecated-list--dense .mdc-deprecated-list-item__primary-text::before{display:inline-block;width:0;height:24px;content:"";vertical-align:0}.mdc-deprecated-list--dense .mdc-deprecated-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-deprecated-list-item__secondary-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;margin-top:0;line-height:normal}.mdc-deprecated-list-item__secondary-text::before{display:inline-block;width:0;height:20px;content:"";vertical-align:0}.mdc-deprecated-list--dense .mdc-deprecated-list-item__secondary-text{font-size:inherit}.mdc-deprecated-list--dense .mdc-deprecated-list-item{height:40px}.mdc-deprecated-list--two-line .mdc-deprecated-list-item__text{align-self:flex-start}.mdc-deprecated-list--two-line .mdc-deprecated-list-item{height:64px}.mdc-deprecated-list--two-line.mdc-deprecated-list--video-list .mdc-deprecated-list-item,.mdc-deprecated-list--two-line.mdc-deprecated-list--image-list .mdc-deprecated-list-item,.mdc-deprecated-list--two-line.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-item,.mdc-deprecated-list--two-line.mdc-deprecated-list--avatar-list .mdc-deprecated-list-item,.mdc-deprecated-list--two-line.mdc-deprecated-list--icon-list .mdc-deprecated-list-item{height:72px}.mdc-deprecated-list--two-line.mdc-deprecated-list--icon-list .mdc-deprecated-list-item__graphic{align-self:flex-start;margin-top:16px}.mdc-deprecated-list--two-line.mdc-deprecated-list--dense .mdc-deprecated-list-item,.mdc-deprecated-list--avatar-list.mdc-deprecated-list--dense .mdc-deprecated-list-item{height:60px}.mdc-deprecated-list--avatar-list.mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic{margin-left:0;margin-right:16px;width:36px;height:36px}[dir=rtl] .mdc-deprecated-list--avatar-list.mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic,.mdc-deprecated-list--avatar-list.mdc-deprecated-list--dense .mdc-deprecated-list-item__graphic[dir=rtl]{margin-left:16px;margin-right:0}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item{cursor:pointer}a.mdc-deprecated-list-item{color:inherit;text-decoration:none}.mdc-deprecated-list-divider{height:0;margin:0;border:none;border-bottom-width:1px;border-bottom-style:solid}.mdc-deprecated-list-divider{border-bottom-color:rgba(0, 0, 0, 0.12)}.mdc-deprecated-list-divider--padded{margin-left:16px;margin-right:0;width:calc(100% - 32px)}[dir=rtl] .mdc-deprecated-list-divider--padded,.mdc-deprecated-list-divider--padded[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list-divider--inset{margin-left:72px;margin-right:0;width:calc(100% - 72px)}[dir=rtl] .mdc-deprecated-list-divider--inset,.mdc-deprecated-list-divider--inset[dir=rtl]{margin-left:0;margin-right:72px}.mdc-deprecated-list-divider--inset.mdc-deprecated-list-divider--padded{margin-left:72px;margin-right:0;width:calc(100% - 88px)}[dir=rtl] .mdc-deprecated-list-divider--inset.mdc-deprecated-list-divider--padded,.mdc-deprecated-list-divider--inset.mdc-deprecated-list-divider--padded[dir=rtl]{margin-left:0;margin-right:72px}.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading{margin-left:16px;margin-right:0;width:calc(100% - 16px)}[dir=rtl] .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading,.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list .mdc-deprecated-list-divider--inset-trailing{width:calc(100% - 16px)}.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing{margin-left:16px;margin-right:0;width:calc(100% - 32px)}[dir=rtl] .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing,.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding{margin-left:16px;margin-right:0;width:calc(100% - 16px)}[dir=rtl] .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding,.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding{margin-left:16px;margin-right:0;width:calc(100% - 32px)}[dir=rtl] .mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding,.mdc-deprecated-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading{margin-left:72px;margin-right:0;width:calc(100% - 72px)}[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading,.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading[dir=rtl]{margin-left:0;margin-right:72px}.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-trailing{width:calc(100% - 16px)}.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing{margin-left:72px;margin-right:0;width:calc(100% - 88px)}[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing,.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl]{margin-left:0;margin-right:72px}.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding{margin-left:16px;margin-right:0;width:calc(100% - 16px)}[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding,.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding{margin-left:16px;margin-right:0;width:calc(100% - 32px)}[dir=rtl] .mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding,.mdc-deprecated-list--icon-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading{margin-left:72px;margin-right:0;width:calc(100% - 72px)}[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading,.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading[dir=rtl]{margin-left:0;margin-right:72px}.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-trailing{width:calc(100% - 16px)}.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing{margin-left:72px;margin-right:0;width:calc(100% - 88px)}[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing,.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl]{margin-left:0;margin-right:72px}.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding{margin-left:16px;margin-right:0;width:calc(100% - 16px)}[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding,.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding{margin-left:16px;margin-right:0;width:calc(100% - 32px)}[dir=rtl] .mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding,.mdc-deprecated-list--avatar-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading{margin-left:72px;margin-right:0;width:calc(100% - 72px)}[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading,.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading[dir=rtl]{margin-left:0;margin-right:72px}.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-trailing{width:calc(100% - 16px)}.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing{margin-left:72px;margin-right:0;width:calc(100% - 88px)}[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing,.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl]{margin-left:0;margin-right:72px}.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding{margin-left:16px;margin-right:0;width:calc(100% - 16px)}[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding,.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding{margin-left:16px;margin-right:0;width:calc(100% - 32px)}[dir=rtl] .mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding,.mdc-deprecated-list--thumbnail-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading{margin-left:88px;margin-right:0;width:calc(100% - 88px)}[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading,.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading[dir=rtl]{margin-left:0;margin-right:88px}.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-trailing{width:calc(100% - 16px)}.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing{margin-left:88px;margin-right:0;width:calc(100% - 104px)}[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing,.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl]{margin-left:0;margin-right:88px}.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding{margin-left:16px;margin-right:0;width:calc(100% - 16px)}[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding,.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding{margin-left:16px;margin-right:0;width:calc(100% - 32px)}[dir=rtl] .mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding,.mdc-deprecated-list--image-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl]{margin-left:0;margin-right:16px}.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading{margin-left:116px;margin-right:0;width:calc(100% - 116px)}[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading,.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading[dir=rtl]{margin-left:0;margin-right:116px}.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-trailing{width:calc(100% - 16px)}.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing{margin-left:116px;margin-right:0;width:calc(100% - 132px)}[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing,.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing[dir=rtl]{margin-left:0;margin-right:116px}.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding{margin-left:0px;margin-right:0;width:calc(100% - 0px)}[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding,.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--padding[dir=rtl]{margin-left:0;margin-right:0px}.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding{margin-left:0px;margin-right:0;width:calc(100% - 16px)}[dir=rtl] .mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding,.mdc-deprecated-list--video-list .mdc-deprecated-list-divider--inset-leading.mdc-deprecated-list-divider--inset-trailing.mdc-deprecated-list-divider--inset-padding[dir=rtl]{margin-left:0;margin-right:0px}.mdc-deprecated-list-group .mdc-deprecated-list{padding:0}.mdc-deprecated-list-group__subheader{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);line-height:1.75rem;line-height:var(--mdc-typography-subtitle1-line-height, 1.75rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);margin:calc( (3rem - 1.5rem) / 2 ) 16px}.mdc-list-item__primary-text{color:rgba(0, 0, 0, 0.87);color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87))}.mdc-list-item__secondary-text{color:rgba(0, 0, 0, 0.54);color:var(--mdc-theme-text-secondary-on-background, rgba(0, 0, 0, 0.54))}.mdc-list-item__overline-text{color:rgba(0, 0, 0, 0.38);color:var(--mdc-theme-text-hint-on-background, rgba(0, 0, 0, 0.38))}.mdc-list-item--with-leading-icon .mdc-list-item__start,.mdc-list-item--with-trailing-icon .mdc-list-item__end{background-color:transparent}.mdc-list-item--with-leading-icon .mdc-list-item__start,.mdc-list-item--with-trailing-icon .mdc-list-item__end{color:rgba(0, 0, 0, 0.38);color:var(--mdc-theme-text-icon-on-background, rgba(0, 0, 0, 0.38))}.mdc-list-item__end{color:rgba(0, 0, 0, 0.38);color:var(--mdc-theme-text-hint-on-background, rgba(0, 0, 0, 0.38))}.mdc-list-item--disabled .mdc-list-item__start,.mdc-list-item--disabled .mdc-list-item__content,.mdc-list-item--disabled .mdc-list-item__end{opacity:.38}.mdc-list-item--disabled .mdc-list-item__primary-text{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-list-item--disabled .mdc-list-item__secondary-text{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-list-item--disabled .mdc-list-item__overline-text{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-list-item--disabled.mdc-list-item--with-leading-icon .mdc-list-item__start{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-list-item--disabled.mdc-list-item--with-trailing-icon .mdc-list-item__end{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-list-item--disabled.mdc-list-item--with-trailing-meta .mdc-list-item__end{color:#000;color:var(--mdc-theme-on-surface, #000)}.mdc-list-item--selected .mdc-list-item__primary-text,.mdc-list-item--activated .mdc-list-item__primary-text{color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-list-item--selected.mdc-list-item--with-leading-icon .mdc-list-item__start,.mdc-list-item--activated.mdc-list-item--with-leading-icon .mdc-list-item__start{color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-deprecated-list-group__subheader{color:rgba(0, 0, 0, 0.87);color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87))}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-list-divider::after{content:"";display:block;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:white}}.mdc-list{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);line-height:1.75rem;line-height:var(--mdc-typography-subtitle1-line-height, 1.75rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);line-height:1.5rem;margin:0;padding:8px 0;list-style-type:none}.mdc-list:focus{outline:none}.mdc-list-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;align-items:stretch;cursor:pointer}.mdc-list-item:focus{outline:none}.mdc-list-item.mdc-list-item--with-one-line{height:48px}.mdc-list-item.mdc-list-item--with-two-lines{height:64px}.mdc-list-item.mdc-list-item--with-three-lines{height:88px}.mdc-list-item.mdc-list-item--with-one-line .mdc-list-item__start{align-self:center;margin-top:0}.mdc-list-item.mdc-list-item--with-two-lines .mdc-list-item__start{align-self:flex-start;margin-top:16px}.mdc-list-item.mdc-list-item--with-three-lines .mdc-list-item__start{align-self:flex-start;margin-top:16px}.mdc-list-item.mdc-list-item--with-one-line .mdc-list-item__end{align-self:center;margin-top:0}.mdc-list-item.mdc-list-item--with-two-lines .mdc-list-item__end{align-self:center;margin-top:0}.mdc-list-item.mdc-list-item--with-three-lines .mdc-list-item__end{align-self:flex-start;margin-top:16px}.mdc-list-item.mdc-list-item--disabled,.mdc-list-item.mdc-list-item--non-interactive{cursor:auto}.mdc-list-item:not(.mdc-list-item--selected):focus::before,.mdc-list-item.mdc-ripple-upgraded--background-focused::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid transparent;border-radius:inherit;content:"";pointer-events:none}.mdc-list-item.mdc-list-item--selected::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:3px double transparent;border-radius:inherit;content:"";pointer-events:none}.mdc-list-item.mdc-list-item--selected:focus::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:3px solid transparent;border-radius:inherit;content:"";pointer-events:none}a.mdc-list-item{color:inherit;text-decoration:none}.mdc-list-item__start{fill:currentColor;flex-shrink:0;pointer-events:none}.mdc-list-item__end{flex-shrink:0;pointer-events:none}.mdc-list-item__content{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;align-self:center;flex:1;pointer-events:none}.mdc-list-item--with-two-lines .mdc-list-item__content,.mdc-list-item--with-three-lines .mdc-list-item__content{align-self:stretch}.mdc-list-item__content[for]{pointer-events:none}.mdc-list-item__primary-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);line-height:1.75rem;line-height:var(--mdc-typography-subtitle1-line-height, 1.75rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mdc-list-item--with-two-lines .mdc-list-item__primary-text,.mdc-list-item--with-three-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before,.mdc-list-item--with-three-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after,.mdc-list-item--with-three-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item__secondary-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;margin-top:0;line-height:normal}.mdc-list-item__secondary-text::before{display:inline-block;width:0;height:20px;content:"";vertical-align:0}.mdc-list-item--with-three-lines .mdc-list-item__secondary-text{white-space:normal;line-height:20px}.mdc-list-item--with-overline .mdc-list-item__secondary-text{white-space:nowrap;line-height:auto}.mdc-list-item__overline-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-overline-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.75rem;font-size:var(--mdc-typography-overline-font-size, 0.75rem);line-height:2rem;line-height:var(--mdc-typography-overline-line-height, 2rem);font-weight:500;font-weight:var(--mdc-typography-overline-font-weight, 500);letter-spacing:0.1666666667em;letter-spacing:var(--mdc-typography-overline-letter-spacing, 0.1666666667em);text-decoration:none;-webkit-text-decoration:var(--mdc-typography-overline-text-decoration, none);text-decoration:var(--mdc-typography-overline-text-decoration, none);text-transform:uppercase;text-transform:var(--mdc-typography-overline-text-transform, uppercase);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mdc-list-item--with-two-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:24px;content:"";vertical-align:0}.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-three-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-three-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-three-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-avatar.mdc-list-item{padding-left:0;padding-right:auto}[dir=rtl] .mdc-list-item--with-leading-avatar.mdc-list-item,.mdc-list-item--with-leading-avatar.mdc-list-item[dir=rtl]{padding-left:auto;padding-right:0}.mdc-list-item--with-leading-avatar .mdc-list-item__start{margin-left:16px;margin-right:16px}[dir=rtl] .mdc-list-item--with-leading-avatar .mdc-list-item__start,.mdc-list-item--with-leading-avatar .mdc-list-item__start[dir=rtl]{margin-left:16px;margin-right:16px}.mdc-list-item--with-leading-avatar .mdc-list-item__start{width:40px;height:40px}.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-avatar.mdc-list-item--with-one-line{height:56px}.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines{height:72px}.mdc-list-item--with-leading-avatar .mdc-list-item__start{border-radius:50%}.mdc-list-item--with-leading-icon .mdc-list-item__start{width:24px;height:24px}.mdc-list-item--with-leading-icon.mdc-list-item{padding-left:0;padding-right:auto}[dir=rtl] .mdc-list-item--with-leading-icon.mdc-list-item,.mdc-list-item--with-leading-icon.mdc-list-item[dir=rtl]{padding-left:auto;padding-right:0}.mdc-list-item--with-leading-icon .mdc-list-item__start{margin-left:16px;margin-right:32px}[dir=rtl] .mdc-list-item--with-leading-icon .mdc-list-item__start,.mdc-list-item--with-leading-icon .mdc-list-item__start[dir=rtl]{margin-left:32px;margin-right:16px}.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-icon.mdc-list-item--with-one-line{height:56px}.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines{height:72px}.mdc-list-item--with-leading-thumbnail.mdc-list-item{padding-left:0;padding-right:auto}[dir=rtl] .mdc-list-item--with-leading-thumbnail.mdc-list-item,.mdc-list-item--with-leading-thumbnail.mdc-list-item[dir=rtl]{padding-left:auto;padding-right:0}.mdc-list-item--with-leading-thumbnail .mdc-list-item__start{margin-left:16px;margin-right:16px}[dir=rtl] .mdc-list-item--with-leading-thumbnail .mdc-list-item__start,.mdc-list-item--with-leading-thumbnail .mdc-list-item__start[dir=rtl]{margin-left:16px;margin-right:16px}.mdc-list-item--with-leading-thumbnail .mdc-list-item__start{width:40px;height:40px}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-one-line{height:56px}.mdc-list-item--with-leading-thumbnail.mdc-list-item--with-two-lines{height:72px}.mdc-list-item--with-leading-image.mdc-list-item{padding-left:0;padding-right:auto}[dir=rtl] .mdc-list-item--with-leading-image.mdc-list-item,.mdc-list-item--with-leading-image.mdc-list-item[dir=rtl]{padding-left:auto;padding-right:0}.mdc-list-item--with-leading-image .mdc-list-item__start{margin-left:16px;margin-right:16px}[dir=rtl] .mdc-list-item--with-leading-image .mdc-list-item__start,.mdc-list-item--with-leading-image .mdc-list-item__start[dir=rtl]{margin-left:16px;margin-right:16px}.mdc-list-item--with-leading-image .mdc-list-item__start{width:56px;height:56px}.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-image.mdc-list-item--with-one-line{height:72px}.mdc-list-item--with-leading-image.mdc-list-item--with-two-lines{height:72px}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__start{align-self:flex-start;margin-top:8px}.mdc-list-item--with-leading-video.mdc-list-item{padding-left:0;padding-right:auto}[dir=rtl] .mdc-list-item--with-leading-video.mdc-list-item,.mdc-list-item--with-leading-video.mdc-list-item[dir=rtl]{padding-left:auto;padding-right:0}.mdc-list-item--with-leading-video .mdc-list-item__start{margin-left:0;margin-right:16px}[dir=rtl] .mdc-list-item--with-leading-video .mdc-list-item__start,.mdc-list-item--with-leading-video .mdc-list-item__start[dir=rtl]{margin-left:16px;margin-right:0}.mdc-list-item--with-leading-video .mdc-list-item__start{width:100px;height:56px}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-video.mdc-list-item--with-one-line{height:72px}.mdc-list-item--with-leading-video.mdc-list-item--with-two-lines{height:72px}.mdc-list-item--with-leading-checkbox.mdc-list-item{padding-left:0;padding-right:auto}[dir=rtl] .mdc-list-item--with-leading-checkbox.mdc-list-item,.mdc-list-item--with-leading-checkbox.mdc-list-item[dir=rtl]{padding-left:auto;padding-right:0}.mdc-list-item--with-leading-checkbox .mdc-list-item__start{margin-left:8px;margin-right:24px}[dir=rtl] .mdc-list-item--with-leading-checkbox .mdc-list-item__start,.mdc-list-item--with-leading-checkbox .mdc-list-item__start[dir=rtl]{margin-left:24px;margin-right:8px}.mdc-list-item--with-leading-checkbox .mdc-list-item__start{width:40px;height:40px}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__start{align-self:flex-start;margin-top:8px}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-one-line{height:56px}.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines{height:72px}.mdc-list-item--with-leading-radio.mdc-list-item{padding-left:0;padding-right:auto}[dir=rtl] .mdc-list-item--with-leading-radio.mdc-list-item,.mdc-list-item--with-leading-radio.mdc-list-item[dir=rtl]{padding-left:auto;padding-right:0}.mdc-list-item--with-leading-radio .mdc-list-item__start{margin-left:8px;margin-right:24px}[dir=rtl] .mdc-list-item--with-leading-radio .mdc-list-item__start,.mdc-list-item--with-leading-radio .mdc-list-item__start[dir=rtl]{margin-left:24px;margin-right:8px}.mdc-list-item--with-leading-radio .mdc-list-item__start{width:40px;height:40px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__start{align-self:flex-start;margin-top:8px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-radio.mdc-list-item--with-one-line{height:56px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines{height:72px}.mdc-list-item--with-leading-switch.mdc-list-item{padding-left:0;padding-right:auto}[dir=rtl] .mdc-list-item--with-leading-switch.mdc-list-item,.mdc-list-item--with-leading-switch.mdc-list-item[dir=rtl]{padding-left:auto;padding-right:0}.mdc-list-item--with-leading-switch .mdc-list-item__start{margin-left:16px;margin-right:16px}[dir=rtl] .mdc-list-item--with-leading-switch .mdc-list-item__start,.mdc-list-item--with-leading-switch .mdc-list-item__start[dir=rtl]{margin-left:16px;margin-right:16px}.mdc-list-item--with-leading-switch .mdc-list-item__start{width:36px;height:20px}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__start{align-self:flex-start;margin-top:16px}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__overline-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__overline-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines .mdc-list-item__overline-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-switch.mdc-list-item--with-one-line{height:56px}.mdc-list-item--with-leading-switch.mdc-list-item--with-two-lines{height:72px}.mdc-list-item--with-trailing-icon.mdc-list-item{padding-left:auto;padding-right:0}[dir=rtl] .mdc-list-item--with-trailing-icon.mdc-list-item,.mdc-list-item--with-trailing-icon.mdc-list-item[dir=rtl]{padding-left:0;padding-right:auto}.mdc-list-item--with-trailing-icon .mdc-list-item__end{margin-left:16px;margin-right:16px}[dir=rtl] .mdc-list-item--with-trailing-icon .mdc-list-item__end,.mdc-list-item--with-trailing-icon .mdc-list-item__end[dir=rtl]{margin-left:16px;margin-right:16px}.mdc-list-item--with-trailing-icon .mdc-list-item__end{width:24px;height:24px}.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end{align-self:flex-start;margin-top:0}.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end{align-self:flex-start;margin-top:0}.mdc-list-item--with-trailing-meta.mdc-list-item{padding-left:auto;padding-right:0}[dir=rtl] .mdc-list-item--with-trailing-meta.mdc-list-item,.mdc-list-item--with-trailing-meta.mdc-list-item[dir=rtl]{padding-left:0;padding-right:auto}.mdc-list-item--with-trailing-meta .mdc-list-item__end{margin-left:28px;margin-right:16px}[dir=rtl] .mdc-list-item--with-trailing-meta .mdc-list-item__end,.mdc-list-item--with-trailing-meta .mdc-list-item__end[dir=rtl]{margin-left:16px;margin-right:28px}.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-trailing-meta .mdc-list-item__end{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.75rem;font-size:var(--mdc-typography-caption-font-size, 0.75rem);line-height:1.25rem;line-height:var(--mdc-typography-caption-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:0.0333333333em;letter-spacing:var(--mdc-typography-caption-letter-spacing, 0.0333333333em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-caption-text-transform, inherit)}.mdc-list-item--with-trailing-checkbox.mdc-list-item{padding-left:auto;padding-right:0}[dir=rtl] .mdc-list-item--with-trailing-checkbox.mdc-list-item,.mdc-list-item--with-trailing-checkbox.mdc-list-item[dir=rtl]{padding-left:0;padding-right:auto}.mdc-list-item--with-trailing-checkbox .mdc-list-item__end{margin-left:24px;margin-right:8px}[dir=rtl] .mdc-list-item--with-trailing-checkbox .mdc-list-item__end,.mdc-list-item--with-trailing-checkbox .mdc-list-item__end[dir=rtl]{margin-left:8px;margin-right:24px}.mdc-list-item--with-trailing-checkbox .mdc-list-item__end{width:40px;height:40px}.mdc-list-item--with-trailing-checkbox.mdc-list-item--with-three-lines .mdc-list-item__end{align-self:flex-start;margin-top:8px}.mdc-list-item--with-trailing-radio.mdc-list-item{padding-left:auto;padding-right:0}[dir=rtl] .mdc-list-item--with-trailing-radio.mdc-list-item,.mdc-list-item--with-trailing-radio.mdc-list-item[dir=rtl]{padding-left:0;padding-right:auto}.mdc-list-item--with-trailing-radio .mdc-list-item__end{margin-left:24px;margin-right:8px}[dir=rtl] .mdc-list-item--with-trailing-radio .mdc-list-item__end,.mdc-list-item--with-trailing-radio .mdc-list-item__end[dir=rtl]{margin-left:8px;margin-right:24px}.mdc-list-item--with-trailing-radio .mdc-list-item__end{width:40px;height:40px}.mdc-list-item--with-trailing-radio.mdc-list-item--with-three-lines .mdc-list-item__end{align-self:flex-start;margin-top:8px}.mdc-list-item--with-trailing-switch.mdc-list-item{padding-left:auto;padding-right:0}[dir=rtl] .mdc-list-item--with-trailing-switch.mdc-list-item,.mdc-list-item--with-trailing-switch.mdc-list-item[dir=rtl]{padding-left:0;padding-right:auto}.mdc-list-item--with-trailing-switch .mdc-list-item__end{margin-left:16px;margin-right:16px}[dir=rtl] .mdc-list-item--with-trailing-switch .mdc-list-item__end,.mdc-list-item--with-trailing-switch .mdc-list-item__end[dir=rtl]{margin-left:16px;margin-right:16px}.mdc-list-item--with-trailing-switch .mdc-list-item__end{width:36px;height:20px}.mdc-list-item--with-trailing-switch.mdc-list-item--with-three-lines .mdc-list-item__end{align-self:flex-start;margin-top:16px}.mdc-list-item--with-overline.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-overline.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:20px;content:"";vertical-align:0}.mdc-list-item--with-overline.mdc-list-item--with-three-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-overline.mdc-list-item--with-three-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:20px;content:"";vertical-align:0}.mdc-list-item{padding-left:16px;padding-right:16px}[dir=rtl] .mdc-list-item,.mdc-list-item[dir=rtl]{padding-left:16px;padding-right:16px}.mdc-list-group .mdc-deprecated-list{padding:0}.mdc-list-group__subheader{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);line-height:1.75rem;line-height:var(--mdc-typography-subtitle1-line-height, 1.75rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);margin:calc( (3rem - 1.5rem) / 2 ) 16px}.mdc-list-divider{background-color:rgba(0, 0, 0, 0.12)}.mdc-list-divider{height:1px;padding:0;background-clip:content-box}.mdc-list-divider.mdc-list-divider--with-leading-inset,.mdc-list-divider--with-leading-text.mdc-list-divider--with-leading-inset,.mdc-list-divider--with-leading-icon.mdc-list-divider--with-leading-inset,.mdc-list-divider--with-leading-image.mdc-list-divider--with-leading-inset,.mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-leading-inset,.mdc-list-divider--with-leading-avatar.mdc-list-divider--with-leading-inset,.mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-leading-inset,.mdc-list-divider--with-leading-switch.mdc-list-divider--with-leading-inset,.mdc-list-divider--with-leading-radio.mdc-list-divider--with-leading-inset{padding-left:16px;padding-right:auto}[dir=rtl] .mdc-list-divider.mdc-list-divider--with-leading-inset,[dir=rtl] .mdc-list-divider--with-leading-text.mdc-list-divider--with-leading-inset,[dir=rtl] .mdc-list-divider--with-leading-icon.mdc-list-divider--with-leading-inset,[dir=rtl] .mdc-list-divider--with-leading-image.mdc-list-divider--with-leading-inset,[dir=rtl] .mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-leading-inset,[dir=rtl] .mdc-list-divider--with-leading-avatar.mdc-list-divider--with-leading-inset,[dir=rtl] .mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-leading-inset,[dir=rtl] .mdc-list-divider--with-leading-switch.mdc-list-divider--with-leading-inset,[dir=rtl] .mdc-list-divider--with-leading-radio.mdc-list-divider--with-leading-inset,.mdc-list-divider.mdc-list-divider--with-leading-inset[dir=rtl],.mdc-list-divider--with-leading-text.mdc-list-divider--with-leading-inset[dir=rtl],.mdc-list-divider--with-leading-icon.mdc-list-divider--with-leading-inset[dir=rtl],.mdc-list-divider--with-leading-image.mdc-list-divider--with-leading-inset[dir=rtl],.mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-leading-inset[dir=rtl],.mdc-list-divider--with-leading-avatar.mdc-list-divider--with-leading-inset[dir=rtl],.mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-leading-inset[dir=rtl],.mdc-list-divider--with-leading-switch.mdc-list-divider--with-leading-inset[dir=rtl],.mdc-list-divider--with-leading-radio.mdc-list-divider--with-leading-inset[dir=rtl]{padding-left:auto;padding-right:16px}.mdc-list-divider.mdc-list-divider--with-trailing-inset,.mdc-list-divider--with-leading-text.mdc-list-divider--with-trailing-inset,.mdc-list-divider--with-leading-icon.mdc-list-divider--with-trailing-inset,.mdc-list-divider--with-leading-image.mdc-list-divider--with-trailing-inset,.mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-trailing-inset,.mdc-list-divider--with-leading-avatar.mdc-list-divider--with-trailing-inset,.mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-trailing-inset,.mdc-list-divider--with-leading-switch.mdc-list-divider--with-trailing-inset,.mdc-list-divider--with-leading-radio.mdc-list-divider--with-trailing-inset{padding-left:auto;padding-right:16px}[dir=rtl] .mdc-list-divider.mdc-list-divider--with-trailing-inset,[dir=rtl] .mdc-list-divider--with-leading-text.mdc-list-divider--with-trailing-inset,[dir=rtl] .mdc-list-divider--with-leading-icon.mdc-list-divider--with-trailing-inset,[dir=rtl] .mdc-list-divider--with-leading-image.mdc-list-divider--with-trailing-inset,[dir=rtl] .mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-trailing-inset,[dir=rtl] .mdc-list-divider--with-leading-avatar.mdc-list-divider--with-trailing-inset,[dir=rtl] .mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-trailing-inset,[dir=rtl] .mdc-list-divider--with-leading-switch.mdc-list-divider--with-trailing-inset,[dir=rtl] .mdc-list-divider--with-leading-radio.mdc-list-divider--with-trailing-inset,.mdc-list-divider.mdc-list-divider--with-trailing-inset[dir=rtl],.mdc-list-divider--with-leading-text.mdc-list-divider--with-trailing-inset[dir=rtl],.mdc-list-divider--with-leading-icon.mdc-list-divider--with-trailing-inset[dir=rtl],.mdc-list-divider--with-leading-image.mdc-list-divider--with-trailing-inset[dir=rtl],.mdc-list-divider--with-leading-thumbnail.mdc-list-divider--with-trailing-inset[dir=rtl],.mdc-list-divider--with-leading-avatar.mdc-list-divider--with-trailing-inset[dir=rtl],.mdc-list-divider--with-leading-checkbox.mdc-list-divider--with-trailing-inset[dir=rtl],.mdc-list-divider--with-leading-switch.mdc-list-divider--with-trailing-inset[dir=rtl],.mdc-list-divider--with-leading-radio.mdc-list-divider--with-trailing-inset[dir=rtl]{padding-left:16px;padding-right:auto}.mdc-list-divider--with-leading-video.mdc-list-divider--with-leading-inset{padding-left:0px;padding-right:auto}[dir=rtl] .mdc-list-divider--with-leading-video.mdc-list-divider--with-leading-inset,.mdc-list-divider--with-leading-video.mdc-list-divider--with-leading-inset[dir=rtl]{padding-left:auto;padding-right:0px}[dir=rtl] .mdc-list-divider,.mdc-list-divider[dir=rtl]{padding:0}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity;--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--unbounded .mdc-deprecated-list-item__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--foreground-activation .mdc-deprecated-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--foreground-deactivation .mdc-deprecated-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--unbounded .mdc-list-item__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--foreground-activation .mdc-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--foreground-deactivation .mdc-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:hover .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-surface--hover .mdc-deprecated-list-item__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded) .mdc-deprecated-list-item__ripple::after{transition:opacity 150ms linear}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded):active .mdc-deprecated-list-item__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:hover .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-surface--hover .mdc-list-item__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after{transition:opacity 150ms linear}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-deprecated-list-item__ripple::before{opacity:0.12;opacity:var(--mdc-ripple-activated-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-deprecated-list-item__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:hover .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-surface--hover .mdc-deprecated-list-item__ripple::before{opacity:0.16;opacity:var(--mdc-ripple-hover-opacity, 0.16)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded) .mdc-deprecated-list-item__ripple::after{transition:opacity 150ms linear}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded):active .mdc-deprecated-list-item__ripple::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-list-item__ripple::before{opacity:0.12;opacity:var(--mdc-ripple-activated-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated .mdc-list-item__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:hover .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-surface--hover .mdc-list-item__ripple::before{opacity:0.16;opacity:var(--mdc-ripple-hover-opacity, 0.16)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after{transition:opacity 150ms linear}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--activated.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::before{opacity:0.08;opacity:var(--mdc-ripple-selected-opacity, 0.08)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-deprecated-list-item__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:hover .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-surface--hover .mdc-deprecated-list-item__ripple::before{opacity:0.12;opacity:var(--mdc-ripple-hover-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before{transition-duration:75ms;opacity:0.2;opacity:var(--mdc-ripple-focus-opacity, 0.2)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded) .mdc-deprecated-list-item__ripple::after{transition:opacity 150ms linear}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-deprecated-list-item__ripple::after{transition-duration:75ms;opacity:0.2;opacity:var(--mdc-ripple-press-opacity, 0.2)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.2)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-list-item__ripple::before{opacity:0.08;opacity:var(--mdc-ripple-selected-opacity, 0.08)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected .mdc-list-item__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:hover .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-surface--hover .mdc-list-item__ripple::before{opacity:0.12;opacity:var(--mdc-ripple-hover-opacity, 0.12)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before{transition-duration:75ms;opacity:0.2;opacity:var(--mdc-ripple-focus-opacity, 0.2)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after{transition:opacity 150ms linear}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after{transition-duration:75ms;opacity:0.2;opacity:var(--mdc-ripple-press-opacity, 0.2)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item--selected.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.2)}:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-deprecated-list-item__ripple,:not(.mdc-deprecated-list-item--disabled).mdc-deprecated-list-item .mdc-list-item__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.mdc-deprecated-list-item--disabled{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity;--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::before,.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--unbounded .mdc-deprecated-list-item__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--foreground-activation .mdc-deprecated-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--foreground-deactivation .mdc-deprecated-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::before,.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--unbounded .mdc-list-item__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--foreground-activation .mdc-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--foreground-deactivation .mdc-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::before,.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-deprecated-list-item__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::before,.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::before,.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::before,.mdc-deprecated-list-item--disabled .mdc-list-item__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--background-focused .mdc-deprecated-list-item__ripple::before,.mdc-deprecated-list-item--disabled:not(.mdc-ripple-upgraded):focus .mdc-deprecated-list-item__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-deprecated-list-item--disabled.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before,.mdc-deprecated-list-item--disabled:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-deprecated-list-item--disabled .mdc-deprecated-list-item__ripple,.mdc-deprecated-list-item--disabled .mdc-list-item__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}:not(.mdc-list-item--disabled).mdc-list-item{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded--unbounded .mdc-list-item__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded--foreground-activation .mdc-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded--foreground-deactivation .mdc-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded .mdc-list-item__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}:not(.mdc-list-item--disabled).mdc-list-item:hover .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-surface--hover .mdc-list-item__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}:not(.mdc-list-item--disabled).mdc-list-item:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after{transition:opacity 150ms linear}:not(.mdc-list-item--disabled).mdc-list-item:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}:not(.mdc-list-item--disabled).mdc-list-item.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}:not(.mdc-list-item--disabled).mdc-list-item--activated .mdc-list-item__ripple::before{opacity:0.12;opacity:var(--mdc-ripple-activated-opacity, 0.12)}:not(.mdc-list-item--disabled).mdc-list-item--activated .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item--activated .mdc-list-item__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}:not(.mdc-list-item--disabled).mdc-list-item--activated:hover .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item--activated.mdc-ripple-surface--hover .mdc-list-item__ripple::before{opacity:0.16;opacity:var(--mdc-ripple-hover-opacity, 0.16)}:not(.mdc-list-item--disabled).mdc-list-item--activated.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item--activated:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}:not(.mdc-list-item--disabled).mdc-list-item--activated:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after{transition:opacity 150ms linear}:not(.mdc-list-item--disabled).mdc-list-item--activated:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}:not(.mdc-list-item--disabled).mdc-list-item--activated.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}:not(.mdc-list-item--disabled).mdc-list-item--selected .mdc-list-item__ripple::before{opacity:0.08;opacity:var(--mdc-ripple-selected-opacity, 0.08)}:not(.mdc-list-item--disabled).mdc-list-item--selected .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item--selected .mdc-list-item__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}:not(.mdc-list-item--disabled).mdc-list-item--selected:hover .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item--selected.mdc-ripple-surface--hover .mdc-list-item__ripple::before{opacity:0.12;opacity:var(--mdc-ripple-hover-opacity, 0.12)}:not(.mdc-list-item--disabled).mdc-list-item--selected.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before,:not(.mdc-list-item--disabled).mdc-list-item--selected:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before{transition-duration:75ms;opacity:0.2;opacity:var(--mdc-ripple-focus-opacity, 0.2)}:not(.mdc-list-item--disabled).mdc-list-item--selected:not(.mdc-ripple-upgraded) .mdc-list-item__ripple::after{transition:opacity 150ms linear}:not(.mdc-list-item--disabled).mdc-list-item--selected:not(.mdc-ripple-upgraded):active .mdc-list-item__ripple::after{transition-duration:75ms;opacity:0.2;opacity:var(--mdc-ripple-press-opacity, 0.2)}:not(.mdc-list-item--disabled).mdc-list-item--selected.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.2)}:not(.mdc-list-item--disabled).mdc-list-item .mdc-list-item__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.mdc-list-item--disabled{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-list-item--disabled .mdc-list-item__ripple::before,.mdc-list-item--disabled .mdc-list-item__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-list-item--disabled .mdc-list-item__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-list-item--disabled .mdc-list-item__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-list-item--disabled.mdc-ripple-upgraded--unbounded .mdc-list-item__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-list-item--disabled.mdc-ripple-upgraded--foreground-activation .mdc-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-list-item--disabled.mdc-ripple-upgraded--foreground-deactivation .mdc-list-item__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-list-item--disabled .mdc-list-item__ripple::before,.mdc-list-item--disabled .mdc-list-item__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-list-item--disabled.mdc-ripple-upgraded .mdc-list-item__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-list-item--disabled .mdc-list-item__ripple::before,.mdc-list-item--disabled .mdc-list-item__ripple::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}.mdc-list-item--disabled.mdc-ripple-upgraded--background-focused .mdc-list-item__ripple::before,.mdc-list-item--disabled:not(.mdc-ripple-upgraded):focus .mdc-list-item__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-list-item--disabled .mdc-list-item__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.mdc-menu{min-width:112px;min-width:var(--mdc-menu-min-width, 112px)}.mdc-menu .mdc-deprecated-list-item__meta{color:rgba(0, 0, 0, 0.87)}.mdc-menu .mdc-deprecated-list-item__graphic{color:rgba(0, 0, 0, 0.87)}.mdc-menu .mdc-deprecated-list{color:rgba(0, 0, 0, 0.87);position:relative}.mdc-menu .mdc-deprecated-list .mdc-elevation-overlay{width:100%;height:100%;top:0;left:0}.mdc-menu .mdc-deprecated-list-divider{margin:8px 0}.mdc-menu .mdc-deprecated-list-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdc-menu .mdc-deprecated-list-item--disabled{cursor:auto}.mdc-menu a.mdc-deprecated-list-item .mdc-deprecated-list-item__text,.mdc-menu a.mdc-deprecated-list-item .mdc-deprecated-list-item__graphic{pointer-events:none}.mdc-menu__selection-group{padding:0;fill:currentColor}.mdc-menu__selection-group .mdc-deprecated-list-item{padding-left:56px;padding-right:16px}[dir=rtl] .mdc-menu__selection-group .mdc-deprecated-list-item,.mdc-menu__selection-group .mdc-deprecated-list-item[dir=rtl]{padding-left:16px;padding-right:56px}.mdc-menu__selection-group .mdc-menu__selection-group-icon{left:16px;right:initial;display:none;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[dir=rtl] .mdc-menu__selection-group .mdc-menu__selection-group-icon,.mdc-menu__selection-group .mdc-menu__selection-group-icon[dir=rtl]{left:initial;right:16px}.mdc-menu-item--selected .mdc-menu__selection-group-icon{display:inline}.mdc-menu-surface{display:none;position:absolute;box-sizing:border-box;max-width:calc(100vw - 32px);max-width:var(--mdc-menu-max-width, calc(100vw - 32px));max-height:calc(100vh - 32px);max-height:var(--mdc-menu-max-height, calc(100vh - 32px));margin:0;padding:0;-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:top left;transform-origin:top left;opacity:0;overflow:auto;will-change:transform,opacity;z-index:8;transition:opacity .03s linear,height 250ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform .12s cubic-bezier(0, 0, 0.2, 1);transition:opacity .03s linear,transform .12s cubic-bezier(0, 0, 0.2, 1),height 250ms cubic-bezier(0, 0, 0.2, 1);transition:opacity .03s linear,transform .12s cubic-bezier(0, 0, 0.2, 1),height 250ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform .12s cubic-bezier(0, 0, 0.2, 1);box-shadow:0px 5px 5px -3px rgba(0, 0, 0, 0.2),0px 8px 10px 1px rgba(0, 0, 0, 0.14),0px 3px 14px 2px rgba(0,0,0,.12);background-color:#fff;background-color:var(--mdc-theme-surface, #fff);color:#000;color:var(--mdc-theme-on-surface, #000);border-radius:4px;border-radius:var(--mdc-shape-medium, 4px);transform-origin-left:top left;transform-origin-right:top right}.mdc-menu-surface:focus{outline:none}.mdc-menu-surface--animating-open{display:inline-block;-webkit-transform:scale(0.8);transform:scale(0.8);opacity:0}.mdc-menu-surface--open{display:inline-block;-webkit-transform:scale(1);transform:scale(1);opacity:1}.mdc-menu-surface--animating-closed{display:inline-block;opacity:0;transition:opacity .075s linear}[dir=rtl] .mdc-menu-surface,.mdc-menu-surface[dir=rtl]{transform-origin-left:top right;transform-origin-right:top left}.mdc-menu-surface--anchor{position:relative;overflow:visible}.mdc-menu-surface--fixed{position:fixed}.mdc-menu-surface--fullwidth{width:100%}.mdc-radio{padding:calc((40px - 20px) / 2)}.mdc-radio .mdc-radio__native-control:enabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-color:rgba(0, 0, 0, 0.54)}.mdc-radio .mdc-radio__native-control:enabled:checked+.mdc-radio__background .mdc-radio__outer-circle{border-color:#018786;border-color:var(--mdc-theme-secondary, #018786)}.mdc-radio .mdc-radio__native-control:enabled+.mdc-radio__background .mdc-radio__inner-circle{border-color:#018786;border-color:var(--mdc-theme-secondary, #018786)}.mdc-radio [aria-disabled=true] .mdc-radio__native-control:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle,.mdc-radio .mdc-radio__native-control:disabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-color:rgba(0, 0, 0, 0.38)}.mdc-radio [aria-disabled=true] .mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__outer-circle,.mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__outer-circle{border-color:rgba(0, 0, 0, 0.38)}.mdc-radio [aria-disabled=true] .mdc-radio__native-control+.mdc-radio__background .mdc-radio__inner-circle,.mdc-radio .mdc-radio__native-control:disabled+.mdc-radio__background .mdc-radio__inner-circle{border-color:rgba(0, 0, 0, 0.38)}.mdc-radio .mdc-radio__background::before{background-color:#018786;background-color:var(--mdc-theme-secondary, #018786)}.mdc-radio .mdc-radio__background::before{top:calc(-1 * (40px - 20px) / 2);left:calc(-1 * (40px - 20px) / 2);width:40px;height:40px}.mdc-radio .mdc-radio__native-control{top:calc((40px - 40px) / 2);right:calc((40px - 40px) / 2);left:calc((40px - 40px) / 2);width:40px;height:40px}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-radio [aria-disabled=true] .mdc-radio__native-control:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle,.mdc-radio .mdc-radio__native-control:disabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-color:GrayText}.mdc-radio [aria-disabled=true] .mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__outer-circle,.mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__outer-circle{border-color:GrayText}.mdc-radio [aria-disabled=true] .mdc-radio__native-control+.mdc-radio__background .mdc-radio__inner-circle,.mdc-radio .mdc-radio__native-control:disabled+.mdc-radio__background .mdc-radio__inner-circle{border-color:GrayText}}.mdc-radio{display:inline-block;position:relative;flex:0 0 auto;box-sizing:content-box;width:20px;height:20px;cursor:pointer;will-change:opacity,transform,border-color,color}.mdc-radio__background{display:inline-block;position:relative;box-sizing:border-box;width:20px;height:20px}.mdc-radio__background::before{position:absolute;-webkit-transform:scale(0, 0);transform:scale(0, 0);border-radius:50%;opacity:0;pointer-events:none;content:"";transition:opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1),-webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1),transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1),transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1),-webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-radio__outer-circle{position:absolute;top:0;left:0;box-sizing:border-box;width:100%;height:100%;border-width:2px;border-style:solid;border-radius:50%;transition:border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-radio__inner-circle{position:absolute;top:0;left:0;box-sizing:border-box;width:100%;height:100%;-webkit-transform:scale(0, 0);transform:scale(0, 0);border-width:10px;border-style:solid;border-radius:50%;transition:border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1),-webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1),border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transition:transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1),border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1),-webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-radio__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1}.mdc-radio--touch{margin-top:4px;margin-bottom:4px;margin-right:4px;margin-left:4px}.mdc-radio--touch .mdc-radio__native-control{top:calc((40px - 48px) / 2);right:calc((40px - 48px) / 2);left:calc((40px - 48px) / 2);width:48px;height:48px}.mdc-radio__native-control:checked+.mdc-radio__background,.mdc-radio__native-control:disabled+.mdc-radio__background{transition:opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__outer-circle,.mdc-radio__native-control:disabled+.mdc-radio__background .mdc-radio__outer-circle{transition:border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__inner-circle,.mdc-radio__native-control:disabled+.mdc-radio__background .mdc-radio__inner-circle{transition:border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1),border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1),border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-radio--disabled{cursor:default;pointer-events:none}.mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__inner-circle{-webkit-transform:scale(0.5);transform:scale(0.5);transition:border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1),border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1),border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-radio__native-control:disabled+.mdc-radio__background,[aria-disabled=true] .mdc-radio__native-control+.mdc-radio__background{cursor:default}.mdc-radio__native-control:focus+.mdc-radio__background::before{-webkit-transform:scale(1);transform:scale(1);opacity:.12;transition:opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-radio{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-radio .mdc-radio__ripple::before,.mdc-radio .mdc-radio__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-radio .mdc-radio__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-radio .mdc-radio__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-radio.mdc-ripple-upgraded--unbounded .mdc-radio__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-radio.mdc-ripple-upgraded--foreground-activation .mdc-radio__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-radio.mdc-ripple-upgraded--foreground-deactivation .mdc-radio__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-radio .mdc-radio__ripple::before,.mdc-radio .mdc-radio__ripple::after{top:calc(50% - 50%);left:calc(50% - 50%);width:100%;height:100%}.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::before,.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::after{top:var(--mdc-ripple-top, calc(50% - 50%));left:var(--mdc-ripple-left, calc(50% - 50%));width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-radio.mdc-ripple-upgraded .mdc-radio__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-radio .mdc-radio__ripple::before,.mdc-radio .mdc-radio__ripple::after{background-color:#018786;background-color:var(--mdc-ripple-color, var(--mdc-theme-secondary, #018786))}.mdc-radio:hover .mdc-radio__ripple::before,.mdc-radio.mdc-ripple-surface--hover .mdc-radio__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-radio.mdc-ripple-upgraded--background-focused .mdc-radio__ripple::before,.mdc-radio:not(.mdc-ripple-upgraded):focus .mdc-radio__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-radio:not(.mdc-ripple-upgraded) .mdc-radio__ripple::after{transition:opacity 150ms linear}.mdc-radio:not(.mdc-ripple-upgraded):active .mdc-radio__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-radio.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-radio.mdc-ripple-upgraded .mdc-radio__background::before,.mdc-radio.mdc-ripple-upgraded--background-focused .mdc-radio__background::before{content:none}.mdc-radio__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.mdc-ripple-surface{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity;position:relative;outline:none;overflow:hidden}.mdc-ripple-surface::before,.mdc-ripple-surface::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-ripple-surface::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-ripple-surface::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-ripple-surface.mdc-ripple-upgraded::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-ripple-surface.mdc-ripple-upgraded::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-ripple-surface.mdc-ripple-upgraded--unbounded::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-ripple-surface.mdc-ripple-upgraded--foreground-activation::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-ripple-surface.mdc-ripple-upgraded--foreground-deactivation::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-ripple-surface::before,.mdc-ripple-surface::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-ripple-surface.mdc-ripple-upgraded::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-ripple-surface[data-mdc-ripple-is-unbounded],.mdc-ripple-upgraded--unbounded{overflow:visible}.mdc-ripple-surface[data-mdc-ripple-is-unbounded]::before,.mdc-ripple-surface[data-mdc-ripple-is-unbounded]::after,.mdc-ripple-upgraded--unbounded::before,.mdc-ripple-upgraded--unbounded::after{top:calc(50% - 50%);left:calc(50% - 50%);width:100%;height:100%}.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::before,.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::after,.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::before,.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::after{top:var(--mdc-ripple-top, calc(50% - 50%));left:var(--mdc-ripple-left, calc(50% - 50%));width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::after,.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-ripple-surface::before,.mdc-ripple-surface::after{background-color:#000;background-color:var(--mdc-ripple-color, #000)}.mdc-ripple-surface:hover::before,.mdc-ripple-surface.mdc-ripple-surface--hover::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-ripple-surface.mdc-ripple-upgraded--background-focused::before,.mdc-ripple-surface:not(.mdc-ripple-upgraded):focus::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-ripple-surface:not(.mdc-ripple-upgraded)::after{transition:opacity 150ms linear}.mdc-ripple-surface:not(.mdc-ripple-upgraded):active::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-ripple-surface.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-segmented-button{display:inline-block;font-size:0}.mdc-segmented-button__segment{border-color:rgba(0, 0, 0, 0.12);border-color:var(--mdc-segmented-button-outline-color, rgba(0, 0, 0, 0.12))}.mdc-segmented-button__segment{color:rgba(0, 0, 0, 0.6);color:var(--mdc-segmented-button-unselected-ink-color, rgba(0, 0, 0, 0.6))}.mdc-segmented-button__segment{background-color:white;background-color:var(--mdc-segmented-button-unselected-container-fill-color, white)}.mdc-segmented-button__segment--selected{color:#6200ee;color:var(--mdc-segmented-button-selected-ink-color, #6200ee)}.mdc-segmented-button__segment--selected{background-color:rgba(98, 0, 238, 0.08);background-color:var(--mdc-segmented-button-selected-container-fill-color, rgba(98, 0, 238, 0.08))}.mdc-segmented-button__segment{position:relative;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-button-font-size, 0.875rem);line-height:2.25rem;line-height:var(--mdc-typography-button-line-height, 2.25rem);font-weight:500;font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:0.0892857143em;letter-spacing:var(--mdc-typography-button-letter-spacing, 0.0892857143em);text-decoration:none;-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:uppercase;text-transform:var(--mdc-typography-button-text-transform, uppercase);display:inline-flex;vertical-align:top;align-items:center;height:36px;min-width:48px;padding:0 12px;border-width:1px 0 1px 1px}.mdc-segmented-button__segment .mdc-elevation-overlay{width:100%;height:100%;top:0;left:0}.mdc-segmented-button__segment:hover{cursor:pointer}.mdc-segmented-button__segment:focus{outline-width:0}.mdc-segmented-button__segment:first-child{border-radius:4px 0 0 4px}.mdc-segmented-button__segment:last-child{border-right-width:1px;border-radius:0 4px 4px 0}.mdc-segmented-button__segment .mdc-segmented-button__segment__touch{position:absolute;top:50%;height:48px;left:0;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mdc-segmented-button__segment .mdc-segmented-button__segment--touch{margin-top:0px;margin-bottom:0px}.mdc-touch-target-wrapper .mdc-segmented-button__segment{border-radius:0;border-right-width:0}.mdc-touch-target-wrapper:first-child .mdc-segmented-button__segment{border-radius:4px 0 0 4px}.mdc-touch-target-wrapper:last-child .mdc-segmented-button__segment{border-right-width:1px;border-radius:0 4px 4px 0}.mdc-segmented-button__icon{width:24px;font-size:18px}.mdc-segmented-button__icon+.mdc-segmented-button__label{padding-left:6px}.mdc-segmented-button__segment{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity;overflow:hidden}.mdc-segmented-button__segment .mdc-segmented-button__ripple::before,.mdc-segmented-button__segment .mdc-segmented-button__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-segmented-button__segment .mdc-segmented-button__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-segmented-button__segment .mdc-segmented-button__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-segmented-button__segment.mdc-ripple-upgraded .mdc-segmented-button__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-segmented-button__segment.mdc-ripple-upgraded .mdc-segmented-button__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-segmented-button__segment.mdc-ripple-upgraded--unbounded .mdc-segmented-button__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-segmented-button__segment.mdc-ripple-upgraded--foreground-activation .mdc-segmented-button__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-segmented-button__segment.mdc-ripple-upgraded--foreground-deactivation .mdc-segmented-button__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-segmented-button__segment .mdc-segmented-button__ripple::before,.mdc-segmented-button__segment .mdc-segmented-button__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-segmented-button__segment.mdc-ripple-upgraded .mdc-segmented-button__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-segmented-button__segment .mdc-segmented-button__ripple::before,.mdc-segmented-button__segment .mdc-segmented-button__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, #6200ee)}.mdc-segmented-button__segment:hover .mdc-segmented-button__ripple::before,.mdc-segmented-button__segment.mdc-ripple-surface--hover .mdc-segmented-button__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-segmented-button__segment.mdc-ripple-upgraded--background-focused .mdc-segmented-button__ripple::before,.mdc-segmented-button__segment.mdc-ripple-upgraded:focus-within .mdc-segmented-button__ripple::before,.mdc-segmented-button__segment:not(.mdc-ripple-upgraded):focus .mdc-segmented-button__ripple::before,.mdc-segmented-button__segment:not(.mdc-ripple-upgraded):focus-within .mdc-segmented-button__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-segmented-button__segment:not(.mdc-ripple-upgraded) .mdc-segmented-button__ripple::after{transition:opacity 150ms linear}.mdc-segmented-button__segment:not(.mdc-ripple-upgraded):active .mdc-segmented-button__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-segmented-button__segment.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-segmented-button__segment .mdc-segmented-button__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.mdc-slider__thumb{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-slider__thumb::before,.mdc-slider__thumb::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-slider__thumb::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-slider__thumb::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-slider__thumb.mdc-ripple-upgraded::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-slider__thumb.mdc-ripple-upgraded::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-slider__thumb.mdc-ripple-upgraded--unbounded::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-slider__thumb.mdc-ripple-upgraded--foreground-activation::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-slider__thumb.mdc-ripple-upgraded--foreground-deactivation::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-slider__thumb::before,.mdc-slider__thumb::after{top:calc(50% - 50%);left:calc(50% - 50%);width:100%;height:100%}.mdc-slider__thumb.mdc-ripple-upgraded::before,.mdc-slider__thumb.mdc-ripple-upgraded::after{top:var(--mdc-ripple-top, calc(50% - 50%));left:var(--mdc-ripple-left, calc(50% - 50%));width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-slider__thumb.mdc-ripple-upgraded::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-slider__thumb::before,.mdc-slider__thumb::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-slider__thumb:hover::before,.mdc-slider__thumb.mdc-ripple-surface--hover::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-slider__thumb.mdc-ripple-upgraded--background-focused::before,.mdc-slider__thumb:not(.mdc-ripple-upgraded):focus::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-slider__thumb:not(.mdc-ripple-upgraded)::after{transition:opacity 150ms linear}.mdc-slider__thumb:not(.mdc-ripple-upgraded):active::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-slider__thumb.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-slider{cursor:pointer;height:48px;margin:0 24px;position:relative;touch-action:pan-y}.mdc-slider .mdc-slider__track{height:4px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);width:100%}.mdc-slider .mdc-slider__track--active,.mdc-slider .mdc-slider__track--inactive{display:flex;height:100%;position:absolute;width:100%}.mdc-slider .mdc-slider__track--active{border-radius:3px;height:6px;overflow:hidden;top:-1px}.mdc-slider .mdc-slider__track--active_fill{border-top:6px solid;box-sizing:border-box;height:100%;width:100%;position:relative;-webkit-transform-origin:left;transform-origin:left}[dir=rtl] .mdc-slider .mdc-slider__track--active_fill,.mdc-slider .mdc-slider__track--active_fill[dir=rtl]{-webkit-transform-origin:right;transform-origin:right}.mdc-slider .mdc-slider__track--inactive{border-radius:2px;height:4px;left:0;top:0}.mdc-slider .mdc-slider__track--inactive::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid transparent;border-radius:inherit;content:"";pointer-events:none}.mdc-slider .mdc-slider__track--active_fill{border-color:#6200ee;border-color:var(--mdc-theme-primary, #6200ee)}.mdc-slider.mdc-slider--disabled .mdc-slider__track--active_fill{border-color:#000;border-color:var(--mdc-theme-on-surface, #000)}.mdc-slider .mdc-slider__track--inactive{background-color:#6200ee;background-color:var(--mdc-theme-primary, #6200ee);opacity:.24}.mdc-slider.mdc-slider--disabled .mdc-slider__track--inactive{background-color:#000;background-color:var(--mdc-theme-on-surface, #000);opacity:.24}.mdc-slider .mdc-slider__value-indicator-container{bottom:44px;left:50%;pointer-events:none;position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.mdc-slider .mdc-slider__value-indicator{transition:-webkit-transform 100ms 0ms cubic-bezier(0.4, 0, 1, 1);transition:transform 100ms 0ms cubic-bezier(0.4, 0, 1, 1);transition:transform 100ms 0ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 100ms 0ms cubic-bezier(0.4, 0, 1, 1);align-items:center;border-radius:4px;display:flex;height:32px;padding:0 12px;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:bottom;transform-origin:bottom}.mdc-slider .mdc-slider__value-indicator::before{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid;bottom:-5px;content:"";height:0;left:50%;position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:0}.mdc-slider .mdc-slider__value-indicator::after{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid transparent;border-radius:inherit;content:"";pointer-events:none}.mdc-slider .mdc-slider__thumb--with-indicator .mdc-slider__value-indicator-container{pointer-events:auto}.mdc-slider .mdc-slider__thumb--with-indicator .mdc-slider__value-indicator{transition:-webkit-transform 100ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:transform 100ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:transform 100ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 100ms 0ms cubic-bezier(0, 0, 0.2, 1);-webkit-transform:scale(1);transform:scale(1)}@media(prefers-reduced-motion){.mdc-slider .mdc-slider__value-indicator,.mdc-slider .mdc-slider__thumb--with-indicator .mdc-slider__value-indicator{transition:none}}.mdc-slider .mdc-slider__value-indicator-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-subtitle2-font-size, 0.875rem);line-height:1.375rem;line-height:var(--mdc-typography-subtitle2-line-height, 1.375rem);font-weight:500;font-weight:var(--mdc-typography-subtitle2-font-weight, 500);letter-spacing:0.0071428571em;letter-spacing:var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle2-text-transform, inherit)}.mdc-slider .mdc-slider__value-indicator{background-color:#000;opacity:.6}.mdc-slider .mdc-slider__value-indicator::before{border-top-color:#000}.mdc-slider .mdc-slider__value-indicator{color:#fff;color:var(--mdc-theme-on-primary, #fff)}.mdc-slider .mdc-slider__thumb{display:flex;height:48px;left:-24px;outline:none;position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:48px}.mdc-slider .mdc-slider__thumb--top{z-index:1}.mdc-slider .mdc-slider__thumb--top .mdc-slider__thumb-knob,.mdc-slider .mdc-slider__thumb--top.mdc-slider__thumb:hover .mdc-slider__thumb-knob,.mdc-slider .mdc-slider__thumb--top.mdc-slider__thumb--focused .mdc-slider__thumb-knob{border-style:solid;border-width:1px;box-sizing:content-box}.mdc-slider .mdc-slider__thumb-knob{box-shadow:0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14),0px 1px 3px 0px rgba(0,0,0,.12);border:10px solid;border-radius:50%;box-sizing:border-box;height:20px;left:50%;position:absolute;top:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);width:20px}.mdc-slider .mdc-slider__thumb-knob{background-color:#6200ee;background-color:var(--mdc-theme-primary, #6200ee);border-color:#6200ee;border-color:var(--mdc-theme-primary, #6200ee)}.mdc-slider .mdc-slider__thumb--top .mdc-slider__thumb-knob,.mdc-slider .mdc-slider__thumb--top.mdc-slider__thumb:hover .mdc-slider__thumb-knob,.mdc-slider .mdc-slider__thumb--top.mdc-slider__thumb--focused .mdc-slider__thumb-knob{border-color:#fff}.mdc-slider.mdc-slider--disabled .mdc-slider__thumb-knob{background-color:#000;background-color:var(--mdc-theme-on-surface, #000);border-color:#000;border-color:var(--mdc-theme-on-surface, #000)}.mdc-slider.mdc-slider--disabled .mdc-slider__thumb--top .mdc-slider__thumb-knob,.mdc-slider.mdc-slider--disabled .mdc-slider__thumb--top.mdc-slider__thumb:hover .mdc-slider__thumb-knob,.mdc-slider.mdc-slider--disabled .mdc-slider__thumb--top.mdc-slider__thumb--focused .mdc-slider__thumb-knob{border-color:#fff}.mdc-slider .mdc-slider__thumb::before,.mdc-slider .mdc-slider__thumb::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-slider .mdc-slider__thumb:hover::before,.mdc-slider .mdc-slider__thumb.mdc-ripple-surface--hover::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-slider .mdc-slider__thumb.mdc-ripple-upgraded--background-focused::before,.mdc-slider .mdc-slider__thumb:not(.mdc-ripple-upgraded):focus::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-slider .mdc-slider__thumb:not(.mdc-ripple-upgraded)::after{transition:opacity 150ms linear}.mdc-slider .mdc-slider__thumb:not(.mdc-ripple-upgraded):active::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-slider .mdc-slider__thumb.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-slider .mdc-slider__tick-marks{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:space-between;padding:0 1px;position:absolute;width:100%}.mdc-slider .mdc-slider__tick-mark--active,.mdc-slider .mdc-slider__tick-mark--inactive{border-radius:50%;height:2px;width:2px}.mdc-slider .mdc-slider__tick-mark--active{background-color:#fff;background-color:var(--mdc-theme-on-primary, #fff);opacity:.6}.mdc-slider.mdc-slider--disabled .mdc-slider__tick-mark--active{background-color:#fff;background-color:var(--mdc-theme-on-primary, #fff);opacity:.6}.mdc-slider .mdc-slider__tick-mark--inactive{background-color:#6200ee;background-color:var(--mdc-theme-primary, #6200ee);opacity:.6}.mdc-slider.mdc-slider--disabled .mdc-slider__tick-mark--inactive{background-color:#000;background-color:var(--mdc-theme-on-surface, #000);opacity:.6}.mdc-slider.mdc-slider--disabled{opacity:.38;cursor:auto}.mdc-slider.mdc-slider--disabled .mdc-slider__thumb{pointer-events:none}.mdc-slider--discrete .mdc-slider__thumb,.mdc-slider--discrete .mdc-slider__track--active_fill{transition:-webkit-transform 80ms ease;transition:transform 80ms ease;transition:transform 80ms ease, -webkit-transform 80ms ease}@media(prefers-reduced-motion){.mdc-slider--discrete .mdc-slider__thumb,.mdc-slider--discrete .mdc-slider__track--active_fill{transition:none}}.mdc-slider__input{cursor:pointer;left:0;margin:0;height:100%;opacity:0;pointer-events:none;position:absolute;top:0;width:100%}.mdc-snackbar{z-index:8;margin:8px;display:none;position:fixed;right:0;bottom:0;left:0;align-items:center;justify-content:center;box-sizing:border-box;pointer-events:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mdc-snackbar__surface{background-color:#333333}.mdc-snackbar__label{color:rgba(255, 255, 255, 0.87)}.mdc-snackbar__surface{min-width:344px}@media(max-width: 480px),(max-width: 344px){.mdc-snackbar__surface{min-width:100%}}.mdc-snackbar__surface{max-width:672px}.mdc-snackbar__surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 6px 10px 0px rgba(0, 0, 0, 0.14),0px 1px 18px 0px rgba(0,0,0,.12)}.mdc-snackbar__surface{border-radius:4px;border-radius:var(--mdc-shape-small, 4px)}.mdc-snackbar--opening,.mdc-snackbar--open,.mdc-snackbar--closing{display:flex}.mdc-snackbar--open .mdc-snackbar__label,.mdc-snackbar--open .mdc-snackbar__actions{visibility:visible}.mdc-snackbar--leading{justify-content:flex-start}.mdc-snackbar--stacked .mdc-snackbar__label{padding-left:16px;padding-right:8px;padding-bottom:12px}[dir=rtl] .mdc-snackbar--stacked .mdc-snackbar__label,.mdc-snackbar--stacked .mdc-snackbar__label[dir=rtl]{padding-left:8px;padding-right:16px}.mdc-snackbar--stacked .mdc-snackbar__surface{flex-direction:column;align-items:flex-start}.mdc-snackbar--stacked .mdc-snackbar__actions{align-self:flex-end;margin-bottom:8px}.mdc-snackbar__surface{padding-left:0;padding-right:8px;display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;-webkit-transform:scale(0.8);transform:scale(0.8);opacity:0}.mdc-snackbar__surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid transparent;border-radius:inherit;content:"";pointer-events:none}[dir=rtl] .mdc-snackbar__surface,.mdc-snackbar__surface[dir=rtl]{padding-left:8px;padding-right:0}.mdc-snackbar--open .mdc-snackbar__surface{-webkit-transform:scale(1);transform:scale(1);opacity:1;pointer-events:auto;transition:opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-snackbar--closing .mdc-snackbar__surface{-webkit-transform:scale(1);transform:scale(1);transition:opacity 75ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-snackbar__label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);padding-left:16px;padding-right:8px;width:100%;flex-grow:1;box-sizing:border-box;margin:0;visibility:hidden;padding-top:14px;padding-bottom:14px}[dir=rtl] .mdc-snackbar__label,.mdc-snackbar__label[dir=rtl]{padding-left:8px;padding-right:16px}.mdc-snackbar__label::before{display:inline;content:attr(data-mdc-snackbar-label-text)}.mdc-snackbar__actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box;visibility:hidden}.mdc-snackbar__action:not(:disabled){color:#bb86fc}.mdc-snackbar__action::before,.mdc-snackbar__action::after{background-color:#bb86fc;background-color:var(--mdc-ripple-color, #bb86fc)}.mdc-snackbar__action:hover::before,.mdc-snackbar__action.mdc-ripple-surface--hover::before{opacity:0.08;opacity:var(--mdc-ripple-hover-opacity, 0.08)}.mdc-snackbar__action.mdc-ripple-upgraded--background-focused::before,.mdc-snackbar__action:not(.mdc-ripple-upgraded):focus::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}.mdc-snackbar__action:not(.mdc-ripple-upgraded)::after{transition:opacity 150ms linear}.mdc-snackbar__action:not(.mdc-ripple-upgraded):active::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-snackbar__action.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-snackbar__dismiss{color:rgba(255, 255, 255, 0.87)}.mdc-snackbar__dismiss .mdc-icon-button__ripple::before,.mdc-snackbar__dismiss .mdc-icon-button__ripple::after{background-color:rgba(255, 255, 255, 0.87);background-color:var(--mdc-ripple-color, rgba(255, 255, 255, 0.87))}.mdc-snackbar__dismiss:hover .mdc-icon-button__ripple::before,.mdc-snackbar__dismiss.mdc-ripple-surface--hover .mdc-icon-button__ripple::before{opacity:0.08;opacity:var(--mdc-ripple-hover-opacity, 0.08)}.mdc-snackbar__dismiss.mdc-ripple-upgraded--background-focused .mdc-icon-button__ripple::before,.mdc-snackbar__dismiss:not(.mdc-ripple-upgraded):focus .mdc-icon-button__ripple::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}.mdc-snackbar__dismiss:not(.mdc-ripple-upgraded) .mdc-icon-button__ripple::after{transition:opacity 150ms linear}.mdc-snackbar__dismiss:not(.mdc-ripple-upgraded):active .mdc-icon-button__ripple::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-snackbar__dismiss.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-snackbar__dismiss.mdc-snackbar__dismiss{width:36px;height:36px;padding:6px;font-size:18px}.mdc-snackbar__action+.mdc-snackbar__dismiss{margin-left:8px;margin-right:0}[dir=rtl] .mdc-snackbar__action+.mdc-snackbar__dismiss,.mdc-snackbar__action+.mdc-snackbar__dismiss[dir=rtl]{margin-left:0;margin-right:8px}.mdc-switch__thumb-underlay{left:-14px;right:initial;top:-17px;width:48px;height:48px}[dir=rtl] .mdc-switch__thumb-underlay,.mdc-switch__thumb-underlay[dir=rtl]{left:initial;right:-14px}.mdc-switch__native-control{width:64px;height:48px}.mdc-switch{display:inline-block;position:relative;outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdc-switch.mdc-switch--checked .mdc-switch__track{background-color:#018786;background-color:var(--mdc-theme-secondary, #018786)}.mdc-switch.mdc-switch--checked .mdc-switch__thumb{background-color:#018786;background-color:var(--mdc-theme-secondary, #018786);border-color:#018786;border-color:var(--mdc-theme-secondary, #018786)}.mdc-switch:not(.mdc-switch--checked) .mdc-switch__track{background-color:#000;background-color:var(--mdc-theme-on-surface, #000)}.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb{background-color:#fff;background-color:var(--mdc-theme-surface, #fff);border-color:#fff;border-color:var(--mdc-theme-surface, #fff)}.mdc-switch__native-control{left:0;right:initial;position:absolute;top:0;margin:0;opacity:0;cursor:pointer;pointer-events:auto;transition:-webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 90ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1)}[dir=rtl] .mdc-switch__native-control,.mdc-switch__native-control[dir=rtl]{left:initial;right:0}.mdc-switch__track{box-sizing:border-box;width:36px;height:14px;border:1px solid transparent;border-radius:7px;opacity:.38;transition:opacity 90ms cubic-bezier(0.4, 0, 0.2, 1),background-color 90ms cubic-bezier(0.4, 0, 0.2, 1),border-color 90ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-switch__thumb-underlay{display:flex;position:absolute;align-items:center;justify-content:center;-webkit-transform:translateX(0);transform:translateX(0);transition:background-color 90ms cubic-bezier(0.4, 0, 0.2, 1),border-color 90ms cubic-bezier(0.4, 0, 0.2, 1),-webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 90ms cubic-bezier(0.4, 0, 0.2, 1),background-color 90ms cubic-bezier(0.4, 0, 0.2, 1),border-color 90ms cubic-bezier(0.4, 0, 0.2, 1);transition:transform 90ms cubic-bezier(0.4, 0, 0.2, 1),background-color 90ms cubic-bezier(0.4, 0, 0.2, 1),border-color 90ms cubic-bezier(0.4, 0, 0.2, 1),-webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-switch__thumb{box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0,0,0,.12);box-sizing:border-box;width:20px;height:20px;border:10px solid;border-radius:50%;pointer-events:none;z-index:1}.mdc-switch--checked .mdc-switch__track{opacity:.54}.mdc-switch--checked .mdc-switch__thumb-underlay{-webkit-transform:translateX(16px);transform:translateX(16px)}[dir=rtl] .mdc-switch--checked .mdc-switch__thumb-underlay,.mdc-switch--checked .mdc-switch__thumb-underlay[dir=rtl]{-webkit-transform:translateX(-16px);transform:translateX(-16px)}.mdc-switch--checked .mdc-switch__native-control{-webkit-transform:translateX(-16px);transform:translateX(-16px)}[dir=rtl] .mdc-switch--checked .mdc-switch__native-control,.mdc-switch--checked .mdc-switch__native-control[dir=rtl]{-webkit-transform:translateX(16px);transform:translateX(16px)}.mdc-switch--disabled{opacity:.38;pointer-events:none}.mdc-switch--disabled .mdc-switch__thumb{border-width:1px}.mdc-switch--disabled .mdc-switch__native-control{cursor:default;pointer-events:none}.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay::before,.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay::after{background-color:#9e9e9e;background-color:var(--mdc-ripple-color, #9e9e9e)}.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay:hover::before,.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay.mdc-ripple-surface--hover::before{opacity:0.08;opacity:var(--mdc-ripple-hover-opacity, 0.08)}.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay.mdc-ripple-upgraded--background-focused::before,.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded):focus::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded)::after{transition:opacity 150ms linear}.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded):active::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-switch:not(.mdc-switch--checked) .mdc-switch__thumb-underlay.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-switch__thumb-underlay{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-switch__thumb-underlay::before,.mdc-switch__thumb-underlay::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-switch__thumb-underlay::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-switch__thumb-underlay::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-switch__thumb-underlay.mdc-ripple-upgraded::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-switch__thumb-underlay.mdc-ripple-upgraded::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-switch__thumb-underlay.mdc-ripple-upgraded--unbounded::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-switch__thumb-underlay.mdc-ripple-upgraded--foreground-activation::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-switch__thumb-underlay.mdc-ripple-upgraded--foreground-deactivation::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-switch__thumb-underlay::before,.mdc-switch__thumb-underlay::after{top:calc(50% - 50%);left:calc(50% - 50%);width:100%;height:100%}.mdc-switch__thumb-underlay.mdc-ripple-upgraded::before,.mdc-switch__thumb-underlay.mdc-ripple-upgraded::after{top:var(--mdc-ripple-top, calc(50% - 50%));left:var(--mdc-ripple-left, calc(50% - 50%));width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-switch__thumb-underlay.mdc-ripple-upgraded::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-switch__thumb-underlay::before,.mdc-switch__thumb-underlay::after{background-color:#018786;background-color:var(--mdc-ripple-color, var(--mdc-theme-secondary, #018786))}.mdc-switch__thumb-underlay:hover::before,.mdc-switch__thumb-underlay.mdc-ripple-surface--hover::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-switch__thumb-underlay.mdc-ripple-upgraded--background-focused::before,.mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded):focus::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded)::after{transition:opacity 150ms linear}.mdc-switch__thumb-underlay:not(.mdc-ripple-upgraded):active::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-switch__thumb-underlay.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-tab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-button-font-size, 0.875rem);line-height:2.25rem;line-height:var(--mdc-typography-button-line-height, 2.25rem);font-weight:500;font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:0.0892857143em;letter-spacing:var(--mdc-typography-button-letter-spacing, 0.0892857143em);text-decoration:none;-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:uppercase;text-transform:var(--mdc-typography-button-text-transform, uppercase);position:relative}.mdc-tab .mdc-tab__text-label{color:rgba(0, 0, 0, 0.6)}.mdc-tab .mdc-tab__icon{color:rgba(0, 0, 0, 0.54);fill:currentColor}.mdc-tab__content{position:relative}.mdc-tab__icon{width:24px;height:24px;font-size:24px}.mdc-tab--active .mdc-tab__text-label{color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-tab--active .mdc-tab__icon{color:#6200ee;color:var(--mdc-theme-primary, #6200ee);fill:currentColor}.mdc-tab{background:none}.mdc-tab{min-width:90px;padding-right:24px;padding-left:24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;margin:0;padding-top:0;padding-bottom:0;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1}.mdc-tab::-moz-focus-inner{padding:0;border:0}.mdc-tab--min-width{flex:0 1 auto}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab__icon{transition:150ms color linear;z-index:2}.mdc-tab--stacked .mdc-tab__content{flex-direction:column;align-items:center;justify-content:center}.mdc-tab--stacked .mdc-tab__text-label{padding-top:6px;padding-bottom:4px}.mdc-tab--active .mdc-tab__text-label,.mdc-tab--active .mdc-tab__icon{transition-delay:100ms}.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label{padding-left:8px;padding-right:0}[dir=rtl] .mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label,.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label[dir=rtl]{padding-left:0;padding-right:8px}.mdc-tab{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mdc-tab .mdc-tab__ripple::before,.mdc-tab .mdc-tab__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-tab .mdc-tab__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-tab .mdc-tab__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-tab.mdc-ripple-upgraded .mdc-tab__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-tab.mdc-ripple-upgraded .mdc-tab__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-tab.mdc-ripple-upgraded--unbounded .mdc-tab__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-tab.mdc-ripple-upgraded--foreground-activation .mdc-tab__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-tab.mdc-ripple-upgraded--foreground-deactivation .mdc-tab__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-tab .mdc-tab__ripple::before,.mdc-tab .mdc-tab__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-tab.mdc-ripple-upgraded .mdc-tab__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-tab .mdc-tab__ripple::before,.mdc-tab .mdc-tab__ripple::after{background-color:#6200ee;background-color:var(--mdc-ripple-color, var(--mdc-theme-primary, #6200ee))}.mdc-tab:hover .mdc-tab__ripple::before,.mdc-tab.mdc-ripple-surface--hover .mdc-tab__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-tab.mdc-ripple-upgraded--background-focused .mdc-tab__ripple::before,.mdc-tab:not(.mdc-ripple-upgraded):focus .mdc-tab__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-tab:not(.mdc-ripple-upgraded) .mdc-tab__ripple::after{transition:opacity 150ms linear}.mdc-tab:not(.mdc-ripple-upgraded):active .mdc-tab__ripple::after{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-tab.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-tab__ripple{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;will-change:transform,opacity}.mdc-tab-bar{width:100%}.mdc-tab{height:48px}.mdc-tab--stacked{height:72px}.mdc-tab-indicator .mdc-tab-indicator__content--underline{border-color:#6200ee;border-color:var(--mdc-theme-primary, #6200ee)}.mdc-tab-indicator .mdc-tab-indicator__content--icon{color:#018786;color:var(--mdc-theme-secondary, #018786)}.mdc-tab-indicator .mdc-tab-indicator__content--underline{border-top-width:2px}.mdc-tab-indicator .mdc-tab-indicator__content--icon{height:34px;font-size:34px}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{-webkit-transform-origin:left;transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator__content--icon{align-self:center;margin:0 auto}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}.mdc-tab-indicator .mdc-tab-indicator__content{transition:250ms -webkit-transform cubic-bezier(0.4, 0, 0.2, 1);transition:250ms transform cubic-bezier(0.4, 0, 0.2, 1);transition:250ms transform cubic-bezier(0.4, 0, 0.2, 1), 250ms -webkit-transform cubic-bezier(0.4, 0, 0.2, 1)}.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition:150ms opacity linear}.mdc-tab-indicator--active.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition-delay:100ms}.mdc-tab-scroller{overflow-y:hidden}.mdc-tab-scroller.mdc-tab-scroller--animating .mdc-tab-scroller__scroll-content{transition:250ms -webkit-transform cubic-bezier(0.4, 0, 0.2, 1);transition:250ms transform cubic-bezier(0.4, 0, 0.2, 1);transition:250ms transform cubic-bezier(0.4, 0, 0.2, 1), 250ms -webkit-transform cubic-bezier(0.4, 0, 0.2, 1)}.mdc-tab-scroller__test{position:absolute;top:-9999px;width:100px;height:100px;overflow-x:scroll}.mdc-tab-scroller__scroll-area{-webkit-overflow-scrolling:touch;display:flex;overflow-x:hidden}.mdc-tab-scroller__scroll-area::-webkit-scrollbar,.mdc-tab-scroller__test::-webkit-scrollbar{display:none}.mdc-tab-scroller__scroll-area--scroll{overflow-x:scroll}.mdc-tab-scroller__scroll-content{position:relative;display:flex;flex:1 0 auto;-webkit-transform:none;transform:none;will-change:transform}.mdc-tab-scroller--align-start .mdc-tab-scroller__scroll-content{justify-content:flex-start}.mdc-tab-scroller--align-end .mdc-tab-scroller__scroll-content{justify-content:flex-end}.mdc-tab-scroller--align-center .mdc-tab-scroller__scroll-content{justify-content:center}.mdc-tab-scroller--animating .mdc-tab-scroller__scroll-area{-webkit-overflow-scrolling:auto}.mdc-text-field--filled{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0);will-change:transform,opacity}.mdc-text-field--filled .mdc-text-field__ripple::before,.mdc-text-field--filled .mdc-text-field__ripple::after{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-text-field--filled .mdc-text-field__ripple::before{transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index, 1)}.mdc-text-field--filled .mdc-text-field__ripple::after{z-index:0;z-index:var(--mdc-ripple-z-index, 0)}.mdc-text-field--filled.mdc-ripple-upgraded .mdc-text-field__ripple::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale, 1));transform:scale(var(--mdc-ripple-fg-scale, 1))}.mdc-text-field--filled.mdc-ripple-upgraded .mdc-text-field__ripple::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-text-field--filled.mdc-ripple-upgraded--unbounded .mdc-text-field__ripple::after{top:var(--mdc-ripple-top, 0);left:var(--mdc-ripple-left, 0)}.mdc-text-field--filled.mdc-ripple-upgraded--foreground-activation .mdc-text-field__ripple::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-text-field--filled.mdc-ripple-upgraded--foreground-deactivation .mdc-text-field__ripple::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));transform:translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1))}.mdc-text-field--filled .mdc-text-field__ripple::before,.mdc-text-field--filled .mdc-text-field__ripple::after{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-text-field--filled.mdc-ripple-upgraded .mdc-text-field__ripple::after{width:var(--mdc-ripple-fg-size, 100%);height:var(--mdc-ripple-fg-size, 100%)}.mdc-text-field__ripple{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.mdc-text-field{border-top-left-radius:4px;border-top-left-radius:var(--mdc-shape-small, 4px);border-top-right-radius:4px;border-top-right-radius:var(--mdc-shape-small, 4px);border-bottom-right-radius:0;border-bottom-left-radius:0;display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-floating-label{color:rgba(0, 0, 0, 0.6)}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input{color:rgba(0, 0, 0, 0.87)}@media all{.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:rgba(0, 0, 0, 0.54)}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:rgba(0, 0, 0, 0.54)}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input::-ms-input-placeholder{color:rgba(0, 0, 0, 0.54)}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:rgba(0, 0, 0, 0.54)}}@media all{.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:rgba(0, 0, 0, 0.54)}}.mdc-text-field .mdc-text-field__input{caret-color:#6200ee;caret-color:var(--mdc-theme-primary, #6200ee)}.mdc-text-field:not(.mdc-text-field--disabled)+.mdc-text-field-helper-line .mdc-text-field-helper-text{color:rgba(0, 0, 0, 0.6)}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field-character-counter,.mdc-text-field:not(.mdc-text-field--disabled)+.mdc-text-field-helper-line .mdc-text-field-character-counter{color:rgba(0, 0, 0, 0.6)}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__icon--leading{color:rgba(0, 0, 0, 0.54)}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__icon--trailing{color:rgba(0, 0, 0, 0.54)}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__affix--prefix{color:rgba(0, 0, 0, 0.6)}.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__affix--suffix{color:rgba(0, 0, 0, 0.6)}.mdc-text-field .mdc-floating-label{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);pointer-events:none}.mdc-text-field__input{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);height:28px;transition:opacity 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);width:100%;min-width:0;border:none;border-radius:0;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input::-webkit-calendar-picker-indicator{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}@media all{.mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1);opacity:0}.mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1);opacity:0}.mdc-text-field__input::-ms-input-placeholder{transition:opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1);opacity:0}.mdc-text-field__input::placeholder{transition:opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1);opacity:0}}@media all{.mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms 0ms cubic-bezier(0.4, 0, 0.2, 1);opacity:0}}@media all{.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}}@media all{.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}}.mdc-text-field__affix{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit);height:28px;transition:opacity 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);opacity:0;white-space:nowrap}.mdc-text-field--label-floating .mdc-text-field__affix,.mdc-text-field--no-label .mdc-text-field__affix{opacity:1}@supports(-webkit-hyphens: none){.mdc-text-field--outlined .mdc-text-field__affix{align-items:center;align-self:center;display:inline-flex;height:100%}}.mdc-text-field__affix--prefix{padding-left:0;padding-right:2px}[dir=rtl] .mdc-text-field__affix--prefix,.mdc-text-field__affix--prefix[dir=rtl]{padding-left:2px;padding-right:0}.mdc-text-field--end-aligned .mdc-text-field__affix--prefix{padding-left:0;padding-right:12px}[dir=rtl] .mdc-text-field--end-aligned .mdc-text-field__affix--prefix,.mdc-text-field--end-aligned .mdc-text-field__affix--prefix[dir=rtl]{padding-left:12px;padding-right:0}.mdc-text-field__affix--suffix{padding-left:12px;padding-right:0}[dir=rtl] .mdc-text-field__affix--suffix,.mdc-text-field__affix--suffix[dir=rtl]{padding-left:0;padding-right:12px}.mdc-text-field--end-aligned .mdc-text-field__affix--suffix{padding-left:2px;padding-right:0}[dir=rtl] .mdc-text-field--end-aligned .mdc-text-field__affix--suffix,.mdc-text-field--end-aligned .mdc-text-field__affix--suffix[dir=rtl]{padding-left:0;padding-right:2px}.mdc-text-field--filled{height:56px}.mdc-text-field--filled .mdc-text-field__ripple::before,.mdc-text-field--filled .mdc-text-field__ripple::after{background-color:rgba(0, 0, 0, 0.87);background-color:var(--mdc-ripple-color, rgba(0, 0, 0, 0.87))}.mdc-text-field--filled:hover .mdc-text-field__ripple::before,.mdc-text-field--filled.mdc-ripple-surface--hover .mdc-text-field__ripple::before{opacity:0.04;opacity:var(--mdc-ripple-hover-opacity, 0.04)}.mdc-text-field--filled.mdc-ripple-upgraded--background-focused .mdc-text-field__ripple::before,.mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms;opacity:0.12;opacity:var(--mdc-ripple-focus-opacity, 0.12)}.mdc-text-field--filled::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:whitesmoke}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:rgba(0, 0, 0, 0.42)}.mdc-text-field--filled:not(.mdc-text-field--disabled):hover .mdc-line-ripple::before{border-bottom-color:rgba(0, 0, 0, 0.87)}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-color:#6200ee;border-bottom-color:var(--mdc-theme-primary, #6200ee)}.mdc-text-field--filled .mdc-floating-label{left:16px;right:initial}[dir=rtl] .mdc-text-field--filled .mdc-floating-label,.mdc-text-field--filled .mdc-floating-label[dir=rtl]{left:initial;right:16px}.mdc-text-field--filled .mdc-floating-label--float-above{-webkit-transform:translateY(-106%) scale(0.75);transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled.mdc-text-field--no-label::before{display:none}@supports(-webkit-hyphens: none){.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__affix{align-items:center;align-self:center;display:inline-flex;height:100%}}.mdc-text-field--outlined{height:56px;overflow:visible}.mdc-text-field--outlined .mdc-floating-label--float-above{-webkit-transform:translateY(-37.25px) scale(1);transform:translateY(-37.25px) scale(1)}.mdc-text-field--outlined .mdc-floating-label--float-above{font-size:.75rem}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{-webkit-transform:translateY(-34.75px) scale(0.75);transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-text-field--outlined .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-text-field-outlined 250ms 1;animation:mdc-floating-label-shake-float-above-text-field-outlined 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-text-field-outlined{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-text-field-outlined{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-34.75px) scale(0.75)}}.mdc-text-field--outlined .mdc-text-field__input{height:100%}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:rgba(0, 0, 0, 0.38)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__leading,.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__notch,.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__trailing{border-color:rgba(0, 0, 0, 0.87)}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading,.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch,.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border-color:#6200ee;border-color:var(--mdc-theme-primary, #6200ee)}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{border-top-left-radius:4px;border-top-left-radius:var(--mdc-shape-small, 4px);border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-bottom-left-radius:var(--mdc-shape-small, 4px)}[dir=rtl] .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading,.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading[dir=rtl]{border-top-left-radius:0;border-top-right-radius:4px;border-top-right-radius:var(--mdc-shape-small, 4px);border-bottom-right-radius:4px;border-bottom-right-radius:var(--mdc-shape-small, 4px);border-bottom-left-radius:0}@supports(top: max(0%)){.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px, var(--mdc-shape-small, 4px))}}@supports(top: max(0%)){.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:calc(100% - max(12px, var(--mdc-shape-small, 4px)) * 2)}}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing{border-top-left-radius:0;border-top-right-radius:4px;border-top-right-radius:var(--mdc-shape-small, 4px);border-bottom-right-radius:4px;border-bottom-right-radius:var(--mdc-shape-small, 4px);border-bottom-left-radius:0}[dir=rtl] .mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing,.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__trailing[dir=rtl]{border-top-left-radius:4px;border-top-left-radius:var(--mdc-shape-small, 4px);border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-bottom-left-radius:var(--mdc-shape-small, 4px)}@supports(top: max(0%)){.mdc-text-field--outlined{padding-left:max(16px, calc(var(--mdc-shape-small, 4px) + 4px))}}@supports(top: max(0%)){.mdc-text-field--outlined{padding-right:max(16px, var(--mdc-shape-small, 4px))}}@supports(top: max(0%)){.mdc-text-field--outlined+.mdc-text-field-helper-line{padding-left:max(16px, calc(var(--mdc-shape-small, 4px) + 4px))}}@supports(top: max(0%)){.mdc-text-field--outlined+.mdc-text-field-helper-line{padding-right:max(16px, var(--mdc-shape-small, 4px))}}.mdc-text-field--outlined.mdc-text-field--with-leading-icon{padding-left:0}@supports(top: max(0%)){.mdc-text-field--outlined.mdc-text-field--with-leading-icon{padding-right:max(16px, var(--mdc-shape-small, 4px))}}[dir=rtl] .mdc-text-field--outlined.mdc-text-field--with-leading-icon,.mdc-text-field--outlined.mdc-text-field--with-leading-icon[dir=rtl]{padding-right:0}@supports(top: max(0%)){[dir=rtl] .mdc-text-field--outlined.mdc-text-field--with-leading-icon,.mdc-text-field--outlined.mdc-text-field--with-leading-icon[dir=rtl]{padding-left:max(16px, var(--mdc-shape-small, 4px))}}.mdc-text-field--outlined.mdc-text-field--with-trailing-icon{padding-right:0}@supports(top: max(0%)){.mdc-text-field--outlined.mdc-text-field--with-trailing-icon{padding-left:max(16px, calc(var(--mdc-shape-small, 4px) + 4px))}}[dir=rtl] .mdc-text-field--outlined.mdc-text-field--with-trailing-icon,.mdc-text-field--outlined.mdc-text-field--with-trailing-icon[dir=rtl]{padding-left:0}@supports(top: max(0%)){[dir=rtl] .mdc-text-field--outlined.mdc-text-field--with-trailing-icon,.mdc-text-field--outlined.mdc-text-field--with-trailing-icon[dir=rtl]{padding-right:max(16px, calc(var(--mdc-shape-small, 4px) + 4px))}}.mdc-text-field--outlined.mdc-text-field--with-leading-icon.mdc-text-field--with-trailing-icon{padding-left:0;padding-right:0}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--outlined .mdc-text-field__ripple::before,.mdc-text-field--outlined .mdc-text-field__ripple::after{content:none}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:initial}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label,.mdc-text-field--outlined .mdc-floating-label[dir=rtl]{left:initial;right:4px}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:transparent}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mdc-text-field--textarea{flex-direction:column;align-items:center;width:auto;height:auto;padding:0;transition:none}.mdc-text-field--textarea .mdc-floating-label{top:19px}.mdc-text-field--textarea .mdc-floating-label:not(.mdc-floating-label--float-above){-webkit-transform:none;transform:none}.mdc-text-field--textarea .mdc-text-field__input{flex-grow:1;height:auto;min-height:1.5rem;overflow-x:hidden;overflow-y:auto;box-sizing:border-box;resize:none;padding:0 16px;line-height:1.5rem}.mdc-text-field--textarea.mdc-text-field--filled::before{display:none}.mdc-text-field--textarea.mdc-text-field--filled .mdc-floating-label--float-above{-webkit-transform:translateY(-10.25px) scale(0.75);transform:translateY(-10.25px) scale(0.75)}.mdc-text-field--textarea.mdc-text-field--filled .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-textarea-filled 250ms 1;animation:mdc-floating-label-shake-float-above-textarea-filled 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-textarea-filled{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-10.25px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-10.25px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-10.25px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-10.25px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-textarea-filled{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-10.25px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-10.25px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-10.25px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-10.25px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-10.25px) scale(0.75)}}.mdc-text-field--textarea.mdc-text-field--filled .mdc-text-field__input{margin-top:23px;margin-bottom:9px}.mdc-text-field--textarea.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{margin-top:16px;margin-bottom:16px}.mdc-text-field--textarea.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:0}.mdc-text-field--textarea.mdc-text-field--outlined .mdc-floating-label--float-above{-webkit-transform:translateY(-27.25px) scale(1);transform:translateY(-27.25px) scale(1)}.mdc-text-field--textarea.mdc-text-field--outlined .mdc-floating-label--float-above{font-size:.75rem}.mdc-text-field--textarea.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--textarea.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{-webkit-transform:translateY(-24.75px) scale(0.75);transform:translateY(-24.75px) scale(0.75)}.mdc-text-field--textarea.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--textarea.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-text-field--textarea.mdc-text-field--outlined .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-textarea-outlined 250ms 1;animation:mdc-floating-label-shake-float-above-textarea-outlined 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-textarea-outlined{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-textarea-outlined{0%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(4% - 0%)) translateY(-24.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(-4% - 0%)) translateY(-24.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75);transform:translateX(calc(0 - 0%)) translateY(-24.75px) scale(0.75)}}.mdc-text-field--textarea.mdc-text-field--outlined .mdc-text-field__input{margin-top:16px;margin-bottom:16px}.mdc-text-field--textarea.mdc-text-field--outlined .mdc-floating-label{top:18px}.mdc-text-field--textarea.mdc-text-field--with-internal-counter .mdc-text-field__input{margin-bottom:2px}.mdc-text-field--textarea.mdc-text-field--with-internal-counter .mdc-text-field-character-counter{align-self:flex-end;padding:0 16px}.mdc-text-field--textarea.mdc-text-field--with-internal-counter .mdc-text-field-character-counter::after{display:inline-block;width:0;height:16px;content:"";vertical-align:-16px}.mdc-text-field--textarea.mdc-text-field--with-internal-counter .mdc-text-field-character-counter::before{display:none}.mdc-text-field__resizer{align-self:stretch;display:inline-flex;flex-direction:column;flex-grow:1;max-height:100%;max-width:100%;min-height:56px;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;min-width:-moz-available;min-width:-webkit-fill-available;overflow:hidden;resize:both}.mdc-text-field--filled .mdc-text-field__resizer{-webkit-transform:translateY(-1px);transform:translateY(-1px)}.mdc-text-field--filled .mdc-text-field__resizer .mdc-text-field__input,.mdc-text-field--filled .mdc-text-field__resizer .mdc-text-field-character-counter{-webkit-transform:translateY(1px);transform:translateY(1px)}.mdc-text-field--outlined .mdc-text-field__resizer{-webkit-transform:translateX(-1px) translateY(-1px);transform:translateX(-1px) translateY(-1px)}[dir=rtl] .mdc-text-field--outlined .mdc-text-field__resizer,.mdc-text-field--outlined .mdc-text-field__resizer[dir=rtl]{-webkit-transform:translateX(1px) translateY(-1px);transform:translateX(1px) translateY(-1px)}.mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field__input,.mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field-character-counter{-webkit-transform:translateX(1px) translateY(1px);transform:translateX(1px) translateY(1px)}[dir=rtl] .mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field__input,[dir=rtl] .mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field-character-counter,.mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field__input[dir=rtl],.mdc-text-field--outlined .mdc-text-field__resizer .mdc-text-field-character-counter[dir=rtl]{-webkit-transform:translateX(-1px) translateY(1px);transform:translateX(-1px) translateY(1px)}.mdc-text-field--with-leading-icon{padding-left:0;padding-right:16px}[dir=rtl] .mdc-text-field--with-leading-icon,.mdc-text-field--with-leading-icon[dir=rtl]{padding-left:16px;padding-right:0}.mdc-text-field--with-leading-icon.mdc-text-field--filled .mdc-floating-label{max-width:calc(100% - 48px);left:48px;right:initial}[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--filled .mdc-floating-label,.mdc-text-field--with-leading-icon.mdc-text-field--filled .mdc-floating-label[dir=rtl]{left:initial;right:48px}.mdc-text-field--with-leading-icon.mdc-text-field--filled .mdc-floating-label--float-above{max-width:calc(100% / 0.75 - 64px / 0.75)}.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label{left:36px;right:initial}[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label,.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label[dir=rtl]{left:initial;right:36px}.mdc-text-field--with-leading-icon.mdc-text-field--outlined :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--float-above{-webkit-transform:translateY(-37.25px) translateX(-32px) scale(1);transform:translateY(-37.25px) translateX(-32px) scale(1)}[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--float-above,.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--float-above[dir=rtl]{-webkit-transform:translateY(-37.25px) translateX(32px) scale(1);transform:translateY(-37.25px) translateX(32px) scale(1)}.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--float-above{font-size:.75rem}.mdc-text-field--with-leading-icon.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{-webkit-transform:translateY(-34.75px) translateX(-32px) scale(0.75);transform:translateY(-34.75px) translateX(-32px) scale(0.75)}[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--with-leading-icon.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above[dir=rtl],.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above[dir=rtl]{-webkit-transform:translateY(-34.75px) translateX(32px) scale(0.75);transform:translateY(-34.75px) translateX(32px) scale(0.75)}.mdc-text-field--with-leading-icon.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-text-field-outlined-leading-icon 250ms 1;animation:mdc-floating-label-shake-float-above-text-field-outlined-leading-icon 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-text-field-outlined-leading-icon{0%{-webkit-transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-text-field-outlined-leading-icon{0%{-webkit-transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - 32px)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - 32px)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - 32px)) translateY(-34.75px) scale(0.75)}}[dir=rtl] .mdc-text-field--with-leading-icon.mdc-text-field--outlined .mdc-floating-label--shake,.mdc-text-field--with-leading-icon.mdc-text-field--outlined[dir=rtl] .mdc-floating-label--shake{-webkit-animation:mdc-floating-label-shake-float-above-text-field-outlined-leading-icon 250ms 1;animation:mdc-floating-label-shake-float-above-text-field-outlined-leading-icon 250ms 1}@-webkit-keyframes mdc-floating-label-shake-float-above-text-field-outlined-leading-icon-rtl{0%{-webkit-transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75)}}@keyframes mdc-floating-label-shake-float-above-text-field-outlined-leading-icon-rtl{0%{-webkit-transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75)}33%{-webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);-webkit-transform:translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(4% - -32px)) translateY(-34.75px) scale(0.75)}66%{-webkit-animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);-webkit-transform:translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(-4% - -32px)) translateY(-34.75px) scale(0.75)}100%{-webkit-transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75);transform:translateX(calc(0 - -32px)) translateY(-34.75px) scale(0.75)}}.mdc-text-field--with-trailing-icon{padding-left:16px;padding-right:0}[dir=rtl] .mdc-text-field--with-trailing-icon,.mdc-text-field--with-trailing-icon[dir=rtl]{padding-left:0;padding-right:16px}.mdc-text-field--with-trailing-icon.mdc-text-field--filled .mdc-floating-label{max-width:calc(100% - 64px)}.mdc-text-field--with-trailing-icon.mdc-text-field--filled .mdc-floating-label--float-above{max-width:calc(100% / 0.75 - 64px / 0.75)}.mdc-text-field--with-trailing-icon.mdc-text-field--outlined :not(.mdc-notched-outline--notched) .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mdc-text-field--with-leading-icon.mdc-text-field--with-trailing-icon{padding-left:0;padding-right:0}.mdc-text-field--with-leading-icon.mdc-text-field--with-trailing-icon.mdc-text-field--filled .mdc-floating-label{max-width:calc(100% - 96px)}.mdc-text-field--with-leading-icon.mdc-text-field--with-trailing-icon.mdc-text-field--filled .mdc-floating-label--float-above{max-width:calc(100% / 0.75 - 96px / 0.75)}.mdc-text-field-helper-line{display:flex;justify-content:space-between;box-sizing:border-box}.mdc-text-field+.mdc-text-field-helper-line{padding-right:16px;padding-left:16px}.mdc-form-field>.mdc-text-field+label{align-self:flex-start}.mdc-text-field--focused:not(.mdc-text-field--disabled) .mdc-floating-label{color:rgba(98, 0, 238, 0.87)}.mdc-text-field--focused .mdc-notched-outline__leading,.mdc-text-field--focused .mdc-notched-outline__notch,.mdc-text-field--focused .mdc-notched-outline__trailing{border-width:2px}.mdc-text-field--focused+.mdc-text-field-helper-line .mdc-text-field-helper-text:not(.mdc-text-field-helper-text--validation-msg){opacity:1}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-text-field--focused.mdc-text-field--outlined.mdc-text-field--textarea .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:0}.mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-line-ripple::before{border-bottom-color:#b00020;border-bottom-color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:#b00020;border-bottom-color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-floating-label{color:#b00020;color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid:not(.mdc-text-field--disabled).mdc-text-field--invalid+.mdc-text-field-helper-line .mdc-text-field-helper-text--validation-msg{color:#b00020;color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid .mdc-text-field__input{caret-color:#b00020;caret-color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__icon--trailing{color:#b00020;color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:#b00020;border-bottom-color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:#b00020;border-color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__leading,.mdc-text-field--invalid:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__notch,.mdc-text-field--invalid:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-notched-outline .mdc-notched-outline__trailing{border-color:#b00020;border-color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading,.mdc-text-field--invalid:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch,.mdc-text-field--invalid:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border-color:#b00020;border-color:var(--mdc-theme-error, #b00020)}.mdc-text-field--invalid+.mdc-text-field-helper-line .mdc-text-field-helper-text--validation-msg{opacity:1}.mdc-text-field--disabled{pointer-events:none}.mdc-text-field--disabled .mdc-text-field__input{color:rgba(0, 0, 0, 0.38)}@media all{.mdc-text-field--disabled .mdc-text-field__input::-webkit-input-placeholder{color:rgba(0, 0, 0, 0.38)}.mdc-text-field--disabled .mdc-text-field__input:-ms-input-placeholder{color:rgba(0, 0, 0, 0.38)}.mdc-text-field--disabled .mdc-text-field__input::-ms-input-placeholder{color:rgba(0, 0, 0, 0.38)}.mdc-text-field--disabled .mdc-text-field__input::placeholder{color:rgba(0, 0, 0, 0.38)}}@media all{.mdc-text-field--disabled .mdc-text-field__input:-ms-input-placeholder{color:rgba(0, 0, 0, 0.38)}}.mdc-text-field--disabled .mdc-floating-label{color:rgba(0, 0, 0, 0.38)}.mdc-text-field--disabled+.mdc-text-field-helper-line .mdc-text-field-helper-text{color:rgba(0, 0, 0, 0.38)}.mdc-text-field--disabled .mdc-text-field-character-counter,.mdc-text-field--disabled+.mdc-text-field-helper-line .mdc-text-field-character-counter{color:rgba(0, 0, 0, 0.38)}.mdc-text-field--disabled .mdc-text-field__icon--leading{color:rgba(0, 0, 0, 0.3)}.mdc-text-field--disabled .mdc-text-field__icon--trailing{color:rgba(0, 0, 0, 0.3)}.mdc-text-field--disabled .mdc-text-field__affix--prefix{color:rgba(0, 0, 0, 0.38)}.mdc-text-field--disabled .mdc-text-field__affix--suffix{color:rgba(0, 0, 0, 0.38)}.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:rgba(0, 0, 0, 0.06)}.mdc-text-field--disabled .mdc-notched-outline__leading,.mdc-text-field--disabled .mdc-notched-outline__notch,.mdc-text-field--disabled .mdc-notched-outline__trailing{border-color:rgba(0, 0, 0, 0.06)}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-text-field__input::-webkit-input-placeholder{color:GrayText}.mdc-text-field--disabled .mdc-text-field__input:-ms-input-placeholder{color:GrayText}.mdc-text-field--disabled .mdc-text-field__input::-ms-input-placeholder{color:GrayText}.mdc-text-field--disabled .mdc-text-field__input::placeholder{color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-text-field__input:-ms-input-placeholder{color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-floating-label{color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled+.mdc-text-field-helper-line .mdc-text-field-helper-text{color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-text-field-character-counter,.mdc-text-field--disabled+.mdc-text-field-helper-line .mdc-text-field-character-counter{color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-text-field__icon--leading{color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-text-field__icon--trailing{color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-text-field__affix--prefix{color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-text-field__affix--suffix{color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:GrayText}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-text-field--disabled .mdc-notched-outline__leading,.mdc-text-field--disabled .mdc-notched-outline__notch,.mdc-text-field--disabled .mdc-notched-outline__trailing{border-color:GrayText}}@media screen and (forced-colors: active){.mdc-text-field--disabled .mdc-text-field__input{background-color:Window}.mdc-text-field--disabled .mdc-floating-label{z-index:1}}.mdc-text-field--disabled .mdc-floating-label{cursor:default}.mdc-text-field--disabled.mdc-text-field--filled{background-color:#fafafa}.mdc-text-field--disabled.mdc-text-field--filled .mdc-text-field__ripple{display:none}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--end-aligned .mdc-text-field__input{text-align:right}[dir=rtl] .mdc-text-field--end-aligned .mdc-text-field__input,.mdc-text-field--end-aligned .mdc-text-field__input[dir=rtl]{text-align:left}[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__input,[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix,.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__input,.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix{direction:ltr}[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix--prefix,.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix--prefix{padding-left:0;padding-right:2px}[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix--suffix,.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix--suffix{padding-left:12px;padding-right:0}[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__icon--leading,.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__icon--leading{order:1}[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix--suffix,.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix--suffix{order:2}[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__input,.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__input{order:3}[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__affix--prefix,.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__affix--prefix{order:4}[dir=rtl] .mdc-text-field--ltr-text .mdc-text-field__icon--trailing,.mdc-text-field--ltr-text[dir=rtl] .mdc-text-field__icon--trailing{order:5}[dir=rtl] .mdc-text-field--ltr-text.mdc-text-field--end-aligned .mdc-text-field__input,.mdc-text-field--ltr-text.mdc-text-field--end-aligned[dir=rtl] .mdc-text-field__input{text-align:right}[dir=rtl] .mdc-text-field--ltr-text.mdc-text-field--end-aligned .mdc-text-field__affix--prefix,.mdc-text-field--ltr-text.mdc-text-field--end-aligned[dir=rtl] .mdc-text-field__affix--prefix{padding-right:12px}[dir=rtl] .mdc-text-field--ltr-text.mdc-text-field--end-aligned .mdc-text-field__affix--suffix,.mdc-text-field--ltr-text.mdc-text-field--end-aligned[dir=rtl] .mdc-text-field__affix--suffix{padding-left:2px}.mdc-text-field-helper-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.75rem;font-size:var(--mdc-typography-caption-font-size, 0.75rem);line-height:1.25rem;line-height:var(--mdc-typography-caption-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:0.0333333333em;letter-spacing:var(--mdc-typography-caption-letter-spacing, 0.0333333333em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-caption-text-transform, inherit);display:block;margin-top:0;line-height:normal;margin:0;opacity:0;will-change:opacity;transition:opacity 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-text-field-helper-text::before{display:inline-block;width:0;height:16px;content:"";vertical-align:0}.mdc-text-field-helper-text--persistent{transition:none;opacity:1;will-change:initial}.mdc-text-field-character-counter{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.75rem;font-size:var(--mdc-typography-caption-font-size, 0.75rem);line-height:1.25rem;line-height:var(--mdc-typography-caption-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:0.0333333333em;letter-spacing:var(--mdc-typography-caption-letter-spacing, 0.0333333333em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-caption-text-transform, inherit);display:block;margin-top:0;line-height:normal;margin-left:auto;margin-right:0;padding-left:16px;padding-right:0;white-space:nowrap}.mdc-text-field-character-counter::before{display:inline-block;width:0;height:16px;content:"";vertical-align:0}[dir=rtl] .mdc-text-field-character-counter,.mdc-text-field-character-counter[dir=rtl]{margin-left:0;margin-right:auto}[dir=rtl] .mdc-text-field-character-counter,.mdc-text-field-character-counter[dir=rtl]{padding-left:0;padding-right:16px}.mdc-text-field__icon{align-self:center;cursor:pointer}.mdc-text-field__icon:not([tabindex]),.mdc-text-field__icon[tabindex="-1"]{cursor:default;pointer-events:none}.mdc-text-field__icon svg{display:block}.mdc-text-field__icon--leading{margin-left:16px;margin-right:8px}[dir=rtl] .mdc-text-field__icon--leading,.mdc-text-field__icon--leading[dir=rtl]{margin-left:8px;margin-right:16px}.mdc-text-field__icon--trailing{padding:12px;margin-left:0px;margin-right:0px}[dir=rtl] .mdc-text-field__icon--trailing,.mdc-text-field__icon--trailing[dir=rtl]{margin-left:0px;margin-right:0px}:root{--mdc-theme-primary:#6200ee;--mdc-theme-secondary:#018786;--mdc-theme-background:#fff;--mdc-theme-surface:#fff;--mdc-theme-error:#b00020;--mdc-theme-on-primary:#fff;--mdc-theme-on-secondary:#fff;--mdc-theme-on-surface:#000;--mdc-theme-on-error:#fff;--mdc-theme-text-primary-on-background:rgba(0, 0, 0, 0.87);--mdc-theme-text-secondary-on-background:rgba(0, 0, 0, 0.54);--mdc-theme-text-hint-on-background:rgba(0, 0, 0, 0.38);--mdc-theme-text-disabled-on-background:rgba(0, 0, 0, 0.38);--mdc-theme-text-icon-on-background:rgba(0, 0, 0, 0.38);--mdc-theme-text-primary-on-light:rgba(0, 0, 0, 0.87);--mdc-theme-text-secondary-on-light:rgba(0, 0, 0, 0.54);--mdc-theme-text-hint-on-light:rgba(0, 0, 0, 0.38);--mdc-theme-text-disabled-on-light:rgba(0, 0, 0, 0.38);--mdc-theme-text-icon-on-light:rgba(0, 0, 0, 0.38);--mdc-theme-text-primary-on-dark:white;--mdc-theme-text-secondary-on-dark:rgba(255, 255, 255, 0.7);--mdc-theme-text-hint-on-dark:rgba(255, 255, 255, 0.5);--mdc-theme-text-disabled-on-dark:rgba(255, 255, 255, 0.5);--mdc-theme-text-icon-on-dark:rgba(255, 255, 255, 0.5)}.mdc-theme--primary{color:#6200ee !important;color:var(--mdc-theme-primary, #6200ee) !important}.mdc-theme--secondary{color:#018786 !important;color:var(--mdc-theme-secondary, #018786) !important}.mdc-theme--background{background-color:#fff;background-color:var(--mdc-theme-background, #fff)}.mdc-theme--surface{background-color:#fff;background-color:var(--mdc-theme-surface, #fff)}.mdc-theme--error{color:#b00020 !important;color:var(--mdc-theme-error, #b00020) !important}.mdc-theme--on-primary{color:#fff !important;color:var(--mdc-theme-on-primary, #fff) !important}.mdc-theme--on-secondary{color:#fff !important;color:var(--mdc-theme-on-secondary, #fff) !important}.mdc-theme--on-surface{color:#000 !important;color:var(--mdc-theme-on-surface, #000) !important}.mdc-theme--on-error{color:#fff !important;color:var(--mdc-theme-on-error, #fff) !important}.mdc-theme--text-primary-on-background{color:rgba(0, 0, 0, 0.87) !important;color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)) !important}.mdc-theme--text-secondary-on-background{color:rgba(0, 0, 0, 0.54) !important;color:var(--mdc-theme-text-secondary-on-background, rgba(0, 0, 0, 0.54)) !important}.mdc-theme--text-hint-on-background{color:rgba(0, 0, 0, 0.38) !important;color:var(--mdc-theme-text-hint-on-background, rgba(0, 0, 0, 0.38)) !important}.mdc-theme--text-disabled-on-background{color:rgba(0, 0, 0, 0.38) !important;color:var(--mdc-theme-text-disabled-on-background, rgba(0, 0, 0, 0.38)) !important}.mdc-theme--text-icon-on-background{color:rgba(0, 0, 0, 0.38) !important;color:var(--mdc-theme-text-icon-on-background, rgba(0, 0, 0, 0.38)) !important}.mdc-theme--text-primary-on-light{color:rgba(0, 0, 0, 0.87) !important;color:var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)) !important}.mdc-theme--text-secondary-on-light{color:rgba(0, 0, 0, 0.54) !important;color:var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)) !important}.mdc-theme--text-hint-on-light{color:rgba(0, 0, 0, 0.38) !important;color:var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38)) !important}.mdc-theme--text-disabled-on-light{color:rgba(0, 0, 0, 0.38) !important;color:var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38)) !important}.mdc-theme--text-icon-on-light{color:rgba(0, 0, 0, 0.38) !important;color:var(--mdc-theme-text-icon-on-light, rgba(0, 0, 0, 0.38)) !important}.mdc-theme--text-primary-on-dark{color:white !important;color:var(--mdc-theme-text-primary-on-dark, white) !important}.mdc-theme--text-secondary-on-dark{color:rgba(255, 255, 255, 0.7) !important;color:var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)) !important}.mdc-theme--text-hint-on-dark{color:rgba(255, 255, 255, 0.5) !important;color:var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)) !important}.mdc-theme--text-disabled-on-dark{color:rgba(255, 255, 255, 0.5) !important;color:var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5)) !important}.mdc-theme--text-icon-on-dark{color:rgba(255, 255, 255, 0.5) !important;color:var(--mdc-theme-text-icon-on-dark, rgba(255, 255, 255, 0.5)) !important}.mdc-theme--primary-bg{background-color:#6200ee !important;background-color:var(--mdc-theme-primary, #6200ee) !important}.mdc-theme--secondary-bg{background-color:#018786 !important;background-color:var(--mdc-theme-secondary, #018786) !important}.mdc-tooltip__surface{border-radius:4px;border-radius:var(--mdc-shape-small, 4px)}.mdc-tooltip__caret-surface-top,.mdc-tooltip__caret-surface-bottom{border-radius:4px;border-radius:var(--mdc-shape-small, 4px)}.mdc-tooltip__surface{color:white;color:var(--mdc-theme-text-primary-on-dark, white)}.mdc-tooltip__surface{background-color:rgba(0, 0, 0, 0.6)}.mdc-tooltip__surface{word-break:break-all;word-break:var(--mdc-tooltip-word-break, normal);overflow-wrap:anywhere}.mdc-tooltip{z-index:9}.mdc-tooltip--showing-transition .mdc-tooltip__surface-animation{transition:opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 150ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1),-webkit-transform 150ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-tooltip--hide-transition .mdc-tooltip__surface-animation{transition:opacity 75ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-tooltip__title{color:rgba(0, 0, 0, 0.87);color:var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87))}.mdc-tooltip__content{color:rgba(0, 0, 0, 0.6)}.mdc-tooltip__content-link{color:#6200ee;color:var(--mdc-theme-primary, #6200ee)}.mdc-tooltip{position:fixed;display:none}.mdc-tooltip.mdc-tooltip--rich .mdc-tooltip__surface{background-color:#fff}.mdc-tooltip.mdc-tooltip--rich .mdc-tooltip__caret-surface-top,.mdc-tooltip.mdc-tooltip--rich .mdc-tooltip__caret-surface-bottom{background-color:#fff}.mdc-tooltip-wrapper--rich{position:relative}.mdc-tooltip--shown,.mdc-tooltip--showing,.mdc-tooltip--hide{display:inline-flex}.mdc-tooltip--shown.mdc-tooltip--rich,.mdc-tooltip--showing.mdc-tooltip--rich,.mdc-tooltip--hide.mdc-tooltip--rich{display:inline-block;left:-320px;position:absolute}.mdc-tooltip__surface{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.75rem;font-size:var(--mdc-typography-caption-font-size, 0.75rem);font-weight:400;font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:0.0333333333em;letter-spacing:var(--mdc-typography-caption-letter-spacing, 0.0333333333em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-caption-text-transform, inherit);line-height:16px;padding:4px 8px;min-width:40px;max-width:200px;min-height:24px;max-height:40vh;box-sizing:border-box;overflow:hidden;text-align:center}.mdc-tooltip__surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid transparent;border-radius:inherit;content:"";pointer-events:none}.mdc-tooltip--rich .mdc-tooltip__surface{box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0,0,0,.12);align-items:flex-start;border-radius:4px;display:flex;flex-direction:column;line-height:20px;min-height:24px;min-width:40px;max-width:320px;position:relative}.mdc-tooltip--rich .mdc-tooltip__surface .mdc-elevation-overlay{width:100%;height:100%;top:0;left:0}.mdc-tooltip--multiline .mdc-tooltip__surface{text-align:left}[dir=rtl] .mdc-tooltip--multiline .mdc-tooltip__surface,.mdc-tooltip--multiline .mdc-tooltip__surface[dir=rtl]{text-align:right}.mdc-tooltip__surface .mdc-tooltip__title{display:block;margin-top:0;line-height:normal;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-subtitle2-font-size, 0.875rem);font-weight:500;font-weight:var(--mdc-typography-subtitle2-font-weight, 500);letter-spacing:0.0071428571em;letter-spacing:var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle2-text-transform, inherit);margin:0 8px}.mdc-tooltip__surface .mdc-tooltip__title::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-tooltip__surface .mdc-tooltip__content{display:block;margin-top:0;line-height:normal;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit);max-width:calc(100% - 2 * 8px);margin:0 8px 16px 8px;text-align:left}.mdc-tooltip__surface .mdc-tooltip__content::before{display:inline-block;width:0;height:24px;content:"";vertical-align:0}[dir=rtl] .mdc-tooltip__surface .mdc-tooltip__content,.mdc-tooltip__surface .mdc-tooltip__content[dir=rtl]{text-align:right}.mdc-tooltip__surface .mdc-tooltip__content-link{text-decoration:none}.mdc-tooltip__surface-animation{opacity:0;-webkit-transform:scale(0.8);transform:scale(0.8);will-change:transform,opacity}.mdc-tooltip--shown .mdc-tooltip__surface-animation{-webkit-transform:scale(1);transform:scale(1);opacity:1}.mdc-tooltip--hide .mdc-tooltip__surface-animation{-webkit-transform:scale(1);transform:scale(1)}.mdc-tooltip__caret-surface-top,.mdc-tooltip__caret-surface-bottom{position:absolute;height:24px;width:24px;-webkit-transform:rotate(35deg) skewY(20deg) scaleX(0.9396926208);transform:rotate(35deg) skewY(20deg) scaleX(0.9396926208)}.mdc-tooltip__caret-surface-top .mdc-elevation-overlay,.mdc-tooltip__caret-surface-bottom .mdc-elevation-overlay{width:100%;height:100%;top:0;left:0}.mdc-tooltip__caret-surface-bottom{box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0,0,0,.12);outline:1px solid transparent;z-index:-1}.mdc-top-app-bar{background-color:#6200ee;background-color:var(--mdc-theme-primary, #6200ee);color:white;display:flex;position:fixed;flex-direction:column;justify-content:space-between;box-sizing:border-box;width:100%;z-index:4}.mdc-top-app-bar .mdc-top-app-bar__action-item,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon{color:#fff;color:var(--mdc-theme-on-primary, #fff)}.mdc-top-app-bar .mdc-top-app-bar__action-item::before,.mdc-top-app-bar .mdc-top-app-bar__action-item::after,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon::before,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon::after{background-color:#fff;background-color:var(--mdc-ripple-color, var(--mdc-theme-on-primary, #fff))}.mdc-top-app-bar .mdc-top-app-bar__action-item:hover::before,.mdc-top-app-bar .mdc-top-app-bar__action-item.mdc-ripple-surface--hover::before,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon:hover::before,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon.mdc-ripple-surface--hover::before{opacity:0.08;opacity:var(--mdc-ripple-hover-opacity, 0.08)}.mdc-top-app-bar .mdc-top-app-bar__action-item.mdc-ripple-upgraded--background-focused::before,.mdc-top-app-bar .mdc-top-app-bar__action-item:not(.mdc-ripple-upgraded):focus::before,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon.mdc-ripple-upgraded--background-focused::before,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon:not(.mdc-ripple-upgraded):focus::before{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-focus-opacity, 0.24)}.mdc-top-app-bar .mdc-top-app-bar__action-item:not(.mdc-ripple-upgraded)::after,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon:not(.mdc-ripple-upgraded)::after{transition:opacity 150ms linear}.mdc-top-app-bar .mdc-top-app-bar__action-item:not(.mdc-ripple-upgraded):active::after,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon:not(.mdc-ripple-upgraded):active::after{transition-duration:75ms;opacity:0.24;opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-top-app-bar .mdc-top-app-bar__action-item.mdc-ripple-upgraded,.mdc-top-app-bar .mdc-top-app-bar__navigation-icon.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.24)}.mdc-top-app-bar__row{display:flex;position:relative;box-sizing:border-box;width:100%;height:64px}.mdc-top-app-bar__section{display:inline-flex;flex:1 1 auto;align-items:center;min-width:0;padding:8px 12px;z-index:1}.mdc-top-app-bar__section--align-start{justify-content:flex-start;order:-1}.mdc-top-app-bar__section--align-end{justify-content:flex-end;order:1}.mdc-top-app-bar__title{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1.25rem;font-size:var(--mdc-typography-headline6-font-size, 1.25rem);line-height:2rem;line-height:var(--mdc-typography-headline6-line-height, 2rem);font-weight:500;font-weight:var(--mdc-typography-headline6-font-weight, 500);letter-spacing:0.0125em;letter-spacing:var(--mdc-typography-headline6-letter-spacing, 0.0125em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-headline6-text-transform, inherit);padding-left:20px;padding-right:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;z-index:1}[dir=rtl] .mdc-top-app-bar__title,.mdc-top-app-bar__title[dir=rtl]{padding-left:0;padding-right:20px}.mdc-top-app-bar--short-collapsed{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:24px;border-bottom-left-radius:0}[dir=rtl] .mdc-top-app-bar--short-collapsed,.mdc-top-app-bar--short-collapsed[dir=rtl]{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:24px}.mdc-top-app-bar--short{top:0;right:auto;left:0;width:100%;transition:width 250ms cubic-bezier(0.4, 0, 0.2, 1)}[dir=rtl] .mdc-top-app-bar--short,.mdc-top-app-bar--short[dir=rtl]{right:0;left:auto}.mdc-top-app-bar--short .mdc-top-app-bar__row{height:56px}.mdc-top-app-bar--short .mdc-top-app-bar__section{padding:4px}.mdc-top-app-bar--short .mdc-top-app-bar__title{transition:opacity 200ms cubic-bezier(0.4, 0, 0.2, 1);opacity:1}.mdc-top-app-bar--short-collapsed{box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0,0,0,.12);width:56px;transition:width 300ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-top-app-bar--short-collapsed .mdc-top-app-bar__title{display:none}.mdc-top-app-bar--short-collapsed .mdc-top-app-bar__action-item{transition:padding 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-top-app-bar--short-collapsed.mdc-top-app-bar--short-has-action-item{width:112px}.mdc-top-app-bar--short-collapsed.mdc-top-app-bar--short-has-action-item .mdc-top-app-bar__section--align-end{padding-left:0;padding-right:12px}[dir=rtl] .mdc-top-app-bar--short-collapsed.mdc-top-app-bar--short-has-action-item .mdc-top-app-bar__section--align-end,.mdc-top-app-bar--short-collapsed.mdc-top-app-bar--short-has-action-item .mdc-top-app-bar__section--align-end[dir=rtl]{padding-left:12px;padding-right:0}.mdc-top-app-bar--dense .mdc-top-app-bar__row{height:48px}.mdc-top-app-bar--dense .mdc-top-app-bar__section{padding:0 4px}.mdc-top-app-bar--dense .mdc-top-app-bar__title{padding-left:12px;padding-right:0}[dir=rtl] .mdc-top-app-bar--dense .mdc-top-app-bar__title,.mdc-top-app-bar--dense .mdc-top-app-bar__title[dir=rtl]{padding-left:0;padding-right:12px}.mdc-top-app-bar--prominent .mdc-top-app-bar__row{height:128px}.mdc-top-app-bar--prominent .mdc-top-app-bar__title{align-self:flex-end;padding-bottom:2px}.mdc-top-app-bar--prominent .mdc-top-app-bar__action-item,.mdc-top-app-bar--prominent .mdc-top-app-bar__navigation-icon{align-self:flex-start}.mdc-top-app-bar--fixed{transition:box-shadow 200ms linear}.mdc-top-app-bar--fixed-scrolled{box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0,0,0,.12);transition:box-shadow 200ms linear}.mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__row{height:96px}.mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__section{padding:0 12px}.mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__title{padding-left:20px;padding-right:0;padding-bottom:9px}[dir=rtl] .mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__title,.mdc-top-app-bar--dense.mdc-top-app-bar--prominent .mdc-top-app-bar__title[dir=rtl]{padding-left:0;padding-right:20px}.mdc-top-app-bar--fixed-adjust{padding-top:64px}.mdc-top-app-bar--dense-fixed-adjust{padding-top:48px}.mdc-top-app-bar--short-fixed-adjust{padding-top:56px}.mdc-top-app-bar--prominent-fixed-adjust{padding-top:128px}.mdc-top-app-bar--dense-prominent-fixed-adjust{padding-top:96px}@media(max-width: 599px){.mdc-top-app-bar__row{height:56px}.mdc-top-app-bar__section{padding:4px}.mdc-top-app-bar--short{transition:width 200ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-top-app-bar--short-collapsed{transition:width 250ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-top-app-bar--short-collapsed .mdc-top-app-bar__section--align-end{padding-left:0;padding-right:12px}[dir=rtl] .mdc-top-app-bar--short-collapsed .mdc-top-app-bar__section--align-end,.mdc-top-app-bar--short-collapsed .mdc-top-app-bar__section--align-end[dir=rtl]{padding-left:12px;padding-right:0}.mdc-top-app-bar--prominent .mdc-top-app-bar__title{padding-bottom:6px}.mdc-top-app-bar--fixed-adjust{padding-top:56px}}.mdc-typography{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-font-family, Roboto, sans-serif)}.mdc-typography--headline1{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-headline1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:6rem;font-size:var(--mdc-typography-headline1-font-size, 6rem);line-height:6rem;line-height:var(--mdc-typography-headline1-line-height, 6rem);font-weight:300;font-weight:var(--mdc-typography-headline1-font-weight, 300);letter-spacing:-0.015625em;letter-spacing:var(--mdc-typography-headline1-letter-spacing, -0.015625em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-headline1-text-decoration, inherit);text-decoration:var(--mdc-typography-headline1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-headline1-text-transform, inherit)}.mdc-typography--headline2{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-headline2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:3.75rem;font-size:var(--mdc-typography-headline2-font-size, 3.75rem);line-height:3.75rem;line-height:var(--mdc-typography-headline2-line-height, 3.75rem);font-weight:300;font-weight:var(--mdc-typography-headline2-font-weight, 300);letter-spacing:-0.0083333333em;letter-spacing:var(--mdc-typography-headline2-letter-spacing, -0.0083333333em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-headline2-text-decoration, inherit);text-decoration:var(--mdc-typography-headline2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-headline2-text-transform, inherit)}.mdc-typography--headline3{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-headline3-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:3rem;font-size:var(--mdc-typography-headline3-font-size, 3rem);line-height:3.125rem;line-height:var(--mdc-typography-headline3-line-height, 3.125rem);font-weight:400;font-weight:var(--mdc-typography-headline3-font-weight, 400);letter-spacing:normal;letter-spacing:var(--mdc-typography-headline3-letter-spacing, normal);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-headline3-text-decoration, inherit);text-decoration:var(--mdc-typography-headline3-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-headline3-text-transform, inherit)}.mdc-typography--headline4{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-headline4-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:2.125rem;font-size:var(--mdc-typography-headline4-font-size, 2.125rem);line-height:2.5rem;line-height:var(--mdc-typography-headline4-line-height, 2.5rem);font-weight:400;font-weight:var(--mdc-typography-headline4-font-weight, 400);letter-spacing:0.0073529412em;letter-spacing:var(--mdc-typography-headline4-letter-spacing, 0.0073529412em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-headline4-text-decoration, inherit);text-decoration:var(--mdc-typography-headline4-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-headline4-text-transform, inherit)}.mdc-typography--headline5{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-headline5-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1.5rem;font-size:var(--mdc-typography-headline5-font-size, 1.5rem);line-height:2rem;line-height:var(--mdc-typography-headline5-line-height, 2rem);font-weight:400;font-weight:var(--mdc-typography-headline5-font-weight, 400);letter-spacing:normal;letter-spacing:var(--mdc-typography-headline5-letter-spacing, normal);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-headline5-text-decoration, inherit);text-decoration:var(--mdc-typography-headline5-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-headline5-text-transform, inherit)}.mdc-typography--headline6{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1.25rem;font-size:var(--mdc-typography-headline6-font-size, 1.25rem);line-height:2rem;line-height:var(--mdc-typography-headline6-line-height, 2rem);font-weight:500;font-weight:var(--mdc-typography-headline6-font-weight, 500);letter-spacing:0.0125em;letter-spacing:var(--mdc-typography-headline6-letter-spacing, 0.0125em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-headline6-text-transform, inherit)}.mdc-typography--subtitle1{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-subtitle1-font-size, 1rem);line-height:1.75rem;line-height:var(--mdc-typography-subtitle1-line-height, 1.75rem);font-weight:400;font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:0.009375em;letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle1-text-transform, inherit)}.mdc-typography--subtitle2{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-subtitle2-font-size, 0.875rem);line-height:1.375rem;line-height:var(--mdc-typography-subtitle2-line-height, 1.375rem);font-weight:500;font-weight:var(--mdc-typography-subtitle2-font-weight, 500);letter-spacing:0.0071428571em;letter-spacing:var(--mdc-typography-subtitle2-letter-spacing, 0.0071428571em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-subtitle2-text-transform, inherit)}.mdc-typography--body1{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:1rem;font-size:var(--mdc-typography-body1-font-size, 1rem);line-height:1.5rem;line-height:var(--mdc-typography-body1-line-height, 1.5rem);font-weight:400;font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:0.03125em;letter-spacing:var(--mdc-typography-body1-letter-spacing, 0.03125em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body1-text-transform, inherit)}.mdc-typography--body2{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-body2-font-size, 0.875rem);line-height:1.25rem;line-height:var(--mdc-typography-body2-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:0.0178571429em;letter-spacing:var(--mdc-typography-body2-letter-spacing, 0.0178571429em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-body2-text-transform, inherit)}.mdc-typography--caption{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.75rem;font-size:var(--mdc-typography-caption-font-size, 0.75rem);line-height:1.25rem;line-height:var(--mdc-typography-caption-line-height, 1.25rem);font-weight:400;font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:0.0333333333em;letter-spacing:var(--mdc-typography-caption-letter-spacing, 0.0333333333em);text-decoration:inherit;-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:inherit;text-transform:var(--mdc-typography-caption-text-transform, inherit)}.mdc-typography--button{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-button-font-size, 0.875rem);line-height:2.25rem;line-height:var(--mdc-typography-button-line-height, 2.25rem);font-weight:500;font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:0.0892857143em;letter-spacing:var(--mdc-typography-button-letter-spacing, 0.0892857143em);text-decoration:none;-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:uppercase;text-transform:var(--mdc-typography-button-text-transform, uppercase)}.mdc-typography--overline{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Roboto, sans-serif;font-family:var(--mdc-typography-overline-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:0.75rem;font-size:var(--mdc-typography-overline-font-size, 0.75rem);line-height:2rem;line-height:var(--mdc-typography-overline-line-height, 2rem);font-weight:500;font-weight:var(--mdc-typography-overline-font-weight, 500);letter-spacing:0.1666666667em;letter-spacing:var(--mdc-typography-overline-letter-spacing, 0.1666666667em);text-decoration:none;-webkit-text-decoration:var(--mdc-typography-overline-text-decoration, none);text-decoration:var(--mdc-typography-overline-text-decoration, none);text-transform:uppercase;text-transform:var(--mdc-typography-overline-text-transform, uppercase)} + + /*# sourceMappingURL=material-components-web.min.css.map*/ \ No newline at end of file diff --git a/pkgs/csslib/third_party/pure/LICENSE b/pkgs/csslib/third_party/pure/LICENSE new file mode 100644 index 000000000..aae45d8de --- /dev/null +++ b/pkgs/csslib/third_party/pure/LICENSE @@ -0,0 +1,29 @@ +Software License Agreement (BSD License) +======================================== + +Copyright 2013 Yahoo! Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the Yahoo! Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/pkgs/csslib/third_party/pure/README.md b/pkgs/csslib/third_party/pure/README.md new file mode 100644 index 000000000..7c005a6bc --- /dev/null +++ b/pkgs/csslib/third_party/pure/README.md @@ -0,0 +1,4 @@ +This folder contains sample css files from the open-source project +https://github.com/pure-css/pure/ + +This code was included under the terms in the `LICENSE` file. \ No newline at end of file diff --git a/pkgs/csslib/third_party/pure/main-grid.css b/pkgs/csslib/third_party/pure/main-grid.css new file mode 100644 index 000000000..0598dfe8d --- /dev/null +++ b/pkgs/csslib/third_party/pure/main-grid.css @@ -0,0 +1,855 @@ +@media screen and (min-width: 35.5em) { + .u-sm-1, + .u-sm-1-1, + .u-sm-1-2, + .u-sm-1-3, + .u-sm-2-3, + .u-sm-1-4, + .u-sm-3-4, + .u-sm-1-5, + .u-sm-2-5, + .u-sm-3-5, + .u-sm-4-5, + .u-sm-5-5, + .u-sm-1-6, + .u-sm-5-6, + .u-sm-1-8, + .u-sm-3-8, + .u-sm-5-8, + .u-sm-7-8, + .u-sm-1-12, + .u-sm-5-12, + .u-sm-7-12, + .u-sm-11-12, + .u-sm-1-24, + .u-sm-2-24, + .u-sm-3-24, + .u-sm-4-24, + .u-sm-5-24, + .u-sm-6-24, + .u-sm-7-24, + .u-sm-8-24, + .u-sm-9-24, + .u-sm-10-24, + .u-sm-11-24, + .u-sm-12-24, + .u-sm-13-24, + .u-sm-14-24, + .u-sm-15-24, + .u-sm-16-24, + .u-sm-17-24, + .u-sm-18-24, + .u-sm-19-24, + .u-sm-20-24, + .u-sm-21-24, + .u-sm-22-24, + .u-sm-23-24, + .u-sm-24-24 { + display: inline-block; + *display: inline; + zoom: 1; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto; + } + + .u-sm-1-24 { + width: 4.1667%; + *width: 4.1357%; + } + + .u-sm-1-12, + .u-sm-2-24 { + width: 8.3333%; + *width: 8.3023%; + } + + .u-sm-1-8, + .u-sm-3-24 { + width: 12.5000%; + *width: 12.4690%; + } + + .u-sm-1-6, + .u-sm-4-24 { + width: 16.6667%; + *width: 16.6357%; + } + + .u-sm-1-5 { + width: 20%; + *width: 19.9690%; + } + + .u-sm-5-24 { + width: 20.8333%; + *width: 20.8023%; + } + + .u-sm-1-4, + .u-sm-6-24 { + width: 25%; + *width: 24.9690%; + } + + .u-sm-7-24 { + width: 29.1667%; + *width: 29.1357%; + } + + .u-sm-1-3, + .u-sm-8-24 { + width: 33.3333%; + *width: 33.3023%; + } + + .u-sm-3-8, + .u-sm-9-24 { + width: 37.5000%; + *width: 37.4690%; + } + + .u-sm-2-5 { + width: 40%; + *width: 39.9690%; + } + + .u-sm-5-12, + .u-sm-10-24 { + width: 41.6667%; + *width: 41.6357%; + } + + .u-sm-11-24 { + width: 45.8333%; + *width: 45.8023%; + } + + .u-sm-1-2, + .u-sm-12-24 { + width: 50%; + *width: 49.9690%; + } + + .u-sm-13-24 { + width: 54.1667%; + *width: 54.1357%; + } + + .u-sm-7-12, + .u-sm-14-24 { + width: 58.3333%; + *width: 58.3023%; + } + + .u-sm-3-5 { + width: 60%; + *width: 59.9690%; + } + + .u-sm-5-8, + .u-sm-15-24 { + width: 62.5000%; + *width: 62.4690%; + } + + .u-sm-2-3, + .u-sm-16-24 { + width: 66.6667%; + *width: 66.6357%; + } + + .u-sm-17-24 { + width: 70.8333%; + *width: 70.8023%; + } + + .u-sm-3-4, + .u-sm-18-24 { + width: 75%; + *width: 74.9690%; + } + + .u-sm-19-24 { + width: 79.1667%; + *width: 79.1357%; + } + + .u-sm-4-5 { + width: 80%; + *width: 79.9690%; + } + + .u-sm-5-6, + .u-sm-20-24 { + width: 83.3333%; + *width: 83.3023%; + } + + .u-sm-7-8, + .u-sm-21-24 { + width: 87.5000%; + *width: 87.4690%; + } + + .u-sm-11-12, + .u-sm-22-24 { + width: 91.6667%; + *width: 91.6357%; + } + + .u-sm-23-24 { + width: 95.8333%; + *width: 95.8023%; + } + + .u-sm-1, + .u-sm-1-1, + .u-sm-5-5, + .u-sm-24-24 { + width: 100%; + } +} + +@media screen and (min-width: 48em) { + .u-md-1, + .u-md-1-1, + .u-md-1-2, + .u-md-1-3, + .u-md-2-3, + .u-md-1-4, + .u-md-3-4, + .u-md-1-5, + .u-md-2-5, + .u-md-3-5, + .u-md-4-5, + .u-md-5-5, + .u-md-1-6, + .u-md-5-6, + .u-md-1-8, + .u-md-3-8, + .u-md-5-8, + .u-md-7-8, + .u-md-1-12, + .u-md-5-12, + .u-md-7-12, + .u-md-11-12, + .u-md-1-24, + .u-md-2-24, + .u-md-3-24, + .u-md-4-24, + .u-md-5-24, + .u-md-6-24, + .u-md-7-24, + .u-md-8-24, + .u-md-9-24, + .u-md-10-24, + .u-md-11-24, + .u-md-12-24, + .u-md-13-24, + .u-md-14-24, + .u-md-15-24, + .u-md-16-24, + .u-md-17-24, + .u-md-18-24, + .u-md-19-24, + .u-md-20-24, + .u-md-21-24, + .u-md-22-24, + .u-md-23-24, + .u-md-24-24 { + display: inline-block; + *display: inline; + zoom: 1; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto; + } + + .u-md-1-24 { + width: 4.1667%; + *width: 4.1357%; + } + + .u-md-1-12, + .u-md-2-24 { + width: 8.3333%; + *width: 8.3023%; + } + + .u-md-1-8, + .u-md-3-24 { + width: 12.5000%; + *width: 12.4690%; + } + + .u-md-1-6, + .u-md-4-24 { + width: 16.6667%; + *width: 16.6357%; + } + + .u-md-1-5 { + width: 20%; + *width: 19.9690%; + } + + .u-md-5-24 { + width: 20.8333%; + *width: 20.8023%; + } + + .u-md-1-4, + .u-md-6-24 { + width: 25%; + *width: 24.9690%; + } + + .u-md-7-24 { + width: 29.1667%; + *width: 29.1357%; + } + + .u-md-1-3, + .u-md-8-24 { + width: 33.3333%; + *width: 33.3023%; + } + + .u-md-3-8, + .u-md-9-24 { + width: 37.5000%; + *width: 37.4690%; + } + + .u-md-2-5 { + width: 40%; + *width: 39.9690%; + } + + .u-md-5-12, + .u-md-10-24 { + width: 41.6667%; + *width: 41.6357%; + } + + .u-md-11-24 { + width: 45.8333%; + *width: 45.8023%; + } + + .u-md-1-2, + .u-md-12-24 { + width: 50%; + *width: 49.9690%; + } + + .u-md-13-24 { + width: 54.1667%; + *width: 54.1357%; + } + + .u-md-7-12, + .u-md-14-24 { + width: 58.3333%; + *width: 58.3023%; + } + + .u-md-3-5 { + width: 60%; + *width: 59.9690%; + } + + .u-md-5-8, + .u-md-15-24 { + width: 62.5000%; + *width: 62.4690%; + } + + .u-md-2-3, + .u-md-16-24 { + width: 66.6667%; + *width: 66.6357%; + } + + .u-md-17-24 { + width: 70.8333%; + *width: 70.8023%; + } + + .u-md-3-4, + .u-md-18-24 { + width: 75%; + *width: 74.9690%; + } + + .u-md-19-24 { + width: 79.1667%; + *width: 79.1357%; + } + + .u-md-4-5 { + width: 80%; + *width: 79.9690%; + } + + .u-md-5-6, + .u-md-20-24 { + width: 83.3333%; + *width: 83.3023%; + } + + .u-md-7-8, + .u-md-21-24 { + width: 87.5000%; + *width: 87.4690%; + } + + .u-md-11-12, + .u-md-22-24 { + width: 91.6667%; + *width: 91.6357%; + } + + .u-md-23-24 { + width: 95.8333%; + *width: 95.8023%; + } + + .u-md-1, + .u-md-1-1, + .u-md-5-5, + .u-md-24-24 { + width: 100%; + } +} + +@media screen and (min-width: 58em) { + .u-lg-1, + .u-lg-1-1, + .u-lg-1-2, + .u-lg-1-3, + .u-lg-2-3, + .u-lg-1-4, + .u-lg-3-4, + .u-lg-1-5, + .u-lg-2-5, + .u-lg-3-5, + .u-lg-4-5, + .u-lg-5-5, + .u-lg-1-6, + .u-lg-5-6, + .u-lg-1-8, + .u-lg-3-8, + .u-lg-5-8, + .u-lg-7-8, + .u-lg-1-12, + .u-lg-5-12, + .u-lg-7-12, + .u-lg-11-12, + .u-lg-1-24, + .u-lg-2-24, + .u-lg-3-24, + .u-lg-4-24, + .u-lg-5-24, + .u-lg-6-24, + .u-lg-7-24, + .u-lg-8-24, + .u-lg-9-24, + .u-lg-10-24, + .u-lg-11-24, + .u-lg-12-24, + .u-lg-13-24, + .u-lg-14-24, + .u-lg-15-24, + .u-lg-16-24, + .u-lg-17-24, + .u-lg-18-24, + .u-lg-19-24, + .u-lg-20-24, + .u-lg-21-24, + .u-lg-22-24, + .u-lg-23-24, + .u-lg-24-24 { + display: inline-block; + *display: inline; + zoom: 1; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto; + } + + .u-lg-1-24 { + width: 4.1667%; + *width: 4.1357%; + } + + .u-lg-1-12, + .u-lg-2-24 { + width: 8.3333%; + *width: 8.3023%; + } + + .u-lg-1-8, + .u-lg-3-24 { + width: 12.5000%; + *width: 12.4690%; + } + + .u-lg-1-6, + .u-lg-4-24 { + width: 16.6667%; + *width: 16.6357%; + } + + .u-lg-1-5 { + width: 20%; + *width: 19.9690%; + } + + .u-lg-5-24 { + width: 20.8333%; + *width: 20.8023%; + } + + .u-lg-1-4, + .u-lg-6-24 { + width: 25%; + *width: 24.9690%; + } + + .u-lg-7-24 { + width: 29.1667%; + *width: 29.1357%; + } + + .u-lg-1-3, + .u-lg-8-24 { + width: 33.3333%; + *width: 33.3023%; + } + + .u-lg-3-8, + .u-lg-9-24 { + width: 37.5000%; + *width: 37.4690%; + } + + .u-lg-2-5 { + width: 40%; + *width: 39.9690%; + } + + .u-lg-5-12, + .u-lg-10-24 { + width: 41.6667%; + *width: 41.6357%; + } + + .u-lg-11-24 { + width: 45.8333%; + *width: 45.8023%; + } + + .u-lg-1-2, + .u-lg-12-24 { + width: 50%; + *width: 49.9690%; + } + + .u-lg-13-24 { + width: 54.1667%; + *width: 54.1357%; + } + + .u-lg-7-12, + .u-lg-14-24 { + width: 58.3333%; + *width: 58.3023%; + } + + .u-lg-3-5 { + width: 60%; + *width: 59.9690%; + } + + .u-lg-5-8, + .u-lg-15-24 { + width: 62.5000%; + *width: 62.4690%; + } + + .u-lg-2-3, + .u-lg-16-24 { + width: 66.6667%; + *width: 66.6357%; + } + + .u-lg-17-24 { + width: 70.8333%; + *width: 70.8023%; + } + + .u-lg-3-4, + .u-lg-18-24 { + width: 75%; + *width: 74.9690%; + } + + .u-lg-19-24 { + width: 79.1667%; + *width: 79.1357%; + } + + .u-lg-4-5 { + width: 80%; + *width: 79.9690%; + } + + .u-lg-5-6, + .u-lg-20-24 { + width: 83.3333%; + *width: 83.3023%; + } + + .u-lg-7-8, + .u-lg-21-24 { + width: 87.5000%; + *width: 87.4690%; + } + + .u-lg-11-12, + .u-lg-22-24 { + width: 91.6667%; + *width: 91.6357%; + } + + .u-lg-23-24 { + width: 95.8333%; + *width: 95.8023%; + } + + .u-lg-1, + .u-lg-1-1, + .u-lg-5-5, + .u-lg-24-24 { + width: 100%; + } +} + +@media screen and (min-width: 75em) { + .u-xl-1, + .u-xl-1-1, + .u-xl-1-2, + .u-xl-1-3, + .u-xl-2-3, + .u-xl-1-4, + .u-xl-3-4, + .u-xl-1-5, + .u-xl-2-5, + .u-xl-3-5, + .u-xl-4-5, + .u-xl-5-5, + .u-xl-1-6, + .u-xl-5-6, + .u-xl-1-8, + .u-xl-3-8, + .u-xl-5-8, + .u-xl-7-8, + .u-xl-1-12, + .u-xl-5-12, + .u-xl-7-12, + .u-xl-11-12, + .u-xl-1-24, + .u-xl-2-24, + .u-xl-3-24, + .u-xl-4-24, + .u-xl-5-24, + .u-xl-6-24, + .u-xl-7-24, + .u-xl-8-24, + .u-xl-9-24, + .u-xl-10-24, + .u-xl-11-24, + .u-xl-12-24, + .u-xl-13-24, + .u-xl-14-24, + .u-xl-15-24, + .u-xl-16-24, + .u-xl-17-24, + .u-xl-18-24, + .u-xl-19-24, + .u-xl-20-24, + .u-xl-21-24, + .u-xl-22-24, + .u-xl-23-24, + .u-xl-24-24 { + display: inline-block; + *display: inline; + zoom: 1; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto; + } + + .u-xl-1-24 { + width: 4.1667%; + *width: 4.1357%; + } + + .u-xl-1-12, + .u-xl-2-24 { + width: 8.3333%; + *width: 8.3023%; + } + + .u-xl-1-8, + .u-xl-3-24 { + width: 12.5000%; + *width: 12.4690%; + } + + .u-xl-1-6, + .u-xl-4-24 { + width: 16.6667%; + *width: 16.6357%; + } + + .u-xl-1-5 { + width: 20%; + *width: 19.9690%; + } + + .u-xl-5-24 { + width: 20.8333%; + *width: 20.8023%; + } + + .u-xl-1-4, + .u-xl-6-24 { + width: 25%; + *width: 24.9690%; + } + + .u-xl-7-24 { + width: 29.1667%; + *width: 29.1357%; + } + + .u-xl-1-3, + .u-xl-8-24 { + width: 33.3333%; + *width: 33.3023%; + } + + .u-xl-3-8, + .u-xl-9-24 { + width: 37.5000%; + *width: 37.4690%; + } + + .u-xl-2-5 { + width: 40%; + *width: 39.9690%; + } + + .u-xl-5-12, + .u-xl-10-24 { + width: 41.6667%; + *width: 41.6357%; + } + + .u-xl-11-24 { + width: 45.8333%; + *width: 45.8023%; + } + + .u-xl-1-2, + .u-xl-12-24 { + width: 50%; + *width: 49.9690%; + } + + .u-xl-13-24 { + width: 54.1667%; + *width: 54.1357%; + } + + .u-xl-7-12, + .u-xl-14-24 { + width: 58.3333%; + *width: 58.3023%; + } + + .u-xl-3-5 { + width: 60%; + *width: 59.9690%; + } + + .u-xl-5-8, + .u-xl-15-24 { + width: 62.5000%; + *width: 62.4690%; + } + + .u-xl-2-3, + .u-xl-16-24 { + width: 66.6667%; + *width: 66.6357%; + } + + .u-xl-17-24 { + width: 70.8333%; + *width: 70.8023%; + } + + .u-xl-3-4, + .u-xl-18-24 { + width: 75%; + *width: 74.9690%; + } + + .u-xl-19-24 { + width: 79.1667%; + *width: 79.1357%; + } + + .u-xl-4-5 { + width: 80%; + *width: 79.9690%; + } + + .u-xl-5-6, + .u-xl-20-24 { + width: 83.3333%; + *width: 83.3023%; + } + + .u-xl-7-8, + .u-xl-21-24 { + width: 87.5000%; + *width: 87.4690%; + } + + .u-xl-11-12, + .u-xl-22-24 { + width: 91.6667%; + *width: 91.6357%; + } + + .u-xl-23-24 { + width: 95.8333%; + *width: 95.8023%; + } + + .u-xl-1, + .u-xl-1-1, + .u-xl-5-5, + .u-xl-24-24 { + width: 100%; + } +} \ No newline at end of file diff --git a/pkgs/csslib/third_party/pure/main.css b/pkgs/csslib/third_party/pure/main.css new file mode 100644 index 000000000..ed5f6132d --- /dev/null +++ b/pkgs/csslib/third_party/pure/main.css @@ -0,0 +1,624 @@ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html, button, input, select, textarea, +.pure-g [class *= "pure-u"] { + font-family: Helvetica, Arial, sans-serif; + letter-spacing: 0.01em; +} + + +/* -------------------------- + * Element Styles + * -------------------------- +*/ + +body { + min-width: 320px; + background-color: #fff; + color: #777; + line-height: 1.6; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: bold; + color: rgb(75, 75, 75); +} +h3 { + font-size: 1.25em; +} +h4 { + font-size: 1.125em; +} + +a { + color: #3b8bba; /* block-background-text-normal */ + text-decoration: none; +} + +a:visited { + color: #265778; /* block-normal-text-normal */ +} + +dt { + font-weight: bold; +} +dd { + margin: 0 0 10px 0; +} + +aside { + background: #1f8dd6; /* same color as selected state on site menu */ + margin: 1em 0; + padding: 0.3em 1em; + border-radius: 3px; + color: #fff; +} + aside a, aside a:visited { + color: rgb(169, 226, 255); + } + + +/* -------------------------- + * Layout Styles + * -------------------------- +*/ + +/* Navigation Push Styles */ +#layout { + position: relative; + padding-left: 0; +} + #layout.active #menu { + left: 160px; + width: 160px; + } + +/* Apply the .box class on the immediate parent of any grid element (pure-u-*) to apply some padding. */ +.l-box { + padding: 1em; +} + +.l-wrap { + margin-left: auto; + margin-right: auto; +} +.content .l-wrap { + margin-left: -1em; + margin-right: -1em; +} + + +/* -------------------------- + * Header Module Styles + * -------------------------- +*/ + +.header { + font-family: "Raleway", "Helvetica Neue", Helvetica, Arial, sans-serif; + max-width: 768px; + margin: 0 auto; + padding: 1em; + text-align: center; + border-bottom: 1px solid #eee; + background: #fff; + letter-spacing: 0.05em; +} + .header h1 { + font-size: 300%; + font-weight: 100; + margin: 0; + } + .header h2 { + font-size: 125%; + font-weight: 100; + line-height: 1.5; + margin: 0; + color: #666; + letter-spacing: -0.02em; + } + + + /* -------------------------- + * Content Module Styles + * -------------------------- + */ + +/* The content div is placed as a wrapper around all the docs */ +.content { + margin-left: auto; + margin-right: auto; + padding-left: 1em; + padding-right: 1em; + max-width: 768px; +} + + .content .content-subhead { + margin: 2em 0 1em 0; + font-weight: 300; + color: #888; + position: relative; + } + + .content .content-spaced { + line-height: 1.8; + } + + .content .content-quote { + font-family: "Georgia", serif; + color: #666; + font-style: italic; + line-height: 1.8; + border-left: 5px solid #ddd; + padding-left: 1.5em; + } + + .content-link { + position: absolute; + top: 0; + right: 0; + display: block; + height: 100%; + width: 20px; + background: transparent url('/img/link-icon.png') no-repeat center center; + background-size: 20px 20px; + } + + @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) { + .content-link { + background-image: url('/img/link-icon@2x.png'); + } + } + + +/* -------------------------- + * Code Styles + * -------------------------- +*/ + +pre, +code { + font-family: Consolas, Courier, monospace; + color: #333; + background: rgb(250, 250, 250); +} + +code { + padding: 0.2em 0.4em; + white-space: nowrap; +} +.content p code { + font-size: 90%; +} + +.code { + margin-left: -1em; + margin-right: -1em; + border: 1px solid #eee; + border-left-width: 0; + border-right-width: 0; + overflow-x: auto; +} +.code pre { + margin: 0; +} +.code code { + font-size: 95%; + white-space: pre; + word-wrap: normal; + padding: 0; + background: none; +} +.code-wrap code { + white-space: pre-wrap; + word-wrap: break-word; +} +.example .code { + margin-top: 1em; +} + +/* -------------------------- + * Footer Module Styles + * -------------------------- +*/ + +.footer { + font-size: 87.5%; + border-top: 1px solid #eee; + margin-top: 3.4286em; + padding: 1.1429em; + background: rgb(250, 250, 250); +} + +.legal { + line-height: 1.6; + text-align: center; + margin: 0 auto; +} + + .legal-license { + margin-top: 0; + } + .legal-links { + list-style: none; + padding: 0; + margin-bottom: 0; + } + .legal-copyright { + margin-top: 0; + margin-bottom: 0; + } + + +/* -------------------------- + * Main Navigation Bar Styles + * -------------------------- +*/ + +/* Add transition to containers so they can push in and out */ +#layout, +#menu, +.menu-link { + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} + +#layout.active .menu-link { + left: 160px; +} + +#menu { + margin-left: -160px; /* "#menu" width */ + width: 160px; + position: fixed; + top: 0; + left: 0; + bottom: 0; + z-index: 1000; /* so the menu or its navicon stays above all content */ + background: #191818; + overflow-y: auto; +} + #menu a { + color: #999; + border: none; + white-space: normal; + padding: 0.625em 1em; + } + + #menu .pure-menu-open { + background: transparent; + border: 0; + } + + #menu .pure-menu ul { + border: none; + background: transparent; + display: block; + } + + #menu .pure-menu ul, + #menu .pure-menu .menu-item-divided { + border-top: 1px solid #333; + } + + #menu .pure-menu-list li .pure-menu-link:hover, + #menu .pure-menu-list li .pure-menu-link:focus { + background: #333; + } + + .menu-link { + position: fixed; + display: block; /* show this only on small screens */ + top: 0; + left: 0; /* "#menu width" */ + background: #000; + background: rgba(0,0,0,0.7); + font-size: 11px; /* change this value to increase/decrease button size */ + z-index: 10; + width: 4em; + height: 4em; + padding: 1em; + } + + .menu-link:hover, + .menu-link:focus { + background: #000; + } + + .menu-link span { + position: relative; + display: block; + margin-top: 0.9em; + } + + .menu-link span, + .menu-link span:before, + .menu-link span:after { + background-color: #fff; + pointer-events: none; + width: 100%; + height: .2em; + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -ms-transition: all 0.4s; + -o-transition: all 0.4s; + transition: all 0.4s; + } + + .menu-link span:before, + .menu-link span:after { + position: absolute; + top: -.55em; + content: " "; + } + + .menu-link span:after { + top: .55em; + } + + .menu-link.active span { + background: transparent; + } + + .menu-link.active span:before { + -webkit-transform: rotate(45deg) translate(.5em, .4em); + -moz-transform: rotate(45deg) translate(.5em, .4em); + -ms-transform: rotate(45deg) translate(.5em, .4em); + -o-transform: rotate(45deg) translate(.5em, .4em); + transform: rotate(45deg) translate(.5em, .4em); + } + + .menu-link.active span:after { + -webkit-transform: rotate(-45deg) translate(.4em, -.3em); + -moz-transform: rotate(-45deg) translate(.4em, -.3em); + -ms-transform: rotate(-45deg) translate(.4em, -.3em); + -o-transform: rotate(-45deg) translate(.4em, -.3em); + transform: rotate(-45deg) translate(.4em, -.3em); + } + + #menu .pure-menu-heading { + font-size: 125%; + font-weight: 300; + letter-spacing: 0.1em; + color: #fff; + margin-top: 0; + padding: 0.5em 0.8em; + text-transform: uppercase; + } + #menu .pure-menu-heading:hover, + #menu .pure-menu-heading:focus { + color: #999; + } + + #menu .pure-menu-item .active { + background: #1f8dd6; + color: #fff; + } + + #menu li.pure-menu-item .active:hover, + #menu li.pure-menu-item .active:focus { + background: #1f8dd6; + } + + +/* --------------------- + * Smaller Module Styles + * --------------------- +*/ + +.pure-img-responsive { + max-width: 100%; + height: auto; +} + +.pure-paginator .pure-button { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.pure-button { + font-family: inherit; +} +a.pure-button-primary { + color: white; +} + + +/* green call to action button class */ +.notice { + background-color: #61B842; + color: white; +} + +.muted { + color: #ccc; +} + + + +/* ------------- + * Table Styles + * ------------- +*/ +.pure-table th, +.pure-table td { + padding: 0.5em 1em; +} + +.table-responsive { + margin-left: -1em; + margin-right: -1em; + overflow-x: auto; + margin-bottom: 1em; +} +.table-responsive table { + width: 100%; + min-width: 35.5em; + border-left-width: 0; + border-right-width: 0; +} + +.table-responsive .mq-table { + width: 100%; + min-width: 44em; +} +.mq-table th.highlight { + background-color: rgb(255, 234, 133); +} +.mq-table td.highlight { + background-color: rgb(255, 250, 229); +} +.mq-table th.highlight code, +.mq-table td.highlight code { + background: rgb(255, 255, 243); +} +.mq-table-mq code { + font-size: 0.875em; +} + +/* ---------------------------- + * Example for full-width Grids + * ---------------------------- +*/ + +.grids-example { + background: rgb(250, 250, 250); + margin: 2em auto; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +/* -------------------------- + * State Rules + * -------------------------- +*/ + + +.is-code-full { + text-align: center; +} +.is-code-full .code { + margin-left: auto; + margin-right: auto; +} +.is-code-full code { + display: inline-block; + max-width: 768px; + margin-left: auto; + margin-right: auto; +} + + +/* -------------------------- + * Responsive Styles + * -------------------------- +*/ + +@media screen and (min-width: 35.5em) { + + .legal-license { + text-align: left; + margin: 0; + } + .legal-copyright, + .legal-links, + .legal-links li { + text-align: right; + margin: 0; + } + +} + +@media screen and (min-width: 48em) { + + .l-wrap, + .l-wrap .content { + padding-left: 1em; + padding-right: 1em; + } + .content .l-wrap { + margin-left: -2em; + margin-right: -2em; + } + + .header, + .content { + padding-left: 2em; + padding-right: 2em; + } + + .header h1 { + font-size: 320%; + } + .header h2 { + font-size: 128%; + } + + .content p { + font-size: 1.125em; + } + + .code { + margin-left: auto; + margin-right: auto; + border-left-width: 1px; + border-right-width: 1px; + } + + .table-responsive { + margin-left: auto; + margin-right: auto; + } + .table-responsive table { + border-left-width: 1px; + border-right-width: 1px; + } + +} + +@media (max-width: 58em) { + /* Only apply this when the window is smaller. Otherwise, the following + case results in extra padding on the left: + * Make the window small. (Rotate to portrait on a mobile.) + * Tap the menu to trigger the active state. + * Make the window large again. (Rotate to landscape on mobile.) + */ + #layout.active { + position: relative; + left: 160px; + } +} + +@media (min-width: 58em) { + + #layout { + padding-left: 160px; /* left col width "#menu" */ + left: 0; + } + #menu { + left: 160px; + } + .menu-link { + position: fixed; + left: 160px; + display: none; + } + #layout.active .menu-link { + left: 160px; + } + +} diff --git a/pkgs/csslib/third_party/skeleton/LICENSE.md b/pkgs/csslib/third_party/skeleton/LICENSE.md new file mode 100644 index 000000000..32a62b300 --- /dev/null +++ b/pkgs/csslib/third_party/skeleton/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011-2014 Dave Gamache + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/pkgs/csslib/third_party/skeleton/README.me b/pkgs/csslib/third_party/skeleton/README.me new file mode 100644 index 000000000..aa8c1360f --- /dev/null +++ b/pkgs/csslib/third_party/skeleton/README.me @@ -0,0 +1,4 @@ +This folder contains sample css files from the open-source project +https://github.com/dhg/Skeleton. + +This code was included under the terms in the `LICENSE.md file. \ No newline at end of file diff --git a/pkgs/csslib/third_party/skeleton/normalize.css b/pkgs/csslib/third_party/skeleton/normalize.css new file mode 100644 index 000000000..81c6f31ea --- /dev/null +++ b/pkgs/csslib/third_party/skeleton/normalize.css @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} \ No newline at end of file diff --git a/pkgs/csslib/third_party/skeleton/skeleton.css b/pkgs/csslib/third_party/skeleton/skeleton.css new file mode 100644 index 000000000..f28bf6c59 --- /dev/null +++ b/pkgs/csslib/third_party/skeleton/skeleton.css @@ -0,0 +1,418 @@ +/* +* Skeleton V2.0.4 +* Copyright 2014, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/29/2014 +*/ + + +/* Table of contents +–––––––––––––––––––––––––––––––––––––––––––––––––– +- Grid +- Base Styles +- Typography +- Links +- Buttons +- Forms +- Lists +- Code +- Tables +- Spacing +- Utilities +- Clearing +- Media Queries +*/ + + +/* Grid +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.container { + position: relative; + width: 100%; + max-width: 960px; + margin: 0 auto; + padding: 0 20px; + box-sizing: border-box; } +.column, +.columns { + width: 100%; + float: left; + box-sizing: border-box; } + +/* For devices larger than 400px */ +@media (min-width: 400px) { + .container { + width: 85%; + padding: 0; } +} + +/* For devices larger than 550px */ +@media (min-width: 550px) { + .container { + width: 80%; } + .column, + .columns { + margin-left: 4%; } + .column:first-child, + .columns:first-child { + margin-left: 0; } + + .one.column, + .one.columns { width: 4.66666666667%; } + .two.columns { width: 13.3333333333%; } + .three.columns { width: 22%; } + .four.columns { width: 30.6666666667%; } + .five.columns { width: 39.3333333333%; } + .six.columns { width: 48%; } + .seven.columns { width: 56.6666666667%; } + .eight.columns { width: 65.3333333333%; } + .nine.columns { width: 74.0%; } + .ten.columns { width: 82.6666666667%; } + .eleven.columns { width: 91.3333333333%; } + .twelve.columns { width: 100%; margin-left: 0; } + + .one-third.column { width: 30.6666666667%; } + .two-thirds.column { width: 65.3333333333%; } + + .one-half.column { width: 48%; } + + /* Offsets */ + .offset-by-one.column, + .offset-by-one.columns { margin-left: 8.66666666667%; } + .offset-by-two.column, + .offset-by-two.columns { margin-left: 17.3333333333%; } + .offset-by-three.column, + .offset-by-three.columns { margin-left: 26%; } + .offset-by-four.column, + .offset-by-four.columns { margin-left: 34.6666666667%; } + .offset-by-five.column, + .offset-by-five.columns { margin-left: 43.3333333333%; } + .offset-by-six.column, + .offset-by-six.columns { margin-left: 52%; } + .offset-by-seven.column, + .offset-by-seven.columns { margin-left: 60.6666666667%; } + .offset-by-eight.column, + .offset-by-eight.columns { margin-left: 69.3333333333%; } + .offset-by-nine.column, + .offset-by-nine.columns { margin-left: 78.0%; } + .offset-by-ten.column, + .offset-by-ten.columns { margin-left: 86.6666666667%; } + .offset-by-eleven.column, + .offset-by-eleven.columns { margin-left: 95.3333333333%; } + + .offset-by-one-third.column, + .offset-by-one-third.columns { margin-left: 34.6666666667%; } + .offset-by-two-thirds.column, + .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } + + .offset-by-one-half.column, + .offset-by-one-half.columns { margin-left: 52%; } + +} + + +/* Base Styles +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* NOTE +html is set to 62.5% so that all the REM measurements throughout Skeleton +are based on 10px sizing. So basically 1.5rem = 15px :) */ +html { + font-size: 62.5%; } +body { + font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ + line-height: 1.6; + font-weight: 400; + font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #222; } + + +/* Typography +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 2rem; + font-weight: 300; } +h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} +h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } +h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } +h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } +h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } +h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } + +/* Larger than phablet */ +@media (min-width: 550px) { + h1 { font-size: 5.0rem; } + h2 { font-size: 4.2rem; } + h3 { font-size: 3.6rem; } + h4 { font-size: 3.0rem; } + h5 { font-size: 2.4rem; } + h6 { font-size: 1.5rem; } +} + +p { + margin-top: 0; } + + +/* Links +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +a { + color: #1EAEDB; } +a:hover { + color: #0FA0CE; } + + +/* Buttons +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.button, +button, +input[type="submit"], +input[type="reset"], +input[type="button"] { + display: inline-block; + height: 38px; + padding: 0 30px; + color: #555; + text-align: center; + font-size: 11px; + font-weight: 600; + line-height: 38px; + letter-spacing: .1rem; + text-transform: uppercase; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border-radius: 4px; + border: 1px solid #bbb; + cursor: pointer; + box-sizing: border-box; } +.button:hover, +button:hover, +input[type="submit"]:hover, +input[type="reset"]:hover, +input[type="button"]:hover, +.button:focus, +button:focus, +input[type="submit"]:focus, +input[type="reset"]:focus, +input[type="button"]:focus { + color: #333; + border-color: #888; + outline: 0; } +.button.button-primary, +button.button-primary, +input[type="submit"].button-primary, +input[type="reset"].button-primary, +input[type="button"].button-primary { + color: #FFF; + background-color: #33C3F0; + border-color: #33C3F0; } +.button.button-primary:hover, +button.button-primary:hover, +input[type="submit"].button-primary:hover, +input[type="reset"].button-primary:hover, +input[type="button"].button-primary:hover, +.button.button-primary:focus, +button.button-primary:focus, +input[type="submit"].button-primary:focus, +input[type="reset"].button-primary:focus, +input[type="button"].button-primary:focus { + color: #FFF; + background-color: #1EAEDB; + border-color: #1EAEDB; } + + +/* Forms +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea, +select { + height: 38px; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + background-color: #fff; + border: 1px solid #D1D1D1; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; } +/* Removes awkward default styles on some inputs for iOS */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } +textarea { + min-height: 65px; + padding-top: 6px; + padding-bottom: 6px; } +input[type="email"]:focus, +input[type="number"]:focus, +input[type="search"]:focus, +input[type="text"]:focus, +input[type="tel"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +textarea:focus, +select:focus { + border: 1px solid #33C3F0; + outline: 0; } +label, +legend { + display: block; + margin-bottom: .5rem; + font-weight: 600; } +fieldset { + padding: 0; + border-width: 0; } +input[type="checkbox"], +input[type="radio"] { + display: inline; } +label > .label-body { + display: inline-block; + margin-left: .5rem; + font-weight: normal; } + + +/* Lists +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +ul { + list-style: circle inside; } +ol { + list-style: decimal inside; } +ol, ul { + padding-left: 0; + margin-top: 0; } +ul ul, +ul ol, +ol ol, +ol ul { + margin: 1.5rem 0 1.5rem 3rem; + font-size: 90%; } +li { + margin-bottom: 1rem; } + + +/* Code +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +code { + padding: .2rem .5rem; + margin: 0 .2rem; + font-size: 90%; + white-space: nowrap; + background: #F1F1F1; + border: 1px solid #E1E1E1; + border-radius: 4px; } +pre > code { + display: block; + padding: 1rem 1.5rem; + white-space: pre; } + + +/* Tables +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +th, +td { + padding: 12px 15px; + text-align: left; + border-bottom: 1px solid #E1E1E1; } +th:first-child, +td:first-child { + padding-left: 0; } +th:last-child, +td:last-child { + padding-right: 0; } + + +/* Spacing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +button, +.button { + margin-bottom: 1rem; } +input, +textarea, +select, +fieldset { + margin-bottom: 1.5rem; } +pre, +blockquote, +dl, +figure, +table, +p, +ul, +ol, +form { + margin-bottom: 2.5rem; } + + +/* Utilities +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.u-full-width { + width: 100%; + box-sizing: border-box; } +.u-max-full-width { + max-width: 100%; + box-sizing: border-box; } +.u-pull-right { + float: right; } +.u-pull-left { + float: left; } + + +/* Misc +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +hr { + margin-top: 3rem; + margin-bottom: 3.5rem; + border-width: 0; + border-top: 1px solid #E1E1E1; } + + +/* Clearing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ + +/* Self Clearing Goodness */ +.container:after, +.row:after, +.u-cf { + content: ""; + display: table; + clear: both; } + + +/* Media Queries +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* +Note: The best way to structure the use of media queries is to create the queries +near the relevant code. For example, if you wanted to change the styles for buttons +on small devices, paste the mobile query code up in the buttons section and style it +there. +*/ + + +/* Larger than mobile */ +@media (min-width: 400px) {} + +/* Larger than phablet (also point when grid becomes active) */ +@media (min-width: 550px) {} + +/* Larger than tablet */ +@media (min-width: 750px) {} + +/* Larger than desktop */ +@media (min-width: 1000px) {} + +/* Larger than Desktop HD */ +@media (min-width: 1200px) {} From 2ef2c158df001a20fdf7eb98a124ce713c23136b Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Tue, 5 Oct 2021 22:15:12 +0200 Subject: [PATCH 183/245] Review feedback --- pkgs/csslib/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 41709f446..5baef2bc4 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -9,8 +9,8 @@ environment: dependencies: source_span: ^1.8.0 - path: ^1.8.0 dev_dependencies: + path: ^1.8.0 pedantic: ^1.10.0 test: ^1.16.0 From f29fe64f10a08dfd24ba83bfe14bcfbbb8227f8a Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Tue, 5 Oct 2021 22:21:25 +0200 Subject: [PATCH 184/245] Prep for publishing --- pkgs/csslib/CHANGELOG.md | 2 +- pkgs/csslib/lib/src/property.dart | 2 +- pkgs/csslib/pubspec.yaml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index a5415ee36..bd16a8da1 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.17.1-dev +## 0.17.1 - Fix `Color.css` constructor when there are double values in the `rgba` string. diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index c3b74bc97..87c181cda 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -36,7 +36,7 @@ abstract class ColorBase { int get argbValue; } -/// General purpse Color class. Represent a color as an ARGB value that can be +/// General purpose Color class. Represent a color as an ARGB value that can be /// converted to and from num, hex string, hsl, hsla, rgb, rgba and SVG pre- /// defined color constant. class Color implements _StyleProperty, ColorBase { diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 5baef2bc4..8bcc14462 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,11 +1,11 @@ name: csslib -version: 0.17.1-dev +version: 0.17.1 -description: A library for parsing CSS. +description: A library for parsing and analyzing CSS (Cascading Style Sheets) repository: https://github.com/dart-lang/csslib environment: - sdk: '>=2.12.0-0 <3.0.0' + sdk: '>=2.12.0 <3.0.0' dependencies: source_span: ^1.8.0 From 1a2b7bb261195cdc43ac41c19cc1a3835b19b034 Mon Sep 17 00:00:00 2001 From: Ted Sander Date: Fri, 29 Oct 2021 11:42:37 -0700 Subject: [PATCH 185/245] Add -acx-global-context Add -acx-global-context so that we can rename the usages of global-context to work better in the Sass system. --- pkgs/csslib/lib/parser.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 6c31d510d..9800e8c0c 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -1553,7 +1553,8 @@ class _Parser { } else if (!pseudoElement && (name == 'host' || name == 'host-context' || - name == 'global-context')) { + name == 'global-context' || + name == '-acx-global-context')) { _eat(TokenKind.LPAREN); var selector = processCompoundSelector(); if (selector == null) { From 7db91d68b67c7f16af31dbd3c20d1f7acabcd8e7 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Wed, 10 Nov 2021 16:39:37 -0800 Subject: [PATCH 186/245] Run tests on windows (dart-lang/csslib#142) Use ascii glyphs on all OSes in tests. --- .../csslib/.github/workflows/test-package.yml | 2 +- pkgs/csslib/test/error_test.dart | 138 +++++++++--------- pkgs/csslib/test/selector_test.dart | 18 ++- pkgs/csslib/test/var_test.dart | 58 ++++---- 4 files changed, 111 insertions(+), 105 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index e47bf6600..09e10b05b 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -46,7 +46,7 @@ jobs: fail-fast: false matrix: # Add macos-latest and/or windows-latest if relevant for this package. - os: [ubuntu-latest] + os: [ubuntu-latest, windows-latest] sdk: [2.12.0, dev] steps: - uses: actions/checkout@v2 diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 5b211c2cf..b6be913f7 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -6,6 +6,7 @@ library error_test; import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; +import 'package:term_glyph/term_glyph.dart' as glyph; import 'testing.dart'; @@ -19,12 +20,12 @@ void testUnsupportedFontWeights() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 24: Unknown property value bolder - ╷ -1 │ .foobar { font-weight: bolder; } - │ ^^^^^^ - ╵'''); + , +1 | .foobar { font-weight: bolder; } + | ^^^^^^ + \''''); expect(prettyPrint(stylesheet), r''' .foobar { @@ -37,12 +38,12 @@ error on line 1, column 24: Unknown property value bolder stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 24: Unknown property value lighter - ╷ -1 │ .foobar { font-weight: lighter; } - │ ^^^^^^^ - ╵'''); + , +1 | .foobar { font-weight: lighter; } + | ^^^^^^^ + \''''); expect(prettyPrint(stylesheet), r''' .foobar { font-weight: lighter; @@ -54,12 +55,12 @@ error on line 1, column 24: Unknown property value lighter stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 24: Unknown property value inherit - ╷ -1 │ .foobar { font-weight: inherit; } - │ ^^^^^^^ - ╵'''); + , +1 | .foobar { font-weight: inherit; } + | ^^^^^^^ + \''''); expect(prettyPrint(stylesheet), r''' .foobar { font-weight: inherit; @@ -76,12 +77,12 @@ void testUnsupportedLineHeights() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 24: Unexpected value for line-height - ╷ -1 │ .foobar { line-height: 120%; } - │ ^^^ - ╵'''); + , +1 | .foobar { line-height: 120%; } + | ^^^ + \''''); expect(prettyPrint(stylesheet), r''' .foobar { line-height: 120%; @@ -93,12 +94,12 @@ error on line 1, column 24: Unexpected value for line-height stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 24: Unexpected unit for line-height - ╷ -1 │ .foobar { line-height: 20cm; } - │ ^^ - ╵'''); + , +1 | .foobar { line-height: 20cm; } + | ^^ + \''''); expect(prettyPrint(stylesheet), r''' .foobar { line-height: 20cm; @@ -110,12 +111,12 @@ error on line 1, column 24: Unexpected unit for line-height stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 24: Unknown property value inherit - ╷ -1 │ .foobar { line-height: inherit; } - │ ^^^^^^^ - ╵'''); + , +1 | .foobar { line-height: inherit; } + | ^^^^^^^ + \''''); expect(prettyPrint(stylesheet), r''' .foobar { line-height: inherit; @@ -131,24 +132,24 @@ void testBadSelectors() { parseCss(input, errors: errors); expect(errors, isNotEmpty); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 1: Not a valid ID selector expected #id - ╷ -1 │ # foo { color: #ff00ff; } - │ ^ - ╵'''); + , +1 | # foo { color: #ff00ff; } + | ^ + \''''); // Invalid class selector. input = '. foo { color: #ff00ff; }'; parseCss(input, errors: errors..clear()); expect(errors, isNotEmpty); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 1: Not a valid class selector expected .className - ╷ -1 │ . foo { color: #ff00ff; } - │ ^ - ╵'''); + , +1 | . foo { color: #ff00ff; } + | ^ + \''''); } /// Test for bad hex values. @@ -160,12 +161,12 @@ void testBadHexValues() { var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 18: Bad hex number - ╷ -1 │ .foobar { color: #AH787; } - │ ^^^^^^ - ╵'''); + , +1 | .foobar { color: #AH787; } + | ^^^^^^ + \''''); expect(prettyPrint(stylesheet), r''' .foobar { color: #AH787; @@ -176,12 +177,12 @@ error on line 1, column 18: Bad hex number stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 18: Unknown property value redder - ╷ -1 │ .foobar { color: redder; } - │ ^^^^^^ - ╵'''); + , +1 | .foobar { color: redder; } + | ^^^^^^ + \''''); expect(prettyPrint(stylesheet), r''' .foobar { @@ -193,12 +194,12 @@ error on line 1, column 18: Unknown property value redder stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 18: Expected hex number - ╷ -1 │ .foobar { color: # ffffff; } - │ ^ - ╵'''); + , +1 | .foobar { color: # ffffff; } + | ^ + \''''); expect(prettyPrint(stylesheet), r''' .foobar { @@ -210,12 +211,12 @@ error on line 1, column 18: Expected hex number stylesheet = parseCss(input, errors: errors..clear()); expect(errors.isEmpty, false); - expect(errors[0].toString(), r''' + expect(errors[0].toString(), ''' error on line 1, column 18: Expected hex number - ╷ -1 │ .foobar { color: # 123fff; } - │ ^ - ╵'''); + , +1 | .foobar { color: # 123fff; } + | ^ + \''''); // Formating is off with an extra space. However, the entire value is bad // and isn't processed anyway. @@ -240,10 +241,10 @@ void testBadUnicode() { errors[0].toString(), 'error on line 3, column 20: unicode first range can not be greater than ' 'last\n' - ' ╷\n' - '3 │ unicode-range: U+400-200;\n' - ' │ ^^^^^^^\n' - ' ╵'); + ' ,\n' + '3 | unicode-range: U+400-200;\n' + ' | ^^^^^^^\n' + ' \''); final input2 = ''' @font-face { @@ -257,10 +258,10 @@ void testBadUnicode() { expect( errors[0].toString(), 'error on line 3, column 20: unicode range must be less than 10FFFF\n' - ' ╷\n' - '3 │ unicode-range: U+12FFFF;\n' - ' │ ^^^^^^\n' - ' ╵'); + ' ,\n' + '3 | unicode-range: U+12FFFF;\n' + ' | ^^^^^^\n' + ' \''); } void testBadNesting() { @@ -350,6 +351,7 @@ div { } void main() { + glyph.ascii = true; test('font-weight value errors', testUnsupportedFontWeights); test('line-height value errors', testUnsupportedLineHeights); test('bad selectors', testBadSelectors); diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index 93c848367..ae4dbbd30 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -5,6 +5,7 @@ library selector_test; import 'package:csslib/parser.dart'; +import 'package:term_glyph/term_glyph.dart' as glyph; import 'package:test/test.dart'; import 'testing.dart'; @@ -71,22 +72,23 @@ void testSelectorFailures() { errors[0].toString(), 'error on line 1, column 9: name must start with a alpha character, but ' 'found a number\n' - ' ╷\n' - '1 │ .foobar .1a-story .xyzzy\n' - ' │ ^^\n' - ' ╵'); + ' ,\n' + '1 | .foobar .1a-story .xyzzy\n' + ' | ^^\n' + ' \''); selector(':host()', errors: errors..clear()); expect( errors.first.toString(), 'error on line 1, column 7: expected a selector argument, but found )\n' - ' ╷\n' - '1 │ :host()\n' - ' │ ^\n' - ' ╵'); + ' ,\n' + '1 | :host()\n' + ' | ^\n' + ' \''); } void main() { + glyph.ascii = true; test('Valid Selectors', testSelectorSuccesses); test('Invalid Selectors', testSelectorFailures); } diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 923d121cb..079955fc4 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -5,6 +5,7 @@ library var_test; import 'package:csslib/src/messages.dart'; +import 'package:term_glyph/term_glyph.dart' as glyph; import 'package:test/test.dart'; import 'testing.dart'; @@ -404,40 +405,40 @@ void undefinedVars() { var errorStrings = [ 'error on line 5, column 14: Variable is not defined.\n' - ' ╷\n' - '5 │ var-a: var(b);\n' - ' │ ^^\n' - ' ╵', + ' ,\n' + '5 | var-a: var(b);\n' + ' | ^^\n' + ' \'', 'error on line 6, column 14: Variable is not defined.\n' - ' ╷\n' - '6 │ var-b: var(c);\n' - ' │ ^^\n' - ' ╵', + ' ,\n' + '6 | var-b: var(c);\n' + ' | ^^\n' + ' \'', 'error on line 9, column 16: Variable is not defined.\n' - ' ╷\n' - '9 │ var-one: var(two);\n' - ' │ ^^^^\n' - ' ╵', + ' ,\n' + '9 | var-one: var(two);\n' + ' | ^^^^\n' + ' \'', 'error on line 12, column 17: Variable is not defined.\n' - ' ╷\n' - '12 │ var-four: var(five);\n' - ' │ ^^^^^\n' - ' ╵', + ' ,\n' + '12 | var-four: var(five);\n' + ' | ^^^^^\n' + ' \'', 'error on line 13, column 17: Variable is not defined.\n' - ' ╷\n' - '13 │ var-five: var(six);\n' - ' │ ^^^^\n' - ' ╵', + ' ,\n' + '13 | var-five: var(six);\n' + ' | ^^^^\n' + ' \'', 'error on line 16, column 18: Variable is not defined.\n' - ' ╷\n' - '16 │ var-def-1: var(def-2);\n' - ' │ ^^^^^^\n' - ' ╵', + ' ,\n' + '16 | var-def-1: var(def-2);\n' + ' | ^^^^^^\n' + ' \'', 'error on line 17, column 18: Variable is not defined.\n' - ' ╷\n' - '17 │ var-def-2: var(def-3);\n' - ' │ ^^^^^^\n' - ' ╵', + ' ,\n' + '17 | var-def-2: var(def-3);\n' + ' | ^^^^^^\n' + ' \'', ]; var generated = r''' @@ -943,6 +944,7 @@ void includes() { } void main() { + glyph.ascii = true; test('Simple var', simpleVar); test('Expressions var', expressionsVar); test('Default value in var()', defaultVar); From d8f885ddf5c943dac4f2c57506ca152691c58180 Mon Sep 17 00:00:00 2001 From: Jennifer Thakar Date: Mon, 6 Dec 2021 14:09:22 -0800 Subject: [PATCH 187/245] Support math in min, max, and clamp Fixes dart-lang/csslib#144. --- pkgs/csslib/CHANGELOG.md | 5 +++++ pkgs/csslib/lib/parser.dart | 3 ++- pkgs/csslib/pubspec.yaml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index bd16a8da1..18907e1ca 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.17.2 + +- Fixed a crash caused by `min()`, `max()` and `clamp()` functions that contain + mathematical expressions. + ## 0.17.1 - Fix `Color.css` constructor when there are double values in the `rgba` string. diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 9800e8c0c..f3c8c24fa 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2610,7 +2610,8 @@ class _Parser { var start = _peekToken.span; var name = func.name; - if (name == 'calc' || name == '-webkit-calc' || name == '-moz-calc') { + if ({'calc', '-webkit-calc', '-moz-calc', 'min', 'max', 'clamp'} + .contains(name)) { // TODO(terry): Implement expression parsing properly. var expression = processCalcExpression(); var calcExpr = LiteralTerm(expression, expression, _makeSpan(start)); diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 8bcc14462..a71911ba2 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.17.1 +version: 0.17.2 description: A library for parsing and analyzing CSS (Cascading Style Sheets) repository: https://github.com/dart-lang/csslib From c5041795c665921ed8fed065001d98402e7c1fe4 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Mon, 6 Dec 2021 15:15:44 -0800 Subject: [PATCH 188/245] Comma separate keyframe percentage lists (dart-lang/csslib#143) Fixes dart-lang/csslib#105 Check for `PercentageTerm` expressions when emitting CSS, separate neighboring percentage terms with commas. Lowercase the `AND` for media queries. Fix some typos in comments. Co-authored-by: zzwx <8169082+zzwx@users.noreply.github.com> --- pkgs/csslib/CHANGELOG.md | 2 + pkgs/csslib/lib/src/css_printer.dart | 7 +- pkgs/csslib/lib/src/tree.dart | 3 +- pkgs/csslib/pubspec.yaml | 1 + pkgs/csslib/test/declaration_test.dart | 26 ++--- pkgs/csslib/test/error_test.dart | 1 - pkgs/csslib/test/keyframes_test.dart | 141 +++++++++++++++++++++++++ pkgs/csslib/test/nested_test.dart | 2 +- pkgs/csslib/test/testing.dart | 4 +- 9 files changed, 166 insertions(+), 21 deletions(-) create mode 100644 pkgs/csslib/test/keyframes_test.dart diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 18907e1ca..2ff264d73 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,5 +1,7 @@ ## 0.17.2 +- Comma separate keyframe percentage lists. +- Use lowercase `and` in media queries. - Fixed a crash caused by `min()`, `max()` and `clamp()` functions that contain mathematical expressions. diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 0f5b82272..1eac3344a 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -55,7 +55,7 @@ class CssPrinter extends Visitor { @override void visitMediaExpression(MediaExpression node) { - emit(node.andOperator ? ' AND ' : ' '); + emit(node.andOperator ? ' and ' : ' '); emit('(${node.mediaFeature}'); if (node.exprs.expressions.isNotEmpty) { emit(':'); @@ -612,7 +612,7 @@ class CssPrinter extends Visitor { var expressions = node.expressions; var expressionsLength = expressions.length; for (var i = 0; i < expressionsLength; i++) { - // Add space seperator between terms without an operator. + // Add space separator between terms without an operator. // TODO(terry): Should have a BinaryExpression to solve this problem. var expression = expressions[i]; if (i > 0 && @@ -624,6 +624,9 @@ class CssPrinter extends Visitor { var previous = expressions[i - 1]; if (previous is OperatorComma || previous is OperatorSlash) { emit(_sp); + } else if (previous is PercentageTerm && expression is PercentageTerm) { + emit(','); + emit(_sp); } else { emit(' '); } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 3af71dcdc..3c66ac77c 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -716,8 +716,7 @@ class MediaQuery extends TreeNode { bool get hasUnary => _mediaUnary != -1; String get unary => - TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary)! - .toUpperCase(); + TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary)!; @override SourceSpan get span => super.span!; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index a71911ba2..e224b0ac0 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -13,4 +13,5 @@ dependencies: dev_dependencies: path: ^1.8.0 pedantic: ^1.10.0 + term_glyph: ^1.2.0 test: ^1.16.0 diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 6cccc9c7a..64e84ce9a 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -348,7 +348,7 @@ void testMediaQueries() { } }'''; var generated = ''' -@media screen AND (-webkit-min-device-pixel-ratio:0) { +@media screen and (-webkit-min-device-pixel-ratio:0) { .todo-item .toggle { background: none; } @@ -381,7 +381,7 @@ void testMediaQueries() { } }'''; generated = - '''@media handheld AND (min-width:20em), screen AND (min-width:20em) { + '''@media handheld and (min-width:20em), screen and (min-width:20em) { #id { color: #f00; } @@ -389,12 +389,12 @@ void testMediaQueries() { height: 20px; } } -@media print AND (min-resolution:300dpi) { +@media print and (min-resolution:300dpi) { #anotherId { color: #fff; } } -@media print AND (min-resolution:280dpcm) { +@media print and (min-resolution:280dpcm) { #finalId { color: #aaa; } @@ -415,8 +415,8 @@ void testMediaQueries() { font-size: 10em; } }'''; - generated = '@media ONLY screen AND (min-device-width:4000px) ' - 'AND (min-device-height:2000px), screen AND (another:100px) {\n' + generated = '@media only screen and (min-device-width:4000px) ' + 'and (min-device-height:2000px), screen and (another:100px) {\n' 'html {\n font-size: 10em;\n}\n}'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -431,8 +431,8 @@ void testMediaQueries() { font-size: 10em; } }'''; - generated = '@media screen, print AND (min-device-width:4000px) AND ' - '(min-device-height:2000px), screen AND (another:100px) {\n' + generated = '@media screen, print and (min-device-width:4000px) and ' + '(min-device-height:2000px), screen and (another:100px) {\n' 'html {\n font-size: 10em;\n}\n}'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -442,8 +442,8 @@ void testMediaQueries() { input = ''' @import "test.css" ONLY screen, NOT print AND (min-device-width: 4000px);'''; - generated = '@import "test.css" ONLY screen, ' - 'NOT print AND (min-device-width:4000px);'; + generated = '@import "test.css" only screen, ' + 'not print and (min-device-width:4000px);'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -453,10 +453,10 @@ void testMediaQueries() { var css = '@media (min-device-width:400px) {\n}'; expectCss(css, css); - css = '@media all AND (tranform-3d), (-webkit-transform-3d) {\n}'; + css = '@media all and (transform-3d), (-webkit-transform-3d) {\n}'; expectCss(css, css); - // Test that AND operator is required between media type and expressions. + // Test that 'and' operator is required between media type and expressions. css = '@media screen (min-device-width:400px'; stylesheet = parseCss(css, errors: errors..clear(), opts: simpleOptions); expect(errors, isNotEmpty); @@ -862,7 +862,7 @@ div { '@page{@top-left{color:red}}' '@page:first{}' '@page foo:first{}' - '@media screen AND (max-width:800px){div{font-size:24px}}' + '@media screen and (max-width:800px){div{font-size:24px}}' '@keyframes foo{0%{transform:scaleX(0)}}' 'div{color:rgba(0,0,0,0.2)}'; diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index b6be913f7..354350202 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -131,7 +131,6 @@ void testBadSelectors() { var input = '# foo { color: #ff00ff; }'; parseCss(input, errors: errors); - expect(errors, isNotEmpty); expect(errors[0].toString(), ''' error on line 1, column 1: Not a valid ID selector expected #id , diff --git a/pkgs/csslib/test/keyframes_test.dart b/pkgs/csslib/test/keyframes_test.dart new file mode 100644 index 000000000..24a956c69 --- /dev/null +++ b/pkgs/csslib/test/keyframes_test.dart @@ -0,0 +1,141 @@ +library extend_test; + +import 'package:csslib/src/messages.dart'; +import 'package:test/test.dart'; + +import 'testing.dart'; + +void compileAndValidate(String input, String generated) { + var errors = []; + var stylesheet = compileCss(input, errors: errors, opts: options); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + +void singleKeyframesList() { + compileAndValidate(r''' +@keyframes ping { + 75%, 100% { + transform: scale(2); + opacity: 0; + } +}''', r''' +@keyframes ping { + 75%, 100% { + transform: scale(2); + opacity: 0; + } +}'''); +} + +void keyframesList() { + compileAndValidate(r''' +@keyframes spin { + to { + transform: rotate(360deg); + } +} +@-webkit-keyframes ping { + 75%, 100% { + transform: scale(2); + opacity: 0; + } +} +@keyframes ping { + 75%, 100% { + transform: scale(2); + opacity: 0; + } +} +@-webkit-keyframes pulse { + 50% { + opacity: 0.5; + } +} +@keyframes pulse { + 50% { + opacity: 0.5; + } +} +@-webkit-keyframes bounce { + 0%, 100% { + transform: translateY(-25%); + -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + 50% { + transform: none; + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } +} +@keyframes bounce { + 0%, 100% { + transform: translateY(-25%); + -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + 50% { + transform: none; + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } +} +''', r''' +@keyframes spin { + to { + transform: rotate(360deg); + } +} +@-webkit-keyframes ping { + 75%, 100% { + transform: scale(2); + opacity: 0; + } +} +@keyframes ping { + 75%, 100% { + transform: scale(2); + opacity: 0; + } +} +@-webkit-keyframes pulse { + 50% { + opacity: 0.5; + } +} +@keyframes pulse { + 50% { + opacity: 0.5; + } +} +@-webkit-keyframes bounce { + 0%, 100% { + transform: translateY(-25%); + -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + 50% { + transform: none; + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } +} +@keyframes bounce { + 0%, 100% { + transform: translateY(-25%); + -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + 50% { + transform: none; + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } +}'''); +} + +void main() { + test('Single Keyframes List', singleKeyframesList); + test('Keyframes List', keyframesList); +} diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index a594969ea..f099de875 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -353,7 +353,7 @@ void mediaNesting() { } } '''; - final generated = r'''@media screen AND (-webkit-min-device-pixel-ratio:0) { + final generated = r'''@media screen and (-webkit-min-device-pixel-ratio:0) { #toggle-all { image: url("test.jpb"); color: #f00; diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 2a51fdbd8..e41a81033 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -57,13 +57,13 @@ final _cssVisitor = Visitor(); /// Pretty printer for CSS. String prettyPrint(StyleSheet ss) { - // Walk the tree testing basic Vistor class. + // Walk the tree testing basic Visitor class. walkTree(ss); return (_emitCss..visitTree(ss, pretty: true)).toString(); } /// Helper function to emit compact (non-pretty printed) CSS for suite test -/// comparsions. Spaces, new lines, etc. are reduced for easier comparsions of +/// comparisons. Spaces, new lines, etc. are reduced for easier comparisons of /// expected suite test results. String compactOutput(StyleSheet ss) { walkTree(ss); From a3bef4379d29f3c0b41493186820194a05730321 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Mon, 6 Dec 2021 15:15:59 -0800 Subject: [PATCH 189/245] Use a const set to list calc functions (dart-lang/csslib#146) Avoid creating a fresh set on every call. --- pkgs/csslib/lib/parser.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index f3c8c24fa..d80dc0060 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2610,7 +2610,7 @@ class _Parser { var start = _peekToken.span; var name = func.name; - if ({'calc', '-webkit-calc', '-moz-calc', 'min', 'max', 'clamp'} + if (const {'calc', '-webkit-calc', '-moz-calc', 'min', 'max', 'clamp'} .contains(name)) { // TODO(terry): Implement expression parsing properly. var expression = processCalcExpression(); From 8bf6279c9daad4b146be81732a0ac251cfbfd612 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Tue, 7 Dec 2021 10:21:21 -0800 Subject: [PATCH 190/245] Revert "Comma separate keyframe percentage lists (dart-lang/csslib#143)" (dart-lang/csslib#147) This reverts commit c5041795c665921ed8fed065001d98402e7c1fe4. --- pkgs/csslib/CHANGELOG.md | 2 - pkgs/csslib/lib/src/css_printer.dart | 7 +- pkgs/csslib/lib/src/tree.dart | 3 +- pkgs/csslib/pubspec.yaml | 1 - pkgs/csslib/test/declaration_test.dart | 26 ++--- pkgs/csslib/test/error_test.dart | 1 + pkgs/csslib/test/keyframes_test.dart | 141 ------------------------- pkgs/csslib/test/nested_test.dart | 2 +- pkgs/csslib/test/testing.dart | 4 +- 9 files changed, 21 insertions(+), 166 deletions(-) delete mode 100644 pkgs/csslib/test/keyframes_test.dart diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 2ff264d73..18907e1ca 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,7 +1,5 @@ ## 0.17.2 -- Comma separate keyframe percentage lists. -- Use lowercase `and` in media queries. - Fixed a crash caused by `min()`, `max()` and `clamp()` functions that contain mathematical expressions. diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 1eac3344a..0f5b82272 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -55,7 +55,7 @@ class CssPrinter extends Visitor { @override void visitMediaExpression(MediaExpression node) { - emit(node.andOperator ? ' and ' : ' '); + emit(node.andOperator ? ' AND ' : ' '); emit('(${node.mediaFeature}'); if (node.exprs.expressions.isNotEmpty) { emit(':'); @@ -612,7 +612,7 @@ class CssPrinter extends Visitor { var expressions = node.expressions; var expressionsLength = expressions.length; for (var i = 0; i < expressionsLength; i++) { - // Add space separator between terms without an operator. + // Add space seperator between terms without an operator. // TODO(terry): Should have a BinaryExpression to solve this problem. var expression = expressions[i]; if (i > 0 && @@ -624,9 +624,6 @@ class CssPrinter extends Visitor { var previous = expressions[i - 1]; if (previous is OperatorComma || previous is OperatorSlash) { emit(_sp); - } else if (previous is PercentageTerm && expression is PercentageTerm) { - emit(','); - emit(_sp); } else { emit(' '); } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 3c66ac77c..3af71dcdc 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -716,7 +716,8 @@ class MediaQuery extends TreeNode { bool get hasUnary => _mediaUnary != -1; String get unary => - TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary)!; + TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary)! + .toUpperCase(); @override SourceSpan get span => super.span!; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index e224b0ac0..a71911ba2 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -13,5 +13,4 @@ dependencies: dev_dependencies: path: ^1.8.0 pedantic: ^1.10.0 - term_glyph: ^1.2.0 test: ^1.16.0 diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 64e84ce9a..6cccc9c7a 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -348,7 +348,7 @@ void testMediaQueries() { } }'''; var generated = ''' -@media screen and (-webkit-min-device-pixel-ratio:0) { +@media screen AND (-webkit-min-device-pixel-ratio:0) { .todo-item .toggle { background: none; } @@ -381,7 +381,7 @@ void testMediaQueries() { } }'''; generated = - '''@media handheld and (min-width:20em), screen and (min-width:20em) { + '''@media handheld AND (min-width:20em), screen AND (min-width:20em) { #id { color: #f00; } @@ -389,12 +389,12 @@ void testMediaQueries() { height: 20px; } } -@media print and (min-resolution:300dpi) { +@media print AND (min-resolution:300dpi) { #anotherId { color: #fff; } } -@media print and (min-resolution:280dpcm) { +@media print AND (min-resolution:280dpcm) { #finalId { color: #aaa; } @@ -415,8 +415,8 @@ void testMediaQueries() { font-size: 10em; } }'''; - generated = '@media only screen and (min-device-width:4000px) ' - 'and (min-device-height:2000px), screen and (another:100px) {\n' + generated = '@media ONLY screen AND (min-device-width:4000px) ' + 'AND (min-device-height:2000px), screen AND (another:100px) {\n' 'html {\n font-size: 10em;\n}\n}'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -431,8 +431,8 @@ void testMediaQueries() { font-size: 10em; } }'''; - generated = '@media screen, print and (min-device-width:4000px) and ' - '(min-device-height:2000px), screen and (another:100px) {\n' + generated = '@media screen, print AND (min-device-width:4000px) AND ' + '(min-device-height:2000px), screen AND (another:100px) {\n' 'html {\n font-size: 10em;\n}\n}'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -442,8 +442,8 @@ void testMediaQueries() { input = ''' @import "test.css" ONLY screen, NOT print AND (min-device-width: 4000px);'''; - generated = '@import "test.css" only screen, ' - 'not print and (min-device-width:4000px);'; + generated = '@import "test.css" ONLY screen, ' + 'NOT print AND (min-device-width:4000px);'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -453,10 +453,10 @@ void testMediaQueries() { var css = '@media (min-device-width:400px) {\n}'; expectCss(css, css); - css = '@media all and (transform-3d), (-webkit-transform-3d) {\n}'; + css = '@media all AND (tranform-3d), (-webkit-transform-3d) {\n}'; expectCss(css, css); - // Test that 'and' operator is required between media type and expressions. + // Test that AND operator is required between media type and expressions. css = '@media screen (min-device-width:400px'; stylesheet = parseCss(css, errors: errors..clear(), opts: simpleOptions); expect(errors, isNotEmpty); @@ -862,7 +862,7 @@ div { '@page{@top-left{color:red}}' '@page:first{}' '@page foo:first{}' - '@media screen and (max-width:800px){div{font-size:24px}}' + '@media screen AND (max-width:800px){div{font-size:24px}}' '@keyframes foo{0%{transform:scaleX(0)}}' 'div{color:rgba(0,0,0,0.2)}'; diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 354350202..b6be913f7 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -131,6 +131,7 @@ void testBadSelectors() { var input = '# foo { color: #ff00ff; }'; parseCss(input, errors: errors); + expect(errors, isNotEmpty); expect(errors[0].toString(), ''' error on line 1, column 1: Not a valid ID selector expected #id , diff --git a/pkgs/csslib/test/keyframes_test.dart b/pkgs/csslib/test/keyframes_test.dart deleted file mode 100644 index 24a956c69..000000000 --- a/pkgs/csslib/test/keyframes_test.dart +++ /dev/null @@ -1,141 +0,0 @@ -library extend_test; - -import 'package:csslib/src/messages.dart'; -import 'package:test/test.dart'; - -import 'testing.dart'; - -void compileAndValidate(String input, String generated) { - var errors = []; - var stylesheet = compileCss(input, errors: errors, opts: options); - expect(errors.isEmpty, true, reason: errors.toString()); - expect(prettyPrint(stylesheet), generated); -} - -void singleKeyframesList() { - compileAndValidate(r''' -@keyframes ping { - 75%, 100% { - transform: scale(2); - opacity: 0; - } -}''', r''' -@keyframes ping { - 75%, 100% { - transform: scale(2); - opacity: 0; - } -}'''); -} - -void keyframesList() { - compileAndValidate(r''' -@keyframes spin { - to { - transform: rotate(360deg); - } -} -@-webkit-keyframes ping { - 75%, 100% { - transform: scale(2); - opacity: 0; - } -} -@keyframes ping { - 75%, 100% { - transform: scale(2); - opacity: 0; - } -} -@-webkit-keyframes pulse { - 50% { - opacity: 0.5; - } -} -@keyframes pulse { - 50% { - opacity: 0.5; - } -} -@-webkit-keyframes bounce { - 0%, 100% { - transform: translateY(-25%); - -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); - animation-timing-function: cubic-bezier(0.8, 0, 1, 1); - } - 50% { - transform: none; - -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); - animation-timing-function: cubic-bezier(0, 0, 0.2, 1); - } -} -@keyframes bounce { - 0%, 100% { - transform: translateY(-25%); - -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); - animation-timing-function: cubic-bezier(0.8, 0, 1, 1); - } - 50% { - transform: none; - -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); - animation-timing-function: cubic-bezier(0, 0, 0.2, 1); - } -} -''', r''' -@keyframes spin { - to { - transform: rotate(360deg); - } -} -@-webkit-keyframes ping { - 75%, 100% { - transform: scale(2); - opacity: 0; - } -} -@keyframes ping { - 75%, 100% { - transform: scale(2); - opacity: 0; - } -} -@-webkit-keyframes pulse { - 50% { - opacity: 0.5; - } -} -@keyframes pulse { - 50% { - opacity: 0.5; - } -} -@-webkit-keyframes bounce { - 0%, 100% { - transform: translateY(-25%); - -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); - animation-timing-function: cubic-bezier(0.8, 0, 1, 1); - } - 50% { - transform: none; - -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); - animation-timing-function: cubic-bezier(0, 0, 0.2, 1); - } -} -@keyframes bounce { - 0%, 100% { - transform: translateY(-25%); - -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); - animation-timing-function: cubic-bezier(0.8, 0, 1, 1); - } - 50% { - transform: none; - -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); - animation-timing-function: cubic-bezier(0, 0, 0.2, 1); - } -}'''); -} - -void main() { - test('Single Keyframes List', singleKeyframesList); - test('Keyframes List', keyframesList); -} diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index f099de875..a594969ea 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -353,7 +353,7 @@ void mediaNesting() { } } '''; - final generated = r'''@media screen and (-webkit-min-device-pixel-ratio:0) { + final generated = r'''@media screen AND (-webkit-min-device-pixel-ratio:0) { #toggle-all { image: url("test.jpb"); color: #f00; diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index e41a81033..2a51fdbd8 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -57,13 +57,13 @@ final _cssVisitor = Visitor(); /// Pretty printer for CSS. String prettyPrint(StyleSheet ss) { - // Walk the tree testing basic Visitor class. + // Walk the tree testing basic Vistor class. walkTree(ss); return (_emitCss..visitTree(ss, pretty: true)).toString(); } /// Helper function to emit compact (non-pretty printed) CSS for suite test -/// comparisons. Spaces, new lines, etc. are reduced for easier comparisons of +/// comparsions. Spaces, new lines, etc. are reduced for easier comparsions of /// expected suite test results. String compactOutput(StyleSheet ss) { walkTree(ss); From 8657476652e13d56e382ec493d869bbf996cb13c Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Tue, 8 Feb 2022 16:48:14 -0800 Subject: [PATCH 191/245] Avoid dynamic calls --- pkgs/csslib/analysis_options.yaml | 1 + pkgs/csslib/lib/parser.dart | 8 +++++--- pkgs/csslib/lib/src/analyzer.dart | 17 ++++++++++------- pkgs/csslib/lib/src/token_kind.dart | 3 ++- pkgs/csslib/lib/src/tree.dart | 4 +++- pkgs/csslib/lib/src/tree_base.dart | 2 +- pkgs/csslib/lib/visitor.dart | 5 +++-- 7 files changed, 25 insertions(+), 15 deletions(-) diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index 1df858df0..6bafdbe1a 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -5,6 +5,7 @@ analyzer: linter: rules: + - avoid_dynamic_calls - prefer_equal_for_default_values - prefer_generic_function_type_aliases - prefer_typing_uninitialized_variables diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index d80dc0060..f6623da18 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2255,7 +2255,8 @@ class _Parser { _warning('Expected hex number', _makeSpan(start)); } // Construct the bad hex value with a #number. - return _parseHex(' ${processTerm().text}', _makeSpan(start)); + return _parseHex( + ' ${(processTerm() as LiteralTerm).text}', _makeSpan(start)); case TokenKind.INTEGER: t = _next(); value = int.parse('$unary${t.text}'); @@ -2292,13 +2293,14 @@ class _Parser { _next(); var term = processTerm(); - if (!(term is NumberTerm)) { + if (term is! NumberTerm) { _error('Expecting a positive number', _makeSpan(start)); + throw StateError('Expecting a positive number'); } _eat(TokenKind.RBRACK); - return ItemTerm(term.value, term.text as String, _makeSpan(start)); + return ItemTerm(term.value, term.text, _makeSpan(start)); case TokenKind.IDENTIFIER: var nameValue = identifier(); // Snarf up the ident we'll remap, maybe. diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 6d33e2532..7cea7e8e3 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -622,13 +622,16 @@ class CallMixin extends Visitor { /// Rip apart var def with multiple parameters. List> _varDefsAsCallArgs(var callArg) { var defArgs = >[]; - if (callArg is List && callArg[0] is VarUsage) { - var varDef = varDefs![callArg[0].name]; - var expressions = (varDef!.expression as Expressions).expressions; - assert(expressions.length > 1); - for (var expr in expressions) { - if (expr is! OperatorComma) { - defArgs.add([expr]); + if (callArg is List) { + var firstCallArg = callArg[0]; + if (firstCallArg is VarUsage) { + var varDef = varDefs![firstCallArg.name]; + var expressions = (varDef!.expression as Expressions).expressions; + assert(expressions.length > 1); + for (var expr in expressions) { + if (expr is! OperatorComma) { + defArgs.add([expr]); + } } } } diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index 148a8354c..9018e2efc 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -518,8 +518,9 @@ class TokenKind { return matchList(MEDIA_OPERATORS, 'type', text, offset, length); } - static String? idToValue(var identList, int tokenId) { + static String? idToValue(Iterable identList, int tokenId) { for (var entry in identList) { + entry as Map; if (tokenId == entry['type']) { return entry['value'] as String?; } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 3af71dcdc..715519271 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -180,6 +180,8 @@ abstract class SimpleSelector extends TreeNode { SimpleSelector(this._name, SourceSpan? span) : super(span); + // TOOD(srawlins): Figure this one out. + // ignore: avoid_dynamic_calls String get name => _name.name as String; bool get isWildcard => _name is Wildcard; @@ -214,7 +216,7 @@ class NamespaceSelector extends SimpleSelector { ? '*' : _namespace == null ? '' - : _namespace.name as String; + : (_namespace as Identifier).name; bool get isNamespaceWildcard => _namespace is Wildcard; diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index db3a56c4f..e8243f098 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -50,7 +50,7 @@ class TreeOutput { buf.write('\n'); } - void heading(String name, [span]) { + void heading(String name, [SourceSpan? span]) { write(name); if (span != null) { buf.write(' (${span.message('')})'); diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index de30efc41..0b7356d2b 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -344,11 +344,12 @@ class Visitor implements VisitorBase { } @override - dynamic visitSimpleSelector(SimpleSelector node) => node._name.visit(this); + dynamic visitSimpleSelector(SimpleSelector node) => + (node._name as TreeNode).visit(this); @override dynamic visitNamespaceSelector(NamespaceSelector node) { - if (node._namespace != null) node._namespace.visit(this); + if (node._namespace != null) (node._namespace as TreeNode).visit(this); if (node.nameAsSimpleSelector != null) { node.nameAsSimpleSelector!.visit(this); } From 0bd8e984d7c2bb954d80e8862f9b6bfc9716ba35 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Tue, 8 Feb 2022 18:05:46 -0800 Subject: [PATCH 192/245] forgot-to-save --- pkgs/csslib/lib/src/tree_printer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 0d184006b..338b7e055 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -24,7 +24,7 @@ class _TreePrinter extends Visitor { @override void visitTree(StyleSheet tree) => visitStylesheet(tree); - void heading(String heading, node) { + void heading(String heading, TreeNode node) { if (useSpan) { output.heading(heading, node.span); } else { From 8f32727de5e405697a110215782169e4b2ffcc78 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Wed, 9 Feb 2022 14:54:36 -0800 Subject: [PATCH 193/245] Fix crash found in intenal presubmit --- pkgs/csslib/lib/parser.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index f6623da18..6e7f43d5b 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2292,10 +2292,9 @@ class _Parser { case TokenKind.LBRACK: _next(); - var term = processTerm(); + var term = processTerm() as LiteralTerm; if (term is! NumberTerm) { _error('Expecting a positive number', _makeSpan(start)); - throw StateError('Expecting a positive number'); } _eat(TokenKind.RBRACK); From cad92869f968dfcfea769476a3ff3e1e61243bc8 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Fri, 25 Feb 2022 12:58:22 -0800 Subject: [PATCH 194/245] Add commas between PercentageTerms in keyframes (dart-lang/csslib#151) Fixes dart-lang/csslib#105 A previous attempt unconditionally added commas between `PercentageTerm` values, but those terms can also show up in places where commas are not expected. Add state on the visitor to track whether we are in the context of a `keyframes` rule. I _think_ these are the only rules which need comma separated terms, and that it can't be nested in a way where naively reverting back to `false` after leaving should cause any problems. --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/lib/src/css_printer.dart | 8 ++++++++ pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/keyframes_test.dart | 22 ++++++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 pkgs/csslib/test/keyframes_test.dart diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 18907e1ca..cc5e34a45 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.17.3-dev + +- Add commas between PercentageTerms in keyframe rules. + ## 0.17.2 - Fixed a crash caused by `min()`, `max()` and `clamp()` functions that contain diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 0f5b82272..3218f3964 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -8,6 +8,7 @@ part of '../visitor.dart'; class CssPrinter extends Visitor { StringBuffer _buff = StringBuffer(); bool prettyPrint = true; + bool _isInKeyframes = false; /// Walk the [tree] Stylesheet. [pretty] if true emits line breaks, extra /// spaces, friendly property values, etc., if false emits compacted output. @@ -217,9 +218,11 @@ class CssPrinter extends Visitor { emit('$_newLine${node.keyFrameName} '); node.name!.visit(this); emit('$_sp{$_newLine'); + _isInKeyframes = true; for (final block in node._blocks) { block.visit(this); } + _isInKeyframes = false; emit('}'); } @@ -624,6 +627,11 @@ class CssPrinter extends Visitor { var previous = expressions[i - 1]; if (previous is OperatorComma || previous is OperatorSlash) { emit(_sp); + } else if (previous is PercentageTerm && + expression is PercentageTerm && + _isInKeyframes) { + emit(','); + emit(_sp); } else { emit(' '); } diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index a71911ba2..035ae111d 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.17.2 +version: 0.17.3-dev description: A library for parsing and analyzing CSS (Cascading Style Sheets) repository: https://github.com/dart-lang/csslib diff --git a/pkgs/csslib/test/keyframes_test.dart b/pkgs/csslib/test/keyframes_test.dart new file mode 100644 index 000000000..835c89693 --- /dev/null +++ b/pkgs/csslib/test/keyframes_test.dart @@ -0,0 +1,22 @@ +import 'package:csslib/src/messages.dart'; +import 'package:test/test.dart'; + +import 'testing.dart'; + +void main() { + test('keyframes', () { + final input = + r'@keyframes ping { 75%, 100% { transform: scale(2); opacity: 0; } }'; + var errors = []; + var stylesheet = compileCss(input, errors: errors, opts: options); + expect(errors, isEmpty); + final expected = r''' +@keyframes ping { + 75%, 100% { + transform: scale(2); + opacity: 0; + } +}'''; + expect(prettyPrint(stylesheet), expected); + }); +} From bbac468a6a62149e0c11fa208d47a46e294518f2 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Thu, 26 May 2022 15:59:52 -0700 Subject: [PATCH 195/245] Prepare to publish (dart-lang/csslib#152) The `0.17.2` version was inadvertently not published so go back to that version. --- pkgs/csslib/CHANGELOG.md | 5 +---- pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index cc5e34a45..9076c4f74 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,11 +1,8 @@ -## 0.17.3-dev - -- Add commas between PercentageTerms in keyframe rules. - ## 0.17.2 - Fixed a crash caused by `min()`, `max()` and `clamp()` functions that contain mathematical expressions. +- Add commas between PercentageTerms in keyframe rules. ## 0.17.1 diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 035ae111d..a71911ba2 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.17.3-dev +version: 0.17.2 description: A library for parsing and analyzing CSS (Cascading Style Sheets) repository: https://github.com/dart-lang/csslib From 40281360c045a9c6c914ed01c766621296a2c293 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Thu, 26 May 2022 16:37:38 -0700 Subject: [PATCH 196/245] Add missing dev_dependency on term_glyph (dart-lang/csslib#153) --- pkgs/csslib/pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index a71911ba2..e224b0ac0 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -13,4 +13,5 @@ dependencies: dev_dependencies: path: ^1.8.0 pedantic: ^1.10.0 + term_glyph: ^1.2.0 test: ^1.16.0 From e295f1822bd2729cb00ca4b00c569c439d1668cf Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 15 Nov 2022 07:46:58 -0800 Subject: [PATCH 197/245] blast_repo fixes (dart-lang/csslib#154) Dependabot GitHub Action --- pkgs/csslib/.github/dependabot.yml | 9 +++++++++ pkgs/csslib/.github/workflows/test-package.yml | 8 ++++---- 2 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 pkgs/csslib/.github/dependabot.yml diff --git a/pkgs/csslib/.github/dependabot.yml b/pkgs/csslib/.github/dependabot.yml new file mode 100644 index 000000000..1603cdd9e --- /dev/null +++ b/pkgs/csslib/.github/dependabot.yml @@ -0,0 +1,9 @@ +# Dependabot configuration file. +# See https://docs.github.com/en/code-security/dependabot/dependabot-version-updates +version: 2 + +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 09e10b05b..3ff40884f 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,8 +22,8 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@v2 - - uses: dart-lang/setup-dart@v1.0 + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d with: sdk: ${{ matrix.sdk }} - id: install @@ -49,8 +49,8 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [2.12.0, dev] steps: - - uses: actions/checkout@v2 - - uses: dart-lang/setup-dart@v1.0 + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d with: sdk: ${{ matrix.sdk }} - id: install From cb35d04516e54b4d5a3f40464bdab94eca71c6cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 13:04:22 -0800 Subject: [PATCH 198/245] Bump actions/checkout from 3.1.0 to 3.2.0 (dart-lang/csslib#156) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8...755da8c3cf115ac066823e79a1e1788f8940201b) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 3ff40884f..bbe77e9fa 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [2.12.0, dev] steps: - - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d with: sdk: ${{ matrix.sdk }} From a7f37e4ee43bca3924daeb3ee49e0cae74aace3d Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 9 Jan 2023 19:23:08 -0800 Subject: [PATCH 199/245] Migrate from no-implicit-casts to strict-casts (dart-lang/csslib#157) --- pkgs/csslib/analysis_options.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index 6bafdbe1a..04fbd3e34 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -1,7 +1,7 @@ include: package:pedantic/analysis_options.yaml analyzer: - strong-mode: - implicit-casts: false + language: + strict-casts: true linter: rules: From 28f722065fce371ea3a854b624d49ec1edd4f48d Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 26 Jan 2023 22:08:24 -0800 Subject: [PATCH 200/245] all the cleanup (dart-lang/csslib#155) Co-authored-by: Devon Carew --- .../csslib/.github/workflows/test-package.yml | 2 +- pkgs/csslib/CHANGELOG.md | 2 + pkgs/csslib/analysis_options.yaml | 12 +- pkgs/csslib/lib/parser.dart | 19 +- pkgs/csslib/lib/src/analyzer.dart | 52 ++--- pkgs/csslib/lib/src/css_printer.dart | 18 +- pkgs/csslib/lib/src/property.dart | 6 +- pkgs/csslib/lib/src/token.dart | 4 +- pkgs/csslib/lib/src/token_kind.dart | 26 +-- pkgs/csslib/lib/src/tokenizer.dart | 10 +- pkgs/csslib/lib/src/tree.dart | 182 ++++++++---------- pkgs/csslib/lib/src/tree_base.dart | 6 +- pkgs/csslib/lib/src/validate.dart | 3 +- pkgs/csslib/pubspec.yaml | 6 +- pkgs/csslib/test/big_1_test.dart | 5 +- pkgs/csslib/test/testing.dart | 4 +- .../csslib/test/third_party_samples_test.dart | 4 +- pkgs/csslib/test/visitor_test.dart | 10 +- 18 files changed, 182 insertions(+), 189 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index bbe77e9fa..e7e87b1b2 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -47,7 +47,7 @@ jobs: matrix: # Add macos-latest and/or windows-latest if relevant for this package. os: [ubuntu-latest, windows-latest] - sdk: [2.12.0, dev] + sdk: [2.17.0, dev] steps: - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 9076c4f74..7eccc3ad9 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,5 @@ +## 0.17.3-dev + ## 0.17.2 - Fixed a crash caused by `min()`, `max()` and `clamp()` functions that contain diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index 04fbd3e34..b4bcde7e5 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -1,14 +1,12 @@ -include: package:pedantic/analysis_options.yaml +include: package:lints/recommended.yaml + analyzer: language: strict-casts: true + strict-inference: true + strict-raw-types: true linter: rules: - avoid_dynamic_calls - - prefer_equal_for_default_values - - prefer_generic_function_type_aliases - - prefer_typing_uninitialized_variables - - slash_for_doc_comments - - unnecessary_const - - unnecessary_new + - use_super_parameters diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 6e7f43d5b..be74a067d 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -50,7 +50,7 @@ bool get isChecked => messages.options.checked; // TODO(terry): Remove nested name parameter. /// Parse and analyze the CSS file. -StyleSheet compile(input, +StyleSheet compile(Object input, {List? errors, PreprocessorOptions? options, bool nested = true, @@ -86,7 +86,8 @@ void analyze(List styleSheets, /// Parse the [input] CSS stylesheet into a tree. The [input] can be a [String], /// or [List] of bytes and returns a [StyleSheet] AST. The optional /// [errors] list will contain each error/warning as a [Message]. -StyleSheet parse(input, {List? errors, PreprocessorOptions? options}) { +StyleSheet parse(Object input, + {List? errors, PreprocessorOptions? options}) { var source = _inputAsString(input); _createMessages(errors: errors, options: options); @@ -99,7 +100,7 @@ StyleSheet parse(input, {List? errors, PreprocessorOptions? options}) { /// or [List] of bytes and returns a [StyleSheet] AST. The optional /// [errors] list will contain each error/warning as a [Message]. // TODO(jmesserly): should rename "parseSelector" and return Selector -StyleSheet selector(input, {List? errors}) { +StyleSheet selector(Object input, {List? errors}) { var source = _inputAsString(input); _createMessages(errors: errors); @@ -108,7 +109,7 @@ StyleSheet selector(input, {List? errors}) { return (_Parser(file, source)..tokenizer.inSelector = true).parseSelector(); } -SelectorGroup? parseSelectorGroup(input, {List? errors}) { +SelectorGroup? parseSelectorGroup(Object input, {List? errors}) { var source = _inputAsString(input); _createMessages(errors: errors); @@ -122,7 +123,7 @@ SelectorGroup? parseSelectorGroup(input, {List? errors}) { .processSelectorGroup(); } -String _inputAsString(input) { +String _inputAsString(Object input) { String source; if (input is String) { @@ -792,7 +793,7 @@ class _Parser { return decl is Declaration && decl is! IncludeMixinAtDeclaration; })) { var newDecls = []; - productions.forEach((include) { + for (var include in productions) { // If declGroup has items that are declarations then we assume // this mixin is a declaration mixin not a top-level mixin. if (include is IncludeDirective) { @@ -801,7 +802,7 @@ class _Parser { _warning('Error mixing of top-level vs declarations mixins', _makeSpan(include.span as FileSpan)); } - }); + } declGroup.declarations.insertAll(0, newDecls); productions = []; } else { @@ -812,7 +813,6 @@ class _Parser { productions .add(decl is IncludeMixinAtDeclaration ? decl.include : decl); } - ; declGroup.declarations.clear(); } @@ -2199,6 +2199,7 @@ class _Parser { return expressions; } + // ignore: constant_identifier_names static const int MAX_UNICODE = 0x10FFFF; // Term grammar: @@ -2738,7 +2739,7 @@ class _Parser { hexText[2] == hexText[3]) { hexText = '${hexText[0]}${hexText[2]}'; } else if (hexText.length == 2 && hexText[0] == hexText[1]) { - hexText = '${hexText[0]}'; + hexText = hexText[0]; } return HexColorTerm(hexValue, hexText, span); } diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 7cea7e8e3..475b096be 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -31,27 +31,29 @@ class Analyzer { // possibly combine in one walk. void run() { // Expand top-level @include. - _styleSheets.forEach( - (styleSheet) => TopLevelIncludes.expand(_messages, _styleSheets)); + TopLevelIncludes.expand(_messages, _styleSheets); // Expand @include in declarations. - _styleSheets.forEach( - (styleSheet) => DeclarationIncludes.expand(_messages, _styleSheets)); + DeclarationIncludes.expand(_messages, _styleSheets); // Remove all @mixin and @include - _styleSheets.forEach((styleSheet) => MixinsAndIncludes.remove(styleSheet)); + for (var styleSheet in _styleSheets) { + MixinsAndIncludes.remove(styleSheet); + } // Expand any nested selectors using selector desendant combinator to // signal CSS inheritance notation. - _styleSheets.forEach((styleSheet) => ExpandNestedSelectors() - ..visitStyleSheet(styleSheet) - ..flatten(styleSheet)); + for (var styleSheet in _styleSheets) { + ExpandNestedSelectors() + ..visitStyleSheet(styleSheet) + ..flatten(styleSheet); + } // Expand any @extend. - _styleSheets.forEach((styleSheet) { + for (var styleSheet in _styleSheets) { var allExtends = AllExtends()..visitStyleSheet(styleSheet); InheritExtends(_messages, allExtends).visitStyleSheet(styleSheet); - }); + } } } @@ -547,7 +549,7 @@ class _TopLevelIncludeReplacer extends Visitor { /// Utility function to match an include to a list of either Declarations or /// RuleSets, depending on type of mixin (ruleset or declaration). The include /// can be an include in a declaration or an include directive (top-level). -int _findInclude(List list, TreeNode node) { +int _findInclude(List list, TreeNode node) { final matchNode = (node is IncludeMixinAtDeclaration) ? node.include : node as IncludeDirective; @@ -565,7 +567,7 @@ int _findInclude(List list, TreeNode node) { /// parameters. class CallMixin extends Visitor { final MixinDefinition mixinDef; - List? _definedArgs; + List? _definedArgs; Expressions? _currExpressions; int _currIndex = -1; @@ -620,18 +622,16 @@ class CallMixin extends Visitor { } /// Rip apart var def with multiple parameters. - List> _varDefsAsCallArgs(var callArg) { + List> _varDefsAsCallArgs(List callArg) { var defArgs = >[]; - if (callArg is List) { - var firstCallArg = callArg[0]; - if (firstCallArg is VarUsage) { - var varDef = varDefs![firstCallArg.name]; - var expressions = (varDef!.expression as Expressions).expressions; - assert(expressions.length > 1); - for (var expr in expressions) { - if (expr is! OperatorComma) { - defArgs.add([expr]); - } + var firstCallArg = callArg[0]; + if (firstCallArg is VarUsage) { + var varDef = varDefs![firstCallArg.name]; + var expressions = (varDef!.expression as Expressions).expressions; + assert(expressions.length > 1); + for (var expr in expressions) { + if (expr is! OperatorComma) { + defArgs.add([expr]); } } } @@ -759,10 +759,10 @@ class DeclarationIncludes extends Visitor { var origRulesets = mixinDef.rulesets; var rulesets = []; if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) { - origRulesets.forEach((ruleset) { + for (var ruleset in origRulesets) { rulesets.add(IncludeMixinAtDeclaration( ruleset as IncludeDirective, ruleset.span)); - }); + } _IncludeReplacer.replace(_styleSheet!, node, rulesets); } } @@ -878,7 +878,7 @@ class MixinsAndIncludes extends Visitor { MixinsAndIncludes().visitStyleSheet(styleSheet); } - bool _nodesToRemove(node) => + bool _nodesToRemove(Object node) => node is IncludeDirective || node is MixinDefinition || node is NoOp; @override diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 3218f3964..de689a736 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -66,11 +66,11 @@ class CssPrinter extends Visitor { } @override - void visitMediaQuery(MediaQuery query) { - var unary = query.hasUnary ? ' ${query.unary}' : ''; - var mediaType = query.hasMediaType ? ' ${query.mediaType}' : ''; + void visitMediaQuery(MediaQuery node) { + var unary = node.hasUnary ? ' ${node.unary}' : ''; + var mediaType = node.hasMediaType ? ' ${node.mediaType}' : ''; emit('$unary$mediaType'); - for (var expression in query.expressions) { + for (var expression in node.expressions) { visitMediaExpression(expression); } } @@ -305,7 +305,7 @@ class CssPrinter extends Visitor { @override void visitRuleSet(RuleSet node) { - emit('$_newLine'); + emit(_newLine); node.selectorGroup!.visit(this); emit('$_sp{$_newLine'); node.declarationGroup.visit(this); @@ -330,10 +330,10 @@ class CssPrinter extends Visitor { @override void visitMarginGroup(MarginGroup node) { - var margin_sym_name = + var marginSymName = TokenKind.idToValue(TokenKind.MARGIN_DIRECTIVES, node.margin_sym); - emit('@$margin_sym_name$_sp{$_newLine'); + emit('@$marginSymName$_sp{$_newLine'); visitDeclarationGroup(node); @@ -381,7 +381,7 @@ class CssPrinter extends Visitor { @override void visitSimpleSelectorSequence(SimpleSelectorSequence node) { - emit('${node._combinatorToString}'); + emit(node._combinatorToString); node.simpleSelector.visit(this); } @@ -561,7 +561,7 @@ class CssPrinter extends Visitor { var terms = node._terms; var termsLength = terms.length; for (var i = 0; i < termsLength; i++) { - if (i > 0) emit('$_sp'); + if (i > 0) emit(_sp); terms[i].visit(this); } emit(')'); diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 87c181cda..68306c16a 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -172,15 +172,15 @@ class Color implements _StyleProperty, ColorBase { Color darker(num amount) { var newRgba = Color._createNewTintShadeFromRgba(rgba, -amount); - return Color.hex('${newRgba.toHexArgbString()}'); + return Color.hex(newRgba.toHexArgbString()); } Color lighter(num amount) { var newRgba = Color._createNewTintShadeFromRgba(rgba, amount); - return Color.hex('${newRgba.toHexArgbString()}'); + return Color.hex(newRgba.toHexArgbString()); } - static bool equal(ColorBase curr, other) { + static bool equal(ColorBase curr, Object other) { if (other is Color) { var o = other; return o.toHexArgbString() == curr.toHexArgbString(); diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index f3a2885a2..8bd9ca164 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -42,13 +42,13 @@ class Token { /// A token containing a parsed literal value. class LiteralToken extends Token { dynamic value; - LiteralToken(int kind, FileSpan span, this.value) : super(kind, span); + LiteralToken(super.kind, super.span, this.value); } /// A token containing error information. class ErrorToken extends Token { String? message; - ErrorToken(int kind, FileSpan span, this.message) : super(kind, span); + ErrorToken(super.kind, super.span, this.message); } /// CSS ident-token. diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index 9018e2efc..51ec1e5e2 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: constant_identifier_names + part of '../parser.dart'; // TODO(terry): Need to be consistent with tokens either they're ASCII tokens @@ -196,7 +198,7 @@ class TokenKind { static const int PSEUDO_CLASS_NAME = 705; // :pseudoClass static const int NEGATION = 706; // NOT - static const List> _DIRECTIVES = [ + static const List> _DIRECTIVES = [ {'type': TokenKind.DIRECTIVE_IMPORT, 'value': 'import'}, {'type': TokenKind.DIRECTIVE_MEDIA, 'value': 'media'}, {'type': TokenKind.DIRECTIVE_PAGE, 'value': 'page'}, @@ -223,13 +225,13 @@ class TokenKind { {'type': TokenKind.DIRECTIVE_MS_VIEWPORT, 'value': '-ms-viewport'}, ]; - static const List> MEDIA_OPERATORS = [ + static const List> MEDIA_OPERATORS = [ {'type': TokenKind.MEDIA_OP_ONLY, 'value': 'only'}, {'type': TokenKind.MEDIA_OP_NOT, 'value': 'not'}, {'type': TokenKind.MEDIA_OP_AND, 'value': 'and'}, ]; - static const List> MARGIN_DIRECTIVES = [ + static const List> MARGIN_DIRECTIVES = [ { 'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFTCORNER, 'value': 'top-left-corner' @@ -260,7 +262,7 @@ class TokenKind { {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM, 'value': 'right-bottom'}, ]; - static const List> _UNITS = [ + static const List> _UNITS = [ {'unit': TokenKind.UNIT_EM, 'value': 'em'}, {'unit': TokenKind.UNIT_EX, 'value': 'ex'}, {'unit': TokenKind.UNIT_LENGTH_PX, 'value': 'px'}, @@ -294,7 +296,7 @@ class TokenKind { static const int ASCII_UPPER_Z = 90; // ASCII value for uppercase Z // Extended color keywords: - static const List _EXTENDED_COLOR_NAMES = [ + static const List> _EXTENDED_COLOR_NAMES = [ {'name': 'aliceblue', 'value': 0xF08FF}, {'name': 'antiquewhite', 'value': 0xFAEBD7}, {'name': 'aqua', 'value': 0x00FFFF}, @@ -547,7 +549,7 @@ class TokenKind { /// Match color name, case insensitive match and return the associated color /// entry from _EXTENDED_COLOR_NAMES list, return [:null:] if not found. - static Map? matchColorName(String text) { + static Map? matchColorName(String text) { var name = text.toLowerCase(); for (var color in _EXTENDED_COLOR_NAMES) { if (color['name'] == name) return color; @@ -556,11 +558,11 @@ class TokenKind { } /// Return RGB value as [int] from a color entry in _EXTENDED_COLOR_NAMES. - static int colorValue(Map entry) { + static int colorValue(Map entry) { return entry['value'] as int; } - static String? hexToColorName(hexValue) { + static String? hexToColorName(Object hexValue) { for (final entry in _EXTENDED_COLOR_NAMES) { if (entry['value'] == hexValue) { return entry['name'] as String?; @@ -571,17 +573,17 @@ class TokenKind { } static String decimalToHex(int number, [int minDigits = 1]) { - final _HEX_DIGITS = '0123456789abcdef'; + final hexDigits = '0123456789abcdef'; var result = []; var dividend = number >> 4; var remain = number % 16; - result.add(_HEX_DIGITS[remain]); + result.add(hexDigits[remain]); while (dividend != 0) { remain = dividend % 16; dividend >>= 4; - result.add(_HEX_DIGITS[remain]); + result.add(hexDigits[remain]); } var invertResult = StringBuffer(); @@ -651,7 +653,7 @@ class TokenKind { case TokenKind.SINGLE_QUOTE: return "'"; case TokenKind.DOUBLE_QUOTE: - return '\"'; + return '"'; case TokenKind.SLASH: return '/'; case TokenKind.EQUALS: diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 07316be79..66f6a027a 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -6,17 +6,21 @@ part of '../parser.dart'; class Tokenizer extends TokenizerBase { /// U+ prefix for unicode characters. + // ignore: non_constant_identifier_names final UNICODE_U = 'U'.codeUnitAt(0); + // ignore: non_constant_identifier_names final UNICODE_LOWER_U = 'u'.codeUnitAt(0); + // ignore: non_constant_identifier_names final UNICODE_PLUS = '+'.codeUnitAt(0); + // ignore: non_constant_identifier_names final QUESTION_MARK = '?'.codeUnitAt(0); /// CDATA keyword. + // ignore: non_constant_identifier_names final List CDATA_NAME = 'CDATA'.codeUnits; - Tokenizer(SourceFile file, String text, bool skipWhitespace, [int index = 0]) - : super(file, text, skipWhitespace, index); + Tokenizer(super.file, super.text, super.skipWhitespace, [super.index]); @override Token next({bool unicodeRange = false}) { @@ -285,7 +289,7 @@ class Tokenizer extends TokenizerBase { eatHexDigits(startHex + 6); if (_index != startHex) { // Parse the hex digits and add that character. - chars.add(int.parse('0x' + _text.substring(startHex, _index))); + chars.add(int.parse('0x${_text.substring(startHex, _index)}')); if (_index == _text.length) break; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 715519271..7e9942653 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -29,7 +29,7 @@ class Identifier extends TreeNode { } class Wildcard extends TreeNode { - Wildcard(SourceSpan? span) : super(span); + Wildcard(super.span); @override Wildcard clone() => Wildcard(span); @override @@ -39,7 +39,7 @@ class Wildcard extends TreeNode { } class ThisOperator extends TreeNode { - ThisOperator(SourceSpan? span) : super(span); + ThisOperator(super.span); @override ThisOperator clone() => ThisOperator(span); @override @@ -49,7 +49,7 @@ class ThisOperator extends TreeNode { } class Negation extends TreeNode { - Negation(SourceSpan? span) : super(span); + Negation(super.span); @override Negation clone() => Negation(span); @override @@ -64,7 +64,7 @@ class Negation extends TreeNode { class CalcTerm extends LiteralTerm { final LiteralTerm expr; - CalcTerm(var value, String t, this.expr, SourceSpan? span) + CalcTerm(Object value, String t, this.expr, SourceSpan? span) : super(value, t, span); @override @@ -89,7 +89,7 @@ class CssComment extends TreeNode { // CDO/CDC (Comment Definition Open ). class CommentDefinition extends CssComment { - CommentDefinition(String comment, SourceSpan? span) : super(comment, span); + CommentDefinition(super.comment, super.span); @override CommentDefinition clone() => CommentDefinition(comment, span); @override @@ -135,9 +135,8 @@ class SimpleSelectorSequence extends TreeNode { final SimpleSelector simpleSelector; SimpleSelectorSequence(this.simpleSelector, SourceSpan? span, - [int combinator = TokenKind.COMBINATOR_NONE]) - : combinator = combinator, - super(span); + [this.combinator = TokenKind.COMBINATOR_NONE]) + : super(span); bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE; bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS; @@ -194,7 +193,7 @@ abstract class SimpleSelector extends TreeNode { // element name class ElementSelector extends SimpleSelector { - ElementSelector(name, SourceSpan? span) : super(name, span); + ElementSelector(super.name, super.span); @override dynamic visit(VisitorBase visitor) => visitor.visitElementSelector(this); @@ -209,7 +208,7 @@ class ElementSelector extends SimpleSelector { class NamespaceSelector extends SimpleSelector { final dynamic _namespace; // null, Wildcard or Identifier - NamespaceSelector(this._namespace, var name, SourceSpan? span) + NamespaceSelector(this._namespace, Object name, SourceSpan? span) : super(name, span); String get namespace => _namespace is Wildcard @@ -306,7 +305,7 @@ class AttributeSelector extends SimpleSelector { // #id class IdSelector extends SimpleSelector { - IdSelector(Identifier name, SourceSpan? span) : super(name, span); + IdSelector(Identifier super.name, super.span); @override IdSelector clone() => IdSelector(_name as Identifier, span); @override @@ -318,7 +317,7 @@ class IdSelector extends SimpleSelector { // .class class ClassSelector extends SimpleSelector { - ClassSelector(Identifier name, SourceSpan? span) : super(name, span); + ClassSelector(Identifier super.name, super.span); @override ClassSelector clone() => ClassSelector(_name as Identifier, span); @override @@ -330,7 +329,7 @@ class ClassSelector extends SimpleSelector { // :pseudoClass class PseudoClassSelector extends SimpleSelector { - PseudoClassSelector(Identifier name, SourceSpan? span) : super(name, span); + PseudoClassSelector(Identifier super.name, super.span); @override dynamic visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); @@ -346,9 +345,8 @@ class PseudoElementSelector extends SimpleSelector { // If true, this is a CSS2.1 pseudo-element with only a single ':'. final bool isLegacy; - PseudoElementSelector(Identifier name, SourceSpan? span, - {this.isLegacy = false}) - : super(name, span); + PseudoElementSelector(Identifier super.name, super.span, + {this.isLegacy = false}); @override dynamic visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); @@ -465,7 +463,7 @@ class StyleSheet extends TreeNode { } class TopLevelProduction extends TreeNode { - TopLevelProduction(SourceSpan? span) : super(span); + TopLevelProduction(super.span); @override SourceSpan get span => super.span!; @override @@ -493,7 +491,7 @@ class RuleSet extends TopLevelProduction { } class Directive extends TreeNode { - Directive(SourceSpan? span) : super(span); + Directive(super.span); bool get isBuiltIn => true; // Known CSS directive? bool get isExtension => false; // SCSS extension? @@ -553,7 +551,7 @@ class SupportsDirective extends Directive { } abstract class SupportsCondition extends TreeNode { - SupportsCondition(SourceSpan? span) : super(span); + SupportsCondition(super.span); @override SourceSpan get span => super.span!; } @@ -562,14 +560,11 @@ class SupportsConditionInParens extends SupportsCondition { /// A [Declaration] or nested [SupportsCondition]. final TreeNode? condition; - SupportsConditionInParens(Declaration? declaration, SourceSpan? span) - : condition = declaration, - super(span); + SupportsConditionInParens(Declaration? declaration, super.span) + : condition = declaration; - SupportsConditionInParens.nested( - SupportsCondition condition, SourceSpan? span) - : condition = condition, - super(span); + SupportsConditionInParens.nested(this.condition, SourceSpan? span) + : super(span); @override SupportsConditionInParens clone() => @@ -1029,7 +1024,7 @@ class IncludeDirective extends Directive { /// To support Sass @content. class ContentDirective extends Directive { - ContentDirective(SourceSpan? span) : super(span); + ContentDirective(super.span); @override dynamic visit(VisitorBase visitor) => visitor.visitContentDirective(this); @@ -1152,6 +1147,7 @@ class DeclarationGroup extends TreeNode { } class MarginGroup extends DeclarationGroup { + // ignore: non_constant_identifier_names final int margin_sym; // TokenType for for @margin sym. MarginGroup(this.margin_sym, List decls, SourceSpan? span) @@ -1183,7 +1179,7 @@ class VarUsage extends Expression { } class OperatorSlash extends Expression { - OperatorSlash(SourceSpan? span) : super(span); + OperatorSlash(super.span); @override OperatorSlash clone() => OperatorSlash(span); @override @@ -1191,7 +1187,7 @@ class OperatorSlash extends Expression { } class OperatorComma extends Expression { - OperatorComma(SourceSpan? span) : super(span); + OperatorComma(super.span); @override OperatorComma clone() => OperatorComma(span); @override @@ -1199,7 +1195,7 @@ class OperatorComma extends Expression { } class OperatorPlus extends Expression { - OperatorPlus(SourceSpan? span) : super(span); + OperatorPlus(super.span); @override OperatorPlus clone() => OperatorPlus(span); @override @@ -1207,7 +1203,7 @@ class OperatorPlus extends Expression { } class OperatorMinus extends Expression { - OperatorMinus(SourceSpan? span) : super(span); + OperatorMinus(super.span); @override OperatorMinus clone() => OperatorMinus(span); @override @@ -1233,7 +1229,7 @@ class LiteralTerm extends Expression { // TODO(terry): value and text fields can be made final once all CSS resources // are copied/symlink'd in the build tool and UriVisitor in // web_ui is removed. - dynamic value; + Object value; String text; LiteralTerm(this.value, this.text, SourceSpan? span) : super(span); @@ -1246,7 +1242,7 @@ class LiteralTerm extends Expression { } class NumberTerm extends LiteralTerm { - NumberTerm(value, String t, SourceSpan? span) : super(value, t, span); + NumberTerm(super.value, super.t, super.span); @override NumberTerm clone() => NumberTerm(value, text, span); @override @@ -1256,8 +1252,7 @@ class NumberTerm extends LiteralTerm { class UnitTerm extends LiteralTerm { final int unit; - UnitTerm(value, String t, SourceSpan? span, this.unit) - : super(value, t, span); + UnitTerm(super.value, super.t, super.span, this.unit); @override UnitTerm clone() => UnitTerm(value, text, span, unit); @@ -1272,15 +1267,14 @@ class UnitTerm extends LiteralTerm { } class LengthTerm extends UnitTerm { - LengthTerm(value, String t, SourceSpan? span, - [int unit = TokenKind.UNIT_LENGTH_PX]) - : super(value, t, span, unit) { - assert(this.unit == TokenKind.UNIT_LENGTH_PX || - this.unit == TokenKind.UNIT_LENGTH_CM || - this.unit == TokenKind.UNIT_LENGTH_MM || - this.unit == TokenKind.UNIT_LENGTH_IN || - this.unit == TokenKind.UNIT_LENGTH_PT || - this.unit == TokenKind.UNIT_LENGTH_PC); + LengthTerm(super.value, super.t, super.span, + [super.unit = TokenKind.UNIT_LENGTH_PX]) { + assert(unit == TokenKind.UNIT_LENGTH_PX || + unit == TokenKind.UNIT_LENGTH_CM || + unit == TokenKind.UNIT_LENGTH_MM || + unit == TokenKind.UNIT_LENGTH_IN || + unit == TokenKind.UNIT_LENGTH_PT || + unit == TokenKind.UNIT_LENGTH_PC); } @override LengthTerm clone() => LengthTerm(value, text, span, unit); @@ -1289,7 +1283,7 @@ class LengthTerm extends UnitTerm { } class PercentageTerm extends LiteralTerm { - PercentageTerm(value, String t, SourceSpan? span) : super(value, t, span); + PercentageTerm(super.value, super.t, super.span); @override PercentageTerm clone() => PercentageTerm(value, text, span); @override @@ -1297,7 +1291,7 @@ class PercentageTerm extends LiteralTerm { } class EmTerm extends LiteralTerm { - EmTerm(value, String t, SourceSpan? span) : super(value, t, span); + EmTerm(super.value, super.t, super.span); @override EmTerm clone() => EmTerm(value, text, span); @override @@ -1305,7 +1299,7 @@ class EmTerm extends LiteralTerm { } class ExTerm extends LiteralTerm { - ExTerm(value, String t, SourceSpan? span) : super(value, t, span); + ExTerm(super.value, super.t, super.span); @override ExTerm clone() => ExTerm(value, text, span); @override @@ -1313,13 +1307,12 @@ class ExTerm extends LiteralTerm { } class AngleTerm extends UnitTerm { - AngleTerm(var value, String t, SourceSpan? span, - [int unit = TokenKind.UNIT_LENGTH_PX]) - : super(value, t, span, unit) { - assert(this.unit == TokenKind.UNIT_ANGLE_DEG || - this.unit == TokenKind.UNIT_ANGLE_RAD || - this.unit == TokenKind.UNIT_ANGLE_GRAD || - this.unit == TokenKind.UNIT_ANGLE_TURN); + AngleTerm(super.value, super.t, super.span, + [super.unit = TokenKind.UNIT_LENGTH_PX]) { + assert(unit == TokenKind.UNIT_ANGLE_DEG || + unit == TokenKind.UNIT_ANGLE_RAD || + unit == TokenKind.UNIT_ANGLE_GRAD || + unit == TokenKind.UNIT_ANGLE_TURN); } @override @@ -1329,12 +1322,11 @@ class AngleTerm extends UnitTerm { } class TimeTerm extends UnitTerm { - TimeTerm(var value, String t, SourceSpan? span, - [int unit = TokenKind.UNIT_LENGTH_PX]) - : super(value, t, span, unit) { - assert(this.unit == TokenKind.UNIT_ANGLE_DEG || - this.unit == TokenKind.UNIT_TIME_MS || - this.unit == TokenKind.UNIT_TIME_S); + TimeTerm(super.value, super.t, super.span, + [super.unit = TokenKind.UNIT_LENGTH_PX]) { + assert(unit == TokenKind.UNIT_ANGLE_DEG || + unit == TokenKind.UNIT_TIME_MS || + unit == TokenKind.UNIT_TIME_S); } @override @@ -1344,7 +1336,7 @@ class TimeTerm extends UnitTerm { } class FreqTerm extends UnitTerm { - FreqTerm(var value, String t, SourceSpan? span, + FreqTerm(Object value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); @@ -1357,7 +1349,7 @@ class FreqTerm extends UnitTerm { } class FractionTerm extends LiteralTerm { - FractionTerm(var value, String t, SourceSpan? span) : super(value, t, span); + FractionTerm(super.value, super.t, super.span); @override FractionTerm clone() => FractionTerm(value, text, span); @@ -1375,7 +1367,7 @@ class UriTerm extends LiteralTerm { } class ResolutionTerm extends UnitTerm { - ResolutionTerm(var value, String t, SourceSpan? span, + ResolutionTerm(Object value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_RESOLUTION_DPI || @@ -1390,7 +1382,7 @@ class ResolutionTerm extends UnitTerm { } class ChTerm extends UnitTerm { - ChTerm(var value, String t, SourceSpan? span, + ChTerm(Object value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_CH); @@ -1403,7 +1395,7 @@ class ChTerm extends UnitTerm { } class RemTerm extends UnitTerm { - RemTerm(var value, String t, SourceSpan? span, + RemTerm(Object value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_REM); @@ -1416,7 +1408,7 @@ class RemTerm extends UnitTerm { } class ViewportTerm extends UnitTerm { - ViewportTerm(var value, String t, SourceSpan? span, + ViewportTerm(Object value, String t, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { assert(unit == TokenKind.UNIT_VIEWPORT_VW || @@ -1432,10 +1424,11 @@ class ViewportTerm extends UnitTerm { } /// Type to signal a bad hex value for HexColorTerm.value. +// ignore: camel_case_types class BAD_HEX_VALUE {} class HexColorTerm extends LiteralTerm { - HexColorTerm(var value, String t, SourceSpan? span) : super(value, t, span); + HexColorTerm(super.value, super.t, super.span); @override HexColorTerm clone() => HexColorTerm(value, text, span); @@ -1446,7 +1439,7 @@ class HexColorTerm extends LiteralTerm { class FunctionTerm extends LiteralTerm { final Expressions _params; - FunctionTerm(var value, String t, this._params, SourceSpan? span) + FunctionTerm(Object value, String t, this._params, SourceSpan? span) : super(value, t, span); @override @@ -1469,9 +1462,7 @@ class IE8Term extends LiteralTerm { class GroupTerm extends Expression { final List _terms; - GroupTerm(SourceSpan? span) - : _terms = [], - super(span); + GroupTerm(super.span) : _terms = []; void add(LiteralTerm term) { _terms.add(term); @@ -1484,7 +1475,7 @@ class GroupTerm extends Expression { } class ItemTerm extends NumberTerm { - ItemTerm(dynamic value, String t, SourceSpan? span) : super(value, t, span); + ItemTerm(super.value, super.t, super.span); @override ItemTerm clone() => ItemTerm(value, text, span); @@ -1495,7 +1486,7 @@ class ItemTerm extends NumberTerm { class Expressions extends Expression { final List expressions = []; - Expressions(SourceSpan? span) : super(span); + Expressions(super.span); void add(Expression expression) { expressions.add(expression); @@ -1599,9 +1590,9 @@ class FontExpression extends DartStyleExpression { super(DartStyleExpression.fontStyle, span); @override - FontExpression? merged(DartStyleExpression newFontExpr) { - if (newFontExpr is FontExpression && isFont && newFontExpr.isFont) { - return FontExpression.merge(this, newFontExpr); + FontExpression? merged(DartStyleExpression newDartExpr) { + if (newDartExpr is FontExpression && isFont && newDartExpr.isFont) { + return FontExpression.merge(this, newDartExpr); } return null; } @@ -1631,8 +1622,7 @@ class FontExpression extends DartStyleExpression { abstract class BoxExpression extends DartStyleExpression { final BoxEdge? box; - BoxExpression(int? styleType, SourceSpan? span, this.box) - : super(styleType, span); + BoxExpression(super.styleType, super.span, this.box); @override dynamic visit(VisitorBase visitor) => visitor.visitBoxExpression(this); @@ -1664,11 +1654,9 @@ class MarginExpression extends BoxExpression { : super(DartStyleExpression.marginStyle, span, box); @override - MarginExpression? merged(DartStyleExpression newMarginExpr) { - if (newMarginExpr is MarginExpression && - isMargin && - newMarginExpr.isMargin) { - return MarginExpression.merge(this, newMarginExpr); + MarginExpression? merged(DartStyleExpression newDartExpr) { + if (newDartExpr is MarginExpression && isMargin && newDartExpr.isMargin) { + return MarginExpression.merge(this, newDartExpr); } return null; @@ -1702,11 +1690,9 @@ class BorderExpression extends BoxExpression { : super(DartStyleExpression.borderStyle, span, box); @override - BorderExpression? merged(DartStyleExpression newBorderExpr) { - if (newBorderExpr is BorderExpression && - isBorder && - newBorderExpr.isBorder) { - return BorderExpression.merge(this, newBorderExpr); + BorderExpression? merged(DartStyleExpression newDartExpr) { + if (newDartExpr is BorderExpression && isBorder && newDartExpr.isBorder) { + return BorderExpression.merge(this, newDartExpr); } return null; @@ -1737,9 +1723,9 @@ class HeightExpression extends DartStyleExpression { : super(DartStyleExpression.heightStyle, span); @override - HeightExpression? merged(DartStyleExpression newHeightExpr) { - if (isHeight && newHeightExpr.isHeight) { - return newHeightExpr as HeightExpression; + HeightExpression? merged(DartStyleExpression newDartExpr) { + if (isHeight && newDartExpr.isHeight) { + return newDartExpr as HeightExpression; } return null; @@ -1758,9 +1744,9 @@ class WidthExpression extends DartStyleExpression { : super(DartStyleExpression.widthStyle, span); @override - WidthExpression? merged(DartStyleExpression newWidthExpr) { - if (newWidthExpr is WidthExpression && isWidth && newWidthExpr.isWidth) { - return newWidthExpr; + WidthExpression? merged(DartStyleExpression newDartExpr) { + if (newDartExpr is WidthExpression && isWidth && newDartExpr.isWidth) { + return newDartExpr; } return null; @@ -1783,11 +1769,11 @@ class PaddingExpression extends BoxExpression { : super(DartStyleExpression.paddingStyle, span, box); @override - PaddingExpression? merged(DartStyleExpression newPaddingExpr) { - if (newPaddingExpr is PaddingExpression && + PaddingExpression? merged(DartStyleExpression newDartExpr) { + if (newDartExpr is PaddingExpression && isPadding && - newPaddingExpr.isPadding) { - return PaddingExpression.merge(this, newPaddingExpr); + newDartExpr.isPadding) { + return PaddingExpression.merge(this, newDartExpr); } return null; diff --git a/pkgs/csslib/lib/src/tree_base.dart b/pkgs/csslib/lib/src/tree_base.dart index e8243f098..af55fdd3d 100644 --- a/pkgs/csslib/lib/src/tree_base.dart +++ b/pkgs/csslib/lib/src/tree_base.dart @@ -27,7 +27,7 @@ abstract class TreeNode { /// The base type for expressions. abstract class Expression extends TreeNode { - Expression(SourceSpan? span) : super(span); + Expression(super.span); @override Expression clone(); } @@ -58,7 +58,7 @@ class TreeOutput { buf.write('\n'); } - String toValue(value) { + String toValue(dynamic value) { if (value == null) { return 'null'; } else if (value is Identifier) { @@ -79,7 +79,7 @@ class TreeOutput { depth -= 1; } - void writeValue(String label, value) { + void writeValue(String label, dynamic value) { var v = toValue(value); writeln('$label: $v'); } diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index ec54553bd..e5f699c21 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -7,8 +7,7 @@ import 'package:source_span/source_span.dart'; /// Can be thrown on any Css runtime problem includes source location. class CssSelectorException extends SourceSpanException { - CssSelectorException(String message, [SourceSpan? span]) - : super(message, span); + CssSelectorException(super.message, [super.span]); } List classes = []; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index e224b0ac0..8492bd041 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,17 +1,17 @@ name: csslib -version: 0.17.2 +version: 0.17.3-dev description: A library for parsing and analyzing CSS (Cascading Style Sheets) repository: https://github.com/dart-lang/csslib environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=2.17.0 <3.0.0' dependencies: source_span: ^1.8.0 dev_dependencies: path: ^1.8.0 - pedantic: ^1.10.0 + lints: ^2.0.0 term_glyph: ^1.2.0 test: ^1.16.0 diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart index 75bc910c6..fdcc988b9 100644 --- a/pkgs/csslib/test/big_1_test.dart +++ b/pkgs/csslib/test/big_1_test.dart @@ -6,6 +6,7 @@ library big_1_test; import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; + import 'testing.dart'; void compilePolyfillAndValidate(String input, String generated) { @@ -15,7 +16,7 @@ void compilePolyfillAndValidate(String input, String generated) { expect(prettyPrint(stylesheet), generated); } -void big_test() { +void bigTest() { var input = r''' /******************************************************************** * Kennedy colors @@ -1162,5 +1163,5 @@ li.dropdown-menudivider { } void main() { - test('big #1', big_test); + test('big #1', bigTest); } diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 2a51fdbd8..acc57a2e7 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -45,9 +45,9 @@ StyleSheet compileCss(String cssInput, polyfill: polyfill, includes: includes); -StyleSheet polyFillCompileCss(input, +StyleSheet polyFillCompileCss(String input, {List? errors, PreprocessorOptions? opts}) => - compileCss(input as String, errors: errors, polyfill: true, opts: opts); + compileCss(input, errors: errors, polyfill: true, opts: opts); /// CSS emitter walks the style sheet tree and emits readable CSS. final _emitCss = CssPrinter(); diff --git a/pkgs/csslib/test/third_party_samples_test.dart b/pkgs/csslib/test/third_party_samples_test.dart index 7aed4ee23..d48b7d644 100644 --- a/pkgs/csslib/test/third_party_samples_test.dart +++ b/pkgs/csslib/test/third_party_samples_test.dart @@ -26,8 +26,8 @@ void testCSSFile(File cssFile) { void main() async { // Iterate over all sub-folders of third_party, // and then all css files in those. - final third_party = path.join(Directory.current.path, 'third_party'); - for (var entity in Directory(third_party).listSync()) { + final thirdParty = path.join(Directory.current.path, 'third_party'); + for (var entity in Directory(thirdParty).listSync()) { if (await FileSystemEntity.isDirectory(entity.path)) { for (var element in Directory(entity.path).listSync()) { if (element is File && element.uri.pathSegments.last.endsWith('.css')) { diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index a5346dd9e..f84599357 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -11,7 +11,7 @@ import 'package:test/test.dart'; import 'testing.dart'; class ClassVisitor extends Visitor { - final List expectedClasses; + final List expectedClasses; final foundClasses = {}; ClassVisitor(this.expectedClasses); @@ -23,12 +23,12 @@ class ClassVisitor extends Visitor { bool get matches { var match = true; - foundClasses.forEach((value) { + for (var value in foundClasses) { match = match && expectedClasses.contains(value); - }); - expectedClasses.forEach((value) { + } + for (var value in expectedClasses) { match = match && foundClasses.contains(value); - }); + } return match; } From 3b0647d63f4dc19c39a6e03cfa2e342bc3021bc4 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Sat, 28 Jan 2023 05:08:51 -0800 Subject: [PATCH 201/245] Update test-package.yml (dart-lang/csslib#165) --- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index e7e87b1b2..b27bee076 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -3,9 +3,9 @@ name: Dart CI on: # Run on PRs and pushes to the default branch. push: - branches: [ master ] + branches: [ main ] pull_request: - branches: [ master ] + branches: [ main ] schedule: - cron: "0 0 * * 0" From 6a2c2b88460254ffbd59ec0c317ebd26f2e6456c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 28 Jan 2023 09:44:37 -0800 Subject: [PATCH 202/245] Bump actions/checkout from 3.2.0 to 3.3.0 (dart-lang/csslib#163) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/755da8c3cf115ac066823e79a1e1788f8940201b...ac593985615ec2ede58e132d2e21d2b1cbd6127c) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index b27bee076..da0371693 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [2.17.0, dev] steps: - - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d with: sdk: ${{ matrix.sdk }} From 2b82d2b92fb787485f54b527d50f0da9eccdfa5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 28 Jan 2023 09:49:27 -0800 Subject: [PATCH 203/245] Bump dart-lang/setup-dart from 1.3 to 1.4 (dart-lang/csslib#164) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.3 to 1.4. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/6a218f2413a3e78e9087f638a238f6b40893203d...a57a6c04cf7d4840e88432aad6281d1e125f0d46) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index da0371693..fb727466b 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -23,7 +23,7 @@ jobs: sdk: [dev] steps: - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c - - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d + - uses: dart-lang/setup-dart@a57a6c04cf7d4840e88432aad6281d1e125f0d46 with: sdk: ${{ matrix.sdk }} - id: install @@ -50,7 +50,7 @@ jobs: sdk: [2.17.0, dev] steps: - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c - - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d + - uses: dart-lang/setup-dart@a57a6c04cf7d4840e88432aad6281d1e125f0d46 with: sdk: ${{ matrix.sdk }} - id: install From 611df61fe1ce20b4097a445b21e23a41f6ad30cc Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Sat, 28 Jan 2023 15:22:59 -0800 Subject: [PATCH 204/245] Update README.md (dart-lang/csslib#158) * Update README.md * update changelog --- pkgs/csslib/CHANGELOG.md | 3 +++ pkgs/csslib/README.md | 4 ++++ pkgs/csslib/pubspec.yaml | 1 - 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 7eccc3ad9..568cd170f 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,5 +1,8 @@ ## 0.17.3-dev +- Add markdown badges to the readme. +- Update to the latest `package:lints`. + ## 0.17.2 - Fixed a crash caused by `min()`, `max()` and `clamp()` functions that contain diff --git a/pkgs/csslib/README.md b/pkgs/csslib/README.md index 9bbb2e561..dd7422b9f 100644 --- a/pkgs/csslib/README.md +++ b/pkgs/csslib/README.md @@ -1,3 +1,7 @@ +[![Dart CI](https://github.com/dart-lang/csslib/actions/workflows/test-package.yml/badge.svg)](https://github.com/dart-lang/csslib/actions/workflows/test-package.yml) +[![pub package](https://img.shields.io/pub/v/csslib.svg)](https://pub.dev/packages/csslib) +[![package publisher](https://img.shields.io/pub/publisher/csslib.svg)](https://pub.dev/packages/csslib/publisher) + A Dart [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) parser. ## Usage diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 8492bd041..ae9daec7c 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,6 +1,5 @@ name: csslib version: 0.17.3-dev - description: A library for parsing and analyzing CSS (Cascading Style Sheets) repository: https://github.com/dart-lang/csslib From 8d5da531933d8310ee6db5f3edd8459784ec15ba Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Sat, 28 Jan 2023 15:28:57 -0800 Subject: [PATCH 205/245] switch to using package:dart_flutter_team_lints (dart-lang/csslib#161) * switch to using package:dart_flutter_team_lints * throw exceptions * Update test-package.yml (dart-lang/csslib#165) * Bump actions/checkout from 3.2.0 to 3.3.0 (dart-lang/csslib#163) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/755da8c3cf115ac066823e79a1e1788f8940201b...ac593985615ec2ede58e132d2e21d2b1cbd6127c) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump dart-lang/setup-dart from 1.3 to 1.4 (dart-lang/csslib#164) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.3 to 1.4. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/6a218f2413a3e78e9087f638a238f6b40893203d...a57a6c04cf7d4840e88432aad6281d1e125f0d46) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update README.md (dart-lang/csslib#158) * Update README.md * update changelog * update changelog --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkgs/csslib/CHANGELOG.md | 2 +- pkgs/csslib/analysis_options.yaml | 7 +--- pkgs/csslib/example/call_parser.dart | 5 +-- pkgs/csslib/lib/parser.dart | 37 ++++++++++--------- pkgs/csslib/lib/src/analyzer.dart | 2 +- pkgs/csslib/lib/src/css_printer.dart | 10 ++--- pkgs/csslib/lib/src/messages.dart | 4 +- pkgs/csslib/lib/src/property.dart | 27 +++++++------- pkgs/csslib/lib/src/token_kind.dart | 2 +- pkgs/csslib/lib/src/tokenizer.dart | 12 +++--- pkgs/csslib/lib/src/tree.dart | 2 + pkgs/csslib/lib/src/tree_printer.dart | 2 +- pkgs/csslib/pubspec.yaml | 2 +- pkgs/csslib/test/debug_test.dart | 4 ++ pkgs/csslib/test/declaration_test.dart | 2 + pkgs/csslib/test/error_test.dart | 2 +- pkgs/csslib/test/escape_codes_test.dart | 8 ++-- pkgs/csslib/test/keyframes_test.dart | 4 ++ .../csslib/test/third_party_samples_test.dart | 6 ++- 19 files changed, 78 insertions(+), 62 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 568cd170f..3b1b84cd4 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.17.3-dev - Add markdown badges to the readme. -- Update to the latest `package:lints`. +- Adopted `package:dart_flutter_team_lints` linting rules. ## 0.17.2 diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index b4bcde7e5..eb67f883b 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -1,12 +1,7 @@ -include: package:lints/recommended.yaml +include: package:dart_flutter_team_lints/analysis_options.yaml analyzer: language: strict-casts: true strict-inference: true strict-raw-types: true - -linter: - rules: - - avoid_dynamic_calls - - use_super_parameters diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/call_parser.dart index 1f4efe804..ee05807db 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/call_parser.dart @@ -18,10 +18,9 @@ StyleSheet parseCss(String cssInput, return css.parse(cssInput, errors: errors, options: opts ?? _default); } -// Pretty printer for CSS. -var emitCss = CssPrinter(); +/// Pretty printer for CSS. String prettyPrint(StyleSheet ss) => - (emitCss..visitTree(ss, pretty: true)).toString(); + (CssPrinter()..visitTree(ss, pretty: true)).toString(); void main() { var errors = []; diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index be74a067d..1981599fe 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -36,10 +36,8 @@ class ParserState extends TokenizerState { : super(tokenizer); } -// TODO(jmesserly): this should not be global void _createMessages({List? errors, PreprocessorOptions? options}) { errors ??= []; - options ??= PreprocessorOptions(useColors: false, inputFile: 'memory'); messages = Messages(options: options, printHandler: errors.add); @@ -83,11 +81,16 @@ void analyze(List styleSheets, Analyzer(styleSheets, messages).run(); } -/// Parse the [input] CSS stylesheet into a tree. The [input] can be a [String], -/// or [List] of bytes and returns a [StyleSheet] AST. The optional -/// [errors] list will contain each error/warning as a [Message]. -StyleSheet parse(Object input, - {List? errors, PreprocessorOptions? options}) { +/// Parse the [input] CSS stylesheet into a tree. +/// +/// The [input] can be a [String], or [List] of bytes and returns a +/// [StyleSheet] AST. The optional [errors] list will collect any error +/// encountered. +StyleSheet parse( + Object input, { + List? errors, + PreprocessorOptions? options, +}) { var source = _inputAsString(input); _createMessages(errors: errors, options: options); @@ -1583,7 +1586,7 @@ class _Parser { // bad. if (expr is SelectorExpression) { _eat(TokenKind.RPAREN); - return (pseudoElement) + return pseudoElement ? PseudoElementFunctionSelector(pseudoName, expr, span) : PseudoClassFunctionSelector(pseudoName, expr, span); } else { @@ -1667,21 +1670,21 @@ class _Parser { // Attribute grammar: // - // attributes : - // '[' S* IDENT S* [ ATTRIB_MATCHES S* [ IDENT | STRING ] S* ]? ']' + // attributes : + // '[' S* IDENT S* [ ATTRIB_MATCHES S* [ IDENT | STRING ] S* ]? ']' // - // ATTRIB_MATCHES : - // [ '=' | INCLUDES | DASHMATCH | PREFIXMATCH | SUFFIXMATCH | SUBSTRMATCH ] + // ATTRIB_MATCHES : + // [ '=' | INCLUDES | DASHMATCH | PREFIXMATCH | SUFFIXMATCH | SUBSTRMATCH ] // - // INCLUDES: '~=' + // INCLUDES: '~=' // - // DASHMATCH: '|=' + // DASHMATCH: '|=' // - // PREFIXMATCH: '^=' + // PREFIXMATCH: '^=' // - // SUFFIXMATCH: '$=' + // SUFFIXMATCH: '$=' // - // SUBSTRMATCH: '*=' + // SUBSTRMATCH: '*=' AttributeSelector? processAttribute() { var start = _peekToken.span; diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 475b096be..a16572c4e 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -985,7 +985,7 @@ class InheritExtends extends Visitor { index++) { var simpleSeq = selectors.simpleSelectorSequences[index]; var namePart = simpleSeq.simpleSelector.toString(); - selectorName = (isLastNone) ? (selectorName + namePart) : namePart; + selectorName = isLastNone ? (selectorName + namePart) : namePart; var matches = _allExtends.inherits[selectorName]; if (matches != null) { for (var match in matches) { diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index de689a736..991bbb2ea 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -197,7 +197,7 @@ class CssPrinter extends Visitor { @override void visitImportDirective(ImportDirective node) { - bool isStartingQuote(String ch) => ('\'"'.contains(ch[0])); + bool isStartingQuote(String ch) => '\'"'.contains(ch[0]); if (_isTesting) { // Emit assuming url() was parsed; most suite tests use url function. @@ -250,7 +250,7 @@ class CssPrinter extends Visitor { @override void visitNamespaceDirective(NamespaceDirective node) { - bool isStartingQuote(String ch) => ('\'"'.contains(ch)); + bool isStartingQuote(String ch) => '\'"'.contains(ch); if (isStartingQuote(node._uri!)) { emit(' @namespace ${node.prefix}"${node._uri}"'); @@ -643,13 +643,13 @@ class CssPrinter extends Visitor { @override void visitBinaryExpression(BinaryExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw UnimplementedError('visitBinaryExpression'); } @override void visitUnaryExpression(UnaryExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw UnimplementedError('visitUnaryExpression'); } @override @@ -665,6 +665,6 @@ class CssPrinter extends Visitor { @override void visitDartStyleExpression(DartStyleExpression node) { // TODO(terry): TBD - throw UnimplementedError; + throw UnimplementedError('visitDartStyleExpression'); } } diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 3145cd284..c4b91dcfd 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -8,8 +8,8 @@ import 'preprocessor_options.dart'; enum MessageLevel { info, warning, severe } -// TODO(terry): Remove the global messages, use some object that tracks -// compilation state. +// TODO(#159): Remove the global messages, use some object that tracks +// compilation state. /// The global [Messages] for tracking info/warnings/messages. late Messages messages; diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index 68306c16a..f884566f0 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -165,7 +165,7 @@ class Color implements _StyleProperty, ColorBase { int get argbValue => Color.hexToInt(_argb); @override - bool operator ==(other) => Color.equal(this, other); + bool operator ==(Object other) => Color.equal(this, other); @override String toHexArgbString() => _argb; @@ -506,10 +506,11 @@ class Rgba implements _StyleProperty, ColorBase { factory Rgba.fromArgbValue(num value) { return Rgba( - ((value.toInt() & 0xff000000) >> 0x18), // a - ((value.toInt() & 0xff0000) >> 0x10), // r - ((value.toInt() & 0xff00) >> 8), // g - ((value.toInt() & 0xff))); // b + (value.toInt() & 0xff000000) >> 0x18, // a + (value.toInt() & 0xff0000) >> 0x10, // r + (value.toInt() & 0xff00) >> 8, // g + value.toInt() & 0xff, + ); // b } factory Rgba.fromHsla(Hsla hsla) { @@ -558,7 +559,7 @@ class Rgba implements _StyleProperty, ColorBase { } if ((6 * vH) < 1) { - return (v1 + (v2 - v1) * 6 * vH); + return v1 + (v2 - v1) * 6 * vH; } if ((2 * vH) < 1) { @@ -566,14 +567,14 @@ class Rgba implements _StyleProperty, ColorBase { } if ((3 * vH) < 2) { - return (v1 + (v2 - v1) * ((2 / 3 - vH) * 6)); + return v1 + (v2 - v1) * ((2 / 3 - vH) * 6); } return v1; } @override - bool operator ==(other) => Color.equal(this, other); + bool operator ==(Object other) => Color.equal(this, other); @override String get cssExpression { @@ -591,10 +592,10 @@ class Rgba implements _StyleProperty, ColorBase { int get argbValue { var value = 0; if (a != null) { - value = (a!.toInt() << 0x18); + value = a!.toInt() << 0x18; } - value += (r << 0x10); - value += (g << 0x08); + value += r << 0x10; + value += g << 0x08; value += b; return value; } @@ -720,7 +721,7 @@ class Hsla implements _StyleProperty, ColorBase { num? get alpha => _a; @override - bool operator ==(other) => Color.equal(this, other); + bool operator ==(Object other) => Color.equal(this, other); @override String get cssExpression => (_a == null) @@ -1074,7 +1075,7 @@ class Font implements _StyleProperty { } @override - bool operator ==(other) { + bool operator ==(Object other) { if (other is! Font) return false; return other.size == size && other.family == family && diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index 51ec1e5e2..6ceb12354 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -671,7 +671,7 @@ class TokenKind { case TokenKind.BACKSLASH: return '\\'; default: - throw 'Unknown TOKEN'; + throw StateError('Unknown TOKEN'); } } diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 66f6a027a..356963f07 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -446,13 +446,13 @@ class TokenizerHelpers { } static bool isDigit(int c) { - return (c >= 48 /*0*/ && c <= 57 /*9*/); + return c >= 48 /*0*/ && c <= 57 /*9*/; } static bool isHexDigit(int c) { - return (isDigit(c) || + return isDigit(c) || (c >= 97 /*a*/ && c <= 102 /*f*/) || - (c >= 65 /*A*/ && c <= 70 /*F*/)); + (c >= 65 /*A*/ && c <= 70 /*F*/); } static bool isIdentifierPart(int c) { @@ -461,7 +461,7 @@ class TokenizerHelpers { /// Pseudo function expressions identifiers can't have a minus sign. static bool isIdentifierStartExpr(int c) { - return ((c >= 97 /*a*/ && c <= 122 /*z*/) || + return (c >= 97 /*a*/ && c <= 122 /*z*/) || (c >= 65 /*A*/ && c <= 90 /*Z*/) || // Note: Unicode 10646 chars U+00A0 or higher are allowed, see: // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier @@ -469,11 +469,11 @@ class TokenizerHelpers { // Also, escaped character should be allowed. c == 95 /*_*/ || c >= 0xA0 || - c == 92 /*\*/); + c == 92 /*\*/; } /// Pseudo function expressions identifiers can't have a minus sign. static bool isIdentifierPartExpr(int c) { - return (isIdentifierStartExpr(c) || isDigit(c)); + return isIdentifierStartExpr(c) || isDigit(c); } } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 7e9942653..199493dc5 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: prefer_asserts_in_initializer_lists + part of '../visitor.dart'; ///////////////////////////////////////////////////////////////////////// diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 338b7e055..03982262e 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -162,7 +162,7 @@ class _TreePrinter extends Visitor { output.depth++; output.writeValue('pseudo page', node._pseudoPage); super.visitPageDirective(node); - output.depth; + output.depth--; } @override diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index ae9daec7c..f0ef37238 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: source_span: ^1.8.0 dev_dependencies: + dart_flutter_team_lints: ^0.1.0 path: ^1.8.0 - lints: ^2.0.0 term_glyph: ^1.2.0 test: ^1.16.0 diff --git a/pkgs/csslib/test/debug_test.dart b/pkgs/csslib/test/debug_test.dart index 6f1cee2b0..05e9b005d 100644 --- a/pkgs/csslib/test/debug_test.dart +++ b/pkgs/csslib/test/debug_test.dart @@ -1,3 +1,7 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + library debug; import 'package:test/test.dart'; diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 6cccc9c7a..587eeb4fb 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: lines_longer_than_80_chars + library declaration_test; import 'package:csslib/src/messages.dart'; diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index b6be913f7..4f597e873 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -5,8 +5,8 @@ library error_test; import 'package:csslib/src/messages.dart'; -import 'package:test/test.dart'; import 'package:term_glyph/term_glyph.dart' as glyph; +import 'package:test/test.dart'; import 'testing.dart'; diff --git a/pkgs/csslib/test/escape_codes_test.dart b/pkgs/csslib/test/escape_codes_test.dart index 9ed749619..09730214c 100644 --- a/pkgs/csslib/test/escape_codes_test.dart +++ b/pkgs/csslib/test/escape_codes_test.dart @@ -1,3 +1,7 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + import 'package:csslib/parser.dart'; import 'package:test/test.dart'; @@ -6,9 +10,7 @@ import 'testing.dart'; void main() { final errors = []; - tearDown(() { - errors.clear(); - }); + tearDown(errors.clear); group('handles escape codes', () { group('in an identifier', () { diff --git a/pkgs/csslib/test/keyframes_test.dart b/pkgs/csslib/test/keyframes_test.dart index 835c89693..0c9456f04 100644 --- a/pkgs/csslib/test/keyframes_test.dart +++ b/pkgs/csslib/test/keyframes_test.dart @@ -1,3 +1,7 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; diff --git a/pkgs/csslib/test/third_party_samples_test.dart b/pkgs/csslib/test/third_party_samples_test.dart index d48b7d644..9abb2bbe6 100644 --- a/pkgs/csslib/test/third_party_samples_test.dart +++ b/pkgs/csslib/test/third_party_samples_test.dart @@ -1,11 +1,15 @@ +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + @TestOn('vm') library samples_test; import 'dart:io'; -import 'package:test/test.dart'; import 'package:csslib/parser.dart'; import 'package:path/path.dart' as path; +import 'package:test/test.dart'; const testOptions = PreprocessorOptions( useColors: false, From 1cdd9b9209d073dea493c696cd20fbae92ee9180 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 31 Jan 2023 12:40:53 -0800 Subject: [PATCH 206/245] correct the logic in isPredefinedName (dart-lang/csslib#166) --- pkgs/csslib/lib/parser.dart | 17 ++++++++--------- pkgs/csslib/lib/src/analyzer.dart | 10 +++++----- pkgs/csslib/lib/src/css_printer.dart | 2 +- pkgs/csslib/lib/src/messages.dart | 4 ++-- pkgs/csslib/lib/src/token_kind.dart | 27 ++++++++++++++------------- pkgs/csslib/lib/src/validate.dart | 2 +- pkgs/csslib/test/testing.dart | 4 ++-- 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 1981599fe..ead47b4f7 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -138,7 +138,7 @@ String _inputAsString(Object input) { // Here's some info about CSS encodings: // http://www.w3.org/International/questions/qa-css-charset.en.php // - // As JMesserly suggests it will probably need a "preparser" html5lib + // As JMesserly suggests it will probably need a "pre-parser" html5lib // (encoding_parser.dart) that interprets the bytes as ASCII and scans for // @charset. But for now an "encoding" argument would work. Often the // HTTP header will indicate the correct encoding. @@ -243,7 +243,7 @@ class _Parser { } /// Guard to break out of parser when an unexpected end of file is found. - // TODO(jimhug): Failure to call this method can lead to inifinite parser + // TODO(jimhug): Failure to call this method can lead to infinite parser // loops. Consider embracing exceptions for more errors to reduce // the danger here. bool isPrematureEndOfFile() { @@ -1130,8 +1130,7 @@ class _Parser { /// color: red; /// } /// - /// Return [:null:] if no selector or [SelectorGroup] if a selector was - /// parsed. + /// Return `null` if no selector or [SelectorGroup] if a selector was parsed. SelectorGroup? _nestedSelector() { var oldMessages = messages; _createMessages(); @@ -1949,7 +1948,7 @@ class _Parser { // 100 - 900 // inherit - // TODO(terry): Only 'normal', 'bold', or values of 100-900 supoorted + // TODO(terry): Only 'normal', 'bold', or values of 100-900 supported // need to handle bolder, lighter, and inherit. See // https://github.com/dart-lang/csslib/issues/1 var expr = exprs.expressions[0]; @@ -2835,10 +2834,10 @@ class ExpressionsProcessor { // Order is font-size font-family fontSize ??= processFontSize(); fontFamily ??= processFontFamily(); - //TODO(terry): Handle font-weight, font-style, and font-variant. See - // https://github.com/dart-lang/csslib/issues/3 - // https://github.com/dart-lang/csslib/issues/4 - // https://github.com/dart-lang/csslib/issues/5 + // TODO(terry): Handle font-weight, font-style, and font-variant. See + // https://github.com/dart-lang/csslib/issues/3 + // https://github.com/dart-lang/csslib/issues/4 + // https://github.com/dart-lang/csslib/issues/5 } return FontExpression(_exprs.span, diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index a16572c4e..2c4efa975 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -41,7 +41,7 @@ class Analyzer { MixinsAndIncludes.remove(styleSheet); } - // Expand any nested selectors using selector desendant combinator to + // Expand any nested selectors using selector descendant combinator to // signal CSS inheritance notation. for (var styleSheet in _styleSheets) { ExpandNestedSelectors() @@ -165,14 +165,14 @@ class Analyzer { /// Declaration (property = color, expression = red) /// /// Nested rules is a terse mechanism to describe CSS inheritance. The analyzer -/// will flatten and expand the nested rules to it's flatten strucure. Using +/// will flatten and expand the nested rules to it's flatten structure. Using /// the all parent [RuleSets] (selector expressions) and applying each nested /// [RuleSet] to the list of [Selectors] in a [SelectorGroup]. /// /// Then result is a style sheet where all nested rules have been flatten and /// expanded. class ExpandNestedSelectors extends Visitor { - /// Parent [RuleSet] if a nested rule otherwise [:null:]. + /// Parent [RuleSet] if a nested rule otherwise `null`. RuleSet? _parentRuleSet; /// Top-most rule if nested rules. @@ -253,7 +253,7 @@ class ExpandNestedSelectors extends Visitor { } /// Merge the nested selector sequences [current] to the [parent] sequences or - /// substitue any & with the parent selector. + /// substitute any & with the parent selector. List _mergeNestedSelector( List parent, List current) { @@ -270,7 +270,7 @@ class ExpandNestedSelectors extends Visitor { } else { for (var sequence in current) { if (sequence.simpleSelector.isThis) { - // Substitue the & with the parent selector and only use a combinator + // Substitute the & with the parent selector and only use a combinator // descendant if & is prefix by a sequence with an empty name e.g., // "... + &", "&", "... ~ &", etc. var hasPrefix = newSequence.isNotEmpty && diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 991bbb2ea..e41a1cba0 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -32,7 +32,7 @@ class CssPrinter extends Visitor { String get _sp => prettyPrint ? ' ' : ''; // TODO(terry): When adding obfuscation we'll need isOptimized (compact w/ - // obufuscation) and have isTesting (compact no obfuscation) and + // obfuscation) and have isTesting (compact no obfuscation) and // isCompact would be !prettyPrint. We'll need another boolean // flag for obfuscation. bool get _isTesting => !prettyPrint; diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index c4b91dcfd..4aa4b905c 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -68,7 +68,7 @@ class Message { /// This class tracks and prints information, warnings, and errors emitted by /// the compiler. class Messages { - /// Called on every error. Set to blank function to supress printing. + /// Called on every error. Set to blank function to suppress printing. final void Function(Message obj) printHandler; final PreprocessorOptions options; @@ -110,7 +110,7 @@ class Messages { if (options.verbose) printHandler(msg); } - /// Merge [newMessages] to this message lsit. + /// Merge [newMessages] to this message list. void mergeMessages(Messages newMessages) { messages.addAll(newMessages.messages); newMessages.messages diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index 6ceb12354..1a57885ec 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -453,24 +453,25 @@ class TokenKind { // see http://www.w3schools.com/cssref/pr_list-style-type.asp // for list of possible values. - /// Check if name is a pre-defined CSS name. Used by error handler to report - /// if name is unknown or used improperly. + /// Check if a name is a pre-defined CSS name. + /// + /// This is used by the error handler to report if a name is unknown or used + /// improperly. static bool isPredefinedName(String name) { - var nameLen = name.length; + final len = name.length; + // TODO(terry): Add more pre-defined names (hidden, bolder, inherit, etc.). - if (matchUnits(name, 0, nameLen) == -1 || - matchDirectives(name, 0, nameLen) == -1 || - matchMarginDirectives(name, 0, nameLen) == -1 || - matchColorName(name) == null) { - return false; - } + if (matchColorName(name) != null) return true; + if (matchDirectives(name, 0, len) != -1) return true; + if (matchMarginDirectives(name, 0, len) != -1) return true; + if (matchUnits(name, 0, len) != -1) return true; - return true; + return false; } /// Return the token that matches the unit ident found. - static int matchList(Iterable> identList, - String tokenField, String text, int offset, int length) { + static int matchList(List> identList, String tokenField, + String text, int offset, int length) { for (final entry in identList) { final ident = entry['value'] as String; @@ -548,7 +549,7 @@ class TokenKind { } /// Match color name, case insensitive match and return the associated color - /// entry from _EXTENDED_COLOR_NAMES list, return [:null:] if not found. + /// entry from _EXTENDED_COLOR_NAMES list, return `null` if not found. static Map? matchColorName(String text) { var name = text.toLowerCase(); for (var color in _EXTENDED_COLOR_NAMES) { diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index e5f699c21..b99a89874 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -85,7 +85,7 @@ class Validate { } } else if (simpleSelector is IdSelector) { // Any element id starting with an underscore is a private element id - // that doesn't have to match the world of known elemtn ids. + // that doesn't have to match the world of known element ids. if (!simpleSelector.name.startsWith('_')) { for (final id in ids) { if (simpleSelector.name == id) { diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index acc57a2e7..d93c4a3e1 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -57,13 +57,13 @@ final _cssVisitor = Visitor(); /// Pretty printer for CSS. String prettyPrint(StyleSheet ss) { - // Walk the tree testing basic Vistor class. + // Walk the tree testing basic Visitor class. walkTree(ss); return (_emitCss..visitTree(ss, pretty: true)).toString(); } /// Helper function to emit compact (non-pretty printed) CSS for suite test -/// comparsions. Spaces, new lines, etc. are reduced for easier comparsions of +/// comparisons. Spaces, new lines, etc. are reduced for easier comparisons of /// expected suite test results. String compactOutput(StyleSheet ss) { walkTree(ss); From f43df85bf618c7e9af30c8626d8f8842e3f0ecac Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 31 Jan 2023 12:41:28 -0800 Subject: [PATCH 207/245] add a repro for dart-lang/csslib#136 (dart-lang/csslib#160) --- pkgs/csslib/test/repro_136_test.dart | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 pkgs/csslib/test/repro_136_test.dart diff --git a/pkgs/csslib/test/repro_136_test.dart b/pkgs/csslib/test/repro_136_test.dart new file mode 100644 index 000000000..caf150f2e --- /dev/null +++ b/pkgs/csslib/test/repro_136_test.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:csslib/parser.dart'; +import 'package:csslib/visitor.dart'; +import 'package:test/test.dart'; + +const options = PreprocessorOptions( + useColors: false, + warningsAsErrors: true, + inputFile: 'memory', +); + +void main() { + test('repro_136', () { + // Repro test for https://github.com/dart-lang/csslib/issues/136. + final errors = []; + + final css = ''' +.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-white strong { + color: inherit; +} +'''; + final stylesheet = parse(css, errors: errors, options: options); + expect(stylesheet.topLevels, hasLength(1)); + var ruleset = stylesheet.topLevels.first as RuleSet; + + // This should be length 2. + expect(ruleset.selectorGroup!.selectors, hasLength(1)); + + // This test is expected to start to fail once we better support pseudo + // selectors. + // This should be empty. + expect(errors, hasLength(3)); + }); +} From 43187f6c330a4e7670acc80b302b68c70a85dc05 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 31 Jan 2023 13:37:25 -0800 Subject: [PATCH 208/245] fix the reported span for expressions (dart-lang/csslib#167) * fix the reported span for expressions * update changelog --- pkgs/csslib/CHANGELOG.md | 1 + pkgs/csslib/lib/parser.dart | 30 +++++------ pkgs/csslib/lib/src/preprocessor_options.dart | 23 +++++---- pkgs/csslib/lib/src/tree.dart | 50 +++++++++---------- pkgs/csslib/test/declaration_test.dart | 26 +++++----- pkgs/csslib/test/error_test.dart | 4 +- 6 files changed, 69 insertions(+), 65 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 3b1b84cd4..419df9e50 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -2,6 +2,7 @@ - Add markdown badges to the readme. - Adopted `package:dart_flutter_team_lints` linting rules. +- Fixed the reported span for `Expression` nodes. ## 0.17.2 diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index ead47b4f7..7096936a9 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -324,7 +324,7 @@ class _Parser { messages.warning(message, location); } - SourceSpan _makeSpan(FileSpan start) { + FileSpan _makeSpan(FileSpan start) { // TODO(terry): there are places where we are creating spans before we eat // the tokens, so using _previousToken is not always valid. // TODO(nweiz): use < rather than compareTo when SourceSpan supports it. @@ -933,7 +933,7 @@ class _Parser { dynamic expr; var keepGoing = true; while (keepGoing && (expr = processTerm()) != null) { - // VarUsage is returns as a list + // VarUsage is returned as a list terms.add((expr is List ? expr[0] : expr) as Expression); keepGoing = !_peekKind(TokenKind.RPAREN); if (keepGoing) { @@ -981,7 +981,7 @@ class _Parser { _eat(TokenKind.RPAREN); - var arguments = Expressions(_makeSpan(argumentSpan as FileSpan)) + var arguments = Expressions(_makeSpan(argumentSpan)) ..add(LiteralTerm(argument, argument, argumentSpan)); function = FunctionTerm(ident.name, ident.name, arguments, _makeSpan(ident.span as FileSpan)); @@ -2408,12 +2408,12 @@ class _Parser { switch (unitType) { case TokenKind.UNIT_EM: + span = span.union(_next().span); term = EmTerm(value, t!.text, span); - _next(); // Skip the unit break; case TokenKind.UNIT_EX: + span = span.union(_next().span); term = ExTerm(value, t!.text, span); - _next(); // Skip the unit break; case TokenKind.UNIT_LENGTH_PX: case TokenKind.UNIT_LENGTH_CM: @@ -2421,54 +2421,54 @@ class _Parser { case TokenKind.UNIT_LENGTH_IN: case TokenKind.UNIT_LENGTH_PT: case TokenKind.UNIT_LENGTH_PC: + span = span.union(_next().span); term = LengthTerm(value, t!.text, span, unitType); - _next(); // Skip the unit break; case TokenKind.UNIT_ANGLE_DEG: case TokenKind.UNIT_ANGLE_RAD: case TokenKind.UNIT_ANGLE_GRAD: case TokenKind.UNIT_ANGLE_TURN: + span = span.union(_next().span); term = AngleTerm(value, t!.text, span, unitType); - _next(); // Skip the unit break; case TokenKind.UNIT_TIME_MS: case TokenKind.UNIT_TIME_S: + span = span.union(_next().span); term = TimeTerm(value, t!.text, span, unitType); - _next(); // Skip the unit break; case TokenKind.UNIT_FREQ_HZ: case TokenKind.UNIT_FREQ_KHZ: + span = span.union(_next().span); term = FreqTerm(value, t!.text, span, unitType); - _next(); // Skip the unit break; case TokenKind.PERCENT: + span = span.union(_next().span); term = PercentageTerm(value, t!.text, span); - _next(); // Skip the % break; case TokenKind.UNIT_FRACTION: + span = span.union(_next().span); term = FractionTerm(value, t!.text, span); - _next(); // Skip the unit break; case TokenKind.UNIT_RESOLUTION_DPI: case TokenKind.UNIT_RESOLUTION_DPCM: case TokenKind.UNIT_RESOLUTION_DPPX: + span = span.union(_next().span); term = ResolutionTerm(value, t!.text, span, unitType); - _next(); // Skip the unit break; case TokenKind.UNIT_CH: + span = span.union(_next().span); term = ChTerm(value, t!.text, span, unitType); - _next(); // Skip the unit break; case TokenKind.UNIT_REM: + span = span.union(_next().span); term = RemTerm(value, t!.text, span, unitType); - _next(); // Skip the unit break; case TokenKind.UNIT_VIEWPORT_VW: case TokenKind.UNIT_VIEWPORT_VH: case TokenKind.UNIT_VIEWPORT_VMIN: case TokenKind.UNIT_VIEWPORT_VMAX: + span = span.union(_next().span); term = ViewportTerm(value, t!.text, span, unitType); - _next(); // Skip the unit break; default: if (value is Identifier) { diff --git a/pkgs/csslib/lib/src/preprocessor_options.dart b/pkgs/csslib/lib/src/preprocessor_options.dart index 2ca67dcc8..3879ead14 100644 --- a/pkgs/csslib/lib/src/preprocessor_options.dart +++ b/pkgs/csslib/lib/src/preprocessor_options.dart @@ -34,14 +34,17 @@ class PreprocessorOptions { /// File to process by the compiler. final String? inputFile; - const PreprocessorOptions( - {this.verbose = false, - this.checked = false, - this.lessSupport = true, - this.warningsAsErrors = false, - this.throwOnErrors = false, - this.throwOnWarnings = false, - this.useColors = true, - this.polyfill = false, - this.inputFile}); + // TODO: Should less support really default to being enabled? + + const PreprocessorOptions({ + this.verbose = false, + this.checked = false, + this.lessSupport = true, + this.warningsAsErrors = false, + this.throwOnErrors = false, + this.throwOnWarnings = false, + this.useColors = true, + this.polyfill = false, + this.inputFile, + }); } diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 199493dc5..529144d5b 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -66,8 +66,8 @@ class Negation extends TreeNode { class CalcTerm extends LiteralTerm { final LiteralTerm expr; - CalcTerm(Object value, String t, this.expr, SourceSpan? span) - : super(value, t, span); + CalcTerm(Object value, String text, this.expr, SourceSpan? span) + : super(value, text, span); @override CalcTerm clone() => CalcTerm(value, text, expr.clone(), span); @@ -1244,7 +1244,7 @@ class LiteralTerm extends Expression { } class NumberTerm extends LiteralTerm { - NumberTerm(super.value, super.t, super.span); + NumberTerm(super.value, super.text, super.span); @override NumberTerm clone() => NumberTerm(value, text, span); @override @@ -1254,7 +1254,7 @@ class NumberTerm extends LiteralTerm { class UnitTerm extends LiteralTerm { final int unit; - UnitTerm(super.value, super.t, super.span, this.unit); + UnitTerm(super.value, super.text, super.span, this.unit); @override UnitTerm clone() => UnitTerm(value, text, span, unit); @@ -1269,7 +1269,7 @@ class UnitTerm extends LiteralTerm { } class LengthTerm extends UnitTerm { - LengthTerm(super.value, super.t, super.span, + LengthTerm(super.value, super.text, super.span, [super.unit = TokenKind.UNIT_LENGTH_PX]) { assert(unit == TokenKind.UNIT_LENGTH_PX || unit == TokenKind.UNIT_LENGTH_CM || @@ -1285,7 +1285,7 @@ class LengthTerm extends UnitTerm { } class PercentageTerm extends LiteralTerm { - PercentageTerm(super.value, super.t, super.span); + PercentageTerm(super.value, super.text, super.span); @override PercentageTerm clone() => PercentageTerm(value, text, span); @override @@ -1293,7 +1293,7 @@ class PercentageTerm extends LiteralTerm { } class EmTerm extends LiteralTerm { - EmTerm(super.value, super.t, super.span); + EmTerm(super.value, super.text, super.span); @override EmTerm clone() => EmTerm(value, text, span); @override @@ -1301,7 +1301,7 @@ class EmTerm extends LiteralTerm { } class ExTerm extends LiteralTerm { - ExTerm(super.value, super.t, super.span); + ExTerm(super.value, super.text, super.span); @override ExTerm clone() => ExTerm(value, text, span); @override @@ -1309,7 +1309,7 @@ class ExTerm extends LiteralTerm { } class AngleTerm extends UnitTerm { - AngleTerm(super.value, super.t, super.span, + AngleTerm(super.value, super.text, super.span, [super.unit = TokenKind.UNIT_LENGTH_PX]) { assert(unit == TokenKind.UNIT_ANGLE_DEG || unit == TokenKind.UNIT_ANGLE_RAD || @@ -1324,7 +1324,7 @@ class AngleTerm extends UnitTerm { } class TimeTerm extends UnitTerm { - TimeTerm(super.value, super.t, super.span, + TimeTerm(super.value, super.text, super.span, [super.unit = TokenKind.UNIT_LENGTH_PX]) { assert(unit == TokenKind.UNIT_ANGLE_DEG || unit == TokenKind.UNIT_TIME_MS || @@ -1338,9 +1338,9 @@ class TimeTerm extends UnitTerm { } class FreqTerm extends UnitTerm { - FreqTerm(Object value, String t, SourceSpan? span, + FreqTerm(Object value, String text, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) - : super(value, t, span, unit) { + : super(value, text, span, unit) { assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); } @@ -1351,7 +1351,7 @@ class FreqTerm extends UnitTerm { } class FractionTerm extends LiteralTerm { - FractionTerm(super.value, super.t, super.span); + FractionTerm(super.value, super.text, super.span); @override FractionTerm clone() => FractionTerm(value, text, span); @@ -1369,9 +1369,9 @@ class UriTerm extends LiteralTerm { } class ResolutionTerm extends UnitTerm { - ResolutionTerm(Object value, String t, SourceSpan? span, + ResolutionTerm(Object value, String text, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) - : super(value, t, span, unit) { + : super(value, text, span, unit) { assert(unit == TokenKind.UNIT_RESOLUTION_DPI || unit == TokenKind.UNIT_RESOLUTION_DPCM || unit == TokenKind.UNIT_RESOLUTION_DPPX); @@ -1384,9 +1384,9 @@ class ResolutionTerm extends UnitTerm { } class ChTerm extends UnitTerm { - ChTerm(Object value, String t, SourceSpan? span, + ChTerm(Object value, String text, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) - : super(value, t, span, unit) { + : super(value, text, span, unit) { assert(unit == TokenKind.UNIT_CH); } @@ -1397,9 +1397,9 @@ class ChTerm extends UnitTerm { } class RemTerm extends UnitTerm { - RemTerm(Object value, String t, SourceSpan? span, + RemTerm(Object value, String text, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) - : super(value, t, span, unit) { + : super(value, text, span, unit) { assert(unit == TokenKind.UNIT_REM); } @@ -1410,9 +1410,9 @@ class RemTerm extends UnitTerm { } class ViewportTerm extends UnitTerm { - ViewportTerm(Object value, String t, SourceSpan? span, + ViewportTerm(Object value, String text, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) - : super(value, t, span, unit) { + : super(value, text, span, unit) { assert(unit == TokenKind.UNIT_VIEWPORT_VW || unit == TokenKind.UNIT_VIEWPORT_VH || unit == TokenKind.UNIT_VIEWPORT_VMIN || @@ -1430,7 +1430,7 @@ class ViewportTerm extends UnitTerm { class BAD_HEX_VALUE {} class HexColorTerm extends LiteralTerm { - HexColorTerm(super.value, super.t, super.span); + HexColorTerm(super.value, super.text, super.span); @override HexColorTerm clone() => HexColorTerm(value, text, span); @@ -1441,8 +1441,8 @@ class HexColorTerm extends LiteralTerm { class FunctionTerm extends LiteralTerm { final Expressions _params; - FunctionTerm(Object value, String t, this._params, SourceSpan? span) - : super(value, t, span); + FunctionTerm(Object value, String text, this._params, SourceSpan? span) + : super(value, text, span); @override FunctionTerm clone() => FunctionTerm(value, text, _params.clone(), span); @@ -1477,7 +1477,7 @@ class GroupTerm extends Expression { } class ItemTerm extends NumberTerm { - ItemTerm(super.value, super.t, super.span); + ItemTerm(super.value, super.text, super.span); @override ItemTerm clone() => ItemTerm(value, text, span); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 587eeb4fb..d6bde45e9 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -721,14 +721,16 @@ src: url(ideal-sans-serif.woff) format("woff"), expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), generated2); - final input3 = '''@font-face { + final input3 = ''' +@font-face { font-family: MyGentium Text Ornaments; src: local(Gentium Bold), /* full font name */ local(Gentium-Bold), /* Postscript name */ url(GentiumBold.ttf); /* otherwise, download it */ font-weight: bold; }'''; - final generated3 = '''@font-face { + final generated3 = ''' +@font-face { font-family: MyGentium Text Ornaments; src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); font-weight: bold; @@ -1272,15 +1274,15 @@ void testHangs() { void testExpressionSpans() { final input = r'''.foo { width: 50px; }'''; + var stylesheet = parseCss(input); - var decl = (stylesheet.topLevels.single as RuleSet) - .declarationGroup - .declarations - .single; - // This passes - expect(decl.span!.text, 'width: 50px'); - // This currently fails - expect((decl as Declaration).expression!.span!.text, '50px'); + var ruleSet = stylesheet.topLevels.single as RuleSet; + + var declaration = ruleSet.declarationGroup.declarations.single as Declaration; + expect(declaration.span.text, 'width: 50px'); + + var expressions = declaration.expression as Expressions; + expect(expressions.expressions.first.span!.text, '50px'); } void testComments() { @@ -1380,9 +1382,7 @@ void main() { test('IE stuff', testIE); test('IE declaration syntax', testIEDeclaration); test('Hanging bugs', testHangs); - test('Expression spans', testExpressionSpans, - skip: 'expression spans are broken' - ' (https://github.com/dart-lang/csslib/issues/15)'); + test('Expression spans', testExpressionSpans); test('Comments', testComments); group('calc function', () { test('simple calc', simpleCalc); diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index 4f597e873..fb8ff573a 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -81,7 +81,7 @@ void testUnsupportedLineHeights() { error on line 1, column 24: Unexpected value for line-height , 1 | .foobar { line-height: 120%; } - | ^^^ + | ^^^^ \''''); expect(prettyPrint(stylesheet), r''' .foobar { @@ -98,7 +98,7 @@ error on line 1, column 24: Unexpected value for line-height error on line 1, column 24: Unexpected unit for line-height , 1 | .foobar { line-height: 20cm; } - | ^^ + | ^^^^ \''''); expect(prettyPrint(stylesheet), r''' .foobar { From 429e0aa1e84655f7b947206ac9e90aa69e829713 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 7 Feb 2023 15:19:25 -0800 Subject: [PATCH 209/245] fixed a regression parsing declaration values containing spaces (dart-lang/csslib#172) --- pkgs/csslib/CHANGELOG.md | 1 + pkgs/csslib/lib/parser.dart | 26 +++++++++---------- .../{repro_136_test.dart => repros_test.dart} | 25 +++++++++++++++++- 3 files changed, 38 insertions(+), 14 deletions(-) rename pkgs/csslib/test/{repro_136_test.dart => repros_test.dart} (54%) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 419df9e50..22e576432 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -3,6 +3,7 @@ - Add markdown badges to the readme. - Adopted `package:dart_flutter_team_lints` linting rules. - Fixed the reported span for `Expression` nodes. +- Fixed a regression parsing declaration values containing spaces. ## 0.17.2 diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 7096936a9..69c98cea4 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2402,17 +2402,17 @@ class _Parser { } /// Process all dimension units. - LiteralTerm processDimension(Token? t, Object value, SourceSpan span) { + LiteralTerm processDimension(Token? t, Object value, FileSpan span) { LiteralTerm term; var unitType = _peek(); switch (unitType) { case TokenKind.UNIT_EM: - span = span.union(_next().span); + span = span.expand(_next().span); term = EmTerm(value, t!.text, span); break; case TokenKind.UNIT_EX: - span = span.union(_next().span); + span = span.expand(_next().span); term = ExTerm(value, t!.text, span); break; case TokenKind.UNIT_LENGTH_PX: @@ -2421,53 +2421,53 @@ class _Parser { case TokenKind.UNIT_LENGTH_IN: case TokenKind.UNIT_LENGTH_PT: case TokenKind.UNIT_LENGTH_PC: - span = span.union(_next().span); + span = span.expand(_next().span); term = LengthTerm(value, t!.text, span, unitType); break; case TokenKind.UNIT_ANGLE_DEG: case TokenKind.UNIT_ANGLE_RAD: case TokenKind.UNIT_ANGLE_GRAD: case TokenKind.UNIT_ANGLE_TURN: - span = span.union(_next().span); + span = span.expand(_next().span); term = AngleTerm(value, t!.text, span, unitType); break; case TokenKind.UNIT_TIME_MS: case TokenKind.UNIT_TIME_S: - span = span.union(_next().span); + span = span.expand(_next().span); term = TimeTerm(value, t!.text, span, unitType); break; case TokenKind.UNIT_FREQ_HZ: case TokenKind.UNIT_FREQ_KHZ: - span = span.union(_next().span); + span = span.expand(_next().span); term = FreqTerm(value, t!.text, span, unitType); break; case TokenKind.PERCENT: - span = span.union(_next().span); + span = span.expand(_next().span); term = PercentageTerm(value, t!.text, span); break; case TokenKind.UNIT_FRACTION: - span = span.union(_next().span); + span = span.expand(_next().span); term = FractionTerm(value, t!.text, span); break; case TokenKind.UNIT_RESOLUTION_DPI: case TokenKind.UNIT_RESOLUTION_DPCM: case TokenKind.UNIT_RESOLUTION_DPPX: - span = span.union(_next().span); + span = span.expand(_next().span); term = ResolutionTerm(value, t!.text, span, unitType); break; case TokenKind.UNIT_CH: - span = span.union(_next().span); + span = span.expand(_next().span); term = ChTerm(value, t!.text, span, unitType); break; case TokenKind.UNIT_REM: - span = span.union(_next().span); + span = span.expand(_next().span); term = RemTerm(value, t!.text, span, unitType); break; case TokenKind.UNIT_VIEWPORT_VW: case TokenKind.UNIT_VIEWPORT_VH: case TokenKind.UNIT_VIEWPORT_VMIN: case TokenKind.UNIT_VIEWPORT_VMAX: - span = span.union(_next().span); + span = span.expand(_next().span); term = ViewportTerm(value, t!.text, span, unitType); break; default: diff --git a/pkgs/csslib/test/repro_136_test.dart b/pkgs/csslib/test/repros_test.dart similarity index 54% rename from pkgs/csslib/test/repro_136_test.dart rename to pkgs/csslib/test/repros_test.dart index caf150f2e..ef359ca63 100644 --- a/pkgs/csslib/test/repro_136_test.dart +++ b/pkgs/csslib/test/repros_test.dart @@ -13,8 +13,8 @@ const options = PreprocessorOptions( ); void main() { + // Repro test for https://github.com/dart-lang/csslib/issues/136. test('repro_136', () { - // Repro test for https://github.com/dart-lang/csslib/issues/136. final errors = []; final css = ''' @@ -35,4 +35,27 @@ void main() { // This should be empty. expect(errors, hasLength(3)); }); + + // Repro test for https://github.com/dart-lang/csslib/issues/171. + test('repro_171', () { + final errors = []; + var stylesheet = + parse('body { width: 1000 px; }', errors: errors, options: options); + expect(errors, isEmpty); + + expect(stylesheet.topLevels, hasLength(1)); + var ruleset = stylesheet.topLevels.first as RuleSet; + expect(ruleset.selectorGroup!.selectors, hasLength(1)); + expect(ruleset.declarationGroup.declarations, hasLength(1)); + + errors.clear(); + stylesheet = + parse('body { width: 1000px; }', errors: errors, options: options); + expect(errors, isEmpty); + + expect(stylesheet.topLevels, hasLength(1)); + ruleset = stylesheet.topLevels.first as RuleSet; + expect(ruleset.selectorGroup!.selectors, hasLength(1)); + expect(ruleset.declarationGroup.declarations, hasLength(1)); + }); } From 9beff95fabb326cd799e066073ae9b175b572062 Mon Sep 17 00:00:00 2001 From: Matt Hall Date: Tue, 14 Feb 2023 16:15:21 -0800 Subject: [PATCH 210/245] Add support for CSS `lh` and `rlh` units. (dart-lang/csslib#173) * Add support for CSS `lh` and `rlh` units. --- pkgs/csslib/CHANGELOG.md | 1 + pkgs/csslib/lib/parser.dart | 5 +++++ pkgs/csslib/lib/src/css_printer.dart | 5 +++++ pkgs/csslib/lib/src/token_kind.dart | 6 ++++++ pkgs/csslib/lib/src/tree.dart | 11 +++++++++++ pkgs/csslib/lib/visitor.dart | 6 ++++++ pkgs/csslib/test/declaration_test.dart | 4 ++++ 7 files changed, 38 insertions(+) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 22e576432..6c6af4ed1 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -4,6 +4,7 @@ - Adopted `package:dart_flutter_team_lints` linting rules. - Fixed the reported span for `Expression` nodes. - Fixed a regression parsing declaration values containing spaces. +- Add support for `lh` and `rlh` units. ## 0.17.2 diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 69c98cea4..f190a071a 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2470,6 +2470,11 @@ class _Parser { span = span.expand(_next().span); term = ViewportTerm(value, t!.text, span, unitType); break; + case TokenKind.UNIT_LH: + case TokenKind.UNIT_RLH: + span = span.expand(_next().span); + term = LineHeightTerm(value, t!.text, span, unitType); + break; default: if (value is Identifier) { term = LiteralTerm(value, value.name, span); diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index e41a1cba0..85e797834 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -547,6 +547,11 @@ class CssPrinter extends Visitor { emit(node.toString()); } + @override + void visitLineHeightTerm(LineHeightTerm node) { + emit(node.toString()); + } + @override void visitFunctionTerm(FunctionTerm node) { // TODO(terry): Optimize rgb to a hexcolor. diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index 1a57885ec..c13198c3c 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -141,6 +141,8 @@ class TokenKind { static const int UNIT_VIEWPORT_VH = 624; static const int UNIT_VIEWPORT_VMIN = 625; static const int UNIT_VIEWPORT_VMAX = 626; + static const int UNIT_LH = 627; // Computed height of the element. + static const int UNIT_RLH = 628; // Line height of the root element. // Directives (@nnnn) static const int DIRECTIVE_NONE = 640; @@ -289,6 +291,8 @@ class TokenKind { {'unit': TokenKind.UNIT_VIEWPORT_VH, 'value': 'vh'}, {'unit': TokenKind.UNIT_VIEWPORT_VMIN, 'value': 'vmin'}, {'unit': TokenKind.UNIT_VIEWPORT_VMAX, 'value': 'vmax'}, + {'unit': TokenKind.UNIT_LH, 'value': 'lh'}, + {'unit': TokenKind.UNIT_RLH, 'value': 'rlh'}, ]; // Some more constants: @@ -711,6 +715,8 @@ class TokenKind { case TokenKind.UNIT_FREQ_HZ: case TokenKind.UNIT_FREQ_KHZ: case TokenKind.UNIT_FRACTION: + case TokenKind.UNIT_LH: + case TokenKind.UNIT_RLH: return true; default: return false; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 529144d5b..3c7df9707 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -1409,6 +1409,17 @@ class RemTerm extends UnitTerm { dynamic visit(VisitorBase visitor) => visitor.visitRemTerm(this); } +class LineHeightTerm extends UnitTerm { + LineHeightTerm(Object value, String text, SourceSpan? span, int unit) + : super(value, text, span, unit) { + assert(unit == TokenKind.UNIT_LH || unit == TokenKind.UNIT_RLH); + } + @override + LineHeightTerm clone() => LineHeightTerm(value, text, span, unit); + @override + dynamic visit(VisitorBase visitor) => visitor.visitLineHeightTerm(this); +} + class ViewportTerm extends UnitTerm { ViewportTerm(Object value, String text, SourceSpan? span, [int unit = TokenKind.UNIT_LENGTH_PX]) diff --git a/pkgs/csslib/lib/visitor.dart b/pkgs/csslib/lib/visitor.dart index 0b7356d2b..4cfd9f048 100644 --- a/pkgs/csslib/lib/visitor.dart +++ b/pkgs/csslib/lib/visitor.dart @@ -86,6 +86,7 @@ abstract class VisitorBase { dynamic visitChTerm(ChTerm node); dynamic visitRemTerm(RemTerm node); dynamic visitViewportTerm(ViewportTerm node); + dynamic visitLineHeightTerm(LineHeightTerm node); dynamic visitFunctionTerm(FunctionTerm node); dynamic visitGroupTerm(GroupTerm node); dynamic visitItemTerm(ItemTerm node); @@ -476,6 +477,11 @@ class Visitor implements VisitorBase { visitUnitTerm(node); } + @override + dynamic visitLineHeightTerm(LineHeightTerm node) { + visitUnitTerm(node); + } + @override dynamic visitFunctionTerm(FunctionTerm node) { visitLiteralTerm(node); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index d6bde45e9..ba94c7310 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -197,6 +197,8 @@ void testUnits() { padding-bottom: 3vmin; transform: rotate(20deg); voice-pitch: 10hz; + height: 4lh; + width: 40rlh; } #id-2 { left: 2fr; @@ -235,6 +237,8 @@ void testUnits() { padding-bottom: 3vmin; transform: rotate(20deg); voice-pitch: 10hz; + height: 4lh; + width: 40rlh; } #id-2 { left: 2fr; From 5d9f109d1e2aebaa6e5ae0ea1f96e2ca10e623bd Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 14 Mar 2023 11:35:24 -0700 Subject: [PATCH 211/245] refactor the package example (dart-lang/csslib#170) * refactor the example * refactor the package example --------- Co-authored-by: Kevin Moore --- pkgs/csslib/CHANGELOG.md | 1 + pkgs/csslib/example/call_parser.html | 13 ---- .../example/{call_parser.dart => main.dart} | 77 ++++++++++--------- pkgs/csslib/example/test.css | 6 -- 4 files changed, 42 insertions(+), 55 deletions(-) delete mode 100644 pkgs/csslib/example/call_parser.html rename pkgs/csslib/example/{call_parser.dart => main.dart} (70%) delete mode 100644 pkgs/csslib/example/test.css diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 6c6af4ed1..92dacabbe 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -5,6 +5,7 @@ - Fixed the reported span for `Expression` nodes. - Fixed a regression parsing declaration values containing spaces. - Add support for `lh` and `rlh` units. +- Refactor the package example. ## 0.17.2 diff --git a/pkgs/csslib/example/call_parser.html b/pkgs/csslib/example/call_parser.html deleted file mode 100644 index 8dc02e474..000000000 --- a/pkgs/csslib/example/call_parser.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Call CSS Parser from Browser (Dart2JS and Dartium) - - -

Dartium/Dart2JS Test

- - - - diff --git a/pkgs/csslib/example/call_parser.dart b/pkgs/csslib/example/main.dart similarity index 70% rename from pkgs/csslib/example/call_parser.dart rename to pkgs/csslib/example/main.dart index ee05807db..7aad0040f 100644 --- a/pkgs/csslib/example/call_parser.dart +++ b/pkgs/csslib/example/main.dart @@ -4,40 +4,23 @@ import 'package:csslib/parser.dart' as css; import 'package:csslib/visitor.dart'; -const _default = css.PreprocessorOptions( - useColors: false, - checked: true, - warningsAsErrors: true, - inputFile: 'memory'); - -/// Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, -/// CSS will allow any property/value pairs regardless of validity; all of our -/// tests (by default) will ensure that the CSS is really valid. -StyleSheet parseCss(String cssInput, - {List? errors, css.PreprocessorOptions? opts}) { - return css.parse(cssInput, errors: errors, options: opts ?? _default); -} - -/// Pretty printer for CSS. -String prettyPrint(StyleSheet ss) => - (CssPrinter()..visitTree(ss, pretty: true)).toString(); - void main() { var errors = []; // Parse a simple stylesheet. print('1. Good CSS, parsed CSS emitted:'); print(' ============================='); - var stylesheet = parseCss( - '@import "support/at-charset-019.css"; div { color: red; }' - 'button[type] { background-color: red; }' - '.foo { ' - 'color: red; left: 20px; top: 20px; width: 100px; height:200px' - '}' - '#div {' - 'color : #00F578; border-color: #878787;' - '}', - errors: errors); + var stylesheet = parseCss(''' +@import "support/at-charset-019.css"; +div { color: red; } +button[type] { background-color: red; } +.foo { + color: red; left: 20px; top: 20px; width: 100px; height:200px +} +#div { + color : #00F578; border-color: #878787; +} +''', errors: errors); if (errors.isNotEmpty) { print('Got ${errors.length} errors.\n'); @@ -49,13 +32,13 @@ void main() { } // Parse a stylesheet with errors - print('2. Catch severe syntax errors:'); + print('\n2. Catch severe syntax errors:'); print(' ==========================='); - var stylesheetError = parseCss( - '.foo #%^&*asdf{ ' - 'color: red; left: 20px; top: 20px; width: 100px; height:200px' - '}', - errors: errors); + var stylesheetError = parseCss(''' +.foo #%^&*asdf { + color: red; left: 20px; top: 20px; width: 100px; height:200px +} +''', errors: errors); if (errors.isNotEmpty) { print('Got ${errors.length} errors.\n'); @@ -67,7 +50,7 @@ void main() { } // Parse a stylesheet that warns (checks) problematic CSS. - print('3. Detect CSS problem with checking on:'); + print('\n3. Detect CSS problem with checking on:'); print(' ==================================='); stylesheetError = parseCss('# div1 { color: red; }', errors: errors); @@ -81,7 +64,7 @@ void main() { } // Parse a CSS selector. - print('4. Parse a selector only:'); + print('\n4. Parse a selector only:'); print(' ======================'); var selectorAst = css.selector('#div .foo', errors: errors); if (errors.isNotEmpty) { @@ -93,3 +76,25 @@ void main() { print(prettyPrint(selectorAst)); } } + +/// Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, +/// CSS will allow any property/value pairs regardless of validity; all of our +/// tests (by default) will ensure that the CSS is really valid. +StyleSheet parseCss( + String cssInput, { + List? errors, + css.PreprocessorOptions? opts, +}) { + return css.parse(cssInput, errors: errors, options: opts ?? _default); +} + +/// Pretty printer for CSS. +String prettyPrint(StyleSheet ss) => + (CssPrinter()..visitTree(ss, pretty: true)).toString(); + +const _default = css.PreprocessorOptions( + useColors: false, + checked: true, + warningsAsErrors: true, + inputFile: 'memory', +); diff --git a/pkgs/csslib/example/test.css b/pkgs/csslib/example/test.css deleted file mode 100644 index 42aa04821..000000000 --- a/pkgs/csslib/example/test.css +++ /dev/null @@ -1,6 +0,0 @@ -.foo #abc { - color: red; - width: 300px; - left: 50px; - right: 50px; -} \ No newline at end of file From 15e5a553b29acd0553790f7a2a13a47ee787df34 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Apr 2023 09:49:32 -0700 Subject: [PATCH 212/245] Bump actions/checkout from 3.3.0 to 3.5.0 (dart-lang/csslib#177) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.3.0 to 3.5.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/ac593985615ec2ede58e132d2e21d2b1cbd6127c...8f4b7f84864484a7bf31766abe9204da3cbe65b3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index fb727466b..2da99c7b6 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 - uses: dart-lang/setup-dart@a57a6c04cf7d4840e88432aad6281d1e125f0d46 with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [2.17.0, dev] steps: - - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 - uses: dart-lang/setup-dart@a57a6c04cf7d4840e88432aad6281d1e125f0d46 with: sdk: ${{ matrix.sdk }} From 0bd0aae7352ab308a19cb3a58ead7a6d45bc1c53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:54:11 -0700 Subject: [PATCH 213/245] Bump dart-lang/setup-dart from 1.4.0 to 1.5.0 (dart-lang/csslib#176) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.4.0 to 1.5.0. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/a57a6c04cf7d4840e88432aad6281d1e125f0d46...d6a63dab3335f427404425de0fbfed4686d93c4f) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 2da99c7b6..761153ca5 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -23,7 +23,7 @@ jobs: sdk: [dev] steps: - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 - - uses: dart-lang/setup-dart@a57a6c04cf7d4840e88432aad6281d1e125f0d46 + - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} - id: install @@ -50,7 +50,7 @@ jobs: sdk: [2.17.0, dev] steps: - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 - - uses: dart-lang/setup-dart@a57a6c04cf7d4840e88432aad6281d1e125f0d46 + - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} - id: install From c9448154fd4e4c4593574250f237c93133008634 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 May 2023 12:29:43 -0700 Subject: [PATCH 214/245] Bump actions/checkout from 3.5.0 to 3.5.2 (dart-lang/csslib#178) Bumps [actions/checkout](https://github.com/actions/checkout) from 3.5.0 to 3.5.2. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/8f4b7f84864484a7bf31766abe9204da3cbe65b3...8e5e7e5ab8b370d6c329ec480221332ada57f0ab) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 761153ca5..1570da21f 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [2.17.0, dev] steps: - - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} From 2e72b86aea2462ded79c16c50997bea0a081a6c6 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Wed, 10 May 2023 09:37:54 -0700 Subject: [PATCH 215/245] fixed CssPrinter pretty print indent levels (dart-lang/csslib#169) * fixed CssPrinter pretty print indent levels * review comments --- pkgs/csslib/CHANGELOG.md | 1 + pkgs/csslib/lib/src/css_printer.dart | 185 +++++++++++------ pkgs/csslib/lib/src/tree_printer.dart | 1 + pkgs/csslib/test/compiler_test.dart | 28 +-- pkgs/csslib/test/declaration_test.dart | 262 +++++++++++++------------ pkgs/csslib/test/keyframes_test.dart | 4 +- pkgs/csslib/test/mixin_test.dart | 1 - pkgs/csslib/test/nested_test.dart | 27 +-- pkgs/csslib/test/testing.dart | 28 ++- pkgs/csslib/test/var_test.dart | 20 +- pkgs/csslib/test/visitor_test.dart | 30 +++ 11 files changed, 344 insertions(+), 243 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 92dacabbe..75c5158f7 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -6,6 +6,7 @@ - Fixed a regression parsing declaration values containing spaces. - Add support for `lh` and `rlh` units. - Refactor the package example. +- Addressed an issue with the indent level of the `CssPrinter` output. ## 0.17.2 diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index 85e797834..e0507d1ca 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -7,35 +7,91 @@ part of '../visitor.dart'; /// Visitor that produces a formatted string representation of the CSS tree. class CssPrinter extends Visitor { StringBuffer _buff = StringBuffer(); - bool prettyPrint = true; + bool _prettyPrint = true; bool _isInKeyframes = false; + int _indent = 0; + bool _startOfLine = true; /// Walk the [tree] Stylesheet. [pretty] if true emits line breaks, extra /// spaces, friendly property values, etc., if false emits compacted output. @override void visitTree(StyleSheet tree, {bool pretty = false}) { - prettyPrint = pretty; + _prettyPrint = pretty; _buff = StringBuffer(); + _indent = 0; + _startOfLine = true; + visitStyleSheet(tree); } /// Appends [str] to the output buffer. void emit(String str) { - _buff.write(str); + if (_prettyPrint) { + if (_startOfLine) { + _startOfLine = false; + _buff.write(' ' * _indent); + } + _buff.write(str); + } else { + _buff.write(str); + } + } + + void _emitLBrace() { + _indent += 2; + _buff.write('{'); + + if (_prettyPrint) { + _buff.writeln(); + _startOfLine = true; + } + } + + void _emitRBrace() { + _indent -= 2; + + if (_prettyPrint) { + if (!_startOfLine) _buff.write('\n'); + _buff.write('${' ' * _indent}}\n'); + _startOfLine = true; + } else { + _buff.write('}'); + if (_indent == 0) { + _buff.writeln(); + } + } + } + + void _emitSemicolon({bool forceLf = false}) { + if (_prettyPrint) { + _buff.write(';\n'); + _startOfLine = true; + } else { + _buff.write(';'); + if (forceLf) _buff.write('\n'); + } + } + + void _emitLf({bool force = false}) { + if (_prettyPrint) { + _buff.write('\n'); + _startOfLine = true; + } else if (force) { + _buff.write('\n'); + } } /// Returns the output buffer. @override String toString() => _buff.toString().trim(); - String get _newLine => prettyPrint ? '\n' : ''; - String get _sp => prettyPrint ? ' ' : ''; + String get _sp => _prettyPrint ? ' ' : ''; // TODO(terry): When adding obfuscation we'll need isOptimized (compact w/ // obfuscation) and have isTesting (compact no obfuscation) and // isCompact would be !prettyPrint. We'll need another boolean // flag for obfuscation. - bool get _isTesting => !prettyPrint; + bool get _isTesting => !_prettyPrint; @override void visitCalcTerm(CalcTerm node) { @@ -86,28 +142,30 @@ class CssPrinter extends Visitor { @override void visitDocumentDirective(DocumentDirective node) { - emit('$_newLine@-moz-document '); + emit('@-moz-document '); node.functions.first.visit(this); for (var function in node.functions.skip(1)) { emit(',$_sp'); function.visit(this); } - emit('$_sp{'); + emit(_sp); + _emitLBrace(); for (var ruleSet in node.groupRuleBody) { ruleSet.visit(this); } - emit('$_newLine}'); + _emitRBrace(); } @override void visitSupportsDirective(SupportsDirective node) { - emit('$_newLine@supports '); + emit('@supports '); node.condition!.visit(this); - emit('$_sp{'); + emit(_sp); + _emitLBrace(); for (var rule in node.groupRuleBody) { rule.visit(this); } - emit('$_newLine}'); + _emitRBrace(); } @override @@ -143,29 +201,32 @@ class CssPrinter extends Visitor { @override void visitViewportDirective(ViewportDirective node) { - emit('@${node.name}$_sp{$_newLine'); + emit('@${node.name}$_sp'); + _emitLBrace(); node.declarations.visit(this); - emit('}'); + _emitRBrace(); } @override void visitMediaDirective(MediaDirective node) { - emit('$_newLine@media'); + emit('@media'); emitMediaQueries(node.mediaQueries.cast()); - emit('$_sp{'); + emit(_sp); + _emitLBrace(); for (var ruleset in node.rules) { ruleset.visit(this); } - emit('$_newLine}'); + _emitRBrace(); } @override void visitHostDirective(HostDirective node) { - emit('$_newLine@host$_sp{'); + emit('@host$_sp'); + _emitLBrace(); for (var ruleset in node.rules) { ruleset.visit(this); } - emit('$_newLine}'); + _emitRBrace(); } /// @page : pseudoPage { @@ -173,7 +234,7 @@ class CssPrinter extends Visitor { /// } @override void visitPageDirective(PageDirective node) { - emit('$_newLine@page'); + emit('@page'); if (node.hasIdent || node.hasPseudoPage) { if (node.hasIdent) emit(' '); emit(node._ident!); @@ -182,17 +243,19 @@ class CssPrinter extends Visitor { var declsMargin = node._declsMargin; var declsMarginLength = declsMargin.length; - emit('$_sp{$_newLine'); + emit(_sp); + _emitLBrace(); for (var i = 0; i < declsMarginLength; i++) { declsMargin[i].visit(this); } - emit('}'); + _emitRBrace(); } /// @charset "charset encoding" @override void visitCharsetDirective(CharsetDirective node) { - emit('$_newLine@charset "${node.charEncoding}";'); + emit('@charset "${node.charEncoding}"'); + _emitSemicolon(forceLf: true); } @override @@ -201,51 +264,54 @@ class CssPrinter extends Visitor { if (_isTesting) { // Emit assuming url() was parsed; most suite tests use url function. - emit(' @import url(${node.import})'); + emit('@import url(${node.import})'); } else if (isStartingQuote(node.import)) { - emit(' @import ${node.import}'); + emit('@import ${node.import}'); } else { // url(...) isn't needed only a URI can follow an @import directive; emit // url as a string. - emit(' @import "${node.import}"'); + emit('@import "${node.import}"'); } emitMediaQueries(node.mediaQueries); - emit(';'); + _emitSemicolon(forceLf: true); } @override void visitKeyFrameDirective(KeyFrameDirective node) { - emit('$_newLine${node.keyFrameName} '); + emit('${node.keyFrameName} '); node.name!.visit(this); - emit('$_sp{$_newLine'); + emit(_sp); + _emitLBrace(); _isInKeyframes = true; for (final block in node._blocks) { block.visit(this); } _isInKeyframes = false; - emit('}'); + _emitRBrace(); } @override void visitFontFaceDirective(FontFaceDirective node) { - emit('$_newLine@font-face '); - emit('$_sp{$_newLine'); + emit('@font-face'); + emit(_sp); + _emitLBrace(); node._declarations.visit(this); - emit('}'); + _emitRBrace(); } @override void visitKeyFrameBlock(KeyFrameBlock node) { - emit('$_sp$_sp'); node._blockSelectors.visit(this); - emit('$_sp{$_newLine'); + emit(_sp); + _emitLBrace(); node._declarations.visit(this); - emit('$_sp$_sp}$_newLine'); + _emitRBrace(); } @override void visitStyletDirective(StyletDirective node) { - emit('/* @stylet export as ${node.dartClassName} */\n'); + emit('/* @stylet export as ${node.dartClassName} */'); + _emitLf(force: true); } @override @@ -253,49 +319,51 @@ class CssPrinter extends Visitor { bool isStartingQuote(String ch) => '\'"'.contains(ch); if (isStartingQuote(node._uri!)) { - emit(' @namespace ${node.prefix}"${node._uri}"'); + emit('@namespace ${node.prefix}"${node._uri}"'); } else { if (_isTesting) { // Emit exactly was we parsed. - emit(' @namespace ${node.prefix}url(${node._uri})'); + emit('@namespace ${node.prefix}url(${node._uri})'); } else { // url(...) isn't needed only a URI can follow a: // @namespace prefix directive. - emit(' @namespace ${node.prefix}${node._uri}'); + emit('@namespace ${node.prefix}${node._uri}'); } } - emit(';'); + _emitSemicolon(forceLf: true); } @override void visitVarDefinitionDirective(VarDefinitionDirective node) { visitVarDefinition(node.def); - emit(';$_newLine'); + _emitSemicolon(); } @override void visitMixinRulesetDirective(MixinRulesetDirective node) { - emit('@mixin ${node.name} {'); + emit('@mixin ${node.name} '); + _emitLBrace(); for (var ruleset in node.rulesets) { ruleset.visit(this); } - emit('}'); + _emitRBrace(); } @override void visitMixinDeclarationDirective(MixinDeclarationDirective node) { - emit('@mixin ${node.name} {\n'); + emit('@mixin ${node.name}$_sp'); + _emitLBrace(); visitDeclarationGroup(node.declarations); - emit('}'); + _emitRBrace(); } /// Added optional newLine for handling @include at top-level vs/ inside of /// a declaration group. @override void visitIncludeDirective(IncludeDirective node, [bool topLevel = true]) { - if (topLevel) emit(_newLine); + if (topLevel) _emitLf(); emit('@include ${node.name}'); - emit(';'); + _emitSemicolon(forceLf: true); } @override @@ -305,11 +373,11 @@ class CssPrinter extends Visitor { @override void visitRuleSet(RuleSet node) { - emit(_newLine); node.selectorGroup!.visit(this); - emit('$_sp{$_newLine'); + emit(_sp); + _emitLBrace(); node.declarationGroup.visit(this); - emit('}'); + _emitRBrace(); } @override @@ -317,15 +385,12 @@ class CssPrinter extends Visitor { var declarations = node.declarations; var declarationsLength = declarations.length; for (var i = 0; i < declarationsLength; i++) { - if (i > 0) emit(_newLine); - emit('$_sp$_sp'); declarations[i].visit(this); // Don't emit the last semicolon in compact mode. - if (prettyPrint || i < declarationsLength - 1) { - emit(';'); + if (_prettyPrint || i < declarationsLength - 1) { + _emitSemicolon(); } } - if (declarationsLength > 0) emit(_newLine); } @override @@ -333,11 +398,10 @@ class CssPrinter extends Visitor { var marginSymName = TokenKind.idToValue(TokenKind.MARGIN_DIRECTIVES, node.margin_sym); - emit('@$marginSymName$_sp{$_newLine'); - + emit('@$marginSymName$_sp'); + _emitLBrace(); visitDeclarationGroup(node); - - emit('}$_newLine'); + _emitRBrace(); } @override @@ -619,6 +683,7 @@ class CssPrinter extends Visitor { void visitExpressions(Expressions node) { var expressions = node.expressions; var expressionsLength = expressions.length; + for (var i = 0; i < expressionsLength; i++) { // Add space seperator between terms without an operator. // TODO(terry): Should have a BinaryExpression to solve this problem. diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 03982262e..4b6fbf83d 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -17,6 +17,7 @@ String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) { class _TreePrinter extends Visitor { final TreeOutput output; final bool useSpan; + _TreePrinter(this.output, this.useSpan) { output.printer = this; } diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index ad0bfd36e..287904060 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -653,20 +653,20 @@ void testHost() { expect(errors.isEmpty, true, reason: errors.toString()); expect(prettyPrint(stylesheet), r''' @host { -:scope { - white-space: nowrap; - overflow-style: marquee-line; - overflow-x: marquee; -} -* { - color: #f00; -} -*:hover { - font-weight: bold; -} -:nth-child(odd) { - color: #00f; -} + :scope { + white-space: nowrap; + overflow-style: marquee-line; + overflow-x: marquee; + } + * { + color: #f00; + } + *:hover { + font-weight: bold; + } + :nth-child(odd) { + color: #00f; + } }'''); } diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index ba94c7310..0a1b91c5c 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -166,7 +166,7 @@ void testComposites() { } @-webkit-keyframes pulsate { 0% { - -webkit-transform: translate3d(0, 0, 0) scale(1.0); + -webkit-transform: translate3d(0, 0, 0) scale(1.0); } }'''; @@ -311,9 +311,9 @@ void testNewerCss() { final generated = r''' @media screen, print { -.foobar_screen { - width: 10px; -} + .foobar_screen { + width: 10px; + } } @page { height: 22px; @@ -323,14 +323,14 @@ void testNewerCss() { width: 10px; } @page bar:left { -@top-left { - margin: 8px; -} + @top-left { + margin: 8px; + } } @page { -@top-left { - margin: 8px; -} + @top-left { + margin: 8px; + } width: 10px; } @charset "ISO-8859-1"; @@ -355,12 +355,12 @@ void testMediaQueries() { }'''; var generated = ''' @media screen AND (-webkit-min-device-pixel-ratio:0) { -.todo-item .toggle { - background: none; -} -#todo-item .toggle { - height: 40px; -} + .todo-item .toggle { + background: none; + } + #todo-item .toggle { + height: 40px; + } }'''; var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); @@ -386,27 +386,27 @@ void testMediaQueries() { border: 20px; } }'''; - generated = - '''@media handheld AND (min-width:20em), screen AND (min-width:20em) { -#id { - color: #f00; -} -.myclass { - height: 20px; -} + generated = ''' +@media handheld AND (min-width:20em), screen AND (min-width:20em) { + #id { + color: #f00; + } + .myclass { + height: 20px; + } } @media print AND (min-resolution:300dpi) { -#anotherId { - color: #fff; -} + #anotherId { + color: #fff; + } } @media print AND (min-resolution:280dpcm) { -#finalId { - color: #aaa; -} -.class2 { - border: 20px; -} + #finalId { + color: #aaa; + } + .class2 { + border: 20px; + } }'''; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -421,9 +421,12 @@ void testMediaQueries() { font-size: 10em; } }'''; - generated = '@media ONLY screen AND (min-device-width:4000px) ' - 'AND (min-device-height:2000px), screen AND (another:100px) {\n' - 'html {\n font-size: 10em;\n}\n}'; + generated = ''' +@media ONLY screen AND (min-device-width:4000px) AND (min-device-height:2000px), screen AND (another:100px) { + html { + font-size: 10em; + } +}'''; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -439,7 +442,7 @@ void testMediaQueries() { }'''; generated = '@media screen, print AND (min-device-width:4000px) AND ' '(min-device-height:2000px), screen AND (another:100px) {\n' - 'html {\n font-size: 10em;\n}\n}'; + ' html {\n font-size: 10em;\n }\n}'; stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); @@ -482,15 +485,16 @@ void testMediaQueries() { } } }'''; - generated = '''@media (min-width:840px) { -.cell { - width: calc(33% - 16px); -} -@supports (display: grid) { -.cell { - grid-column-end: span 4; -} -} + generated = ''' +@media (min-width:840px) { + .cell { + width: calc(33% - 16px); + } + @supports (display: grid) { + .cell { + grid-column-end: span 4; + } + } }'''; expectCss(input, generated); } @@ -504,10 +508,11 @@ void testMozDocument() { color: #000; } }'''; - var expected = '''@-moz-document url-prefix() { -div { - color: #000; -} + var expected = ''' +@-moz-document url-prefix() { + div { + color: #000; + } }'''; var styleSheet = parseCss(css, errors: errors); expect(styleSheet, isNotNull); @@ -521,10 +526,11 @@ div { color: #000; } }'''; - expected = '''@-moz-document url-prefix("http://www.w3.org/Style/") { -div { - color: #000; -} + expected = ''' +@-moz-document url-prefix("http://www.w3.org/Style/") { + div { + color: #000; + } }'''; styleSheet = parseCss(css, errors: errors); expect(styleSheet, isNotNull); @@ -538,10 +544,11 @@ div { color: #000; } }'''; - expected = '''@-moz-document domain("google.com") { -div { - color: #000; -} + expected = ''' +@-moz-document domain("google.com") { + div { + color: #000; + } }'''; styleSheet = parseCss(css, errors: errors); expect(styleSheet, isNotNull); @@ -558,7 +565,7 @@ div { 'url("http://www.w3.org/"), ' 'url-prefix("http://www.w3.org/Style/"), ' 'domain("google.com"), ' - 'regexp("https:.*") {\ndiv {\n color: #000;\n}\n}'; + 'regexp("https:.*") {\n div {\n color: #000;\n }\n}'; styleSheet = parseCss(css, errors: errors); expect(styleSheet, isNotNull); expect(errors, isEmpty); @@ -573,10 +580,11 @@ void testSupports() { -webkit-appearance: none; } }'''; - var expected = '''@supports (-webkit-appearance: none) { -div { - -webkit-appearance: none; -} + var expected = ''' +@supports (-webkit-appearance: none) { + div { + -webkit-appearance: none; + } }'''; expectCss(css, expected); @@ -585,10 +593,11 @@ div { @supports not ( display: flex ) { body { width: 100%; } }'''; - expected = '''@supports not (display: flex) { -body { - width: 100%; -} + expected = ''' +@supports not (display: flex) { + body { + width: 100%; + } }'''; expectCss(css, expected); @@ -606,9 +615,9 @@ body { '(-moz-box-shadow: 0 0 2px #000 inset) or ' '(-webkit-box-shadow: 0 0 2px #000 inset) or ' '(-o-box-shadow: 0 0 2px #000 inset) {\n' - '.box {\n' - ' box-shadow: 0 0 2px #000 inset;\n' - '}\n' + ' .box {\n' + ' box-shadow: 0 0 2px #000 inset;\n' + ' }\n' '}'; expectCss(css, expected); @@ -625,10 +634,10 @@ body { expected = '@supports ' '((transition-property: color) or (animation-name: foo)) and ' '(transform: rotate(10deg)) {\n' - 'div {\n' - ' transition-property: color;\n' - ' transform: rotate(10deg);\n' - '}\n' + ' div {\n' + ' transition-property: color;\n' + ' transform: rotate(10deg);\n' + ' }\n' '}'; expectCss(css, expected); @@ -682,7 +691,7 @@ void testFontFace() { src: url(fonts/BBCBengali.ttf) format("opentype"); unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; }'''; - final generated = '''@font-face { + final generated = '''@font-face { font-family: BBCBengali; src: url("fonts/BBCBengali.ttf") format("opentype"); unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; @@ -698,7 +707,7 @@ void testFontFace() { src: url(http://example.com/fonts/Gentium.ttf); src: url(http://example.com/fonts/Gentium.ttf); }'''; - final generated1 = '''@font-face { + final generated1 = '''@font-face { font-family: Gentium; src: url("http://example.com/fonts/Gentium.ttf"); src: url("http://example.com/fonts/Gentium.ttf"); @@ -715,7 +724,7 @@ src: url(ideal-sans-serif.woff) format("woff"), url(basic-sans-serif.ttf) format("opentype"), local(Gentium Bold); }'''; - final generated2 = '@font-face {\n' + final generated2 = '@font-face {\n' ' src: url("ideal-sans-serif.woff") ' 'format("woff"), url("basic-sans-serif.ttf") ' 'format("opentype"), local(Gentium Bold);\n}'; @@ -734,7 +743,7 @@ src: url(ideal-sans-serif.woff) format("woff"), font-weight: bold; }'''; final generated3 = ''' -@font-face { +@font-face { font-family: MyGentium Text Ornaments; src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); font-weight: bold; @@ -751,7 +760,7 @@ src: url(ideal-sans-serif.woff) format("woff"), src: local(STIXGeneral), url(/stixfonts/STIXGeneral.otf); unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; }'''; - final generated4 = '''@font-face { + final generated4 = '''@font-face { font-family: STIXGeneral; src: local(STIXGeneral), url("/stixfonts/STIXGeneral.otf"); unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; @@ -799,33 +808,34 @@ div[href^='test'] { } '''; - final generated = '@import "simple.css"; ' - '@import "test.css" print; ' - '@import "test.css" screen, print; ' - '@import "http://google.com/maps/maps.css";\n' - 'div[href^="test"] {\n' - ' height: 10px;\n' - '}\n' - '@-webkit-keyframes pulsate {\n' - ' from {\n' - ' -webkit-transform: translate3d(0, 0, 0) scale(1.0);\n' - ' }\n' - ' 10% {\n' - ' -webkit-transform: translate3d(0, 0, 0) scale(1.0);\n' - ' }\n' - ' 30% {\n' - ' -webkit-transform: translate3d(0, 2, 0) scale(1.0);\n' - ' }\n' - '}\n' - '.foobar {\n' - ' grid-columns: 10px ("content" 1fr 10px) [4];\n' - '}\n' - '.test-background {\n' - ' background: url("http://www.foo.com/bar.png");\n' - '}\n' - '.test-background-with-multiple-properties {\n' - ' background: #000 url("http://www.foo.com/bar.png");\n' - '}'; + final generated = ''' +@import "simple.css"; +@import "test.css" print; +@import "test.css" screen, print; +@import "http://google.com/maps/maps.css"; +div[href^="test"] { + height: 10px; +} +@-webkit-keyframes pulsate { + from { + -webkit-transform: translate3d(0, 0, 0) scale(1.0); + } + 10% { + -webkit-transform: translate3d(0, 0, 0) scale(1.0); + } + 30% { + -webkit-transform: translate3d(0, 2, 0) scale(1.0); + } +} +.foobar { + grid-columns: 10px ("content" 1fr 10px) [4]; +} +.test-background { + background: url("http://www.foo.com/bar.png"); +} +.test-background-with-multiple-properties { + background: #000 url("http://www.foo.com/bar.png"); +}'''; var stylesheet = parseCss(input, errors: errors); expect(errors.isEmpty, true, reason: errors.toString()); @@ -865,14 +875,15 @@ div { color: rgba(0, 0, 0, 0.2); } '''; - final generated = 'div{color:green!important;background:red blue green}' - '.foo p[bar]{color:blue}' - '@page{@top-left{color:red}}' - '@page:first{}' - '@page foo:first{}' - '@media screen AND (max-width:800px){div{font-size:24px}}' - '@keyframes foo{0%{transform:scaleX(0)}}' - 'div{color:rgba(0,0,0,0.2)}'; + final generated = ''' +div{color:green!important;background:red blue green} +.foo p[bar]{color:blue} +@page{@top-left{color:red}} +@page:first{} +@page foo:first{} +@media screen AND (max-width:800px){div{font-size:24px}} +@keyframes foo{0%{transform:scaleX(0)}} +div{color:rgba(0,0,0,0.2)}'''; var stylesheet = parseCss(input, errors: errors); @@ -1145,7 +1156,8 @@ background-position: 0 0; } }'''; - final generated = '''.testIE-6 { + final generated = ''' +.testIE-6 { _zoom: 5; } .clearfix { @@ -1180,42 +1192,42 @@ input.search-query { } @-webkit-keyframes progress-bar-stripes { from { - background-position: 40px 0; + background-position: 40px 0; } to { - background-position: 0 0; + background-position: 0 0; } } @-moz-keyframes progress-bar-stripes { from { - background-position: 40px 0; + background-position: 40px 0; } to { - background-position: 0 0; + background-position: 0 0; } } @keyframes progress-bar-stripes { from { - background-position: 40px 0; + background-position: 40px 0; } to { - background-position: 0 0; + background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { - background-position: 40px 0; + background-position: 40px 0; } to { - background-position: 0 0; + background-position: 0 0; } } @keyframes progress-bar-stripes { from { - background-position: 40px 0; + background-position: 40px 0; } to { - background-position: 0 0; + background-position: 0 0; } }'''; diff --git a/pkgs/csslib/test/keyframes_test.dart b/pkgs/csslib/test/keyframes_test.dart index 0c9456f04..3560c0d48 100644 --- a/pkgs/csslib/test/keyframes_test.dart +++ b/pkgs/csslib/test/keyframes_test.dart @@ -17,8 +17,8 @@ void main() { final expected = r''' @keyframes ping { 75%, 100% { - transform: scale(2); - opacity: 0; + transform: scale(2); + opacity: 0; } }'''; expect(prettyPrint(stylesheet), expected); diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 0432b1c05..a60674adb 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -397,7 +397,6 @@ void mixinManyArgs() { } ''', r''' var-values: #f00, #0f0, #00f; - .primary { color: #f00; background-color: #0f0; diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index a594969ea..a5798680d 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -238,7 +238,7 @@ div > span[attr="foo"] { void complexNest() { final input = ''' -@font-face { font-family: arial; } +@font-face { font-family: arial; } div { color: #f0f0f0; } #header + div { color: url(abc.png); @@ -276,7 +276,7 @@ div { color: #f0f0f0; } span { color: #1f1f2f; } '''; - final generated = r'''@font-face { + final generated = r'''@font-face { font-family: arial; } div { @@ -353,17 +353,18 @@ void mediaNesting() { } } '''; - final generated = r'''@media screen AND (-webkit-min-device-pixel-ratio:0) { -#toggle-all { - image: url("test.jpb"); - color: #f00; -} -#toggle-all div, #toggle-all table { - background: none; -} -#toggle-all div a, #toggle-all table a { - width: 100px; -} + final generated = r''' +@media screen AND (-webkit-min-device-pixel-ratio:0) { + #toggle-all { + image: url("test.jpb"); + color: #f00; + } + #toggle-all div, #toggle-all table { + background: none; + } + #toggle-all div a, #toggle-all table a { + width: 100px; + } }'''; compileAndValidate(input, generated); diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index d93c4a3e1..00e6ce755 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -10,16 +10,18 @@ import 'package:csslib/visitor.dart'; export 'package:csslib/src/preprocessor_options.dart'; -const simpleOptionsWithCheckedAndWarningsAsErrors = PreprocessorOptions( - useColors: false, - checked: true, - warningsAsErrors: true, - inputFile: 'memory'); +const PreprocessorOptions simpleOptionsWithCheckedAndWarningsAsErrors = + PreprocessorOptions( + useColors: false, + checked: true, + warningsAsErrors: true, + inputFile: 'memory', +); -const simpleOptions = +const PreprocessorOptions simpleOptions = PreprocessorOptions(useColors: false, inputFile: 'memory'); -const options = PreprocessorOptions( +const PreprocessorOptions options = PreprocessorOptions( useColors: false, warningsAsErrors: true, inputFile: 'memory'); /// Spin-up CSS parser in checked mode to detect any problematic CSS. Normally, @@ -49,17 +51,11 @@ StyleSheet polyFillCompileCss(String input, {List? errors, PreprocessorOptions? opts}) => compileCss(input, errors: errors, polyfill: true, opts: opts); -/// CSS emitter walks the style sheet tree and emits readable CSS. -final _emitCss = CssPrinter(); - -/// Simple Visitor does nothing but walk tree. -final _cssVisitor = Visitor(); - /// Pretty printer for CSS. String prettyPrint(StyleSheet ss) { // Walk the tree testing basic Visitor class. walkTree(ss); - return (_emitCss..visitTree(ss, pretty: true)).toString(); + return (CssPrinter()..visitTree(ss, pretty: true)).toString(); } /// Helper function to emit compact (non-pretty printed) CSS for suite test @@ -67,12 +63,12 @@ String prettyPrint(StyleSheet ss) { /// expected suite test results. String compactOutput(StyleSheet ss) { walkTree(ss); - return (_emitCss..visitTree(ss, pretty: false)).toString(); + return (CssPrinter()..visitTree(ss, pretty: false)).toString(); } /// Walks the style sheet tree does nothing; insures the basic walker works. void walkTree(StyleSheet ss) { - _cssVisitor.visitTree(ss); + Visitor().visitTree(ss); } String dumpTree(StyleSheet ss) => treeToDebugString(ss); diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 079955fc4..482fda9a9 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -179,12 +179,12 @@ void expressionsVar() { content: var(content); text-shadow: var(text-shadow); } -@font-face { +@font-face { font-family: var(font-family); src: var(src); unicode-range: var(unicode-range); } -@font-face { +@font-face { font-family: var(font-family); src: var(src-1); unicode-range: var(unicode-range-1); @@ -214,12 +214,12 @@ void expressionsVar() { content: "✔"; text-shadow: 0 -1px 0 #bfbfbf; } -@font-face { +@font-face { font-family: Gentium; src: url("http://example.com/fonts/Gentium.ttf"); unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; } -@font-face { +@font-face { font-family: Gentium; src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; @@ -602,12 +602,12 @@ void parserVar() { content: var(content); text-shadow: var(text-shadow); } -@font-face { +@font-face { font-family: var(font-family); src: var(src); unicode-range: var(unicode-range); } -@font-face { +@font-face { font-family: var(font-family); src: var(src-1); unicode-range: var(unicode-range-1); @@ -637,12 +637,12 @@ void parserVar() { content: "✔"; text-shadow: 0 -1px 0 #bfbfbf; } -@font-face { +@font-face { font-family: Gentium; src: url("http://example.com/fonts/Gentium.ttf"); unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; } -@font-face { +@font-face { font-family: Gentium; src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf"); unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; @@ -667,7 +667,6 @@ void testVar() { final generated = ''' var-color-background: #f00; var-color-foreground: #00f; - .test { background-color: var(color-background); color: var(color-foreground); @@ -692,7 +691,6 @@ var-color-foreground: #00f; final generated2 = ''' var-color-background: #f00; var-color-foreground: #00f; - .test { background-color: var(color-background); color: var(color-foreground); @@ -720,7 +718,6 @@ void testLess() { final generated = ''' var-color-background: #f00; var-color-foreground: #00f; - .test { background-color: var(color-background); color: var(color-foreground); @@ -745,7 +742,6 @@ var-color-foreground: #00f; final generated2 = ''' var-color-background: #f00; var-color-foreground: #00f; - .test { background-color: var(color-background); color: var(color-foreground); diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index f84599357..a70f91fb0 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -109,4 +109,34 @@ div.myComponent_xyzzy { void main() { test('Class Visitors', testClassVisitors); test('Polyfill', testPolyFill); + test('pretty-print', testPrettyPrint); +} + +void testPrettyPrint() { + final input = ''' +.good { color: red; } +@media screen { .better { color: blue; } } +.best { color: green }'''; + + var styleSheet = parseCss(input); + + // pretty print + expect(prettyPrint(styleSheet), ''' +.good { + color: #f00; +} +@media screen { + .better { + color: #00f; + } +} +.best { + color: #008000; +}'''); + + // compact output + expect(compactOutput(styleSheet), ''' +.good{color:red} +@media screen{.better{color:blue}} +.best{color:green}'''); } From 5cc302b5294377c1c97f76d40fc4d5bf1f7705b6 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Wed, 10 May 2023 09:38:21 -0700 Subject: [PATCH 216/245] address an issue parsing font names (dart-lang/csslib#168) * address an issue parsing font names * update comment * update changelog * Apply suggestions from code review Co-authored-by: Leon Senft * review feedback * dart format --------- Co-authored-by: Leon Senft --- pkgs/csslib/.gitignore | 1 + pkgs/csslib/CHANGELOG.md | 1 + pkgs/csslib/lib/parser.dart | 126 +++++++++++++------------ pkgs/csslib/lib/src/messages.dart | 10 ++ pkgs/csslib/lib/src/token.dart | 2 +- pkgs/csslib/lib/src/token_kind.dart | 1 + pkgs/csslib/lib/src/tokenizer.dart | 3 + pkgs/csslib/test/declaration_test.dart | 60 ++++++++++++ pkgs/csslib/test/mixin_test.dart | 31 +----- pkgs/csslib/test/testing.dart | 7 ++ 10 files changed, 155 insertions(+), 87 deletions(-) diff --git a/pkgs/csslib/.gitignore b/pkgs/csslib/.gitignore index 79f51c3d5..c107fc64c 100644 --- a/pkgs/csslib/.gitignore +++ b/pkgs/csslib/.gitignore @@ -1,3 +1,4 @@ .dart_tool .packages pubspec.lock +doc/api/ diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 75c5158f7..014438254 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -2,6 +2,7 @@ - Add markdown badges to the readme. - Adopted `package:dart_flutter_team_lints` linting rules. +- Addressed an issue parsing font names not surrounded by quotes. - Fixed the reported span for `Expression` nodes. - Fixed a regression parsing declaration values containing spaces. - Add support for `lh` and `rlh` units. diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index f190a071a..15dd764cb 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2228,10 +2228,54 @@ class _Parser { dynamic /* Expression | List | ... */ processTerm( [bool ieFilter = false]) { var start = _peekToken.span; - Token? t; // token for term's value - dynamic value; // value of term (numeric values) - var unary = ''; + + dynamic processIdentifier() { + var nameValue = identifier(); // Snarf up the ident we'll remap, maybe. + + if (!ieFilter && _maybeEat(TokenKind.LPAREN)) { + var calc = processCalc(nameValue); + if (calc != null) return calc; + // FUNCTION + return processFunction(nameValue); + } + if (ieFilter) { + if (_maybeEat(TokenKind.COLON) && + nameValue.name.toLowerCase() == 'progid') { + // IE filter:progid: + return processIEFilter(start); + } else { + // Handle filter: where name is any filter e.g., alpha, + // chroma, Wave, blur, etc. + return processIEFilter(start); + } + } + + // TODO(terry): Need to have a list of known identifiers today only + // 'from' is special. + if (nameValue.name == 'from') { + return LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); + } + + // What kind of identifier is it, named color? + var colorEntry = TokenKind.matchColorName(nameValue.name); + if (colorEntry == null) { + if (isChecked) { + var propName = nameValue.name; + var errMsg = TokenKind.isPredefinedName(propName) + ? 'Improper use of property value $propName' + : 'Unknown property value $propName'; + _warning(errMsg, _makeSpan(start)); + } + return LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); + } + + // Yes, process the color as an RGB value. + var rgbColor = + TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6); + return _parseHex(rgbColor, _makeSpan(start)); + } + switch (_peek()) { case TokenKind.HASH: _eat(TokenKind.HASH); @@ -2261,20 +2305,20 @@ class _Parser { return _parseHex( ' ${(processTerm() as LiteralTerm).text}', _makeSpan(start)); case TokenKind.INTEGER: - t = _next(); - value = int.parse('$unary${t.text}'); - break; + var t = _next(); + var value = int.parse('$unary${t.text}'); + return processDimension(t, value, _makeSpan(start)); case TokenKind.DOUBLE: - t = _next(); - value = double.parse('$unary${t.text}'); - break; + var t = _next(); + var value = double.parse('$unary${t.text}'); + return processDimension(t, value, _makeSpan(start)); case TokenKind.SINGLE_QUOTE: - value = processQuotedString(false); - value = "'${_escapeString(value as String, single: true)}'"; + var value = processQuotedString(false); + value = "'${_escapeString(value, single: true)}'"; return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.DOUBLE_QUOTE: - value = processQuotedString(false); - value = '"${_escapeString(value as String)}"'; + var value = processQuotedString(false); + value = '"${_escapeString(value)}"'; return LiteralTerm(value, value, _makeSpan(start)); case TokenKind.LPAREN: _next(); @@ -2304,49 +2348,7 @@ class _Parser { return ItemTerm(term.value, term.text, _makeSpan(start)); case TokenKind.IDENTIFIER: - var nameValue = identifier(); // Snarf up the ident we'll remap, maybe. - - if (!ieFilter && _maybeEat(TokenKind.LPAREN)) { - var calc = processCalc(nameValue); - if (calc != null) return calc; - // FUNCTION - return processFunction(nameValue); - } - if (ieFilter) { - if (_maybeEat(TokenKind.COLON) && - nameValue.name.toLowerCase() == 'progid') { - // IE filter:progid: - return processIEFilter(start); - } else { - // Handle filter: where name is any filter e.g., alpha, - // chroma, Wave, blur, etc. - return processIEFilter(start); - } - } - - // TODO(terry): Need to have a list of known identifiers today only - // 'from' is special. - if (nameValue.name == 'from') { - return LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); - } - - // What kind of identifier is it, named color? - var colorEntry = TokenKind.matchColorName(nameValue.name); - if (colorEntry == null) { - if (isChecked) { - var propName = nameValue.name; - var errMsg = TokenKind.isPredefinedName(propName) - ? 'Improper use of property value $propName' - : 'Unknown property value $propName'; - _warning(errMsg, _makeSpan(start)); - } - return LiteralTerm(nameValue, nameValue.name, _makeSpan(start)); - } - - // Yes, process the color as an RGB value. - var rgbColor = - TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6); - return _parseHex(rgbColor, _makeSpan(start)); + return processIdentifier(); case TokenKind.UNICODE_RANGE: String? first; String? second; @@ -2394,11 +2396,15 @@ class _Parser { return expr.expressions; } break; + default: + // For tokens that we don't match above, but that are identifier like + // ('PT', 'PX', ...) handle them like identifiers. + if (TokenKind.isKindIdentifier(_peek())) { + return processIdentifier(); + } else { + return null; + } } - - return t != null - ? processDimension(t, value as Object, _makeSpan(start)) - : null; } /// Process all dimension units. diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index 4aa4b905c..cf97c2250 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -43,6 +43,16 @@ class Message { Message(this.level, this.message, {this.span, this.useColors = false}); + String get describe { + var span = this.span; + if (span == null) { + return message; + } + + var start = span.start; + return '${start.line + 1}:${start.column + 1}:$message'; + } + @override String toString() { var output = StringBuffer(); diff --git a/pkgs/csslib/lib/src/token.dart b/pkgs/csslib/lib/src/token.dart index 8bd9ca164..5a0753551 100644 --- a/pkgs/csslib/lib/src/token.dart +++ b/pkgs/csslib/lib/src/token.dart @@ -28,7 +28,7 @@ class Token { String toString() { var kindText = TokenKind.kindToString(kind); var actualText = text.trim(); - if (kindText != actualText) { + if (actualText.isNotEmpty && kindText != actualText) { if (actualText.length > 10) { actualText = '${actualText.substring(0, 8)}...'; } diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index c13198c3c..b65437973 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -192,6 +192,7 @@ class TokenKind { static const int MARGIN_DIRECTIVE_RIGHTBOTTOM = 685; // Simple selector type. + // TODO: These are unused and should be removed in a future version. static const int CLASS_NAME = 700; // .class static const int ELEMENT_NAME = 701; // tagName static const int HASH_NAME = 702; // #elementId diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 356963f07..8c79b1b4f 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -4,6 +4,9 @@ part of '../parser.dart'; +// TODO: We should update the tokenization to follow what's described in the +// spec: https://www.w3.org/TR/css-syntax-3/#tokenization. + class Tokenizer extends TokenizerBase { /// U+ prefix for unicode characters. // ignore: non_constant_identifier_names diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 0a1b91c5c..e9aaf99f5 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -771,6 +771,65 @@ src: url(ideal-sans-serif.woff) format("woff"), expect(prettyPrint(stylesheet), generated4); } +void testFontFamily() { + test('quoted', () { + var errors = []; + var stylesheet = parseCss(''' +body { + font-family: "Arial Narrow"; +}''', errors: errors..clear(), opts: simpleOptions); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), ''' +body { + font-family: "Arial Narrow"; +}'''); + var ruleSet = stylesheet.topLevels.first as RuleSet; + var declaration = + ruleSet.declarationGroup.declarations.first as Declaration; + var expressions = declaration.expression as Expressions; + expect(declaration.property, 'font-family'); + expect(printExpressions(expressions), '"Arial Narrow"'); + }); + + test('without quotes', () { + var errors = []; + var stylesheet = parseCss(''' +body { + font-family: Arial Narrow; +}''', errors: errors..clear(), opts: simpleOptions); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), ''' +body { + font-family: Arial Narrow; +}'''); + var ruleSet = stylesheet.topLevels.first as RuleSet; + var declaration = + ruleSet.declarationGroup.declarations.first as Declaration; + var expressions = declaration.expression as Expressions; + expect(declaration.property, 'font-family'); + expect(printExpressions(expressions), 'Arial Narrow'); + }); + + test('starts with identifier', () { + var errors = []; + var stylesheet = parseCss(''' +body { + font-family: PT Sans; +}''', errors: errors..clear(), opts: simpleOptions); + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), ''' +body { + font-family: PT Sans; +}'''); + var ruleSet = stylesheet.topLevels.first as RuleSet; + var declaration = + ruleSet.declarationGroup.declarations.first as Declaration; + var expressions = declaration.expression as Expressions; + expect(declaration.property, 'font-family'); + expect(printExpressions(expressions), 'PT Sans'); + }); +} + void testCssFile() { var errors = []; final input = r''' @@ -1392,6 +1451,7 @@ void main() { test('Supports', testSupports); test('Viewport', testViewport); test('Font-Face', testFontFace); + group('font-family', testFontFamily); test('CSS file', testCssFile); test('Compact Emitter', testCompactEmitter); test('Selector Negation', testNotSelectors); diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index a60674adb..205a697dc 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -603,32 +603,11 @@ foo { compileCss(input, errors: errors, opts: options); - expect(errors.isNotEmpty, true); - expect(errors.length, 6, reason: errors.toString()); - var error = errors[0]; - expect(error.message, 'parsing error expected ;'); - expect(error.span!.start.line, 6); - expect(error.span!.end.offset, 69); - error = errors[1]; - expect(error.message, 'expected :, but found }'); - expect(error.span!.start.line, 7); - expect(error.span!.end.offset, 73); - error = errors[2]; - expect(error.message, 'parsing error expected }'); - expect(error.span!.start.line, 9); - expect(error.span!.end.offset, 83); - error = errors[3]; - expect(error.message, 'expected {, but found end of file()'); - expect(error.span!.start.line, 9); - expect(error.span!.end.offset, 86); - error = errors[4]; - expect(error.message, 'expected }, but found end of file()'); - expect(error.span!.start.line, 10); - expect(error.span!.end.offset, 86); - error = errors[5]; - expect(error.message, 'Using top-level mixin a as a declaration'); - expect(error.span!.start.line, 5); - expect(error.span!.end.offset, 56); + expect(errors, hasLength(4)); + expect(errors[0].describe, '7:4:parsing error expected ;'); + expect(errors[1].describe, '8:1:expected :, but found }'); + expect(errors[2].describe, '10:11:expected }, but found end of file'); + expect(errors[3].describe, '6:4:Using top-level mixin a as a declaration'); } void main() { diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 00e6ce755..15421bf92 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -66,6 +66,13 @@ String compactOutput(StyleSheet ss) { return (CssPrinter()..visitTree(ss, pretty: false)).toString(); } +String printExpressions(Expressions node) { + var printer = CssPrinter(); + // TODO: It would be nice if TreeNode had an `accept` method. + printer.visitExpressions(node); + return printer.toString(); +} + /// Walks the style sheet tree does nothing; insures the basic walker works. void walkTree(StyleSheet ss) { Visitor().visitTree(ss); From 6925c0d3a1acbbbf6b5e3626a604e6d1b8f087b0 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 10 May 2023 09:51:22 -0700 Subject: [PATCH 217/245] Require Dart 2.19, latest lints, skin hanging test (dart-lang/csslib#175) ...instead of ignoring it Also some tiny spelling fixes Co-authored-by: Devon Carew --- pkgs/csslib/.github/workflows/test-package.yml | 2 +- pkgs/csslib/CHANGELOG.md | 3 ++- pkgs/csslib/lib/src/analyzer.dart | 4 ++-- pkgs/csslib/lib/src/tokenizer.dart | 2 +- pkgs/csslib/lib/src/tree_printer.dart | 2 +- pkgs/csslib/pubspec.yaml | 4 ++-- pkgs/csslib/test/big_1_test.dart | 2 -- pkgs/csslib/test/compiler_test.dart | 2 -- pkgs/csslib/test/debug_test.dart | 5 ++--- pkgs/csslib/test/declaration_test.dart | 2 -- pkgs/csslib/test/error_test.dart | 4 +--- pkgs/csslib/test/extend_test.dart | 2 -- pkgs/csslib/test/mixin_test.dart | 3 +-- pkgs/csslib/test/nested_test.dart | 2 -- pkgs/csslib/test/selector_test.dart | 2 -- pkgs/csslib/test/var_test.dart | 2 -- pkgs/csslib/test/visitor_test.dart | 2 -- 17 files changed, 13 insertions(+), 32 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 1570da21f..0876c22dd 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -47,7 +47,7 @@ jobs: matrix: # Add macos-latest and/or windows-latest if relevant for this package. os: [ubuntu-latest, windows-latest] - sdk: [2.17.0, dev] + sdk: [2.19.0, dev] steps: - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 014438254..bcdd3d216 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -8,6 +8,7 @@ - Add support for `lh` and `rlh` units. - Refactor the package example. - Addressed an issue with the indent level of the `CssPrinter` output. +- Require Dart 2.19. ## 0.17.2 @@ -188,7 +189,7 @@ ## 0.12.0+1 -* Allow the lastest version of `logging` package. +* Allow the latest version of `logging` package. ## 0.12.0 diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index 2c4efa975..c8399770c 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -584,8 +584,8 @@ class CallMixin extends Visitor { } } - /// Given a mixin's defined arguments return a cloned mixin defintion that has - /// replaced all defined arguments with user's supplied VarUsages. + /// Given a mixin's defined arguments return a cloned mixin definition that + /// has replaced all defined arguments with user's supplied VarUsages. MixinDefinition transform(List> callArgs) { // TODO(terry): Handle default arguments and varArgs. // Transform mixin with callArgs. diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 8c79b1b4f..15f5ad013 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -75,7 +75,7 @@ class Tokenizer extends TokenizerBase { // looks like a number dot followed by digit(s). var number = finishNumber(); if (number.kind == TokenKind.INTEGER) { - // It's a number but it's preceeded by a dot, so make it a double. + // It's a number but it's preceded by a dot, so make it a double. _startIndex = start; return _finishToken(TokenKind.DOUBLE); } else { diff --git a/pkgs/csslib/lib/src/tree_printer.dart b/pkgs/csslib/lib/src/tree_printer.dart index 4b6fbf83d..2e11e9e04 100644 --- a/pkgs/csslib/lib/src/tree_printer.dart +++ b/pkgs/csslib/lib/src/tree_printer.dart @@ -322,7 +322,7 @@ class _TreePrinter extends Visitor { void visitVarDefinition(VarDefinition node) { heading('Var', node); output.depth++; - output.write('defintion'); + output.write('definition'); super.visitVarDefinition(node); output.writeNode('expression', node.expression); output.depth--; diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index f0ef37238..b3ab1f86c 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -4,13 +4,13 @@ description: A library for parsing and analyzing CSS (Cascading Style Sheets) repository: https://github.com/dart-lang/csslib environment: - sdk: '>=2.17.0 <3.0.0' + sdk: '>=2.19.0 <3.0.0' dependencies: source_span: ^1.8.0 dev_dependencies: - dart_flutter_team_lints: ^0.1.0 + dart_flutter_team_lints: ^1.0.0 path: ^1.8.0 term_glyph: ^1.2.0 test: ^1.16.0 diff --git a/pkgs/csslib/test/big_1_test.dart b/pkgs/csslib/test/big_1_test.dart index fdcc988b9..6db79800d 100644 --- a/pkgs/csslib/test/big_1_test.dart +++ b/pkgs/csslib/test/big_1_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library big_1_test; - import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index 287904060..f43c1ea2b 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library compiler_test; - import 'dart:convert'; import 'package:csslib/parser.dart'; diff --git a/pkgs/csslib/test/debug_test.dart b/pkgs/csslib/test/debug_test.dart index 05e9b005d..878493b05 100644 --- a/pkgs/csslib/test/debug_test.dart +++ b/pkgs/csslib/test/debug_test.dart @@ -2,13 +2,12 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library debug; - import 'package:test/test.dart'; + import 'testing.dart'; void main() { - test('excercise debug', () { + test('exercise debug', () { var style = parseCss(_input); var debugValue = style.toDebugString(); diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index e9aaf99f5..499c8cd33 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -4,8 +4,6 @@ // ignore_for_file: lines_longer_than_80_chars -library declaration_test; - import 'package:csslib/src/messages.dart'; import 'package:csslib/visitor.dart'; import 'package:test/test.dart'; diff --git a/pkgs/csslib/test/error_test.dart b/pkgs/csslib/test/error_test.dart index fb8ff573a..030fc2429 100644 --- a/pkgs/csslib/test/error_test.dart +++ b/pkgs/csslib/test/error_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library error_test; - import 'package:csslib/src/messages.dart'; import 'package:term_glyph/term_glyph.dart' as glyph; import 'package:test/test.dart'; @@ -72,7 +70,7 @@ error on line 1, column 24: Unknown property value inherit void testUnsupportedLineHeights() { var errors = []; - // line-height value in percentge unit. + // line-height value in percentage unit. var input = '.foobar { line-height: 120%; }'; var stylesheet = parseCss(input, errors: errors); diff --git a/pkgs/csslib/test/extend_test.dart b/pkgs/csslib/test/extend_test.dart index 37b433ab7..0990490f7 100644 --- a/pkgs/csslib/test/extend_test.dart +++ b/pkgs/csslib/test/extend_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library extend_test; - import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; diff --git a/pkgs/csslib/test/mixin_test.dart b/pkgs/csslib/test/mixin_test.dart index 205a697dc..684f914ef 100644 --- a/pkgs/csslib/test/mixin_test.dart +++ b/pkgs/csslib/test/mixin_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library mixin_test; - import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; @@ -633,6 +631,7 @@ void main() { group('Mixin arguments', () { test('simple arg', mixinArg); + test('many args', mixinArgs, skip: 'hangs at runtime'); test('multiple args and var decls as args', mixinManyArgs); }); diff --git a/pkgs/csslib/test/nested_test.dart b/pkgs/csslib/test/nested_test.dart index a5798680d..4ec72ea08 100644 --- a/pkgs/csslib/test/nested_test.dart +++ b/pkgs/csslib/test/nested_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library nested_test; - import 'package:csslib/src/messages.dart'; import 'package:test/test.dart'; diff --git a/pkgs/csslib/test/selector_test.dart b/pkgs/csslib/test/selector_test.dart index ae4dbbd30..6d63cf83f 100644 --- a/pkgs/csslib/test/selector_test.dart +++ b/pkgs/csslib/test/selector_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library selector_test; - import 'package:csslib/parser.dart'; import 'package:term_glyph/term_glyph.dart' as glyph; import 'package:test/test.dart'; diff --git a/pkgs/csslib/test/var_test.dart b/pkgs/csslib/test/var_test.dart index 482fda9a9..b3b09333e 100644 --- a/pkgs/csslib/test/var_test.dart +++ b/pkgs/csslib/test/var_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library var_test; - import 'package:csslib/src/messages.dart'; import 'package:term_glyph/term_glyph.dart' as glyph; import 'package:test/test.dart'; diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index a70f91fb0..851f40779 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library visitor_test; - import 'package:csslib/src/messages.dart'; import 'package:csslib/visitor.dart'; import 'package:test/test.dart'; From 220c873da65c125e175e293032e10c1e1e4b9842 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Wed, 10 May 2023 09:59:38 -0700 Subject: [PATCH 218/245] rev for publishing (dart-lang/csslib#179) --- pkgs/csslib/CHANGELOG.md | 2 +- pkgs/csslib/pubspec.yaml | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index bcdd3d216..8e38f272b 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.17.3-dev +## 0.17.3 - Add markdown badges to the readme. - Adopted `package:dart_flutter_team_lints` linting rules. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index b3ab1f86c..877224671 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,10 +1,13 @@ name: csslib -version: 0.17.3-dev -description: A library for parsing and analyzing CSS (Cascading Style Sheets) +version: 0.17.3 +description: A library for parsing and analyzing CSS (Cascading Style Sheets). repository: https://github.com/dart-lang/csslib +topics: + - css + environment: - sdk: '>=2.19.0 <3.0.0' + sdk: '>=2.19.0 <4.0.0' dependencies: source_span: ^1.8.0 From 785c5c9df9ffe5d13403c8ce6bf513921fd15825 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Thu, 11 May 2023 12:47:38 -0700 Subject: [PATCH 219/245] Simplify TopLevelIncludes visitor (dart-lang/csslib#180) This is a static method on a private class so there is no usage outside the library and it is safe to refactor. The returned `bool` was not read, and the `messages` argument was unused. Remove both to simplify `replace()` implementation. --- pkgs/csslib/lib/src/analyzer.dart | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/pkgs/csslib/lib/src/analyzer.dart b/pkgs/csslib/lib/src/analyzer.dart index c8399770c..9d6f4ff5e 100644 --- a/pkgs/csslib/lib/src/analyzer.dart +++ b/pkgs/csslib/lib/src/analyzer.dart @@ -456,8 +456,7 @@ class TopLevelIncludes extends Visitor { if (map.containsKey(node.name)) { var mixinDef = map[node.name]; if (mixinDef is MixinRulesetDirective) { - _TopLevelIncludeReplacer.replace( - _messages, _styleSheet!, node, mixinDef.rulesets); + _TopLevelIncludeReplacer.replace(_styleSheet!, node, mixinDef.rulesets); } else if (currDef is MixinRulesetDirective && _anyRulesets(currDef)) { final mixinRuleset = currDef; var index = mixinRuleset.rulesets.indexOf(node); @@ -508,16 +507,13 @@ class TopLevelIncludes extends Visitor { class _TopLevelIncludeReplacer extends Visitor { final IncludeDirective _include; final List _newRules; - bool _foundAndReplaced = false; /// Look for the [ruleSet] inside of an @media directive; if found then /// replace with the [newRules]. If [ruleSet] is found and replaced return /// true. - static bool replace(Messages messages, StyleSheet styleSheet, - IncludeDirective include, List newRules) { - var visitor = _TopLevelIncludeReplacer(include, newRules); - visitor.visitStyleSheet(styleSheet); - return visitor._foundAndReplaced; + static void replace(StyleSheet styleSheet, IncludeDirective include, + List newRules) { + _TopLevelIncludeReplacer(include, newRules).visitStyleSheet(styleSheet); } _TopLevelIncludeReplacer(this._include, this._newRules); @@ -528,7 +524,6 @@ class _TopLevelIncludeReplacer extends Visitor { if (index != -1) { node.topLevels.insertAll(index + 1, _newRules); node.topLevels.replaceRange(index, index + 1, [NoOp()]); - _foundAndReplaced = true; } super.visitStyleSheet(node); } @@ -540,7 +535,6 @@ class _TopLevelIncludeReplacer extends Visitor { node.rulesets.insertAll(index + 1, _newRules); // Only the resolve the @include once. node.rulesets.replaceRange(index, index + 1, [NoOp()]); - _foundAndReplaced = true; } super.visitMixinRulesetDirective(node); } From 2099a15dc8103df05d8e2c109b88ca3614837125 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Mon, 15 May 2023 14:34:12 -0700 Subject: [PATCH 220/245] blast_repo fixes (dart-lang/csslib#181) dependabot --- pkgs/csslib/.github/dependabot.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkgs/csslib/.github/dependabot.yml b/pkgs/csslib/.github/dependabot.yml index 1603cdd9e..725f03af2 100644 --- a/pkgs/csslib/.github/dependabot.yml +++ b/pkgs/csslib/.github/dependabot.yml @@ -3,7 +3,9 @@ version: 2 updates: - - package-ecosystem: "github-actions" - directory: "/" + - package-ecosystem: github-actions + directory: / schedule: - interval: "monthly" + interval: monthly + labels: + - autosubmit From 81d3836913c823f9647ed7fab846943b8720b49c Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Thu, 18 May 2023 11:31:55 -0700 Subject: [PATCH 221/245] address a regression in the compact output format (dart-lang/csslib#183) --- pkgs/csslib/lib/src/css_printer.dart | 3 --- pkgs/csslib/test/declaration_test.dart | 9 +-------- pkgs/csslib/test/visitor_test.dart | 8 ++------ 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/pkgs/csslib/lib/src/css_printer.dart b/pkgs/csslib/lib/src/css_printer.dart index e0507d1ca..463c855aa 100644 --- a/pkgs/csslib/lib/src/css_printer.dart +++ b/pkgs/csslib/lib/src/css_printer.dart @@ -56,9 +56,6 @@ class CssPrinter extends Visitor { _startOfLine = true; } else { _buff.write('}'); - if (_indent == 0) { - _buff.writeln(); - } } } diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 499c8cd33..5dc24f613 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -933,14 +933,7 @@ div { } '''; final generated = ''' -div{color:green!important;background:red blue green} -.foo p[bar]{color:blue} -@page{@top-left{color:red}} -@page:first{} -@page foo:first{} -@media screen AND (max-width:800px){div{font-size:24px}} -@keyframes foo{0%{transform:scaleX(0)}} -div{color:rgba(0,0,0,0.2)}'''; +div{color:green!important;background:red blue green}.foo p[bar]{color:blue}@page{@top-left{color:red}}@page:first{}@page foo:first{}@media screen AND (max-width:800px){div{font-size:24px}}@keyframes foo{0%{transform:scaleX(0)}}div{color:rgba(0,0,0,0.2)}'''; var stylesheet = parseCss(input, errors: errors); diff --git a/pkgs/csslib/test/visitor_test.dart b/pkgs/csslib/test/visitor_test.dart index 851f40779..54429034b 100644 --- a/pkgs/csslib/test/visitor_test.dart +++ b/pkgs/csslib/test/visitor_test.dart @@ -112,9 +112,7 @@ void main() { void testPrettyPrint() { final input = ''' -.good { color: red; } -@media screen { .better { color: blue; } } -.best { color: green }'''; +.good { color: red; }@media screen { .better { color: blue; } }.best { color: green }'''; var styleSheet = parseCss(input); @@ -134,7 +132,5 @@ void testPrettyPrint() { // compact output expect(compactOutput(styleSheet), ''' -.good{color:red} -@media screen{.better{color:blue}} -.best{color:green}'''); +.good{color:red}@media screen{.better{color:blue}}.best{color:green}'''); } From 055661a8c171d38918a59a3a4cf408a8237786f0 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 6 Jun 2023 14:31:27 -0700 Subject: [PATCH 222/245] rev to 1.0.0 (dart-lang/csslib#185) --- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 8e38f272b..70e7747f2 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.0 + +- Rev to `1.0.0` (note however that there are no API changes from `0.17.x`). + ## 0.17.3 - Add markdown badges to the readme. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 877224671..e0eab9a0f 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 0.17.3 +version: 1.0.0 description: A library for parsing and analyzing CSS (Cascading Style Sheets). repository: https://github.com/dart-lang/csslib From 20ce74bf6d69fb91d941163dffbfcbfdfdc20be0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Jul 2023 04:16:12 +0000 Subject: [PATCH 223/245] Bump actions/checkout from 3.5.2 to 3.5.3 (dart-lang/csslib#187) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 3.5.2 to 3.5.3.
Release notes

Sourced from actions/checkout's releases.

v3.5.3

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v3...v3.5.3

Changelog

Sourced from actions/checkout's changelog.

Changelog

v3.5.3

v3.5.2

v3.5.1

v3.5.0

v3.4.0

v3.3.0

v3.2.0

v3.1.0

v3.0.2

v3.0.1

v3.0.0

v2.3.1

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=3.5.2&new-version=3.5.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 0876c22dd..2234ba906 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [2.19.0, dev] steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} From 3e1695541a20bc32a02dee6efd4d3ea7940229c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 04:51:19 +0000 Subject: [PATCH 224/245] Bump actions/checkout from 3.5.3 to 3.6.0 (dart-lang/csslib#188) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 3.5.3 to 3.6.0.
Release notes

Sourced from actions/checkout's releases.

v3.6.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v3.5.3...v3.6.0

Changelog

Sourced from actions/checkout's changelog.

Changelog

v3.6.0

v3.5.3

v3.5.2

v3.5.1

v3.5.0

v3.4.0

v3.3.0

v3.2.0

v3.1.0

v3.0.2

v3.0.1

v3.0.0

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=3.5.3&new-version=3.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 2234ba906..24f05dff8 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [2.19.0, dev] steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} From 583c0ea2a44a05f203fd0897f467c43e80e9284f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Oct 2023 04:12:22 +0000 Subject: [PATCH 225/245] Bump dart-lang/setup-dart from 1.5.0 to 1.5.1 (dart-lang/csslib#189) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.5.0 to 1.5.1.
Release notes

Sourced from dart-lang/setup-dart's releases.

v1.5.1

  • No longer test the setup-dart action on pre-2.12 SDKs.
  • Upgrade JS interop code to use extension types (the new name for inline classes).
  • The upcoming rename of the be channel to main is now supported with forward compatibility that switches when the rename happens.
Changelog

Sourced from dart-lang/setup-dart's changelog.

v1.6.0

  • Enable provisioning of the latest Dart SDK patch release by specifying just the major and minor version (e.g. 3.2).

v1.5.1

  • No longer test the setup-dart action on pre-2.12 SDKs.
  • Upgrade JS interop code to use extension types (the new name for inline classes).
  • The upcoming rename of the be channel to main is now supported with forward compatibility that switches when the rename happens.

v1.5.0

  • Re-wrote the implementation of the action into Dart.
  • Auto-detect the platform architecture (x64, ia32, arm, arm64).
  • Improved the caching and download resilience of the sdk.
  • Added a new action output: dart-version - the installed version of the sdk.

v1.4.0

  • Automatically create OIDC token for pub.dev.
  • Add a reusable workflow for publishing.

v1.3.0

  • The install location of the Dart SDK is now available in an environment variable, DART_HOME (dart-lang/csslib#43).
  • Fixed an issue where cached downloads could lead to unzip issues on self-hosted runners (dart-lang/csslib#35).

v1.2.0

  • Fixed a path issue impacting git dependencies on Windows.

v1.1.0

  • Added a flavor option setup.sh to allow downloading unpublished builds.

v1.0.0

  • Promoted to 1.0 stable.

v0.5

  • Fixed a Windows pub global activate path issue.

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dart-lang/setup-dart&package-manager=github_actions&previous-version=1.5.0&new-version=1.5.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 24f05dff8..97bb7f56f 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -23,7 +23,7 @@ jobs: sdk: [dev] steps: - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 - - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f + - uses: dart-lang/setup-dart@8a4b97ea2017cc079571daec46542f76189836b1 with: sdk: ${{ matrix.sdk }} - id: install @@ -50,7 +50,7 @@ jobs: sdk: [2.19.0, dev] steps: - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 - - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f + - uses: dart-lang/setup-dart@8a4b97ea2017cc079571daec46542f76189836b1 with: sdk: ${{ matrix.sdk }} - id: install From 189c933d98ed75bbaa5dee9cccb8433790c33b80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Oct 2023 04:16:21 +0000 Subject: [PATCH 226/245] Bump actions/checkout from 3.6.0 to 4.1.0 (dart-lang/csslib#190) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 3.6.0 to 4.1.0.
Release notes

Sourced from actions/checkout's releases.

v4.1.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4.0.0...v4.1.0

v4.0.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v3...v4.0.0

Changelog

Sourced from actions/checkout's changelog.

Changelog

v4.1.0

v4.0.0

v3.6.0

v3.5.3

v3.5.2

v3.5.1

v3.5.0

v3.4.0

v3.3.0

v3.2.0

v3.1.0

v3.0.2

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=3.6.0&new-version=4.1.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 97bb7f56f..146229bcf 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - uses: dart-lang/setup-dart@8a4b97ea2017cc079571daec46542f76189836b1 with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [2.19.0, dev] steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - uses: dart-lang/setup-dart@8a4b97ea2017cc079571daec46542f76189836b1 with: sdk: ${{ matrix.sdk }} From 03fb1644bb09849e3d839fef28f44d14a4c3b57e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 04:43:19 +0000 Subject: [PATCH 227/245] Bump actions/checkout from 4.1.0 to 4.1.1 (dart-lang/csslib#192) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.0 to 4.1.1.
Release notes

Sourced from actions/checkout's releases.

v4.1.1

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4.1.0...v4.1.1

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4.1.0&new-version=4.1.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 146229bcf..d8ece2aca 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - uses: dart-lang/setup-dart@8a4b97ea2017cc079571daec46542f76189836b1 with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [2.19.0, dev] steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - uses: dart-lang/setup-dart@8a4b97ea2017cc079571daec46542f76189836b1 with: sdk: ${{ matrix.sdk }} From 9a79891bc0a7b8868ca62b696a6493e6c3f1b776 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 15:51:39 +0000 Subject: [PATCH 228/245] Bump dart-lang/setup-dart from 1.5.1 to 1.6.0 (dart-lang/csslib#191) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.5.1 to 1.6.0.
Release notes

Sourced from dart-lang/setup-dart's releases.

v1.6.0

  • Enable provisioning of the latest Dart SDK patch release by specifying just the major and minor version (e.g. 3.2).
Changelog

Sourced from dart-lang/setup-dart's changelog.

v1.6.0

  • Enable provisioning of the latest Dart SDK patch release by specifying just the major and minor version (e.g. 3.2).

v1.5.1

  • No longer test the setup-dart action on pre-2.12 SDKs.
  • Upgrade JS interop code to use extension types (the new name for inline classes).
  • The upcoming rename of the be channel to main is now supported with forward compatibility that switches when the rename happens.

v1.5.0

  • Re-wrote the implementation of the action into Dart.
  • Auto-detect the platform architecture (x64, ia32, arm, arm64).
  • Improved the caching and download resilience of the sdk.
  • Added a new action output: dart-version - the installed version of the sdk.

v1.4.0

  • Automatically create OIDC token for pub.dev.
  • Add a reusable workflow for publishing.

v1.3.0

  • The install location of the Dart SDK is now available in an environment variable, DART_HOME (dart-lang/csslib#43).
  • Fixed an issue where cached downloads could lead to unzip issues on self-hosted runners (dart-lang/csslib#35).

v1.2.0

  • Fixed a path issue impacting git dependencies on Windows.

v1.1.0

  • Added a flavor option setup.sh to allow downloading unpublished builds.

v1.0.0

  • Promoted to 1.0 stable.

v0.5

  • Fixed a Windows pub global activate path issue.

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dart-lang/setup-dart&package-manager=github_actions&previous-version=1.5.1&new-version=1.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index d8ece2aca..2030e2e08 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -23,7 +23,7 @@ jobs: sdk: [dev] steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - - uses: dart-lang/setup-dart@8a4b97ea2017cc079571daec46542f76189836b1 + - uses: dart-lang/setup-dart@b64355ae6ca0b5d484f0106a033dd1388965d06d with: sdk: ${{ matrix.sdk }} - id: install @@ -50,7 +50,7 @@ jobs: sdk: [2.19.0, dev] steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - - uses: dart-lang/setup-dart@8a4b97ea2017cc079571daec46542f76189836b1 + - uses: dart-lang/setup-dart@b64355ae6ca0b5d484f0106a033dd1388965d06d with: sdk: ${{ matrix.sdk }} - id: install From a4ea4529b0d2a6fd7ba14b87c9ec0ccd863faf39 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 18 Dec 2023 16:37:53 -0800 Subject: [PATCH 229/245] blast_repo fixes (dart-lang/csslib#193) auto-publish, no-response --- pkgs/csslib/.github/workflows/no-response.yml | 37 +++++++++++++++++++ pkgs/csslib/.github/workflows/publish.yaml | 17 +++++++++ 2 files changed, 54 insertions(+) create mode 100644 pkgs/csslib/.github/workflows/no-response.yml create mode 100644 pkgs/csslib/.github/workflows/publish.yaml diff --git a/pkgs/csslib/.github/workflows/no-response.yml b/pkgs/csslib/.github/workflows/no-response.yml new file mode 100644 index 000000000..8e5ed57cd --- /dev/null +++ b/pkgs/csslib/.github/workflows/no-response.yml @@ -0,0 +1,37 @@ +# A workflow to close issues where the author hasn't responded to a request for +# more information; see https://github.com/actions/stale. + +name: No Response + +# Run as a daily cron. +on: + schedule: + # Every day at 8am + - cron: '0 8 * * *' + +# All permissions not specified are set to 'none'. +permissions: + issues: write + pull-requests: write + +jobs: + no-response: + runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'dart-lang' }} + steps: + - uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 + with: + # Don't automatically mark inactive issues+PRs as stale. + days-before-stale: -1 + # Close needs-info issues and PRs after 14 days of inactivity. + days-before-close: 14 + stale-issue-label: "needs-info" + close-issue-message: > + Without additional information we're not able to resolve this issue. + Feel free to add more info or respond to any questions above and we + can reopen the case. Thanks for your contribution! + stale-pr-label: "needs-info" + close-pr-message: > + Without additional information we're not able to resolve this PR. + Feel free to add more info or respond to any questions above. + Thanks for your contribution! diff --git a/pkgs/csslib/.github/workflows/publish.yaml b/pkgs/csslib/.github/workflows/publish.yaml new file mode 100644 index 000000000..1cb7e9cfb --- /dev/null +++ b/pkgs/csslib/.github/workflows/publish.yaml @@ -0,0 +1,17 @@ +# A CI configuration to auto-publish pub packages. + +name: Publish + +on: + pull_request: + branches: [ main ] + push: + tags: [ 'v[0-9]+.[0-9]+.[0-9]+' ] + +jobs: + publish: + if: ${{ github.repository_owner == 'dart-lang' }} + uses: dart-lang/ecosystem/.github/workflows/publish.yaml@main + permissions: + id-token: write # Required for authentication using OIDC + pull-requests: write # Required for writing the pull request note From 8d5a4ef5fb4529d704c246c7ee406cd10c09b403 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 04:17:04 +0000 Subject: [PATCH 230/245] Bump actions/stale from 8.0.0 to 9.0.0 (dart-lang/csslib#195) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/stale](https://github.com/actions/stale) from 8.0.0 to 9.0.0.
Release notes

Sourced from actions/stale's releases.

v9.0.0

Breaking Changes

  1. Action is now stateful: If the action ends because of operations-per-run then the next run will start from the first unprocessed issue skipping the issues processed during the previous run(s). The state is reset when all the issues are processed. This should be considered for scheduling workflow runs.
  2. Version 9 of this action updated the runtime to Node.js 20. All scripts are now run with Node.js 20 instead of Node.js 16 and are affected by any breaking changes between Node.js 16 and 20.

What Else Changed

  1. Performance optimization that removes unnecessary API calls by @​dsame dart-lang/csslib#1033 fixes dart-lang/csslib#792
  2. Logs displaying current github API rate limit by @​dsame dart-lang/csslib#1032 addresses dart-lang/csslib#1029

For more information, please read the action documentation and its section about statefulness

New Contributors

Full Changelog: https://github.com/actions/stale/compare/v8...v9.0.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/stale&package-manager=github_actions&previous-version=8.0.0&new-version=9.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/no-response.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/csslib/.github/workflows/no-response.yml b/pkgs/csslib/.github/workflows/no-response.yml index 8e5ed57cd..ab1ac4984 100644 --- a/pkgs/csslib/.github/workflows/no-response.yml +++ b/pkgs/csslib/.github/workflows/no-response.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest if: ${{ github.repository_owner == 'dart-lang' }} steps: - - uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 + - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e with: # Don't automatically mark inactive issues+PRs as stale. days-before-stale: -1 From a668a2a0738921f425d451d5ffc1a0260faa9cbe Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 9 Jan 2024 14:14:10 -0800 Subject: [PATCH 231/245] Require Dart 3.0, update and fix lints (dart-lang/csslib#194) --- .../csslib/.github/workflows/test-package.yml | 2 +- pkgs/csslib/CHANGELOG.md | 4 + pkgs/csslib/analysis_options.yaml | 6 + pkgs/csslib/example/main.dart | 5 +- pkgs/csslib/lib/parser.dart | 78 ++++------ pkgs/csslib/lib/src/messages.dart | 2 +- pkgs/csslib/lib/src/property.dart | 42 +++--- pkgs/csslib/lib/src/token_kind.dart | 142 ++++++------------ pkgs/csslib/lib/src/tokenizer.dart | 77 ++++------ pkgs/csslib/lib/src/tokenizer_base.dart | 10 +- pkgs/csslib/lib/src/tree.dart | 135 ++++++----------- pkgs/csslib/lib/src/validate.dart | 3 +- pkgs/csslib/pubspec.yaml | 6 +- 13 files changed, 202 insertions(+), 310 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 2030e2e08..cbb521374 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -47,7 +47,7 @@ jobs: matrix: # Add macos-latest and/or windows-latest if relevant for this package. os: [ubuntu-latest, windows-latest] - sdk: [2.19.0, dev] + sdk: [3.0, dev] steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - uses: dart-lang/setup-dart@b64355ae6ca0b5d484f0106a033dd1388965d06d diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 70e7747f2..071dad01c 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.1-wip + +- Require Dart 3.0 + ## 1.0.0 - Rev to `1.0.0` (note however that there are no API changes from `0.17.x`). diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index eb67f883b..25e2df48b 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -5,3 +5,9 @@ analyzer: strict-casts: true strict-inference: true strict-raw-types: true + errors: + comment_references: ignore #too many false positives + +linter: + rules: + - prefer_expression_function_bodies diff --git a/pkgs/csslib/example/main.dart b/pkgs/csslib/example/main.dart index 7aad0040f..88dc748f3 100644 --- a/pkgs/csslib/example/main.dart +++ b/pkgs/csslib/example/main.dart @@ -84,9 +84,8 @@ StyleSheet parseCss( String cssInput, { List? errors, css.PreprocessorOptions? opts, -}) { - return css.parse(cssInput, errors: errors, options: opts ?? _default); -} +}) => + css.parse(cssInput, errors: errors, options: opts ?? _default); /// Pretty printer for CSS. String prettyPrint(StyleSheet ss) => diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 15dd764cb..e9780694e 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -38,7 +38,7 @@ class ParserState extends TokenizerState { void _createMessages({List? errors, PreprocessorOptions? options}) { errors ??= []; - options ??= PreprocessorOptions(useColors: false, inputFile: 'memory'); + options ??= const PreprocessorOptions(useColors: false, inputFile: 'memory'); messages = Messages(options: options, printHandler: errors.add); } @@ -258,9 +258,7 @@ class _Parser { /////////////////////////////////////////////////////////////////// // Basic support methods /////////////////////////////////////////////////////////////////// - int _peek() { - return _peekToken.kind; - } + int _peek() => _peekToken.kind; Token _next({bool unicodeRange = false}) { final next = _previousToken = _peekToken; @@ -268,14 +266,10 @@ class _Parser { return next; } - bool _peekKind(int kind) { - return _peekToken.kind == kind; - } + bool _peekKind(int kind) => _peekToken.kind == kind; // Is the next token a legal identifier? This includes pseudo-keywords. - bool _peekIdentifier() { - return TokenKind.isIdentifier(_peekToken.kind); - } + bool _peekIdentifier() => TokenKind.isIdentifier(_peekToken.kind); /// Marks the parser/tokenizer look ahead to support Less nested selectors. ParserState get _mark => ParserState(_peekToken, _previousToken, tokenizer); @@ -792,9 +786,8 @@ class _Parser { } var declGroup = processDeclarations(checkBrace: false); - if (declGroup.declarations.any((decl) { - return decl is Declaration && decl is! IncludeMixinAtDeclaration; - })) { + if (declGroup.declarations.any((decl) => + decl is Declaration && decl is! IncludeMixinAtDeclaration)) { var newDecls = []; for (var include in productions) { // If declGroup has items that are declarations then we assume @@ -2038,40 +2031,31 @@ class _Parser { DartStyleExpression? processOneNumber(Expressions exprs, int part) { var value = marginValue(exprs.expressions[0]); if (value != null) { - switch (part) { - case _marginPartLeft: - return MarginExpression(exprs.span, left: value); - case _marginPartTop: - return MarginExpression(exprs.span, top: value); - case _marginPartRight: - return MarginExpression(exprs.span, right: value); - case _marginPartBottom: - return MarginExpression(exprs.span, bottom: value); - case _borderPartLeft: - case _borderPartLeftWidth: - return BorderExpression(exprs.span, left: value); - case _borderPartTop: - case _borderPartTopWidth: - return BorderExpression(exprs.span, top: value); - case _borderPartRight: - case _borderPartRightWidth: - return BorderExpression(exprs.span, right: value); - case _borderPartBottom: - case _borderPartBottomWidth: - return BorderExpression(exprs.span, bottom: value); - case _heightPart: - return HeightExpression(exprs.span, value); - case _widthPart: - return WidthExpression(exprs.span, value); - case _paddingPartLeft: - return PaddingExpression(exprs.span, left: value); - case _paddingPartTop: - return PaddingExpression(exprs.span, top: value); - case _paddingPartRight: - return PaddingExpression(exprs.span, right: value); - case _paddingPartBottom: - return PaddingExpression(exprs.span, bottom: value); - } + return switch (part) { + _marginPartLeft => MarginExpression(exprs.span, left: value), + _marginPartTop => MarginExpression(exprs.span, top: value), + _marginPartRight => MarginExpression(exprs.span, right: value), + _marginPartBottom => MarginExpression(exprs.span, bottom: value), + _borderPartLeft || + _borderPartLeftWidth => + BorderExpression(exprs.span, left: value), + _borderPartTop || + _borderPartTopWidth => + BorderExpression(exprs.span, top: value), + _borderPartRight || + _borderPartRightWidth => + BorderExpression(exprs.span, right: value), + _borderPartBottom || + _borderPartBottomWidth => + BorderExpression(exprs.span, bottom: value), + _heightPart => HeightExpression(exprs.span, value), + _widthPart => WidthExpression(exprs.span, value), + _paddingPartLeft => PaddingExpression(exprs.span, left: value), + _paddingPartTop => PaddingExpression(exprs.span, top: value), + _paddingPartRight => PaddingExpression(exprs.span, right: value), + _paddingPartBottom => PaddingExpression(exprs.span, bottom: value), + _ => null + }; } return null; } diff --git a/pkgs/csslib/lib/src/messages.dart b/pkgs/csslib/lib/src/messages.dart index cf97c2250..fb1516c1c 100644 --- a/pkgs/csslib/lib/src/messages.dart +++ b/pkgs/csslib/lib/src/messages.dart @@ -86,7 +86,7 @@ class Messages { final List messages = []; Messages({PreprocessorOptions? options, this.printHandler = print}) - : options = options ?? PreprocessorOptions(); + : options = options ?? const PreprocessorOptions(); /// Report a compile-time CSS error. void error(String message, SourceSpan? span) { diff --git a/pkgs/csslib/lib/src/property.dart b/pkgs/csslib/lib/src/property.dart index f884566f0..ec6b85416 100644 --- a/pkgs/csslib/lib/src/property.dart +++ b/pkgs/csslib/lib/src/property.dart @@ -504,14 +504,12 @@ class Rgba implements _StyleProperty, ColorBase { factory Rgba.fromColor(Color color) => color.rgba; - factory Rgba.fromArgbValue(num value) { - return Rgba( - (value.toInt() & 0xff000000) >> 0x18, // a - (value.toInt() & 0xff0000) >> 0x10, // r - (value.toInt() & 0xff00) >> 8, // g - value.toInt() & 0xff, - ); // b - } + factory Rgba.fromArgbValue(num value) => Rgba( + (value.toInt() & 0xff000000) >> 0x18, // a + (value.toInt() & 0xff0000) >> 0x10, // r + (value.toInt() & 0xff00) >> 8, // g + value.toInt() & 0xff, + ); // b factory Rgba.fromHsla(Hsla hsla) { // Convert to Rgba. @@ -752,10 +750,9 @@ class PointXY implements _StyleProperty { const PointXY(this.x, this.y); @override - String? get cssExpression { - // TODO(terry): TBD - return null; - } + String? get cssExpression => + // TODO(terry): TBD + null; } // TODO(terry): Implement style and color. @@ -779,14 +776,12 @@ class Border implements _StyleProperty { int get height => top! + bottom!; @override - String get cssExpression { - return (top == left && bottom == right && top == right) - ? '${left}px' - : "${top != null ? '$top' : '0'}px " - "${right != null ? '$right' : '0'}px " - "${bottom != null ? '$bottom' : '0'}px " - "${left != null ? '$left' : '0'}px"; - } + String get cssExpression => (top == left && bottom == right && top == right) + ? '${left}px' + : "${top != null ? '$top' : '0'}px " + "${right != null ? '$right' : '0'}px " + "${bottom != null ? '$bottom' : '0'}px " + "${left != null ? '$left' : '0'}px"; } /// Font style constants. @@ -1069,10 +1064,9 @@ class Font implements _StyleProperty { } @override - int get hashCode { - // TODO(jimhug): Lot's of potential collisions here. List of fonts, etc. - return size!.toInt() % family![0].hashCode; - } + int get hashCode => + // TODO(jimhug): Lot's of potential collisions here. List of fonts, etc. + size!.toInt() % family![0].hashCode; @override bool operator ==(Object other) { diff --git a/pkgs/csslib/lib/src/token_kind.dart b/pkgs/csslib/lib/src/token_kind.dart index b65437973..3f50402b6 100644 --- a/pkgs/csslib/lib/src/token_kind.dart +++ b/pkgs/csslib/lib/src/token_kind.dart @@ -507,24 +507,20 @@ class TokenKind { } /// Return the token that matches the unit ident found. - static int matchUnits(String text, int offset, int length) { - return matchList(_UNITS, 'unit', text, offset, length); - } + static int matchUnits(String text, int offset, int length) => + matchList(_UNITS, 'unit', text, offset, length); /// Return the token that matches the directive name found. - static int matchDirectives(String text, int offset, int length) { - return matchList(_DIRECTIVES, 'type', text, offset, length); - } + static int matchDirectives(String text, int offset, int length) => + matchList(_DIRECTIVES, 'type', text, offset, length); /// Return the token that matches the margin directive name found. - static int matchMarginDirectives(String text, int offset, int length) { - return matchList(MARGIN_DIRECTIVES, 'type', text, offset, length); - } + static int matchMarginDirectives(String text, int offset, int length) => + matchList(MARGIN_DIRECTIVES, 'type', text, offset, length); /// Return the token that matches the media operator found. - static int matchMediaOperator(String text, int offset, int length) { - return matchList(MEDIA_OPERATORS, 'type', text, offset, length); - } + static int matchMediaOperator(String text, int offset, int length) => + matchList(MEDIA_OPERATORS, 'type', text, offset, length); static String? idToValue(Iterable identList, int tokenId) { for (var entry in identList) { @@ -564,9 +560,7 @@ class TokenKind { } /// Return RGB value as [int] from a color entry in _EXTENDED_COLOR_NAMES. - static int colorValue(Map entry) { - return entry['value'] as int; - } + static int colorValue(Map entry) => entry['value'] as int; static String? hexToColorName(Object hexValue) { for (final entry in _EXTENDED_COLOR_NAMES) { @@ -604,82 +598,44 @@ class TokenKind { return invertResult.toString(); } - static String kindToString(int kind) { - switch (kind) { - case TokenKind.UNUSED: - return 'ERROR'; - case TokenKind.END_OF_FILE: - return 'end of file'; - case TokenKind.LPAREN: - return '('; - case TokenKind.RPAREN: - return ')'; - case TokenKind.LBRACK: - return '['; - case TokenKind.RBRACK: - return ']'; - case TokenKind.LBRACE: - return '{'; - case TokenKind.RBRACE: - return '}'; - case TokenKind.DOT: - return '.'; - case TokenKind.SEMICOLON: - return ';'; - case TokenKind.AT: - return '@'; - case TokenKind.HASH: - return '#'; - case TokenKind.PLUS: - return '+'; - case TokenKind.GREATER: - return '>'; - case TokenKind.TILDE: - return '~'; - case TokenKind.ASTERISK: - return '*'; - case TokenKind.NAMESPACE: - return '|'; - case TokenKind.COLON: - return ':'; - case TokenKind.PRIVATE_NAME: - return '_'; - case TokenKind.COMMA: - return ','; - case TokenKind.SPACE: - return ' '; - case TokenKind.TAB: - return '\t'; - case TokenKind.NEWLINE: - return '\n'; - case TokenKind.RETURN: - return '\r'; - case TokenKind.PERCENT: - return '%'; - case TokenKind.SINGLE_QUOTE: - return "'"; - case TokenKind.DOUBLE_QUOTE: - return '"'; - case TokenKind.SLASH: - return '/'; - case TokenKind.EQUALS: - return '='; - case TokenKind.CARET: - return '^'; - case TokenKind.DOLLAR: - return '\$'; - case TokenKind.LESS: - return '<'; - case TokenKind.BANG: - return '!'; - case TokenKind.MINUS: - return '-'; - case TokenKind.BACKSLASH: - return '\\'; - default: - throw StateError('Unknown TOKEN'); - } - } + static String kindToString(int kind) => switch (kind) { + TokenKind.UNUSED => 'ERROR', + TokenKind.END_OF_FILE => 'end of file', + TokenKind.LPAREN => '(', + TokenKind.RPAREN => ')', + TokenKind.LBRACK => '[', + TokenKind.RBRACK => ']', + TokenKind.LBRACE => '{', + TokenKind.RBRACE => '}', + TokenKind.DOT => '.', + TokenKind.SEMICOLON => ';', + TokenKind.AT => '@', + TokenKind.HASH => '#', + TokenKind.PLUS => '+', + TokenKind.GREATER => '>', + TokenKind.TILDE => '~', + TokenKind.ASTERISK => '*', + TokenKind.NAMESPACE => '|', + TokenKind.COLON => ':', + TokenKind.PRIVATE_NAME => '_', + TokenKind.COMMA => ',', + TokenKind.SPACE => ' ', + TokenKind.TAB => '\t', + TokenKind.NEWLINE => '\n', + TokenKind.RETURN => '\r', + TokenKind.PERCENT => '%', + TokenKind.SINGLE_QUOTE => "'", + TokenKind.DOUBLE_QUOTE => '"', + TokenKind.SLASH => '/', + TokenKind.EQUALS => '=', + TokenKind.CARET => '^', + TokenKind.DOLLAR => '\$', + TokenKind.LESS => '<', + TokenKind.BANG => '!', + TokenKind.MINUS => '-', + TokenKind.BACKSLASH => '\\', + _ => throw StateError('Unknown TOKEN') + }; static bool isKindIdentifier(int kind) { switch (kind) { @@ -724,9 +680,7 @@ class TokenKind { } } - static bool isIdentifier(int kind) { - return kind == IDENTIFIER; - } + static bool isIdentifier(int kind) => kind == IDENTIFIER; } // Note: these names should match TokenKind names diff --git a/pkgs/csslib/lib/src/tokenizer.dart b/pkgs/csslib/lib/src/tokenizer.dart index 15f5ad013..d09010602 100644 --- a/pkgs/csslib/lib/src/tokenizer.dart +++ b/pkgs/csslib/lib/src/tokenizer.dart @@ -234,24 +234,20 @@ class Tokenizer extends TokenizerBase { } } - bool varDef(int ch) { - return ch == 'v'.codeUnitAt(0) && - _maybeEatChar('a'.codeUnitAt(0)) && - _maybeEatChar('r'.codeUnitAt(0)) && - _maybeEatChar('-'.codeUnitAt(0)); - } - - bool varUsage(int ch) { - return ch == 'v'.codeUnitAt(0) && - _maybeEatChar('a'.codeUnitAt(0)) && - _maybeEatChar('r'.codeUnitAt(0)) && - (_peekChar() == '-'.codeUnitAt(0)); - } + bool varDef(int ch) => + ch == 'v'.codeUnitAt(0) && + _maybeEatChar('a'.codeUnitAt(0)) && + _maybeEatChar('r'.codeUnitAt(0)) && + _maybeEatChar('-'.codeUnitAt(0)); + + bool varUsage(int ch) => + ch == 'v'.codeUnitAt(0) && + _maybeEatChar('a'.codeUnitAt(0)) && + _maybeEatChar('r'.codeUnitAt(0)) && + (_peekChar() == '-'.codeUnitAt(0)); @override - Token _errorToken([String? message]) { - return _finishToken(TokenKind.ERROR); - } + Token _errorToken([String? message]) => _finishToken(TokenKind.ERROR); @override int getIdentifierKind() { @@ -444,39 +440,32 @@ class Tokenizer extends TokenizerBase { /// Static helper methods. class TokenizerHelpers { - static bool isIdentifierStart(int c) { - return isIdentifierStartExpr(c) || c == 45 /*-*/; - } + static bool isIdentifierStart(int c) => + isIdentifierStartExpr(c) || c == 45 /*-*/; - static bool isDigit(int c) { - return c >= 48 /*0*/ && c <= 57 /*9*/; - } + static bool isDigit(int c) => c >= 48 /*0*/ && c <= 57 /*9*/; - static bool isHexDigit(int c) { - return isDigit(c) || - (c >= 97 /*a*/ && c <= 102 /*f*/) || - (c >= 65 /*A*/ && c <= 70 /*F*/); - } + static bool isHexDigit(int c) => + isDigit(c) || + (c >= 97 /*a*/ && c <= 102 /*f*/) || + (c >= 65 /*A*/ && c <= 70 /*F*/); - static bool isIdentifierPart(int c) { - return isIdentifierPartExpr(c) || c == 45 /*-*/; - } + static bool isIdentifierPart(int c) => + isIdentifierPartExpr(c) || c == 45 /*-*/; /// Pseudo function expressions identifiers can't have a minus sign. - static bool isIdentifierStartExpr(int c) { - return (c >= 97 /*a*/ && c <= 122 /*z*/) || - (c >= 65 /*A*/ && c <= 90 /*Z*/) || - // Note: Unicode 10646 chars U+00A0 or higher are allowed, see: - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - // http://www.w3.org/TR/CSS21/syndata.html#characters - // Also, escaped character should be allowed. - c == 95 /*_*/ || - c >= 0xA0 || - c == 92 /*\*/; - } + static bool isIdentifierStartExpr(int c) => + (c >= 97 /*a*/ && c <= 122 /*z*/) || + (c >= 65 /*A*/ && c <= 90 /*Z*/) || + // Note: Unicode 10646 chars U+00A0 or higher are allowed, see: + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + // http://www.w3.org/TR/CSS21/syndata.html#characters + // Also, escaped character should be allowed. + c == 95 /*_*/ || + c >= 0xA0 || + c == 92 /*\*/; /// Pseudo function expressions identifiers can't have a minus sign. - static bool isIdentifierPartExpr(int c) { - return isIdentifierStartExpr(c) || isDigit(c); - } + static bool isIdentifierPartExpr(int c) => + isIdentifierStartExpr(c) || isDigit(c); } diff --git a/pkgs/csslib/lib/src/tokenizer_base.dart b/pkgs/csslib/lib/src/tokenizer_base.dart index bb44fee59..bcac7be8c 100644 --- a/pkgs/csslib/lib/src/tokenizer_base.dart +++ b/pkgs/csslib/lib/src/tokenizer_base.dart @@ -107,14 +107,10 @@ abstract class TokenizerBase { return false; } - Token _finishToken(int kind) { - return Token(kind, _file.span(_startIndex, _index)); - } + Token _finishToken(int kind) => Token(kind, _file.span(_startIndex, _index)); - Token _errorToken([String? message]) { - return ErrorToken( - TokenKind.ERROR, _file.span(_startIndex, _index), message); - } + Token _errorToken([String? message]) => + ErrorToken(TokenKind.ERROR, _file.span(_startIndex, _index), message); Token finishWhitespace() { _index--; diff --git a/pkgs/csslib/lib/src/tree.dart b/pkgs/csslib/lib/src/tree.dart index 3c7df9707..94655cf89 100644 --- a/pkgs/csslib/lib/src/tree.dart +++ b/pkgs/csslib/lib/src/tree.dart @@ -22,12 +22,11 @@ class Identifier extends TreeNode { dynamic visit(VisitorBase visitor) => visitor.visitIdentifier(this); @override - String toString() { - // Try to use the identifier's original lexeme to preserve any escape codes - // as authored. The name, which may include escaped values, may no longer be - // a valid identifier. - return span?.text ?? name; - } + String toString() => + // Try to use the identifier's original lexeme to preserve any escape + // codes as authored. The name, which may include escaped values, may no + // longer be a valid identifier. + span?.text ?? name; } class Wildcard extends TreeNode { @@ -147,20 +146,13 @@ class SimpleSelectorSequence extends TreeNode { bool get isCombinatorDescendant => combinator == TokenKind.COMBINATOR_DESCENDANT; - String get _combinatorToString { - switch (combinator) { - case TokenKind.COMBINATOR_DESCENDANT: - return ' '; - case TokenKind.COMBINATOR_GREATER: - return ' > '; - case TokenKind.COMBINATOR_PLUS: - return ' + '; - case TokenKind.COMBINATOR_TILDE: - return ' ~ '; - default: - return ''; - } - } + String get _combinatorToString => switch (combinator) { + TokenKind.COMBINATOR_DESCENDANT => ' ', + TokenKind.COMBINATOR_GREATER => ' > ', + TokenKind.COMBINATOR_PLUS => ' + ', + TokenKind.COMBINATOR_TILDE => ' ~ ', + _ => '' + }; @override SimpleSelectorSequence clone() => @@ -243,44 +235,27 @@ class AttributeSelector extends SimpleSelector { int get operatorKind => _op; - String? matchOperator() { - switch (_op) { - case TokenKind.EQUALS: - return '='; - case TokenKind.INCLUDES: - return '~='; - case TokenKind.DASH_MATCH: - return '|='; - case TokenKind.PREFIX_MATCH: - return '^='; - case TokenKind.SUFFIX_MATCH: - return '\$='; - case TokenKind.SUBSTRING_MATCH: - return '*='; - case TokenKind.NO_MATCH: - return ''; - } - return null; - } + String? matchOperator() => switch (_op) { + TokenKind.EQUALS => '=', + TokenKind.INCLUDES => '~=', + TokenKind.DASH_MATCH => '|=', + TokenKind.PREFIX_MATCH => '^=', + TokenKind.SUFFIX_MATCH => '\$=', + TokenKind.SUBSTRING_MATCH => '*=', + TokenKind.NO_MATCH => '', + _ => null + }; // Return the TokenKind for operator used by visitAttributeSelector. - String? matchOperatorAsTokenString() { - switch (_op) { - case TokenKind.EQUALS: - return 'EQUALS'; - case TokenKind.INCLUDES: - return 'INCLUDES'; - case TokenKind.DASH_MATCH: - return 'DASH_MATCH'; - case TokenKind.PREFIX_MATCH: - return 'PREFIX_MATCH'; - case TokenKind.SUFFIX_MATCH: - return 'SUFFIX_MATCH'; - case TokenKind.SUBSTRING_MATCH: - return 'SUBSTRING_MATCH'; - } - return null; - } + String? matchOperatorAsTokenString() => switch (_op) { + TokenKind.EQUALS => 'EQUALS', + TokenKind.INCLUDES => 'INCLUDES', + TokenKind.DASH_MATCH => 'DASH_MATCH', + TokenKind.PREFIX_MATCH => 'PREFIX_MATCH', + TokenKind.SUFFIX_MATCH => 'SUFFIX_MATCH', + TokenKind.SUBSTRING_MATCH => 'SUBSTRING_MATCH', + _ => null + }; String valueToString() { if (value != null) { @@ -406,9 +381,8 @@ class SelectorExpression extends TreeNode { SourceSpan get span => super.span!; @override - SelectorExpression clone() { - return SelectorExpression(expressions.map((e) => e.clone()).toList(), span); - } + SelectorExpression clone() => + SelectorExpression(expressions.map((e) => e.clone()).toList(), span); @override dynamic visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); @@ -824,20 +798,15 @@ class KeyFrameDirective extends Directive { _blocks.add(block); } - String? get keyFrameName { - switch (_keyframeName) { - case TokenKind.DIRECTIVE_KEYFRAMES: - case TokenKind.DIRECTIVE_MS_KEYFRAMES: - return '@keyframes'; - case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES: - return '@-webkit-keyframes'; - case TokenKind.DIRECTIVE_MOZ_KEYFRAMES: - return '@-moz-keyframes'; - case TokenKind.DIRECTIVE_O_KEYFRAMES: - return '@-o-keyframes'; - } - return null; - } + String? get keyFrameName => switch (_keyframeName) { + TokenKind.DIRECTIVE_KEYFRAMES || + TokenKind.DIRECTIVE_MS_KEYFRAMES => + '@keyframes', + TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES => '@-webkit-keyframes', + TokenKind.DIRECTIVE_MOZ_KEYFRAMES => '@-moz-keyframes', + TokenKind.DIRECTIVE_O_KEYFRAMES => '@-o-keyframes', + _ => null + }; @override KeyFrameDirective clone() { @@ -1611,9 +1580,8 @@ class FontExpression extends DartStyleExpression { } /// Merge the two FontExpression and return the result. - factory FontExpression.merge(FontExpression x, FontExpression y) { - return FontExpression._merge(x, y, y.span); - } + factory FontExpression.merge(FontExpression x, FontExpression y) => + FontExpression._merge(x, y, y.span); FontExpression._merge(FontExpression x, FontExpression y, SourceSpan? span) : font = Font.merge(x.font, y.font)!, @@ -1676,9 +1644,8 @@ class MarginExpression extends BoxExpression { } /// Merge the two MarginExpressions and return the result. - factory MarginExpression.merge(MarginExpression x, MarginExpression y) { - return MarginExpression._merge(x, y, y.span); - } + factory MarginExpression.merge(MarginExpression x, MarginExpression y) => + MarginExpression._merge(x, y, y.span); MarginExpression._merge( MarginExpression x, MarginExpression y, SourceSpan? span) @@ -1712,9 +1679,8 @@ class BorderExpression extends BoxExpression { } /// Merge the two BorderExpression and return the result. - factory BorderExpression.merge(BorderExpression x, BorderExpression y) { - return BorderExpression._merge(x, y, y.span); - } + factory BorderExpression.merge(BorderExpression x, BorderExpression y) => + BorderExpression._merge(x, y, y.span); BorderExpression._merge( BorderExpression x, BorderExpression y, SourceSpan? span) @@ -1793,9 +1759,8 @@ class PaddingExpression extends BoxExpression { } /// Merge the two PaddingExpression and return the result. - factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) { - return PaddingExpression._merge(x, y, y.span); - } + factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) => + PaddingExpression._merge(x, y, y.span); PaddingExpression._merge( PaddingExpression x, PaddingExpression y, SourceSpan? span) diff --git a/pkgs/csslib/lib/src/validate.dart b/pkgs/csslib/lib/src/validate.dart index b99a89874..608c09387 100644 --- a/pkgs/csslib/lib/src/validate.dart +++ b/pkgs/csslib/lib/src/validate.dart @@ -2,9 +2,10 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:csslib/visitor.dart'; import 'package:source_span/source_span.dart'; +import '../visitor.dart'; + /// Can be thrown on any Css runtime problem includes source location. class CssSelectorException extends SourceSpanException { CssSelectorException(super.message, [super.span]); diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index e0eab9a0f..7a1cb94e4 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 1.0.0 +version: 1.0.1-wip description: A library for parsing and analyzing CSS (Cascading Style Sheets). repository: https://github.com/dart-lang/csslib @@ -7,13 +7,13 @@ topics: - css environment: - sdk: '>=2.19.0 <4.0.0' + sdk: ^3.0.0 dependencies: source_span: ^1.8.0 dev_dependencies: - dart_flutter_team_lints: ^1.0.0 + dart_flutter_team_lints: ^2.0.0 path: ^1.8.0 term_glyph: ^1.2.0 test: ^1.16.0 From e897e7c1bbdd1fe8282555d8cbdf0d8782171026 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Feb 2024 04:24:01 +0000 Subject: [PATCH 232/245] Bump dart-lang/setup-dart from 1.6.0 to 1.6.2 (dart-lang/csslib#196) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.6.0 to 1.6.2.
Release notes

Sourced from dart-lang/setup-dart's releases.

v1.6.2

v1.6.1

  • Updated the google storage url for main channel releases.
Changelog

Sourced from dart-lang/setup-dart's changelog.

v1.6.2

v1.6.1

  • Updated the google storage url for main channel releases.

v1.6.0

  • Enable provisioning of the latest Dart SDK patch release by specifying just the major and minor version (e.g. 3.2).

v1.5.1

  • No longer test the setup-dart action on pre-2.12 SDKs.
  • Upgrade JS interop code to use extension types (the new name for inline classes).
  • The upcoming rename of the be channel to main is now supported with forward compatibility that switches when the rename happens.

v1.5.0

  • Re-wrote the implementation of the action into Dart.
  • Auto-detect the platform architecture (x64, ia32, arm, arm64).
  • Improved the caching and download resilience of the sdk.
  • Added a new action output: dart-version - the installed version of the sdk.

v1.4.0

  • Automatically create OIDC token for pub.dev.
  • Add a reusable workflow for publishing.

v1.3.0

  • The install location of the Dart SDK is now available in an environment variable, DART_HOME (dart-lang/csslib#43).
  • Fixed an issue where cached downloads could lead to unzip issues on self-hosted runners (dart-lang/csslib#35).

v1.2.0

  • Fixed a path issue impacting git dependencies on Windows.

v1.1.0

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dart-lang/setup-dart&package-manager=github_actions&previous-version=1.6.0&new-version=1.6.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index cbb521374..6bfceb075 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -23,7 +23,7 @@ jobs: sdk: [dev] steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - - uses: dart-lang/setup-dart@b64355ae6ca0b5d484f0106a033dd1388965d06d + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 with: sdk: ${{ matrix.sdk }} - id: install @@ -50,7 +50,7 @@ jobs: sdk: [3.0, dev] steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - - uses: dart-lang/setup-dart@b64355ae6ca0b5d484f0106a033dd1388965d06d + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 with: sdk: ${{ matrix.sdk }} - id: install From e1a98cd6dcd4ef95e232944fe3574ee31d7bc048 Mon Sep 17 00:00:00 2001 From: Olzhas Suleimen Date: Tue, 19 Mar 2024 21:43:21 +0500 Subject: [PATCH 233/245] Update processFont to handle null expressions. (dart-lang/csslib#186) * Update processFont to handle null expressions. * Guidelines. --- pkgs/csslib/CHANGELOG.md | 3 ++- pkgs/csslib/lib/parser.dart | 6 +++--- pkgs/csslib/test/declaration_test.dart | 28 ++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 071dad01c..39c84cbf8 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,6 +1,7 @@ ## 1.0.1-wip -- Require Dart 3.0 +- Update `ExpressionsProcessor.processFont` to handle null expressions. +- Require Dart 3.0. ## 1.0.0 diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index e9780694e..837007d96 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -2836,9 +2836,9 @@ class ExpressionsProcessor { } return FontExpression(_exprs.span, - size: fontSize!.font.size, - lineHeight: fontSize.font.lineHeight, - family: fontFamily!.font.family); + size: fontSize?.font.size, + lineHeight: fontSize?.font.lineHeight, + family: fontFamily?.font.family); } } diff --git a/pkgs/csslib/test/declaration_test.dart b/pkgs/csslib/test/declaration_test.dart index 5dc24f613..6406efdd9 100644 --- a/pkgs/csslib/test/declaration_test.dart +++ b/pkgs/csslib/test/declaration_test.dart @@ -260,6 +260,33 @@ void testUnits() { expect(prettyPrint(stylesheet), generated); } +void testNoValues() { + var errors = []; + final input = r''' +.foo { + color: ; +} +.bar { + font:; + color: blue; +} +'''; + + final generated = r''' +.foo { + color: ; +} +.bar { + font: ; + color: #00f; +}'''; + + var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); + + expect(errors.isEmpty, true, reason: errors.toString()); + expect(prettyPrint(stylesheet), generated); +} + void testUnicode() { var errors = []; final input = r''' @@ -1435,6 +1462,7 @@ void main() { test('Identifiers', testIdentifiers); test('Composites', testComposites); test('Units', testUnits); + test('No Values', testNoValues); test('Unicode', testUnicode); test('Newer CSS', testNewerCss); test('Media Queries', testMediaQueries); From 6d0a3d1023f8d1ed7152db624a52c15c0936ff99 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Thu, 21 Mar 2024 12:52:57 -0700 Subject: [PATCH 234/245] prep for publishing 1.0.1 (dart-lang/csslib#197) --- pkgs/csslib/CHANGELOG.md | 2 +- pkgs/csslib/README.md | 2 +- pkgs/csslib/analysis_options.yaml | 2 +- pkgs/csslib/pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index 39c84cbf8..d1987e650 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.0.1-wip +## 1.0.1 - Update `ExpressionsProcessor.processFont` to handle null expressions. - Require Dart 3.0. diff --git a/pkgs/csslib/README.md b/pkgs/csslib/README.md index dd7422b9f..954917dea 100644 --- a/pkgs/csslib/README.md +++ b/pkgs/csslib/README.md @@ -11,7 +11,7 @@ Parsing CSS is easy! ```dart import 'package:csslib/parser.dart'; -main() { +void main() { var stylesheet = parse( '.foo { color: red; left: 20px; top: 20px; width: 100px; height:200px }'); print(stylesheet.toDebugString()); diff --git a/pkgs/csslib/analysis_options.yaml b/pkgs/csslib/analysis_options.yaml index 25e2df48b..6c38fe479 100644 --- a/pkgs/csslib/analysis_options.yaml +++ b/pkgs/csslib/analysis_options.yaml @@ -6,7 +6,7 @@ analyzer: strict-inference: true strict-raw-types: true errors: - comment_references: ignore #too many false positives + comment_references: ignore # too many false positives linter: rules: diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 7a1cb94e4..c54495d6b 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 1.0.1-wip +version: 1.0.1 description: A library for parsing and analyzing CSS (Cascading Style Sheets). repository: https://github.com/dart-lang/csslib From 159fcf418ddc43b084a62d207817c809ccc0292d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 04:29:19 +0000 Subject: [PATCH 235/245] Bump actions/checkout from 4.1.1 to 4.1.2 (dart-lang/csslib#198) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.1 to 4.1.2.
Release notes

Sourced from actions/checkout's releases.

v4.1.2

We are investigating the following issue with this release and have rolled-back the v4 tag to point to v4.1.1

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4.1.1...v4.1.2

Changelog

Sourced from actions/checkout's changelog.

Changelog

v4.1.2

v4.1.1

v4.1.0

v4.0.0

v3.6.0

v3.5.3

v3.5.2

v3.5.1

v3.5.0

v3.4.0

v3.3.0

v3.2.0

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4.1.1&new-version=4.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 6bfceb075..4bacc9880 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [3.0, dev] steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 with: sdk: ${{ matrix.sdk }} From 1f646f6185fa4ac29e2278b71d5ab71f71c76225 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 04:31:06 +0000 Subject: [PATCH 236/245] Bump actions/checkout from 4.1.2 to 4.1.4 (dart-lang/csslib#199) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.2 to 4.1.4.
Release notes

Sourced from actions/checkout's releases.

v4.1.4

What's Changed

Full Changelog: https://github.com/actions/checkout/compare/v4.1.3...v4.1.4

v4.1.3

What's Changed

Full Changelog: https://github.com/actions/checkout/compare/v4.1.2...v4.1.3

Changelog

Sourced from actions/checkout's changelog.

Changelog

v4.1.4

v4.1.3

v4.1.2

v4.1.1

v4.1.0

v4.0.0

v3.6.0

v3.5.3

v3.5.2

v3.5.1

v3.5.0

v3.4.0

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4.1.2&new-version=4.1.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 4bacc9880..a23faed41 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [3.0, dev] steps: - - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 with: sdk: ${{ matrix.sdk }} From a6e15b79cd0aa3098f3ad1c0642b9784520588b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 15:32:50 +0000 Subject: [PATCH 237/245] Bump dart-lang/setup-dart from 1.6.2 to 1.6.4 (dart-lang/csslib#200) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.6.2 to 1.6.4.
Release notes

Sourced from dart-lang/setup-dart's releases.

v1.6.4

  • Rebuild JS code to include changes from v1.6.3

v1.6.3

Changelog

Sourced from dart-lang/setup-dart's changelog.

v1.6.4

  • Rebuild JS code.

v1.6.3

v1.6.2

v1.6.1

  • Updated the google storage url for main channel releases.

v1.6.0

  • Enable provisioning of the latest Dart SDK patch release by specifying just the major and minor version (e.g. 3.2).

v1.5.1

  • No longer test the setup-dart action on pre-2.12 SDKs.
  • Upgrade JS interop code to use extension types (the new name for inline classes).
  • The upcoming rename of the be channel to main is now supported with forward compatibility that switches when the rename happens.

v1.5.0

  • Re-wrote the implementation of the action into Dart.
  • Auto-detect the platform architecture (x64, ia32, arm, arm64).
  • Improved the caching and download resilience of the sdk.
  • Added a new action output: dart-version - the installed version of the sdk.

v1.4.0

  • Automatically create OIDC token for pub.dev.
  • Add a reusable workflow for publishing.

v1.3.0

  • The install location of the Dart SDK is now available

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dart-lang/setup-dart&package-manager=github_actions&previous-version=1.6.2&new-version=1.6.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index a23faed41..3ba78bdf6 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -23,7 +23,7 @@ jobs: sdk: [dev] steps: - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b - - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 + - uses: dart-lang/setup-dart@f0ead981b4d9a35b37f30d36160575d60931ec30 with: sdk: ${{ matrix.sdk }} - id: install @@ -50,7 +50,7 @@ jobs: sdk: [3.0, dev] steps: - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b - - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 + - uses: dart-lang/setup-dart@f0ead981b4d9a35b37f30d36160575d60931ec30 with: sdk: ${{ matrix.sdk }} - id: install From ccc5ee4dc331864bd704173d4b62e142c1cbb800 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Fri, 3 May 2024 15:06:54 -0700 Subject: [PATCH 238/245] blast_repo fixes (dart-lang/csslib#201) dependabot --- pkgs/csslib/.github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkgs/csslib/.github/dependabot.yml b/pkgs/csslib/.github/dependabot.yml index 725f03af2..cde02ad6a 100644 --- a/pkgs/csslib/.github/dependabot.yml +++ b/pkgs/csslib/.github/dependabot.yml @@ -9,3 +9,7 @@ updates: interval: monthly labels: - autosubmit + groups: + github-actions: + patterns: + - "*" From cf374fabee4effaaba62b1771206a691b842c5a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 04:43:12 +0000 Subject: [PATCH 239/245] Bump actions/checkout from 4.1.4 to 4.1.6 in the github-actions group (dart-lang/csslib#202) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout). Updates `actions/checkout` from 4.1.4 to 4.1.6
Release notes

Sourced from actions/checkout's releases.

v4.1.6

What's Changed

Full Changelog: https://github.com/actions/checkout/compare/v4.1.5...v4.1.6

v4.1.5

What's Changed

Full Changelog: https://github.com/actions/checkout/compare/v4.1.4...v4.1.5

Changelog

Sourced from actions/checkout's changelog.

Changelog

v4.1.6

v4.1.5

v4.1.4

v4.1.3

v4.1.2

v4.1.1

v4.1.0

v4.0.0

v3.6.0

v3.5.3

v3.5.2

v3.5.1

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4.1.4&new-version=4.1.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 3ba78bdf6..4823c1f6c 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 - uses: dart-lang/setup-dart@f0ead981b4d9a35b37f30d36160575d60931ec30 with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [3.0, dev] steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 - uses: dart-lang/setup-dart@f0ead981b4d9a35b37f30d36160575d60931ec30 with: sdk: ${{ matrix.sdk }} From 18fc78d1b43cb0c03d062550f7d20a37b5b8e175 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 20 Jun 2024 09:21:53 -0700 Subject: [PATCH 240/245] Update and fix lints, bump min SDK to Dart 3.1 (dart-lang/csslib#204) --- pkgs/csslib/.github/workflows/test-package.yml | 2 +- pkgs/csslib/CHANGELOG.md | 4 ++++ pkgs/csslib/pubspec.yaml | 6 +++--- pkgs/csslib/test/testing.dart | 2 +- pkgs/csslib/test/third_party_samples_test.dart | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 4823c1f6c..7655b33e3 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -47,7 +47,7 @@ jobs: matrix: # Add macos-latest and/or windows-latest if relevant for this package. os: [ubuntu-latest, windows-latest] - sdk: [3.0, dev] + sdk: [3.1, dev] steps: - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 - uses: dart-lang/setup-dart@f0ead981b4d9a35b37f30d36160575d60931ec30 diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index d1987e650..e1e361b82 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.2-wip + +- Require Dart 3.1 + ## 1.0.1 - Update `ExpressionsProcessor.processFont` to handle null expressions. diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index c54495d6b..290ad26b1 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 1.0.1 +version: 1.0.2-wip description: A library for parsing and analyzing CSS (Cascading Style Sheets). repository: https://github.com/dart-lang/csslib @@ -7,13 +7,13 @@ topics: - css environment: - sdk: ^3.0.0 + sdk: ^3.1.0 dependencies: source_span: ^1.8.0 dev_dependencies: - dart_flutter_team_lints: ^2.0.0 + dart_flutter_team_lints: ^3.0.0 path: ^1.8.0 term_glyph: ^1.2.0 test: ^1.16.0 diff --git a/pkgs/csslib/test/testing.dart b/pkgs/csslib/test/testing.dart index 15421bf92..2c76e58f1 100644 --- a/pkgs/csslib/test/testing.dart +++ b/pkgs/csslib/test/testing.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. /// Common definitions used for setting up the test environment. -library testing; +library; import 'package:csslib/parser.dart'; import 'package:csslib/visitor.dart'; diff --git a/pkgs/csslib/test/third_party_samples_test.dart b/pkgs/csslib/test/third_party_samples_test.dart index 9abb2bbe6..f4aee700d 100644 --- a/pkgs/csslib/test/third_party_samples_test.dart +++ b/pkgs/csslib/test/third_party_samples_test.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. @TestOn('vm') -library samples_test; +library; import 'dart:io'; From 9dad4cf0f9c73d1cbb03c694ac08cb3295b56b77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 04:06:12 +0000 Subject: [PATCH 241/245] Bump the github-actions group with 2 updates (dart-lang/csslib#205) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the github-actions group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart). Updates `actions/checkout` from 4.1.6 to 4.1.7
Release notes

Sourced from actions/checkout's releases.

v4.1.7

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4.1.6...v4.1.7

Changelog

Sourced from actions/checkout's changelog.

Changelog

v4.1.7

v4.1.6

v4.1.5

v4.1.4

v4.1.3

v4.1.2

v4.1.1

v4.1.0

v4.0.0

v3.6.0

v3.5.3

... (truncated)

Commits

Updates `dart-lang/setup-dart` from 1.6.4 to 1.6.5
Release notes

Sourced from dart-lang/setup-dart's releases.

v1.6.5

dart-lang/csslib#118: dart-lang/setup-dartdart-lang/csslib#118

Changelog

Sourced from dart-lang/setup-dart's changelog.

v1.6.5

dart-lang/csslib#118: dart-lang/setup-dartdart-lang/csslib#118

v1.6.4

  • Rebuild JS code.

v1.6.3

v1.6.2

v1.6.1

  • Updated the google storage url for main channel releases.

v1.6.0

  • Enable provisioning of the latest Dart SDK patch release by specifying just the major and minor version (e.g. 3.2).

v1.5.1

  • No longer test the setup-dart action on pre-2.12 SDKs.
  • Upgrade JS interop code to use extension types (the new name for inline classes).
  • The upcoming rename of the be channel to main is now supported with forward compatibility that switches when the rename happens.

v1.5.0

  • Re-wrote the implementation of the action into Dart.
  • Auto-detect the platform architecture (x64, ia32, arm, arm64).
  • Improved the caching and download resilience of the sdk.
  • Added a new action output: dart-version - the installed version of the sdk.

v1.4.0

... (truncated)

Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
--- pkgs/csslib/.github/workflows/test-package.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 7655b33e3..498f193d6 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,8 +22,8 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 - - uses: dart-lang/setup-dart@f0ead981b4d9a35b37f30d36160575d60931ec30 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672 with: sdk: ${{ matrix.sdk }} - id: install @@ -49,8 +49,8 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [3.1, dev] steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 - - uses: dart-lang/setup-dart@f0ead981b4d9a35b37f30d36160575d60931ec30 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672 with: sdk: ${{ matrix.sdk }} - id: install From f715c96eab87166893d3f44dd3550942ec4cce93 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 26 Aug 2024 08:57:42 -0700 Subject: [PATCH 242/245] Fix angle brackets in doc comments (dart-lang/csslib#206) --- pkgs/csslib/lib/parser.dart | 6 +++--- pkgs/csslib/test/compiler_test.dart | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/csslib/lib/parser.dart b/pkgs/csslib/lib/parser.dart index 837007d96..446929823 100644 --- a/pkgs/csslib/lib/parser.dart +++ b/pkgs/csslib/lib/parser.dart @@ -83,7 +83,7 @@ void analyze(List styleSheets, /// Parse the [input] CSS stylesheet into a tree. /// -/// The [input] can be a [String], or [List] of bytes and returns a +/// The [input] can be a [String], or [List]`` of bytes and returns a /// [StyleSheet] AST. The optional [errors] list will collect any error /// encountered. StyleSheet parse( @@ -100,7 +100,7 @@ StyleSheet parse( } /// Parse the [input] CSS selector into a tree. The [input] can be a [String], -/// or [List] of bytes and returns a [StyleSheet] AST. The optional +/// or [List]`` of bytes and returns a [StyleSheet] AST. The optional /// [errors] list will contain each error/warning as a [Message]. // TODO(jmesserly): should rename "parseSelector" and return Selector StyleSheet selector(Object input, {List? errors}) { @@ -1332,7 +1332,7 @@ class _Parser { /// Same as [processSelector] but reports an error for each combinator. /// - /// This is a quick fix for parsing until the parser + /// This is a quick fix for parsing `` until the parser /// supports Selector Level 4 grammar: /// https://drafts.csswg.org/selectors-4/#typedef-compound-selector Selector? processCompoundSelector() { diff --git a/pkgs/csslib/test/compiler_test.dart b/pkgs/csslib/test/compiler_test.dart index f43c1ea2b..ba0c71e00 100644 --- a/pkgs/csslib/test/compiler_test.dart +++ b/pkgs/csslib/test/compiler_test.dart @@ -505,7 +505,7 @@ void testWildcard() { expect('foobar', simpleSelector1.name); } -/// Test List as input to parser. +// Test List as input to parser. void testArrayOfChars() { var errors = []; var input = ' Date: Tue, 1 Oct 2024 04:38:19 +0000 Subject: [PATCH 243/245] Bump actions/checkout from 4.1.7 to 4.2.0 in the github-actions group (dart-lang/csslib#207) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout). Updates `actions/checkout` from 4.1.7 to 4.2.0
Release notes

Sourced from actions/checkout's releases.

v4.2.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4.1.7...v4.2.0

Changelog

Sourced from actions/checkout's changelog.

Changelog

v4.2.0

v4.1.7

v4.1.6

v4.1.5

v4.1.4

v4.1.3

v4.1.2

v4.1.1

v4.1.0

v4.0.0

v3.6.0

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4.1.7&new-version=4.2.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
--- pkgs/csslib/.github/workflows/test-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/pkgs/csslib/.github/workflows/test-package.yml index 498f193d6..62032ebde 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/pkgs/csslib/.github/workflows/test-package.yml @@ -22,7 +22,7 @@ jobs: matrix: sdk: [dev] steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 - uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672 with: sdk: ${{ matrix.sdk }} @@ -49,7 +49,7 @@ jobs: os: [ubuntu-latest, windows-latest] sdk: [3.1, dev] steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 - uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672 with: sdk: ${{ matrix.sdk }} From bf774af7a1e4f499401b11d6c375b2d394b2d7d3 Mon Sep 17 00:00:00 2001 From: Moritz Date: Fri, 25 Oct 2024 14:45:37 +0200 Subject: [PATCH 244/245] Add issue template and other fixes --- .github/ISSUE_TEMPLATE/csslib.md | 5 +++++ pkgs/csslib/pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .github/ISSUE_TEMPLATE/csslib.md diff --git a/.github/ISSUE_TEMPLATE/csslib.md b/.github/ISSUE_TEMPLATE/csslib.md new file mode 100644 index 000000000..a35581ab6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/csslib.md @@ -0,0 +1,5 @@ +--- +name: "package:csslib" +about: "Create a bug or file a feature request against package:csslib." +labels: "package:csslib" +--- \ No newline at end of file diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index 290ad26b1..ae7b3161e 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,7 +1,7 @@ name: csslib version: 1.0.2-wip description: A library for parsing and analyzing CSS (Cascading Style Sheets). -repository: https://github.com/dart-lang/csslib +repository: https://github.com/dart-lang/tools/tree/main/pkgs/csslib topics: - css From 429c06d89618e52177b328343be616599c53bf68 Mon Sep 17 00:00:00 2001 From: Moritz Date: Fri, 25 Oct 2024 14:53:41 +0200 Subject: [PATCH 245/245] Moving fixes --- .github/labeler.yml | 4 ++ .../workflows/csslib.yaml | 13 ++++++- README.md | 1 + pkgs/csslib/.github/dependabot.yml | 15 -------- pkgs/csslib/.github/workflows/no-response.yml | 37 ------------------- pkgs/csslib/.github/workflows/publish.yaml | 17 --------- pkgs/csslib/CHANGELOG.md | 3 +- pkgs/csslib/README.md | 2 +- pkgs/csslib/pubspec.yaml | 2 +- 9 files changed, 21 insertions(+), 73 deletions(-) rename pkgs/csslib/.github/workflows/test-package.yml => .github/workflows/csslib.yaml (88%) delete mode 100644 pkgs/csslib/.github/dependabot.yml delete mode 100644 pkgs/csslib/.github/workflows/no-response.yml delete mode 100644 pkgs/csslib/.github/workflows/publish.yaml diff --git a/.github/labeler.yml b/.github/labeler.yml index c3d5de0b9..00c9f7337 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -16,6 +16,10 @@ - changed-files: - any-glob-to-any-file: 'pkgs/coverage/**' +'package:csslib': + - changed-files: + - any-glob-to-any-file: 'pkgs/csslib/**' + 'package:extension_discovery': - changed-files: - any-glob-to-any-file: 'pkgs/extension_discovery/**' diff --git a/pkgs/csslib/.github/workflows/test-package.yml b/.github/workflows/csslib.yaml similarity index 88% rename from pkgs/csslib/.github/workflows/test-package.yml rename to .github/workflows/csslib.yaml index 62032ebde..054f5718f 100644 --- a/pkgs/csslib/.github/workflows/test-package.yml +++ b/.github/workflows/csslib.yaml @@ -1,17 +1,28 @@ -name: Dart CI +name: package:csslib on: # Run on PRs and pushes to the default branch. push: branches: [ main ] + paths: + - '.github/workflows/csslib.yml' + - 'pkgs/csslib/**' pull_request: branches: [ main ] + paths: + - '.github/workflows/csslib.yml' + - 'pkgs/csslib/**' schedule: - cron: "0 0 * * 0" env: PUB_ENVIRONMENT: bot.github + +defaults: + run: + working-directory: pkgs/csslib/ + jobs: # Check code formatting and static analysis on a single OS (linux) # against Dart dev. diff --git a/README.md b/README.md index ac4edf204..1a8416f62 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ don't naturally belong to other topic monorepos (like | [boolean_selector](pkgs/boolean_selector/) | A flexible syntax for boolean expressions, based on a simplified version of Dart's expression syntax. | [![pub package](https://img.shields.io/pub/v/boolean_selector.svg)](https://pub.dev/packages/boolean_selector) | | [cli_config](pkgs/cli_config/) | A library to take config values from configuration files, CLI arguments, and environment variables. | [![pub package](https://img.shields.io/pub/v/cli_config.svg)](https://pub.dev/packages/cli_config) | | [coverage](pkgs/coverage/) | Coverage data manipulation and formatting. | [![pub package](https://img.shields.io/pub/v/coverage.svg)](https://pub.dev/packages/coverage) | +| [csslib](pkgs/csslib/) | A library for parsing and analyzing CSS (Cascading Style Sheets). | [![pub package](https://img.shields.io/pub/v/csslib.svg)](https://pub.dev/packages/csslib) | | [extension_discovery](pkgs/extension_discovery/) | A convention and utilities for package extension discovery. | [![pub package](https://img.shields.io/pub/v/extension_discovery.svg)](https://pub.dev/packages/extension_discovery) | | [file](pkgs/file/) | A pluggable, mockable file system abstraction for Dart. | [![pub package](https://img.shields.io/pub/v/file.svg)](https://pub.dev/packages/file) | | [file_testing](pkgs/file_testing/) | Testing utilities for package:file (published but unlisted). | [![pub package](https://img.shields.io/pub/v/file_testing.svg)](https://pub.dev/packages/file_testing) | diff --git a/pkgs/csslib/.github/dependabot.yml b/pkgs/csslib/.github/dependabot.yml deleted file mode 100644 index cde02ad6a..000000000 --- a/pkgs/csslib/.github/dependabot.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Dependabot configuration file. -# See https://docs.github.com/en/code-security/dependabot/dependabot-version-updates -version: 2 - -updates: - - package-ecosystem: github-actions - directory: / - schedule: - interval: monthly - labels: - - autosubmit - groups: - github-actions: - patterns: - - "*" diff --git a/pkgs/csslib/.github/workflows/no-response.yml b/pkgs/csslib/.github/workflows/no-response.yml deleted file mode 100644 index ab1ac4984..000000000 --- a/pkgs/csslib/.github/workflows/no-response.yml +++ /dev/null @@ -1,37 +0,0 @@ -# A workflow to close issues where the author hasn't responded to a request for -# more information; see https://github.com/actions/stale. - -name: No Response - -# Run as a daily cron. -on: - schedule: - # Every day at 8am - - cron: '0 8 * * *' - -# All permissions not specified are set to 'none'. -permissions: - issues: write - pull-requests: write - -jobs: - no-response: - runs-on: ubuntu-latest - if: ${{ github.repository_owner == 'dart-lang' }} - steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e - with: - # Don't automatically mark inactive issues+PRs as stale. - days-before-stale: -1 - # Close needs-info issues and PRs after 14 days of inactivity. - days-before-close: 14 - stale-issue-label: "needs-info" - close-issue-message: > - Without additional information we're not able to resolve this issue. - Feel free to add more info or respond to any questions above and we - can reopen the case. Thanks for your contribution! - stale-pr-label: "needs-info" - close-pr-message: > - Without additional information we're not able to resolve this PR. - Feel free to add more info or respond to any questions above. - Thanks for your contribution! diff --git a/pkgs/csslib/.github/workflows/publish.yaml b/pkgs/csslib/.github/workflows/publish.yaml deleted file mode 100644 index 1cb7e9cfb..000000000 --- a/pkgs/csslib/.github/workflows/publish.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# A CI configuration to auto-publish pub packages. - -name: Publish - -on: - pull_request: - branches: [ main ] - push: - tags: [ 'v[0-9]+.[0-9]+.[0-9]+' ] - -jobs: - publish: - if: ${{ github.repository_owner == 'dart-lang' }} - uses: dart-lang/ecosystem/.github/workflows/publish.yaml@main - permissions: - id-token: write # Required for authentication using OIDC - pull-requests: write # Required for writing the pull request note diff --git a/pkgs/csslib/CHANGELOG.md b/pkgs/csslib/CHANGELOG.md index e1e361b82..366c3a657 100644 --- a/pkgs/csslib/CHANGELOG.md +++ b/pkgs/csslib/CHANGELOG.md @@ -1,6 +1,7 @@ -## 1.0.2-wip +## 1.0.2 - Require Dart 3.1 +- Move to `dart-lang/tools` monorepo. ## 1.0.1 diff --git a/pkgs/csslib/README.md b/pkgs/csslib/README.md index 954917dea..edbd80d3e 100644 --- a/pkgs/csslib/README.md +++ b/pkgs/csslib/README.md @@ -1,4 +1,4 @@ -[![Dart CI](https://github.com/dart-lang/csslib/actions/workflows/test-package.yml/badge.svg)](https://github.com/dart-lang/csslib/actions/workflows/test-package.yml) +[![Build Status](https://github.com/dart-lang/tools/actions/workflows/csslib.yaml/badge.svg)](https://github.com/dart-lang/tools/actions/workflows/csslib.yaml) [![pub package](https://img.shields.io/pub/v/csslib.svg)](https://pub.dev/packages/csslib) [![package publisher](https://img.shields.io/pub/publisher/csslib.svg)](https://pub.dev/packages/csslib/publisher) diff --git a/pkgs/csslib/pubspec.yaml b/pkgs/csslib/pubspec.yaml index ae7b3161e..7f7e1fa85 100644 --- a/pkgs/csslib/pubspec.yaml +++ b/pkgs/csslib/pubspec.yaml @@ -1,5 +1,5 @@ name: csslib -version: 1.0.2-wip +version: 1.0.2 description: A library for parsing and analyzing CSS (Cascading Style Sheets). repository: https://github.com/dart-lang/tools/tree/main/pkgs/csslib