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.
Files changed (158) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +232 -0
  3. package/dist/index.d.ts +11 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +6 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/plugin.d.ts +41 -0
  8. package/dist/plugin.d.ts.map +1 -0
  9. package/dist/plugin.js +58 -0
  10. package/dist/plugin.js.map +1 -0
  11. package/dist/registry.d.ts +17 -0
  12. package/dist/registry.d.ts.map +1 -0
  13. package/dist/registry.js +37 -0
  14. package/dist/registry.js.map +1 -0
  15. package/dist/styles/aurora.css +74 -0
  16. package/dist/styles/aurora.min.css +1 -0
  17. package/dist/styles/brutalist.css +48 -0
  18. package/dist/styles/brutalist.min.css +1 -0
  19. package/dist/styles/calm.css +21 -0
  20. package/dist/styles/calm.min.css +1 -0
  21. package/dist/styles/clay.css +44 -0
  22. package/dist/styles/clay.min.css +1 -0
  23. package/dist/styles/core.css +140 -0
  24. package/dist/styles/core.min.css +1 -0
  25. package/dist/styles/darkGlass.css +43 -0
  26. package/dist/styles/darkGlass.min.css +1 -0
  27. package/dist/styles/liquidGlass.css +100 -0
  28. package/dist/styles/liquidGlass.min.css +1 -0
  29. package/dist/styles/lux.css +21 -0
  30. package/dist/styles/lux.min.css +1 -0
  31. package/dist/styles/morph.css +37 -0
  32. package/dist/styles/morph.min.css +1 -0
  33. package/dist/styles/neon.css +41 -0
  34. package/dist/styles/neon.min.css +1 -0
  35. package/dist/styles/paper.css +17 -0
  36. package/dist/styles/paper.min.css +1 -0
  37. package/dist/styles/sketchy.css +25 -0
  38. package/dist/styles/sketchy.min.css +1 -0
  39. package/dist/styles/slate.css +16 -0
  40. package/dist/styles/slate.min.css +1 -0
  41. package/dist/styles/soft.css +46 -0
  42. package/dist/styles/soft.min.css +1 -0
  43. package/dist/styles.css +686 -0
  44. package/dist/styles.min.css +1 -0
  45. package/dist/themes/aurora.d.ts +10 -0
  46. package/dist/themes/aurora.d.ts.map +1 -0
  47. package/dist/themes/aurora.js +86 -0
  48. package/dist/themes/aurora.js.map +1 -0
  49. package/dist/themes/brutalist.d.ts +10 -0
  50. package/dist/themes/brutalist.d.ts.map +1 -0
  51. package/dist/themes/brutalist.js +103 -0
  52. package/dist/themes/brutalist.js.map +1 -0
  53. package/dist/themes/calm.d.ts +11 -0
  54. package/dist/themes/calm.d.ts.map +1 -0
  55. package/dist/themes/calm.js +88 -0
  56. package/dist/themes/calm.js.map +1 -0
  57. package/dist/themes/classic.d.ts +6 -0
  58. package/dist/themes/classic.d.ts.map +1 -0
  59. package/dist/themes/classic.js +23 -0
  60. package/dist/themes/classic.js.map +1 -0
  61. package/dist/themes/clay.d.ts +8 -0
  62. package/dist/themes/clay.d.ts.map +1 -0
  63. package/dist/themes/clay.js +80 -0
  64. package/dist/themes/clay.js.map +1 -0
  65. package/dist/themes/darkGlass.d.ts +7 -0
  66. package/dist/themes/darkGlass.d.ts.map +1 -0
  67. package/dist/themes/darkGlass.js +77 -0
  68. package/dist/themes/darkGlass.js.map +1 -0
  69. package/dist/themes/index.d.ts +15 -0
  70. package/dist/themes/index.d.ts.map +1 -0
  71. package/dist/themes/index.js +15 -0
  72. package/dist/themes/index.js.map +1 -0
  73. package/dist/themes/liquidGlass.d.ts +19 -0
  74. package/dist/themes/liquidGlass.d.ts.map +1 -0
  75. package/dist/themes/liquidGlass.js +111 -0
  76. package/dist/themes/liquidGlass.js.map +1 -0
  77. package/dist/themes/lux.d.ts +8 -0
  78. package/dist/themes/lux.d.ts.map +1 -0
  79. package/dist/themes/lux.js +91 -0
  80. package/dist/themes/lux.js.map +1 -0
  81. package/dist/themes/morph.d.ts +10 -0
  82. package/dist/themes/morph.d.ts.map +1 -0
  83. package/dist/themes/morph.js +82 -0
  84. package/dist/themes/morph.js.map +1 -0
  85. package/dist/themes/neon.d.ts +7 -0
  86. package/dist/themes/neon.d.ts.map +1 -0
  87. package/dist/themes/neon.js +96 -0
  88. package/dist/themes/neon.js.map +1 -0
  89. package/dist/themes/paper.d.ts +7 -0
  90. package/dist/themes/paper.d.ts.map +1 -0
  91. package/dist/themes/paper.js +88 -0
  92. package/dist/themes/paper.js.map +1 -0
  93. package/dist/themes/sketchy.d.ts +11 -0
  94. package/dist/themes/sketchy.d.ts.map +1 -0
  95. package/dist/themes/sketchy.js +88 -0
  96. package/dist/themes/sketchy.js.map +1 -0
  97. package/dist/themes/slate.d.ts +7 -0
  98. package/dist/themes/slate.d.ts.map +1 -0
  99. package/dist/themes/slate.js +89 -0
  100. package/dist/themes/slate.js.map +1 -0
  101. package/dist/themes/soft.d.ts +7 -0
  102. package/dist/themes/soft.d.ts.map +1 -0
  103. package/dist/themes/soft.js +84 -0
  104. package/dist/themes/soft.js.map +1 -0
  105. package/dist/types.d.ts +40 -0
  106. package/dist/types.d.ts.map +1 -0
  107. package/dist/types.js +2 -0
  108. package/dist/types.js.map +1 -0
  109. package/dist/util/defaults.d.ts +62 -0
  110. package/dist/util/defaults.d.ts.map +1 -0
  111. package/dist/util/defaults.js +100 -0
  112. package/dist/util/defaults.js.map +1 -0
  113. package/dist/util/defineTheme.d.ts +21 -0
  114. package/dist/util/defineTheme.d.ts.map +1 -0
  115. package/dist/util/defineTheme.js +25 -0
  116. package/dist/util/defineTheme.js.map +1 -0
  117. package/dist/util/merge.d.ts +8 -0
  118. package/dist/util/merge.d.ts.map +1 -0
  119. package/dist/util/merge.js +17 -0
  120. package/dist/util/merge.js.map +1 -0
  121. package/package.json +75 -0
  122. package/src/index.ts +35 -0
  123. package/src/plugin.ts +116 -0
  124. package/src/registry.ts +64 -0
  125. package/src/styles/core.css +311 -0
  126. package/src/styles/index.css +30 -0
  127. package/src/styles/themes/aurora.css +86 -0
  128. package/src/styles/themes/brutalist.css +59 -0
  129. package/src/styles/themes/calm.css +31 -0
  130. package/src/styles/themes/clay.css +60 -0
  131. package/src/styles/themes/darkGlass.css +69 -0
  132. package/src/styles/themes/liquidGlass.css +172 -0
  133. package/src/styles/themes/lux.css +31 -0
  134. package/src/styles/themes/morph.css +53 -0
  135. package/src/styles/themes/neon.css +56 -0
  136. package/src/styles/themes/paper.css +32 -0
  137. package/src/styles/themes/sketchy.css +34 -0
  138. package/src/styles/themes/slate.css +26 -0
  139. package/src/styles/themes/soft.css +63 -0
  140. package/src/themes/aurora.ts +86 -0
  141. package/src/themes/brutalist.ts +103 -0
  142. package/src/themes/calm.ts +88 -0
  143. package/src/themes/classic.ts +23 -0
  144. package/src/themes/clay.ts +80 -0
  145. package/src/themes/darkGlass.ts +77 -0
  146. package/src/themes/index.ts +14 -0
  147. package/src/themes/liquidGlass.ts +111 -0
  148. package/src/themes/lux.ts +91 -0
  149. package/src/themes/morph.ts +82 -0
  150. package/src/themes/neon.ts +96 -0
  151. package/src/themes/paper.ts +88 -0
  152. package/src/themes/sketchy.ts +88 -0
  153. package/src/themes/slate.ts +89 -0
  154. package/src/themes/soft.ts +84 -0
  155. package/src/types.ts +44 -0
  156. package/src/util/defaults.ts +164 -0
  157. package/src/util/defineTheme.ts +49 -0
  158. package/src/util/merge.ts +23 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 j-tap
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,232 @@
1
+ # Vuetiwatch
2
+
3
+ 🎨 Free, plug-and-play themes for **[Vuetify 4](https://vuetifyjs.com/)** — what [Bootswatch](https://bootswatch.com/)
4
+ is to Bootstrap.
5
+
6
+ **[See all fourteen themes →](https://j-tap.github.io/vuetiwatch/)**
7
+
8
+ Vuetify ships one look. Vuetiwatch ships fourteen, and they differ in more
9
+ than hue: radius, border weight, density, component variants, typography and
10
+ icons all move together.
11
+
12
+ ```sh
13
+ npm i vuetiwatch # or: bun add / yarn add / pnpm add
14
+ ```
15
+
16
+ ## Themes
17
+
18
+ | Name | Mode | Character |
19
+ | --- | --- | --- |
20
+ | `classic` | light | Stock Vuetify. Material Design, Roboto, familiar elevation |
21
+ | `paper` | light | Flat editorial — warm paper, ink accents, hairline borders, serif headings |
22
+ | `slate` | light | Dense dashboard — muted slate blue, compact density, outlined cards |
23
+ | `calm` | light | Low contrast, desaturated naturals, no shadows, a lot of air |
24
+ | `lux` | light | Editorial luxury — hairline rules, wide tracking, small caps, muted gold |
25
+ | `soft` | light | Pastel and generous — large radii, diffuse tinted shadows, hearts for stars |
26
+ | `clay` | light | Inflated pastel shapes with a triple shadow. Toy-like |
27
+ | `morph` | light | Neumorphic — one continuous surface, shaped only by light and shadow |
28
+ | `sketchy` | light | Hand-drawn wobble and pencil greys, for mockups and mirth |
29
+ | `brutalist` | light | Thick black rules, acid lime, hard unblurred shadows |
30
+ | `liquidGlass` | light | Capsule controls and refracting panes over a calm wash, after iOS 26 |
31
+ | `darkGlass` | dark | Frosted translucent surfaces on a deep violet ground |
32
+ | `aurora` | dark | Iridescent gradients on near-black — the showcase theme |
33
+ | `neon` | dark | Terminal black, cyan and magenta glow, zero radius, monospace headings |
34
+
35
+ ## Setup
36
+
37
+ **1. Register the themes.** They are plain Vuetify `ThemeDefinition`s.
38
+
39
+ ```ts
40
+ // plugins/vuetify.ts
41
+ import { createVuetify } from 'vuetify'
42
+ import { vuetiwatchThemes } from 'vuetiwatch'
43
+
44
+ import 'vuetify/styles'
45
+ import 'vuetiwatch/styles.css'
46
+
47
+ export const vuetify = createVuetify({
48
+ theme: { defaultTheme: 'paper', themes: vuetiwatchThemes },
49
+ })
50
+ ```
51
+
52
+ **2. Install the plugin, after Vuetify.**
53
+
54
+ ```ts
55
+ // main.ts
56
+ import { createVuetiwatch, themeList } from 'vuetiwatch'
57
+
58
+ createApp(App)
59
+ .use(vuetify)
60
+ .use(createVuetiwatch(vuetify, { themes: themeList }))
61
+ .mount('#app')
62
+ ```
63
+
64
+ That is the whole setup. Step 1 alone gives you colours and fonts; the
65
+ stylesheet and the plugin add everything a `ThemeDefinition` cannot express —
66
+ radius, border weight, component variants, icons and per-theme surface
67
+ treatment.
68
+
69
+ The plugin swaps Vuetify's **global component defaults** when the theme
70
+ changes, since those are global rather than per-theme. Your own
71
+ `createVuetify({ defaults })` is preserved; theme defaults layer on top.
72
+
73
+ ### Switching themes
74
+
75
+ Standard Vuetify:
76
+
77
+ ```vue
78
+ <script setup lang="ts">
79
+ import { useTheme } from 'vuetify'
80
+ import { themeList } from 'vuetiwatch'
81
+
82
+ const theme = useTheme()
83
+ </script>
84
+
85
+ <template>
86
+ <button v-for="t in themeList" :key="t.name" @click="theme.change(t.name)">
87
+ {{ t.meta.title }}
88
+ </button>
89
+ </template>
90
+ ```
91
+
92
+ ### Fonts
93
+
94
+ Themes name the families they want but never load them — that stays your
95
+ call. `meta.fonts` lists what each expects, and every family has a system
96
+ fallback, so skipping this degrades gracefully rather than breaking.
97
+
98
+ ```html
99
+ <link rel="stylesheet"
100
+ href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap">
101
+ ```
102
+
103
+ ### Shipping only a few themes
104
+
105
+ Pass just those to the plugin and import their stylesheets instead of the
106
+ combined one. A single-theme app drops from about 9.5 kB gzipped to 3.4 kB.
107
+
108
+ ```ts
109
+ import { createVuetiwatch, paper } from 'vuetiwatch'
110
+ import 'vuetiwatch/styles/core.css'
111
+ import 'vuetiwatch/styles/paper.css'
112
+
113
+ app.use(createVuetiwatch(vuetify, { themes: [paper] }))
114
+ ```
115
+
116
+ `core.css` is always needed. A theme file exists only where a theme needs
117
+ more than its `ThemeDefinition` can express, so `classic` has none. Every
118
+ file also ships as `*.min.css`.
119
+
120
+ ## Writing your own theme
121
+
122
+ A theme states only what it changes — Vuetify merges it over its own `light`
123
+ or `dark` first, so anything you leave out is inherited.
124
+
125
+ ```ts
126
+ import { defineTheme } from 'vuetiwatch'
127
+
128
+ export const midnight = defineTheme({
129
+ name: 'midnight',
130
+ meta: {
131
+ title: 'Midnight',
132
+ description: 'Deep blue, quiet contrast.',
133
+ dark: true,
134
+ iconStyle: 'outline',
135
+ swatch: ['#070B18', '#101830', '#5B8DEF', '#8A7BF0'],
136
+ fonts: ['Inter'],
137
+ },
138
+ theme: {
139
+ dark: true,
140
+ colors: { background: '#070B18', surface: '#101830', primary: '#5B8DEF' },
141
+ variables: {
142
+ 'font-body': "'Inter', system-ui, sans-serif",
143
+ 'vw-radius': '8px',
144
+ },
145
+ },
146
+ defaults: { VCard: { variant: 'outlined' } },
147
+ })
148
+ ```
149
+
150
+ Register it alongside the rest:
151
+
152
+ ```ts
153
+ createVuetify({ theme: { themes: { ...vuetiwatchThemes, midnight: midnight.theme } } })
154
+ app.use(createVuetiwatch(vuetify, { themes: [...themeList, midnight] }))
155
+ ```
156
+
157
+ ### Theme variables
158
+
159
+ Vuetify re-emits everything under `variables` as a CSS custom property when
160
+ the theme changes, which is how the stylesheet stays generic. Alongside
161
+ Vuetify's own, it reads:
162
+
163
+ | Variable | Default | Effect |
164
+ | --- | --- | --- |
165
+ | `vw-radius` | `4px` | Fields, alerts, lists, menus, snackbars, slider track |
166
+ | `vw-radius-btn` | `vw-radius` | Buttons only, for themes whose controls are capsules |
167
+ | `vw-radius-lg` | `vw-radius` | Cards, tables, expansion panels |
168
+ | `vw-radius-chip` | `9999px` | Chips |
169
+ | `vw-radius-thumb` | `50%` | Slider thumb |
170
+ | `vw-border-width` | `thin` | Outlined variants and field outlines |
171
+ | `vw-btn-weight` / `-tracking` / `-transform` | Vuetify's | Button typography |
172
+ | `vw-heading-weight` / `-tracking` / `-transform` | Vuetify's | Headings and the display / headline / title-large scale |
173
+ | `vw-th-weight` / `-tracking` / `-transform` | Vuetify's | Table headers |
174
+ | `vw-tab-slider-height` | `2px` | Active tab indicator |
175
+ | `vw-overlay-shadow` / `-border` | Vuetify's | Menus, dialogs and tooltips |
176
+ | `vw-list-bar` / `-color` | `0` | Accent bar on the active list item, leading edge |
177
+ | `vw-pagination-active-color` / `-opacity` | Vuetify's | The current page |
178
+ | `vw-link-decoration` | `underline` | Bare `<a>` elements |
179
+ | `font-body` / `font-heading` | Roboto | Native to Vuetify 4 |
180
+
181
+ An explicit `rounded` prop always wins over `vw-radius`.
182
+
183
+ `font-heading` reaches `text-display-*`, `text-headline-*`, `text-title-large`
184
+ and bare `<h1>`–`<h6>`; the rest of the scale takes `font-body`. Vuetify 4
185
+ uses the Material 3 names — `text-h1`…`text-h6`, `text-body-1`, `text-caption`
186
+ and `text-overline` no longer exist.
187
+
188
+ ### Icons
189
+
190
+ Vuetify's icon *set* is global and cannot vary per theme, but which glyph a
191
+ component draws is an ordinary prop. `icons()` spreads one semantic set across
192
+ every component that draws it — `dropdown` reaches selects, expansion panels
193
+ and list groups at once.
194
+
195
+ ```ts
196
+ import { icons } from 'vuetiwatch'
197
+
198
+ defineTheme({
199
+ // …
200
+ defaults: [
201
+ icons({
202
+ dropdown: 'mdi-chevron-down',
203
+ checkboxOn: 'mdi-check-circle',
204
+ checkboxOff: 'mdi-circle-outline',
205
+ }),
206
+ ],
207
+ })
208
+ ```
209
+
210
+ Every key is optional; names must exist in the set the app installed, since a
211
+ missing one renders blank.
212
+
213
+ This covers only the glyphs Vuetify draws for its own controls. An icon the
214
+ app passes itself — a mailbox, a dashboard — is content, so a theme declares a
215
+ preference through `meta.iconStyle` instead and the app may follow it:
216
+
217
+ ```ts
218
+ const outlined = computed(
219
+ () => vuetiwatchMeta[theme.global.name.value]?.iconStyle === 'outline',
220
+ )
221
+ ```
222
+
223
+ ## Requirements
224
+
225
+ - **Vuetify 4.0+.** v3 is not supported: runtime font switching
226
+ (`--v-font-body`, `--v-font-heading`) and `shadow-color` exist only in v4,
227
+ and without them the themes lose most of what separates them.
228
+ - **Vue 3.5+**
229
+
230
+ ## License
231
+
232
+ MIT
@@ -0,0 +1,11 @@
1
+ export { aurora, brutalist, calm, classic, clay, darkGlass, liquidGlass, lux, morph, neon, paper, sketchy, slate, soft, } from './themes/index.js';
2
+ export { themeList, vuetiwatchDefaults, vuetiwatchMeta, vuetiwatchThemes, } from './registry.js';
3
+ export { createVuetiwatch } from './plugin.js';
4
+ export { defineTheme } from './util/defineTheme.js';
5
+ export { bars, combine, controls, fields, icons, surfaces, tables } from './util/defaults.js';
6
+ export type { VuetiwatchOptions } from './plugin.js';
7
+ export type { VuetiwatchThemeName } from './registry.js';
8
+ export type { DefineThemeOptions } from './util/defineTheme.js';
9
+ export type { VuetiwatchIcons } from './util/defaults.js';
10
+ export type { VuetiwatchDefaults, VuetiwatchMeta, VuetiwatchTheme, } from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,SAAS,EACT,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,EACT,WAAW,EACX,GAAG,EACH,KAAK,EACL,IAAI,EACJ,KAAK,EACL,OAAO,EACP,KAAK,EACL,IAAI,GACL,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE7F,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { aurora, brutalist, calm, classic, clay, darkGlass, liquidGlass, lux, morph, neon, paper, sketchy, slate, soft, } from './themes/index.js';
2
+ export { themeList, vuetiwatchDefaults, vuetiwatchMeta, vuetiwatchThemes, } from './registry.js';
3
+ export { createVuetiwatch } from './plugin.js';
4
+ export { defineTheme } from './util/defineTheme.js';
5
+ export { bars, combine, controls, fields, icons, surfaces, tables } from './util/defaults.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,SAAS,EACT,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,EACT,WAAW,EACX,GAAG,EACH,KAAK,EACL,IAAI,EACJ,KAAK,EACL,OAAO,EACP,KAAK,EACL,IAAI,GACL,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,41 @@
1
+ import type { Plugin } from 'vue';
2
+ import type { VuetiwatchTheme } from './types.js';
3
+ export interface VuetiwatchOptions {
4
+ /**
5
+ * Themes to manage — normally the package's `themeList`, or just the ones
6
+ * an app ships.
7
+ *
8
+ * Required rather than defaulted, because a default would mean importing
9
+ * the registry here, and a static import cannot be shaken out: every app
10
+ * would carry all fourteen themes even after passing one.
11
+ */
12
+ themes: readonly VuetiwatchTheme[];
13
+ /**
14
+ * Apply each theme's component defaults on top of your own.
15
+ * @default true
16
+ */
17
+ defaults?: boolean;
18
+ /**
19
+ * Mirror the active theme name onto `<html data-vuetiwatch="...">`, so
20
+ * you can hang your own CSS off it.
21
+ * @default true
22
+ */
23
+ attribute?: boolean;
24
+ }
25
+ /**
26
+ * Keeps Vuetify's global component defaults in sync with the active theme.
27
+ *
28
+ * Vuetify's `defaults` are global rather than per-theme, so a theme that
29
+ * wants outlined cards or compact tables cannot express that through a
30
+ * `ThemeDefinition` alone. This plugin watches the active theme and swaps
31
+ * those defaults for you, merging them over whatever you passed to
32
+ * `createVuetify({ defaults })`.
33
+ *
34
+ * Install it after Vuetify:
35
+ *
36
+ * ```ts
37
+ * app.use(vuetify).use(createVuetiwatch(vuetify))
38
+ * ```
39
+ */
40
+ export declare function createVuetiwatch(vuetify: unknown, options: VuetiwatchOptions): Plugin;
41
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAO,MAAM,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,KAAK,EAAsB,eAAe,EAAE,MAAM,YAAY,CAAA;AAarE,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,iBAAiB,GACzB,MAAM,CA2DR"}
package/dist/plugin.js ADDED
@@ -0,0 +1,58 @@
1
+ import { watch } from 'vue';
2
+ import { combine } from './util/defaults.js';
3
+ /**
4
+ * Keeps Vuetify's global component defaults in sync with the active theme.
5
+ *
6
+ * Vuetify's `defaults` are global rather than per-theme, so a theme that
7
+ * wants outlined cards or compact tables cannot express that through a
8
+ * `ThemeDefinition` alone. This plugin watches the active theme and swaps
9
+ * those defaults for you, merging them over whatever you passed to
10
+ * `createVuetify({ defaults })`.
11
+ *
12
+ * Install it after Vuetify:
13
+ *
14
+ * ```ts
15
+ * app.use(vuetify).use(createVuetiwatch(vuetify))
16
+ * ```
17
+ */
18
+ export function createVuetiwatch(vuetify, options) {
19
+ const { themes, defaults: applyDefaults = true, attribute = true, } = options;
20
+ // Only the defaults are ever read here, so the closure holds those rather
21
+ // than the whole theme objects — palettes and metadata for every theme
22
+ // would otherwise stay pinned for the life of the app.
23
+ const defaultsByName = new Map(themes.map(theme => [theme.name, theme.defaults]));
24
+ return {
25
+ install(_app) {
26
+ const instance = vuetify;
27
+ if (!instance?.theme?.global?.name) {
28
+ throw new Error('[vuetiwatch] createVuetiwatch() expects the object returned by createVuetify(). ' +
29
+ 'Install it after Vuetify: app.use(vuetify).use(createVuetiwatch(vuetify))');
30
+ }
31
+ // Whatever the app configured itself — theme defaults layer on top of it.
32
+ const userDefaults = instance.defaults.value ?? {};
33
+ // The merge is a pure function of the theme name, so it is computed at
34
+ // most once per theme however often the app switches.
35
+ const merged = new Map();
36
+ const defaultsFor = (name) => {
37
+ const themeDefaults = defaultsByName.get(name);
38
+ if (!themeDefaults)
39
+ return userDefaults;
40
+ let result = merged.get(name);
41
+ if (!result) {
42
+ result = combine(userDefaults, themeDefaults);
43
+ merged.set(name, result);
44
+ }
45
+ return result;
46
+ };
47
+ watch(() => instance.theme.global.name.value, name => {
48
+ if (applyDefaults) {
49
+ instance.defaults.value = defaultsFor(name);
50
+ }
51
+ if (attribute && typeof document !== 'undefined') {
52
+ document.documentElement.setAttribute('data-vuetiwatch', name);
53
+ }
54
+ }, { immediate: true });
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,CAAA;AAG3B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAmC5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAgB,EAChB,OAA0B;IAE1B,MAAM,EACJ,MAAM,EACN,QAAQ,EAAE,aAAa,GAAG,IAAI,EAC9B,SAAS,GAAG,IAAI,GACjB,GAAG,OAAO,CAAA;IAEX,0EAA0E;IAC1E,uEAAuE;IACvE,uDAAuD;IACvD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAEjF,OAAO;QACL,OAAO,CAAE,IAAS;YAChB,MAAM,QAAQ,GAAG,OAAsB,CAAA;YAEvC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,kFAAkF;oBAClF,2EAA2E,CAC5E,CAAA;YACH,CAAC;YAED,0EAA0E;YAC1E,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAA;YAElD,uEAAuE;YACvE,sDAAsD;YACtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAA;YACpD,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE;gBACnC,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAE9C,IAAI,CAAC,aAAa;oBAAE,OAAO,YAAY,CAAA;gBAEvC,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;oBAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;gBAC1B,CAAC;gBAED,OAAO,MAAM,CAAA;YACf,CAAC,CAAA;YAED,KAAK,CACH,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EACtC,IAAI,CAAC,EAAE;gBACL,IAAI,aAAa,EAAE,CAAC;oBAClB,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;gBAC7C,CAAC;gBAED,IAAI,SAAS,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;oBACjD,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAA;gBAChE,CAAC;YACH,CAAC,EACD,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ThemeDefinition } from 'vuetify';
2
+ import type { VuetiwatchDefaults, VuetiwatchMeta, VuetiwatchTheme } from './types.js';
3
+ /**
4
+ * Every theme in the package, in the order a picker should show them:
5
+ * the everyday ones first, then the niche ones.
6
+ */
7
+ export declare const themeList: readonly [VuetiwatchTheme<"classic">, VuetiwatchTheme<"paper">, VuetiwatchTheme<"slate">, VuetiwatchTheme<"calm">, VuetiwatchTheme<"lux">, VuetiwatchTheme<"soft">, VuetiwatchTheme<"clay">, VuetiwatchTheme<"morph">, VuetiwatchTheme<"sketchy">, VuetiwatchTheme<"brutalist">, VuetiwatchTheme<"liquidGlass">, VuetiwatchTheme<"darkGlass">, VuetiwatchTheme<"aurora">, VuetiwatchTheme<"neon">];
8
+ export type VuetiwatchThemeName = (typeof themeList)[number]['name'];
9
+ type ByName<T> = Record<VuetiwatchThemeName, T>;
10
+ /** Ready for `createVuetify({ theme: { themes: vuetiwatchThemes } })`. */
11
+ export declare const vuetiwatchThemes: ByName<ThemeDefinition>;
12
+ /** Per-theme component defaults, applied for you by `createVuetiwatch()`. */
13
+ export declare const vuetiwatchDefaults: ByName<VuetiwatchDefaults>;
14
+ /** Titles, descriptions and preview swatches, for building a theme picker. */
15
+ export declare const vuetiwatchMeta: ByName<VuetiwatchMeta>;
16
+ export {};
17
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAkBrF;;;GAGG;AACH,eAAO,MAAM,SAAS,oYAeyB,CAAA;AAE/C,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpE,KAAK,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAA;AAc/C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,eAAe,CAAU,CAAA;AAE/D,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,CAAY,CAAA;AAEtE,8EAA8E;AAC9E,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,cAAc,CAAQ,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { aurora, brutalist, calm, classic, clay, darkGlass, liquidGlass, lux, morph, neon, paper, sketchy, slate, soft, } from './themes/index.js';
2
+ /**
3
+ * Every theme in the package, in the order a picker should show them:
4
+ * the everyday ones first, then the niche ones.
5
+ */
6
+ export const themeList = [
7
+ classic,
8
+ paper,
9
+ slate,
10
+ calm,
11
+ lux,
12
+ soft,
13
+ clay,
14
+ morph,
15
+ sketchy,
16
+ brutalist,
17
+ liquidGlass,
18
+ darkGlass,
19
+ aurora,
20
+ neon,
21
+ ];
22
+ const themes = {};
23
+ const defaults = {};
24
+ const meta = {};
25
+ for (const theme of themeList) {
26
+ const name = theme.name;
27
+ themes[name] = theme.theme;
28
+ defaults[name] = theme.defaults;
29
+ meta[name] = theme.meta;
30
+ }
31
+ /** Ready for `createVuetify({ theme: { themes: vuetiwatchThemes } })`. */
32
+ export const vuetiwatchThemes = themes;
33
+ /** Per-theme component defaults, applied for you by `createVuetiwatch()`. */
34
+ export const vuetiwatchDefaults = defaults;
35
+ /** Titles, descriptions and preview swatches, for building a theme picker. */
36
+ export const vuetiwatchMeta = meta;
37
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,MAAM,EACN,SAAS,EACT,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,EACT,WAAW,EACX,GAAG,EACH,KAAK,EACL,IAAI,EACJ,KAAK,EACL,OAAO,EACP,KAAK,EACL,IAAI,GACL,MAAM,mBAAmB,CAAA;AAE1B;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO;IACP,KAAK;IACL,KAAK;IACL,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,OAAO;IACP,SAAS;IACT,WAAW;IACX,SAAS;IACT,MAAM;IACN,IAAI;CACyC,CAAA;AAM/C,MAAM,MAAM,GAAG,EAA6B,CAAA;AAC5C,MAAM,QAAQ,GAAG,EAAgC,CAAA;AACjD,MAAM,IAAI,GAAG,EAA4B,CAAA;AAEzC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAA2B,CAAA;IAE9C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAA;IAC1B,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAA;IAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAA;AACzB,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAA4B,MAAM,CAAA;AAE/D,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAA+B,QAAQ,CAAA;AAEtE,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAA2B,IAAI,CAAA"}
@@ -0,0 +1,74 @@
1
+ .v-theme--aurora.v-application {
2
+ background-image: radial-gradient(60rem 40rem at 15% -10%, #7c5cff29, #0000 60%), radial-gradient(50rem 35rem at 95% 5%, #00d4ff1f, #0000 60%);
3
+ background-attachment: fixed;
4
+ }
5
+
6
+ .v-theme--aurora .v-card.v-card--variant-elevated {
7
+ background-image: radial-gradient(36rem 18rem at 0 0, #7c5cff24, #0000 70%);
8
+ box-shadow: 0 12px 40px #0000008c;
9
+ }
10
+
11
+ .v-theme--aurora :is(.v-card, .v-alert):after {
12
+ content: "";
13
+ border-radius: inherit;
14
+ padding: var(--v-vw-border-width);
15
+ background: var(--v-vw-gradient);
16
+ opacity: .45;
17
+ pointer-events: none;
18
+ position: absolute;
19
+ inset: 0;
20
+ -webkit-mask-image: linear-gradient(#000 0 0), linear-gradient(#000 0 0);
21
+ mask-image: linear-gradient(#000 0 0), linear-gradient(#000 0 0);
22
+ -webkit-mask-position: 0 0, 0 0;
23
+ mask-position: 0 0, 0 0;
24
+ -webkit-mask-size: auto, auto;
25
+ mask-size: auto, auto;
26
+ -webkit-mask-repeat: repeat, repeat;
27
+ mask-repeat: repeat, repeat;
28
+ -webkit-mask-clip: content-box, border-box;
29
+ mask-clip: content-box, border-box;
30
+ -webkit-mask-origin: content-box, border-box;
31
+ mask-origin: content-box, border-box;
32
+ -webkit-mask-composite: xor;
33
+ mask-composite: exclude;
34
+ -webkit-mask-source-type: auto, auto;
35
+ mask-mode: match-source, match-source;
36
+ }
37
+
38
+ .v-theme--aurora .v-btn.v-btn--variant-flat.bg-primary {
39
+ background-image: var(--v-vw-gradient);
40
+ box-shadow: 0 6px 24px #7c5cff73;
41
+ }
42
+
43
+ .v-theme--aurora .v-btn.v-btn--variant-flat.bg-primary .v-btn__overlay {
44
+ opacity: 0;
45
+ }
46
+
47
+ .v-theme--aurora .v-tab__slider {
48
+ background: var(--v-vw-gradient);
49
+ box-shadow: 0 0 16px #7c5cffcc;
50
+ }
51
+
52
+ .v-theme--aurora .v-slider-track__fill {
53
+ background: var(--v-vw-gradient);
54
+ }
55
+
56
+ .v-theme--aurora .v-slider-thumb__surface {
57
+ box-shadow: 0 0 0 6px #7c5cff2e, 0 0 16px #7c5cff99;
58
+ }
59
+
60
+ .v-theme--aurora .v-selection-control--dirty .v-switch__track {
61
+ background-image: var(--v-vw-gradient);
62
+ box-shadow: 0 0 14px #7c5cff80;
63
+ }
64
+
65
+ .v-theme--aurora :is(.v-menu, .v-dialog) > .v-overlay__content {
66
+ box-shadow: 0 0 0 1px #9b8cff29, 0 24px 64px #000000b3;
67
+ }
68
+
69
+ .v-theme--aurora [class*="-display-"] {
70
+ background: var(--v-vw-gradient);
71
+ color: #0000;
72
+ -webkit-background-clip: text;
73
+ background-clip: text;
74
+ }
@@ -0,0 +1 @@
1
+ .v-theme--aurora.v-application{background-image:radial-gradient(60rem 40rem at 15% -10%,#7c5cff29,#0000 60%),radial-gradient(50rem 35rem at 95% 5%,#00d4ff1f,#0000 60%);background-attachment:fixed}.v-theme--aurora .v-card.v-card--variant-elevated{background-image:radial-gradient(36rem 18rem at 0 0,#7c5cff24,#0000 70%);box-shadow:0 12px 40px #0000008c}.v-theme--aurora :is(.v-card,.v-alert):after{content:"";border-radius:inherit;padding:var(--v-vw-border-width);background:var(--v-vw-gradient);opacity:.45;pointer-events:none;-webkit-mask-composite:xor;-webkit-mask-source-type:auto,auto;position:absolute;inset:0;-webkit-mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.v-theme--aurora .v-btn.v-btn--variant-flat.bg-primary{background-image:var(--v-vw-gradient);box-shadow:0 6px 24px #7c5cff73}.v-theme--aurora .v-btn.v-btn--variant-flat.bg-primary .v-btn__overlay{opacity:0}.v-theme--aurora .v-tab__slider{background:var(--v-vw-gradient);box-shadow:0 0 16px #7c5cffcc}.v-theme--aurora .v-slider-track__fill{background:var(--v-vw-gradient)}.v-theme--aurora .v-slider-thumb__surface{box-shadow:0 0 0 6px #7c5cff2e,0 0 16px #7c5cff99}.v-theme--aurora .v-selection-control--dirty .v-switch__track{background-image:var(--v-vw-gradient);box-shadow:0 0 14px #7c5cff80}.v-theme--aurora :is(.v-menu,.v-dialog)>.v-overlay__content{box-shadow:0 0 0 1px #9b8cff29,0 24px 64px #000000b3}.v-theme--aurora [class*=-display-]{background:var(--v-vw-gradient);color:#0000;-webkit-background-clip:text;background-clip:text}
@@ -0,0 +1,48 @@
1
+ .v-theme--brutalist {
2
+ --vw-brut-offset: 4px;
3
+ }
4
+
5
+ .v-theme--brutalist :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) {
6
+ box-shadow: var(--vw-brut-offset) var(--vw-brut-offset) 0 rgb(var(--v-shadow-color));
7
+ }
8
+
9
+ .v-theme--brutalist :is(.v-btn, .v-chip, .v-btn-group):not(.v-btn--variant-text, .v-btn--variant-plain):not(.v-btn--disabled, .v-btn-group *) {
10
+ border: var(--v-vw-border-width) solid rgb(var(--v-shadow-color));
11
+ transition: transform 80ms steps(2, end), box-shadow 80ms steps(2, end);
12
+ }
13
+
14
+ .v-theme--brutalist .v-btn:active:not(.v-btn--disabled) {
15
+ transform: translate(var(--vw-brut-offset), var(--vw-brut-offset));
16
+ box-shadow: 0 0 0 rgb(var(--v-shadow-color));
17
+ }
18
+
19
+ .v-theme--brutalist .v-btn:not(.v-btn--variant-text, .v-btn--variant-plain):hover:not(.v-btn--disabled, .v-btn-group *) {
20
+ box-shadow: 5px 5px 0 rgb(var(--v-shadow-color));
21
+ transform: translate(-1px, -1px);
22
+ }
23
+
24
+ .v-theme--brutalist :is(.v-menu, .v-dialog) > .v-overlay__content {
25
+ border: var(--v-vw-border-width) solid rgb(var(--v-shadow-color));
26
+ box-shadow: 8px 8px 0 rgb(var(--v-shadow-color));
27
+ }
28
+
29
+ .v-theme--brutalist :is(.v-table thead th, .v-data-table__th) {
30
+ background-color: rgb(var(--v-theme-secondary));
31
+ border-bottom: var(--v-vw-border-width) solid rgb(var(--v-shadow-color));
32
+ text-transform: uppercase;
33
+ font-weight: 700;
34
+ }
35
+
36
+ .v-theme--brutalist .v-expansion-panels {
37
+ border: var(--v-vw-border-width) solid rgb(var(--v-shadow-color));
38
+ }
39
+
40
+ @media (prefers-reduced-motion: reduce) {
41
+ .v-theme--brutalist .v-btn {
42
+ transition: none;
43
+ }
44
+
45
+ .v-theme--brutalist .v-btn:hover:not(.v-btn--disabled) {
46
+ transform: none;
47
+ }
48
+ }
@@ -0,0 +1 @@
1
+ .v-theme--brutalist{--vw-brut-offset:4px}.v-theme--brutalist :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){box-shadow:var(--vw-brut-offset) var(--vw-brut-offset) 0 rgb(var(--v-shadow-color))}.v-theme--brutalist :is(.v-btn,.v-chip,.v-btn-group):not(.v-btn--variant-text,.v-btn--variant-plain):not(.v-btn--disabled,.v-btn-group *){border:var(--v-vw-border-width) solid rgb(var(--v-shadow-color));transition:transform 80ms steps(2,end),box-shadow 80ms steps(2,end)}.v-theme--brutalist .v-btn:active:not(.v-btn--disabled){transform:translate(var(--vw-brut-offset), var(--vw-brut-offset));box-shadow:0 0 0 rgb(var(--v-shadow-color))}.v-theme--brutalist .v-btn:not(.v-btn--variant-text,.v-btn--variant-plain):hover:not(.v-btn--disabled,.v-btn-group *){box-shadow:5px 5px 0 rgb(var(--v-shadow-color));transform:translate(-1px,-1px)}.v-theme--brutalist :is(.v-menu,.v-dialog)>.v-overlay__content{border:var(--v-vw-border-width) solid rgb(var(--v-shadow-color));box-shadow:8px 8px 0 rgb(var(--v-shadow-color))}.v-theme--brutalist :is(.v-table thead th,.v-data-table__th){background-color:rgb(var(--v-theme-secondary));border-bottom:var(--v-vw-border-width) solid rgb(var(--v-shadow-color));text-transform:uppercase;font-weight:700}.v-theme--brutalist .v-expansion-panels{border:var(--v-vw-border-width) solid rgb(var(--v-shadow-color))}@media (prefers-reduced-motion:reduce){.v-theme--brutalist .v-btn{transition:none}.v-theme--brutalist .v-btn:hover:not(.v-btn--disabled){transform:none}}
@@ -0,0 +1,21 @@
1
+ .v-theme--calm :is(.v-card, .v-sheet, .v-table, .v-list, .v-expansion-panels) {
2
+ box-shadow: none;
3
+ }
4
+
5
+ .v-theme--calm .v-card.v-card--variant-flat {
6
+ background-color: rgb(var(--v-theme-surface));
7
+ }
8
+
9
+ .v-theme--calm :is(.v-menu, .v-dialog) > .v-overlay__content {
10
+ border: var(--v-vw-border-width) solid rgba(var(--v-border-color), .09);
11
+ box-shadow: 0 16px 48px #3a3a360f;
12
+ }
13
+
14
+ .v-theme--calm :is(.v-table thead th, .v-data-table__th) {
15
+ border-bottom: var(--v-vw-border-width) solid rgba(var(--v-border-color), .09);
16
+ font-weight: 500;
17
+ }
18
+
19
+ .v-theme--calm .v-card-text {
20
+ line-height: 1.7;
21
+ }
@@ -0,0 +1 @@
1
+ .v-theme--calm :is(.v-card,.v-sheet,.v-table,.v-list,.v-expansion-panels){box-shadow:none}.v-theme--calm .v-card.v-card--variant-flat{background-color:rgb(var(--v-theme-surface))}.v-theme--calm :is(.v-menu,.v-dialog)>.v-overlay__content{border:var(--v-vw-border-width) solid rgba(var(--v-border-color), .09);box-shadow:0 16px 48px #3a3a360f}.v-theme--calm :is(.v-table thead th,.v-data-table__th){border-bottom:var(--v-vw-border-width) solid rgba(var(--v-border-color), .09);font-weight:500}.v-theme--calm .v-card-text{line-height:1.7}
@@ -0,0 +1,44 @@
1
+ .v-theme--clay {
2
+ --vw-clay-lift: 8px 8px 20px rgba(var(--v-shadow-color), .18),
3
+ -6px -6px 16px #ffffffe6,
4
+ inset -4px -4px 12px rgba(var(--v-shadow-color), .06),
5
+ inset 4px 4px 10px #ffffffb3;
6
+ }
7
+
8
+ .v-theme--clay :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) {
9
+ box-shadow: var(--vw-clay-lift);
10
+ }
11
+
12
+ .v-theme--clay :is(.v-chip, .v-btn--size-small, .v-btn--size-x-small):not(.v-btn--variant-text, .v-btn--variant-plain) {
13
+ box-shadow: 3px 3px 7px rgba(var(--v-shadow-color), .13),
14
+ -2px -2px 5px #fff9;
15
+ }
16
+
17
+ .v-theme--clay .v-btn:active:not(.v-btn--disabled) {
18
+ box-shadow: 4px 4px 10px rgba(var(--v-shadow-color), .16),
19
+ inset -3px -3px 10px rgba(var(--v-shadow-color), .1),
20
+ inset 3px 3px 8px #fff9;
21
+ }
22
+
23
+ .v-theme--clay .v-field.v-field--variant-solo {
24
+ background: rgb(var(--v-theme-surface));
25
+ box-shadow: inset 4px 4px 10px rgba(var(--v-shadow-color), .12),
26
+ inset -4px -4px 10px #ffffffe6;
27
+ }
28
+
29
+ .v-theme--clay :is(.v-switch__track, .v-slider-track) {
30
+ box-shadow: inset 2px 2px 6px rgba(var(--v-shadow-color), .18);
31
+ }
32
+
33
+ .v-theme--clay :is(.v-switch__thumb, .v-slider-thumb__surface) {
34
+ box-shadow: 3px 3px 8px rgba(var(--v-shadow-color), .24),
35
+ -2px -2px 6px #ffffffe6;
36
+ }
37
+
38
+ .v-theme--clay :is(.v-menu, .v-dialog) > .v-overlay__content {
39
+ box-shadow: 12px 12px 40px rgba(var(--v-shadow-color), .24);
40
+ }
41
+
42
+ .v-theme--clay .v-tab__slider {
43
+ border-radius: 5px;
44
+ }