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,91 @@
|
|
|
1
|
+
import { bars, controls, fields, icons, tables } from '../util/defaults.js'
|
|
2
|
+
import { defineTheme } from '../util/defineTheme.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Restraint as decoration: hairline rules, wide letter-spacing, small caps
|
|
6
|
+
* on anything interactive, and a single muted gold. The only theme here
|
|
7
|
+
* whose character is carried almost entirely by typography and spacing
|
|
8
|
+
* rather than colour or shape.
|
|
9
|
+
*/
|
|
10
|
+
export const lux = defineTheme({
|
|
11
|
+
name: 'lux',
|
|
12
|
+
meta: {
|
|
13
|
+
title: 'Lux',
|
|
14
|
+
description: 'Editorial luxury — hairline rules, wide tracking, small caps and muted gold.',
|
|
15
|
+
dark: false,
|
|
16
|
+
iconStyle: 'outline',
|
|
17
|
+
swatch: ['#FFFFFF', '#FAFAFA', '#1A1A1A', '#B39A5B'],
|
|
18
|
+
fonts: ['Jost'],
|
|
19
|
+
},
|
|
20
|
+
theme: {
|
|
21
|
+
dark: false,
|
|
22
|
+
colors: {
|
|
23
|
+
background: '#FFFFFF',
|
|
24
|
+
surface: '#FFFFFF',
|
|
25
|
+
'surface-bright': '#FFFFFF',
|
|
26
|
+
'surface-light': '#F7F7F5',
|
|
27
|
+
'surface-variant': '#1A1A1A',
|
|
28
|
+
'on-surface-variant': '#FFFFFF',
|
|
29
|
+
primary: '#1A1A1A',
|
|
30
|
+
'primary-darken-1': '#000000',
|
|
31
|
+
secondary: '#B39A5B',
|
|
32
|
+
'secondary-darken-1': '#8F7A45',
|
|
33
|
+
error: '#96322A',
|
|
34
|
+
info: '#3D5A73',
|
|
35
|
+
success: '#4A6B4F',
|
|
36
|
+
warning: '#A8791E',
|
|
37
|
+
'on-surface': '#1A1A1A',
|
|
38
|
+
'on-background': '#1A1A1A',
|
|
39
|
+
},
|
|
40
|
+
variables: {
|
|
41
|
+
'border-color': '#1A1A1A',
|
|
42
|
+
'border-opacity': 0.14,
|
|
43
|
+
'high-emphasis-opacity': 0.88,
|
|
44
|
+
'medium-emphasis-opacity': 0.55,
|
|
45
|
+
'hover-opacity': 0.03,
|
|
46
|
+
'font-body': "'Jost', 'Futura', system-ui, sans-serif",
|
|
47
|
+
'vw-radius': '0px',
|
|
48
|
+
'vw-radius-lg': '0px',
|
|
49
|
+
'vw-radius-thumb': '0px',
|
|
50
|
+
'vw-radius-chip': '0px',
|
|
51
|
+
'vw-border-width': '1px',
|
|
52
|
+
'vw-btn-transform': 'uppercase',
|
|
53
|
+
'vw-btn-tracking': '0.2em',
|
|
54
|
+
'vw-btn-weight': '400',
|
|
55
|
+
'vw-heading-weight': '300',
|
|
56
|
+
'vw-heading-tracking': '0.06em',
|
|
57
|
+
'vw-heading-transform': 'uppercase',
|
|
58
|
+
'vw-list-bar': '2px',
|
|
59
|
+
'vw-list-bar-color': 'rgb(var(--v-theme-secondary))',
|
|
60
|
+
'vw-tab-slider-height': '1px',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
defaults: [
|
|
64
|
+
{
|
|
65
|
+
VBtn: { variant: 'outlined', size: 'large' },
|
|
66
|
+
VCard: { variant: 'outlined' },
|
|
67
|
+
VAlert: { variant: 'outlined' },
|
|
68
|
+
VChip: { variant: 'outlined' },
|
|
69
|
+
VNavigationDrawer: { border: 'e' },
|
|
70
|
+
VSwitch: { inset: 'square' },
|
|
71
|
+
VSlider: { thumbSize: 12, trackSize: 1 },
|
|
72
|
+
},
|
|
73
|
+
fields({ variant: 'underlined' }),
|
|
74
|
+
controls({ density: 'comfortable' }),
|
|
75
|
+
tables('comfortable'),
|
|
76
|
+
bars({ flat: true, border: 'b' }),
|
|
77
|
+
icons({
|
|
78
|
+
dropdown: 'mdi-chevron-down',
|
|
79
|
+
collapse: 'mdi-chevron-up',
|
|
80
|
+
checkboxOn: 'mdi-checkbox-marked-outline',
|
|
81
|
+
checkboxOff: 'mdi-checkbox-blank-outline',
|
|
82
|
+
ratingFull: 'mdi-star',
|
|
83
|
+
ratingEmpty: 'mdi-star-outline',
|
|
84
|
+
sortAsc: 'mdi-arrow-up',
|
|
85
|
+
sortDesc: 'mdi-arrow-down',
|
|
86
|
+
close: 'mdi-close',
|
|
87
|
+
// An em dash rather than a slash — the one flourish the theme allows.
|
|
88
|
+
breadcrumbDivider: '—',
|
|
89
|
+
}),
|
|
90
|
+
],
|
|
91
|
+
})
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { bars, fields, icons } from '../util/defaults.js'
|
|
2
|
+
import { defineTheme } from '../util/defineTheme.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Neumorphism: surfaces are the same colour as the page, and the only thing
|
|
6
|
+
* separating them is a pair of shadows — dark bottom-right, light top-left,
|
|
7
|
+
* as if the whole interface were pressed out of one sheet.
|
|
8
|
+
*
|
|
9
|
+
* `surface` deliberately equals `background`. Anything that reintroduces
|
|
10
|
+
* contrast between them breaks the illusion.
|
|
11
|
+
*/
|
|
12
|
+
export const morph = defineTheme({
|
|
13
|
+
name: 'morph',
|
|
14
|
+
meta: {
|
|
15
|
+
title: 'Morph',
|
|
16
|
+
description: 'Neumorphic — one continuous surface, shaped only by light and shadow.',
|
|
17
|
+
dark: false,
|
|
18
|
+
iconStyle: 'filled',
|
|
19
|
+
swatch: ['#E4EBF5', '#E4EBF5', '#5A7DE0', '#8894AA'],
|
|
20
|
+
fonts: ['Nunito'],
|
|
21
|
+
},
|
|
22
|
+
theme: {
|
|
23
|
+
dark: false,
|
|
24
|
+
colors: {
|
|
25
|
+
background: '#E4EBF5',
|
|
26
|
+
surface: '#E4EBF5',
|
|
27
|
+
'surface-bright': '#EEF3FA',
|
|
28
|
+
'surface-light': '#DAE2EE',
|
|
29
|
+
'surface-variant': '#4A5568',
|
|
30
|
+
'on-surface-variant': '#E4EBF5',
|
|
31
|
+
primary: '#5A7DE0',
|
|
32
|
+
'primary-darken-1': '#4763BC',
|
|
33
|
+
secondary: '#8894AA',
|
|
34
|
+
'secondary-darken-1': '#6D798F',
|
|
35
|
+
error: '#E06C75',
|
|
36
|
+
info: '#5A9FE0',
|
|
37
|
+
success: '#5AC08C',
|
|
38
|
+
warning: '#E0A85A',
|
|
39
|
+
'on-surface': '#4A5568',
|
|
40
|
+
'on-background': '#4A5568',
|
|
41
|
+
},
|
|
42
|
+
variables: {
|
|
43
|
+
'border-color': '#9AA7BC',
|
|
44
|
+
'border-opacity': 0.001,
|
|
45
|
+
'shadow-color': '#A3B1C6',
|
|
46
|
+
'high-emphasis-opacity': 0.85,
|
|
47
|
+
'medium-emphasis-opacity': 0.6,
|
|
48
|
+
'hover-opacity': 0.03,
|
|
49
|
+
'font-body': "'Nunito', system-ui, sans-serif",
|
|
50
|
+
'vw-radius': '12px',
|
|
51
|
+
'vw-radius-lg': '20px',
|
|
52
|
+
'vw-radius-chip': '999px',
|
|
53
|
+
// Borders would flatten the relief the shadows are building.
|
|
54
|
+
'vw-border-width': '0px',
|
|
55
|
+
'vw-btn-transform': 'none',
|
|
56
|
+
'vw-btn-tracking': '0.01em',
|
|
57
|
+
'vw-btn-weight': '700',
|
|
58
|
+
'vw-tab-slider-height': '4px',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
defaults: [
|
|
62
|
+
{
|
|
63
|
+
VBtn: { variant: 'flat' },
|
|
64
|
+
VCard: { variant: 'flat' },
|
|
65
|
+
VAlert: { variant: 'flat' },
|
|
66
|
+
VChip: { variant: 'flat' },
|
|
67
|
+
VSwitch: { inset: true },
|
|
68
|
+
VSlider: { thumbSize: 20, trackSize: 6 },
|
|
69
|
+
},
|
|
70
|
+
fields({ variant: 'solo', flat: true }),
|
|
71
|
+
bars({ flat: true }),
|
|
72
|
+
icons({
|
|
73
|
+
// Everything round, to match surfaces that have no edges at all.
|
|
74
|
+
dropdown: 'mdi-chevron-down',
|
|
75
|
+
collapse: 'mdi-chevron-up',
|
|
76
|
+
checkboxOn: 'mdi-check-circle',
|
|
77
|
+
checkboxOff: 'mdi-circle-outline',
|
|
78
|
+
ratingFull: 'mdi-circle',
|
|
79
|
+
ratingEmpty: 'mdi-circle-outline',
|
|
80
|
+
}),
|
|
81
|
+
],
|
|
82
|
+
})
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { bars, fields, icons, surfaces, tables } from '../util/defaults.js'
|
|
2
|
+
import { defineTheme } from '../util/defineTheme.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Near-black ground, saturated cyan and magenta, zero radius, and glow
|
|
6
|
+
* instead of elevation. The loudest theme in the set and the deliberate
|
|
7
|
+
* opposite of `soft`.
|
|
8
|
+
*/
|
|
9
|
+
export const neon = defineTheme({
|
|
10
|
+
name: 'neon',
|
|
11
|
+
meta: {
|
|
12
|
+
title: 'Neon',
|
|
13
|
+
description: 'Terminal black with cyan and magenta glow. Sharp corners, monospace headings.',
|
|
14
|
+
dark: true,
|
|
15
|
+
iconStyle: 'outline',
|
|
16
|
+
swatch: ['#05060A', '#0B0E16', '#00F0FF', '#FF2FD0'],
|
|
17
|
+
fonts: ['JetBrains Mono', 'Inter'],
|
|
18
|
+
},
|
|
19
|
+
theme: {
|
|
20
|
+
dark: true,
|
|
21
|
+
colors: {
|
|
22
|
+
background: '#05060A',
|
|
23
|
+
surface: '#0B0E16',
|
|
24
|
+
'surface-bright': '#161B29',
|
|
25
|
+
'surface-light': '#11151F',
|
|
26
|
+
'surface-variant': '#C9D3E6',
|
|
27
|
+
'on-surface-variant': '#05060A',
|
|
28
|
+
primary: '#00F0FF',
|
|
29
|
+
'primary-darken-1': '#00BFCC',
|
|
30
|
+
secondary: '#FF2FD0',
|
|
31
|
+
'secondary-darken-1': '#CC1FA6',
|
|
32
|
+
error: '#FF3B5C',
|
|
33
|
+
info: '#00F0FF',
|
|
34
|
+
success: '#29FF9B',
|
|
35
|
+
warning: '#FFD23F',
|
|
36
|
+
'on-surface': '#D7E3F4',
|
|
37
|
+
'on-background': '#D7E3F4',
|
|
38
|
+
'on-primary': '#05060A',
|
|
39
|
+
'on-secondary': '#05060A',
|
|
40
|
+
'on-success': '#05060A',
|
|
41
|
+
'on-warning': '#05060A',
|
|
42
|
+
},
|
|
43
|
+
variables: {
|
|
44
|
+
'border-color': '#00F0FF',
|
|
45
|
+
'border-opacity': 0.28,
|
|
46
|
+
'shadow-color': '#00F0FF',
|
|
47
|
+
'high-emphasis-opacity': 0.94,
|
|
48
|
+
'medium-emphasis-opacity': 0.66,
|
|
49
|
+
'hover-opacity': 0.12,
|
|
50
|
+
'font-body': "'Inter', system-ui, sans-serif",
|
|
51
|
+
'font-heading': "'JetBrains Mono', 'IBM Plex Mono', ui-monospace, monospace",
|
|
52
|
+
'vw-radius': '0px',
|
|
53
|
+
'vw-radius-lg': '0px',
|
|
54
|
+
'vw-radius-thumb': '0px',
|
|
55
|
+
'vw-radius-chip': '0px',
|
|
56
|
+
'vw-border-width': '1px',
|
|
57
|
+
'vw-btn-transform': 'uppercase',
|
|
58
|
+
'vw-btn-tracking': '0.12em',
|
|
59
|
+
'vw-btn-weight': '600',
|
|
60
|
+
'vw-heading-tracking': '0.04em',
|
|
61
|
+
'vw-heading-transform': 'uppercase',
|
|
62
|
+
'vw-list-bar': '2px',
|
|
63
|
+
'vw-list-bar-color': 'rgb(var(--v-theme-primary))',
|
|
64
|
+
'vw-tab-slider-height': '3px',
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
defaults: [
|
|
68
|
+
{
|
|
69
|
+
VBtn: { variant: 'outlined' },
|
|
70
|
+
VSheet: { border: true },
|
|
71
|
+
VNavigationDrawer: { border: 'e' },
|
|
72
|
+
},
|
|
73
|
+
surfaces({ variant: 'outlined' }),
|
|
74
|
+
fields({ variant: 'outlined', density: 'compact' }),
|
|
75
|
+
tables('compact'),
|
|
76
|
+
bars({ flat: true, border: 'b' }),
|
|
77
|
+
{
|
|
78
|
+
// Nothing filled and nothing round: a square switch, a square slider
|
|
79
|
+
// thumb, and a checkbox that stays hollow when checked.
|
|
80
|
+
VSwitch: { inset: 'square' },
|
|
81
|
+
VSlider: { thumbSize: 14, trackSize: 2 },
|
|
82
|
+
},
|
|
83
|
+
icons({
|
|
84
|
+
// Nothing is filled in this theme, glyphs included.
|
|
85
|
+
dropdown: 'mdi-menu-down',
|
|
86
|
+
collapse: 'mdi-menu-up',
|
|
87
|
+
checkboxOn: 'mdi-checkbox-marked-outline',
|
|
88
|
+
checkboxOff: 'mdi-checkbox-blank-outline',
|
|
89
|
+
ratingFull: 'mdi-star',
|
|
90
|
+
ratingEmpty: 'mdi-star-outline',
|
|
91
|
+
sortAsc: 'mdi-chevron-up',
|
|
92
|
+
sortDesc: 'mdi-chevron-down',
|
|
93
|
+
close: 'mdi-close',
|
|
94
|
+
}),
|
|
95
|
+
],
|
|
96
|
+
})
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { bars, fields, icons, surfaces } from '../util/defaults.js'
|
|
2
|
+
import { defineTheme } from '../util/defineTheme.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Editorial and flat: warm paper background, ink-black primary, hairline
|
|
6
|
+
* borders instead of shadows, serif headings. The furthest a light theme
|
|
7
|
+
* gets from Material without changing a single component.
|
|
8
|
+
*/
|
|
9
|
+
export const paper = defineTheme({
|
|
10
|
+
name: 'paper',
|
|
11
|
+
meta: {
|
|
12
|
+
title: 'Paper',
|
|
13
|
+
description: 'Flat editorial look — warm paper, ink accents, borders instead of elevation.',
|
|
14
|
+
dark: false,
|
|
15
|
+
iconStyle: 'outline',
|
|
16
|
+
swatch: ['#FAF8F2', '#FFFFFF', '#1A1A1A', '#8A6A3B'],
|
|
17
|
+
fonts: ['Source Serif 4'],
|
|
18
|
+
},
|
|
19
|
+
theme: {
|
|
20
|
+
dark: false,
|
|
21
|
+
colors: {
|
|
22
|
+
background: '#FAF8F2',
|
|
23
|
+
surface: '#FFFFFF',
|
|
24
|
+
'surface-bright': '#FFFFFF',
|
|
25
|
+
'surface-light': '#F1EEE4',
|
|
26
|
+
'surface-variant': '#2B2724',
|
|
27
|
+
'on-surface-variant': '#FAF8F2',
|
|
28
|
+
primary: '#1A1A1A',
|
|
29
|
+
'primary-darken-1': '#000000',
|
|
30
|
+
secondary: '#8A6A3B',
|
|
31
|
+
'secondary-darken-1': '#6B5029',
|
|
32
|
+
error: '#A32E2E',
|
|
33
|
+
info: '#2E5A8A',
|
|
34
|
+
success: '#3E7A4E',
|
|
35
|
+
warning: '#B07A1E',
|
|
36
|
+
'on-surface': '#14110E',
|
|
37
|
+
'on-background': '#14110E',
|
|
38
|
+
},
|
|
39
|
+
variables: {
|
|
40
|
+
'border-color': '#14110E',
|
|
41
|
+
'border-opacity': 0.2,
|
|
42
|
+
'high-emphasis-opacity': 0.92,
|
|
43
|
+
'medium-emphasis-opacity': 0.66,
|
|
44
|
+
'hover-opacity': 0.05,
|
|
45
|
+
'font-body': "system-ui, -apple-system, 'Segoe UI', Helvetica, Arial, sans-serif",
|
|
46
|
+
'font-heading': "'Source Serif 4', 'Iowan Old Style', Georgia, 'Times New Roman', serif",
|
|
47
|
+
'vw-radius': '2px',
|
|
48
|
+
'vw-radius-lg': '2px',
|
|
49
|
+
'vw-radius-thumb': '2px',
|
|
50
|
+
'vw-radius-chip': '2px',
|
|
51
|
+
'vw-border-width': '1px',
|
|
52
|
+
'vw-btn-transform': 'none',
|
|
53
|
+
'vw-btn-tracking': '0',
|
|
54
|
+
'vw-btn-weight': '600',
|
|
55
|
+
'vw-heading-tracking': '-0.01em',
|
|
56
|
+
'vw-tab-slider-height': '3px',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
defaults: [
|
|
60
|
+
{
|
|
61
|
+
VBtn: { variant: 'outlined' },
|
|
62
|
+
VSheet: { border: true },
|
|
63
|
+
VNavigationDrawer: { border: 'e' },
|
|
64
|
+
},
|
|
65
|
+
surfaces({ variant: 'outlined' }),
|
|
66
|
+
fields({ variant: 'outlined' }),
|
|
67
|
+
bars({ flat: true, border: 'b' }),
|
|
68
|
+
{
|
|
69
|
+
// Square hardware rather than Material pills — the switch and the
|
|
70
|
+
// slider should read as parts of a printed form.
|
|
71
|
+
VSwitch: { inset: 'square' },
|
|
72
|
+
VSlider: { thumbSize: 14, trackSize: 2 },
|
|
73
|
+
},
|
|
74
|
+
icons({
|
|
75
|
+
// Outlines throughout: this theme draws with hairlines, and a solid
|
|
76
|
+
// glyph would be the heaviest mark on the page.
|
|
77
|
+
dropdown: 'mdi-chevron-down',
|
|
78
|
+
collapse: 'mdi-chevron-up',
|
|
79
|
+
checkboxOn: 'mdi-checkbox-marked-outline',
|
|
80
|
+
checkboxOff: 'mdi-checkbox-blank-outline',
|
|
81
|
+
ratingFull: 'mdi-star',
|
|
82
|
+
ratingEmpty: 'mdi-star-outline',
|
|
83
|
+
sortAsc: 'mdi-arrow-up',
|
|
84
|
+
sortDesc: 'mdi-arrow-down',
|
|
85
|
+
close: 'mdi-close',
|
|
86
|
+
}),
|
|
87
|
+
],
|
|
88
|
+
})
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { bars, fields, icons, surfaces } from '../util/defaults.js'
|
|
2
|
+
import { defineTheme } from '../util/defineTheme.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A hand-drawn look for mockups and wireframes, after Bootswatch's Sketchy.
|
|
6
|
+
*
|
|
7
|
+
* The whole effect rests on one trick: an asymmetric `border-radius` with
|
|
8
|
+
* wildly different horizontal and vertical radii reads as a wobbly pen
|
|
9
|
+
* stroke. Vuetify passes `variables` through verbatim, so the full
|
|
10
|
+
* multi-value syntax rides in on the same `--v-vw-radius` every other theme
|
|
11
|
+
* uses — no new plumbing.
|
|
12
|
+
*/
|
|
13
|
+
export const sketchy = defineTheme({
|
|
14
|
+
name: 'sketchy',
|
|
15
|
+
meta: {
|
|
16
|
+
title: 'Sketchy',
|
|
17
|
+
description: 'Hand-drawn wobble and pencil greys — for mockups, wireframes and mirth.',
|
|
18
|
+
dark: false,
|
|
19
|
+
iconStyle: 'outline',
|
|
20
|
+
swatch: ['#FFFEF7', '#FFFFFF', '#333333', '#7A6A55'],
|
|
21
|
+
fonts: ['Neucha', 'Cabin Sketch'],
|
|
22
|
+
},
|
|
23
|
+
theme: {
|
|
24
|
+
dark: false,
|
|
25
|
+
colors: {
|
|
26
|
+
background: '#FFFEF7',
|
|
27
|
+
surface: '#FFFFFF',
|
|
28
|
+
'surface-bright': '#FFFFFF',
|
|
29
|
+
'surface-light': '#F5F2E8',
|
|
30
|
+
'surface-variant': '#333333',
|
|
31
|
+
'on-surface-variant': '#FFFEF7',
|
|
32
|
+
primary: '#333333',
|
|
33
|
+
'primary-darken-1': '#111111',
|
|
34
|
+
secondary: '#7A6A55',
|
|
35
|
+
'secondary-darken-1': '#5C4F3E',
|
|
36
|
+
error: '#C0392B',
|
|
37
|
+
info: '#2E6DA4',
|
|
38
|
+
success: '#3D8B54',
|
|
39
|
+
warning: '#C98A15',
|
|
40
|
+
'on-surface': '#2B2B2B',
|
|
41
|
+
'on-background': '#2B2B2B',
|
|
42
|
+
},
|
|
43
|
+
variables: {
|
|
44
|
+
'border-color': '#2B2B2B',
|
|
45
|
+
'border-opacity': 0.85,
|
|
46
|
+
'high-emphasis-opacity': 0.95,
|
|
47
|
+
'medium-emphasis-opacity': 0.7,
|
|
48
|
+
'hover-opacity': 0.06,
|
|
49
|
+
'font-body': "'Neucha', 'Comic Sans MS', cursive, sans-serif",
|
|
50
|
+
'font-heading': "'Cabin Sketch', 'Neucha', cursive",
|
|
51
|
+
// Two wobbles, each scaled to its element: a 255px radius on a 36px
|
|
52
|
+
// button gets clamped back into a pill, so buttons get a smaller one
|
|
53
|
+
// and only cards are big enough to carry the full stroke.
|
|
54
|
+
'vw-radius': '22px 5px 20px 6px / 6px 20px 5px 22px',
|
|
55
|
+
'vw-radius-lg': '255px 15px 225px 15px / 15px 225px 15px 255px',
|
|
56
|
+
'vw-radius-thumb': '7px 2px 6px 3px / 3px 6px 2px 7px',
|
|
57
|
+
'vw-radius-chip': '18px 42px 18px 42px / 42px 18px 42px 18px',
|
|
58
|
+
'vw-border-width': '2px',
|
|
59
|
+
'vw-btn-transform': 'none',
|
|
60
|
+
'vw-btn-tracking': '0.02em',
|
|
61
|
+
'vw-btn-weight': '400',
|
|
62
|
+
'vw-tab-slider-height': '3px',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
defaults: [
|
|
66
|
+
{
|
|
67
|
+
VBtn: { variant: 'outlined' },
|
|
68
|
+
VSheet: { border: true },
|
|
69
|
+
VNavigationDrawer: { border: 'e' },
|
|
70
|
+
VSwitch: { inset: 'square' },
|
|
71
|
+
VSlider: { thumbSize: 18, trackSize: 4 },
|
|
72
|
+
},
|
|
73
|
+
surfaces({ variant: 'outlined' }),
|
|
74
|
+
fields({ variant: 'outlined' }),
|
|
75
|
+
bars({ flat: true, border: 'b' }),
|
|
76
|
+
icons({
|
|
77
|
+
// A drawn box with a marker tick scrawled over it, rather than the
|
|
78
|
+
// tidy printed checkbox.
|
|
79
|
+
dropdown: 'mdi-chevron-down',
|
|
80
|
+
collapse: 'mdi-chevron-up',
|
|
81
|
+
checkboxOn: 'mdi-check-bold',
|
|
82
|
+
checkboxOff: 'mdi-square-outline',
|
|
83
|
+
ratingFull: 'mdi-star',
|
|
84
|
+
ratingEmpty: 'mdi-star-outline',
|
|
85
|
+
close: 'mdi-close-thick',
|
|
86
|
+
}),
|
|
87
|
+
],
|
|
88
|
+
})
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { bars, controls, fields, icons, tables } from '../util/defaults.js'
|
|
2
|
+
import { defineTheme } from '../util/defineTheme.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The admin-panel theme: muted slate blues, tight radii, compact density
|
|
6
|
+
* everywhere, cards outlined rather than raised. Built for tables and
|
|
7
|
+
* forms that need to fit a lot on one screen.
|
|
8
|
+
*/
|
|
9
|
+
export const slate = defineTheme({
|
|
10
|
+
name: 'slate',
|
|
11
|
+
meta: {
|
|
12
|
+
title: 'Slate',
|
|
13
|
+
description: 'Dense corporate dashboard — muted slate blue, compact density, tight radii.',
|
|
14
|
+
dark: false,
|
|
15
|
+
iconStyle: 'filled',
|
|
16
|
+
swatch: ['#F4F6F8', '#FFFFFF', '#2C5282', '#4A6FA5'],
|
|
17
|
+
fonts: ['Inter'],
|
|
18
|
+
},
|
|
19
|
+
theme: {
|
|
20
|
+
dark: false,
|
|
21
|
+
colors: {
|
|
22
|
+
background: '#F4F6F8',
|
|
23
|
+
surface: '#FFFFFF',
|
|
24
|
+
'surface-bright': '#FFFFFF',
|
|
25
|
+
'surface-light': '#EAEEF3',
|
|
26
|
+
'surface-variant': '#33415C',
|
|
27
|
+
'on-surface-variant': '#EAEEF3',
|
|
28
|
+
primary: '#2C5282',
|
|
29
|
+
'primary-darken-1': '#1F3C63',
|
|
30
|
+
secondary: '#4A6FA5',
|
|
31
|
+
'secondary-darken-1': '#375684',
|
|
32
|
+
error: '#C53030',
|
|
33
|
+
info: '#2B6CB0',
|
|
34
|
+
success: '#2F855A',
|
|
35
|
+
warning: '#B7791F',
|
|
36
|
+
'on-surface': '#1A202C',
|
|
37
|
+
'on-background': '#1A202C',
|
|
38
|
+
},
|
|
39
|
+
variables: {
|
|
40
|
+
'border-color': '#1A202C',
|
|
41
|
+
'border-opacity': 0.14,
|
|
42
|
+
'shadow-color': '#1A202C',
|
|
43
|
+
'high-emphasis-opacity': 0.9,
|
|
44
|
+
'medium-emphasis-opacity': 0.62,
|
|
45
|
+
'hover-opacity': 0.05,
|
|
46
|
+
'font-body': "'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif",
|
|
47
|
+
'vw-radius': '3px',
|
|
48
|
+
'vw-radius-lg': '4px',
|
|
49
|
+
'vw-radius-thumb': '3px',
|
|
50
|
+
'vw-radius-chip': '3px',
|
|
51
|
+
'vw-border-width': '1px',
|
|
52
|
+
'vw-btn-transform': 'none',
|
|
53
|
+
'vw-btn-tracking': '0.01em',
|
|
54
|
+
'vw-btn-weight': '600',
|
|
55
|
+
'vw-list-bar': '3px',
|
|
56
|
+
'vw-list-bar-color': 'rgb(var(--v-theme-primary))',
|
|
57
|
+
'vw-tab-slider-height': '3px',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
defaults: [
|
|
61
|
+
{
|
|
62
|
+
VBtn: { variant: 'flat', density: 'comfortable' },
|
|
63
|
+
VCard: { variant: 'outlined' },
|
|
64
|
+
VAlert: { variant: 'tonal', density: 'compact' },
|
|
65
|
+
VChip: { variant: 'tonal', size: 'small' },
|
|
66
|
+
VNavigationDrawer: { border: 'e' },
|
|
67
|
+
},
|
|
68
|
+
fields({ variant: 'outlined', density: 'compact' }),
|
|
69
|
+
controls({ density: 'compact' }),
|
|
70
|
+
tables('compact'),
|
|
71
|
+
bars({ flat: true, border: 'b' }),
|
|
72
|
+
{
|
|
73
|
+
// Small, square and out of the way — controls should not outweigh the
|
|
74
|
+
// data they sit next to.
|
|
75
|
+
VSwitch: { inset: 'square' },
|
|
76
|
+
VSlider: { thumbSize: 14, trackSize: 2 },
|
|
77
|
+
},
|
|
78
|
+
icons({
|
|
79
|
+
// Solid triangles: they read at a glance and take less room than a
|
|
80
|
+
// chevron, which matters in a dense table.
|
|
81
|
+
dropdown: 'mdi-menu-down',
|
|
82
|
+
collapse: 'mdi-menu-up',
|
|
83
|
+
checkboxOn: 'mdi-checkbox-marked',
|
|
84
|
+
checkboxOff: 'mdi-checkbox-blank-outline',
|
|
85
|
+
sortAsc: 'mdi-menu-up',
|
|
86
|
+
sortDesc: 'mdi-menu-down',
|
|
87
|
+
}),
|
|
88
|
+
],
|
|
89
|
+
})
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { bars, fields, icons } from '../util/defaults.js'
|
|
2
|
+
import { defineTheme } from '../util/defineTheme.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Pastel and generous: large radii, diffuse coloured shadows, a rounded
|
|
6
|
+
* grotesque. Reads friendly rather than corporate — consumer apps,
|
|
7
|
+
* onboarding, anything that should not feel like a dashboard.
|
|
8
|
+
*/
|
|
9
|
+
export const soft = defineTheme({
|
|
10
|
+
name: 'soft',
|
|
11
|
+
meta: {
|
|
12
|
+
title: 'Soft',
|
|
13
|
+
description: 'Pastel palette, large radii and diffuse shadows. Friendly and unhurried.',
|
|
14
|
+
dark: false,
|
|
15
|
+
iconStyle: 'filled',
|
|
16
|
+
swatch: ['#F7F5FF', '#FFFFFF', '#7C6CF0', '#F08CA8'],
|
|
17
|
+
fonts: ['Nunito'],
|
|
18
|
+
},
|
|
19
|
+
theme: {
|
|
20
|
+
dark: false,
|
|
21
|
+
colors: {
|
|
22
|
+
background: '#F7F5FF',
|
|
23
|
+
surface: '#FFFFFF',
|
|
24
|
+
'surface-bright': '#FFFFFF',
|
|
25
|
+
'surface-light': '#EAE3FF',
|
|
26
|
+
'surface-variant': '#4A4458',
|
|
27
|
+
'on-surface-variant': '#F7F5FF',
|
|
28
|
+
primary: '#7C6CF0',
|
|
29
|
+
'primary-darken-1': '#5F4DE0',
|
|
30
|
+
secondary: '#F08CA8',
|
|
31
|
+
'secondary-darken-1': '#DB6C8B',
|
|
32
|
+
error: '#F0736E',
|
|
33
|
+
info: '#58B7E8',
|
|
34
|
+
success: '#4FC38A',
|
|
35
|
+
warning: '#F5B851',
|
|
36
|
+
'on-surface': '#2E2A3B',
|
|
37
|
+
'on-background': '#2E2A3B',
|
|
38
|
+
},
|
|
39
|
+
variables: {
|
|
40
|
+
'border-color': '#5F4DE0',
|
|
41
|
+
'border-opacity': 0.1,
|
|
42
|
+
'shadow-color': '#4A3F8C',
|
|
43
|
+
'high-emphasis-opacity': 0.88,
|
|
44
|
+
'medium-emphasis-opacity': 0.62,
|
|
45
|
+
'hover-opacity': 0.06,
|
|
46
|
+
'font-body': "'Nunito', 'Quicksand', system-ui, sans-serif",
|
|
47
|
+
'vw-radius': '14px',
|
|
48
|
+
'vw-radius-lg': '22px',
|
|
49
|
+
'vw-radius-chip': '999px',
|
|
50
|
+
'vw-btn-transform': 'none',
|
|
51
|
+
'vw-btn-tracking': '0',
|
|
52
|
+
'vw-btn-weight': '700',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
defaults: [
|
|
56
|
+
{
|
|
57
|
+
VBtn: { variant: 'flat' },
|
|
58
|
+
VCard: { variant: 'elevated', elevation: 0 },
|
|
59
|
+
VAlert: { variant: 'tonal' },
|
|
60
|
+
VChip: { variant: 'tonal' },
|
|
61
|
+
},
|
|
62
|
+
fields({ variant: 'solo-filled' }),
|
|
63
|
+
bars({ flat: true }),
|
|
64
|
+
{
|
|
65
|
+
// Everything here rounds off: an inset pill switch, a fat slider, a
|
|
66
|
+
// pill behind the active tab instead of an underline, round tick boxes.
|
|
67
|
+
VSwitch: { inset: true },
|
|
68
|
+
VSlider: { thumbSize: 22, trackSize: 8 },
|
|
69
|
+
// `VTabs` owns its own inset radius, so the theme sets it here
|
|
70
|
+
// rather than through the shared `--v-vw-radius`.
|
|
71
|
+
VTabs: { inset: true, insetRadius: 12 },
|
|
72
|
+
},
|
|
73
|
+
icons({
|
|
74
|
+
// Round and filled, down to hearts instead of stars.
|
|
75
|
+
dropdown: 'mdi-chevron-down',
|
|
76
|
+
collapse: 'mdi-chevron-up',
|
|
77
|
+
checkboxOn: 'mdi-check-circle',
|
|
78
|
+
checkboxOff: 'mdi-circle-outline',
|
|
79
|
+
ratingFull: 'mdi-heart',
|
|
80
|
+
ratingEmpty: 'mdi-heart-outline',
|
|
81
|
+
close: 'mdi-close-circle',
|
|
82
|
+
}),
|
|
83
|
+
],
|
|
84
|
+
})
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { createVuetify, ThemeDefinition } from 'vuetify'
|
|
2
|
+
|
|
3
|
+
/** Global component defaults, same shape as `createVuetify({ defaults })`. */
|
|
4
|
+
export type VuetiwatchDefaults = NonNullable<
|
|
5
|
+
NonNullable<Parameters<typeof createVuetify>[0]>['defaults']
|
|
6
|
+
>
|
|
7
|
+
|
|
8
|
+
export interface VuetiwatchMeta {
|
|
9
|
+
/** Human readable name, for theme pickers. */
|
|
10
|
+
title: string
|
|
11
|
+
/** One line pitch — what the theme feels like. */
|
|
12
|
+
description: string
|
|
13
|
+
/** `true` when the theme is a dark variant. */
|
|
14
|
+
dark: boolean
|
|
15
|
+
/** Preview swatch: background, surface, primary, secondary. */
|
|
16
|
+
swatch: [string, string, string, string]
|
|
17
|
+
/**
|
|
18
|
+
* How the theme would like *content* icons drawn — the ones an app passes
|
|
19
|
+
* itself, like a mailbox or a dashboard.
|
|
20
|
+
*
|
|
21
|
+
* Vuetify only lets a theme choose the glyphs of controls it renders
|
|
22
|
+
* (a checkbox tick, a sort arrow); anything an app passes as a literal
|
|
23
|
+
* name is its own content, and a theme has no business overriding it.
|
|
24
|
+
* So the theme states a preference here and an app may follow it — see
|
|
25
|
+
* the playground's navigation demo.
|
|
26
|
+
*/
|
|
27
|
+
iconStyle: 'outline' | 'filled'
|
|
28
|
+
/**
|
|
29
|
+
* Web fonts the theme expects. The package never loads them for you —
|
|
30
|
+
* add them yourself (Google Fonts, Fontsource, self-hosted) for the full
|
|
31
|
+
* look, or skip it and fall back to the system stack.
|
|
32
|
+
*/
|
|
33
|
+
fonts: string[]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface VuetiwatchTheme<Name extends string = string> {
|
|
37
|
+
/** Key used in `createVuetify({ theme: { themes } })`. */
|
|
38
|
+
name: Name
|
|
39
|
+
meta: VuetiwatchMeta
|
|
40
|
+
/** Colors and CSS variables, passed straight to Vuetify. */
|
|
41
|
+
theme: ThemeDefinition
|
|
42
|
+
/** Component defaults applied while this theme is active. */
|
|
43
|
+
defaults: VuetiwatchDefaults
|
|
44
|
+
}
|