vuetiwatch 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +232 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +41 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +58 -0
- package/dist/plugin.js.map +1 -0
- package/dist/registry.d.ts +17 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +37 -0
- package/dist/registry.js.map +1 -0
- package/dist/styles/aurora.css +74 -0
- package/dist/styles/aurora.min.css +1 -0
- package/dist/styles/brutalist.css +48 -0
- package/dist/styles/brutalist.min.css +1 -0
- package/dist/styles/calm.css +21 -0
- package/dist/styles/calm.min.css +1 -0
- package/dist/styles/clay.css +44 -0
- package/dist/styles/clay.min.css +1 -0
- package/dist/styles/core.css +140 -0
- package/dist/styles/core.min.css +1 -0
- package/dist/styles/darkGlass.css +43 -0
- package/dist/styles/darkGlass.min.css +1 -0
- package/dist/styles/liquidGlass.css +100 -0
- package/dist/styles/liquidGlass.min.css +1 -0
- package/dist/styles/lux.css +21 -0
- package/dist/styles/lux.min.css +1 -0
- package/dist/styles/morph.css +37 -0
- package/dist/styles/morph.min.css +1 -0
- package/dist/styles/neon.css +41 -0
- package/dist/styles/neon.min.css +1 -0
- package/dist/styles/paper.css +17 -0
- package/dist/styles/paper.min.css +1 -0
- package/dist/styles/sketchy.css +25 -0
- package/dist/styles/sketchy.min.css +1 -0
- package/dist/styles/slate.css +16 -0
- package/dist/styles/slate.min.css +1 -0
- package/dist/styles/soft.css +46 -0
- package/dist/styles/soft.min.css +1 -0
- package/dist/styles.css +686 -0
- package/dist/styles.min.css +1 -0
- package/dist/themes/aurora.d.ts +10 -0
- package/dist/themes/aurora.d.ts.map +1 -0
- package/dist/themes/aurora.js +86 -0
- package/dist/themes/aurora.js.map +1 -0
- package/dist/themes/brutalist.d.ts +10 -0
- package/dist/themes/brutalist.d.ts.map +1 -0
- package/dist/themes/brutalist.js +103 -0
- package/dist/themes/brutalist.js.map +1 -0
- package/dist/themes/calm.d.ts +11 -0
- package/dist/themes/calm.d.ts.map +1 -0
- package/dist/themes/calm.js +88 -0
- package/dist/themes/calm.js.map +1 -0
- package/dist/themes/classic.d.ts +6 -0
- package/dist/themes/classic.d.ts.map +1 -0
- package/dist/themes/classic.js +23 -0
- package/dist/themes/classic.js.map +1 -0
- package/dist/themes/clay.d.ts +8 -0
- package/dist/themes/clay.d.ts.map +1 -0
- package/dist/themes/clay.js +80 -0
- package/dist/themes/clay.js.map +1 -0
- package/dist/themes/darkGlass.d.ts +7 -0
- package/dist/themes/darkGlass.d.ts.map +1 -0
- package/dist/themes/darkGlass.js +77 -0
- package/dist/themes/darkGlass.js.map +1 -0
- package/dist/themes/index.d.ts +15 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +15 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/liquidGlass.d.ts +19 -0
- package/dist/themes/liquidGlass.d.ts.map +1 -0
- package/dist/themes/liquidGlass.js +111 -0
- package/dist/themes/liquidGlass.js.map +1 -0
- package/dist/themes/lux.d.ts +8 -0
- package/dist/themes/lux.d.ts.map +1 -0
- package/dist/themes/lux.js +91 -0
- package/dist/themes/lux.js.map +1 -0
- package/dist/themes/morph.d.ts +10 -0
- package/dist/themes/morph.d.ts.map +1 -0
- package/dist/themes/morph.js +82 -0
- package/dist/themes/morph.js.map +1 -0
- package/dist/themes/neon.d.ts +7 -0
- package/dist/themes/neon.d.ts.map +1 -0
- package/dist/themes/neon.js +96 -0
- package/dist/themes/neon.js.map +1 -0
- package/dist/themes/paper.d.ts +7 -0
- package/dist/themes/paper.d.ts.map +1 -0
- package/dist/themes/paper.js +88 -0
- package/dist/themes/paper.js.map +1 -0
- package/dist/themes/sketchy.d.ts +11 -0
- package/dist/themes/sketchy.d.ts.map +1 -0
- package/dist/themes/sketchy.js +88 -0
- package/dist/themes/sketchy.js.map +1 -0
- package/dist/themes/slate.d.ts +7 -0
- package/dist/themes/slate.d.ts.map +1 -0
- package/dist/themes/slate.js +89 -0
- package/dist/themes/slate.js.map +1 -0
- package/dist/themes/soft.d.ts +7 -0
- package/dist/themes/soft.d.ts.map +1 -0
- package/dist/themes/soft.js +84 -0
- package/dist/themes/soft.js.map +1 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util/defaults.d.ts +62 -0
- package/dist/util/defaults.d.ts.map +1 -0
- package/dist/util/defaults.js +100 -0
- package/dist/util/defaults.js.map +1 -0
- package/dist/util/defineTheme.d.ts +21 -0
- package/dist/util/defineTheme.d.ts.map +1 -0
- package/dist/util/defineTheme.js +25 -0
- package/dist/util/defineTheme.js.map +1 -0
- package/dist/util/merge.d.ts +8 -0
- package/dist/util/merge.d.ts.map +1 -0
- package/dist/util/merge.js +17 -0
- package/dist/util/merge.js.map +1 -0
- package/package.json +75 -0
- package/src/index.ts +35 -0
- package/src/plugin.ts +116 -0
- package/src/registry.ts +64 -0
- package/src/styles/core.css +311 -0
- package/src/styles/index.css +30 -0
- package/src/styles/themes/aurora.css +86 -0
- package/src/styles/themes/brutalist.css +59 -0
- package/src/styles/themes/calm.css +31 -0
- package/src/styles/themes/clay.css +60 -0
- package/src/styles/themes/darkGlass.css +69 -0
- package/src/styles/themes/liquidGlass.css +172 -0
- package/src/styles/themes/lux.css +31 -0
- package/src/styles/themes/morph.css +53 -0
- package/src/styles/themes/neon.css +56 -0
- package/src/styles/themes/paper.css +32 -0
- package/src/styles/themes/sketchy.css +34 -0
- package/src/styles/themes/slate.css +26 -0
- package/src/styles/themes/soft.css +63 -0
- package/src/themes/aurora.ts +86 -0
- package/src/themes/brutalist.ts +103 -0
- package/src/themes/calm.ts +88 -0
- package/src/themes/classic.ts +23 -0
- package/src/themes/clay.ts +80 -0
- package/src/themes/darkGlass.ts +77 -0
- package/src/themes/index.ts +14 -0
- package/src/themes/liquidGlass.ts +111 -0
- package/src/themes/lux.ts +91 -0
- package/src/themes/morph.ts +82 -0
- package/src/themes/neon.ts +96 -0
- package/src/themes/paper.ts +88 -0
- package/src/themes/sketchy.ts +88 -0
- package/src/themes/slate.ts +89 -0
- package/src/themes/soft.ts +84 -0
- package/src/types.ts +44 -0
- package/src/util/defaults.ts +164 -0
- package/src/util/defineTheme.ts +49 -0
- package/src/util/merge.ts +23 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aurora — the showcase theme, so this file is deliberately the busiest in
|
|
3
|
+
* the package.
|
|
4
|
+
*
|
|
5
|
+
* Two techniques carry it. Gradient rims come from a `border` painted with
|
|
6
|
+
* two backgrounds and `mask-composite: exclude`, which draws a gradient in
|
|
7
|
+
* the border box only — a gradient `border-image` cannot follow a rounded
|
|
8
|
+
* corner. Depth comes from `radial-gradient` glows rather than shadows,
|
|
9
|
+
* because on a near-black ground a shadow is invisible and light is not.
|
|
10
|
+
*
|
|
11
|
+
* Everything reads `--v-vw-gradient`, so overriding that one variable
|
|
12
|
+
* restyles the entire theme.
|
|
13
|
+
*/
|
|
14
|
+
.v-theme--aurora {
|
|
15
|
+
/* The lit ground the glows sit on. */
|
|
16
|
+
&.v-application {
|
|
17
|
+
background-image:
|
|
18
|
+
radial-gradient(60rem 40rem at 15% -10%, rgba(124, 92, 255, 0.16), transparent 60%),
|
|
19
|
+
radial-gradient(50rem 35rem at 95% 5%, rgba(0, 212, 255, 0.12), transparent 60%);
|
|
20
|
+
background-attachment: fixed;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
& .v-card.v-card--variant-elevated {
|
|
24
|
+
background-image: radial-gradient(
|
|
25
|
+
36rem 18rem at 0% 0%,
|
|
26
|
+
rgba(124, 92, 255, 0.14),
|
|
27
|
+
transparent 70%
|
|
28
|
+
);
|
|
29
|
+
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.55);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* An iridescent rim, drawn in the border box only. */
|
|
33
|
+
& :is(.v-card, .v-alert)::after {
|
|
34
|
+
content: '';
|
|
35
|
+
position: absolute;
|
|
36
|
+
inset: 0;
|
|
37
|
+
border-radius: inherit;
|
|
38
|
+
padding: var(--v-vw-border-width);
|
|
39
|
+
background: var(--v-vw-gradient);
|
|
40
|
+
opacity: 0.45;
|
|
41
|
+
mask:
|
|
42
|
+
linear-gradient(#000 0 0) content-box,
|
|
43
|
+
linear-gradient(#000 0 0);
|
|
44
|
+
mask-composite: exclude;
|
|
45
|
+
pointer-events: none;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Filled buttons are the gradient itself. */
|
|
49
|
+
& .v-btn.v-btn--variant-flat.bg-primary {
|
|
50
|
+
background-image: var(--v-vw-gradient);
|
|
51
|
+
box-shadow: 0 6px 24px rgba(124, 92, 255, 0.45);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
& .v-btn.v-btn--variant-flat.bg-primary .v-btn__overlay {
|
|
55
|
+
opacity: 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
& .v-tab__slider {
|
|
59
|
+
background: var(--v-vw-gradient);
|
|
60
|
+
box-shadow: 0 0 16px rgba(124, 92, 255, 0.8);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
& .v-slider-track__fill {
|
|
64
|
+
background: var(--v-vw-gradient);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
& .v-slider-thumb__surface {
|
|
68
|
+
box-shadow: 0 0 0 6px rgba(124, 92, 255, 0.18), 0 0 16px rgba(124, 92, 255, 0.6);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
& .v-selection-control--dirty .v-switch__track {
|
|
72
|
+
background-image: var(--v-vw-gradient);
|
|
73
|
+
box-shadow: 0 0 14px rgba(124, 92, 255, 0.5);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
& :is(.v-menu, .v-dialog) > .v-overlay__content {
|
|
77
|
+
box-shadow: 0 0 0 1px rgba(155, 140, 255, 0.16), 0 24px 64px rgba(0, 0, 0, 0.7);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* The display sizes carry the gradient; body text stays legible. */
|
|
81
|
+
& [class*='-display-'] {
|
|
82
|
+
background: var(--v-vw-gradient);
|
|
83
|
+
background-clip: text;
|
|
84
|
+
color: transparent;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brutalist — the shadow has no blur, so it is a second shape rather than a
|
|
3
|
+
* light effect. Hover slides the element into its own shadow, which is the
|
|
4
|
+
* whole interaction language of the style.
|
|
5
|
+
*/
|
|
6
|
+
.v-theme--brutalist {
|
|
7
|
+
--vw-brut-offset: 4px;
|
|
8
|
+
|
|
9
|
+
& :is(.v-card, .v-btn, .v-alert, .v-chip, .v-table, .v-btn-group, .v-expansion-panels):not(.v-btn--variant-text, .v-btn--variant-plain, .v-card--variant-text, .v-card--variant-plain) {
|
|
10
|
+
box-shadow: var(--vw-brut-offset) var(--vw-brut-offset) 0 rgb(var(--v-shadow-color));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
& :is(.v-btn, .v-chip, .v-btn-group):not(.v-btn--variant-text, .v-btn--variant-plain):not(.v-btn--disabled, .v-btn-group *) {
|
|
14
|
+
border: var(--v-vw-border-width) solid rgb(var(--v-shadow-color));
|
|
15
|
+
transition: transform 0.08s steps(2, end), box-shadow 0.08s steps(2, end);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* Pressed elements travel the full offset and land flat. */
|
|
19
|
+
& .v-btn:active:not(.v-btn--disabled) {
|
|
20
|
+
transform: translate(var(--vw-brut-offset), var(--vw-brut-offset));
|
|
21
|
+
box-shadow: 0 0 0 rgb(var(--v-shadow-color));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
& .v-btn:not(.v-btn--variant-text, .v-btn--variant-plain):hover:not(.v-btn--disabled, .v-btn-group *) {
|
|
25
|
+
transform: translate(-1px, -1px);
|
|
26
|
+
box-shadow: 5px 5px 0 rgb(var(--v-shadow-color));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
& :is(.v-menu, .v-dialog) > .v-overlay__content {
|
|
30
|
+
border: var(--v-vw-border-width) solid rgb(var(--v-shadow-color));
|
|
31
|
+
box-shadow: 8px 8px 0 rgb(var(--v-shadow-color));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
& :is(.v-table thead th, .v-data-table__th) {
|
|
35
|
+
background-color: rgb(var(--v-theme-secondary));
|
|
36
|
+
border-bottom: var(--v-vw-border-width) solid rgb(var(--v-shadow-color));
|
|
37
|
+
text-transform: uppercase;
|
|
38
|
+
font-weight: 700;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
/* Panels are cards here, so they wear the same rule as one. */
|
|
44
|
+
& .v-expansion-panels {
|
|
45
|
+
border: var(--v-vw-border-width) solid rgb(var(--v-shadow-color));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@media (prefers-reduced-motion: reduce) {
|
|
52
|
+
.v-theme--brutalist .v-btn {
|
|
53
|
+
transition: none;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.v-theme--brutalist .v-btn:hover:not(.v-btn--disabled) {
|
|
57
|
+
transform: none;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calm — this file is mostly subtraction. Everything that would raise,
|
|
3
|
+
* fill or outline a surface is taken away, leaving space to do the work.
|
|
4
|
+
*/
|
|
5
|
+
.v-theme--calm {
|
|
6
|
+
& :is(.v-card, .v-sheet, .v-table, .v-list, .v-expansion-panels) {
|
|
7
|
+
box-shadow: none;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* Surfaces separate by tone alone, at the smallest step that still reads. */
|
|
11
|
+
& .v-card.v-card--variant-flat {
|
|
12
|
+
background-color: rgb(var(--v-theme-surface));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
& :is(.v-menu, .v-dialog) > .v-overlay__content {
|
|
16
|
+
border: var(--v-vw-border-width) solid rgba(var(--v-border-color), 0.09);
|
|
17
|
+
box-shadow: 0 16px 48px rgba(58, 58, 54, 0.06);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
& :is(.v-table thead th, .v-data-table__th) {
|
|
22
|
+
font-weight: 500;
|
|
23
|
+
border-bottom: var(--v-vw-border-width) solid rgba(var(--v-border-color), 0.09);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
/* Room to breathe is the theme's only real ornament. */
|
|
28
|
+
& .v-card-text {
|
|
29
|
+
line-height: 1.7;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clay — three shadows make a shape look inflated rather than cut out: a
|
|
3
|
+
* soft drop below, a white rim above, and an inner one that rounds the
|
|
4
|
+
* body away from its own edge.
|
|
5
|
+
*/
|
|
6
|
+
.v-theme--clay {
|
|
7
|
+
--vw-clay-lift:
|
|
8
|
+
8px 8px 20px rgba(var(--v-shadow-color), 0.18),
|
|
9
|
+
-6px -6px 16px rgba(255, 255, 255, 0.9),
|
|
10
|
+
inset -4px -4px 12px rgba(var(--v-shadow-color), 0.06),
|
|
11
|
+
inset 4px 4px 10px rgba(255, 255, 255, 0.7);
|
|
12
|
+
|
|
13
|
+
& :is(.v-card, .v-btn, .v-alert, .v-btn-group, .v-expansion-panels):not(.v-btn--variant-text, .v-btn--variant-plain, .v-card--variant-text, .v-card--variant-plain, .v-btn--size-small, .v-btn--size-x-small) {
|
|
14
|
+
box-shadow: var(--vw-clay-lift);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The full lift is built for card-sized surfaces. On a pill the inner
|
|
19
|
+
* highlight fills most of the shape, and the white glow of a row of them
|
|
20
|
+
* pools into a pale band with visible edges — so small controls get a
|
|
21
|
+
* scaled-down version with no inset at all.
|
|
22
|
+
*/
|
|
23
|
+
& :is(.v-chip, .v-btn--size-small, .v-btn--size-x-small):not(.v-btn--variant-text, .v-btn--variant-plain) {
|
|
24
|
+
box-shadow:
|
|
25
|
+
3px 3px 7px rgba(var(--v-shadow-color), 0.13),
|
|
26
|
+
-2px -2px 5px rgba(255, 255, 255, 0.6);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
& .v-btn:active:not(.v-btn--disabled) {
|
|
30
|
+
box-shadow:
|
|
31
|
+
4px 4px 10px rgba(var(--v-shadow-color), 0.16),
|
|
32
|
+
inset -3px -3px 10px rgba(var(--v-shadow-color), 0.1),
|
|
33
|
+
inset 3px 3px 8px rgba(255, 255, 255, 0.6);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
& .v-field.v-field--variant-solo {
|
|
37
|
+
background: rgb(var(--v-theme-surface));
|
|
38
|
+
box-shadow:
|
|
39
|
+
inset 4px 4px 10px rgba(var(--v-shadow-color), 0.12),
|
|
40
|
+
inset -4px -4px 10px rgba(255, 255, 255, 0.9);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
& :is(.v-switch__track, .v-slider-track) {
|
|
44
|
+
box-shadow: inset 2px 2px 6px rgba(var(--v-shadow-color), 0.18);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
& :is(.v-switch__thumb, .v-slider-thumb__surface) {
|
|
48
|
+
box-shadow:
|
|
49
|
+
3px 3px 8px rgba(var(--v-shadow-color), 0.24),
|
|
50
|
+
-2px -2px 6px rgba(255, 255, 255, 0.9);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
& :is(.v-menu, .v-dialog) > .v-overlay__content {
|
|
54
|
+
box-shadow: 12px 12px 40px rgba(var(--v-shadow-color), 0.24);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
& .v-tab__slider {
|
|
58
|
+
border-radius: 5px;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dark Glass — translucent surfaces with a backdrop blur and an inset top
|
|
3
|
+
* highlight, so stacked panels read as sheets of glass.
|
|
4
|
+
*
|
|
5
|
+
* `backdrop-filter` only shows through to what is actually behind the
|
|
6
|
+
* element, so give `v-app` a gradient or image for the effect to register.
|
|
7
|
+
*/
|
|
8
|
+
.v-theme--darkGlass {
|
|
9
|
+
/**
|
|
10
|
+
* Only frost surfaces that have no colour of their own: `[class*='bg-']`
|
|
11
|
+
* means the author passed `color=""`, and the text/plain card variants are
|
|
12
|
+
* meant to be transparent.
|
|
13
|
+
*/
|
|
14
|
+
& :is(.v-card, .v-app-bar, .v-navigation-drawer, .v-toolbar):not(
|
|
15
|
+
[class*='bg-'],
|
|
16
|
+
.v-card--variant-text,
|
|
17
|
+
.v-card--variant-plain
|
|
18
|
+
) {
|
|
19
|
+
background-color: rgba(var(--v-theme-surface), 0.62);
|
|
20
|
+
backdrop-filter: blur(18px) saturate(160%);
|
|
21
|
+
border: 1px solid rgba(var(--v-border-color), var(--v-border-opacity));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Outer depth plus the inset highlight that sells the glass reading. */
|
|
25
|
+
& .v-card.v-card--variant-elevated {
|
|
26
|
+
box-shadow:
|
|
27
|
+
inset 0 1px 0 rgba(var(--v-theme-primary), 0.28),
|
|
28
|
+
0 8px 32px rgba(var(--v-shadow-color), 0.45);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
& :is(.v-menu, .v-dialog) > .v-overlay__content {
|
|
32
|
+
backdrop-filter: blur(18px) saturate(160%);
|
|
33
|
+
box-shadow: 0 16px 48px rgba(var(--v-shadow-color), 0.55);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
& .v-field.v-field--variant-solo-filled .v-field__overlay {
|
|
37
|
+
background-color: rgba(var(--v-theme-surface-bright), 0.45);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
& .v-btn.v-btn--variant-flat:not(.v-btn--disabled) {
|
|
41
|
+
box-shadow: 0 4px 20px rgba(var(--v-theme-primary), 0.35);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* The active tab glows rather than underlines. */
|
|
45
|
+
& .v-tab__slider {
|
|
46
|
+
box-shadow: 0 0 12px rgba(var(--v-theme-primary), 0.8);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* A halo around the thumb, the same idea as the frosted panels. */
|
|
50
|
+
& .v-slider-thumb__surface {
|
|
51
|
+
box-shadow: 0 0 0 6px rgba(var(--v-theme-primary), 0.16);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
& .v-switch__track {
|
|
55
|
+
backdrop-filter: blur(6px);
|
|
56
|
+
border: 1px solid rgba(var(--v-border-color), var(--v-border-opacity));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
61
|
+
.v-theme--darkGlass :is(.v-card, .v-app-bar, .v-navigation-drawer, .v-toolbar):not(
|
|
62
|
+
[class*='bg-'],
|
|
63
|
+
.v-card--variant-text,
|
|
64
|
+
.v-card--variant-plain
|
|
65
|
+
) {
|
|
66
|
+
background-color: rgb(var(--v-theme-surface));
|
|
67
|
+
backdrop-filter: none;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Liquid Glass — thickness, not just blur.
|
|
3
|
+
*
|
|
4
|
+
* A pane reads as glass when three things happen at once: the backdrop is
|
|
5
|
+
* over-saturated so colour bends through it, a bright specular rim runs
|
|
6
|
+
* along the top edge with a darker one along the bottom, and there is
|
|
7
|
+
* something behind it worth refracting. Remove any one and it collapses
|
|
8
|
+
* into ordinary frosting.
|
|
9
|
+
*/
|
|
10
|
+
.v-theme--liquidGlass {
|
|
11
|
+
/* Two adjacent hues only — blue into indigo, the way iOS washes a
|
|
12
|
+
wallpaper. A third hue from across the wheel turns it into a smear. */
|
|
13
|
+
&.v-application {
|
|
14
|
+
background-image:
|
|
15
|
+
radial-gradient(65rem 45rem at 8% -8%, rgba(0, 122, 255, 0.3), transparent 62%),
|
|
16
|
+
radial-gradient(55rem 42rem at 92% 12%, rgba(88, 86, 214, 0.24), transparent 62%),
|
|
17
|
+
linear-gradient(165deg, rgba(0, 122, 255, 0) 45%, rgba(0, 122, 255, 0.12) 100%);
|
|
18
|
+
background-attachment: fixed;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
& :is(
|
|
22
|
+
.v-card,
|
|
23
|
+
.v-app-bar,
|
|
24
|
+
.v-toolbar,
|
|
25
|
+
.v-navigation-drawer,
|
|
26
|
+
.v-table,
|
|
27
|
+
.v-expansion-panels
|
|
28
|
+
):not(
|
|
29
|
+
[class*='bg-'],
|
|
30
|
+
.v-card--variant-text,
|
|
31
|
+
.v-card--variant-plain
|
|
32
|
+
) {
|
|
33
|
+
background-color: rgba(var(--v-theme-surface), 0.6);
|
|
34
|
+
backdrop-filter: blur(30px) saturate(190%);
|
|
35
|
+
box-shadow:
|
|
36
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.9),
|
|
37
|
+
inset 0 0 0 1px rgba(255, 255, 255, 0.35),
|
|
38
|
+
inset 0 -1px 0 rgba(var(--v-shadow-color), 0.08),
|
|
39
|
+
0 10px 34px rgba(var(--v-shadow-color), 0.1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
& :is(.v-menu, .v-dialog) > .v-overlay__content {
|
|
43
|
+
backdrop-filter: blur(30px) saturate(190%);
|
|
44
|
+
box-shadow:
|
|
45
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.9),
|
|
46
|
+
inset 0 0 0 1px rgba(255, 255, 255, 0.35),
|
|
47
|
+
0 18px 52px rgba(var(--v-shadow-color), 0.18);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* A text field is a recess, not a raised pane — so it takes a fill rather
|
|
52
|
+
* than glass, and gets no specular rim.
|
|
53
|
+
*
|
|
54
|
+
* These are UIKit's own values. The point of a grey translucent fill
|
|
55
|
+
* darker than its surroundings is that it stays legible on any backdrop;
|
|
56
|
+
* a white pane over a light ground, which is what this was, disappears.
|
|
57
|
+
*/
|
|
58
|
+
& .v-field.v-field--variant-solo-filled {
|
|
59
|
+
/* tertiarySystemFill */
|
|
60
|
+
background-color: rgba(118, 118, 128, 0.12);
|
|
61
|
+
backdrop-filter: blur(20px) saturate(170%);
|
|
62
|
+
box-shadow: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* Vuetify's own 4% tint would stack on top of the fill above. */
|
|
66
|
+
& .v-field--variant-solo-filled .v-field__overlay {
|
|
67
|
+
opacity: 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
& .v-field.v-field--variant-solo-filled:hover,
|
|
71
|
+
& .v-field.v-field--variant-solo-filled.v-field--focused {
|
|
72
|
+
/* secondarySystemFill */
|
|
73
|
+
background-color: rgba(120, 120, 128, 0.16);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
& .v-btn.v-btn--variant-flat:not(.v-btn--disabled) {
|
|
77
|
+
box-shadow:
|
|
78
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.4),
|
|
79
|
+
0 4px 14px rgba(var(--v-shadow-color), 0.22);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* A segmented control is a filled track with the selection riding on it
|
|
84
|
+
* as a white pill — not a row of white buttons.
|
|
85
|
+
*/
|
|
86
|
+
& .v-btn-group.v-btn-toggle {
|
|
87
|
+
background-color: rgba(118, 118, 128, 0.12);
|
|
88
|
+
padding: 2px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
& .v-btn-group.v-btn-toggle > .v-btn {
|
|
92
|
+
background-color: transparent;
|
|
93
|
+
border-radius: calc(var(--v-vw-radius) - 2px);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The selected label goes back to the normal text colour: Vuetify pairs
|
|
98
|
+
* the active button's `color` with its `on-` counterpart, which is white
|
|
99
|
+
* here — and this pill is white too. Its state overlay is dropped for the
|
|
100
|
+
* same reason, so nothing tints the pill grey.
|
|
101
|
+
*/
|
|
102
|
+
& .v-btn-group.v-btn-toggle > .v-btn--active {
|
|
103
|
+
background-color: rgb(var(--v-theme-surface));
|
|
104
|
+
color: rgb(var(--v-theme-on-surface));
|
|
105
|
+
box-shadow: 0 2px 6px rgba(var(--v-shadow-color), 0.16);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
& .v-btn-group.v-btn-toggle > .v-btn--active > .v-btn__overlay {
|
|
109
|
+
opacity: 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
& .v-slider-thumb__surface {
|
|
113
|
+
box-shadow:
|
|
114
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.85),
|
|
115
|
+
0 2px 8px rgba(var(--v-shadow-color), 0.28);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
& [class*='-title-'] {
|
|
120
|
+
letter-spacing: -0.01em;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Hairline separators, not borders. */
|
|
124
|
+
& :is(.v-divider, .v-table tbody td, .v-data-table__td) {
|
|
125
|
+
border-color: rgba(var(--v-border-color), 0.14);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
& .v-divider {
|
|
129
|
+
opacity: 1;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* A grouped list, not a data grid: the header is a quiet label above the
|
|
134
|
+
* rows rather than a bold band, and the table itself is transparent so
|
|
135
|
+
* the pane behind it shows through.
|
|
136
|
+
*/
|
|
137
|
+
& :is(.v-table, .v-table__wrapper, .v-table > .v-table__wrapper > table) {
|
|
138
|
+
background: transparent;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
& :is(.v-table thead th, .v-data-table__th) {
|
|
142
|
+
background: transparent;
|
|
143
|
+
font-size: 0.8125rem;
|
|
144
|
+
font-weight: 500;
|
|
145
|
+
letter-spacing: 0;
|
|
146
|
+
color: rgba(var(--v-theme-on-surface), 0.5);
|
|
147
|
+
border-bottom: 1px solid rgba(var(--v-border-color), 0.14);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
153
|
+
.v-theme--liquidGlass.v-application {
|
|
154
|
+
background-image: none;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.v-theme--liquidGlass :is(
|
|
158
|
+
.v-card,
|
|
159
|
+
.v-app-bar,
|
|
160
|
+
.v-toolbar,
|
|
161
|
+
.v-navigation-drawer,
|
|
162
|
+
.v-table,
|
|
163
|
+
.v-expansion-panels
|
|
164
|
+
):not(
|
|
165
|
+
[class*='bg-'],
|
|
166
|
+
.v-card--variant-text,
|
|
167
|
+
.v-card--variant-plain
|
|
168
|
+
) {
|
|
169
|
+
background-color: rgb(var(--v-theme-surface));
|
|
170
|
+
backdrop-filter: none;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lux — everything here is typography and negative space. The only marks
|
|
3
|
+
* on the page are hairlines, so the few that exist have to be precise.
|
|
4
|
+
*/
|
|
5
|
+
.v-theme--lux {
|
|
6
|
+
& :is(.v-card, .v-sheet, .v-table, .v-list, .v-expansion-panels) {
|
|
7
|
+
box-shadow: none;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
& :is(.v-toolbar-title, .v-card-title, .v-list-subheader) {
|
|
12
|
+
letter-spacing: 0.16em;
|
|
13
|
+
text-transform: uppercase;
|
|
14
|
+
font-weight: 400;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
& :is(.v-table thead th, .v-data-table__th) {
|
|
18
|
+
letter-spacing: 0.16em;
|
|
19
|
+
text-transform: uppercase;
|
|
20
|
+
font-weight: 400;
|
|
21
|
+
font-size: 0.75rem;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
& :is(.v-menu, .v-dialog) > .v-overlay__content {
|
|
25
|
+
border: var(--v-vw-border-width) solid rgba(var(--v-border-color), 0.14);
|
|
26
|
+
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.08);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Morph — the entire theme is two shadows. Raised surfaces get a dark one
|
|
3
|
+
* bottom-right and a light one top-left; anything the user types into or
|
|
4
|
+
* presses gets the same pair inverted, so it reads as pushed in.
|
|
5
|
+
*
|
|
6
|
+
* `--v-shadow-color` carries the dark half so a derived theme can retune
|
|
7
|
+
* the whole relief by changing one value.
|
|
8
|
+
*/
|
|
9
|
+
.v-theme--morph {
|
|
10
|
+
--vw-morph-raised:
|
|
11
|
+
6px 6px 12px rgba(var(--v-shadow-color), 0.5),
|
|
12
|
+
-6px -6px 12px rgba(255, 255, 255, 0.85);
|
|
13
|
+
--vw-morph-pressed:
|
|
14
|
+
inset 3px 3px 7px rgba(var(--v-shadow-color), 0.55),
|
|
15
|
+
inset -3px -3px 7px rgba(255, 255, 255, 0.9);
|
|
16
|
+
|
|
17
|
+
& :is(.v-card, .v-btn, .v-alert, .v-btn-group, .v-expansion-panels, .v-sheet--variant-flat):not(.v-btn--variant-text, .v-btn--variant-plain, .v-card--variant-text, .v-card--variant-plain, .v-btn--size-small, .v-btn--size-x-small) {
|
|
18
|
+
box-shadow: var(--vw-morph-raised);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* Relief scaled to the element: a pill is too small to carry the full
|
|
22
|
+
pair, and a row of them merges into one pale band. */
|
|
23
|
+
& :is(.v-chip, .v-btn--size-small, .v-btn--size-x-small):not(.v-btn--variant-text, .v-btn--variant-plain) {
|
|
24
|
+
box-shadow:
|
|
25
|
+
3px 3px 7px rgba(var(--v-shadow-color), 0.38),
|
|
26
|
+
-3px -3px 6px rgba(255, 255, 255, 0.6);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Inputs are recesses, not tiles. */
|
|
30
|
+
& :is(.v-field--variant-solo, .v-switch__track, .v-slider-track) {
|
|
31
|
+
background: rgb(var(--v-theme-background));
|
|
32
|
+
box-shadow: var(--vw-morph-pressed);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
& .v-btn:active:not(.v-btn--disabled),
|
|
36
|
+
& .v-btn--active {
|
|
37
|
+
box-shadow: var(--vw-morph-pressed);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
& .v-slider-thumb__surface {
|
|
41
|
+
box-shadow: var(--vw-morph-raised);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* A divider would be a seam in something meant to be one sheet. */
|
|
45
|
+
& :is(.v-divider, .v-table tbody td) {
|
|
46
|
+
border-color: transparent;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
& .v-tab__slider {
|
|
50
|
+
border-radius: 4px;
|
|
51
|
+
box-shadow: var(--vw-morph-raised);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Neon — glow replaces elevation. Shadows are coloured by the theme's own
|
|
3
|
+
* primary, so a derived theme that swaps the accent gets a matching glow
|
|
4
|
+
* for free.
|
|
5
|
+
*/
|
|
6
|
+
.v-theme--neon {
|
|
7
|
+
& :is(.v-card, .v-sheet, .v-list, .v-table, .v-expansion-panels) {
|
|
8
|
+
box-shadow: none;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
& .v-card.v-card--variant-outlined {
|
|
12
|
+
box-shadow: 0 0 0 1px rgba(var(--v-theme-primary), 0.12);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
& .v-btn.v-btn--variant-outlined:not(.v-btn--disabled):hover {
|
|
16
|
+
box-shadow:
|
|
17
|
+
0 0 0 1px rgba(var(--v-theme-primary), 0.6),
|
|
18
|
+
0 0 18px rgba(var(--v-theme-primary), 0.35);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
& .v-btn.v-btn--variant-flat:not(.v-btn--disabled) {
|
|
22
|
+
box-shadow: 0 0 22px rgba(var(--v-theme-primary), 0.45);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
& :is(.v-menu, .v-dialog) > .v-overlay__content {
|
|
26
|
+
box-shadow:
|
|
27
|
+
0 0 0 1px rgba(var(--v-theme-primary), 0.35),
|
|
28
|
+
0 12px 48px rgba(0, 0, 0, 0.75);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Monospace headings want to read as labels, not prose. */
|
|
32
|
+
|
|
33
|
+
& .v-app-bar {
|
|
34
|
+
box-shadow: inset 0 -1px 0 rgba(var(--v-theme-primary), 0.3);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
& .v-slider-thumb__surface {
|
|
38
|
+
box-shadow: 0 0 12px rgba(var(--v-theme-primary), 0.6);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
& .v-tab__slider {
|
|
42
|
+
box-shadow: 0 0 14px rgba(var(--v-theme-primary), 0.9);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
& .v-selection-control--dirty .v-switch__track {
|
|
46
|
+
box-shadow: 0 0 14px rgba(var(--v-theme-primary), 0.55);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
& .v-expansion-panels {
|
|
53
|
+
box-shadow: 0 0 0 1px rgba(var(--v-theme-primary), 0.12);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paper — flat by construction. Elevation is replaced with hairline rules,
|
|
3
|
+
* and headings get the tighter tracking a serif face wants.
|
|
4
|
+
*
|
|
5
|
+
* Vuetify emits its theme colors as bare `r, g, b` triples, so every color
|
|
6
|
+
* here goes through `rgba(var(--v-theme-*), a)`.
|
|
7
|
+
*/
|
|
8
|
+
.v-theme--paper {
|
|
9
|
+
& :is(.v-card, .v-sheet, .v-list, .v-table, .v-expansion-panels) {
|
|
10
|
+
box-shadow: none;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
& .v-card.v-card--variant-elevated {
|
|
14
|
+
border: var(--v-vw-border-width, 1px) solid
|
|
15
|
+
rgba(var(--v-border-color), var(--v-border-opacity));
|
|
16
|
+
box-shadow: none;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
/* A printed rule under the active tab, not a Material underline. */
|
|
21
|
+
|
|
22
|
+
/* The switch gets an outline for the same reason cards do. */
|
|
23
|
+
& .v-switch__track {
|
|
24
|
+
border: var(--v-vw-border-width, 1px) solid rgba(var(--v-border-color), 0.3);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* A double rule under the table head, the way print sets one. */
|
|
28
|
+
& :is(.v-table thead th, .v-data-table__th) {
|
|
29
|
+
border-bottom: 3px double rgba(var(--v-border-color), 0.45);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sketchy — the wobble comes from `--v-vw-radius` in the theme itself, so
|
|
3
|
+
* this file only adds what a pen stroke does that a border cannot: an
|
|
4
|
+
* uneven weight, and a redrawn line on hover.
|
|
5
|
+
*/
|
|
6
|
+
.v-theme--sketchy {
|
|
7
|
+
& :is(.v-card, .v-sheet, .v-table, .v-list, .v-expansion-panels) {
|
|
8
|
+
box-shadow: none;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* Ink is never perfectly even — the bottom of a stroke sits heavier. */
|
|
12
|
+
& :is(.v-btn--variant-outlined, .v-card--variant-outlined, .v-alert--variant-outlined) {
|
|
13
|
+
border-bottom-width: calc(var(--v-vw-border-width) + 1px);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Hover redraws the box with the wobble mirrored. */
|
|
17
|
+
& .v-btn.v-btn--variant-outlined:hover {
|
|
18
|
+
border-radius: 5px 22px 6px 20px / 20px 6px 22px 5px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
& :is(.v-table thead th, .v-data-table__th) {
|
|
22
|
+
border-bottom: var(--v-vw-border-width) solid rgba(var(--v-border-color), 0.7);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
& .v-tab__slider {
|
|
26
|
+
border-radius: 8px 3px 8px 3px / 3px 8px 3px 8px;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
31
|
+
.v-theme--sketchy .v-btn {
|
|
32
|
+
transition: border-radius 0.12s steps(2, end);
|
|
33
|
+
}
|
|
34
|
+
}
|