├── .editorconfig
├── .gitignore
├── .stylelintignore
├── .stylelintrc.js
├── CHANGELOG.md
├── COMPATIBILITY.md
├── LICENSE.md
├── README.md
├── _browsers.scss
├── app.scss
├── bootstrap.scss
├── components
├── _alerts.scss
├── _all.scss
├── _app.scss
├── _autocompletes.scss
├── _avatars.scss
├── _badges.scss
├── _bottom-navs.scss
├── _bottom-sheets.scss
├── _breadcrumbs.scss
├── _button-toggle.scss
├── _buttons.scss
├── _calendar-daily.scss
├── _calendar-weekly.scss
├── _cards.scss
├── _carousel.scss
├── _chips.scss
├── _content.scss
├── _counters.scss
├── _data-iterator.scss
├── _data-table.scss
├── _date-picker-header.scss
├── _date-picker-table.scss
├── _date-picker-title.scss
├── _date-picker-years.scss
├── _dialogs.scss
├── _dividers.scss
├── _expansion-panel.scss
├── _fa-icons.scss
├── _footer.scss
├── _forms.scss
├── _grid.scss
├── _icons.scss
├── _images.scss
├── _inputs.scss
├── _item-group.scss
├── _jumbotrons.scss
├── _labels.scss
├── _lists.scss
├── _menus.scss
├── _messages.scss
├── _navigation-drawer.scss
├── _overflow-buttons.scss
├── _overlay.scss
├── _pagination.scss
├── _parallax.scss
├── _pickers.scss
├── _progress-circular.scss
├── _progress-linear.scss
├── _radio-group.scss
├── _radios.scss
├── _range-sliders.scss
├── _rating.scss
├── _responsive.scss
├── _ripples.scss
├── _select.scss
├── _selection-controls.scss
├── _sheet.scss
├── _sliders.scss
├── _small-dialog.scss
├── _snackbars.scss
├── _speed-dial.scss
├── _steppers.scss
├── _subheaders.scss
├── _switch.scss
├── _system-bars.scss
├── _tables.scss
├── _tabs.scss
├── _text-fields.scss
├── _textarea.scss
├── _time-picker-clock.scss
├── _time-picker-title.scss
├── _timeline.scss
├── _toolbar.scss
├── _tooltips.scss
├── _treeview.scss
└── _windows.scss
├── elements
├── _all.scss
├── _blockquote.scss
├── _code.scss
├── _global.scss
├── _headings.scss
├── _lists.scss
└── _typography.scss
├── generic
├── _all.scss
├── _animations.scss
├── _colors.scss
├── _elevations.scss
├── _reset.scss
└── _transitions.scss
├── main.scss
├── package-lock.json
├── package.json
├── settings
├── _all.scss
├── _colors.scss
├── _elevations.scss
├── _rtl.scss
├── _theme.scss
└── _variables.scss
├── theme.scss
├── tools
├── _all.scss
├── _bootable.scss
└── helpers
│ ├── _all.scss
│ ├── _breakpoint.scss
│ ├── _colors.scss
│ ├── _typography.scss
│ ├── _unit.scss
│ └── _value.scss
└── trumps
├── _all.scss
├── _display.scss
├── _helpers.scss
├── _spacing.scss
├── _text.scss
└── _transition.scss
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 4
8 | end_of_line = lf
9 | insert_final_newline = true
10 | trim_trailing_whitespace = true
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .sass-cache/
3 | *.css.map
4 | /.idea
5 | /.vscode
6 | /node_modules
7 | npm-debug.log
8 | yarn-error.log
9 |
--------------------------------------------------------------------------------
/.stylelintignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | public/css/
3 | dist/
4 | css/
5 |
--------------------------------------------------------------------------------
/.stylelintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | defaultSeverity: 'warning',
3 | extends: 'stylelint-config-sass-guidelines',
4 | rules: {
5 | 'declaration-property-value-blacklist': null,
6 | indentation: [4, { ignore: 'value' }],
7 | 'max-nesting-depth': null,
8 | 'function-parentheses-space-inside': 'never-single-line',
9 | 'max-line-length': [100, { ignore: ['comments'] }],
10 |
11 | //! Make sure this actually works... othewise just get rid of it.
12 | // "selector-class-pattern": "^(?:(?:o|c|u|t|s|is|has|_|js|qa)-)?[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*(?:__[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)?(?:--[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)?(?:\\[.+\\])?$",
13 | 'selector-class-pattern': null,
14 |
15 | 'selector-max-compound-selectors': null,
16 | //! I would prefer not to have this but vuetify does use some tag selectors. :(
17 | 'selector-no-qualifying-type': null,
18 |
19 | 'scss/at-mixin-pattern': null,
20 | 'scss/at-function-pattern': null,
21 |
22 | // ---- FROM OLD .stylelintrc.js ----
23 | //* Function
24 | 'function-calc-no-unspaced-operator': true,
25 | 'function-linear-gradient-no-nonstandard-direction': true,
26 |
27 | //* Font Family
28 | 'font-family-no-duplicate-names': true,
29 | 'font-family-no-missing-generic-family-keyword': true,
30 |
31 | //* String
32 | 'string-no-newline': true,
33 |
34 | //* Unit
35 | 'unit-no-unknown': true,
36 |
37 | //* Keyframe Declaration
38 | 'keyframe-declaration-no-important': true,
39 |
40 | //* Declaration Block
41 | 'declaration-block-no-duplicate-properties': true,
42 | 'declaration-block-no-shorthand-property-overrides': true,
43 |
44 | //* Selector
45 | 'selector-pseudo-class-no-unknown': true,
46 | 'selector-type-no-unknown': true,
47 |
48 | //* Media Feature
49 | 'media-feature-name-no-unknown': true,
50 |
51 | //* Comment
52 | 'comment-no-empty': true,
53 |
54 | //* General / Sheet
55 | 'no-duplicate-at-import-rules': true,
56 | 'no-duplicate-selectors': true,
57 | 'no-empty-source': true,
58 | 'no-extra-semicolons': true,
59 | 'no-invalid-double-slash-comments': true,
60 |
61 | //* Function
62 | 'function-url-no-scheme-relative': true,
63 |
64 | //* Declaration
65 | 'declaration-block-no-redundant-longhand-properties': true,
66 |
67 | //* General / Sheet
68 | 'no-unknown-animations': true,
69 |
70 | //* Color
71 | 'color-hex-length': 'long',
72 |
73 | //* Function
74 | 'function-comma-newline-after': 'always-multi-line',
75 | 'function-comma-space-before': 'never',
76 | 'function-max-empty-lines': 0,
77 | 'function-name-case': 'lower',
78 | 'function-url-quotes': ['always', { except: ['empty'] }],
79 | 'function-whitespace-after': 'always',
80 | },
81 | };
82 |
--------------------------------------------------------------------------------
/COMPATIBILITY.md:
--------------------------------------------------------------------------------
1 | # Compatibility
2 |
3 | ## [vuetify-scss][vuetify-scss] -> [vuetify][vuetify] compatibility chart
4 |
5 | | Version | Minimum Vuetify Version |
6 | | ------- | ----------------------- |
7 | | v1.0.0 | ~v1.1.8 |
8 | | v1.0.1 | ~v1.1.8 |
9 | | v1.0.4 | ~v1.1.10 |
10 | | v1.0.5 | ~v1.1.11 |
11 | | v1.0.6 | ~v1.1.12 |
12 | | v1.0.7 | ~v1.1.14 |
13 | | v1.0.8 | ~v1.1.15 |
14 | | v1.1.0 | ~v1.2.0 |
15 | | v1.1.1 | ~v1.2.1 |
16 | | v1.1.2 | ~v1.2.2 |
17 | | v1.1.3 | ~v1.2.4 |
18 | | v1.1.4 | ~v1.2.6 |
19 | | v1.1.5 | ~v1.2.7 |
20 | | v1.1.6 | ~v1.2.8 |
21 | | v1.1.7 | ~v1.2.10 |
22 | | v1.2.3 | ~v1.3.0 |
23 | | v1.2.4 | ~v1.3.2 |
24 | | v1.2.7 | ~v1.3.3 |
25 | | v1.2.9 | ~v1.3.4 |
26 | | v1.2.10 | ~v1.3.5 |
27 | | v1.2.11 | ~v1.3.6 |
28 | | v1.2.12 | ~v1.3.8 |
29 | | v1.2.13 | ~v1.3.9 |
30 | | v1.2.14 | ~v1.3.10 |
31 | | v1.2.15 | ~v1.3.13 |
32 |
33 |
34 |
35 |
36 | | v1.3.6 | ~v1.4.4 |
37 | | v1.4.0 | ~v1.5.0 |
38 |
39 | [vuetify]: https://vuetifyjs.com/
40 | [vuetify-scss]: https://github.com/nmsmith22389/vuetify-scss/
41 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 |
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2018 Neil Smith
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vuetify-scss
2 |
3 | [](https://www.npmjs.com/package/vuetify-scss)
4 | [](https://www.npmjs.com/package/vuetify-scss)
5 | [](https://github.com/nmsmith22389/vuetify-scss/issues)
6 |
7 | All of the Vuetify styles converted into Sass. **No more Stylus!** 🎉
8 |
9 | - [Getting Started](#getting-started)
10 | - [Prerequisites](#prerequisites)
11 | - [Installing](#installing)
12 | - [Usage](#usage)
13 | - [Changing variables](#changing-variables)
14 | - [Vuetify Compatibility](#vuetify-compatibility)
15 | - [Added / Changed Variables](#added--changed-variables)
16 | - [Helper / Utility Mixins and Functions](#helper--utility-mixins-and-functions)
17 | - [Info](#info)
18 | - [Changes](#changes)
19 | - [Versioning](#versioning)
20 | - [Authors](#authors)
21 | - [License](#license)
22 | - [Acknowledgments](#acknowledgments)
23 |
24 | ## Getting Started
25 |
26 | ### Prerequisites
27 |
28 | Of course, to use `vuetify-scss` you need to install [Vuetify][vuetify].
29 |
30 | ```bash
31 | npm install vuetify --save-dev
32 | ```
33 |
34 | ### Installing
35 |
36 | To start using `vuetify-scss` you first need to install it using npm.
37 |
38 | ```bash
39 | npm install vuetify-scss --save-dev
40 | ```
41 |
42 | After installing, import `vuetify-scss`'s `.scss` files into your own.
43 |
44 | ```scss
45 | @import '~vuetify-scss';
46 | ```
47 |
48 | Thats's it! Now you have all the fun of [Vuetify][vuetify] with the awesomeness of Sass!
49 |
50 | ## Usage
51 |
52 | ### Changing variables
53 |
54 | To change the default variables, simply define them before `vuetify-scss` is imported.
55 |
56 | Example:
57 | ```scss
58 | // Your own variables file where you override the
59 | // default Vuetify variables.
60 | @import 'variables';
61 |
62 | // Then import vuetify-scss.
63 | @import '~vuetify-scss';
64 | ```
65 |
66 | ### Vuetify Compatibility
67 | To find out which version of [vuetify-scss][vuetify-scss] corresponds to which version of [vuetify][vuetify], see the [compatibility table][compatibility].
68 |
69 | ### Added / Changed Variables
70 |
71 | > **vuetify-scss** has a few things that have been added or changed when compared to the styles in Vuetify. *(such as variables and mixins)*
72 |
73 | Here is a list of the added / changed variables:
74 |
75 | | Variable | Default Value | Description |
76 | | --------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
77 | | `$font-size-root` | `16px` | This is the value the [`rem()`](#helper--utility-mixins-and-functions) mixin is based on when converting pixel units to rem. Defines the HTML tag font-size.
*To change how the body font-size appears please refer to `$body-font-size`.* |
78 | | `$body-font-size` | `14px` | This variable dictates the body font size style. |
79 | | `$heading-style-tags` | `false` | If true, also styles the `h1` - `h6` tags in addition to the `.display-1`, `.headline`, etc. tags. |
80 | | `$values-use-rem` | `true` | If true, all measurements in the styles are converted to rem units, otherwise styles use px units. |
81 |
82 | ### Helper / Utility Mixins and Functions
83 |
84 | **vuetify-scss** also adds some helper / utility mixins and functions that you can use to help when writing your own styles.
85 |
86 | | Mixin / Function | Example | Description |
87 | | ---------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
88 | | `rem(value)` | `font-size: rem(14px);` | Converts `value` into rem or rem/px units into px if `$values-use-rem` is false.
Also accepts lists *(i.e. `rem(6px 12px 24px 48px)`)*. |
89 | | `get-color(palette, shade)` | `bg-color: get-color($blue, darken-1);` | Gets a color from a color palette.
Also takes the Material Design form *(i.e. `get-color(blue, 600)`)*. |
90 | | `map-deep-get(map, keys...)` | `color: map-deep-get($material-light, text, primary);` | Gets a value from a nested map. |
91 | | `breakpoint(breakpoint)` | `@include breakpoint(md-and-up) { /* styles */ }` | A shortcut mixin to have a style only apply to a certain breakpoint. |
92 |
93 |
94 | ## Info
95 |
96 | ### Changes
97 | To see a list of each version and it's changes, check out the [releases][releases] page.
98 |
99 | ### Versioning
100 |
101 | This project uses the [Angular commit convention][angular convention] and is automatically generated by [conventional-changelog][conventional changelog].
102 |
103 | We use [SemVer][semver] for versioning. For the versions available, see the [tags on this repository][tags].
104 |
105 | ### Authors
106 |
107 | * **Neil Smith** - *Creator*
108 |
109 | See also the list of [contributors][contributors] who participated in this project.
110 |
111 | ### License
112 |
113 | This project is licensed under the MIT License - see the [LICENSE.md][license] file for details
114 |
115 | ### Acknowledgments
116 |
117 | All thanks goes to [Vuetify][vuetify] for their amazing framework!
118 |
119 | [vuetify]: https://vuetifyjs.com/
120 | [vuetify-scss]: https://github.com/nmsmith22389/vuetify-scss/
121 | [compatibility]: COMPATIBILITY.md
122 | [releases]: https://github.com/nmsmith22389/vuetify-scss/releases
123 | [tags]: https://github.com/nmsmith22389/vuetify-scss/tags
124 | [contributors]: https://github.com/nmsmith22389/vuetify-scss/graphs/contributors
125 | [license]: LICENSE.md
126 | [angular convention]: https://github.com/conventional-changelog/conventional-changelog/blob/master/packages/conventional-changelog-angular/README.md
127 | [conventional changelog]: https://github.com/conventional-changelog/conventional-changelog
128 | [semver]: http://semver.org/
129 |
--------------------------------------------------------------------------------
/_browsers.scss:
--------------------------------------------------------------------------------
1 | @mixin firefox() {
2 | @-moz-document url-prefix() {
3 | @content;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/app.scss:
--------------------------------------------------------------------------------
1 | @import 'settings/all';
2 | @import 'generic/all';
3 | @import 'tools/all';
4 | @import 'elements/all';
5 | @import 'trumps/all';
6 |
--------------------------------------------------------------------------------
/bootstrap.scss:
--------------------------------------------------------------------------------
1 | @import 'settings/all';
2 | @import 'tools/all';
3 |
--------------------------------------------------------------------------------
/components/_alerts.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-alert {
4 | border-radius: $alert-border-radius;
5 | border-style: solid;
6 | border-width: $alert-border-width;
7 | color: #ffffff;
8 | display: flex;
9 | font-size: $alert-font-size;
10 | margin: $alert-margin;
11 | padding: $alert-padding;
12 | position: relative;
13 | transition: $primary-transition;
14 |
15 | .v-alert__icon.v-icon,
16 | &__dismissible .v-icon {
17 | align-self: center;
18 | color: $alert-icon-color;
19 | font-size: $alert-icon-font-size;
20 | }
21 |
22 | &--outline .v-icon {
23 | color: inherit !important;
24 | }
25 |
26 | &__icon {
27 | margin-right: $alert-padding;
28 | }
29 |
30 | &__dismissible {
31 | align-self: flex-start;
32 | color: inherit;
33 | margin-left: $alert-padding;
34 | margin-right: 0;
35 | text-decoration: none;
36 | transition: $primary-transition;
37 | user-select: none;
38 |
39 | &:hover {
40 | opacity: 0.8;
41 | }
42 | }
43 |
44 | &--no-icon {
45 | .v-alert__icon {
46 | display: none;
47 | }
48 | }
49 |
50 | > div {
51 | align-self: center;
52 | flex: 1 1;
53 | }
54 |
55 | @media screen and (max-width: map-get($grid-breakpoints, sm)) {
56 | &__icon {
57 | display: none;
58 | }
59 | }
60 | }
61 |
62 | // Double .v-alert is intended - it increases css specificity
63 | // to properly set the border color where alert has set color
64 | // with modifier (for example "red lighten-2")
65 | .v-alert.v-alert {
66 | border-color: map-get($material-light, dividers) !important;
67 |
68 | &--outline {
69 | border: $alert-outline-border-width $alert-outline-border-style currentColor !important;
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/components/_all.scss:
--------------------------------------------------------------------------------
1 | @import 'app';
2 | @import 'alerts';
3 | @import 'autocompletes';
4 | @import 'avatars';
5 | @import 'badges';
6 | @import 'bottom-navs';
7 | @import 'bottom-sheets';
8 | @import 'breadcrumbs';
9 | @import 'button-toggle';
10 | @import 'buttons';
11 | @import 'calendar-daily';
12 | @import 'calendar-weekly';
13 | @import 'cards';
14 | @import 'carousel';
15 | @import 'chips';
16 | @import 'content';
17 | @import 'counters';
18 | @import 'data-iterator';
19 | @import 'data-table';
20 | @import 'date-picker-header';
21 | @import 'date-picker-table';
22 | @import 'date-picker-title';
23 | @import 'date-picker-years';
24 | @import 'dialogs';
25 | @import 'dividers';
26 | @import 'expansion-panel';
27 | // @import 'fa-icons';
28 | @import 'footer';
29 | @import 'forms';
30 | @import 'grid';
31 | @import 'icons';
32 | @import 'images';
33 | @import 'inputs';
34 | @import 'item-group';
35 | @import 'jumbotrons';
36 | @import 'labels';
37 | @import 'lists';
38 | @import 'menus';
39 | @import 'messages';
40 | @import 'navigation-drawer';
41 | @import 'overflow-buttons';
42 | @import 'overlay';
43 | @import 'pagination';
44 | @import 'parallax';
45 | @import 'pickers';
46 | @import 'progress-circular';
47 | @import 'progress-linear';
48 | @import 'radio-group';
49 | @import 'radios';
50 | @import 'range-sliders';
51 | @import 'rating';
52 | @import 'responsive';
53 | @import 'ripples';
54 | @import 'select';
55 | @import 'selection-controls';
56 | @import 'sliders';
57 | @import 'small-dialog';
58 | @import 'snackbars';
59 | @import 'speed-dial';
60 | @import 'steppers';
61 | @import 'subheaders';
62 | @import 'switch';
63 | @import 'system-bars';
64 | @import 'tables';
65 | @import 'tabs';
66 | @import 'text-fields';
67 | @import 'textarea';
68 | @import 'time-picker-clock';
69 | @import 'time-picker-title';
70 | @import 'timeline';
71 | @import 'toolbar';
72 | @import 'tooltips';
73 | @import 'treeview';
74 | @import 'windows';
75 |
--------------------------------------------------------------------------------
/components/_app.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../browsers';
3 | @import '../theme';
4 |
5 | .application {
6 | display: flex;
7 |
8 | a {
9 | cursor: pointer;
10 | }
11 |
12 | &--is-rtl {
13 | direction: rtl;
14 | }
15 |
16 | &--wrap {
17 | backface-visibility: hidden;
18 | display: flex;
19 | flex: 1 1 auto;
20 | flex-direction: column;
21 | max-width: 100%;
22 | min-height: 100vh;
23 | position: relative;
24 | }
25 | }
26 |
27 | @mixin application($material) {
28 | background: map-get($material, background);
29 | color: map-deep-get($material, text, primary);
30 |
31 | .text {
32 | &--primary {
33 | color: map-deep-get($material, text, primary) !important;
34 | }
35 |
36 | &--secondary {
37 | color: map-deep-get($material, text, secondary) !important;
38 | }
39 |
40 | &--disabled {
41 | color: map-deep-get($material, text, disabled) !important;
42 | }
43 | }
44 | }
45 |
46 | @include theme(light, 'application') {
47 | @include application($material-light);
48 | }
49 |
50 | @include theme(dark, 'application') {
51 | @include application($material-dark);
52 | }
53 |
54 | @include firefox() {
55 | @media print {
56 | .application {
57 | display: block;
58 |
59 | &--wrap {
60 | display: block;
61 | }
62 | }
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/components/_autocompletes.scss:
--------------------------------------------------------------------------------
1 | .v-autocomplete {
2 | &.v-input > .v-input__control > .v-input__slot {
3 | cursor: text;
4 | }
5 |
6 | input {
7 | align-self: center;
8 | }
9 |
10 | &--is-selecting-index {
11 | input {
12 | opacity: 0;
13 | }
14 | }
15 |
16 | // When a single select, does not have
17 | // selections padding
18 | &.v-text-field--enclosed:not(.v-text-field--solo):not(.v-text-field--single-line) {
19 | .v-select__slot > input {
20 | margin-top: rem(24px);
21 | }
22 | }
23 |
24 | &:not(.v-input--is-disabled).v-select.v-text-field {
25 | input {
26 | pointer-events: inherit;
27 | }
28 | }
29 |
30 | &__content.v-menu__content {
31 | border-radius: 0;
32 |
33 | .v-card {
34 | border-radius: 0;
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/components/_avatars.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-avatar {
4 | align-items: center;
5 | border-radius: 50%;
6 | display: inline-flex;
7 | justify-content: center;
8 | position: relative;
9 | text-align: center;
10 | vertical-align: middle;
11 |
12 | img,
13 | .v-icon,
14 | .v-image {
15 | border-radius: 50%;
16 | display: inline-flex;
17 | height: inherit;
18 | width: inherit;
19 | }
20 |
21 | &--tile {
22 | border-radius: 0;
23 |
24 | img,
25 | .v-icon,
26 | .v-image {
27 | border-radius: 0;
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/components/_badges.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | @mixin v-badge-rtl {
4 | &__badge {
5 | left: -$badge-width;
6 | right: initial;
7 | }
8 |
9 | &--overlap {
10 | .v-badge__badge {
11 | left: rem(-8px);
12 | right: initial;
13 | }
14 |
15 | &.v-badge--left {
16 | .v-badge__badge {
17 | left: initial;
18 | right: rem(-8px);
19 | }
20 | }
21 | }
22 |
23 | &--left {
24 | .v-badge__badge {
25 | left: initial;
26 | right: -$badge-width;
27 | }
28 | }
29 | }
30 |
31 | @include rtl('v-badge') {
32 | @include v-badge-rtl;
33 | }
34 |
35 | .v-badge {
36 | display: inline-block;
37 | position: relative;
38 |
39 | &__badge {
40 | align-items: center;
41 | border-radius: $badge-border-radius;
42 | color: $badge-color;
43 | display: flex;
44 | flex-flow: row wrap;
45 | font-size: $badge-font-size;
46 | height: $badge-height;
47 | justify-content: center;
48 | position: absolute;
49 | right: -($badge-width);
50 | top: -($badge-height / 2);
51 | transition: $primary-transition;
52 | width: $badge-width;
53 |
54 | .v-icon {
55 | font-size: $badge-font-size;
56 | }
57 | }
58 |
59 | &--overlap {
60 | .v-badge__badge {
61 | right: rem(-8px);
62 | top: rem(-8px);
63 | }
64 |
65 | &.v-badge--left {
66 | .v-badge__badge {
67 | left: rem(-8px);
68 | right: initial;
69 | }
70 | }
71 |
72 | &.v-badge--bottom {
73 | .v-badge__badge {
74 | bottom: rem(-8px);
75 | top: initial;
76 | }
77 | }
78 | }
79 |
80 | &--left {
81 | .v-badge__badge {
82 | left: -($badge-width);
83 | }
84 | }
85 |
86 | &--bottom {
87 | .v-badge__badge {
88 | bottom: -($badge-height / 2);
89 | top: initial;
90 | }
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/components/_bottom-navs.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-bottom-nav($material) {
5 | background-color: map-get($material, cards);
6 |
7 | .v-btn:not(.v-btn--active) {
8 | color: map-deep-get($material, text, secondary) !important;
9 | }
10 | }
11 |
12 | @include theme(light, 'v-bottom-nav') {
13 | @include v-bottom-nav($material-light);
14 | }
15 |
16 | @include theme(dark, 'v-bottom-nav') {
17 | @include v-bottom-nav($material-dark);
18 | }
19 |
20 | .v-item-group.v-bottom-nav {
21 | bottom: 0;
22 | box-shadow: rem(0 3px 14px 2px) rgba(#000000, 0.12);
23 | display: flex;
24 | justify-content: center;
25 | left: 0;
26 | transform: translate(0, rem(60px));
27 | transition: all 0.4s map-get($transition, swing);
28 | width: 100%;
29 |
30 | &--absolute {
31 | position: absolute;
32 | }
33 |
34 | &--active {
35 | transform: translate(0, 0);
36 | }
37 |
38 | &--fixed {
39 | position: fixed;
40 | z-index: 4;
41 | }
42 |
43 | .v-btn {
44 | background: transparent !important;
45 | border-radius: 0;
46 | box-shadow: none !important;
47 | // https://github.com/vuetifyjs/vuetify/issues/4643
48 | flex-shrink: 1;
49 | font-weight: font-weight(regular);
50 | height: 100%;
51 | margin: 0;
52 | max-width: rem(168px);
53 | min-width: rem(80px);
54 | padding: rem(8px 12px 10px);
55 | text-transform: none;
56 | width: 100%;
57 |
58 | .v-btn__content {
59 | flex-direction: column-reverse;
60 | font-size: rem(12px);
61 | white-space: nowrap;
62 | will-change: font-size;
63 |
64 | i.v-icon {
65 | color: inherit;
66 | margin-bottom: rem(4px);
67 | transition: all 0.4s cubic-bezier(0.25, 0.8, 0.5, 1);
68 | }
69 |
70 | span {
71 | line-height: 1;
72 | }
73 | }
74 |
75 | &--active {
76 | padding-top: rem(6px);
77 |
78 | &::before {
79 | background-color: transparent;
80 | }
81 |
82 | .v-btn__content {
83 | font-size: rem(14px);
84 |
85 | .v-icon {
86 | transform: none;
87 | }
88 | }
89 | }
90 | }
91 |
92 | &--shift {
93 | .v-btn__content {
94 | font-size: rem(14px);
95 | }
96 |
97 | .v-btn {
98 | max-width: rem(96px);
99 | min-width: rem(56px);
100 | transition: all 0.3s;
101 |
102 | &--active {
103 | max-width: rem(168px);
104 | min-width: rem(96px);
105 | }
106 | }
107 | }
108 | }
109 |
110 | .v-bottom-nav--shift {
111 | &:not(.v-btn--active) .v-btn__content {
112 | .v-icon {
113 | transform: scale(1, 1) translate(0, rem(8px));
114 | }
115 |
116 | > span:not(.v-badge) {
117 | color: transparent;
118 | }
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/components/_bottom-sheets.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | .v-bottom-sheet.v-dialog {
5 | align-self: flex-end;
6 | border-radius: 0;
7 | flex: 1 0 100%;
8 | margin: 0;
9 | min-width: 100%;
10 | overflow: visible;
11 | transition: 0.3s map-get($transition, fast-in-fast-out);
12 |
13 | &.v-bottom-sheet--inset {
14 | max-width: 70%;
15 | min-width: 0;
16 |
17 | @include breakpoint(xs-only) {
18 | max-width: none;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/components/_breadcrumbs.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-breadcrumbs($material) {
5 | .v-breadcrumbs__divider,
6 | .v-breadcrumbs__item--disabled {
7 | color: map-deep-get($material, text, disabled);
8 | }
9 | }
10 |
11 | @include theme(light, 'v-breadcrumbs') {
12 | @include v-breadcrumbs($material-light);
13 | }
14 | @include theme(dark, 'v-breadcrumbs') {
15 | @include v-breadcrumbs($material-dark);
16 | }
17 |
18 | .v-breadcrumbs {
19 | align-items: center;
20 | display: flex;
21 | flex: $breadcrumbs-flex;
22 | flex-wrap: wrap;
23 | list-style-type: none;
24 | margin: $breadcrumbs-margin;
25 | padding: $breadcrumbs-padding;
26 |
27 | li {
28 | align-items: center;
29 | display: inline-flex;
30 | font-size: $breadcrumbs-item-font-size;
31 |
32 | .v-icon {
33 | font-size: $breadcrumbs-item-large-font-size;
34 | }
35 |
36 | &:nth-child(even) {
37 | padding: $breadcrumbs-even-child-padding;
38 | }
39 | }
40 |
41 | &--large {
42 | li {
43 | font-size: $breadcrumbs-item-large-font-size;
44 |
45 | .v-icon {
46 | font-size: $breadcrumbs-item-large-font-size;
47 | }
48 | }
49 | }
50 |
51 | &__item {
52 | align-items: center;
53 | display: inline-flex;
54 | text-decoration: none;
55 | transition: $primary-transition;
56 |
57 | &--disabled {
58 | pointer-events: none;
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/components/_button-toggle.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-btn-toggle($material) {
6 | background: map-get($material, cards);
7 |
8 | .v-btn {
9 | color: map-deep-get($material, text, primary);
10 | }
11 |
12 | &:not(.v-btn-toggle--only-child) {
13 | .v-btn {
14 | &.v-btn--active:not(:last-child) {
15 | border-right-color: map-deep-get($material, buttons, disabled);
16 | }
17 | }
18 | }
19 | }
20 |
21 | @include theme(light, 'v-btn-toggle') {
22 | @include v-btn-toggle($material-light);
23 | }
24 |
25 | @include theme(dark, 'v-btn-toggle') {
26 | @include v-btn-toggle($material-dark);
27 | }
28 |
29 | .v-btn-toggle {
30 | border-radius: rem(2px);
31 | display: inline-flex;
32 | transition: $primary-transition;
33 | will-change: background, box-shadow;
34 |
35 | .v-btn {
36 | border-radius: 0;
37 | justify-content: center;
38 | margin: 0;
39 | min-width: auto;
40 | opacity: 0.4;
41 | padding: rem(0 8px);
42 | width: auto;
43 |
44 | &:not(:last-child) {
45 | border-right: rem(1px) solid transparent;
46 | }
47 |
48 | &::after {
49 | display: none;
50 | }
51 |
52 | &.v-btn--active {
53 | opacity: 1;
54 | }
55 |
56 | span + .v-icon {
57 | font-size: initial;
58 | margin-left: rem(10px);
59 | }
60 |
61 | &:first-child {
62 | border-radius: rem(2px 0 0 2px);
63 | }
64 |
65 | &:last-child {
66 | border-radius: rem(0 2px 2px 0);
67 | }
68 | }
69 |
70 | &--selected {
71 | @include elevation(2);
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/components/_calendar-daily.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-calendar-daily($material) {
5 | background-color: map-deep-get($material, calendar, background-color);
6 |
7 | .v-calendar-daily__intervals-head {
8 | border-right: map-deep-get($material, calendar, line-color) 1px solid;
9 | }
10 |
11 | .v-calendar-daily_head-day {
12 | border-bottom: map-deep-get($material, calendar, line-color) 1px solid;
13 | border-right: map-deep-get($material, calendar, line-color) 1px solid;
14 | color: map-deep-get($material, calendar, text-color);
15 |
16 | &.v-past {
17 | .v-calendar-daily_head-weekday,
18 | .v-calendar-daily_head-day-label {
19 | color: map-deep-get($material, calendar, past-color);
20 | }
21 | }
22 | }
23 |
24 | .v-calendar-daily__intervals-body {
25 | border-right: map-deep-get($material, calendar, line-color) 1px solid;
26 |
27 | .v-calendar-daily__interval-text {
28 | color: map-deep-get($material, calendar, interval-color);
29 | }
30 | }
31 |
32 | .v-calendar-daily__day {
33 | border-bottom: map-deep-get($material, calendar, interval-line-color) 1px solid;
34 | border-right: map-deep-get($material, calendar, interval-line-color) 1px solid;
35 | }
36 |
37 | .v-calendar-daily__day-interval {
38 | border-top: map-deep-get($material, calendar, interval-line-color) 1px solid;
39 |
40 | &:first-child {
41 | border-top: none !important;
42 | }
43 | }
44 | }
45 |
46 | @include theme(light, 'v-calendar-daily') {
47 | @include v-calendar-daily($material-light);
48 | }
49 |
50 | @include theme(dark, 'v-calendar-daily') {
51 | @include v-calendar-daily($material-dark);
52 | }
53 |
54 | .v-calendar-daily {
55 | display: flex;
56 | flex-direction: column;
57 | height: 100%;
58 | overflow: hidden;
59 | }
60 |
61 | .v-calendar-daily__head {
62 | display: flex;
63 | flex: none;
64 | }
65 |
66 | .v-calendar-daily__intervals-head {
67 | flex: none;
68 | width: $calendar-daily-interval-gutter-width;
69 | }
70 |
71 | .v-calendar-daily_head-day {
72 | flex: 1 1 auto;
73 | width: 0;
74 | }
75 |
76 | .v-calendar-daily_head-weekday {
77 | font-size: $calendar-daily-weekday-font-size;
78 | padding: $calendar-daily-weekday-padding;
79 | user-select: none;
80 | }
81 |
82 | .v-calendar-daily_head-day-label {
83 | cursor: pointer;
84 | font-size: $calendar-daily-day-font-size;
85 | line-height: $calendar-daily-day-line-height;
86 | padding: $calendar-daily-day-padding;
87 | user-select: none;
88 |
89 | &:hover {
90 | text-decoration: underline;
91 | }
92 | }
93 |
94 | .v-calendar-daily__body {
95 | display: flex;
96 | flex: 1 1 60%;
97 | flex-direction: column;
98 | overflow: hidden;
99 | position: relative;
100 | }
101 |
102 | .v-calendar-daily__scroll-area {
103 | align-items: flex-start;
104 | display: flex;
105 | flex: 1 1 auto;
106 | overflow-y: scroll;
107 | }
108 |
109 | .v-calendar-daily__pane {
110 | align-items: flex-start;
111 | display: flex;
112 | flex: none;
113 | overflow-y: hidden;
114 | width: 100%;
115 | }
116 |
117 | .v-calendar-daily__day-container {
118 | display: flex;
119 | flex: 1;
120 | height: 100%;
121 | width: 100%;
122 | }
123 |
124 | .v-calendar-daily__intervals-body {
125 | flex: none;
126 | user-select: none;
127 | width: $calendar-daily-interval-gutter-width;
128 | }
129 |
130 | .v-calendar-daily__interval {
131 | border-bottom: none;
132 | text-align: center;
133 | }
134 |
135 | .v-calendar-daily__interval-text {
136 | display: block;
137 | font-size: $calendar-daily-interval-gutter-font-size;
138 | position: relative;
139 | top: $calendar-daily-interval-gutter-top;
140 | }
141 |
142 | .v-calendar-daily__day {
143 | flex: 1;
144 | position: relative;
145 | width: 0;
146 | }
147 |
--------------------------------------------------------------------------------
/components/_calendar-weekly.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-calendar-weekly($material) {
5 | background-color: map-deep-get($material, calendar, background-color);
6 |
7 | .v-calendar-weekly__head-weekday {
8 | border-right: map-deep-get($material, calendar, line-color) 1px solid;
9 | color: map-deep-get($material, calendar, text-color);
10 |
11 | &.v-past {
12 | color: map-deep-get($material, calendar, past-color);
13 | }
14 |
15 | &.v-outside {
16 | background-color: map-deep-get($material, calendar, outside-background-color);
17 | }
18 | }
19 |
20 | .v-calendar-weekly__day {
21 | border-bottom: map-deep-get($material, calendar, line-color) 1px solid;
22 | border-right: map-deep-get($material, calendar, line-color) 1px solid;
23 | color: map-deep-get($material, calendar, text-color);
24 |
25 | &.v-outside {
26 | background-color: map-deep-get($material, calendar, outside-background-color);
27 | }
28 | }
29 | }
30 |
31 | @include theme(light, 'v-calendar-weekly') {
32 | @include v-calendar-weekly($material-light);
33 | }
34 |
35 | @include theme(dark, 'v-calendar-weekly') {
36 | @include v-calendar-weekly($material-dark);
37 | }
38 |
39 | .v-calendar-weekly {
40 | display: flex;
41 | flex-direction: column;
42 | height: 100%;
43 | width: 100%;
44 | }
45 |
46 | .v-calendar-weekly__head {
47 | display: flex;
48 | user-select: none;
49 | }
50 |
51 | .v-calendar-weekly__head-weekday {
52 | flex: 1 0 rem(20px);
53 | font-size: $calendar-weekly-weekday-font-size;
54 | padding: $calendar-weekly-weekday-padding;
55 | user-select: none;
56 | }
57 |
58 | .v-calendar-weekly__week {
59 | display: flex;
60 | flex: 1;
61 | }
62 |
63 | .v-calendar-weekly__day {
64 | flex: 1;
65 | overflow: hidden;
66 | padding: $calendar-weekly-day-padding;
67 | position: relative;
68 | user-select: none;
69 | width: 0;
70 |
71 | &.v-present {
72 | .v-calendar-weekly__day-label {
73 | border: 1px solid currentColor;
74 | }
75 |
76 | .v-calendar-weekly__day-month {
77 | color: currentColor;
78 | }
79 | }
80 | }
81 |
82 | .v-calendar-weekly__day-label {
83 | border-radius: $calendar-weekly-day-label-radius;
84 | box-shadow: none;
85 | cursor: pointer;
86 | height: $calendar-weekly-day-label-size;
87 | left: 0;
88 | line-height: $calendar-weekly-day-label-size;
89 | position: absolute;
90 | text-align: center;
91 | text-decoration: none;
92 | top: 0;
93 | user-select: none;
94 | width: $calendar-weekly-day-label-size;
95 |
96 | &:hover {
97 | text-decoration: underline;
98 | }
99 | }
100 |
101 | .v-calendar-weekly__day-month {
102 | box-shadow: none;
103 | height: $calendar-weekly-day-label-size;
104 | left: $calendar-weekly-day-month-left;
105 | line-height: $calendar-weekly-day-label-size;
106 | position: absolute;
107 | text-decoration: none;
108 | top: 0;
109 | user-select: none;
110 | }
111 |
--------------------------------------------------------------------------------
/components/_cards.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-card($material) {
6 | background-color: map-get($material, cards);
7 | border-color: map-get($material, cards);
8 | color: map-deep-get($material, text, primary);
9 | }
10 |
11 | @include theme(light, 'v-card') {
12 | @include v-card($material-light);
13 | }
14 |
15 | @include theme(dark, 'v-card') {
16 | @include v-card($material-dark);
17 | }
18 |
19 | .v-card {
20 | @include elevation(2);
21 | text-decoration: none;
22 |
23 | > *:first-child:not(.v-btn):not(.v-chip) {
24 | border-top-left-radius: inherit;
25 | border-top-right-radius: inherit;
26 | }
27 |
28 | > *:last-child:not(.v-btn):not(.v-chip) {
29 | border-bottom-left-radius: inherit;
30 | border-bottom-right-radius: inherit;
31 | }
32 |
33 | &--flat {
34 | @include elevation(0);
35 | }
36 |
37 | &--hover {
38 | cursor: pointer;
39 | transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
40 | transition-property: box-shadow;
41 |
42 | &:hover {
43 | @include elevation(8);
44 | }
45 | }
46 |
47 | &__title {
48 | align-items: center;
49 | display: flex;
50 | flex-wrap: wrap;
51 | padding: rem(16px);
52 |
53 | &--primary {
54 | padding-top: rem(24px);
55 | }
56 | }
57 |
58 | &__text {
59 | padding: rem(16px);
60 | width: 100%;
61 | }
62 |
63 | &__actions {
64 | align-items: center;
65 | display: flex;
66 | padding: rem(8px);
67 |
68 | > *,
69 | .v-btn {
70 | margin: 0;
71 | }
72 |
73 | .v-btn + .v-btn {
74 | margin-left: rem(8px);
75 | }
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/components/_carousel.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | @mixin v-carousel-rtl {
4 | &__prev {
5 | left: auto;
6 | right: rem(5px);
7 | }
8 |
9 | &__next {
10 | left: rem(5px);
11 | right: auto;
12 | }
13 | }
14 |
15 | @include rtl('v-carousel') {
16 | @include v-carousel-rtl;
17 | }
18 |
19 | .v-carousel {
20 | @include elevation(2);
21 | overflow: hidden;
22 | position: relative;
23 | width: 100%;
24 |
25 | &__prev,
26 | &__next {
27 | position: absolute;
28 | top: 50%;
29 | transform: translateY(-50%);
30 | z-index: 1;
31 |
32 | .v-btn {
33 | height: auto;
34 | margin: 0;
35 | width: auto;
36 |
37 | i {
38 | font-size: rem(48px);
39 | }
40 |
41 | &:hover {
42 | background: none;
43 | }
44 | }
45 | }
46 |
47 | &__prev {
48 | left: rem(5px);
49 | }
50 |
51 | &__next {
52 | right: rem(5px);
53 | }
54 |
55 | &__controls {
56 | align-items: center;
57 | background: rgba(0, 0, 0, 0.5);
58 | bottom: 0;
59 | display: flex;
60 | height: rem(50px);
61 | justify-content: center;
62 | left: 0;
63 | list-style-type: none;
64 | position: absolute;
65 | width: 100%;
66 | z-index: 1;
67 |
68 | > .v-item-group {
69 | flex: 0 1 auto;
70 | }
71 |
72 | &__item {
73 | margin: rem(0 8px) !important;
74 |
75 | .v-icon {
76 | opacity: 0.5;
77 | transition: $primary-transition;
78 | }
79 |
80 | &--active {
81 | .v-icon {
82 | opacity: 1;
83 | vertical-align: middle;
84 | }
85 | }
86 |
87 | &:hover {
88 | background: none;
89 |
90 | .v-icon {
91 | opacity: 0.8;
92 | }
93 | }
94 | }
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/components/_chips.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-chip($material) {
5 | background: map-deep-get($material, chips, background);
6 | color: map-deep-get($material, chips, color);
7 |
8 | &--disabled {
9 | color: map-deep-get($material, text, disabled);
10 | }
11 | }
12 |
13 | @mixin v-chip-rtl {
14 | &__close {
15 | margin: $chip-close-margin-rtl;
16 | }
17 |
18 | &--removable {
19 | .v-chip__content {
20 | padding: $chip-removable-padding-rtl;
21 | }
22 | }
23 |
24 | &--select-multi {
25 | margin: $chip-margin 0 $chip-margin $chip-margin;
26 | }
27 |
28 | .v-avatar {
29 | margin-left: rem(8px);
30 | margin-right: rem(-12px);
31 | }
32 |
33 | .v-icon {
34 | &--right {
35 | margin-left: $chip-icon-negative-offset;
36 | margin-right: $chip-icon-offset;
37 | }
38 |
39 | &--left {
40 | margin-left: $chip-icon-offset;
41 | margin-right: $chip-icon-negative-offset;
42 | }
43 | }
44 | }
45 |
46 | @include theme(light, 'v-chip') {
47 | @include v-chip($material-light);
48 | }
49 |
50 | @include theme(dark, 'v-chip') {
51 | @include v-chip($material-dark);
52 | }
53 |
54 | @include rtl('v-chip') {
55 | @include v-chip-rtl;
56 | }
57 |
58 | .v-chip {
59 | align-items: center;
60 | border-radius: $chip-border-radius;
61 | display: inline-flex;
62 | font-size: $chip-font-size;
63 | margin: $chip-margin;
64 | outline: none;
65 | position: relative;
66 | transition: $primary-transition;
67 | vertical-align: middle;
68 |
69 | .v-chip__content {
70 | align-items: center;
71 | border-radius: $chip-border-radius;
72 | cursor: default;
73 | display: inline-flex;
74 | height: $chip-height;
75 | justify-content: space-between;
76 | padding: $chip-padding;
77 | vertical-align: middle;
78 | white-space: nowrap;
79 | z-index: 1;
80 | }
81 |
82 | &--removable {
83 | .v-chip__content {
84 | padding: $chip-removeable-padding;
85 | }
86 | }
87 |
88 | .v-avatar {
89 | // Important is needed to account for new avatar structure
90 | height: $chip-height !important;
91 | margin-left: rem(-12px);
92 | margin-right: rem(8px);
93 | min-width: $chip-height;
94 | width: $chip-height !important;
95 |
96 | img {
97 | height: 100%;
98 | width: 100%;
99 | }
100 | }
101 |
102 | &:focus:not(.v-chip--disabled),
103 | &--active,
104 | &--selected {
105 | @include elevation(2);
106 | border-color: rgba(#000000, 0.13);
107 | // overflow: hidden; // TEMP
108 |
109 | &::after {
110 | background: currentColor;
111 | border-radius: inherit;
112 | content: '';
113 | height: 100%;
114 | left: 0;
115 | opacity: 0.13;
116 | pointer-events: none;
117 | position: absolute;
118 | top: 0;
119 | transition: inherit;
120 | width: 100%;
121 | }
122 | }
123 |
124 | &--label {
125 | border-radius: $chip-label-border-radius;
126 |
127 | .v-chip__content {
128 | border-radius: $chip-label-border-radius;
129 | }
130 | }
131 |
132 | // Increase specificity to override theme background
133 | {&}.v-chip--outline {
134 | background: $chip-outline-background;
135 | border: rem(1px) solid currentColor;
136 | color: $chip-outline-color;
137 | height: $chip-height;
138 |
139 | .v-avatar {
140 | margin-left: rem(-13px);
141 | }
142 | }
143 |
144 | &--small {
145 | height: $chip-small-height !important;
146 |
147 | .v-avatar {
148 | height: $chip-small-height !important;
149 | min-width: $chip-small-height;
150 | width: $chip-small-height !important;
151 | }
152 |
153 | .v-icon {
154 | font-size: $chip-small-font-size;
155 | }
156 | }
157 |
158 | &__close {
159 | align-items: center;
160 | color: inherit;
161 | display: flex;
162 | font-size: $chip-icon-font-size;
163 | margin: $chip-close-margin;
164 | text-decoration: none;
165 | user-select: none;
166 |
167 | > .v-icon {
168 | color: inherit !important;
169 | cursor: pointer;
170 | font-size: rem(20px);
171 | opacity: 0.5;
172 |
173 | &:hover {
174 | opacity: 1;
175 | }
176 | }
177 | }
178 |
179 | &--disabled {
180 | .v-chip__close {
181 | pointer-events: none;
182 | }
183 | }
184 |
185 | &--select-multi {
186 | margin: $chip-margin $chip-margin $chip-margin 0;
187 | }
188 |
189 | .v-icon {
190 | color: inherit;
191 |
192 | &--right {
193 | margin-left: $chip-icon-offset;
194 | margin-right: $chip-icon-negative-offset;
195 | }
196 |
197 | &--left {
198 | margin-left: $chip-icon-negative-offset;
199 | margin-right: $chip-icon-offset;
200 | }
201 | }
202 | }
203 |
--------------------------------------------------------------------------------
/components/_content.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../browsers';
3 |
4 | .v-content {
5 | @include bootable;
6 |
7 | display: flex;
8 | flex: 1 0 auto;
9 | max-width: 100%;
10 |
11 | &__wrap {
12 | flex: 1 1 auto;
13 | max-width: 100%;
14 | position: relative;
15 | }
16 | }
17 |
18 | @include firefox {
19 | @media print {
20 | .v-content {
21 | display: block;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/components/_counters.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-counter($material) {
6 | color: map-deep-get($material, text, secondary);
7 | }
8 |
9 | @include theme(light, 'v-counter') {
10 | @include v-counter($material-light);
11 | }
12 |
13 | @include theme(dark, 'v-counter') {
14 | @include v-counter($material-dark);
15 | }
16 |
17 | .v-counter {
18 | flex: 0 1 auto;
19 | font-size: rem(12px);
20 | line-height: 1;
21 | min-height: rem(12px);
22 | }
23 |
--------------------------------------------------------------------------------
/components/_data-iterator.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-dataiterator($material) {
5 | .v-data-iterator__actions {
6 | color: rgba(map-get($material, fg-color), map-get($material, secondary-text-percent));
7 |
8 | &__select {
9 | .v-select {
10 | .v-select__selection--comma {
11 | color: rgba(
12 | map-get($material, fg-color),
13 | map-get($material, secondary-text-percent)
14 | ) !important;
15 | }
16 |
17 | .v-input__append-inner {
18 | color: rgba(
19 | map-get($material, fg-color),
20 | map-get($material, secondary-text-percent)
21 | ) !important;
22 | }
23 | }
24 | }
25 | }
26 | }
27 |
28 | @include theme(light, 'v-data-iterator') {
29 | @include v-dataiterator($material-light);
30 | }
31 |
32 | @include theme(dark, 'v-data-iterator') {
33 | @include v-dataiterator($material-dark);
34 | }
35 |
36 | // Actions
37 | .v-data-iterator__actions {
38 | align-items: center;
39 | display: flex;
40 | flex-wrap: wrap-reverse;
41 | font-size: rem(12px);
42 | justify-content: flex-end;
43 |
44 | .v-btn {
45 | color: inherit;
46 |
47 | &:last-of-type {
48 | margin-left: rem(14px);
49 | }
50 | }
51 |
52 | &__range-controls {
53 | align-items: center;
54 | display: flex;
55 | min-height: rem(48px);
56 | }
57 |
58 | &__pagination {
59 | display: block;
60 | margin: rem(0 32px 0 24px);
61 | text-align: center;
62 | }
63 |
64 | &__select {
65 | align-items: center;
66 | display: flex;
67 | justify-content: flex-end;
68 | margin-right: rem(14px);
69 | white-space: nowrap;
70 |
71 | .v-select {
72 | flex: 0 1 0;
73 | margin: rem(13px 0 13px 34px);
74 | padding: 0;
75 | position: initial;
76 | }
77 |
78 | .v-select__selections {
79 | flex-wrap: nowrap;
80 |
81 | .v-select__selection--comma {
82 | font-size: rem(12px);
83 | }
84 | }
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/components/_data-table.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-datatable($material) {
6 | thead {
7 | .column.sortable {
8 | .v-icon {
9 | color: rgba(
10 | map-get($material, fg-color),
11 | map-get($material, disabledORhints-text-percent)
12 | );
13 | }
14 |
15 | &:hover {
16 | color: rgba(map-get($material, fg-color), map-get($material, primary-text-percent));
17 | }
18 |
19 | &.active {
20 | color: rgba(map-get($material, fg-color), map-get($material, primary-text-percent));
21 |
22 | .v-icon {
23 | color: rgba(
24 | map-get($material, fg-color),
25 | map-get($material, primary-text-percent)
26 | );
27 | }
28 | }
29 | }
30 | }
31 |
32 | .v-datatable__actions {
33 | background-color: map-get($material, cards);
34 | border-top: rem(1px) solid
35 | rgba(map-get($material, fg-color), map-get($material, divider-percent));
36 | color: rgba(map-get($material, fg-color), map-get($material, secondary-text-percent));
37 | }
38 | }
39 |
40 | @include theme(light, 'v-datatable') {
41 | @include v-datatable($material-light);
42 | }
43 |
44 | @include theme(dark, 'v-datatable') {
45 | @include v-datatable($material-dark);
46 | }
47 |
48 | .v-datatable {
49 | .v-input--selection-controls {
50 | margin: 0;
51 | padding: 0;
52 | }
53 |
54 | thead {
55 | th.column.sortable {
56 | cursor: pointer;
57 | outline: 0;
58 |
59 | .v-icon {
60 | display: inline-block;
61 | font-size: rem(16px);
62 | opacity: 0;
63 | transition: 0.3s map-get($transition, swing);
64 | }
65 |
66 | &:focus,
67 | &:hover {
68 | .v-icon {
69 | opacity: 0.6;
70 | }
71 | }
72 |
73 | &.active {
74 | transform: none;
75 |
76 | .v-icon {
77 | opacity: 1;
78 | }
79 |
80 | &.desc {
81 | .v-icon {
82 | transform: rotate(-180deg);
83 | }
84 | }
85 | }
86 | }
87 | }
88 | }
89 |
90 | // Actions
91 | .v-datatable__actions {
92 | align-items: center;
93 | display: flex;
94 | flex-wrap: wrap-reverse;
95 | font-size: rem(12px);
96 | justify-content: flex-end;
97 |
98 | .v-btn {
99 | color: inherit;
100 |
101 | &:last-of-type {
102 | margin-left: rem(14px);
103 | }
104 | }
105 |
106 | &__range-controls {
107 | align-items: center;
108 | display: flex;
109 | min-height: rem(48px);
110 | }
111 |
112 | &__pagination {
113 | display: block;
114 | margin: rem(0 32px 0 24px);
115 | text-align: center;
116 | }
117 |
118 | &__select {
119 | align-items: center;
120 | display: flex;
121 | justify-content: flex-end;
122 | margin-right: rem(14px);
123 | white-space: nowrap;
124 |
125 | .v-select {
126 | flex: 0 1 0;
127 | margin: rem(13px 0 13px 34px);
128 | padding: 0;
129 | position: initial;
130 |
131 | .v-select__selections {
132 | flex-wrap: nowrap;
133 | }
134 |
135 | .v-select__selection--comma {
136 | font-size: rem(12px);
137 | }
138 | }
139 | }
140 | }
141 |
142 | .v-datatable__progress {
143 | height: auto !important;
144 |
145 | tr,
146 | td,
147 | th {
148 | height: auto !important;
149 | }
150 |
151 | th {
152 | padding: 0 !important;
153 |
154 | .v-progress-linear {
155 | margin: 0;
156 | }
157 | }
158 | }
159 |
160 | .v-datatable__expand {
161 | &-row {
162 | border: none !important;
163 | }
164 |
165 | &-col {
166 | height: 0 !important;
167 | padding: 0 !important;
168 |
169 | &--expanded {
170 | border-bottom: rem(1px) solid rgba(0, 0, 0, 0.12);
171 | }
172 | }
173 |
174 | &-content {
175 | transition: height $primary-transition;
176 |
177 | > .v-card {
178 | border-radius: 0;
179 | box-shadow: none;
180 | }
181 | }
182 | }
183 |
--------------------------------------------------------------------------------
/components/_date-picker-header.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-date-picker-header($material) {
5 | .v-date-picker-header__value:not(.v-date-picker-header__value--disabled) {
6 | button:not(:hover):not(:focus) {
7 | color: map-deep-get($material, text, primary);
8 | }
9 | }
10 |
11 | .v-date-picker-header__value--disabled {
12 | button {
13 | color: map-deep-get($material, text, disabled);
14 | }
15 | }
16 | }
17 |
18 | @include theme(light, 'v-date-picker-header') {
19 | @include v-date-picker-header($material-light);
20 | }
21 |
22 | @include theme(dark, 'v-date-picker-header') {
23 | @include v-date-picker-header($material-dark);
24 | }
25 |
26 | .v-date-picker-header {
27 | align-items: center;
28 | display: flex;
29 | justify-content: space-between;
30 | padding: rem(4px 16px);
31 | position: relative;
32 |
33 | .v-btn {
34 | margin: 0;
35 | z-index: auto;
36 | }
37 |
38 | .v-icon {
39 | cursor: pointer;
40 | user-select: none;
41 | }
42 | }
43 |
44 | .v-date-picker-header__value {
45 | flex: 1;
46 | overflow: hidden;
47 | position: relative;
48 | text-align: center;
49 |
50 | div {
51 | transition: $primary-transition;
52 | width: 100%;
53 | }
54 |
55 | button {
56 | cursor: pointer;
57 | font-weight: bold;
58 | outline: none;
59 | padding: 0.5rem;
60 | transition: $primary-transition;
61 | }
62 | }
63 |
64 | .v-date-picker-header--disabled {
65 | pointer-events: none;
66 | }
67 |
--------------------------------------------------------------------------------
/components/_date-picker-table.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-date-picker-table($material) {
5 | th,
6 | .v-date-picker-table--date__week {
7 | color: map-deep-get($material, text, disabled);
8 | }
9 | }
10 |
11 | @include theme(light, 'v-date-picker-table') {
12 | @include v-date-picker-table($material-light);
13 | }
14 |
15 | @include theme(dark, 'v-date-picker-table') {
16 | @include v-date-picker-table($material-dark);
17 | }
18 |
19 | .v-date-picker-table {
20 | height: rem(242px);
21 | padding: rem(0 12px);
22 | position: relative;
23 |
24 | table {
25 | table-layout: fixed;
26 | top: 0;
27 | transition: $primary-transition;
28 | width: 100%;
29 | }
30 |
31 | td,
32 | th {
33 | position: relative;
34 | text-align: center;
35 | }
36 |
37 | th {
38 | font-size: rem(12px);
39 | }
40 |
41 | &--date .v-btn {
42 | height: rem(32px);
43 | width: rem(32px);
44 | }
45 |
46 | .v-btn {
47 | font-size: rem(12px);
48 | margin: 0;
49 | z-index: auto;
50 |
51 | &.v-btn--active {
52 | color: #ffffff;
53 | }
54 | }
55 | }
56 |
57 | .v-date-picker-table--month {
58 | td {
59 | height: rem(56px);
60 | text-align: center;
61 | vertical-align: middle;
62 | width: 33.33333%;
63 |
64 | .v-btn {
65 | margin: 0 auto;
66 | max-width: rem(160px);
67 | min-width: rem(40px);
68 | width: 100%;
69 | }
70 | }
71 | }
72 |
73 | .v-date-picker-table--date {
74 | th {
75 | font-weight: 600;
76 | padding: rem(8px 0);
77 | }
78 |
79 | td {
80 | width: rem(45px);
81 | }
82 | }
83 |
84 | .v-date-picker-table__events {
85 | height: rem(8px);
86 | left: 0;
87 | position: absolute;
88 | text-align: center;
89 | white-space: pre;
90 | width: 100%;
91 |
92 | > div {
93 | border-radius: 50%;
94 | display: inline-block;
95 | height: rem(8px);
96 | margin: rem(0 1px);
97 | width: rem(8px);
98 | }
99 | }
100 |
101 | .v-date-picker-table--date .v-date-picker-table__events {
102 | bottom: rem(6px);
103 | }
104 |
105 | .v-date-picker-table--month .v-date-picker-table__events {
106 | bottom: rem(8px);
107 | }
108 |
109 | .v-date-picker-table--disabled {
110 | pointer-events: none;
111 | }
112 |
--------------------------------------------------------------------------------
/components/_date-picker-title.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | @mixin v-date-picker-title-rtl {
4 | .v-picker__title__btn {
5 | text-align: right;
6 | }
7 | }
8 |
9 | @include rtl('v-date-picker-title') {
10 | @include v-date-picker-title-rtl;
11 | }
12 |
13 | .v-date-picker-title {
14 | display: flex;
15 | flex-flow: column wrap;
16 | justify-content: space-between;
17 | line-height: 1;
18 | }
19 |
20 | .v-date-picker-title__year {
21 | align-items: center;
22 | display: inline-flex;
23 | font-size: rem(14px);
24 | font-weight: font-weight(medium);
25 | margin-bottom: rem(8px);
26 | }
27 |
28 | .v-date-picker-title__date {
29 | font-size: rem(34px);
30 | font-weight: font-weight(medium);
31 | margin-bottom: rem(-8px);
32 | overflow: hidden;
33 | padding-bottom: rem(8px);
34 | position: relative;
35 | text-align: left;
36 |
37 | > div {
38 | position: relative;
39 | }
40 | }
41 |
42 | .v-date-picker-title--disabled {
43 | pointer-events: none;
44 | }
45 |
--------------------------------------------------------------------------------
/components/_date-picker-years.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-date-picker-years {
4 | font-size: rem(16px);
5 | font-weight: font-weight(regular);
6 | height: rem(286px);
7 | list-style-type: none;
8 | overflow: auto;
9 | padding: 0;
10 | text-align: center;
11 |
12 | li {
13 | cursor: pointer;
14 | padding: rem(8px 0);
15 | transition: none;
16 |
17 | &.active {
18 | font-size: rem(26px);
19 | font-weight: font-weight(medium);
20 | padding: rem(10px 0);
21 | }
22 |
23 | &:hover {
24 | background: rgba(0, 0, 0, 0.12);
25 | }
26 | }
27 | }
28 |
29 | .v-picker--landscape {
30 | .v-date-picker-years {
31 | height: rem(286px);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/components/_dialogs.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-dialog {
4 | @include elevation(24);
5 | border-radius: $card-border-radius;
6 | margin: rem(24px);
7 | overflow-y: auto;
8 | pointer-events: auto;
9 | transition: 0.3s map-get($transition, fast-in-fast-out);
10 | width: 100%;
11 | z-index: inherit;
12 |
13 | &__content {
14 | align-items: center;
15 | display: flex;
16 | height: 100%;
17 | justify-content: center;
18 | left: 0;
19 | outline: none;
20 | pointer-events: none;
21 | position: fixed;
22 | top: 0;
23 | transition: 0.2s map-get($transition, fast-in-fast-out);
24 | width: 100%;
25 | z-index: 6;
26 | }
27 |
28 | &:not(.v-dialog--fullscreen) {
29 | max-height: 90%;
30 | }
31 |
32 | &__activator {
33 | cursor: pointer;
34 |
35 | * {
36 | cursor: pointer;
37 | }
38 | }
39 |
40 | &__container {
41 | display: inline-block;
42 | vertical-align: middle;
43 | }
44 |
45 | @keyframes animate-dialog {
46 | 0% {
47 | transform: scale(1);
48 | }
49 |
50 | 50% {
51 | transform: scale(1.03);
52 | }
53 |
54 | 100% {
55 | transform: scale(1);
56 | }
57 | }
58 |
59 | &--animated {
60 | animation-duration: 0.15s;
61 | animation-name: animate-dialog;
62 | animation-timing-function: map-get($transition, fast-in-fast-out);
63 | }
64 |
65 | &--fullscreen {
66 | border-radius: 0;
67 | height: 100%;
68 | left: 0;
69 | margin: 0;
70 | overflow-y: auto;
71 | position: fixed;
72 | top: 0;
73 |
74 | > .v-card {
75 | margin: 0 !important;
76 | min-height: 100%;
77 | min-width: 100%;
78 | padding: 0 !important;
79 | }
80 | }
81 |
82 | &--scrollable {
83 | display: flex;
84 |
85 | > .v-card {
86 | display: flex;
87 | flex: 1 1 100%;
88 | flex-direction: column;
89 |
90 | > .v-card__title,
91 | > .v-card__actions {
92 | flex: 1 0 auto;
93 | }
94 |
95 | > .v-card__text {
96 | backface-visibility: hidden;
97 | overflow-y: auto;
98 | }
99 | }
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/components/_dividers.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-divider($material) {
5 | background-color: map-get($material, dividers);
6 | }
7 |
8 | @include theme(light, 'v-divider') {
9 | @include v-divider($material-light);
10 | }
11 |
12 | @include theme(dark, 'v-divider') {
13 | @include v-divider($material-dark);
14 | }
15 |
16 | .v-divider {
17 | border: solid;
18 | border-width: thin 0 0;
19 | display: block;
20 | flex: 1 1 0;
21 | height: 0;
22 | max-height: 0;
23 | max-width: 100%;
24 | transition: inherit;
25 |
26 | &--inset:not(.v-divider--vertical) {
27 | margin-left: rem(72px);
28 | width: calc(100% - #{rem(72px)});
29 | }
30 |
31 | &--vertical {
32 | align-self: stretch;
33 | border: solid;
34 | border-width: 0 thin 0 0;
35 | display: inline-flex;
36 | height: inherit;
37 | max-height: 100%;
38 | max-width: 0;
39 | min-height: 100%;
40 | vertical-align: text-bottom;
41 | width: 0;
42 |
43 | &.v-divider--inset {
44 | margin-top: rem(8px);
45 | max-height: calc(100% - #{rem(16px)});
46 | min-height: 0;
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/components/_expansion-panel.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-expansion-panel($material) {
6 | .v-expansion-panel__container {
7 | background-color: map-get($material, cards);
8 | border-top: rem(1px) solid
9 | rgba(map-get($material, fg-color), map-get($material, divider-percent));
10 | color: map-deep-get($material, text, primary);
11 |
12 | .v-expansion-panel__header {
13 | .v-expansion-panel__header__icon {
14 | .v-icon {
15 | color: map-deep-get($material, icons, active);
16 | }
17 | }
18 | }
19 |
20 | &--disabled {
21 | color: map-deep-get($material, text, disabled);
22 | }
23 | }
24 |
25 | &--focusable {
26 | .v-expansion-panel__container {
27 | &:focus {
28 | background-color: map-deep-get($material, expansion-panels, focus);
29 | }
30 | }
31 | }
32 | }
33 |
34 | @include theme(light, 'v-expansion-panel') {
35 | @include v-expansion-panel($material-light);
36 | }
37 |
38 | @include theme(dark, 'v-expansion-panel') {
39 | @include v-expansion-panel($material-dark);
40 | }
41 |
42 | .v-expansion-panel {
43 | @include elevation(1);
44 | display: flex;
45 | flex-wrap: wrap;
46 | justify-content: center;
47 | list-style-type: none;
48 | padding: 0;
49 | text-align: left;
50 | width: 100%;
51 |
52 | &__container {
53 | flex: 1 0 100%;
54 | max-width: 100%;
55 | outline: none;
56 | transition: $primary-transition;
57 |
58 | &:first-child {
59 | border-top: none !important;
60 | }
61 |
62 | .v-expansion-panel__header__icon {
63 | margin-left: auto;
64 | }
65 |
66 | &--disabled {
67 | .v-expansion-panel__header {
68 | pointer-events: none;
69 | }
70 | }
71 |
72 | &--active {
73 | > .v-expansion-panel__header {
74 | .v-expansion-panel__header__icon .v-icon {
75 | transform: rotate(-180deg);
76 | }
77 | }
78 | }
79 | }
80 |
81 | &__header {
82 | align-items: center;
83 | cursor: pointer;
84 | display: flex;
85 | min-height: rem(48px);
86 | padding: rem(12px 24px);
87 | position: relative;
88 |
89 | > *:not(.v-expansion-panel__header__icon) {
90 | flex: 1 1 auto;
91 | }
92 | }
93 |
94 | &__body {
95 | transition: $primary-transition;
96 |
97 | > .v-card {
98 | @include elevation(0, true);
99 | border-radius: 0;
100 | }
101 | }
102 |
103 | &--popout,
104 | &--inset {
105 | @include elevation(0);
106 |
107 | .v-expansion-panel__container--active {
108 | @include elevation(3);
109 | margin: map-deep-get($spacers, three, x);
110 | }
111 |
112 | .v-expansion-panel__container {
113 | max-width: 95%;
114 | }
115 | }
116 |
117 | &--popout {
118 | .v-expansion-panel__container--active {
119 | max-width: 100%;
120 | }
121 | }
122 |
123 | &--inset {
124 | .v-expansion-panel__container--active {
125 | max-width: 85%;
126 | }
127 | }
128 | }
129 |
--------------------------------------------------------------------------------
/components/_footer.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-footer($material) {
5 | background: map-get($material, app-bar);
6 | color: map-deep-get($material, text, primary);
7 | }
8 |
9 | @include theme(light, 'v-footer') {
10 | @include v-footer($material-light);
11 | }
12 |
13 | @include theme(dark, 'v-footer') {
14 | @include v-footer($material-dark);
15 | }
16 |
17 | .v-footer {
18 | align-items: center;
19 | display: flex;
20 | flex: 0 1 auto !important; // Don't let devs break their code
21 | min-height: $footer-height;
22 | transition: 0.2s map-get($transition, fast-out-slow-in);
23 |
24 | &--absolute,
25 | &--fixed {
26 | bottom: 0;
27 | left: 0;
28 | width: 100%;
29 | z-index: 3;
30 | }
31 |
32 | &--inset {
33 | z-index: 2;
34 | }
35 |
36 | &--absolute {
37 | position: absolute;
38 | }
39 |
40 | &--fixed {
41 | position: fixed;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/components/_forms.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-form {
4 | > .container {
5 | padding: map-get($grid-gutters, lg);
6 |
7 | > .layout > .flex {
8 | padding: (map-get($grid-gutters, lg) / 2);
9 | }
10 |
11 | > .layout:only-child {
12 | margin: -(map-get($grid-gutters, lg) / 2);
13 | }
14 |
15 | > .layout:not(:only-child) {
16 | margin: auto (-(map-get($grid-gutters, lg) / 2));
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/components/_grid.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .container {
4 | flex: 1 1 100%;
5 | margin: auto;
6 | padding: map-get($grid-gutters, xl);
7 | width: 100%;
8 |
9 | @each $size, $width in $container-max-widths {
10 | @media only screen and (min-width: $width) {
11 | max-width: ($width * 0.9375);
12 | }
13 | }
14 |
15 | @include breakpoint(sm-and-down) {
16 | padding: map-get($grid-gutters, lg);
17 | }
18 |
19 | &.fluid {
20 | max-width: 100%;
21 | }
22 |
23 | &.fill-height {
24 | align-items: center;
25 | display: flex;
26 |
27 | > .layout {
28 | flex: 1 1 auto;
29 | height: 100%;
30 | }
31 | }
32 |
33 | &.grid-list {
34 | @each $size, $gutter in $grid-gutters {
35 | &-#{$size} {
36 | padding: $gutter;
37 |
38 | .layout {
39 | .flex {
40 | padding: $gutter / 2;
41 | }
42 | }
43 |
44 | .layout:only-child {
45 | margin: -($gutter / 2);
46 | }
47 |
48 | .layout:not(:only-child) {
49 | margin: auto (-($gutter / 2));
50 | }
51 |
52 | *:not(:only-child) {
53 | .layout:first-child {
54 | margin-top: -($gutter / 2);
55 | }
56 |
57 | .layout:last-child {
58 | margin-bottom: -($gutter / 2);
59 | }
60 | }
61 | }
62 | }
63 | }
64 | }
65 |
66 | .layout {
67 | display: flex;
68 | flex: 1 1 auto;
69 | flex-wrap: nowrap;
70 | // https://github.com/vuetifyjs/vuetify/issues/3873
71 | min-width: 0;
72 |
73 | &.row {
74 | flex-direction: row;
75 |
76 | &.reverse {
77 | flex-direction: row-reverse;
78 | }
79 | }
80 |
81 | &.column {
82 | flex-direction: column;
83 |
84 | &.reverse {
85 | flex-direction: column-reverse;
86 | }
87 |
88 | > .flex {
89 | max-width: 100%;
90 | }
91 | }
92 |
93 | &.wrap {
94 | flex-wrap: wrap;
95 | }
96 | }
97 |
98 | @each $size, $width in $grid-breakpoints {
99 | @media all and (min-width: $width) {
100 | @for $n from 1 through $grid-columns {
101 | .flex.#{$size}#{$n} {
102 | flex-basis: percentage($n / $grid-columns);
103 | flex-grow: 0;
104 | max-width: percentage($n / $grid-columns);
105 | }
106 |
107 | .flex.order-#{$size}#{$n} {
108 | order: $n;
109 | }
110 | }
111 |
112 | @for $n from 0 through $grid-columns {
113 | .flex.offset-#{$size}#{$n} {
114 | // Offsets can only ever work in row layouts
115 | margin-left: percentage($n / $grid-columns);
116 | }
117 | }
118 | }
119 | }
120 |
121 | .flex,
122 | .child-flex > * {
123 | flex: 1 1 auto;
124 | max-width: 100%;
125 | }
126 |
127 | .align {
128 | &-start {
129 | align-items: flex-start;
130 | }
131 |
132 | &-end {
133 | align-items: flex-end;
134 | }
135 |
136 | &-center {
137 | align-items: center;
138 | }
139 |
140 | &-baseline {
141 | align-items: baseline;
142 | }
143 | }
144 |
145 | .align-self {
146 | &-start {
147 | align-self: flex-start;
148 | }
149 |
150 | &-end {
151 | align-self: flex-end;
152 | }
153 |
154 | &-center {
155 | align-self: center;
156 | }
157 |
158 | &-baseline {
159 | align-self: baseline;
160 | }
161 | }
162 |
163 | .align-content {
164 | &-start {
165 | align-content: flex-start;
166 | }
167 |
168 | &-end {
169 | align-content: flex-end;
170 | }
171 |
172 | &-center {
173 | align-content: center;
174 | }
175 |
176 | &-space-between {
177 | align-content: space-between;
178 | }
179 |
180 | &-space-around {
181 | align-content: space-around;
182 | }
183 | }
184 |
185 | .justify {
186 | &-start {
187 | justify-content: flex-start;
188 | }
189 |
190 | &-end {
191 | justify-content: flex-end;
192 | }
193 |
194 | &-center {
195 | justify-content: center;
196 | }
197 |
198 | &-space-around {
199 | justify-content: space-around;
200 | }
201 |
202 | &-space-between {
203 | justify-content: space-between;
204 | }
205 | }
206 |
207 | .justify-self {
208 | &-start {
209 | justify-self: flex-start;
210 | }
211 |
212 | &-end {
213 | justify-self: flex-end;
214 | }
215 |
216 | &-center {
217 | justify-self: center;
218 | }
219 |
220 | &-baseline {
221 | justify-self: baseline;
222 | }
223 | }
224 |
225 | .spacer {
226 | flex-grow: 1 !important;
227 | }
228 |
229 | .grow {
230 | flex-grow: 1 !important;
231 | flex-shrink: 0 !important;
232 | }
233 |
234 | .shrink {
235 | flex-grow: 0 !important;
236 | flex-shrink: 1 !important;
237 | }
238 |
239 | .scroll-y {
240 | overflow-y: auto;
241 | }
242 |
243 | .fill-height {
244 | height: 100%;
245 | }
246 |
247 | .hide-overflow {
248 | overflow: hidden !important;
249 | }
250 |
251 | .show-overflow {
252 | overflow: visible !important;
253 | }
254 |
255 | .no-wrap {
256 | white-space: nowrap;
257 | }
258 |
259 | .ellipsis {
260 | overflow: hidden;
261 | text-overflow: ellipsis;
262 | white-space: nowrap;
263 | }
264 |
265 | // Display helpers
266 | .d-flex {
267 | display: flex !important;
268 | }
269 |
270 | .d-inline-flex {
271 | display: inline-flex !important;
272 | }
273 |
274 | // TODO: Remove this in v2.0 (╯°□°)╯︵ ┻━┻
275 | .d-flex,
276 | .d-inline-flex {
277 | > * {
278 | flex: 1 1 auto !important;
279 | }
280 | }
281 |
282 | .d-block {
283 | display: block !important;
284 | }
285 |
286 | .d-inline-block {
287 | display: inline-block !important;
288 | }
289 |
290 | .d-inline {
291 | display: inline !important;
292 | }
293 |
294 | .d-none {
295 | display: none !important;
296 | }
297 |
--------------------------------------------------------------------------------
/components/_icons.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-icon($material) {
6 | color: map-deep-get($material, icons, active);
7 |
8 | &.v-icon--disabled {
9 | color: map-deep-get($material, icons, inactive) !important;
10 | }
11 | }
12 |
13 | @include theme(light, 'v-icon') {
14 | @include v-icon($material-light);
15 | }
16 |
17 | @include theme(dark, 'v-icon') {
18 | @include v-icon($material-dark);
19 | }
20 |
21 | .v-icon {
22 | align-items: center;
23 | display: inline-flex;
24 | font-feature-settings: 'liga';
25 | font-size: rem(1.5rem);
26 | justify-content: center;
27 | line-height: 1;
28 | transition: $primary-transition;
29 | vertical-align: text-bottom;
30 |
31 | &--right {
32 | margin-left: map-get($grid-gutters, lg);
33 | }
34 |
35 | &--left {
36 | margin-right: map-get($grid-gutters, lg);
37 | }
38 |
39 | &.v-icon.v-icon--link {
40 | cursor: pointer;
41 | }
42 |
43 | &--disabled {
44 | opacity: 0.6;
45 | pointer-events: none;
46 | }
47 |
48 | &--is-component {
49 | height: rem(24px);
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/components/_images.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-image {
4 | z-index: 0;
5 |
6 | &__image,
7 | &__placeholder {
8 | height: 100%;
9 | left: 0;
10 | position: absolute;
11 | top: 0;
12 | width: 100%;
13 | z-index: -1;
14 | }
15 |
16 | &__image {
17 | background-repeat: no-repeat;
18 |
19 | &--preload {
20 | filter: blur(rem(2px));
21 | }
22 |
23 | &--contain {
24 | background-size: contain;
25 | }
26 |
27 | &--cover {
28 | background-size: cover;
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/components/_inputs.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-input($material) {
6 | &:not(.v-input--is-disabled) {
7 | input,
8 | textarea {
9 | color: map-deep-get($material, text, primary);
10 | }
11 | }
12 |
13 | input::placeholder,
14 | textarea::placeholder {
15 | color: map-deep-get($material, text, disabled);
16 | }
17 |
18 | &--is-disabled {
19 | .v-label,
20 | input,
21 | textarea {
22 | color: map-deep-get($material, text, disabled);
23 | }
24 | }
25 | }
26 |
27 | @include theme(light, 'v-input') {
28 | @include v-input($material-light);
29 | }
30 |
31 | @include theme(dark, 'v-input') {
32 | @include v-input($material-dark);
33 | }
34 |
35 | .v-input {
36 | align-items: flex-start;
37 | display: flex;
38 | flex: 1 1 auto;
39 | font-size: rem(1rem);
40 | text-align: left;
41 |
42 | .v-progress-linear {
43 | left: 0;
44 | margin: 0;
45 | position: absolute;
46 | top: calc(100% - #{rem(1px)});
47 | }
48 |
49 | input {
50 | max-height: rem(32px);
51 | }
52 |
53 | input,
54 | textarea {
55 | // Remove Firefox red outline
56 | &:invalid {
57 | box-shadow: none;
58 | }
59 |
60 | &:focus,
61 | &:active {
62 | outline: none;
63 | }
64 | }
65 |
66 | .v-label {
67 | height: rem(20px);
68 | line-height: rem(20px);
69 | }
70 |
71 | &__append-outer,
72 | &__prepend-outer {
73 | display: inline-flex;
74 | line-height: 1;
75 | margin-bottom: rem(4px);
76 | margin-top: rem(4px);
77 |
78 | .v-icon {
79 | user-select: none;
80 | }
81 | }
82 |
83 | &__append-outer {
84 | margin-left: rem(9px);
85 | }
86 |
87 | &__prepend-outer {
88 | margin-right: rem(9px);
89 | }
90 |
91 | &__control {
92 | display: flex;
93 | flex-flow: column wrap;
94 | flex-grow: 1;
95 | height: auto;
96 | width: 100%; // For IE11
97 | }
98 |
99 | &__icon {
100 | align-items: center;
101 | display: inline-flex;
102 | flex: 1 0 auto;
103 | height: rem(24px);
104 | justify-content: center;
105 | min-width: rem(24px);
106 | width: rem(24px);
107 |
108 | &--clear {
109 | border-radius: 50%;
110 | }
111 | }
112 |
113 | &__slot {
114 | align-items: center;
115 | color: inherit;
116 | display: flex;
117 | margin-bottom: rem(8px);
118 | min-height: inherit;
119 | position: relative;
120 | transition: $primary-transition;
121 | width: 100%;
122 | }
123 |
124 | &--is-disabled:not(.v-input--is-readonly) {
125 | pointer-events: none;
126 | }
127 |
128 | &--is-loading > .v-input__control > .v-input__slot {
129 | &::before,
130 | &::after {
131 | display: none;
132 | }
133 | }
134 |
135 | &--hide-details > .v-input__control > .v-input__slot {
136 | margin-bottom: 0;
137 | }
138 |
139 | &--has-state {
140 | &.error--text .v-label {
141 | // stylelint-disable-next-line no-unknown-animations
142 | animation: shake 0.6s map-get($transition, swing);
143 | }
144 | }
145 | }
146 |
--------------------------------------------------------------------------------
/components/_item-group.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-item-group {
4 | flex: 0 1 auto;
5 | position: relative;
6 | transition: $primary-transition;
7 |
8 | > * {
9 | cursor: pointer;
10 | flex: 1 1 auto;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/components/_jumbotrons.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-jumbotron($material) {
5 | .v-jumbotron__content {
6 | color: map-deep-get($material, text, primary);
7 | }
8 | }
9 |
10 | @include theme(light, 'v-jumbotron') {
11 | @include v-jumbotron($material-light);
12 | }
13 |
14 | @include theme(dark, 'v-jumbotron') {
15 | @include v-jumbotron($material-dark);
16 | }
17 |
18 | .v-jumbotron {
19 | display: block;
20 | top: 0;
21 | transition: 0.3s map-get($transition, swing);
22 | width: 100%;
23 |
24 | &__wrapper {
25 | height: 100%;
26 | overflow: hidden;
27 | position: relative;
28 | transition: inherit;
29 | width: 100%;
30 | }
31 |
32 | &__background {
33 | bottom: 0;
34 | contain: strict;
35 | left: 0;
36 | position: absolute;
37 | right: 0;
38 | top: 0;
39 | transition: inherit;
40 | }
41 |
42 | &__image {
43 | left: 50%;
44 | min-width: 100%;
45 | position: absolute;
46 | top: 50%;
47 | transform: translate(-50%, -50%);
48 | transition: inherit;
49 | will-change: transform;
50 | }
51 |
52 | &__content {
53 | height: 100%;
54 | position: relative;
55 | transition: inherit;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/components/_labels.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-label($material) {
5 | color: map-deep-get($material, text, secondary);
6 |
7 | &--is-disabled {
8 | color: map-deep-get($material, text, disabled);
9 | }
10 | }
11 |
12 | @include theme(light, 'v-label') {
13 | @include v-label($material-light);
14 | }
15 |
16 | @include theme(dark, 'v-label') {
17 | @include v-label($material-dark);
18 | }
19 |
20 | .v-label {
21 | font-size: rem(16px);
22 | line-height: 1;
23 | min-height: rem(8px);
24 | transition: 0.3s map-get($transition, swing);
25 | }
26 |
--------------------------------------------------------------------------------
/components/_menus.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-menu {
4 | display: block;
5 | vertical-align: middle;
6 |
7 | &--inline {
8 | display: inline-block;
9 | }
10 |
11 | &__activator {
12 | align-items: center;
13 | cursor: pointer;
14 | display: flex;
15 |
16 | * {
17 | cursor: pointer;
18 | }
19 | }
20 |
21 | &__content {
22 | @include elevation(8);
23 | border-radius: rem(2px);
24 | contain: content;
25 | display: inline-block;
26 | max-width: 80%;
27 | overflow-x: hidden;
28 | overflow-y: auto;
29 | position: absolute;
30 | // This is required for an issue on Chrome 65
31 | // that prevents scrolling after a menu is opened
32 | will-change: transform;
33 |
34 | &--active {
35 | pointer-events: none;
36 | }
37 |
38 | > .v-card {
39 | backface-visibility: hidden;
40 | contain: content;
41 | }
42 | }
43 |
44 | > .v-menu__content {
45 | max-width: none;
46 | }
47 |
48 | &-transition {
49 | &-enter {
50 | .v-list__tile {
51 | min-width: 0;
52 | pointer-events: none;
53 | }
54 |
55 | &.v-menu__content--auto {
56 | transition: none !important;
57 |
58 | .v-list__tile {
59 | opacity: 0;
60 | transform: translateY(rem(-15px));
61 | }
62 |
63 | .v-list__tile--active {
64 | opacity: 1;
65 | pointer-events: auto;
66 | transform: none !important;
67 | }
68 | }
69 | }
70 |
71 | &-enter-to {
72 | .v-list__tile {
73 | pointer-events: auto;
74 | transition-delay: 0.1s;
75 | }
76 | }
77 |
78 | &-leave-active,
79 | &-leave-to {
80 | pointer-events: none;
81 | }
82 |
83 | &-enter,
84 | &-leave-to {
85 | opacity: 0;
86 | }
87 |
88 | &-enter-active,
89 | &-leave-active {
90 | transition: all 0.3s map-get($transition, fast-in-fast-out);
91 | }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/components/_messages.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-messages($material) {
6 | color: map-deep-get($material, text, secondary);
7 | }
8 |
9 | @mixin v-messages-rtl {
10 | text-align: right;
11 | }
12 |
13 | @include theme(light, 'v-messages') {
14 | @include v-messages($material-light);
15 | }
16 |
17 | @include theme(dark, 'v-messages') {
18 | @include v-messages($material-dark);
19 | }
20 |
21 | @include rtl('v-messages') {
22 | @include v-messages-rtl;
23 | }
24 |
25 | .v-messages {
26 | flex: 1 1 auto;
27 | font-size: rem(12px);
28 | min-height: rem(12px);
29 | min-width: rem(1px); // Ensure takes up space with no messages and inside of flex
30 | position: relative;
31 |
32 | &__message {
33 | hyphens: auto;
34 | line-height: 1;
35 | overflow-wrap: break-word;
36 | word-break: break-word;
37 | word-wrap: break-word;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/components/_navigation-drawer.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-navigation-drawer($material) {
5 | background-color: map-get($material, cards);
6 |
7 | &:not(.v-navigation-drawer--floating) {
8 | .v-navigation-drawer__border {
9 | background-color: map-get($material, dividers);
10 | }
11 | }
12 |
13 | .v-divider {
14 | border-color: map-get($material, dividers);
15 | }
16 | }
17 |
18 | @include theme(light, 'v-navigation-drawer') {
19 | @include v-navigation-drawer($material-light);
20 | }
21 |
22 | @include theme(dark, 'v-navigation-drawer') {
23 | @include v-navigation-drawer($material-dark);
24 | }
25 |
26 | .v-navigation-drawer {
27 | @include bootable;
28 |
29 | display: block;
30 | left: 0;
31 | max-width: 100%;
32 | -webkit-overflow-scrolling: touch;
33 | overflow-x: hidden;
34 | overflow-y: auto;
35 | pointer-events: auto;
36 | top: 0;
37 | will-change: transform;
38 | z-index: 3;
39 |
40 | &[data-booted='true'] {
41 | transition-property: transform, width;
42 | }
43 |
44 | &__border {
45 | height: 100%;
46 | position: absolute;
47 | right: 0;
48 | top: 0;
49 | width: rem(1px);
50 | }
51 |
52 | &.v-navigation-drawer--right {
53 | &::after {
54 | left: 0;
55 | right: initial;
56 | }
57 | }
58 |
59 | &--right {
60 | left: auto;
61 | right: 0;
62 |
63 | > .v-navigation-drawer__border {
64 | left: 0;
65 | right: auto;
66 | }
67 | }
68 |
69 | &--absolute {
70 | position: absolute;
71 | }
72 |
73 | &--fixed {
74 | position: fixed;
75 | }
76 |
77 | &--floating::after {
78 | display: none;
79 | }
80 |
81 | &--mini-variant {
82 | overflow: hidden;
83 |
84 | .v-list__group__header__prepend-icon {
85 | flex: 1 0 auto;
86 | justify-content: center;
87 | width: 100%;
88 | }
89 |
90 | .v-list__tile__action,
91 | .v-list__tile__avatar {
92 | justify-content: center;
93 | min-width: rem(48px);
94 | }
95 |
96 | .v-list__tile__content,
97 | .v-list__tile::after {
98 | opacity: 0;
99 | }
100 |
101 | .v-subheader,
102 | .v-divider,
103 | .v-list--group {
104 | display: none !important;
105 | }
106 | }
107 |
108 | &--temporary,
109 | &--is-mobile {
110 | z-index: 6;
111 |
112 | &:not(.v-navigation-drawer--close) {
113 | @include elevation(16);
114 | }
115 | }
116 |
117 | .v-list {
118 | background: inherit;
119 | }
120 |
121 | > .v-list {
122 | .v-list__tile {
123 | font-weight: $navigation-drawer-item-font-weight;
124 | transition: none;
125 |
126 | &--active {
127 | .v-list__tile__title {
128 | color: inherit;
129 | }
130 | }
131 | }
132 |
133 | .v-list--group {
134 | .v-list__tile {
135 | font-weight: $navigation-drawer-group-item-font-weight;
136 | }
137 |
138 | &__header--active {
139 | &::after {
140 | background: transparent;
141 | }
142 | }
143 | }
144 | }
145 |
146 | > .v-list:not(.v-list--dense) {
147 | .v-list__tile {
148 | font-size: $navigation-drawer-item-font-size;
149 | }
150 | }
151 | }
152 |
--------------------------------------------------------------------------------
/components/_overflow-buttons.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-overflow-btn($material) {
5 | .v-input__control,
6 | .v-input__slot {
7 | &::before {
8 | background-color: map-get(
9 | $material,
10 | dividers
11 | ) !important; // override v-text-field bottom border
12 | }
13 | }
14 |
15 | &--segmented,
16 | &--editable:hover,
17 | &--editable.v-input--is-focused,
18 | &--editable.v-select--is-menu-active {
19 | .v-input__append-inner {
20 | border-left: rem(1px) solid map-get($material, dividers);
21 | }
22 | }
23 |
24 | &:hover,
25 | &.v-input--is-focused,
26 | &.v-select--is-menu-active {
27 | .v-input__slot {
28 | background: map-get($material, cards);
29 | }
30 | }
31 | }
32 |
33 | @include theme(light, 'v-overflow-btn') {
34 | @include v-overflow-btn($material-light);
35 | }
36 |
37 | @include theme(dark, 'v-overflow-btn') {
38 | @include v-overflow-btn($material-dark);
39 | }
40 |
41 | .v-overflow-btn {
42 | margin-top: rem(12px);
43 | padding-top: 0;
44 |
45 | &:not(.v-overflow-btn--editable) > .v-input__control > .v-input__slot {
46 | cursor: pointer;
47 | }
48 |
49 | .v-select__slot {
50 | height: rem(48px);
51 |
52 | input {
53 | cursor: pointer;
54 | margin-left: rem(16px);
55 | }
56 | }
57 |
58 | .v-select__selection--comma:first-child {
59 | margin-left: rem(16px);
60 | }
61 |
62 | .v-input__slot {
63 | transition: 0.3s map-get($transition, swing);
64 |
65 | &::after {
66 | content: none;
67 | }
68 | }
69 |
70 | .v-label {
71 | margin-left: rem(16px);
72 | top: calc(50% - #{rem(10px)});
73 | }
74 |
75 | .v-input__append-inner {
76 | align-items: center;
77 | align-self: auto;
78 | flex-shrink: 0;
79 | height: rem(48px);
80 | margin-top: 0;
81 | padding: 0;
82 | width: rem(48px);
83 | }
84 |
85 | .v-input__append-outer,
86 | .v-input__prepend-outer {
87 | margin-bottom: rem(12px);
88 | margin-top: rem(12px);
89 | }
90 |
91 | .v-input__control::before {
92 | content: '';
93 | // TODO: move to mixin
94 | height: rem(1px);
95 | left: 0;
96 | position: absolute;
97 | top: rem(-1px);
98 | transition: $primary-transition;
99 | width: 100%;
100 | }
101 |
102 | &.v-input--is-focused,
103 | &.v-select--is-menu-active {
104 | .v-input__slot {
105 | @include elevation(2);
106 | }
107 | }
108 |
109 | .v-select__selections {
110 | width: 0;
111 | }
112 |
113 | &--segmented {
114 | .v-select__selections {
115 | flex-wrap: nowrap;
116 |
117 | .v-btn {
118 | border-radius: 0;
119 | height: rem(48px);
120 | margin: 0;
121 | margin-right: rem(-16px); // push past the input's padding
122 | width: 100%;
123 |
124 | &__content {
125 | justify-content: start;
126 |
127 | &::before {
128 | background-color: transparent;
129 | }
130 | }
131 | }
132 | }
133 | }
134 |
135 | &--editable {
136 | .v-select__slot {
137 | input {
138 | cursor: text;
139 | }
140 | }
141 |
142 | .v-input__append-inner,
143 | .v-input__append-inner * {
144 | cursor: pointer;
145 | }
146 | }
147 | }
148 |
--------------------------------------------------------------------------------
/components/_overlay.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-overlay {
4 | bottom: 0;
5 | left: 0;
6 | pointer-events: none;
7 | position: fixed;
8 | right: 0;
9 | top: 0;
10 | // The overlay has a dynamically set
11 | // z-index, we want the transition
12 | // timing to affect its changing
13 | // https://github.com/vuetifyjs/vuetify/issues/2146
14 | transition: 0.3s map-get($transition, swing);
15 | // This is the standard index
16 | z-index: 5;
17 |
18 | &--absolute {
19 | position: absolute;
20 | }
21 |
22 | &::before {
23 | background-color: rgba(33, 33, 33, 1);
24 | bottom: 0;
25 | content: '';
26 | height: 100%;
27 | left: 0;
28 | opacity: 0;
29 | position: absolute;
30 | right: 0;
31 | top: 0;
32 | transition: inherit;
33 | // Delay the transition to avoid a
34 | // rendering bug that is visible
35 | // within Edge and Firefox
36 | // https://github.com/vuetifyjs/vuetify/issues/2146
37 | transition-delay: 150ms;
38 | width: 100%;
39 | }
40 |
41 | &--active {
42 | pointer-events: auto;
43 | touch-action: none;
44 |
45 | &::before {
46 | opacity: 0.46;
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/components/_pagination.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-pagination($material) {
5 | .v-pagination__item {
6 | background: map-get($material, cards);
7 | color: map-get($material, fg-color);
8 |
9 | &--active {
10 | color: map-deep-get($material, text, theme);
11 | }
12 | }
13 |
14 | .v-pagination__navigation {
15 | background: map-get($material, cards);
16 |
17 | .v-icon {
18 | color: rgba(map-get($material, fg-color), map-get($material, active-icon-percent));
19 | }
20 | }
21 | }
22 |
23 | @include theme(light, 'v-pagination') {
24 | @include v-pagination($material-light);
25 | }
26 |
27 | @include theme(dark, 'v-pagination') {
28 | @include v-pagination($material-dark);
29 | }
30 |
31 | .v-pagination {
32 | align-items: center;
33 | display: inline-flex;
34 | list-style-type: none;
35 | margin: 0;
36 | max-width: 100%;
37 | min-width: rem(34px);
38 | padding: rem(0 5px);
39 |
40 | width: auto;
41 |
42 | > li {
43 | align-items: center;
44 | display: flex;
45 | }
46 |
47 | &--circle {
48 | .v-pagination__item,
49 | .v-pagination__more,
50 | .v-pagination__navigation {
51 | border-radius: 50%;
52 | }
53 | }
54 |
55 | &--disabled {
56 | opacity: 0.6;
57 | pointer-events: none;
58 | }
59 |
60 | &__item {
61 | @include elevation(2);
62 | background: transparent;
63 | border-radius: rem(4px);
64 | font-size: $button-font-size;
65 | height: rem(34px);
66 | margin: rem(0.3rem);
67 | text-decoration: none;
68 | transition: 0.3s map-get($transition, linear-out-slow-in);
69 | width: rem(34px);
70 |
71 | &--active {
72 | @include elevation(4);
73 | }
74 | }
75 |
76 | &__navigation {
77 | @include elevation(2);
78 | align-items: center;
79 | border-radius: rem(4px);
80 | display: inline-flex;
81 | height: rem(2rem);
82 | justify-content: center;
83 | margin: rem(0.3rem 10px);
84 | text-decoration: none;
85 | width: rem(2rem);
86 |
87 | .v-icon {
88 | font-size: rem(2rem);
89 | transition: $secondary-transition;
90 | vertical-align: middle;
91 | }
92 |
93 | &--disabled {
94 | opacity: 0.6;
95 | pointer-events: none;
96 | }
97 | }
98 |
99 | &__more {
100 | align-items: flex-end;
101 | display: inline-flex;
102 | height: rem(2rem);
103 | justify-content: center;
104 | margin: rem(0.3rem);
105 | width: rem(2rem);
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/components/_parallax.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-parallax {
4 | overflow: hidden;
5 | position: relative;
6 | z-index: 0;
7 |
8 | &__image-container {
9 | bottom: 0;
10 | contain: strict;
11 | left: 0;
12 | position: absolute;
13 | right: 0;
14 | top: 0;
15 | z-index: 1;
16 | }
17 |
18 | &__image {
19 | bottom: 0;
20 | display: none;
21 | left: 50%;
22 | min-height: 100%;
23 | min-width: 100%;
24 | position: absolute;
25 | transform: translate(-50%, 0);
26 | transition: 0.3s opacity map-get($transition, swing);
27 | will-change: transform;
28 | z-index: 1;
29 | }
30 |
31 | &__content {
32 | color: #ffffff;
33 | display: flex;
34 | flex-direction: column;
35 | height: 100%;
36 | justify-content: center;
37 | padding: rem(0 1rem);
38 | position: relative;
39 | z-index: 2;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/components/_pickers.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-picker-title($material) {
6 | background: map-deep-get($material, picker, title);
7 | }
8 |
9 | @include theme(light, 'v-picker__title') {
10 | @include v-picker-title($material-light);
11 | }
12 |
13 | @include theme(dark, 'v-picker__title') {
14 | @include v-picker-title($material-dark);
15 | }
16 |
17 | @mixin v-picker-body($material) {
18 | background: map-deep-get($material, picker, body);
19 | }
20 |
21 | @include theme(light, 'v-picker__body') {
22 | @include v-picker-body($material-light);
23 | }
24 |
25 | @include theme(dark, 'v-picker__body') {
26 | @include v-picker-body($material-dark);
27 | }
28 |
29 | .v-picker {
30 | border-radius: $card-border-radius;
31 | contain: layout style;
32 | display: inline-flex;
33 | flex-direction: column;
34 | position: relative;
35 | vertical-align: top;
36 |
37 | &--full-width {
38 | display: flex;
39 | }
40 |
41 | &__title {
42 | border-top-left-radius: $card-border-radius;
43 | border-top-right-radius: $card-border-radius;
44 | color: #ffffff;
45 | padding: rem(16px);
46 | }
47 |
48 | &__title__btn {
49 | transition: $primary-transition;
50 |
51 | &:not(.v-picker__title__btn--active) {
52 | cursor: pointer;
53 | opacity: 0.6;
54 |
55 | &:hover:not(:focus) {
56 | opacity: 1;
57 | }
58 | }
59 |
60 | &--readonly {
61 | pointer-events: none;
62 | }
63 |
64 | &--active {
65 | opacity: 1;
66 | }
67 | }
68 |
69 | &__body {
70 | align-items: center;
71 | display: flex;
72 | flex: 1 0 auto;
73 | flex-direction: column;
74 | height: auto;
75 | overflow: hidden;
76 | position: relative;
77 | z-index: 0;
78 |
79 | > div {
80 | width: 100%;
81 |
82 | &.fade-transition-leave-active {
83 | position: absolute;
84 | }
85 | }
86 | }
87 |
88 | &--landscape {
89 | .v-picker__title {
90 | border-bottom-right-radius: 0;
91 | border-top-right-radius: 0;
92 | height: 100%;
93 | left: 0;
94 | position: absolute;
95 | top: 0;
96 | width: rem(170px);
97 | z-index: 1;
98 | }
99 |
100 | .v-picker__body,
101 | .v-picker__actions {
102 | margin-left: rem(170px);
103 | }
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/components/_progress-circular.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-progress-circular {
4 | display: inline-flex;
5 | position: relative;
6 | vertical-align: middle;
7 |
8 | svg {
9 | bottom: 0;
10 | height: 100%;
11 | left: 0;
12 | margin: auto;
13 | position: absolute;
14 | right: 0;
15 | top: 0;
16 | width: 100%;
17 | z-index: 0;
18 | }
19 |
20 | &--indeterminate {
21 | svg {
22 | animation: $progress-circular-rotate-animation;
23 | transform-origin: center center;
24 | transition: $process-circular-intermediate-svg-transition;
25 | }
26 |
27 | .v-progress-circular__overlay {
28 | animation: $progress-circular-rotate-dash;
29 | stroke-dasharray: 80, 200;
30 | stroke-dashoffset: 0;
31 | stroke-linecap: round;
32 | }
33 | }
34 |
35 | &__underlay {
36 | stroke: $progress-circular-underlay-stroke;
37 | z-index: 1;
38 | }
39 |
40 | &__overlay {
41 | stroke: currentColor;
42 | transition: $progress-circular-overlay-transition;
43 | z-index: 2;
44 | }
45 |
46 | &__info {
47 | left: 50%;
48 | position: absolute;
49 | top: 50%;
50 | transform: translate(-50%, -50%);
51 | }
52 |
53 | @keyframes progress-circular-dash {
54 | 0% {
55 | stroke-dasharray: 1, 200;
56 | stroke-dashoffset: 0;
57 | }
58 |
59 | 50% {
60 | stroke-dasharray: 100, 200;
61 | stroke-dashoffset: rem(-15px);
62 | }
63 |
64 | 100% {
65 | stroke-dasharray: 100, 200;
66 | stroke-dashoffset: rem(-125px);
67 | }
68 | }
69 |
70 | @keyframes progress-circular-rotate {
71 | 100% {
72 | transform: rotate(360deg);
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/components/_progress-linear.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-progress-linear {
4 | background: transparent;
5 | margin: rem(1rem 0);
6 | overflow: hidden;
7 | position: relative;
8 | width: 100%;
9 |
10 | &__bar {
11 | height: inherit;
12 | position: relative;
13 | transition: 0.2s map-get($transition, ease-in-out);
14 | width: 100%;
15 | z-index: 1;
16 |
17 | &__determinate {
18 | height: inherit;
19 | transition: 0.2s map-get($transition, ease-in-out);
20 | }
21 |
22 | &__indeterminate {
23 | .long,
24 | .short {
25 | background-color: inherit;
26 | bottom: 0;
27 | height: inherit;
28 | left: 0;
29 | position: absolute;
30 | top: 0;
31 | width: auto;
32 | will-change: left, right;
33 | }
34 |
35 | &--active .long {
36 | animation: indeterminate;
37 | animation-duration: 2.2s;
38 | animation-iteration-count: infinite;
39 | }
40 |
41 | &--active .short {
42 | animation: indeterminate-short;
43 | animation-duration: 2.2s;
44 | animation-iteration-count: infinite;
45 | }
46 | }
47 | }
48 |
49 | &__background {
50 | bottom: 0;
51 | left: 0;
52 | position: absolute;
53 | top: 0;
54 | transition: 0.3s ease-in;
55 | }
56 |
57 | &__content {
58 | left: 0;
59 | position: absolute;
60 | top: 0;
61 | width: 100%;
62 | z-index: 2;
63 | }
64 |
65 | &--query {
66 | .v-progress-linear__bar__indeterminate {
67 | &--active .long {
68 | animation: query;
69 | animation-duration: 2s;
70 | animation-iteration-count: infinite;
71 | }
72 |
73 | &--active .short {
74 | animation: query-short;
75 | animation-duration: 2s;
76 | animation-iteration-count: infinite;
77 | }
78 | }
79 | }
80 |
81 | @keyframes indeterminate {
82 | 0% {
83 | left: -90%;
84 | right: 100%;
85 | }
86 |
87 | 60% {
88 | left: -90%;
89 | right: 100%;
90 | }
91 |
92 | 100% {
93 | left: 100%;
94 | right: -35%;
95 | }
96 | }
97 |
98 | @keyframes indeterminate-short {
99 | 0% {
100 | left: -200%;
101 | right: 100%;
102 | }
103 |
104 | 60% {
105 | left: 107%;
106 | right: -8%;
107 | }
108 |
109 | 100% {
110 | left: 107%;
111 | right: -8%;
112 | }
113 | }
114 |
115 | @keyframes query {
116 | 0% {
117 | left: 100%;
118 | right: -90%;
119 | }
120 |
121 | 60% {
122 | left: 100%;
123 | right: -90%;
124 | }
125 |
126 | 100% {
127 | left: -35%;
128 | right: 100%;
129 | }
130 | }
131 |
132 | @keyframes query-short {
133 | 0% {
134 | left: 100%;
135 | right: -200%;
136 | }
137 |
138 | 60% {
139 | left: -8%;
140 | right: 107%;
141 | }
142 |
143 | 100% {
144 | left: -8%;
145 | right: 107%;
146 | }
147 | }
148 | }
149 |
--------------------------------------------------------------------------------
/components/_radio-group.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | .v-input--radio-group {
5 | &__input {
6 | display: flex;
7 | width: 100%;
8 |
9 | &--column .v-input--radio-group__input > .v-label {
10 | padding-bottom: rem(8px);
11 | }
12 |
13 | &--row .v-input--radio-group__input > .v-label {
14 | padding-right: rem(8px);
15 | }
16 | }
17 |
18 | &--row {
19 | .v-input--radio-group__input {
20 | flex-flow: row wrap;
21 | }
22 | }
23 |
24 | &--column {
25 | .v-radio:not(:last-child):not(:only-child) {
26 | margin-bottom: rem(8px);
27 | }
28 |
29 | .v-input--radio-group__input {
30 | flex-direction: column;
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/components/_radios.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-radio($material) {
5 | &--is-disabled {
6 | label {
7 | color: map-deep-get($material, text, disabled);
8 | }
9 |
10 | .v-icon {
11 | // needed for helper override
12 | color: map-deep-get($material, buttons, disabled) !important;
13 | }
14 | }
15 | }
16 |
17 | @include theme(light, 'v-radio') {
18 | @include v-radio($material-light);
19 | }
20 |
21 | @include theme(dark, 'v-radio') {
22 | @include v-radio($material-dark);
23 | }
24 |
25 | .v-radio {
26 | align-items: center;
27 | display: flex;
28 | height: auto;
29 | margin-right: rem(16px);
30 | outline: none;
31 |
32 | &--is-disabled {
33 | pointer-events: none;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/components/_range-sliders.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-range-slider($material) {
6 | &.v-input--slider.v-input--is-disabled {
7 | .v-slider.v-slider {
8 | .v-slider__thumb {
9 | background: map-deep-get($material, selection-controls, thumb, disabled);
10 | }
11 | }
12 | }
13 | }
14 |
15 | @include theme(light, 'v-input--range-slider') {
16 | @include v-range-slider($material-light);
17 | }
18 |
19 | @include theme(dark, 'v-input--range-slider') {
20 | @include v-range-slider($material-dark);
21 | }
22 |
23 | // Input Group
24 | .v-input--range-slider {
25 | &.v-input--is-disabled {
26 | .v-slider__track-fill {
27 | display: none;
28 | }
29 |
30 | &.v-input--slider {
31 | .v-slider.v-slider {
32 | .v-slider__thumb {
33 | border-color: transparent;
34 | }
35 | }
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/components/_rating.scss:
--------------------------------------------------------------------------------
1 | .v-rating {
2 | .v-icon {
3 | border-radius: 50%;
4 | padding: rem(0.5rem);
5 | user-select: none;
6 | }
7 |
8 | &--readonly {
9 | .v-icon {
10 | pointer-events: none;
11 | }
12 | }
13 |
14 | &--dense {
15 | .v-icon {
16 | padding: rem(0.1rem);
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/components/_responsive.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-responsive {
4 | display: flex;
5 | flex: 1 0 auto;
6 | overflow: hidden;
7 | position: relative;
8 |
9 | &__content {
10 | flex: 1 0 0;
11 | }
12 |
13 | &__sizer {
14 | flex: 0 0 0;
15 | transition: padding-bottom 0.2s map-get($transition, swing);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/components/_ripples.scss:
--------------------------------------------------------------------------------
1 | .v-ripple {
2 | &__container {
3 | border-radius: inherit;
4 | color: inherit;
5 | contain: strict;
6 | height: 100%;
7 | left: 0;
8 | overflow: hidden;
9 | pointer-events: none;
10 | position: absolute;
11 | top: 0;
12 | width: 100%;
13 | z-index: 0;
14 | }
15 |
16 | &__animation {
17 | background: currentColor;
18 | border-radius: 50%;
19 | color: inherit;
20 | left: 0;
21 | opacity: 0;
22 | overflow: hidden;
23 | pointer-events: none;
24 | position: absolute;
25 | top: 0;
26 | will-change: transform, opacity;
27 |
28 | &--enter {
29 | transition: none;
30 | }
31 |
32 | &--in {
33 | transition: $ripple-animation-transition-in;
34 | }
35 |
36 | &--out {
37 | transition: $ripple-animation-transition-out;
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/components/_select.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-select($material) {
5 | // Needs an explicit color to override
6 | // higher level color
7 | .v-select__selections {
8 | color: map-deep-get($material, text, primary);
9 | }
10 |
11 | &.v-input--is-disabled {
12 | .v-select__selections {
13 | color: map-deep-get($material, text, disabled);
14 | }
15 | }
16 |
17 | .v-chip--disabled,
18 | .v-select__selection--disabled {
19 | color: map-deep-get($material, text, disabled);
20 | }
21 |
22 | &.v-text-field--solo-inverted.v-input--is-focused {
23 | .v-select__selections {
24 | color: map-deep-get($material, inputs, solo-inverted-focused-text);
25 | }
26 | }
27 | }
28 |
29 | @include theme(light, 'v-select') {
30 | @include v-select($material-light);
31 | }
32 |
33 | @include theme(dark, 'v-select') {
34 | @include v-select($material-dark);
35 | }
36 |
37 | .v-select {
38 | position: relative;
39 |
40 | > .v-input__control > .v-input__slot {
41 | cursor: pointer;
42 | }
43 |
44 | .v-chip {
45 | flex: 0 1 auto;
46 | }
47 |
48 | .fade-transition-leave-active {
49 | left: 0;
50 | position: absolute;
51 | }
52 |
53 | &.v-input--is-dirty {
54 | ::placeholder {
55 | color: transparent !important;
56 | }
57 | }
58 |
59 | &:not(.v-input--is-dirty) {
60 | &:not(.v-input--is-focused) {
61 | .v-text-field__prefix {
62 | line-height: rem(20px);
63 | position: absolute;
64 | top: rem(7px);
65 | transition: $primary-transition;
66 | }
67 | }
68 | }
69 |
70 | &.v-text-field--enclosed:not(.v-text-field--single-line) {
71 | .v-select__selections {
72 | padding-top: rem(24px);
73 | }
74 | }
75 |
76 | &.v-text-field {
77 | input {
78 | flex: 1 1; // Doesn't resize on IE11 with 3rd param
79 | margin-top: 0;
80 | min-width: 0;
81 | pointer-events: none;
82 | position: relative;
83 | }
84 | }
85 |
86 | &.v-select--is-menu-active {
87 | .v-input__icon--append .v-icon {
88 | transform: rotate(180deg);
89 | }
90 | }
91 |
92 | &.v-select--chips {
93 | input {
94 | margin: 0;
95 | }
96 |
97 | .v-select__selections {
98 | min-height: rem(42px);
99 | }
100 |
101 | &.v-select--chips--small {
102 | .v-select__selections {
103 | min-height: rem(32px);
104 | }
105 | }
106 |
107 | &:not(.v-text-field--single-line) {
108 | &.v-text-field--box,
109 | &.v-text-field--enclosed {
110 | .v-select__selections {
111 | min-height: rem(68px);
112 | }
113 |
114 | &.v-select--chips--small {
115 | .v-select__selections {
116 | min-height: rem(56px);
117 | }
118 | }
119 | }
120 | }
121 | }
122 |
123 | &.v-text-field--reverse {
124 | .v-select__slot,
125 | .v-select__selections {
126 | flex-direction: row-reverse;
127 | }
128 | }
129 |
130 | &__selections {
131 | align-items: center;
132 | display: flex;
133 | flex: 1 1 auto;
134 | flex-wrap: wrap;
135 | line-height: rem(18px);
136 | }
137 |
138 | &__selection {
139 | max-width: 90%;
140 |
141 | &--comma {
142 | align-items: center;
143 | display: inline-flex;
144 | margin: rem(7px 4px 7px 0);
145 | }
146 | }
147 |
148 | &__slot {
149 | align-items: center;
150 | display: flex;
151 | position: relative;
152 | width: 100%;
153 | }
154 |
155 | &:not(.v-text-field--single-line) {
156 | .v-select__slot {
157 | // If an input is a direct child
158 | // there is no selections div
159 | // and we must move input to
160 | // the end of the container
161 | > input {
162 | align-self: flex-end;
163 | }
164 | }
165 | }
166 | }
167 |
--------------------------------------------------------------------------------
/components/_selection-controls.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin selection-control($material) {
6 | &.v-input--is-disabled {
7 | .v-icon {
8 | // needed for helper override
9 | color: map-deep-get($material, buttons, disabled) !important;
10 | }
11 | }
12 | }
13 |
14 | @mixin v-selection-control-rtl {
15 | .v-input--selection-controls__input {
16 | margin-left: rem(8px);
17 | margin-right: 0;
18 | }
19 | }
20 |
21 | @include theme(light, 'v-input--selection-controls') {
22 | @include selection-control($material-light);
23 | }
24 |
25 | @include theme(dark, 'v-input--selection-controls') {
26 | @include selection-control($material-dark);
27 | }
28 |
29 | @include rtl('v-input--selection-controls') {
30 | @include v-selection-control-rtl;
31 | }
32 |
33 | .v-input--selection-controls {
34 | margin-top: $input-top-spacing;
35 | padding-top: rem(4px);
36 |
37 | .v-input__append-outer,
38 | .v-input__prepend-outer {
39 | margin-bottom: 0;
40 | margin-top: 0;
41 | }
42 |
43 | .v-input__control {
44 | flex-grow: 0;
45 | width: auto;
46 | }
47 |
48 | &:not(.v-input--hide-details) {
49 | .v-input__slot {
50 | margin-bottom: rem(12px);
51 | }
52 | }
53 |
54 | &__input {
55 | color: inherit;
56 | display: inline-flex;
57 | flex: 0 0 auto;
58 | height: rem(24px);
59 | margin-right: rem(8px);
60 | position: relative;
61 | transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
62 | transition-property: color, transform;
63 | user-select: none;
64 | width: rem(24px);
65 |
66 | input {
67 | cursor: pointer;
68 | height: 100%;
69 | opacity: 0;
70 | position: absolute;
71 | user-select: none;
72 | width: 100%;
73 | }
74 |
75 | // Sibling selector to avoid targeting v-radio-group's label
76 | + .v-label {
77 | cursor: pointer;
78 | user-select: none;
79 | }
80 | }
81 |
82 | &__ripple {
83 | border-radius: 50%;
84 | cursor: pointer;
85 | height: rem(34px);
86 | left: rem(-12px);
87 | margin: rem(7px);
88 | position: absolute;
89 | top: calc(50% - #{rem(24px)});
90 | transition: inherit;
91 | width: rem(34px);
92 |
93 | &::before {
94 | border-radius: inherit;
95 | bottom: 0;
96 | content: '';
97 | left: 0;
98 | opacity: 0.2;
99 | position: absolute;
100 | right: 0;
101 | top: 0;
102 | transform: scale(0.2);
103 | transform-origin: center center;
104 | transition: inherit;
105 | }
106 |
107 | .v-ripple__container {
108 | transform: scale(1.4);
109 | }
110 | }
111 |
112 | &.v-input .v-label {
113 | align-items: center;
114 | display: inline-flex;
115 | height: auto;
116 | top: 0;
117 | }
118 |
119 | &.v-input--is-focused,
120 | .v-radio--is-focused {
121 | .v-input--selection-controls__ripple::before {
122 | background: currentColor;
123 | transform: scale(0.8);
124 | }
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/components/_sheet.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | /* Themes */
5 | @mixin v-sheet($material) {
6 | background-color: map-get($material, cards);
7 | border-color: map-get($material, cards);
8 | color: map-deep-get($material, text, primary);
9 | }
10 |
11 | @include theme(light, 'v-sheet') {
12 | @include v-sheet($material-light);
13 | }
14 |
15 | @include theme(dark, 'v-sheet') {
16 | @include v-sheet($material-dark);
17 | }
18 |
19 | .v-sheet {
20 | border-radius: $sheet-border-radius;
21 | display: block;
22 | position: relative;
23 | transition: $primary-transition;
24 |
25 | &--tile {
26 | border-radius: 0;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/components/_small-dialog.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-small-dialog($material) {
5 | a {
6 | color: rgba(map-get($material, fg-color), map-get($material, primary-text-percent));
7 | }
8 | }
9 |
10 | @include theme(light, 'v-small-dialog') {
11 | @include v-small-dialog($material-light);
12 | }
13 |
14 | @include theme(dark, 'v-small-dialog') {
15 | @include v-small-dialog($material-dark);
16 | }
17 |
18 | @mixin content-actions($material) {
19 | background: map-get($material, cards);
20 | }
21 |
22 | @include theme(light, 'v-small-dialog__content') {
23 | @include content-actions($material-light);
24 | }
25 |
26 | @include theme(dark, 'v-small-dialog__content') {
27 | @include content-actions($material-dark);
28 | }
29 |
30 | @include theme(light, 'v-small-dialog__actions') {
31 | @include content-actions($material-light);
32 | }
33 |
34 | @include theme(dark, 'v-small-dialog__actions') {
35 | @include content-actions($material-dark);
36 | }
37 |
38 | .v-small-dialog {
39 | display: block;
40 | height: 100%;
41 | width: 100%;
42 |
43 | &__content {
44 | padding: rem(0 rem(24px));
45 | }
46 |
47 | &__actions {
48 | text-align: right;
49 | white-space: pre;
50 | }
51 |
52 | a {
53 | align-items: center;
54 | display: flex;
55 |
56 | height: 100%;
57 | text-decoration: none;
58 |
59 | > * {
60 | width: 100%;
61 | }
62 | }
63 |
64 | .v-menu__activator {
65 | height: 100%;
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/components/_snackbars.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | @mixin v-snack-rtl {
4 | &__content {
5 | .v-btn {
6 | margin: rem(0 24px 0 0);
7 | }
8 | }
9 | }
10 |
11 | @include rtl('v-snack') {
12 | @include v-snack-rtl;
13 | }
14 |
15 | .v-snack {
16 | align-items: center;
17 | color: $snackbar-color;
18 | display: flex;
19 | font-size: rem(14px);
20 | left: 0;
21 | pointer-events: none;
22 | position: fixed;
23 | right: 0;
24 | z-index: 1000;
25 |
26 | &--absolute {
27 | position: absolute;
28 | }
29 |
30 | &--top {
31 | top: 0;
32 | }
33 |
34 | &--bottom {
35 | bottom: 0;
36 | }
37 |
38 | &__wrapper {
39 | @include elevation(6);
40 | align-items: center;
41 | background-color: $snackbar-background-color;
42 | display: flex;
43 | pointer-events: auto;
44 | width: 100%;
45 | }
46 |
47 | &__content {
48 | align-items: center;
49 | display: flex;
50 | height: rem(48px);
51 | justify-content: space-between;
52 | overflow: hidden;
53 | padding: rem(14px 24px);
54 | width: 100%;
55 |
56 | .v-btn {
57 | color: $snackbar-color;
58 | flex: 0 0 auto;
59 | height: auto;
60 | margin: rem(0 0 0 24px);
61 | min-width: auto;
62 | padding: rem(8px);
63 | width: auto;
64 |
65 | &__content {
66 | margin: rem(-2px);
67 |
68 | &::before {
69 | display: none;
70 | }
71 | }
72 | }
73 | }
74 |
75 | &--multi-line &__content {
76 | height: rem(80px);
77 | padding: rem(24px);
78 | }
79 |
80 | &--vertical &__content {
81 | // https://stackoverflow.com/questions/35111090/text-in-a-flex-container-doesnt-wrap-in-ie11
82 | align-items: stretch;
83 | flex-direction: column;
84 | height: rem(112px);
85 | padding: rem(24px 24px 14px);
86 |
87 | .v-btn {
88 | // specificity
89 | &.v-btn {
90 | justify-content: flex-end;
91 | margin-left: 0;
92 | margin-top: rem(24px);
93 | padding: 0;
94 | }
95 |
96 | &__content {
97 | flex: 0 0 auto;
98 | margin: 0;
99 | }
100 | }
101 | }
102 |
103 | &--auto-height &__content {
104 | height: auto;
105 | }
106 | }
107 |
108 | @mixin v-snack-sm-and-up-rtl {
109 | @include breakpoint(sm-and-up) {
110 | &__content .v-btn:first-of-type {
111 | margin-left: 0;
112 | margin-right: rem(42px);
113 | }
114 | }
115 | }
116 |
117 | @include rtl('v-snack') {
118 | @include v-snack-sm-and-up-rtl;
119 | }
120 |
121 | @include breakpoint(sm-and-up) {
122 | .v-snack {
123 | &__wrapper {
124 | border-radius: rem(2px);
125 | margin: 0 auto;
126 | max-width: rem(568px);
127 | min-width: rem(288px);
128 | width: auto;
129 |
130 | .v-snack--left & {
131 | margin-left: 0;
132 | }
133 |
134 | .v-snack--right & {
135 | margin-right: 0;
136 | }
137 | }
138 |
139 | &--left,
140 | &--right {
141 | margin: 0 $snackbar-corner-offset;
142 |
143 | &.v-snack--top {
144 | transform: translateY($snackbar-corner-offset);
145 | }
146 |
147 | &.v-snack--bottom {
148 | transform: translateY(0 - $snackbar-corner-offset);
149 | }
150 | }
151 |
152 | &__content .v-btn:first-of-type {
153 | margin-left: rem(42px);
154 | }
155 | }
156 | }
157 |
158 | .v-snack-transition {
159 | &-enter-active,
160 | &-leave-active {
161 | transition: transform 0.4s map-get($transition, swing);
162 |
163 | .v-snack__content {
164 | transition: opacity 0.3s linear 0.1s;
165 | }
166 | }
167 |
168 | &-enter {
169 | .v-snack__content {
170 | opacity: 0;
171 | }
172 | }
173 |
174 | &-enter-to,
175 | &-leave {
176 | .v-snack__content {
177 | opacity: 1;
178 | }
179 | }
180 |
181 | &-enter,
182 | &-leave-to {
183 | &.v-snack.v-snack--top {
184 | // Extra 8px to hide the bottom shadow
185 | transform: translateY(calc(-100% - #{rem(8px)}));
186 | }
187 |
188 | &.v-snack.v-snack--bottom {
189 | transform: translateY(100%);
190 | }
191 | }
192 | }
193 |
--------------------------------------------------------------------------------
/components/_speed-dial.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-speed-dial {
4 | position: relative;
5 |
6 | &--absolute {
7 | position: absolute;
8 | }
9 |
10 | &--fixed {
11 | position: fixed;
12 | }
13 |
14 | &--fixed,
15 | &--absolute {
16 | z-index: 4;
17 |
18 | > .v-btn--floating {
19 | margin: 0;
20 | }
21 | }
22 |
23 | &--top {
24 | &:not(.v-speed-dial--absolute) {
25 | top: map-get($grid-gutters, lg);
26 | }
27 |
28 | &.v-speed-dial--absolute {
29 | top: 50%;
30 | transform: translateY(-50%);
31 | }
32 | }
33 |
34 | &--bottom {
35 | &:not(.v-speed-dial--absolute) {
36 | bottom: map-get($grid-gutters, lg);
37 | }
38 |
39 | &.v-speed-dial--absolute {
40 | bottom: 50%;
41 | transform: translateY(50%);
42 | }
43 | }
44 |
45 | &--left {
46 | left: map-get($grid-gutters, lg);
47 | }
48 |
49 | &--right {
50 | right: map-get($grid-gutters, lg);
51 | }
52 |
53 | &--direction {
54 | &-left,
55 | &-right {
56 | .v-speed-dial__list {
57 | height: 100%;
58 | top: 0;
59 | }
60 | }
61 |
62 | &-top,
63 | &-bottom {
64 | .v-speed-dial__list {
65 | left: 0;
66 | width: 100%;
67 | }
68 | }
69 |
70 | &-top {
71 | .v-speed-dial__list {
72 | bottom: 100%;
73 | flex-direction: column-reverse;
74 | }
75 | }
76 |
77 | &-right {
78 | .v-speed-dial__list {
79 | flex-direction: row;
80 | left: 100%;
81 | }
82 | }
83 |
84 | &-bottom {
85 | .v-speed-dial__list {
86 | flex-direction: column;
87 | top: 100%;
88 | }
89 | }
90 |
91 | &-left {
92 | .v-speed-dial__list {
93 | flex-direction: row-reverse;
94 | right: 100%;
95 | }
96 | }
97 | }
98 | }
99 |
100 | // Elements
101 | .v-speed-dial__list {
102 | align-items: center;
103 | display: flex;
104 | justify-content: center;
105 | position: absolute;
106 |
107 | .v-btn {
108 | @for $n from 1 through 7 {
109 | &:nth-child(#{$n}) {
110 | transition-delay: #{$n * 0.05}s;
111 | }
112 | }
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/components/_steppers.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-stepper($material) {
5 | background: map-get($material, bg-color);
6 |
7 | .v-stepper__step {
8 | &:not(.v-stepper__step--active) {
9 | &:not(.v-stepper__step--complete) {
10 | &:not(.v-stepper__step--error) {
11 | .v-stepper__step__step {
12 | background: rgba(
13 | map-get($material, fg-color),
14 | map-get($material, disabledORhints-text-percent)
15 | );
16 | }
17 | }
18 | }
19 | }
20 |
21 | &__step {
22 | color: map-deep-get($material, stepper, active);
23 |
24 | .v-icon {
25 | color: map-deep-get($material, stepper, active);
26 | }
27 | }
28 |
29 | &--active {
30 | .v-stepper__label {
31 | text-shadow: 0 0 0 rgba(map-get($material, fg-color), 1);
32 | }
33 | }
34 |
35 | &--editable:hover {
36 | background: rgba(map-get($material, fg-color), 0.06);
37 |
38 | .v-stepper__label {
39 | text-shadow: 0 0 0 rgba(map-get($material, fg-color), 1);
40 | }
41 | }
42 |
43 | &--complete {
44 | .v-stepper__label {
45 | color: map-deep-get($material, stepper, completed);
46 | }
47 | }
48 |
49 | &--inactive {
50 | &.v-stepper__step--editable:not(.v-stepper__step--error) {
51 | &:hover {
52 | .v-stepper__step__step {
53 | background: map-deep-get($material, stepper, hover);
54 | }
55 | }
56 | }
57 | }
58 | }
59 |
60 | .v-stepper__header {
61 | .v-divider {
62 | border-color: rgba(map-get($material, fg-color), map-get($material, divider-percent));
63 | }
64 | }
65 |
66 | .v-stepper__label {
67 | color: rgba(map-get($material, fg-color), map-get($material, disabledORhints-text-percent));
68 |
69 | small {
70 | color: rgba(map-get($material, fg-color), map-get($material, secondary-text-percent));
71 | }
72 | }
73 |
74 | &--non-linear {
75 | .v-stepper__step:not(.v-stepper__step--complete):not(.v-stepper__step--error) {
76 | .v-stepper__label {
77 | color: rgba(
78 | map-get($material, fg-color),
79 | map-get($material, secondary-text-percent)
80 | );
81 | }
82 | }
83 | }
84 |
85 | &--vertical {
86 | .v-stepper__content:not(:last-child) {
87 | border-left: rem(1px) solid
88 | rgba(map-get($material, fg-color), map-get($material, divider-percent));
89 | }
90 | }
91 | }
92 |
93 | @mixin v-stepper-rtl() {
94 | .v-stepper__step__step {
95 | margin-left: rem(12px);
96 | margin-right: 0;
97 | }
98 | }
99 |
100 | @include theme(light, 'v-stepper') {
101 | @include v-stepper($material-light);
102 | }
103 |
104 | @include theme(dark, 'v-stepper') {
105 | @include v-stepper($material-dark);
106 | }
107 |
108 | @include rtl('v-stepper') {
109 | @include v-stepper-rtl;
110 | }
111 |
112 | .v-stepper {
113 | @include elevation(2);
114 | overflow: hidden;
115 | position: relative;
116 |
117 | &__header {
118 | @include elevation(2);
119 | align-items: stretch;
120 | display: flex;
121 | flex-wrap: wrap;
122 | height: rem(72px);
123 | justify-content: space-between;
124 |
125 | .v-divider {
126 | align-self: center;
127 | margin: rem(0 -16px);
128 | }
129 | }
130 |
131 | &__items {
132 | overflow: hidden;
133 | position: relative;
134 | }
135 |
136 | &__step__step {
137 | align-items: center;
138 | border-radius: 50%;
139 | display: inline-flex;
140 | font-size: rem(12px);
141 | height: rem(24px);
142 | justify-content: center;
143 | margin-right: rem(8px);
144 | min-width: rem(24px);
145 | transition: 0.3s map-get($transition, fast-in-fast-out);
146 | width: rem(24px);
147 |
148 | .v-icon {
149 | font-size: rem(18px);
150 | }
151 | }
152 |
153 | &__step {
154 | align-items: center;
155 | display: flex;
156 | flex-direction: row;
157 | padding: rem(24px);
158 | position: relative;
159 |
160 | &--active {
161 | .v-stepper__label {
162 | transition: 0.3s map-get($transition, ease-in-out);
163 | }
164 | }
165 |
166 | &--editable {
167 | cursor: pointer;
168 | }
169 |
170 | &.v-stepper__step--error {
171 | .v-stepper__step__step {
172 | background: transparent;
173 | color: inherit;
174 |
175 | .v-icon {
176 | color: inherit;
177 | font-size: rem(24px);
178 | }
179 | }
180 |
181 | .v-stepper__label {
182 | color: inherit;
183 | font-weight: font-weight(medium);
184 | text-shadow: none;
185 |
186 | small {
187 | color: inherit;
188 | }
189 | }
190 | }
191 | }
192 |
193 | &__label {
194 | align-items: flex-start;
195 | display: flex;
196 | flex-direction: column;
197 | text-align: left;
198 |
199 | small {
200 | font-size: rem(12px);
201 | font-weight: font-weight(light);
202 | text-shadow: none;
203 | }
204 | }
205 |
206 | &__wrapper {
207 | overflow: hidden;
208 | transition: none;
209 | }
210 |
211 | &__content {
212 | flex: 1 0 auto;
213 | padding: rem(24px 24px 16px);
214 | top: 0;
215 | // Chrome has an issue with overflow hidden for rendering
216 | // Originally used translateZ but this messes up fixed
217 | // elements within the stepper
218 | // Fix for #512 and #620
219 | // overflow: hidden
220 | width: 100%;
221 |
222 | > .v-btn {
223 | margin: rem(24px 8px 8px 0);
224 | }
225 | }
226 |
227 | &--is-booted {
228 | .v-stepper__content,
229 | .v-stepper__wrapper {
230 | transition: 0.3s map-get($transition, swing);
231 | }
232 | }
233 |
234 | &--vertical {
235 | padding-bottom: rem(36px);
236 |
237 | .v-stepper__content {
238 | margin: rem(-8px -36px -16px 36px);
239 | padding: rem(16px 60px 16px 23px);
240 | width: auto;
241 | }
242 |
243 | .v-stepper__step {
244 | padding: rem(24px 24px 16px);
245 | }
246 |
247 | .v-stepper__step__step {
248 | margin-right: rem(12px);
249 | }
250 | }
251 |
252 | &--alt-labels {
253 | .v-stepper__header {
254 | height: auto;
255 |
256 | .v-divider {
257 | align-self: flex-start;
258 | margin: rem(35px -67px 0);
259 | }
260 | }
261 |
262 | .v-stepper__step {
263 | align-items: center;
264 | flex-basis: rem(175px);
265 | flex-direction: column;
266 | justify-content: flex-start;
267 |
268 | small {
269 | align-self: center;
270 | }
271 | }
272 |
273 | .v-stepper__step__step {
274 | margin-bottom: rem(11px);
275 | margin-right: 0;
276 | }
277 | }
278 | }
279 |
280 | @include breakpoint(sm-and-down) {
281 | .v-stepper:not(.v-stepper--vertical) {
282 | .v-stepper__label {
283 | display: none;
284 | }
285 |
286 | .v-stepper__step__step {
287 | margin-right: 0;
288 | }
289 | }
290 | }
291 |
--------------------------------------------------------------------------------
/components/_subheaders.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-subheader($material) {
5 | color: map-deep-get($material, text, secondary);
6 | }
7 |
8 | @include theme(light, 'v-subheader') {
9 | @include v-subheader($material-light);
10 | }
11 |
12 | @include theme(dark, 'v-subheader') {
13 | @include v-subheader($material-dark);
14 | }
15 |
16 | .v-subheader {
17 | align-items: center;
18 | display: flex;
19 | font-size: map-deep-get($headings, body-2, size);
20 | font-weight: map-deep-get($headings, body-2, weight);
21 | height: $list-item-single-height;
22 | padding: 0 $list-right-padding 0 $list-left-padding;
23 |
24 | &--inset {
25 | margin-left: $subheader-inset-margin;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/components/_switch.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-input--switch($material) {
6 | &__thumb {
7 | color: map-deep-get($material, selection-controls, thumb, inactive);
8 | }
9 |
10 | &__track {
11 | color: map-deep-get($material, selection-controls, track, inactive);
12 | }
13 |
14 | &.v-input--is-disabled {
15 | .v-input--switch__thumb {
16 | color: map-deep-get($material, selection-controls, thumb, disabled) !important;
17 | }
18 |
19 | .v-input--switch__track {
20 | color: map-deep-get($material, selection-controls, track, disabled) !important;
21 | }
22 | }
23 | }
24 |
25 | @mixin v-input--switch-rtl() {
26 | .v-input--selection-controls__ripple {
27 | left: auto;
28 | right: rem(-14px);
29 | }
30 |
31 | &.v-input--is-dirty {
32 | .v-input--selection-controls__ripple,
33 | .v-input--switch__thumb {
34 | transform: translate(rem(-16px), 0);
35 | }
36 | }
37 | }
38 |
39 | @include theme(light, 'v-input--switch') {
40 | @include v-input--switch($material-light);
41 | }
42 |
43 | @include theme(dark, 'v-input--switch') {
44 | @include v-input--switch($material-dark);
45 | }
46 |
47 | @include rtl('v-input--switch') {
48 | @include v-input--switch-rtl;
49 | }
50 |
51 | .v-input--switch {
52 | &__track,
53 | &__thumb {
54 | background-color: currentColor;
55 | pointer-events: none;
56 | transition: inherit;
57 | }
58 |
59 | &__track {
60 | border-radius: rem(8px);
61 | height: rem(14px);
62 | left: rem(2px);
63 | opacity: 0.6;
64 | position: absolute;
65 | right: rem(2px);
66 | top: calc(50% - #{rem(7px)});
67 | }
68 |
69 | &__thumb {
70 | @include elevation(4);
71 | align-items: center;
72 | border-radius: 50%;
73 | display: flex;
74 | height: rem(20px);
75 | justify-content: center;
76 | position: relative;
77 | top: calc(50% - #{rem(10px)});
78 | width: rem(20px);
79 | }
80 |
81 | .v-input--selection-controls__input {
82 | width: rem(38px);
83 | }
84 |
85 | .v-input--selection-controls__ripple {
86 | left: rem(-14px);
87 | top: calc(50% - #{rem(24px)});
88 | }
89 |
90 | &.v-input--is-dirty {
91 | .v-input--selection-controls__ripple,
92 | .v-input--switch__thumb {
93 | transform: translate(rem(16px), 0);
94 | }
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/components/_system-bars.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-system-bar($material) {
6 | background-color: map-deep-get($material, status-bar, regular);
7 | color: map-deep-get($material, text, secondary);
8 |
9 | .v-icon {
10 | color: map-deep-get($material, text, secondary);
11 | }
12 |
13 | &--lights-out {
14 | background-color: map-deep-get($material, status-bar, lights-out) !important;
15 | }
16 | }
17 |
18 | @include theme(light, 'v-system-bar') {
19 | @include v-system-bar($material-light);
20 | }
21 |
22 | @include theme(dark, 'v-system-bar') {
23 | @include v-system-bar($material-dark);
24 | }
25 |
26 | .v-system-bar {
27 | align-items: center;
28 | display: flex;
29 | font-size: map-deep-get($headings, body-2, size);
30 | font-weight: map-deep-get($headings, body-2, weight);
31 | padding: rem(0 8px);
32 |
33 | .v-icon {
34 | font-size: map-deep-get($headings, subheading, size);
35 | }
36 |
37 | &--fixed,
38 | &--absolute {
39 | left: 0;
40 | top: 0;
41 | width: 100%;
42 | z-index: 3;
43 | }
44 |
45 | &--fixed {
46 | position: fixed;
47 | }
48 |
49 | &--absolute {
50 | position: absolute;
51 | }
52 |
53 | &--status {
54 | .v-icon {
55 | margin-right: rem(4px);
56 | }
57 | }
58 |
59 | &--window {
60 | .v-icon {
61 | font-size: map-deep-get($headings, h6, size);
62 | margin-right: rem(8px);
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/components/_tables.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-table($material) {
6 | background-color: map-get($material, cards);
7 | color: map-deep-get($material, text, primary);
8 |
9 | thead {
10 | tr {
11 | &:first-child {
12 | border-bottom: rem(1px) solid
13 | rgba(map-get($material, fg-color), map-get($material, divider-percent));
14 | }
15 | }
16 |
17 | th {
18 | color: rgba(map-get($material, text-color), map-get($material, secondary-text-percent));
19 | }
20 | }
21 |
22 | tbody {
23 | tr {
24 | &:not(:last-child) {
25 | border-bottom: rem(1px) solid
26 | rgba(map-get($material, fg-color), map-get($material, divider-percent));
27 | }
28 |
29 | &[active] {
30 | background: map-deep-get($material, table, active);
31 | }
32 |
33 | &:hover:not(.v-datatable__expand-row) {
34 | background: map-deep-get($material, table, hover);
35 | }
36 | }
37 | }
38 |
39 | tfoot {
40 | tr {
41 | border-top: rem(1px) solid
42 | rgba(map-get($material, fg-color), map-get($material, divider-percent));
43 | }
44 | }
45 | }
46 |
47 | @include theme(light, 'v-table') {
48 | @include v-table($material-light);
49 | }
50 |
51 | @include theme(dark, 'v-table') {
52 | @include v-table($material-dark);
53 | }
54 |
55 | .v-table {
56 | &__overflow {
57 | overflow-x: auto;
58 | overflow-y: hidden;
59 | width: 100%;
60 | }
61 | }
62 |
63 | table.v-table {
64 | border-collapse: collapse;
65 | border-radius: rem(2px);
66 | border-spacing: 0;
67 | max-width: 100%;
68 | width: 100%;
69 |
70 | thead,
71 | tbody {
72 | td,
73 | th {
74 | &:not(:nth-child(1)),
75 | &:first-child {
76 | padding: rem(0 24px);
77 | }
78 | }
79 | }
80 |
81 | thead {
82 | tr {
83 | height: rem(56px);
84 | }
85 |
86 | th {
87 | font-size: rem(12px);
88 | font-weight: font-weight(medium);
89 | transition: 0.3s map-get($transition, swing);
90 | user-select: none;
91 | white-space: nowrap;
92 |
93 | &.sortable {
94 | pointer-events: auto;
95 | }
96 |
97 | > div {
98 | width: 100%;
99 | }
100 | }
101 | }
102 |
103 | tbody {
104 | tr {
105 | transition: background $primary-transition;
106 | will-change: background;
107 | }
108 |
109 | td,
110 | th {
111 | height: rem(48px);
112 | }
113 |
114 | td {
115 | font-size: rem(13px);
116 | font-weight: font-weight(regular);
117 | }
118 | }
119 |
120 | .v-input--selection-controls {
121 | padding: 0;
122 |
123 | .v-input__details {
124 | display: none;
125 | }
126 |
127 | &.checkbox {
128 | .v-icon {
129 | left: 50%;
130 | transform: translateX(-50%);
131 | }
132 |
133 | .v-input--selection-controls__ripple {
134 | left: 50%;
135 | transform: translate(-50%, -50%);
136 | }
137 | }
138 | }
139 |
140 | tfoot {
141 | tr {
142 | height: rem(48px);
143 |
144 | td {
145 | padding: rem(0 24px);
146 | }
147 | }
148 | }
149 | }
150 |
--------------------------------------------------------------------------------
/components/_tabs.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-tabs__bar($material) {
6 | background-color: map-get($material, cards);
7 |
8 | .v-tabs__div {
9 | color: map-deep-get($material, tabs, active);
10 | }
11 |
12 | .v-tabs__item--disabled {
13 | color: map-deep-get($material, buttons, disabled);
14 | }
15 | }
16 |
17 | @include theme(light, 'v-tabs__bar') {
18 | @include v-tabs__bar($material-light);
19 | }
20 |
21 | @include theme(dark, 'v-tabs__bar') {
22 | @include v-tabs__bar($material-dark);
23 | }
24 |
25 | .v-tabs {
26 | position: relative;
27 | }
28 |
29 | .v-tabs__bar {
30 | border-radius: inherit;
31 | position: relative;
32 | }
33 |
34 | .v-tabs__icon {
35 | align-items: center;
36 | cursor: pointer;
37 | display: inline-flex;
38 | height: 100%;
39 | position: absolute;
40 | top: 0;
41 | user-select: none;
42 | width: rem(32px);
43 |
44 | &--prev {
45 | left: rem(4px);
46 | }
47 |
48 | &--next {
49 | right: rem(4px);
50 | }
51 | }
52 |
53 | .v-tabs__wrapper {
54 | contain: content;
55 | display: flex;
56 | overflow: hidden;
57 |
58 | &--show-arrows {
59 | margin-left: rem(40px);
60 | margin-right: rem(40px);
61 |
62 | .v-tabs__container--align-with-title {
63 | padding-left: rem(16px);
64 |
65 | @include breakpoint(xs-only) {
66 | padding-left: rem(24px);
67 | }
68 | }
69 | }
70 | }
71 |
72 | .v-tabs__container {
73 | display: flex;
74 | flex: 1 0 auto;
75 | height: rem(48px);
76 | list-style-type: none;
77 | position: relative;
78 | transition: transform 0.6s cubic-bezier(0.86, 0, 0.07, 1);
79 | white-space: nowrap;
80 |
81 | &--overflow {
82 | .v-tabs__div {
83 | flex: 1 0 auto;
84 | }
85 | }
86 |
87 | &--grow {
88 | .v-tabs__div {
89 | flex: 1 0 auto;
90 | max-width: none;
91 | }
92 | }
93 |
94 | &--icons-and-text {
95 | height: rem(72px);
96 |
97 | .v-tabs__item {
98 | flex-direction: column-reverse;
99 |
100 | .v-icon {
101 | margin-bottom: rem(6px);
102 | }
103 | }
104 | }
105 |
106 | &--align-with-title {
107 | padding-left: rem(56px);
108 | }
109 |
110 | &--fixed-tabs,
111 | &--icons-and-text {
112 | .v-tabs__div {
113 | min-width: rem(72px);
114 |
115 | @include breakpoint(sm-and-up) {
116 | min-width: rem(160px);
117 | }
118 | }
119 | }
120 |
121 | &--fixed-tabs {
122 | .v-tabs__div {
123 | @include breakpoint(xs-only) {
124 | flex: 1 0 auto;
125 | }
126 | }
127 | }
128 |
129 | &--centered,
130 | &--fixed-tabs,
131 | &--right {
132 | > .v-tabs__div:first-child {
133 | margin-left: auto;
134 | }
135 |
136 | .v-tabs__slider-wrapper + .v-tabs__div {
137 | margin-left: auto;
138 | }
139 | }
140 |
141 | &--centered,
142 | &--fixed-tabs {
143 | > .v-tabs__div:last-child {
144 | margin-right: auto;
145 | }
146 | }
147 | }
148 |
149 | .v-tabs__div {
150 | align-items: center;
151 | display: inline-flex;
152 | flex: 0 1 auto;
153 | font-size: rem(14px);
154 | font-weight: font-weight(medium);
155 | height: inherit;
156 | line-height: normal;
157 | max-width: rem(264px);
158 | text-align: center;
159 | text-transform: $tab-text-transform;
160 | vertical-align: middle;
161 | }
162 |
163 | .v-tabs__item {
164 | align-items: center;
165 | color: inherit;
166 | display: flex;
167 | flex: 1 1 auto;
168 | height: 100%;
169 | justify-content: center;
170 | max-width: inherit;
171 | padding: rem(6px 12px);
172 | text-decoration: none;
173 | transition: $primary-transition;
174 | user-select: none;
175 | white-space: normal;
176 |
177 | &:not(.v-tabs__item--active) {
178 | opacity: 0.7;
179 | }
180 |
181 | &--disabled {
182 | pointer-events: none;
183 | }
184 | }
185 |
186 | .v-tabs__slider {
187 | height: rem(2px);
188 | width: 100%;
189 |
190 | &-wrapper {
191 | bottom: 0;
192 | margin: 0 !important;
193 | position: absolute;
194 | transition: $primary-transition;
195 | }
196 | }
197 |
--------------------------------------------------------------------------------
/components/_textarea.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-textarea($material) {
5 | &.v-text-field--solo-inverted.v-text-field--solo {
6 | &.v-input--is-focused {
7 | textarea {
8 | color: map-deep-get($material, inputs, solo-inverted-focused-text);
9 | }
10 | }
11 | }
12 | }
13 |
14 | @mixin v-textarea-rtl {
15 | &.v-text-field--enclosed {
16 | .v-text-field__slot {
17 | margin-left: rem(-12px);
18 | margin-right: 0;
19 |
20 | textarea {
21 | padding-left: rem(12px);
22 | padding-right: 0;
23 | }
24 | }
25 | }
26 | }
27 |
28 | @include theme(light, 'v-textarea') {
29 | @include v-textarea($material-light);
30 | }
31 |
32 | @include theme(dark, 'v-textarea') {
33 | @include v-textarea($material-dark);
34 | }
35 |
36 | @include rtl('v-textarea') {
37 | @include v-textarea-rtl;
38 | }
39 |
40 | .v-textarea {
41 | textarea {
42 | flex: 1 1 auto;
43 | line-height: rem(18px);
44 | max-width: 100%;
45 | min-height: rem(32px);
46 | outline: none;
47 | padding: rem(7px 0 8px);
48 | width: 100%;
49 | }
50 |
51 | .v-text-field__prefix {
52 | align-self: start;
53 | padding-top: rem(4px);
54 | }
55 |
56 | &.v-text-field--full-width,
57 | &.v-text-field--full-width.v-text-field--single-line {
58 | .v-text-field__slot {
59 | textarea {
60 | margin-top: 0;
61 | }
62 | }
63 |
64 | .v-text-field__details {
65 | bottom: rem(4px);
66 | }
67 | }
68 |
69 | &.v-text-field--enclosed {
70 | .v-text-field__slot {
71 | margin-right: rem(-12px);
72 |
73 | textarea {
74 | padding-right: rem(12px);
75 | }
76 | }
77 | }
78 |
79 | &.v-text-field--box,
80 | &.v-text-field--enclosed {
81 | .v-text-field__prefix,
82 | textarea {
83 | margin-top: rem(24px);
84 | }
85 |
86 | &.v-text-field--single-line {
87 | .v-text-field__prefix,
88 | textarea {
89 | margin-top: rem(12px);
90 | }
91 |
92 | .v-label {
93 | top: rem(18px);
94 | }
95 |
96 | &.v-text-field--outline {
97 | .v-input__control {
98 | padding-top: 0;
99 | }
100 | }
101 | }
102 | }
103 |
104 | &.v-text-field--solo {
105 | align-items: flex-start;
106 |
107 | // Essentially revert styles
108 | // applied by v-text-field
109 | .v-input__prepend-inner,
110 | .v-input__prepend-outer,
111 | .v-input__append-inner,
112 | .v-input__append-outer {
113 | align-self: flex-start;
114 | margin-top: rem(16px);
115 | }
116 | }
117 |
118 | &--auto-grow {
119 | textarea {
120 | overflow: hidden;
121 | }
122 | }
123 |
124 | &--no-resize {
125 | textarea {
126 | resize: none;
127 | }
128 | }
129 | }
130 |
--------------------------------------------------------------------------------
/components/_time-picker-clock.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-time-picker-clock($material) {
6 | background: map-deep-get($material, picker, clock);
7 |
8 | .v-time-picker-clock__item--disabled {
9 | color: map-deep-get($material, buttons, disabled);
10 |
11 | &.v-time-picker-clock__item--active {
12 | color: map-deep-get($material-dark, buttons, disabled);
13 | }
14 | }
15 |
16 | &--indeterminate {
17 | .v-time-picker-clock__hand {
18 | background-color: map-deep-get($material, picker, indeterminateTime);
19 |
20 | &::after {
21 | color: map-deep-get($material, picker, indeterminateTime);
22 | }
23 | }
24 |
25 | .v-time-picker-clock__item--active {
26 | background-color: map-deep-get($material, picker, indeterminateTime);
27 | }
28 | }
29 | }
30 |
31 | @include theme(light, 'v-time-picker-clock') {
32 | @include v-time-picker-clock($material-light);
33 | }
34 |
35 | @include theme(dark, 'v-time-picker-clock') {
36 | @include v-time-picker-clock($material-dark);
37 | }
38 |
39 | .v-time-picker-clock {
40 | border-radius: 100%;
41 | padding-top: 100%;
42 | position: relative;
43 | transition: $primary-transition;
44 | user-select: none;
45 | width: 100%;
46 |
47 | &__container {
48 | align-items: center;
49 | display: flex;
50 | justify-content: center;
51 | padding: rem(10px);
52 | }
53 |
54 | &__hand {
55 | bottom: 50%;
56 | height: calc(50% - #{rem(4px)});
57 | left: calc(50% - #{rem(1px)});
58 | position: absolute;
59 | transform-origin: center bottom;
60 | width: rem(2px);
61 | will-change: transform;
62 | z-index: 1;
63 |
64 | &::before {
65 | background: transparent;
66 | border-color: inherit;
67 | border-radius: 100%;
68 | border-style: solid;
69 | border-width: rem(2px);
70 | content: '';
71 | height: rem(10px);
72 | left: 50%;
73 | position: absolute;
74 | top: rem(-4px);
75 | transform: translate(-50%, -50%);
76 | width: rem(10px);
77 | }
78 |
79 | &::after {
80 | background-color: inherit;
81 | border-color: inherit;
82 | border-radius: 100%;
83 | border-style: solid;
84 | content: '';
85 | height: rem(8px);
86 | left: 50%;
87 | position: absolute;
88 | top: 100%;
89 | transform: translate(-50%, -50%);
90 | width: rem(8px);
91 | }
92 |
93 | &--inner::after {
94 | height: rem(14px);
95 | }
96 | }
97 | }
98 |
99 | .v-picker--full-width {
100 | .v-time-picker-clock__container {
101 | max-width: rem(290px);
102 | }
103 | }
104 |
105 | .v-time-picker-clock__inner {
106 | bottom: rem(27px);
107 | left: rem(27px);
108 | position: absolute;
109 | right: rem(27px);
110 | top: rem(27px);
111 | }
112 |
113 | .v-time-picker-clock__item {
114 | align-items: center;
115 | border-radius: 100%;
116 | cursor: default;
117 | display: flex;
118 | font-size: $time-picker-number-font-size;
119 | height: $time-picker-indicator-size;
120 | justify-content: center;
121 | position: absolute;
122 | text-align: center;
123 | transform: translate(-50%, -50%);
124 | user-select: none;
125 | width: $time-picker-indicator-size;
126 |
127 | > span {
128 | z-index: 1;
129 | }
130 |
131 | &::before,
132 | &::after {
133 | border-radius: 100%;
134 | content: '';
135 | // height: rem(14px);
136 | height: $time-picker-indicator-size;
137 | left: 50%;
138 | position: absolute;
139 | top: 50%;
140 | transform: translate(-50%, -50%);
141 | // width: rem(14px);
142 | width: $time-picker-indicator-size;
143 | }
144 |
145 | &--active {
146 | color: #ffffff;
147 | cursor: default;
148 | z-index: 2;
149 | }
150 |
151 | &--disabled {
152 | pointer-events: none;
153 | }
154 | }
155 |
--------------------------------------------------------------------------------
/components/_time-picker-title.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-time-picker-title {
4 | color: #ffffff;
5 | display: flex;
6 | justify-content: flex-end;
7 | line-height: 1;
8 | }
9 |
10 | .v-time-picker-title__time {
11 | white-space: nowrap;
12 |
13 | .v-picker__title__btn,
14 | span {
15 | align-items: center;
16 | display: inline-flex;
17 | font-size: rem(70px);
18 | height: rem(70px);
19 | justify-content: center;
20 | }
21 | }
22 |
23 | .v-time-picker-title__ampm {
24 | align-self: flex-end;
25 | display: flex;
26 | flex-direction: column;
27 | font-size: rem(16px);
28 | margin: rem(8px 0 6px 8px);
29 | text-transform: uppercase;
30 |
31 | div:only-child {
32 | flex-direction: row;
33 | }
34 | }
35 |
36 | .v-picker__title--landscape {
37 | .v-time-picker-title {
38 | flex-direction: column;
39 | height: 100%;
40 | justify-content: center;
41 | }
42 |
43 | .v-time-picker-title__time {
44 | text-align: right;
45 |
46 | .v-picker__title__btn,
47 | span {
48 | font-size: rem(55px);
49 | height: rem(55px);
50 | }
51 | }
52 |
53 | .v-time-picker-title__ampm {
54 | align-self: initial;
55 | margin: rem(16px 0 0);
56 | text-align: center;
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/components/_timeline.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | @mixin v-timeline($material) {
5 | &::before {
6 | background: map-get($material, dividers);
7 |
8 | .v-timeline-item {
9 | &__dot {
10 | background: map-get($material, cards);
11 |
12 | .v-card {
13 | &::before {
14 | border-right-color: $shadow-key-ambient-opacity;
15 | }
16 | }
17 | }
18 | }
19 | }
20 | }
21 |
22 | @include theme(light, 'v-timeline') {
23 | @include v-timeline($material-light);
24 | }
25 |
26 | @include theme(dark, 'v-timeline') {
27 | @include v-timeline($material-dark);
28 | }
29 |
30 | @mixin timeline-dots($dot-size, $inner-dot-size, $inner-dot-margin) {
31 | height: $dot-size;
32 | left: calc(50% - #{$dot-size / 2});
33 | width: $dot-size;
34 |
35 | .v-timeline-item__inner-dot {
36 | height: $inner-dot-size;
37 | margin: $inner-dot-margin;
38 | width: $inner-dot-size;
39 | }
40 | }
41 |
42 | .v-timeline-item {
43 | display: flex;
44 | flex-direction: row-reverse;
45 | padding-bottom: rem(24px);
46 |
47 | &:nth-child(odd):not(.v-timeline-item--right),
48 | &--left {
49 | flex-direction: row;
50 |
51 | .v-card::before,
52 | .v-card::after {
53 | left: 100%;
54 | transform: rotate(180deg);
55 | }
56 |
57 | .v-timeline-item__opposite {
58 | margin-left: rem(96px);
59 | text-align: left;
60 |
61 | .v-card::before,
62 | .v-card::after {
63 | left: rem(-10px);
64 | transform: rotate(0);
65 | }
66 | }
67 | }
68 |
69 | &:nth-child(even):not(.v-timeline-item--left),
70 | &--right {
71 | .v-card::before,
72 | .v-card::after {
73 | right: 100%;
74 | }
75 |
76 | .v-timeline-item__opposite {
77 | margin-right: rem(96px);
78 | text-align: right;
79 |
80 | .v-card::before,
81 | .v-card::after {
82 | right: rem(-10px);
83 | transform: rotate(180deg);
84 | }
85 | }
86 | }
87 |
88 | &__dot,
89 | &__inner-dot {
90 | border-radius: 50%;
91 | }
92 |
93 | &__dot {
94 | @include elevation(1);
95 | @include timeline-dots(
96 | $timeline-dot-regular-size,
97 | $timeline-inner-dot-regular-size,
98 | $timeline-inner-dot-regular-margin
99 | );
100 | align-self: center;
101 | position: absolute;
102 |
103 | &--small {
104 | @include timeline-dots(
105 | $timeline-dot-small-size,
106 | $timeline-inner-dot-small-size,
107 | $timeline-inner-dot-small-margin
108 | );
109 | }
110 |
111 | &--large {
112 | @include timeline-dots(
113 | $timeline-dot-large-size,
114 | $timeline-inner-dot-large-size,
115 | $timeline-inner-dot-large-margin
116 | );
117 | }
118 | }
119 |
120 | &__inner-dot {
121 | align-items: center;
122 | display: flex;
123 | justify-content: center;
124 | }
125 |
126 | &__body {
127 | flex: 1 1 100%;
128 | height: 100%;
129 | max-width: calc(50% - #{rem(48px)});
130 | position: relative;
131 | }
132 |
133 | .v-card {
134 | &::before,
135 | &::after {
136 | border-bottom: $timeline-wedge-size solid transparent;
137 | border-right: $timeline-wedge-size solid #000000;
138 | border-top: $timeline-wedge-size solid transparent;
139 | content: '';
140 | position: absolute;
141 | top: calc(50% - #{$timeline-wedge-size});
142 | }
143 |
144 | &::after {
145 | border-right-color: inherit;
146 | }
147 |
148 | &::before {
149 | top: calc(50% - #{$timeline-wedge-size} + #{rem(2px)});
150 | }
151 | }
152 |
153 | &__opposite {
154 | align-self: center;
155 | flex: 1 1 auto;
156 | max-width: calc(50% - #{rem(48px)});
157 | }
158 |
159 | &--fill-dot {
160 | .v-timeline-item__inner-dot {
161 | height: inherit;
162 | margin: 0;
163 | width: inherit;
164 | }
165 | }
166 | }
167 |
168 | .v-timeline {
169 | padding-top: rem(24px);
170 | position: relative;
171 |
172 | &::before {
173 | bottom: 0;
174 | content: '';
175 | height: 100%;
176 | left: calc(50% - #{rem(1px)});
177 | position: absolute;
178 | top: 0;
179 | width: rem(2px);
180 | }
181 |
182 | &--align-top {
183 | .v-timeline-item {
184 | position: relative;
185 |
186 | &__dot {
187 | top: rem(6px);
188 |
189 | &--small {
190 | top: rem(12px);
191 | }
192 |
193 | &--large {
194 | top: 0;
195 | }
196 | }
197 |
198 | .v-card {
199 | &::before {
200 | top: calc(0% + #{$timeline-wedge-size} + #{rem(2px)});
201 | }
202 |
203 | &::after {
204 | top: calc(0% + #{$timeline-wedge-size});
205 | }
206 | }
207 | }
208 | }
209 |
210 | &--dense {
211 | &::before {
212 | left: rem(18px); // -1 for line width
213 | }
214 |
215 | .v-timeline-item {
216 | &:nth-child(odd):not(.v-timeline-item--right),
217 | &--left {
218 | flex-direction: row-reverse;
219 |
220 | .v-card {
221 | &::before,
222 | &::after {
223 | left: -$timeline-wedge-size;
224 | right: initial;
225 | transform: none;
226 | }
227 | }
228 | }
229 |
230 | &__dot {
231 | left: 0;
232 | }
233 |
234 | &__dot--small {
235 | left: rem(7px); // -1 for line width
236 | }
237 |
238 | &__dot--large {
239 | left: rem(-7px);
240 | }
241 |
242 | &__body {
243 | max-width: calc(100% - #{rem(64px)});
244 | }
245 |
246 | &__opposite {
247 | display: none;
248 | }
249 | }
250 | }
251 | }
252 |
--------------------------------------------------------------------------------
/components/_toolbar.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-toolbar($material) {
6 | background-color: map-get($material, app-bar);
7 | color: map-deep-get($material, text, primary);
8 | }
9 |
10 | @mixin v-toolbar-rtl {
11 | &__title {
12 | &:not(:first-child) {
13 | margin-left: 0;
14 | margin-right: rem(20px);
15 | }
16 | }
17 | }
18 |
19 | @include theme(light, 'v-toolbar') {
20 | @include v-toolbar($material-light);
21 | }
22 |
23 | @include theme(dark, 'v-toolbar') {
24 | @include v-toolbar($material-dark);
25 | }
26 |
27 | @include rtl('v-toolbar') {
28 | @include v-toolbar-rtl;
29 | }
30 |
31 | @mixin v-toolbar-content($direction) {
32 | &.v-btn--icon {
33 | margin-#{$direction}: rem(-6px);
34 | }
35 |
36 | &.v-menu .v-menu__activator,
37 | &.v-tooltip span {
38 | .v-btn {
39 | margin-#{$direction}: 0;
40 | }
41 |
42 | .v-btn--icon {
43 | margin-#{$direction}: rem(-6px);
44 | }
45 | }
46 | margin-#{$direction}: 0;
47 | }
48 |
49 | .v-toolbar {
50 | @include bootable;
51 | @include elevation(4);
52 |
53 | position: relative;
54 | width: 100%;
55 | will-change: padding-left, padding-right;
56 |
57 | // TODO: Do we even need this?
58 | .v-text-field--enclosed,
59 | .v-text-field--box {
60 | margin: 0;
61 |
62 | .v-text-field__details {
63 | display: none;
64 | }
65 | }
66 |
67 | // Children
68 | .v-tabs {
69 | width: 100%;
70 | }
71 |
72 | &__title {
73 | font-size: map-deep-get($headings, h6, size);
74 | font-weight: map-deep-get($headings, h6, weight);
75 | letter-spacing: map-deep-get($headings, h6, letter-spacing);
76 | overflow: hidden;
77 | text-overflow: ellipsis;
78 | white-space: nowrap;
79 |
80 | &:not(:first-child) {
81 | margin-left: rem(20px);
82 | }
83 | }
84 |
85 | &__content,
86 | &__extension {
87 | align-items: center;
88 | display: flex;
89 | padding: 0 map-get($grid-gutters, xl);
90 |
91 | @include breakpoint(sm-and-down) {
92 | padding: 0 map-get($grid-gutters, lg);
93 | }
94 |
95 | .v-btn--icon {
96 | margin: rem(6px);
97 | }
98 |
99 | > *:first-child {
100 | @include v-toolbar-content(left);
101 | }
102 |
103 | > *:last-child {
104 | @include v-toolbar-content(right);
105 | }
106 |
107 | > .v-list {
108 | flex: 1 1 auto;
109 | max-height: 100%;
110 | }
111 |
112 | > .v-list:first-child {
113 | margin-left: -#{map-get($grid-gutters, xl)};
114 |
115 | @include breakpoint(sm-and-down) {
116 | margin-left: -#{map-get($grid-gutters, lg)};
117 | }
118 | }
119 |
120 | > .v-list:last-child {
121 | margin-right: -#{map-get($grid-gutters, xl)};
122 |
123 | @include breakpoint(sm-and-down) {
124 | margin-right: -#{map-get($grid-gutters, lg)};
125 | }
126 | }
127 | }
128 |
129 | &__extension {
130 | > .v-toolbar__title {
131 | margin-left: rem(72px);
132 | }
133 | }
134 |
135 | &__items {
136 | display: flex;
137 | height: inherit;
138 | max-width: 100%;
139 | padding: 0;
140 |
141 | .v-btn {
142 | align-items: center;
143 | align-self: center;
144 | }
145 |
146 | .v-tooltip,
147 | .v-tooltip > span {
148 | height: inherit;
149 | }
150 |
151 | .v-btn:not(.v-btn--floating):not(.v-btn--icon),
152 | .v-menu,
153 | .v-menu__activator {
154 | height: inherit;
155 | margin: 0;
156 | }
157 | }
158 |
159 | // Types
160 | .v-overflow-btn,
161 | .v-btn-toggle {
162 | @include elevation(0);
163 | }
164 |
165 | .v-input {
166 | margin: 0;
167 | }
168 |
169 | .v-overflow-btn {
170 | .v-input__control,
171 | .v-input__slot {
172 | &::before {
173 | display: none;
174 | }
175 | }
176 | }
177 |
178 | &--card {
179 | @include elevation(0);
180 | border-radius: $card-border-radius $card-border-radius 0 0;
181 | }
182 |
183 | &--fixed {
184 | position: fixed;
185 | z-index: 2;
186 | }
187 |
188 | &--fixed,
189 | &--absolute {
190 | left: 0;
191 | top: 0;
192 | }
193 |
194 | &--absolute {
195 | position: absolute;
196 | z-index: 2;
197 | }
198 |
199 | &--floating {
200 | display: inline-flex;
201 | margin: map-get($grid-gutters, lg);
202 | width: auto;
203 | }
204 |
205 | &--clipped {
206 | z-index: 3;
207 | }
208 | }
209 |
--------------------------------------------------------------------------------
/components/_tooltips.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-tooltip {
4 | @include breakpoint(sm-and-down) {
5 | .v-tooltip__content {
6 | padding: rem(10px 16px);
7 | }
8 | }
9 |
10 | &__content {
11 | @include elevation(2);
12 | background: map-get($grey, darken-2);
13 | border-radius: rem(2px);
14 | color: #ffffff;
15 | display: inline-block;
16 | font-size: rem(12px);
17 | padding: rem(5px 8px);
18 | position: absolute;
19 | text-transform: initial;
20 | width: auto;
21 |
22 | &[class*='-active'] {
23 | pointer-events: none;
24 | transition: 0.15s map-get($transition, swing);
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/components/_treeview.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 | @import '../theme';
3 |
4 | // Theme
5 | @mixin v-treeview($material) {
6 | color: map-deep-get($material, text, primary);
7 |
8 | &--hoverable .v-treeview-node__root:hover,
9 | .v-treeview-node--active {
10 | background: map-get($material, dividers);
11 | }
12 | }
13 |
14 | @mixin v-treeview-rtl() {
15 | > .v-treeview-node {
16 | margin-right: 0;
17 |
18 | &--leaf {
19 | margin-left: 0;
20 | margin-right: rem(24px);
21 | }
22 | }
23 |
24 | &-node {
25 | margin-left: 0;
26 | margin-right: rem(26px);
27 |
28 | &--leaf {
29 | margin-left: 0;
30 | margin-right: rem(50px);
31 | }
32 |
33 | &__toggle {
34 | transform: rotate(90deg);
35 |
36 | &--open {
37 | transform: none;
38 | }
39 | }
40 | }
41 | }
42 |
43 | @include theme(light, 'v-treeview') {
44 | @include v-treeview($material-light);
45 | }
46 |
47 | @include theme(dark, 'v-treeview') {
48 | @include v-treeview($material-dark);
49 | }
50 |
51 | @include rtl('v-treeview') {
52 | @include v-treeview-rtl;
53 | }
54 |
55 | .v-treeview {
56 | > .v-treeview-node {
57 | margin-left: 0;
58 |
59 | &--leaf {
60 | margin-left: rem(24px);
61 | }
62 | }
63 |
64 | &-node {
65 | margin-left: rem(26px);
66 |
67 | &--excluded {
68 | display: none;
69 | }
70 |
71 | &--click {
72 | > .v-treeview-node__root,
73 | > .v-treeview-node__root > .v-treeview-node__content > * {
74 | cursor: pointer;
75 | user-select: none;
76 | }
77 | }
78 |
79 | &--leaf {
80 | margin-left: rem(50px);
81 | }
82 |
83 | &__root {
84 | align-items: center;
85 | display: flex;
86 | height: rem(34px);
87 | }
88 |
89 | &__content {
90 | align-items: center;
91 | display: flex;
92 | flex-grow: 1;
93 | flex-shrink: 0;
94 |
95 | // TODO: this is temporary fix for d-flex * shenanigans
96 | .v-btn {
97 | flex-grow: 0 !important;
98 | flex-shrink: 1 !important;
99 | }
100 | }
101 |
102 | &__label {
103 | flex-grow: 1;
104 | flex-shrink: 0;
105 | font-size: rem(1.2rem);
106 | margin-left: rem(6px);
107 |
108 | .v-icon {
109 | padding-right: rem(8px);
110 | }
111 | }
112 |
113 | &__checkbox {
114 | user-select: none;
115 | }
116 |
117 | &__toggle {
118 | transform: rotate(-90deg);
119 | user-select: none;
120 |
121 | &--open {
122 | transform: none;
123 | }
124 |
125 | &--loading {
126 | // stylelint-disable-next-line no-unknown-animations
127 | animation: progress-circular-rotate 1s linear infinite;
128 | }
129 | }
130 |
131 | &__children {
132 | transition: all $treeview-transition;
133 | }
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/components/_windows.scss:
--------------------------------------------------------------------------------
1 | @import '../bootstrap';
2 |
3 | .v-window {
4 | &__container {
5 | position: relative;
6 | transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1);
7 |
8 | &--is-active {
9 | overflow: hidden;
10 | }
11 | }
12 |
13 | &-x-transition,
14 | &-x-reverse-transition,
15 | &-y-transition,
16 | &-y-reverse-transition {
17 | &-enter-active,
18 | &-leave-active {
19 | transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1);
20 | }
21 |
22 | &-leave,
23 | &-leave-to {
24 | position: absolute !important;
25 | top: 0;
26 | width: 100%;
27 | }
28 | }
29 |
30 | &-x-transition {
31 | &-enter {
32 | transform: translateX(100%);
33 | }
34 |
35 | &-leave-to {
36 | transform: translateX(-100%);
37 | }
38 | }
39 |
40 | &-x-reverse-transition {
41 | &-enter {
42 | transform: translateX(-100%);
43 | }
44 |
45 | &-leave-to {
46 | transform: translateX(100%);
47 | }
48 | }
49 |
50 | &-y-transition {
51 | &-enter {
52 | transform: translateY(100%);
53 | }
54 |
55 | &-leave-to {
56 | transform: translateY(-100%);
57 | }
58 | }
59 |
60 | &-y-reverse-transition {
61 | &-enter {
62 | transform: translateY(-100%);
63 | }
64 |
65 | &-leave-to {
66 | transform: translateY(100%);
67 | }
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/elements/_all.scss:
--------------------------------------------------------------------------------
1 | @import 'blockquote';
2 | @import 'code';
3 | @import 'global';
4 | @import 'headings';
5 | @import 'lists';
6 | @import 'typography';
7 |
--------------------------------------------------------------------------------
/elements/_blockquote.scss:
--------------------------------------------------------------------------------
1 | .blockquote {
2 | font-size: 1.125rem;
3 | font-weight: font-weight(light);
4 | padding: map-deep-get($spacers, three, y) 0 map-deep-get($spacers, three, y)
5 | map-deep-get($spacers, four, x);
6 | }
7 |
--------------------------------------------------------------------------------
/elements/_code.scss:
--------------------------------------------------------------------------------
1 | code,
2 | kbd {
3 | border-radius: 3px;
4 | display: inline-block;
5 | font-size: 85%;
6 | // stylelint-disable-next-line color-named
7 | font-weight: font-weight(black);
8 | white-space: pre-wrap;
9 |
10 | &::after,
11 | &::before {
12 | content: '\00a0';
13 | letter-spacing: -1px;
14 | }
15 | }
16 |
17 | code {
18 | @include elevation(1);
19 | background-color: map-get($grey, lighten-4);
20 | color: #bd4147;
21 | }
22 |
23 | kbd {
24 | background: map-get($grey, darken-2);
25 | color: #ffffff;
26 | }
27 |
--------------------------------------------------------------------------------
/elements/_global.scss:
--------------------------------------------------------------------------------
1 | html {
2 | font-size: $font-size-root;
3 | -webkit-font-smoothing: antialiased;
4 | -moz-osx-font-smoothing: grayscale;
5 | overflow-x: hidden;
6 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
7 | text-rendering: optimizeLegibility;
8 | }
9 |
10 | body {
11 | font-size: map-deep-get($headings, body-1, size);
12 | font-weight: map-deep-get($headings, body-1, weight);
13 | }
14 |
15 | .application {
16 | font-family: $body-font-family;
17 | line-height: $line-height-root;
18 | }
19 |
20 | ::-ms-clear,
21 | ::-ms-reveal {
22 | display: none;
23 | }
24 |
--------------------------------------------------------------------------------
/elements/_headings.scss:
--------------------------------------------------------------------------------
1 | @import '../theme';
2 |
3 | @mixin heading($material) {
4 | color: map-deep-get($material, text, primary);
5 | }
6 |
7 | @include theme(light, 'heading') {
8 | @include heading($material-light);
9 | }
10 |
11 | @include theme(dark, 'heading') {
12 | @include heading($material-dark);
13 | }
14 |
--------------------------------------------------------------------------------
/elements/_lists.scss:
--------------------------------------------------------------------------------
1 | ul,
2 | ol {
3 | padding-left: map-deep-get($spacers, four, x);
4 | }
5 |
--------------------------------------------------------------------------------
/elements/_typography.scss:
--------------------------------------------------------------------------------
1 | @import '../tools/helpers/all';
2 |
3 | $_heading-classes: (
4 | h1: 'display-4',
5 | h2: 'display-3',
6 | h3: 'display-2',
7 | h4: 'display-1',
8 | h5: 'headline',
9 | h6: 'title',
10 | subheading: 'subheading',
11 | body-2: 'body-2',
12 | body-1: 'body-1',
13 | caption: 'caption',
14 | button: 'v-btn',
15 | ) !default;
16 | $_heading-classes-large: (h1, h2, h3, h4, h5, h6) !default;
17 |
18 | @each $heading, $props in $headings {
19 | $selector: if(
20 | map-has-key($_heading-classes, $heading),
21 | if(
22 | $heading-style-tags and index($_heading-classes-large, $heading),
23 | '#{$heading}, .#{map-get($_heading-classes, $heading)}',
24 | '.#{map-get($_heading-classes, $heading)}'
25 | ),
26 | #{$heading}
27 | );
28 |
29 | #{$selector} {
30 | font-size: map-get($props, size) !important;
31 | font-weight: map-get($props, weight);
32 | @if index($_heading-classes-large, $heading) {
33 | letter-spacing: map-get($props, letter-spacing) !important;
34 | line-height: map-get($props, line-height) !important;
35 | }
36 | }
37 | }
38 |
39 | p {
40 | margin-bottom: map-deep-get($spacers, three, y);
41 | }
42 |
--------------------------------------------------------------------------------
/generic/_all.scss:
--------------------------------------------------------------------------------
1 | @import 'animations';
2 | @import 'colors';
3 | @import 'elevations';
4 | @import 'reset';
5 | @import 'transitions';
6 |
--------------------------------------------------------------------------------
/generic/_animations.scss:
--------------------------------------------------------------------------------
1 | @keyframes shake {
2 | 59% {
3 | margin-left: 0;
4 | }
5 |
6 | 60%,
7 | 80% {
8 | margin-left: rem(2px);
9 | }
10 |
11 | 70%,
12 | 90% {
13 | margin-left: rem(-2px);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/generic/_colors.scss:
--------------------------------------------------------------------------------
1 | @mixin global-color($color_name, $color_value) {
2 | .#{$color_name} {
3 | background-color: $color_value !important;
4 | border-color: $color_value !important;
5 | }
6 |
7 | .#{$color_name}--text {
8 | caret-color: $color_value !important;
9 | color: $color_value !important;
10 | }
11 | }
12 |
13 | @mixin global-color-accent($color_name, $color_value, $color_type) {
14 | .#{$color_name} {
15 | &.#{$color_type} {
16 | background-color: $color_value !important;
17 | border-color: $color_value !important;
18 | }
19 | }
20 |
21 | .#{$color_name}--text {
22 | &.text--#{$color_type} {
23 | caret-color: $color_value !important;
24 | color: $color_value !important;
25 | }
26 | }
27 | }
28 |
29 | // Put the loop in a function so it can't leak
30 | @mixin create-global-colors {
31 | @each $color_name, $color_value in $shades {
32 | @include global-color($color_name, $color_value);
33 | }
34 |
35 | @if $color-pack {
36 | @each $color_name, $color_color in $colors {
37 | @each $color_type, $color_value in $color_color {
38 | @if $color_type == 'base' {
39 | @include global-color($color_name, $color_value);
40 | } @else if $color_type != 'shades' {
41 | @include global-color-accent($color_name, $color_value, $color_type);
42 | }
43 | }
44 | }
45 | }
46 | }
47 |
48 | @include create-global-colors;
49 |
--------------------------------------------------------------------------------
/generic/_elevations.scss:
--------------------------------------------------------------------------------
1 | @import '../settings/elevations';
2 |
3 | // GENERATE HELPER CLASSES
4 | @for $z from 0 through 24 {
5 | .elevation-#{$z} {
6 | @include elevation($z, true);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/generic/_transitions.scss:
--------------------------------------------------------------------------------
1 | @mixin transition-default() {
2 | &-enter-active,
3 | &-leave-active {
4 | transition: $primary-transition;
5 |
6 | &-move {
7 | transition: transform 0.6s;
8 | }
9 | }
10 | }
11 |
12 | // Component specific transitions
13 | .bottom-sheet-transition {
14 | &-enter {
15 | transform: translateY(100%);
16 | }
17 |
18 | &-leave-to {
19 | transform: translateY(100%);
20 | }
21 | }
22 |
23 | .carousel-transition {
24 | &-enter {
25 | transform: translate(100%, 0);
26 | }
27 |
28 | &-leave,
29 | &-leave-to {
30 | position: absolute;
31 | top: 0;
32 | transform: translate(-100%, 0);
33 | }
34 | }
35 |
36 | .carousel-reverse-transition {
37 | &-enter {
38 | transform: translate(-100%, 0);
39 | }
40 |
41 | &-leave,
42 | &-leave-to {
43 | position: absolute;
44 | top: 0;
45 | transform: translate(100%, 0);
46 | }
47 | }
48 |
49 | .dialog-transition {
50 | &-enter,
51 | &-leave-to {
52 | opacity: 0;
53 | transform: scale(0.5);
54 | }
55 |
56 | &-enter-to,
57 | &-leave {
58 | opacity: 1;
59 | }
60 | }
61 |
62 | .dialog-bottom-transition {
63 | &-enter,
64 | &-leave-to {
65 | transform: translateY(100%);
66 | }
67 | }
68 |
69 | .picker-transition,
70 | .picker-reverse-transition {
71 | &-enter-active,
72 | &-leave-active {
73 | transition: 0.3s map-get($transition, linear-out-slow-in);
74 | }
75 |
76 | &-enter,
77 | &-leave-to {
78 | opacity: 0;
79 | }
80 |
81 | &-leave,
82 | &-leave-active,
83 | &-leave-to {
84 | position: absolute !important;
85 | }
86 | }
87 |
88 | .picker-transition {
89 | &-enter {
90 | transform: translate(0, 100%);
91 | }
92 |
93 | &-leave-to {
94 | transform: translate(0, -100%);
95 | }
96 | }
97 |
98 | .picker-reverse-transition {
99 | &-enter {
100 | transform: translate(0, -100%);
101 | }
102 |
103 | &-leave-to {
104 | transform: translate(0, 100%);
105 | }
106 | }
107 |
108 | .picker-title-transition {
109 | &-enter-to,
110 | &-leave {
111 | transform: translate(0, 0);
112 | }
113 |
114 | &-enter {
115 | transform: translate(-100%, 0);
116 | }
117 |
118 | &-leave-to {
119 | opacity: 0;
120 | transform: translate(100%, 0);
121 | }
122 |
123 | &-leave,
124 | &-leave-to,
125 | &-leave-active {
126 | position: absolute !important;
127 | }
128 | }
129 |
130 | .tab-transition {
131 | &-enter {
132 | transform: translate(100%, 0);
133 | }
134 |
135 | &-leave,
136 | &-leave-active {
137 | position: absolute;
138 | top: 0;
139 | }
140 |
141 | &-leave-to {
142 | position: absolute;
143 | transform: translate(-100%, 0);
144 | }
145 | }
146 |
147 | .tab-reverse-transition {
148 | &-enter {
149 | transform: translate(-100%, 0);
150 | }
151 |
152 | &-leave,
153 | &-leave-to {
154 | position: absolute;
155 | top: 0;
156 | transform: translate(100%, 0);
157 | }
158 | }
159 |
160 | // Generic transitions
161 | .expand-transition {
162 | @include transition-default();
163 | }
164 |
165 | .expand-x-transition {
166 | @include transition-default();
167 | }
168 |
169 | .scale-transition {
170 | @include transition-default();
171 |
172 | &-enter,
173 | &-leave,
174 | &-leave-to {
175 | opacity: 0;
176 | transform: scale(0);
177 | }
178 | }
179 |
180 | .message-transition {
181 | @include transition-default();
182 |
183 | &-enter,
184 | &-leave-to {
185 | opacity: 0;
186 | transform: translateY(rem(-15px));
187 | }
188 |
189 | &-leave,
190 | &-leave-active {
191 | position: absolute;
192 | }
193 | }
194 |
195 | .slide-y-transition {
196 | @include transition-default();
197 |
198 | &-enter,
199 | &-leave-to {
200 | opacity: 0;
201 | transform: translateY(rem(-15px));
202 | }
203 | }
204 |
205 | .slide-y-reverse-transition {
206 | @include transition-default();
207 |
208 | &-enter,
209 | &-leave-to {
210 | opacity: 0;
211 | transform: translateY(rem(15px));
212 | }
213 | }
214 |
215 | .scroll-y-transition {
216 | @include transition-default();
217 |
218 | &-enter,
219 | &-leave-to {
220 | opacity: 0;
221 | }
222 |
223 | &-enter {
224 | transform: translateY(rem(-15px));
225 | }
226 |
227 | &-leave-to {
228 | transform: translateY(rem(15px));
229 | }
230 | }
231 |
232 | .scroll-y-reverse-transition {
233 | @include transition-default();
234 |
235 | &-enter,
236 | &-leave-to {
237 | opacity: 0;
238 | }
239 |
240 | &-enter {
241 | transform: translateY(rem(15px));
242 | }
243 |
244 | &-leave-to {
245 | transform: translateY(rem(-15px));
246 | }
247 | }
248 |
249 | .scroll-x-transition {
250 | @include transition-default();
251 |
252 | &-enter,
253 | &-leave-to {
254 | opacity: 0;
255 | }
256 |
257 | &-enter {
258 | transform: translateX(rem(-15px));
259 | }
260 |
261 | &-leave-to {
262 | transform: translateX(rem(15px));
263 | }
264 | }
265 |
266 | .scroll-x-reverse-transition {
267 | @include transition-default();
268 |
269 | &-enter,
270 | &-leave-to {
271 | opacity: 0;
272 | }
273 |
274 | &-enter {
275 | transform: translateX(rem(15px));
276 | }
277 |
278 | &-leave-to {
279 | transform: translateX(rem(-15px));
280 | }
281 | }
282 |
283 | .slide-x-transition {
284 | @include transition-default();
285 |
286 | &-enter,
287 | &-leave-to {
288 | opacity: 0;
289 | transform: translateX(rem(-15px));
290 | }
291 | }
292 |
293 | .slide-x-reverse-transition {
294 | @include transition-default();
295 |
296 | &-enter,
297 | &-leave-to {
298 | opacity: 0;
299 | transform: translateX(rem(15px));
300 | }
301 | }
302 |
303 | .fade-transition {
304 | @include transition-default();
305 |
306 | &-enter,
307 | &-leave-to {
308 | opacity: 0;
309 | }
310 | }
311 |
312 | .fab-transition {
313 | @include transition-default();
314 |
315 | &-enter,
316 | &-leave-to {
317 | transform: scale(0) rotate(-45deg);
318 | }
319 | }
320 |
--------------------------------------------------------------------------------
/main.scss:
--------------------------------------------------------------------------------
1 | @import './app';
2 | @import './components/all';
3 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vuetify-scss",
3 | "version": "1.4.0",
4 | "description": "All of the Vuetify styles converted into Sass. No more Stylus!",
5 | "main": "main.scss",
6 | "style": "main.scss",
7 | "sass": "main.scss",
8 | "scripts": {
9 | "lint": "stylelint '**/*.scss' --syntax=scss; exit 0",
10 | "lint:fix": "stylelint '**/*.scss' --syntax=scss --fix; exit 0",
11 | "prepublishOnly": "stylelint '**/*.scss' --syntax=scss",
12 | "test": "stylelint '**/*.scss' --syntax=scss",
13 | "release": "standard-version --message='build(release): %s'",
14 | "release-minor": "standard-version --release-as=minor --message='build(release): %s'",
15 | "release-major": "standard-version --release-as=major --message='build(release): %s'"
16 | },
17 | "repository": {
18 | "type": "git",
19 | "url": "git+https://github.com/nmsmith22389/vuetify-scss.git"
20 | },
21 | "keywords": [
22 | "vuetify",
23 | "scss",
24 | "sass",
25 | "css",
26 | "vue"
27 | ],
28 | "author": {
29 | "name": "Neil Smith",
30 | "email": "nmsmith22389@gmail.com"
31 | },
32 | "license": "MIT",
33 | "bugs": {
34 | "url": "https://github.com/nmsmith22389/vuetify-scss/issues"
35 | },
36 | "homepage": "https://github.com/nmsmith22389/vuetify-scss#readme",
37 | "peerDependencies": {
38 | "vuetify": "~1.5.0"
39 | },
40 | "devDependencies": {
41 | "stylelint": "^9.10.1",
42 | "stylelint-config-sass-guidelines": "^5.3.0"
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/settings/_all.scss:
--------------------------------------------------------------------------------
1 | @import 'variables';
2 | @import 'colors';
3 | @import 'elevations';
4 | @import 'rtl';
5 | @import 'theme';
6 |
--------------------------------------------------------------------------------
/settings/_colors.scss:
--------------------------------------------------------------------------------
1 | $red: (
2 | base: #f44336,
3 | lighten-5: #ffebee,
4 | lighten-4: #ffcdd2,
5 | lighten-3: #ef9a9a,
6 | lighten-2: #e57373,
7 | lighten-1: #ef5350,
8 | darken-1: #e53935,
9 | darken-2: #d32f2f,
10 | darken-3: #c62828,
11 | darken-4: #b71c1c,
12 | accent-1: #ff8a80,
13 | accent-2: #ff5252,
14 | accent-3: #ff1744,
15 | accent-4: #d50000
16 | );
17 |
18 | $pink: (
19 | base: #e91e63,
20 | lighten-5: #fce4ec,
21 | lighten-4: #f8bbd0,
22 | lighten-3: #f48fb1,
23 | lighten-2: #f06292,
24 | lighten-1: #ec407a,
25 | darken-1: #d81b60,
26 | darken-2: #c2185b,
27 | darken-3: #ad1457,
28 | darken-4: #880e4f,
29 | accent-1: #ff80ab,
30 | accent-2: #ff4081,
31 | accent-3: #f50057,
32 | accent-4: #c51162
33 | );
34 |
35 | $purple: (
36 | base: #9c27b0,
37 | lighten-5: #f3e5f5,
38 | lighten-4: #e1bee7,
39 | lighten-3: #ce93d8,
40 | lighten-2: #ba68c8,
41 | lighten-1: #ab47bc,
42 | darken-1: #8e24aa,
43 | darken-2: #7b1fa2,
44 | darken-3: #6a1b9a,
45 | darken-4: #4a148c,
46 | accent-1: #ea80fc,
47 | accent-2: #e040fb,
48 | accent-3: #d500f9,
49 | accent-4: #aa00ff
50 | );
51 |
52 | $deep-purple: (
53 | base: #673ab7,
54 | lighten-5: #ede7f6,
55 | lighten-4: #d1c4e9,
56 | lighten-3: #b39ddb,
57 | lighten-2: #9575cd,
58 | lighten-1: #7e57c2,
59 | darken-1: #5e35b1,
60 | darken-2: #512da8,
61 | darken-3: #4527a0,
62 | darken-4: #311b92,
63 | accent-1: #b388ff,
64 | accent-2: #7c4dff,
65 | accent-3: #651fff,
66 | accent-4: #6200ea
67 | );
68 |
69 | $indigo: (
70 | base: #3f51b5,
71 | lighten-5: #e8eaf6,
72 | lighten-4: #c5cae9,
73 | lighten-3: #9fa8da,
74 | lighten-2: #7986cb,
75 | lighten-1: #5c6bc0,
76 | darken-1: #3949ab,
77 | darken-2: #303f9f,
78 | darken-3: #283593,
79 | darken-4: #1a237e,
80 | accent-1: #8c9eff,
81 | accent-2: #536dfe,
82 | accent-3: #3d5afe,
83 | accent-4: #304ffe
84 | );
85 |
86 | $blue: (
87 | base: #2196f3,
88 | lighten-5: #e3f2fd,
89 | lighten-4: #bbdefb,
90 | lighten-3: #90caf9,
91 | lighten-2: #64b5f6,
92 | lighten-1: #42a5f5,
93 | darken-1: #1e88e5,
94 | darken-2: #1976d2,
95 | darken-3: #1565c0,
96 | darken-4: #0d47a1,
97 | accent-1: #82b1ff,
98 | accent-2: #448aff,
99 | accent-3: #2979ff,
100 | accent-4: #2962ff
101 | );
102 |
103 | $light-blue: (
104 | base: #03a9f4,
105 | lighten-5: #e1f5fe,
106 | lighten-4: #b3e5fc,
107 | lighten-3: #81d4fa,
108 | lighten-2: #4fc3f7,
109 | lighten-1: #29b6f6,
110 | darken-1: #039be5,
111 | darken-2: #0288d1,
112 | darken-3: #0277bd,
113 | darken-4: #01579b,
114 | accent-1: #80d8ff,
115 | accent-2: #40c4ff,
116 | accent-3: #00b0ff,
117 | accent-4: #0091ea
118 | );
119 |
120 | $cyan: (
121 | base: #00bcd4,
122 | lighten-5: #e0f7fa,
123 | lighten-4: #b2ebf2,
124 | lighten-3: #80deea,
125 | lighten-2: #4dd0e1,
126 | lighten-1: #26c6da,
127 | darken-1: #00acc1,
128 | darken-2: #0097a7,
129 | darken-3: #00838f,
130 | darken-4: #006064,
131 | accent-1: #84ffff,
132 | accent-2: #18ffff,
133 | accent-3: #00e5ff,
134 | accent-4: #00b8d4
135 | );
136 |
137 | $teal: (
138 | base: #009688,
139 | lighten-5: #e0f2f1,
140 | lighten-4: #b2dfdb,
141 | lighten-3: #80cbc4,
142 | lighten-2: #4db6ac,
143 | lighten-1: #26a69a,
144 | darken-1: #00897b,
145 | darken-2: #00796b,
146 | darken-3: #00695c,
147 | darken-4: #004d40,
148 | accent-1: #a7ffeb,
149 | accent-2: #64ffda,
150 | accent-3: #1de9b6,
151 | accent-4: #00bfa5
152 | );
153 |
154 | $green: (
155 | base: #4caf50,
156 | lighten-5: #e8f5e9,
157 | lighten-4: #c8e6c9,
158 | lighten-3: #a5d6a7,
159 | lighten-2: #81c784,
160 | lighten-1: #66bb6a,
161 | darken-1: #43a047,
162 | darken-2: #388e3c,
163 | darken-3: #2e7d32,
164 | darken-4: #1b5e20,
165 | accent-1: #b9f6ca,
166 | accent-2: #69f0ae,
167 | accent-3: #00e676,
168 | accent-4: #00c853
169 | );
170 |
171 | $light-green: (
172 | base: #8bc34a,
173 | lighten-5: #f1f8e9,
174 | lighten-4: #dcedc8,
175 | lighten-3: #c5e1a5,
176 | lighten-2: #aed581,
177 | lighten-1: #9ccc65,
178 | darken-1: #7cb342,
179 | darken-2: #689f38,
180 | darken-3: #558b2f,
181 | darken-4: #33691e,
182 | accent-1: #ccff90,
183 | accent-2: #b2ff59,
184 | accent-3: #76ff03,
185 | accent-4: #64dd17
186 | );
187 |
188 | $lime: (
189 | base: #cddc39,
190 | lighten-5: #f9fbe7,
191 | lighten-4: #f0f4c3,
192 | lighten-3: #e6ee9c,
193 | lighten-2: #dce775,
194 | lighten-1: #d4e157,
195 | darken-1: #c0ca33,
196 | darken-2: #afb42b,
197 | darken-3: #9e9d24,
198 | darken-4: #827717,
199 | accent-1: #f4ff81,
200 | accent-2: #eeff41,
201 | accent-3: #c6ff00,
202 | accent-4: #aeea00
203 | );
204 |
205 | $yellow: (
206 | base: #ffeb3b,
207 | lighten-5: #fffde7,
208 | lighten-4: #fff9c4,
209 | lighten-3: #fff59d,
210 | lighten-2: #fff176,
211 | lighten-1: #ffee58,
212 | darken-1: #fdd835,
213 | darken-2: #fbc02d,
214 | darken-3: #f9a825,
215 | darken-4: #f57f17,
216 | accent-1: #ffff8d,
217 | accent-2: #ffff00,
218 | accent-3: #ffea00,
219 | accent-4: #ffd600
220 | );
221 |
222 | $amber: (
223 | base: #ffc107,
224 | lighten-5: #fff8e1,
225 | lighten-4: #ffecb3,
226 | lighten-3: #ffe082,
227 | lighten-2: #ffd54f,
228 | lighten-1: #ffca28,
229 | darken-1: #ffb300,
230 | darken-2: #ffa000,
231 | darken-3: #ff8f00,
232 | darken-4: #ff6f00,
233 | accent-1: #ffe57f,
234 | accent-2: #ffd740,
235 | accent-3: #ffc400,
236 | accent-4: #ffab00
237 | );
238 |
239 | $orange: (
240 | base: #ff9800,
241 | lighten-5: #fff3e0,
242 | lighten-4: #ffe0b2,
243 | lighten-3: #ffcc80,
244 | lighten-2: #ffb74d,
245 | lighten-1: #ffa726,
246 | darken-1: #fb8c00,
247 | darken-2: #f57c00,
248 | darken-3: #ef6c00,
249 | darken-4: #e65100,
250 | accent-1: #ffd180,
251 | accent-2: #ffab40,
252 | accent-3: #ff9100,
253 | accent-4: #ff6d00
254 | );
255 |
256 | $deep-orange: (
257 | base: #ff5722,
258 | lighten-5: #fbe9e7,
259 | lighten-4: #ffccbc,
260 | lighten-3: #ffab91,
261 | lighten-2: #ff8a65,
262 | lighten-1: #ff7043,
263 | darken-1: #f4511e,
264 | darken-2: #e64a19,
265 | darken-3: #d84315,
266 | darken-4: #bf360c,
267 | accent-1: #ff9e80,
268 | accent-2: #ff6e40,
269 | accent-3: #ff3d00,
270 | accent-4: #dd2c00
271 | );
272 |
273 | $brown: (
274 | base: #795548,
275 | lighten-5: #efebe9,
276 | lighten-4: #d7ccc8,
277 | lighten-3: #bcaaa4,
278 | lighten-2: #a1887f,
279 | lighten-1: #8d6e63,
280 | darken-1: #6d4c41,
281 | darken-2: #5d4037,
282 | darken-3: #4e342e,
283 | darken-4: #3e2723
284 | );
285 |
286 | $blue-grey: (
287 | base: #607d8b,
288 | lighten-5: #eceff1,
289 | lighten-4: #cfd8dc,
290 | lighten-3: #b0bec5,
291 | lighten-2: #90a4ae,
292 | lighten-1: #78909c,
293 | darken-1: #546e7a,
294 | darken-2: #455a64,
295 | darken-3: #37474f,
296 | darken-4: #263238
297 | );
298 |
299 | $grey: (
300 | base: #9e9e9e,
301 | lighten-5: #fafafa,
302 | lighten-4: #f5f5f5,
303 | lighten-3: #eeeeee,
304 | lighten-2: #e0e0e0,
305 | lighten-1: #bdbdbd,
306 | darken-1: #757575,
307 | darken-2: #616161,
308 | darken-3: #424242,
309 | darken-4: #212121
310 | );
311 |
312 | $shades: (
313 | 'black': #000000,
314 | 'white': #ffffff,
315 | 'transparent': transparent
316 | );
317 |
318 | $colors: (
319 | 'red': $red,
320 | 'pink': $pink,
321 | 'purple': $purple,
322 | 'deep-purple': $deep-purple,
323 | 'indigo': $indigo,
324 | 'blue': $blue,
325 | 'light-blue': $light-blue,
326 | 'cyan': $cyan,
327 | 'teal': $teal,
328 | 'green': $green,
329 | 'light-green': $light-green,
330 | 'lime': $lime,
331 | 'yellow': $yellow,
332 | 'amber': $amber,
333 | 'orange': $orange,
334 | 'deep-orange': $deep-orange,
335 | 'brown': $brown,
336 | 'blue-grey': $blue-grey,
337 | 'grey': $grey,
338 | 'shades': $shades
339 | ) !default;
340 |
--------------------------------------------------------------------------------
/settings/_elevations.scss:
--------------------------------------------------------------------------------
1 | $shadow-key-umbra-opacity: rgba(0, 0, 0, 0.2) !default;
2 | $shadow-key-penumbra-opacity: rgba(0, 0, 0, 0.14) !default;
3 | $shadow-key-ambient-opacity: rgba(0, 0, 0, 0.12) !default;
4 |
5 | $shadow-key-umbra: (
6 | 0 0 0 0 $shadow-key-umbra-opacity,
7 | 0 2px 1px -1px $shadow-key-umbra-opacity,
8 | 0 3px 1px -2px $shadow-key-umbra-opacity,
9 | 0 3px 3px -2px $shadow-key-umbra-opacity,
10 | 0 2px 4px -1px $shadow-key-umbra-opacity,
11 | 0 3px 5px -1px $shadow-key-umbra-opacity,
12 | 0 3px 5px -1px $shadow-key-umbra-opacity,
13 | 0 4px 5px -2px $shadow-key-umbra-opacity,
14 | 0 5px 5px -3px $shadow-key-umbra-opacity,
15 | 0 5px 6px -3px $shadow-key-umbra-opacity,
16 | 0 6px 6px -3px $shadow-key-umbra-opacity,
17 | 0 6px 7px -4px $shadow-key-umbra-opacity,
18 | 0 7px 8px -4px $shadow-key-umbra-opacity,
19 | 0 7px 8px -4px $shadow-key-umbra-opacity,
20 | 0 7px 9px -4px $shadow-key-umbra-opacity,
21 | 0 8px 9px -5px $shadow-key-umbra-opacity,
22 | 0 8px 10px -5px $shadow-key-umbra-opacity,
23 | 0 8px 11px -5px $shadow-key-umbra-opacity,
24 | 0 9px 11px -5px $shadow-key-umbra-opacity,
25 | 0 9px 12px -6px $shadow-key-umbra-opacity,
26 | 0 10px 13px -6px $shadow-key-umbra-opacity,
27 | 0 10px 13px -6px $shadow-key-umbra-opacity,
28 | 0 10px 14px -6px $shadow-key-umbra-opacity,
29 | 0 11px 14px -7px $shadow-key-umbra-opacity,
30 | 0 11px 15px -7px $shadow-key-umbra-opacity
31 | ) !default;
32 |
33 | $shadow-key-penumbra: (
34 | 0 0 0 0 $shadow-key-penumbra-opacity,
35 | 0 1px 1px 0 $shadow-key-penumbra-opacity,
36 | 0 2px 2px 0 $shadow-key-penumbra-opacity,
37 | 0 3px 4px 0 $shadow-key-penumbra-opacity,
38 | 0 4px 5px 0 $shadow-key-penumbra-opacity,
39 | 0 5px 8px 0 $shadow-key-penumbra-opacity,
40 | 0 6px 10px 0 $shadow-key-penumbra-opacity,
41 | 0 7px 10px 1px $shadow-key-penumbra-opacity,
42 | 0 8px 10px 1px $shadow-key-penumbra-opacity,
43 | 0 9px 12px 1px $shadow-key-penumbra-opacity,
44 | 0 10px 14px 1px $shadow-key-penumbra-opacity,
45 | 0 11px 15px 1px $shadow-key-penumbra-opacity,
46 | 0 12px 17px 2px $shadow-key-penumbra-opacity,
47 | 0 13px 19px 2px $shadow-key-penumbra-opacity,
48 | 0 14px 21px 2px $shadow-key-penumbra-opacity,
49 | 0 15px 22px 2px $shadow-key-penumbra-opacity,
50 | 0 16px 24px 2px $shadow-key-penumbra-opacity,
51 | 0 17px 26px 2px $shadow-key-penumbra-opacity,
52 | 0 18px 28px 2px $shadow-key-penumbra-opacity,
53 | 0 19px 29px 2px $shadow-key-penumbra-opacity,
54 | 0 20px 31px 3px $shadow-key-penumbra-opacity,
55 | 0 21px 33px 3px $shadow-key-penumbra-opacity,
56 | 0 22px 35px 3px $shadow-key-penumbra-opacity,
57 | 0 23px 36px 3px $shadow-key-penumbra-opacity,
58 | 0 24px 38px 3px $shadow-key-penumbra-opacity
59 | ) !default;
60 |
61 | $shadow-key-ambient: (
62 | 0 0 0 0 $shadow-key-ambient-opacity,
63 | 0 1px 3px 0 $shadow-key-ambient-opacity,
64 | 0 1px 5px 0 $shadow-key-ambient-opacity,
65 | 0 1px 8px 0 $shadow-key-ambient-opacity,
66 | 0 1px 10px 0 $shadow-key-ambient-opacity,
67 | 0 1px 14px 0 $shadow-key-ambient-opacity,
68 | 0 1px 18px 0 $shadow-key-ambient-opacity,
69 | 0 2px 16px 1px $shadow-key-ambient-opacity,
70 | 0 3px 14px 2px $shadow-key-ambient-opacity,
71 | 0 3px 16px 2px $shadow-key-ambient-opacity,
72 | 0 4px 18px 3px $shadow-key-ambient-opacity,
73 | 0 4px 20px 3px $shadow-key-ambient-opacity,
74 | 0 5px 22px 4px $shadow-key-ambient-opacity,
75 | 0 5px 24px 4px $shadow-key-ambient-opacity,
76 | 0 5px 26px 4px $shadow-key-ambient-opacity,
77 | 0 6px 28px 5px $shadow-key-ambient-opacity,
78 | 0 6px 30px 5px $shadow-key-ambient-opacity,
79 | 0 6px 32px 5px $shadow-key-ambient-opacity,
80 | 0 7px 34px 6px $shadow-key-ambient-opacity,
81 | 0 7px 36px 6px $shadow-key-ambient-opacity,
82 | 0 8px 38px 7px $shadow-key-ambient-opacity,
83 | 0 8px 40px 7px $shadow-key-ambient-opacity,
84 | 0 8px 42px 7px $shadow-key-ambient-opacity,
85 | 0 9px 44px 8px $shadow-key-ambient-opacity,
86 | 0 9px 46px 8px $shadow-key-ambient-opacity
87 | ) !default;
88 |
89 | // MIXINS
90 | @mixin elevation($z, $important: false) {
91 | box-shadow: nth($shadow-key-umbra, $z + 1), nth($shadow-key-penumbra, $z + 1),
92 | nth($shadow-key-ambient, $z + 1) if($important, !important, null);
93 | }
94 |
95 | @mixin elevationTransition($duration: 280ms, $easing: cubic-bezier(0.4, 0, 0.2, 1)) {
96 | transition: box-shadow $duration $easing;
97 | will-change: box-shadow;
98 | }
99 |
--------------------------------------------------------------------------------
/settings/_rtl.scss:
--------------------------------------------------------------------------------
1 | @mixin rtl($name) {
2 | .application {
3 | &--is-rtl {
4 | .#{$name} {
5 | @content;
6 | }
7 | }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/theme.scss:
--------------------------------------------------------------------------------
1 | @import 'settings/theme';
2 |
3 | @mixin theme-light($name) {
4 | .theme--light.#{$name} {
5 | @content;
6 | }
7 | }
8 |
9 | @mixin theme-dark($name) {
10 | .theme--dark.#{$name} {
11 | @content;
12 | }
13 | }
14 |
15 | @mixin theme($theme: light, $name: null) {
16 | @if (not $name) or ($name == '') or ($name == 0) or ($name == ()) or (length($name) == 0) {
17 | @error ('Name parameter expected for mixin: theme().');
18 | }
19 |
20 | @if ($theme == light) {
21 | @include theme-light($name) {
22 | @content;
23 | }
24 | } @else {
25 | @include theme-dark($name) {
26 | @content;
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/tools/_all.scss:
--------------------------------------------------------------------------------
1 | @import 'bootable';
2 | @import 'helpers/all';
3 |
--------------------------------------------------------------------------------
/tools/_bootable.scss:
--------------------------------------------------------------------------------
1 | @mixin bootable {
2 | transition: none;
3 |
4 | &[data-booted='true'] {
5 | transition: 0.2s map-get($transition, fast-out-slow-in);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/tools/helpers/_all.scss:
--------------------------------------------------------------------------------
1 | @import 'breakpoint';
2 | @import 'colors';
3 | @import 'typography';
4 | @import 'unit';
5 | @import 'value';
6 |
--------------------------------------------------------------------------------
/tools/helpers/_breakpoint.scss:
--------------------------------------------------------------------------------
1 | // @import '../../settings/variables';
2 |
3 | @function breakpoint($value) {
4 | $str: '';
5 |
6 | @if map-has-key($display-breakpoints, $value) {
7 | $str: map-get($display-breakpoints, $value);
8 | } @else {
9 | $str: map-get($display-breakpoints, small-and-up);
10 | @warn 'breakpoint(): "#{$value}" is not defined in your $display-breakpoints setting.';
11 | }
12 |
13 | @return $str;
14 | }
15 |
16 | @mixin breakpoint($value) {
17 | $str: if(map-has-key($display-breakpoints, $value), breakpoint($value), '');
18 |
19 | @if not $str or $str == '' {
20 | @content;
21 | } @else {
22 | @media #{$str} {
23 | @content;
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/tools/helpers/_colors.scss:
--------------------------------------------------------------------------------
1 | @function get-color($palette-key, $shade-key: base) {
2 | //@ Cast everything into strings.
3 | $palette-key: if(type-of($palette-key) != string, #{$palette-key}, $palette-key);
4 | $shade-key: if(type-of($shade-key) != string, #{$shade-key}, $shade-key);
5 |
6 | //@ Error if palette doesn't exist.
7 | @if (not map-has-key($colors, $palette-key)) {
8 | @error 'The color \"#{$palette-key}\" was not found in the $colors variable.';
9 | }
10 |
11 | //@ Material Design shade number to shade name table.
12 | $int-to-shade: (
13 | '50': 'lighten-5',
14 | '100': 'lighten-4',
15 | '200': 'lighten-3',
16 | '300': 'lighten-2',
17 | '400': 'lighten-1',
18 | '500': 'base',
19 | '600': 'darken-1',
20 | '700': 'darken-2',
21 | '800': 'darken-3',
22 | '900': 'darken-4',
23 | A100: 'accent-1',
24 | A200: 'accent-2',
25 | A400: 'accent-3',
26 | A700: 'accent-4',
27 | );
28 |
29 | //@ Fetch palette from maps.
30 | $palette: map-get($colors, $palette-key);
31 |
32 | //@ Fetch color from maps.
33 | $shade: if(
34 | map-has-key($palette, $shade-key),
35 | $shade-key,
36 | if(
37 | map-has-key($int-to-shade, to-upper-case($shade-key)),
38 | map-get($int-to-shade, to-upper-case($shade-key)),
39 | null
40 | )
41 | );
42 |
43 | //@ Error if shade doesn't exist.
44 | @if not map-has-key($palette, $shade) {
45 | @error 'The shade \"#{$shade-key}\" was not found in the \"#{$palette-key}\" palette.';
46 | }
47 |
48 | //@ Return color.
49 | $color: map-get($palette, $shade);
50 |
51 | @return $color;
52 | }
53 |
--------------------------------------------------------------------------------
/tools/helpers/_typography.scss:
--------------------------------------------------------------------------------
1 | // @import '../../settings/variables';
2 |
3 | @function font-weight($weight: regular) {
4 | @return if(
5 | map-has-key($font-weights, $weight),
6 | map-get($font-weights, $weight),
7 | map-get($font-weights, regular)
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/tools/helpers/_unit.scss:
--------------------------------------------------------------------------------
1 | // @import '../../settings/variables';
2 | // @import '../../settings/theme';
3 |
4 | // If true, use rem in styles instead of px.
5 | // NOTE: Has to be here because its used in the variables and theme files.
6 | $values-use-rem: true !default;
7 |
8 | @function _rem-separator($list, $separator: false) {
9 | @if $separator == 'comma' or $separator == 'space' {
10 | @return append($list, null, $separator);
11 | }
12 |
13 | @if function-exists('list-separator') == true {
14 | @return list-separator($list);
15 | }
16 | }
17 |
18 | @function _rem-convert($to, $values...) {
19 | $result: ();
20 | $rem-baseline: variable-exists('font-size-root') and $font-size-root or 100%;
21 | $separator: _rem-separator($values);
22 |
23 | @if unit($rem-baseline) == '%' {
24 | $rem-baseline: ($rem-baseline / 100%) * 16px;
25 | }
26 |
27 | @each $value in $values {
28 | @if type-of($value) == 'number' and unit($value) == 'rem' and $to == 'px' {
29 | $result: append($result, $value / 1rem * $rem-baseline, $separator);
30 | } @else if type-of($value) == 'number' and unit($value) == 'px' and $to == 'rem' {
31 | $result: append($result, $value / $rem-baseline * 1rem, $separator);
32 | } @else if type-of($value) == 'list' {
33 | $value-separator: _rem-separator($value);
34 | $value: _rem-convert($to, $value...);
35 | $value: _rem-separator($value, $value-separator);
36 | $result: append($result, $value, $separator);
37 | } @else {
38 | $result: append($result, $value, $separator);
39 | }
40 | }
41 |
42 | @return if(length($result) == 1, nth($result, 1), $result);
43 | }
44 |
45 | @function rem($values...) {
46 | @if not $values-use-rem {
47 | @return _rem-convert(px, $values...);
48 | } @else {
49 | @return _rem-convert(rem, $values...);
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/tools/helpers/_value.scss:
--------------------------------------------------------------------------------
1 | // @import '../../settings/variables';
2 |
3 | @function map-deep-get($map, $keys...) {
4 | @if type-of($map) != 'map' {
5 | // stylelint-disable-next-line max-line-length
6 | @error 'The argument $map: "#{$map}" is of the incorrect type: "#{type-of($map)}". Type of "map" is required!';
7 | }
8 | @each $key in $keys {
9 | $map: map-get($map, $key);
10 | }
11 | @return $map;
12 | }
13 |
--------------------------------------------------------------------------------
/trumps/_all.scss:
--------------------------------------------------------------------------------
1 | @import 'display';
2 | @import 'helpers';
3 | @import 'spacing';
4 | @import 'text';
5 | @import 'transition';
6 |
--------------------------------------------------------------------------------
/trumps/_display.scss:
--------------------------------------------------------------------------------
1 | @each $size, $media_query in $display-breakpoints {
2 | .hidden {
3 | &-#{$size} {
4 | @media #{$media_query} {
5 | display: none !important;
6 | }
7 | }
8 | }
9 | }
10 |
11 | .overflow-hidden {
12 | overflow: hidden;
13 | }
14 |
15 | .overflow-x-hidden {
16 | overflow-x: hidden;
17 | }
18 |
19 | .overflow-y-hidden {
20 | overflow-y: hidden;
21 | }
22 |
--------------------------------------------------------------------------------
/trumps/_helpers.scss:
--------------------------------------------------------------------------------
1 | .right {
2 | float: right !important;
3 | }
4 |
5 | .left {
6 | float: left !important;
7 | }
8 |
--------------------------------------------------------------------------------
/trumps/_spacing.scss:
--------------------------------------------------------------------------------
1 | .ma-auto {
2 | // NOTE: Switched to shorthand even though Vuetify does the longhand (is there a diff??)
3 | // margin-bottom: auto !important;
4 | // margin-left: auto !important;
5 | // margin-right: auto !important;
6 | // margin-top: auto !important;
7 | margin: auto !important;
8 | }
9 |
10 | .my-auto {
11 | margin-bottom: auto !important;
12 | margin-top: auto !important;
13 | }
14 |
15 | .mx-auto {
16 | margin-left: auto !important;
17 | margin-right: auto !important;
18 | }
19 |
20 | .mt-auto {
21 | margin-top: auto !important;
22 | }
23 |
24 | .mr-auto {
25 | margin-right: auto !important;
26 | }
27 |
28 | .mb-auto {
29 | margin-bottom: auto !important;
30 | }
31 |
32 | .ml-auto {
33 | margin-left: auto !important;
34 | }
35 |
36 | @each $level, $spacer in $spacers {
37 | $i: index($spacers, ($level $spacer)) - 1;
38 |
39 | .mt-#{$i} {
40 | margin-top: map-get($spacer, y) !important;
41 | }
42 |
43 | .mr-#{$i} {
44 | margin-right: map-get($spacer, x) !important;
45 | }
46 |
47 | .mb-#{$i} {
48 | margin-bottom: map-get($spacer, y) !important;
49 | }
50 |
51 | .ml-#{$i} {
52 | margin-left: map-get($spacer, x) !important;
53 | }
54 |
55 | .mx-#{$i} {
56 | margin-left: map-get($spacer, x) !important;
57 | margin-right: map-get($spacer, x) !important;
58 | }
59 |
60 | .my-#{$i} {
61 | margin-bottom: map-get($spacer, y) !important;
62 | margin-top: map-get($spacer, y) !important;
63 | }
64 |
65 | .ma-#{$i} {
66 | margin: map-get($spacer, y) map-get($spacer, x) !important;
67 | }
68 |
69 | .pt-#{$i} {
70 | padding-top: map-get($spacer, y) !important;
71 | }
72 |
73 | .pr-#{$i} {
74 | padding-right: map-get($spacer, x) !important;
75 | }
76 |
77 | .pb-#{$i} {
78 | padding-bottom: map-get($spacer, y) !important;
79 | }
80 |
81 | .pl-#{$i} {
82 | padding-left: map-get($spacer, x) !important;
83 | }
84 |
85 | .px-#{$i} {
86 | padding-left: map-get($spacer, x) !important;
87 | padding-right: map-get($spacer, x) !important;
88 | }
89 |
90 | .py-#{$i} {
91 | padding-bottom: map-get($spacer, y) !important;
92 | padding-top: map-get($spacer, y) !important;
93 | }
94 |
95 | .pa-#{$i} {
96 | padding: map-get($spacer, y) map-get($spacer, x) !important;
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/trumps/_text.scss:
--------------------------------------------------------------------------------
1 | @each $size, $width in $grid-breakpoints {
2 | @media all and (min-width: $width) {
3 | .text-#{$size}-left {
4 | text-align: left !important;
5 | }
6 |
7 | .text-#{$size}-center {
8 | text-align: center !important;
9 | }
10 |
11 | .text-#{$size}-right {
12 | text-align: right !important;
13 | }
14 |
15 | .text-#{$size}-justify {
16 | text-align: justify !important;
17 | }
18 | }
19 | }
20 |
21 | @each $name, $weight in $font-weights {
22 | .font-weight {
23 | &-#{$name} {
24 | font-weight: $weight !important;
25 | }
26 | }
27 | }
28 |
29 | .font-italic {
30 | font-style: italic !important;
31 | }
32 |
33 | .text-capitalize {
34 | text-transform: capitalize !important;
35 | }
36 |
37 | .text-lowercase {
38 | text-transform: lowercase !important;
39 | }
40 |
41 | .text-none {
42 | text-transform: none !important;
43 | }
44 |
45 | .text-uppercase {
46 | text-transform: uppercase !important;
47 | }
48 |
49 | .text-no-wrap {
50 | white-space: nowrap !important;
51 | }
52 |
53 | .text-truncate {
54 | overflow: hidden !important;
55 | text-overflow: ellipsis !important;
56 | white-space: nowrap !important;
57 | }
58 |
--------------------------------------------------------------------------------
/trumps/_transition.scss:
--------------------------------------------------------------------------------
1 | @each $name, $bezier in $transition {
2 | .transition-#{$name} {
3 | transition: 0.3s $bezier !important;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------