vuetiwatch 0.1.0 → 0.2.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/README.md +200 -17
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +77 -7
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +104 -15
- package/dist/plugin.js.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +6 -1
- package/dist/registry.js.map +1 -1
- package/dist/styles/atlas.css +99 -0
- package/dist/styles/atlas.min.css +1 -0
- package/dist/styles/atlasDark.css +99 -0
- package/dist/styles/atlasDark.min.css +1 -0
- package/dist/styles/atlasSepia.css +99 -0
- package/dist/styles/atlasSepia.min.css +1 -0
- package/dist/styles/aurora.css +97 -4
- package/dist/styles/aurora.min.css +1 -1
- package/dist/styles/brutalist.css +5 -0
- package/dist/styles/brutalist.min.css +1 -1
- package/dist/styles/calm.css +0 -4
- package/dist/styles/calm.min.css +1 -1
- package/dist/styles/candy.css +71 -0
- package/dist/styles/candy.min.css +1 -0
- package/dist/styles/clay.css +13 -0
- package/dist/styles/clay.min.css +1 -1
- package/dist/styles/core.css +239 -36
- package/dist/styles/core.min.css +1 -1
- package/dist/styles/graphite.css +29 -0
- package/dist/styles/graphite.min.css +1 -0
- package/dist/styles/morph.css +12 -0
- package/dist/styles/morph.min.css +1 -1
- package/dist/styles/neon.css +8 -0
- package/dist/styles/neon.min.css +1 -1
- package/dist/styles/sketchy.css +4 -0
- package/dist/styles/sketchy.min.css +1 -1
- package/dist/styles/soft.css +1 -12
- package/dist/styles/soft.min.css +1 -1
- package/dist/styles.css +577 -52
- package/dist/styles.min.css +1 -1
- package/dist/themes/atlas.d.ts +38 -0
- package/dist/themes/atlas.d.ts.map +1 -0
- package/dist/themes/atlas.js +203 -0
- package/dist/themes/atlas.js.map +1 -0
- package/dist/themes/atlasDark.d.ts +8 -0
- package/dist/themes/atlasDark.d.ts.map +1 -0
- package/dist/themes/atlasDark.js +64 -0
- package/dist/themes/atlasDark.js.map +1 -0
- package/dist/themes/atlasSepia.d.ts +11 -0
- package/dist/themes/atlasSepia.d.ts.map +1 -0
- package/dist/themes/atlasSepia.js +60 -0
- package/dist/themes/atlasSepia.js.map +1 -0
- package/dist/themes/aurora.d.ts.map +1 -1
- package/dist/themes/aurora.js +27 -2
- package/dist/themes/aurora.js.map +1 -1
- package/dist/themes/brutalist.d.ts.map +1 -1
- package/dist/themes/brutalist.js +26 -0
- package/dist/themes/brutalist.js.map +1 -1
- package/dist/themes/calm.d.ts.map +1 -1
- package/dist/themes/calm.js +22 -2
- package/dist/themes/calm.js.map +1 -1
- package/dist/themes/candy.d.ts +20 -0
- package/dist/themes/candy.d.ts.map +1 -0
- package/dist/themes/candy.js +142 -0
- package/dist/themes/candy.js.map +1 -0
- package/dist/themes/classic.d.ts.map +1 -1
- package/dist/themes/classic.js +2 -0
- package/dist/themes/classic.js.map +1 -1
- package/dist/themes/clay.d.ts.map +1 -1
- package/dist/themes/clay.js +22 -0
- package/dist/themes/clay.js.map +1 -1
- package/dist/themes/darkGlass.d.ts.map +1 -1
- package/dist/themes/darkGlass.js +21 -0
- package/dist/themes/darkGlass.js.map +1 -1
- package/dist/themes/graphite.d.ts +13 -0
- package/dist/themes/graphite.d.ts.map +1 -0
- package/dist/themes/graphite.js +147 -0
- package/dist/themes/graphite.js.map +1 -0
- package/dist/themes/index.d.ts +5 -0
- package/dist/themes/index.d.ts.map +1 -1
- package/dist/themes/index.js +5 -0
- package/dist/themes/index.js.map +1 -1
- package/dist/themes/liquidGlass.d.ts.map +1 -1
- package/dist/themes/liquidGlass.js +27 -3
- package/dist/themes/liquidGlass.js.map +1 -1
- package/dist/themes/lux.d.ts.map +1 -1
- package/dist/themes/lux.js +21 -2
- package/dist/themes/lux.js.map +1 -1
- package/dist/themes/morph.d.ts.map +1 -1
- package/dist/themes/morph.js +23 -3
- package/dist/themes/morph.js.map +1 -1
- package/dist/themes/neon.d.ts.map +1 -1
- package/dist/themes/neon.js +22 -0
- package/dist/themes/neon.js.map +1 -1
- package/dist/themes/paper.d.ts.map +1 -1
- package/dist/themes/paper.js +16 -0
- package/dist/themes/paper.js.map +1 -1
- package/dist/themes/sketchy.d.ts.map +1 -1
- package/dist/themes/sketchy.js +17 -0
- package/dist/themes/sketchy.js.map +1 -1
- package/dist/themes/slate.d.ts.map +1 -1
- package/dist/themes/slate.js +22 -1
- package/dist/themes/slate.js.map +1 -1
- package/dist/themes/soft.d.ts.map +1 -1
- package/dist/themes/soft.js +21 -2
- package/dist/themes/soft.js.map +1 -1
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/util/defaults.d.ts.map +1 -1
- package/dist/util/defaults.js +11 -1
- package/dist/util/defaults.js.map +1 -1
- package/dist/util/defineTheme.d.ts.map +1 -1
- package/dist/util/defineTheme.js +11 -5
- package/dist/util/defineTheme.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +8 -2
- package/src/plugin.ts +214 -21
- package/src/registry.ts +10 -0
- package/src/styles/core.css +563 -35
- package/src/styles/index.css +4 -0
- package/src/styles/themes/_atlas.css +194 -0
- package/src/styles/themes/atlas.css +2 -0
- package/src/styles/themes/atlasDark.css +2 -0
- package/src/styles/themes/atlasSepia.css +2 -0
- package/src/styles/themes/aurora.css +151 -7
- package/src/styles/themes/brutalist.css +5 -3
- package/src/styles/themes/calm.css +0 -7
- package/src/styles/themes/candy.css +113 -0
- package/src/styles/themes/clay.css +24 -0
- package/src/styles/themes/graphite.css +63 -0
- package/src/styles/themes/liquidGlass.css +0 -2
- package/src/styles/themes/lux.css +0 -4
- package/src/styles/themes/morph.css +22 -0
- package/src/styles/themes/neon.css +8 -3
- package/src/styles/themes/paper.css +0 -2
- package/src/styles/themes/sketchy.css +9 -0
- package/src/styles/themes/slate.css +0 -4
- package/src/styles/themes/soft.css +1 -12
- package/src/themes/atlas.ts +211 -0
- package/src/themes/atlasDark.ts +64 -0
- package/src/themes/atlasSepia.ts +60 -0
- package/src/themes/aurora.ts +30 -2
- package/src/themes/brutalist.ts +29 -0
- package/src/themes/calm.ts +25 -2
- package/src/themes/candy.ts +144 -0
- package/src/themes/classic.ts +3 -0
- package/src/themes/clay.ts +24 -0
- package/src/themes/darkGlass.ts +24 -0
- package/src/themes/graphite.ts +150 -0
- package/src/themes/index.ts +5 -0
- package/src/themes/liquidGlass.ts +30 -3
- package/src/themes/lux.ts +24 -2
- package/src/themes/morph.ts +25 -3
- package/src/themes/neon.ts +25 -0
- package/src/themes/paper.ts +19 -0
- package/src/themes/sketchy.ts +20 -0
- package/src/themes/slate.ts +25 -1
- package/src/themes/soft.ts +24 -2
- package/src/types.ts +41 -0
- package/src/util/defaults.ts +12 -1
- package/src/util/defineTheme.ts +11 -5
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { bars, controls, fields, icons } from '../util/defaults.js'
|
|
2
|
+
import { defineTheme } from '../util/defineTheme.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The plush theme: a warm cream ground and padded, pillowy shapes that
|
|
6
|
+
* squash under a press rather than click.
|
|
7
|
+
*
|
|
8
|
+
* The palette follows what the research on children's interfaces actually
|
|
9
|
+
* finds, which is not the pastel wash the phrase "for kids" suggests.
|
|
10
|
+
* Children are drawn to high brightness, and the apps they stay in
|
|
11
|
+
* (Duolingo, Khan Academy Kids) run saturated accents rather than pastels.
|
|
12
|
+
* But a screen where everything shouts hides which parts are tappable, so
|
|
13
|
+
* the loud colours are spent only on controls: a light neutral ground, one
|
|
14
|
+
* dominant hue, a small accent — roughly the 60/30/10 the guides recommend.
|
|
15
|
+
* Warm hues test slightly ahead of cool ones, hence raspberry over blue,
|
|
16
|
+
* with mint holding the secondary so the status colours stay apart from it.
|
|
17
|
+
*
|
|
18
|
+
* Body text is a deep plum-brown rather than the palette's own pink: the
|
|
19
|
+
* one thing parents notice is whether they can read the screen, and this
|
|
20
|
+
* carries about 12:1 on the cream.
|
|
21
|
+
*/
|
|
22
|
+
export const candy = defineTheme({
|
|
23
|
+
name: 'candy',
|
|
24
|
+
meta: {
|
|
25
|
+
title: 'Candy',
|
|
26
|
+
description: 'Plush and pillowy — warm cream, padded shapes, controls that squash.',
|
|
27
|
+
dark: false,
|
|
28
|
+
iconStyle: 'filled',
|
|
29
|
+
swatch: ['#FFF3EC', '#FFFCFA', '#DC2B6B', '#10837C'],
|
|
30
|
+
fonts: ['Baloo 2', 'Varela Round'],
|
|
31
|
+
},
|
|
32
|
+
theme: {
|
|
33
|
+
dark: false,
|
|
34
|
+
colors: {
|
|
35
|
+
background: '#FFF3EC',
|
|
36
|
+
// Off-white rather than white: cloth catches light, gloss reflects it.
|
|
37
|
+
surface: '#FFFCFA',
|
|
38
|
+
'surface-bright': '#FFFFFF',
|
|
39
|
+
'surface-light': '#FFE6EE',
|
|
40
|
+
'surface-variant': '#5A3340',
|
|
41
|
+
'on-surface-variant': '#FFF6F0',
|
|
42
|
+
primary: '#DC2B6B',
|
|
43
|
+
'primary-darken-1': '#C43668',
|
|
44
|
+
secondary: '#10837C',
|
|
45
|
+
'secondary-darken-1': '#0C7C75',
|
|
46
|
+
error: '#E5484D',
|
|
47
|
+
info: '#3B8FE5',
|
|
48
|
+
success: '#2FA96B',
|
|
49
|
+
warning: '#F2A32C',
|
|
50
|
+
'on-surface': '#46262F',
|
|
51
|
+
'on-background': '#46262F',
|
|
52
|
+
// Vuetify picks the label colour by luminance and settles for
|
|
53
|
+
// about 3:1, which is the bar for large text rather than for a
|
|
54
|
+
// button label. Measured on the filled buttons: success 3:1 → 7:1, info 3.4:1 → 6.2:1, error 3.9:1 → 5.4:1.
|
|
55
|
+
'on-success': '#000000',
|
|
56
|
+
'on-info': '#000000',
|
|
57
|
+
'on-error': '#000000',
|
|
58
|
+
'on-warning': '#3B2600',
|
|
59
|
+
},
|
|
60
|
+
variables: {
|
|
61
|
+
/* A panel standing on its own — a bare list, sheet, banner or table.
|
|
62
|
+
Core owns the selector; this is what it draws with. */
|
|
63
|
+
'vw-panel-shadow': 'var(--vw-candy-pad), var(--vw-candy-rest)',
|
|
64
|
+
'border-color': '#DC2B6B',
|
|
65
|
+
'border-opacity': 0.12,
|
|
66
|
+
'shadow-color': '#C2537E',
|
|
67
|
+
'high-emphasis-opacity': 0.92,
|
|
68
|
+
'medium-emphasis-opacity': 0.66,
|
|
69
|
+
'hover-opacity': 0.07,
|
|
70
|
+
'font-body': "'Varela Round', 'Nunito', system-ui, sans-serif",
|
|
71
|
+
'font-heading': "'Baloo 2', 'Varela Round', system-ui, sans-serif",
|
|
72
|
+
'vw-radius': '20px',
|
|
73
|
+
'vw-radius-lg': '30px',
|
|
74
|
+
// Buttons and chips are lozenges; everything else is generously round.
|
|
75
|
+
'vw-radius-btn': '999px',
|
|
76
|
+
'vw-radius-chip': '999px',
|
|
77
|
+
'vw-radius-thumb': '50%',
|
|
78
|
+
// Outlined variants draw a crayon-thick line rather than a hairline.
|
|
79
|
+
'vw-border-width': '2px',
|
|
80
|
+
'vw-btn-transform': 'none',
|
|
81
|
+
'vw-btn-tracking': '0',
|
|
82
|
+
'vw-btn-weight': '700',
|
|
83
|
+
'vw-heading-weight': '700',
|
|
84
|
+
'vw-heading-tracking': '0',
|
|
85
|
+
'vw-tab-slider-height': '4px',
|
|
86
|
+
'vw-list-bar': '4px',
|
|
87
|
+
'vw-list-bar-color': 'rgb(var(--v-theme-primary))',
|
|
88
|
+
// A wobbly underline reads as drawn by hand rather than by a browser.
|
|
89
|
+
'vw-link-decoration': 'underline wavy',
|
|
90
|
+
'vw-overlay-shadow': '0 18px 44px rgba(var(--v-shadow-color), 0.22)',
|
|
91
|
+
|
|
92
|
+
// A spring that overshoots: the press squashes, the pop lands loud.
|
|
93
|
+
'vw-motion-duration': '220ms',
|
|
94
|
+
'vw-motion-ease': 'cubic-bezier(0.34, 1.56, 0.64, 1)',
|
|
95
|
+
'vw-press-scale': '0.98',
|
|
96
|
+
'vw-press-shift': '2px',
|
|
97
|
+
'vw-hover-lift': '4px',
|
|
98
|
+
'vw-pop-scale': '1.35',
|
|
99
|
+
'vw-pop-duration': '320ms',
|
|
100
|
+
'vw-focus-ring': '3px solid rgb(var(--v-theme-primary))',
|
|
101
|
+
'vw-focus-offset': '3px',
|
|
102
|
+
'vw-theme-transition': '480ms',
|
|
103
|
+
|
|
104
|
+
// A fat ribbon with rounded ends — see the stylesheet.
|
|
105
|
+
'vw-timeline-line': 'rgba(var(--v-theme-primary), 0.3)',
|
|
106
|
+
'vw-timeline-line-width': '6px',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
defaults: [
|
|
110
|
+
{
|
|
111
|
+
// Large by default: the hit area is the accessibility story of a
|
|
112
|
+
// children's app, and a pill that small fingers miss is not cute.
|
|
113
|
+
VBtn: { variant: 'flat', size: 'large' },
|
|
114
|
+
VCard: { variant: 'elevated', elevation: 0 },
|
|
115
|
+
VAlert: { variant: 'tonal' },
|
|
116
|
+
VChip: { variant: 'tonal' },
|
|
117
|
+
},
|
|
118
|
+
fields({ variant: 'solo-filled', flat: true, density: 'comfortable' }),
|
|
119
|
+
controls({ density: 'comfortable' }),
|
|
120
|
+
bars({ flat: true }),
|
|
121
|
+
{
|
|
122
|
+
VSwitch: { inset: true },
|
|
123
|
+
VSlider: { thumbSize: 26, trackSize: 12 },
|
|
124
|
+
// A pill behind the active tab, matching the buttons.
|
|
125
|
+
VTabs: { inset: true, insetRadius: 999 },
|
|
126
|
+
},
|
|
127
|
+
icons({
|
|
128
|
+
// Round, filled and unmistakable — no square boxes anywhere.
|
|
129
|
+
dropdown: 'mdi-chevron-down',
|
|
130
|
+
collapse: 'mdi-chevron-up',
|
|
131
|
+
checkboxOn: 'mdi-checkbox-marked-circle',
|
|
132
|
+
checkboxOff: 'mdi-circle-outline',
|
|
133
|
+
radioOn: 'mdi-circle-slice-8',
|
|
134
|
+
radioOff: 'mdi-circle-outline',
|
|
135
|
+
ratingFull: 'mdi-star',
|
|
136
|
+
ratingEmpty: 'mdi-star-outline',
|
|
137
|
+
clear: 'mdi-close-circle',
|
|
138
|
+
close: 'mdi-close-circle',
|
|
139
|
+
next: 'mdi-chevron-right',
|
|
140
|
+
prev: 'mdi-chevron-left',
|
|
141
|
+
breadcrumbDivider: '•',
|
|
142
|
+
}),
|
|
143
|
+
],
|
|
144
|
+
})
|
package/src/themes/classic.ts
CHANGED
|
@@ -11,6 +11,8 @@ export const classic = defineTheme({
|
|
|
11
11
|
description: 'Vuetify as it ships. Material Design, Roboto, familiar elevation.',
|
|
12
12
|
dark: false,
|
|
13
13
|
iconStyle: 'filled',
|
|
14
|
+
// The control theme: the core layer skips it entirely — see `stock`.
|
|
15
|
+
stock: true,
|
|
14
16
|
swatch: ['#FFFFFF', '#EEEEEE', '#1867C0', '#48A9A6'],
|
|
15
17
|
fonts: ['Roboto'],
|
|
16
18
|
},
|
|
@@ -18,6 +20,7 @@ export const classic = defineTheme({
|
|
|
18
20
|
dark: false,
|
|
19
21
|
variables: {
|
|
20
22
|
'font-body': "'Roboto', system-ui, sans-serif",
|
|
23
|
+
|
|
21
24
|
},
|
|
22
25
|
},
|
|
23
26
|
})
|
package/src/themes/clay.ts
CHANGED
|
@@ -36,12 +36,26 @@ export const clay = defineTheme({
|
|
|
36
36
|
warning: '#FDCB6E',
|
|
37
37
|
'on-surface': '#3D3355',
|
|
38
38
|
'on-background': '#3D3355',
|
|
39
|
+
// Vuetify's automatic pick lands on white here, which is worse by
|
|
40
|
+
// both models — this reads w8.7/a59 against w2.4/a52.
|
|
41
|
+
'on-secondary': '#000000',
|
|
42
|
+
// Vuetify picks the label colour by luminance and settles for
|
|
43
|
+
// about 3:1, which is the bar for large text rather than for a
|
|
44
|
+
// button label. Measured on the filled buttons: error 2.8:1 → 7.6:1.
|
|
45
|
+
'on-error': '#000000',
|
|
39
46
|
'on-warning': '#3D2E00',
|
|
40
47
|
},
|
|
41
48
|
variables: {
|
|
49
|
+
/* A panel standing on its own — a bare list, sheet, banner or table.
|
|
50
|
+
Core owns the selector; this is what it draws with. */
|
|
51
|
+
'vw-panel-shadow': 'var(--vw-clay-lift)',
|
|
42
52
|
'border-color': '#6C5CE7',
|
|
43
53
|
'border-opacity': 0.001,
|
|
54
|
+
// The relief reaches past the shape it lifts — see core.css.
|
|
55
|
+
'vw-relief-inset': '7px',
|
|
44
56
|
'shadow-color': '#5A46B0',
|
|
57
|
+
// Shapes are lifted out of the ground here, not laid on top of it.
|
|
58
|
+
'vw-outlined-fill': 'transparent',
|
|
45
59
|
'high-emphasis-opacity': 0.9,
|
|
46
60
|
'medium-emphasis-opacity': 0.62,
|
|
47
61
|
'hover-opacity': 0.05,
|
|
@@ -54,6 +68,16 @@ export const clay = defineTheme({
|
|
|
54
68
|
'vw-btn-tracking': '0',
|
|
55
69
|
'vw-btn-weight': '700',
|
|
56
70
|
'vw-tab-slider-height': '5px',
|
|
71
|
+
|
|
72
|
+
// Soft mass: it takes a moment to squash and a moment to come back.
|
|
73
|
+
'vw-motion-duration': '200ms',
|
|
74
|
+
'vw-press-scale': '0.97',
|
|
75
|
+
'vw-pop-scale': '1.25',
|
|
76
|
+
'vw-pop-duration': '280ms',
|
|
77
|
+
|
|
78
|
+
// A channel pressed into the ground rather than a line on it.
|
|
79
|
+
'vw-timeline-line': 'rgb(var(--v-theme-background))',
|
|
80
|
+
'vw-timeline-line-width': '8px',
|
|
57
81
|
},
|
|
58
82
|
},
|
|
59
83
|
defaults: [
|
package/src/themes/darkGlass.ts
CHANGED
|
@@ -35,11 +35,24 @@ export const darkGlass = defineTheme({
|
|
|
35
35
|
warning: '#FFB74D',
|
|
36
36
|
'on-surface': '#ECE8F5',
|
|
37
37
|
'on-background': '#F3F0FA',
|
|
38
|
+
// Vuetify picks the label colour by luminance and settles for
|
|
39
|
+
// about 3:1, which is the bar for large text rather than for a
|
|
40
|
+
// button label. Measured on the filled buttons: error 3.1:1 → 6.7:1.
|
|
41
|
+
'on-error': '#000000',
|
|
38
42
|
},
|
|
39
43
|
variables: {
|
|
44
|
+
/* A panel standing on its own — a bare list, sheet, banner or table.
|
|
45
|
+
Core owns the selector; this is what it draws with. */
|
|
46
|
+
'vw-panel-fill': 'rgba(var(--v-theme-surface), 0.62)',
|
|
47
|
+
'vw-panel-filter': 'blur(18px) saturate(160%)',
|
|
48
|
+
'vw-panel-border':
|
|
49
|
+
'1px solid rgba(var(--v-border-color), var(--v-border-opacity))',
|
|
40
50
|
'border-color': '#B9A9FF',
|
|
41
51
|
'border-opacity': 0.16,
|
|
42
52
|
'shadow-color': '#000000',
|
|
53
|
+
// The frost rule below owns the colour; core's default would paint
|
|
54
|
+
// an opaque surface under it and the sheet would stop being glass.
|
|
55
|
+
'vw-outlined-fill': 'rgba(var(--v-theme-surface), 0.62)',
|
|
43
56
|
'high-emphasis-opacity': 0.95,
|
|
44
57
|
'medium-emphasis-opacity': 0.72,
|
|
45
58
|
'hover-opacity': 0.08,
|
|
@@ -50,6 +63,17 @@ export const darkGlass = defineTheme({
|
|
|
50
63
|
'vw-btn-transform': 'none',
|
|
51
64
|
'vw-btn-tracking': '0.01em',
|
|
52
65
|
'vw-btn-weight': '600',
|
|
66
|
+
|
|
67
|
+
// Sheets of glass slide rather than snap.
|
|
68
|
+
'vw-motion-duration': '260ms',
|
|
69
|
+
'vw-press-scale': '0.97',
|
|
70
|
+
'vw-hover-lift': '2px',
|
|
71
|
+
'vw-pop-scale': '1.18',
|
|
72
|
+
'vw-pop-duration': '240ms',
|
|
73
|
+
|
|
74
|
+
// Violet through the glass.
|
|
75
|
+
'vw-timeline-line': 'rgba(var(--v-theme-primary), 0.45)',
|
|
76
|
+
'vw-timeline-line-width': '2px',
|
|
53
77
|
},
|
|
54
78
|
},
|
|
55
79
|
defaults: [
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { bars, controls, fields, icons, tables } from '../util/defaults.js'
|
|
2
|
+
import { defineTheme } from '../util/defineTheme.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The product-dark theme every developer tool converged on: near-black,
|
|
6
|
+
* hairline edges, tight radii, and no shadow anywhere. Depth comes from a
|
|
7
|
+
* lighter surface and a one-pixel line, which is why it stays legible on a
|
|
8
|
+
* dense screen where a stack of drop shadows would turn to mud.
|
|
9
|
+
*
|
|
10
|
+
* The accent is the restraint: `primary` is a near-white, so the one filled
|
|
11
|
+
* button on a screen is the brightest thing on it, and indigo sits in
|
|
12
|
+
* `secondary` for the places that want a hue. The status colours stay
|
|
13
|
+
* saturated — they are the only signal that has to survive a glance.
|
|
14
|
+
*/
|
|
15
|
+
export const graphite = defineTheme({
|
|
16
|
+
name: 'graphite',
|
|
17
|
+
meta: {
|
|
18
|
+
title: 'Graphite',
|
|
19
|
+
description: 'Product dark — near-black, hairline edges, no shadows, mono labels.',
|
|
20
|
+
dark: true,
|
|
21
|
+
iconStyle: 'outline',
|
|
22
|
+
swatch: ['#0A0B0D', '#121417', '#EDEFF2', '#4D64FF'],
|
|
23
|
+
fonts: ['Inter', 'JetBrains Mono'],
|
|
24
|
+
},
|
|
25
|
+
theme: {
|
|
26
|
+
dark: true,
|
|
27
|
+
colors: {
|
|
28
|
+
background: '#0A0B0D',
|
|
29
|
+
surface: '#121417',
|
|
30
|
+
'surface-bright': '#1B1E23',
|
|
31
|
+
'surface-light': '#16191D',
|
|
32
|
+
'surface-variant': '#C3C9D4',
|
|
33
|
+
'on-surface-variant': '#0F1114',
|
|
34
|
+
primary: '#EDEFF2',
|
|
35
|
+
'primary-darken-1': '#C9CDD4',
|
|
36
|
+
secondary: '#4D64FF',
|
|
37
|
+
'secondary-darken-1': '#5D6FE8',
|
|
38
|
+
error: '#F2555A',
|
|
39
|
+
info: '#5AA9F0',
|
|
40
|
+
success: '#3FCF8E',
|
|
41
|
+
warning: '#E8B03D',
|
|
42
|
+
'on-surface': '#E6E9ED',
|
|
43
|
+
'on-background': '#E6E9ED',
|
|
44
|
+
// Vuetify picks the label colour by luminance and settles for
|
|
45
|
+
// about 3:1, which is the bar for large text rather than for a
|
|
46
|
+
// button label. Measured on the filled buttons: info 2.5:1 → 8.4:1, error 3.4:1 → 6.2:1.
|
|
47
|
+
'on-info': '#000000',
|
|
48
|
+
'on-error': '#000000',
|
|
49
|
+
},
|
|
50
|
+
variables: {
|
|
51
|
+
/* A panel standing on its own — a bare list, sheet, banner or table.
|
|
52
|
+
Core owns the selector; this is what it draws with. */
|
|
53
|
+
'vw-panel-border':
|
|
54
|
+
'1px solid rgba(var(--v-border-color), var(--v-border-opacity))',
|
|
55
|
+
'border-color': '#9AA4B5',
|
|
56
|
+
'border-opacity': 0.12,
|
|
57
|
+
'shadow-color': '#000000',
|
|
58
|
+
'high-emphasis-opacity': 0.95,
|
|
59
|
+
'medium-emphasis-opacity': 0.6,
|
|
60
|
+
'hover-opacity': 0.045,
|
|
61
|
+
'font-body': "'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif",
|
|
62
|
+
// Four pixels is the smallest corner that still reads as intentional
|
|
63
|
+
// rather than as an unstyled input.
|
|
64
|
+
'vw-radius': '4px',
|
|
65
|
+
'vw-radius-lg': '8px',
|
|
66
|
+
'vw-radius-chip': '4px',
|
|
67
|
+
'vw-radius-thumb': '2px',
|
|
68
|
+
'vw-border-width': '1px',
|
|
69
|
+
'vw-btn-transform': 'none',
|
|
70
|
+
'vw-btn-tracking': '0',
|
|
71
|
+
'vw-btn-weight': '500',
|
|
72
|
+
// Display sizes set tight, the way a landing page sets them.
|
|
73
|
+
'vw-heading-weight': '600',
|
|
74
|
+
'vw-heading-tracking': '-0.025em',
|
|
75
|
+
// Table headers as labels, not as titles.
|
|
76
|
+
'vw-th-weight': '500',
|
|
77
|
+
'vw-th-tracking': '0.09em',
|
|
78
|
+
'vw-th-transform': 'uppercase',
|
|
79
|
+
// A table of ids, dates and counts is most of what this theme is for.
|
|
80
|
+
'vw-numeric': 'tabular-nums',
|
|
81
|
+
'vw-tab-slider-height': '2px',
|
|
82
|
+
// Floating surfaces are the one place a shadow survives, and only to
|
|
83
|
+
// separate them from the page — the hairline does the describing.
|
|
84
|
+
'vw-overlay-border': '1px solid rgba(var(--v-border-color), 0.18)',
|
|
85
|
+
'vw-overlay-shadow': '0 16px 40px rgba(0, 0, 0, 0.6)',
|
|
86
|
+
// Product UIs colour their links rather than underlining them.
|
|
87
|
+
'vw-link-decoration': 'none',
|
|
88
|
+
|
|
89
|
+
// Instant and linear. Easing describes weight, and nothing here has any.
|
|
90
|
+
'vw-motion-duration': '90ms',
|
|
91
|
+
'vw-motion-ease': 'linear',
|
|
92
|
+
'vw-press-scale': '1',
|
|
93
|
+
'vw-pop-scale': '1.1',
|
|
94
|
+
'vw-pop-duration': '140ms',
|
|
95
|
+
'vw-focus-ring': '1px solid rgba(var(--v-theme-primary), 0.85)',
|
|
96
|
+
'vw-theme-transition': '260ms',
|
|
97
|
+
|
|
98
|
+
// Hairline and squared off, like every other edge here.
|
|
99
|
+
'vw-timeline-line': 'rgba(var(--v-border-color), 0.35)',
|
|
100
|
+
'vw-timeline-line-width': '1px',
|
|
101
|
+
'vw-radius-dot': '2px',
|
|
102
|
+
'vw-radius-avatar': '4px',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
defaults: [
|
|
106
|
+
{
|
|
107
|
+
// No ripple anywhere: it is a Material animation about the weight of
|
|
108
|
+
// a surface, and nothing in this theme has any.
|
|
109
|
+
// No `density` here on purpose: Vuetify subtracts it from the size
|
|
110
|
+
// height, and a compact `x-small` button ends up shorter than its
|
|
111
|
+
// own label. The tight geometry comes from the radius instead.
|
|
112
|
+
VBtn: { variant: 'flat', ripple: false },
|
|
113
|
+
VCard: { variant: 'outlined' },
|
|
114
|
+
VAlert: { variant: 'outlined', density: 'compact' },
|
|
115
|
+
VChip: { variant: 'outlined', size: 'small', ripple: false },
|
|
116
|
+
VListItem: { ripple: false },
|
|
117
|
+
VTab: { ripple: false },
|
|
118
|
+
// Flush stacked rows rather than floating panels with gaps.
|
|
119
|
+
VExpansionPanels: { variant: 'accordion' },
|
|
120
|
+
VNavigationDrawer: { border: 'e' },
|
|
121
|
+
},
|
|
122
|
+
fields({ variant: 'outlined', density: 'compact' }),
|
|
123
|
+
controls({ density: 'compact' }),
|
|
124
|
+
tables('compact'),
|
|
125
|
+
bars({ flat: true, border: 'b' }),
|
|
126
|
+
{
|
|
127
|
+
// Controls sized down to the text they sit beside, and squared off
|
|
128
|
+
// to the same 4px the fields and buttons use.
|
|
129
|
+
VSwitch: { inset: 'square' },
|
|
130
|
+
VSlider: { thumbSize: 12, trackSize: 3 },
|
|
131
|
+
},
|
|
132
|
+
icons({
|
|
133
|
+
// One weight of line icon throughout; arrows where a direction is
|
|
134
|
+
// meant, chevrons where a disclosure is.
|
|
135
|
+
dropdown: 'mdi-chevron-down',
|
|
136
|
+
collapse: 'mdi-chevron-up',
|
|
137
|
+
checkboxOn: 'mdi-checkbox-marked',
|
|
138
|
+
checkboxOff: 'mdi-checkbox-blank-outline',
|
|
139
|
+
sortAsc: 'mdi-arrow-up',
|
|
140
|
+
sortDesc: 'mdi-arrow-down',
|
|
141
|
+
next: 'mdi-chevron-right',
|
|
142
|
+
prev: 'mdi-chevron-left',
|
|
143
|
+
first: 'mdi-chevron-double-left',
|
|
144
|
+
last: 'mdi-chevron-double-right',
|
|
145
|
+
clear: 'mdi-close',
|
|
146
|
+
close: 'mdi-close',
|
|
147
|
+
breadcrumbDivider: '/',
|
|
148
|
+
}),
|
|
149
|
+
],
|
|
150
|
+
})
|
package/src/themes/index.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
export { atlas } from './atlas.js'
|
|
2
|
+
export { atlasDark } from './atlasDark.js'
|
|
3
|
+
export { atlasSepia } from './atlasSepia.js'
|
|
1
4
|
export { aurora } from './aurora.js'
|
|
2
5
|
export { brutalist } from './brutalist.js'
|
|
3
6
|
export { calm } from './calm.js'
|
|
7
|
+
export { candy } from './candy.js'
|
|
4
8
|
export { classic } from './classic.js'
|
|
5
9
|
export { clay } from './clay.js'
|
|
6
10
|
export { darkGlass } from './darkGlass.js'
|
|
11
|
+
export { graphite } from './graphite.js'
|
|
7
12
|
export { liquidGlass } from './liquidGlass.js'
|
|
8
13
|
export { lux } from './lux.js'
|
|
9
14
|
export { morph } from './morph.js'
|
|
@@ -25,7 +25,7 @@ export const liquidGlass = defineTheme({
|
|
|
25
25
|
description: 'Capsule controls and refracting panes over a calm wash, after iOS 26.',
|
|
26
26
|
dark: false,
|
|
27
27
|
iconStyle: 'outline',
|
|
28
|
-
swatch: ['#F2F2F7', '#FFFFFF', '#
|
|
28
|
+
swatch: ['#F2F2F7', '#FFFFFF', '#0071ED', '#5856D6'],
|
|
29
29
|
fonts: ['Inter'],
|
|
30
30
|
},
|
|
31
31
|
theme: {
|
|
@@ -38,24 +38,38 @@ export const liquidGlass = defineTheme({
|
|
|
38
38
|
'surface-light': '#F7F7FA',
|
|
39
39
|
'surface-variant': '#3A3A3C',
|
|
40
40
|
'on-surface-variant': '#F2F2F7',
|
|
41
|
-
primary: '#
|
|
41
|
+
primary: '#0071ED',
|
|
42
42
|
'primary-darken-1': '#0062CC',
|
|
43
43
|
secondary: '#5856D6',
|
|
44
44
|
'secondary-darken-1': '#4341B5',
|
|
45
45
|
error: '#FF3B30',
|
|
46
|
-
info: '#
|
|
46
|
+
info: '#0071ED',
|
|
47
47
|
success: '#34C759',
|
|
48
48
|
warning: '#FF9500',
|
|
49
49
|
'on-surface': '#1C1C1E',
|
|
50
50
|
'on-background': '#1C1C1E',
|
|
51
|
+
// Vuetify picks the label colour by luminance and settles for
|
|
52
|
+
// about 3:1, which is the bar for large text rather than for a
|
|
53
|
+
// button label. Measured on the filled buttons: info 4:1 → 5.2:1, error 3.5:1 → 4.8:1.
|
|
54
|
+
'on-info': '#000000',
|
|
55
|
+
'on-error': '#1C1C1E',
|
|
51
56
|
'on-success': '#06140A',
|
|
52
57
|
'on-warning': '#1A1004',
|
|
53
58
|
},
|
|
54
59
|
variables: {
|
|
60
|
+
/* A panel standing on its own — a bare list, sheet, banner or table.
|
|
61
|
+
Core owns the selector; this is what it draws with. */
|
|
62
|
+
'vw-panel-fill': 'rgba(var(--v-theme-surface), 0.6)',
|
|
63
|
+
'vw-panel-filter': 'blur(30px) saturate(190%)',
|
|
64
|
+
'vw-panel-shadow':
|
|
65
|
+
'inset 0 1px 0 rgba(255, 255, 255, 0.9), inset 0 0 0 1px rgba(255, 255, 255, 0.35), 0 10px 34px rgba(var(--v-shadow-color), 0.1)',
|
|
55
66
|
'border-color': '#3A3A3C',
|
|
56
67
|
// iOS separators are hairlines, not borders.
|
|
57
68
|
'border-opacity': 0.1,
|
|
58
69
|
'shadow-color': '#1B3A6B',
|
|
70
|
+
// The frost rule below owns the colour; core's default would paint
|
|
71
|
+
// an opaque surface under it and the pane would stop being glass.
|
|
72
|
+
'vw-outlined-fill': 'rgba(var(--v-theme-surface), 0.6)',
|
|
59
73
|
'high-emphasis-opacity': 0.92,
|
|
60
74
|
'medium-emphasis-opacity': 0.6,
|
|
61
75
|
'hover-opacity': 0.04,
|
|
@@ -76,6 +90,19 @@ export const liquidGlass = defineTheme({
|
|
|
76
90
|
'vw-link-decoration': 'none',
|
|
77
91
|
'vw-heading-weight': '700',
|
|
78
92
|
'vw-heading-tracking': '-0.022em',
|
|
93
|
+
|
|
94
|
+
// The iOS curve: fast out, long settle.
|
|
95
|
+
'vw-motion-duration': '320ms',
|
|
96
|
+
'vw-motion-ease': 'cubic-bezier(0.32, 0.72, 0, 1)',
|
|
97
|
+
'vw-press-scale': '0.96',
|
|
98
|
+
'vw-hover-lift': '2px',
|
|
99
|
+
'vw-pop-scale': '1.2',
|
|
100
|
+
'vw-pop-duration': '300ms',
|
|
101
|
+
'vw-theme-transition': '520ms',
|
|
102
|
+
|
|
103
|
+
// Frosted, so the line is a highlight rather than a rule.
|
|
104
|
+
'vw-timeline-line': 'rgba(var(--v-theme-on-surface), 0.18)',
|
|
105
|
+
'vw-timeline-line-width': '2px',
|
|
79
106
|
},
|
|
80
107
|
},
|
|
81
108
|
defaults: [
|
package/src/themes/lux.ts
CHANGED
|
@@ -14,7 +14,7 @@ export const lux = defineTheme({
|
|
|
14
14
|
description: 'Editorial luxury — hairline rules, wide tracking, small caps and muted gold.',
|
|
15
15
|
dark: false,
|
|
16
16
|
iconStyle: 'outline',
|
|
17
|
-
swatch: ['#FFFFFF', '#FAFAFA', '#1A1A1A', '#
|
|
17
|
+
swatch: ['#FFFFFF', '#FAFAFA', '#1A1A1A', '#88733F'],
|
|
18
18
|
fonts: ['Jost'],
|
|
19
19
|
},
|
|
20
20
|
theme: {
|
|
@@ -28,7 +28,7 @@ export const lux = defineTheme({
|
|
|
28
28
|
'on-surface-variant': '#FFFFFF',
|
|
29
29
|
primary: '#1A1A1A',
|
|
30
30
|
'primary-darken-1': '#000000',
|
|
31
|
-
secondary: '#
|
|
31
|
+
secondary: '#88733F',
|
|
32
32
|
'secondary-darken-1': '#8F7A45',
|
|
33
33
|
error: '#96322A',
|
|
34
34
|
info: '#3D5A73',
|
|
@@ -36,8 +36,16 @@ export const lux = defineTheme({
|
|
|
36
36
|
warning: '#A8791E',
|
|
37
37
|
'on-surface': '#1A1A1A',
|
|
38
38
|
'on-background': '#1A1A1A',
|
|
39
|
+
// Vuetify picks the label colour by luminance and settles for
|
|
40
|
+
// about 3:1, which is the bar for large text rather than for a
|
|
41
|
+
// button label. Measured on the filled buttons: warning 3.9:1 → 4.5:1.
|
|
42
|
+
'on-warning': '#1A1A1A',
|
|
39
43
|
},
|
|
40
44
|
variables: {
|
|
45
|
+
/* A panel standing on its own — a bare list, sheet, banner or table.
|
|
46
|
+
Core owns the selector; this is what it draws with. */
|
|
47
|
+
'vw-panel-border':
|
|
48
|
+
'var(--v-vw-border-width) solid rgba(var(--v-border-color), var(--v-border-opacity))',
|
|
41
49
|
'border-color': '#1A1A1A',
|
|
42
50
|
'border-opacity': 0.14,
|
|
43
51
|
'high-emphasis-opacity': 0.88,
|
|
@@ -58,6 +66,20 @@ export const lux = defineTheme({
|
|
|
58
66
|
'vw-list-bar': '2px',
|
|
59
67
|
'vw-list-bar-color': 'rgb(var(--v-theme-secondary))',
|
|
60
68
|
'vw-tab-slider-height': '1px',
|
|
69
|
+
|
|
70
|
+
// Expensive things move slowly and stop exactly where they meant to.
|
|
71
|
+
'vw-motion-duration': '240ms',
|
|
72
|
+
'vw-motion-ease': 'cubic-bezier(0.2, 0, 0, 1)',
|
|
73
|
+
'vw-press-scale': '0.995',
|
|
74
|
+
'vw-hover-lift': '2px',
|
|
75
|
+
'vw-pop-scale': '1.08',
|
|
76
|
+
'vw-pop-duration': '220ms',
|
|
77
|
+
'vw-focus-ring': '1px solid rgb(var(--v-theme-primary))',
|
|
78
|
+
'vw-theme-transition': '520ms',
|
|
79
|
+
|
|
80
|
+
// A gold hairline; the dot stays a circle.
|
|
81
|
+
'vw-timeline-line': 'rgba(var(--v-theme-primary), 0.55)',
|
|
82
|
+
'vw-timeline-line-width': '1px',
|
|
61
83
|
},
|
|
62
84
|
},
|
|
63
85
|
defaults: [
|
package/src/themes/morph.ts
CHANGED
|
@@ -16,7 +16,7 @@ export const morph = defineTheme({
|
|
|
16
16
|
description: 'Neumorphic — one continuous surface, shaped only by light and shadow.',
|
|
17
17
|
dark: false,
|
|
18
18
|
iconStyle: 'filled',
|
|
19
|
-
swatch: ['#E4EBF5', '#E4EBF5', '#
|
|
19
|
+
swatch: ['#E4EBF5', '#E4EBF5', '#496FDD', '#677690'],
|
|
20
20
|
fonts: ['Nunito'],
|
|
21
21
|
},
|
|
22
22
|
theme: {
|
|
@@ -28,9 +28,9 @@ export const morph = defineTheme({
|
|
|
28
28
|
'surface-light': '#DAE2EE',
|
|
29
29
|
'surface-variant': '#4A5568',
|
|
30
30
|
'on-surface-variant': '#E4EBF5',
|
|
31
|
-
primary: '#
|
|
31
|
+
primary: '#496FDD',
|
|
32
32
|
'primary-darken-1': '#4763BC',
|
|
33
|
-
secondary: '#
|
|
33
|
+
secondary: '#677690',
|
|
34
34
|
'secondary-darken-1': '#6D798F',
|
|
35
35
|
error: '#E06C75',
|
|
36
36
|
info: '#5A9FE0',
|
|
@@ -38,11 +38,23 @@ export const morph = defineTheme({
|
|
|
38
38
|
warning: '#E0A85A',
|
|
39
39
|
'on-surface': '#4A5568',
|
|
40
40
|
'on-background': '#4A5568',
|
|
41
|
+
// Vuetify picks the label colour by luminance and settles for
|
|
42
|
+
// about 3:1, which is the bar for large text rather than for a
|
|
43
|
+
// button label. Measured on the filled buttons: info 2.8:1 → 7.5:1, error 3.2:1 → 6.6:1.
|
|
44
|
+
'on-info': '#000000',
|
|
45
|
+
'on-error': '#000000',
|
|
41
46
|
},
|
|
42
47
|
variables: {
|
|
48
|
+
/* A panel standing on its own — a bare list, sheet, banner or table.
|
|
49
|
+
Core owns the selector; this is what it draws with. */
|
|
50
|
+
'vw-panel-shadow': 'var(--vw-morph-raised)',
|
|
43
51
|
'border-color': '#9AA7BC',
|
|
44
52
|
'border-opacity': 0.001,
|
|
53
|
+
// The relief reaches past the shape it lifts — see core.css.
|
|
54
|
+
'vw-relief-inset': '7px',
|
|
45
55
|
'shadow-color': '#A3B1C6',
|
|
56
|
+
// The relief is one continuous sheet: a panel that paints itself is a patch on it.
|
|
57
|
+
'vw-outlined-fill': 'transparent',
|
|
46
58
|
'high-emphasis-opacity': 0.85,
|
|
47
59
|
'medium-emphasis-opacity': 0.6,
|
|
48
60
|
'hover-opacity': 0.03,
|
|
@@ -56,6 +68,16 @@ export const morph = defineTheme({
|
|
|
56
68
|
'vw-btn-tracking': '0.01em',
|
|
57
69
|
'vw-btn-weight': '700',
|
|
58
70
|
'vw-tab-slider-height': '4px',
|
|
71
|
+
|
|
72
|
+
// The relief does the talking; the movement only has to not contradict it.
|
|
73
|
+
'vw-motion-duration': '160ms',
|
|
74
|
+
'vw-press-scale': '0.985',
|
|
75
|
+
'vw-pop-scale': '1.15',
|
|
76
|
+
'vw-pop-duration': '220ms',
|
|
77
|
+
|
|
78
|
+
// The same groove the fields are, turned on its side.
|
|
79
|
+
'vw-timeline-line': 'rgb(var(--v-theme-background))',
|
|
80
|
+
'vw-timeline-line-width': '8px',
|
|
59
81
|
},
|
|
60
82
|
},
|
|
61
83
|
defaults: [
|
package/src/themes/neon.ts
CHANGED
|
@@ -35,12 +35,20 @@ export const neon = defineTheme({
|
|
|
35
35
|
warning: '#FFD23F',
|
|
36
36
|
'on-surface': '#D7E3F4',
|
|
37
37
|
'on-background': '#D7E3F4',
|
|
38
|
+
// Vuetify picks the label colour by luminance and settles for
|
|
39
|
+
// about 3:1, which is the bar for large text rather than for a
|
|
40
|
+
// button label. Measured on the filled buttons: error 3.5:1 → 6:1.
|
|
41
|
+
'on-error': '#000000',
|
|
38
42
|
'on-primary': '#05060A',
|
|
39
43
|
'on-secondary': '#05060A',
|
|
40
44
|
'on-success': '#05060A',
|
|
41
45
|
'on-warning': '#05060A',
|
|
42
46
|
},
|
|
43
47
|
variables: {
|
|
48
|
+
/* A panel standing on its own — a bare list, sheet, banner or table.
|
|
49
|
+
Core owns the selector; this is what it draws with. */
|
|
50
|
+
'vw-panel-border':
|
|
51
|
+
'var(--v-vw-border-width) solid rgba(var(--v-theme-primary), 0.35)',
|
|
44
52
|
'border-color': '#00F0FF',
|
|
45
53
|
'border-opacity': 0.28,
|
|
46
54
|
'shadow-color': '#00F0FF',
|
|
@@ -53,6 +61,8 @@ export const neon = defineTheme({
|
|
|
53
61
|
'vw-radius-lg': '0px',
|
|
54
62
|
'vw-radius-thumb': '0px',
|
|
55
63
|
'vw-radius-chip': '0px',
|
|
64
|
+
// A terminal has no round corners, not even on an icon button.
|
|
65
|
+
'vw-radius-icon-btn': '0px',
|
|
56
66
|
'vw-border-width': '1px',
|
|
57
67
|
'vw-btn-transform': 'uppercase',
|
|
58
68
|
'vw-btn-tracking': '0.12em',
|
|
@@ -62,6 +72,21 @@ export const neon = defineTheme({
|
|
|
62
72
|
'vw-list-bar': '2px',
|
|
63
73
|
'vw-list-bar-color': 'rgb(var(--v-theme-primary))',
|
|
64
74
|
'vw-tab-slider-height': '3px',
|
|
75
|
+
|
|
76
|
+
// A terminal repaints; it does not ease.
|
|
77
|
+
'vw-motion-duration': '110ms',
|
|
78
|
+
'vw-motion-ease': 'linear',
|
|
79
|
+
'vw-press-scale': '0.98',
|
|
80
|
+
'vw-pop-scale': '1.2',
|
|
81
|
+
'vw-pop-duration': '150ms',
|
|
82
|
+
'vw-focus-ring': '2px solid rgb(var(--v-theme-secondary))',
|
|
83
|
+
'vw-theme-transition': '180ms',
|
|
84
|
+
|
|
85
|
+
// A lit filament; the glow is in the stylesheet.
|
|
86
|
+
'vw-timeline-line': 'rgb(var(--v-theme-secondary))',
|
|
87
|
+
'vw-timeline-line-width': '2px',
|
|
88
|
+
'vw-radius-dot': '0px',
|
|
89
|
+
'vw-radius-avatar': '0px',
|
|
65
90
|
},
|
|
66
91
|
},
|
|
67
92
|
defaults: [
|