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
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Slate — dashboard chrome. Cards are outlined rather than raised, table
3
+ * headers get a tinted band, and the only real shadow left is on overlays.
4
+ */
5
+ .v-theme--slate {
6
+ & .v-card.v-card--variant-outlined {
7
+ box-shadow: 0 1px 2px rgba(var(--v-shadow-color), 0.05);
8
+ }
9
+
10
+ & :is(.v-table thead th, .v-data-table__th) {
11
+ background-color: rgb(var(--v-theme-surface-light));
12
+ font-weight: 600;
13
+ }
14
+
15
+ & :is(.v-menu, .v-dialog) > .v-overlay__content {
16
+ box-shadow: 0 8px 24px rgba(var(--v-shadow-color), 0.16);
17
+ }
18
+
19
+ & .v-app-bar {
20
+ box-shadow: none;
21
+ }
22
+
23
+
24
+
25
+
26
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Soft — diffuse, tinted shadows instead of Material's grey elevation, and
3
+ * a lift on hover so cards feel physical rather than printed.
4
+ */
5
+ .v-theme--soft {
6
+ & .v-card.v-card--variant-elevated {
7
+ box-shadow:
8
+ 0 2px 4px rgba(var(--v-theme-primary), 0.06),
9
+ 0 12px 28px rgba(var(--v-theme-primary), 0.1);
10
+ transition: box-shadow 0.25s ease, transform 0.25s ease;
11
+ }
12
+
13
+ & .v-card.v-card--variant-elevated.v-card--link:hover {
14
+ box-shadow:
15
+ 0 4px 8px rgba(var(--v-theme-primary), 0.08),
16
+ 0 20px 40px rgba(var(--v-theme-primary), 0.14);
17
+ transform: translateY(-2px);
18
+ }
19
+
20
+ & .v-btn.v-btn--variant-flat:not(.v-btn--disabled) {
21
+ box-shadow: 0 2px 8px rgba(var(--v-theme-primary), 0.24);
22
+ }
23
+
24
+ & :is(.v-menu, .v-dialog) > .v-overlay__content {
25
+ box-shadow: 0 16px 48px rgba(var(--v-theme-primary), 0.18);
26
+ }
27
+
28
+ /**
29
+ * `solo-filled` paints itself `surface`, which sits a couple of percent
30
+ * from this theme's `background`. Without the shadow the field has no
31
+ * edge at all, so it keeps one — in the theme's own tint.
32
+ */
33
+ & .v-field.v-field--variant-solo-filled {
34
+ box-shadow:
35
+ 0 1px 2px rgba(var(--v-theme-primary), 0.08),
36
+ 0 4px 12px rgba(var(--v-theme-primary), 0.06);
37
+ }
38
+
39
+ /* Controls get the same tinted lift as the cards. */
40
+ & .v-slider-thumb__surface {
41
+ box-shadow: 0 2px 8px rgba(var(--v-theme-primary), 0.35);
42
+ }
43
+
44
+ & .v-switch__thumb {
45
+ box-shadow: 0 2px 6px rgba(var(--v-theme-primary), 0.3);
46
+ }
47
+
48
+ /* `VTabs` runs inset here, so the pill behind the active tab is the
49
+ indicator — the underline would be a second one. */
50
+ & .v-tabs--inset .v-tab__slider {
51
+ box-shadow: 0 2px 10px rgba(var(--v-theme-primary), 0.2);
52
+ }
53
+ }
54
+
55
+ @media (prefers-reduced-motion: reduce) {
56
+ .v-theme--soft .v-card.v-card--variant-elevated {
57
+ transition: none;
58
+ }
59
+
60
+ .v-theme--soft .v-card.v-card--variant-elevated.v-card--link:hover {
61
+ transform: none;
62
+ }
63
+ }
@@ -0,0 +1,86 @@
1
+ import { bars, fields, icons } from '../util/defaults.js'
2
+ import { defineTheme } from '../util/defineTheme.js'
3
+
4
+ /**
5
+ * The showcase theme: the visual language current AI products landed on —
6
+ * near-black ground, iridescent gradients, light instead of shadow.
7
+ *
8
+ * It is deliberately the loudest theme in the set. Where `neon` is flat and
9
+ * shouting, this one is layered and lit: gradients rather than solid
10
+ * accents, rims rather than borders, glow rather than elevation.
11
+ */
12
+ export const aurora = defineTheme({
13
+ name: 'aurora',
14
+ meta: {
15
+ title: 'Aurora',
16
+ description: 'Iridescent gradients on near-black. Built to be looked at — the showcase theme.',
17
+ dark: true,
18
+ iconStyle: 'filled',
19
+ swatch: ['#08080C', '#101018', '#7C5CFF', '#00D4FF'],
20
+ fonts: ['Inter'],
21
+ },
22
+ theme: {
23
+ dark: true,
24
+ colors: {
25
+ background: '#08080C',
26
+ surface: '#101018',
27
+ 'surface-bright': '#1B1B28',
28
+ 'surface-light': '#16161F',
29
+ 'surface-variant': '#C9C6E0',
30
+ 'on-surface-variant': '#08080C',
31
+ primary: '#7C5CFF',
32
+ 'primary-darken-1': '#5F3FE0',
33
+ secondary: '#00D4FF',
34
+ 'secondary-darken-1': '#00A8CC',
35
+ error: '#FF5C7A',
36
+ info: '#00D4FF',
37
+ success: '#3DDC97',
38
+ warning: '#FFB86B',
39
+ 'on-surface': '#E8E6F5',
40
+ 'on-background': '#F0EEFA',
41
+ 'on-secondary': '#04121A',
42
+ 'on-success': '#04140D',
43
+ 'on-warning': '#1A1004',
44
+ },
45
+ variables: {
46
+ 'border-color': '#9B8CFF',
47
+ 'border-opacity': 0.14,
48
+ 'shadow-color': '#000000',
49
+ 'high-emphasis-opacity': 0.96,
50
+ 'medium-emphasis-opacity': 0.68,
51
+ 'hover-opacity': 0.08,
52
+ 'font-body': "'Inter', system-ui, sans-serif",
53
+ 'vw-radius': '12px',
54
+ 'vw-radius-lg': '18px',
55
+ 'vw-radius-chip': '999px',
56
+ 'vw-border-width': '1px',
57
+ 'vw-btn-transform': 'none',
58
+ 'vw-btn-tracking': '0.01em',
59
+ 'vw-btn-weight': '600',
60
+ 'vw-tab-slider-height': '3px',
61
+ // Shared by every gradient below, so a derived theme restyles the
62
+ // whole surface language by overriding one value.
63
+ 'vw-gradient': 'linear-gradient(135deg, #7C5CFF 0%, #00D4FF 55%, #FF5CAA 100%)',
64
+ },
65
+ },
66
+ defaults: [
67
+ {
68
+ VBtn: { variant: 'flat' },
69
+ VCard: { variant: 'elevated', elevation: 0 },
70
+ VAlert: { variant: 'tonal' },
71
+ VChip: { variant: 'tonal' },
72
+ VSwitch: { inset: true },
73
+ VSlider: { thumbSize: 18, trackSize: 4 },
74
+ },
75
+ fields({ variant: 'solo-filled', flat: true }),
76
+ bars({ flat: true }),
77
+ icons({
78
+ dropdown: 'mdi-chevron-down',
79
+ collapse: 'mdi-chevron-up',
80
+ checkboxOn: 'mdi-check-circle',
81
+ checkboxOff: 'mdi-circle-outline',
82
+ ratingFull: 'mdi-star',
83
+ ratingEmpty: 'mdi-star-outline',
84
+ }),
85
+ ],
86
+ })
@@ -0,0 +1,103 @@
1
+ import { bars, fields, icons } from '../util/defaults.js'
2
+ import { defineTheme } from '../util/defineTheme.js'
3
+
4
+ /**
5
+ * Neobrutalism: thick black rules, an acid accent, and a hard offset shadow
6
+ * with no blur at all — the shadow is a second shape, not a light effect.
7
+ * Nothing is rounded and nothing is subtle.
8
+ *
9
+ * Not to be confused with `paper`, which is also flat and bordered but
10
+ * hairline-thin and quiet; this one is the same idea shouted.
11
+ */
12
+ export const brutalist = defineTheme({
13
+ name: 'brutalist',
14
+ meta: {
15
+ title: 'Brutalist',
16
+ description: 'Thick black rules, acid lime and hard unblurred shadows. Loud on purpose.',
17
+ dark: false,
18
+ iconStyle: 'filled',
19
+ swatch: ['#FFFDF0', '#FFFFFF', '#0A0A0A', '#C4F82A'],
20
+ fonts: ['Space Grotesk'],
21
+ },
22
+ theme: {
23
+ dark: false,
24
+ colors: {
25
+ background: '#FFFDF0',
26
+ surface: '#FFFFFF',
27
+ 'surface-bright': '#FFFFFF',
28
+ 'surface-light': '#F3EFDC',
29
+ 'surface-variant': '#0A0A0A',
30
+ 'on-surface-variant': '#FFFDF0',
31
+ primary: '#0A0A0A',
32
+ 'primary-darken-1': '#000000',
33
+ secondary: '#C4F82A',
34
+ 'secondary-darken-1': '#A5D617',
35
+ error: '#FF4D3D',
36
+ info: '#3D7BFF',
37
+ success: '#00C853',
38
+ warning: '#FFB300',
39
+ 'on-surface': '#0A0A0A',
40
+ 'on-background': '#0A0A0A',
41
+ 'on-secondary': '#0A0A0A',
42
+ 'on-warning': '#0A0A0A',
43
+ 'on-success': '#0A0A0A',
44
+ },
45
+ variables: {
46
+ 'border-color': '#0A0A0A',
47
+ 'border-opacity': 1,
48
+ 'shadow-color': '#0A0A0A',
49
+ 'high-emphasis-opacity': 1,
50
+ 'medium-emphasis-opacity': 0.75,
51
+ 'hover-opacity': 0.08,
52
+ 'font-body': "'Space Grotesk', 'Arial Black', system-ui, sans-serif",
53
+ 'vw-radius': '0px',
54
+ 'vw-radius-lg': '0px',
55
+ 'vw-radius-thumb': '0px',
56
+ 'vw-radius-chip': '0px',
57
+ 'vw-border-width': '3px',
58
+ 'vw-btn-transform': 'uppercase',
59
+ 'vw-btn-tracking': '0.04em',
60
+ 'vw-btn-weight': '700',
61
+ // Lime marks the current page: darkening it would sink the number
62
+ // into its own highlight.
63
+ 'vw-pagination-active-color': 'rgb(var(--v-theme-secondary))',
64
+ 'vw-pagination-active-opacity': '1',
65
+ 'vw-heading-weight': '700',
66
+ 'vw-heading-tracking': '-0.02em',
67
+ 'vw-tab-slider-height': '4px',
68
+ },
69
+ },
70
+ defaults: [
71
+ {
72
+ VBtn: { variant: 'flat' },
73
+ VCard: { variant: 'outlined' },
74
+ VAlert: { variant: 'outlined' },
75
+ VChip: { variant: 'outlined' },
76
+ VSheet: { border: true },
77
+ VNavigationDrawer: { border: 'e' },
78
+ VSwitch: { inset: 'square' },
79
+ // Lime is this theme's "active" colour — it already marks the table
80
+ // heads and the current page, so the slider joins them.
81
+ VSlider: { thumbSize: 18, trackSize: 6, color: 'secondary' },
82
+ VRangeSlider: { color: 'secondary' },
83
+ },
84
+ fields({ variant: 'outlined' }),
85
+ bars({ flat: true, border: 'b' }),
86
+ icons({
87
+ // Solid and blunt: filled boxes, bold arrows, a thick cross.
88
+ dropdown: 'mdi-menu-down',
89
+ collapse: 'mdi-menu-up',
90
+ next: 'mdi-arrow-right-bold',
91
+ prev: 'mdi-arrow-left-bold',
92
+ first: 'mdi-page-first',
93
+ last: 'mdi-page-last',
94
+ checkboxOn: 'mdi-checkbox-marked',
95
+ checkboxOff: 'mdi-checkbox-blank-outline',
96
+ ratingFull: 'mdi-star',
97
+ ratingEmpty: 'mdi-star-outline',
98
+ sortAsc: 'mdi-menu-up',
99
+ sortDesc: 'mdi-menu-down',
100
+ close: 'mdi-close-thick',
101
+ }),
102
+ ],
103
+ })
@@ -0,0 +1,88 @@
1
+ import { bars, controls, fields, icons, tables } from '../util/defaults.js'
2
+ import { defineTheme } from '../util/defineTheme.js'
3
+
4
+ /**
5
+ * The counter-trend: an interface that does not compete for attention.
6
+ * Desaturated naturals, contrast held deliberately low, no shadows and no
7
+ * fills — separation comes from space, and colour is spent only on things
8
+ * you can act on.
9
+ *
10
+ * The discipline is subtractive, so resist adding accents here; every one
11
+ * of them costs the theme its point.
12
+ */
13
+ export const calm = defineTheme({
14
+ name: 'calm',
15
+ meta: {
16
+ title: 'Calm',
17
+ description: 'Low contrast, desaturated naturals and a lot of air. Nothing competes for attention.',
18
+ dark: false,
19
+ iconStyle: 'outline',
20
+ swatch: ['#FAFAF7', '#FFFFFF', '#6B7A6B', '#A89684'],
21
+ fonts: ['Inter'],
22
+ },
23
+ theme: {
24
+ dark: false,
25
+ colors: {
26
+ background: '#FAFAF7',
27
+ surface: '#FFFFFF',
28
+ 'surface-bright': '#FFFFFF',
29
+ 'surface-light': '#F2F1EC',
30
+ 'surface-variant': '#4A4A44',
31
+ 'on-surface-variant': '#FAFAF7',
32
+ primary: '#6B7A6B',
33
+ 'primary-darken-1': '#556355',
34
+ secondary: '#A89684',
35
+ 'secondary-darken-1': '#8B7A69',
36
+ error: '#A86B63',
37
+ info: '#6B7A8A',
38
+ success: '#6B8A6B',
39
+ warning: '#A89464',
40
+ 'on-surface': '#3A3A36',
41
+ 'on-background': '#3A3A36',
42
+ },
43
+ variables: {
44
+ 'border-color': '#3A3A36',
45
+ 'border-opacity': 0.09,
46
+ 'high-emphasis-opacity': 0.78,
47
+ 'medium-emphasis-opacity': 0.5,
48
+ 'hover-opacity': 0.03,
49
+ 'font-body': "'Inter', system-ui, sans-serif",
50
+ 'vw-radius': '8px',
51
+ 'vw-radius-lg': '12px',
52
+ 'vw-radius-chip': '8px',
53
+ 'vw-border-width': '1px',
54
+ 'vw-btn-transform': 'none',
55
+ 'vw-btn-tracking': '0.01em',
56
+ 'vw-btn-weight': '500',
57
+ 'vw-heading-weight': '500',
58
+ 'vw-heading-tracking': '-0.01em',
59
+ 'vw-tab-slider-height': '2px',
60
+ },
61
+ },
62
+ defaults: [
63
+ {
64
+ VBtn: { variant: 'text' },
65
+ VCard: { variant: 'flat' },
66
+ VAlert: { variant: 'text' },
67
+ VChip: { variant: 'text' },
68
+ VNavigationDrawer: { border: 'e' },
69
+ VSwitch: { inset: true },
70
+ VSlider: { thumbSize: 14, trackSize: 2 },
71
+ },
72
+ fields({ variant: 'underlined' }),
73
+ controls({ density: 'comfortable' }),
74
+ tables('comfortable'),
75
+ bars({ flat: true }),
76
+ icons({
77
+ // Hollow throughout, and the rating is dots rather than stars: a row
78
+ // of filled stars is the loudest thing a quiet page could carry.
79
+ dropdown: 'mdi-chevron-down',
80
+ collapse: 'mdi-chevron-up',
81
+ checkboxOn: 'mdi-check-circle-outline',
82
+ checkboxOff: 'mdi-circle-outline',
83
+ ratingFull: 'mdi-circle',
84
+ ratingEmpty: 'mdi-circle-outline',
85
+ close: 'mdi-close',
86
+ }),
87
+ ],
88
+ })
@@ -0,0 +1,23 @@
1
+ import { defineTheme } from '../util/defineTheme.js'
2
+
3
+ /**
4
+ * Stock Vuetify, untouched. The reference point every other theme is a
5
+ * departure from — and the safe choice when you want Material Design.
6
+ */
7
+ export const classic = defineTheme({
8
+ name: 'classic',
9
+ meta: {
10
+ title: 'Classic',
11
+ description: 'Vuetify as it ships. Material Design, Roboto, familiar elevation.',
12
+ dark: false,
13
+ iconStyle: 'filled',
14
+ swatch: ['#FFFFFF', '#EEEEEE', '#1867C0', '#48A9A6'],
15
+ fonts: ['Roboto'],
16
+ },
17
+ theme: {
18
+ dark: false,
19
+ variables: {
20
+ 'font-body': "'Roboto', system-ui, sans-serif",
21
+ },
22
+ },
23
+ })
@@ -0,0 +1,80 @@
1
+ import { bars, fields, icons } from '../util/defaults.js'
2
+ import { defineTheme } from '../util/defineTheme.js'
3
+
4
+ /**
5
+ * Claymorphism — neumorphism's louder descendant. Where `morph` hides its
6
+ * surfaces in the background, this one lifts bright white shapes off a
7
+ * saturated ground and gives them three shadows: an outer drop, a light
8
+ * rim, and an inner one that makes them look inflated rather than cut out.
9
+ */
10
+ export const clay = defineTheme({
11
+ name: 'clay',
12
+ meta: {
13
+ title: 'Clay',
14
+ description: 'Inflated pastel shapes with a triple shadow. Tactile and toy-like.',
15
+ dark: false,
16
+ iconStyle: 'filled',
17
+ swatch: ['#EDE7FF', '#FFFFFF', '#6C5CE7', '#FF7BA9'],
18
+ fonts: ['Quicksand'],
19
+ },
20
+ theme: {
21
+ dark: false,
22
+ colors: {
23
+ background: '#EDE7FF',
24
+ surface: '#FFFFFF',
25
+ 'surface-bright': '#FFFFFF',
26
+ 'surface-light': '#E1D8FF',
27
+ 'surface-variant': '#3D3355',
28
+ 'on-surface-variant': '#EDE7FF',
29
+ primary: '#6C5CE7',
30
+ 'primary-darken-1': '#5546C4',
31
+ secondary: '#FF7BA9',
32
+ 'secondary-darken-1': '#E05A8A',
33
+ error: '#FF6B6B',
34
+ info: '#4EC5F1',
35
+ success: '#2ECC71',
36
+ warning: '#FDCB6E',
37
+ 'on-surface': '#3D3355',
38
+ 'on-background': '#3D3355',
39
+ 'on-warning': '#3D2E00',
40
+ },
41
+ variables: {
42
+ 'border-color': '#6C5CE7',
43
+ 'border-opacity': 0.001,
44
+ 'shadow-color': '#5A46B0',
45
+ 'high-emphasis-opacity': 0.9,
46
+ 'medium-emphasis-opacity': 0.62,
47
+ 'hover-opacity': 0.05,
48
+ 'font-body': "'Quicksand', 'Nunito', system-ui, sans-serif",
49
+ 'vw-radius': '20px',
50
+ 'vw-radius-lg': '28px',
51
+ 'vw-radius-chip': '999px',
52
+ 'vw-border-width': '0px',
53
+ 'vw-btn-transform': 'none',
54
+ 'vw-btn-tracking': '0',
55
+ 'vw-btn-weight': '700',
56
+ 'vw-tab-slider-height': '5px',
57
+ },
58
+ },
59
+ defaults: [
60
+ {
61
+ VBtn: { variant: 'flat', size: 'large' },
62
+ VCard: { variant: 'flat' },
63
+ VAlert: { variant: 'flat' },
64
+ VChip: { variant: 'flat' },
65
+ VSwitch: { inset: true },
66
+ VSlider: { thumbSize: 24, trackSize: 10 },
67
+ },
68
+ fields({ variant: 'solo', flat: true }),
69
+ bars({ flat: true }),
70
+ icons({
71
+ dropdown: 'mdi-chevron-down',
72
+ collapse: 'mdi-chevron-up',
73
+ checkboxOn: 'mdi-check-circle',
74
+ checkboxOff: 'mdi-circle-outline',
75
+ ratingFull: 'mdi-star',
76
+ ratingEmpty: 'mdi-star-outline',
77
+ close: 'mdi-close-circle',
78
+ }),
79
+ ],
80
+ })
@@ -0,0 +1,77 @@
1
+ import { bars, fields, icons } from '../util/defaults.js'
2
+ import { defineTheme } from '../util/defineTheme.js'
3
+
4
+ /**
5
+ * Translucent dark surfaces over a deep violet ground, with backdrop blur
6
+ * and a hairline top highlight. Needs a busy background behind `v-app`
7
+ * to really sing.
8
+ */
9
+ export const darkGlass = defineTheme({
10
+ name: 'darkGlass',
11
+ meta: {
12
+ title: 'Dark Glass',
13
+ description: 'Frosted translucent surfaces on a deep violet ground.',
14
+ dark: true,
15
+ iconStyle: 'filled',
16
+ swatch: ['#0E0B18', '#191428', '#7C4DFF', '#4FC3F7'],
17
+ fonts: ['Inter'],
18
+ },
19
+ theme: {
20
+ dark: true,
21
+ colors: {
22
+ background: '#0E0B18',
23
+ surface: '#191428',
24
+ 'surface-bright': '#2A2340',
25
+ 'surface-light': '#241D38',
26
+ 'surface-variant': '#C6BEDE',
27
+ 'on-surface-variant': '#14101F',
28
+ primary: '#7C4DFF',
29
+ 'primary-darken-1': '#5E35D6',
30
+ secondary: '#4FC3F7',
31
+ 'secondary-darken-1': '#2FA3D8',
32
+ error: '#FF5370',
33
+ info: '#4FC3F7',
34
+ success: '#00E676',
35
+ warning: '#FFB74D',
36
+ 'on-surface': '#ECE8F5',
37
+ 'on-background': '#F3F0FA',
38
+ },
39
+ variables: {
40
+ 'border-color': '#B9A9FF',
41
+ 'border-opacity': 0.16,
42
+ 'shadow-color': '#000000',
43
+ 'high-emphasis-opacity': 0.95,
44
+ 'medium-emphasis-opacity': 0.72,
45
+ 'hover-opacity': 0.08,
46
+ 'font-body': "'Inter', system-ui, sans-serif",
47
+ 'vw-radius': '12px',
48
+ 'vw-radius-lg': '18px',
49
+ 'vw-radius-chip': '999px',
50
+ 'vw-btn-transform': 'none',
51
+ 'vw-btn-tracking': '0.01em',
52
+ 'vw-btn-weight': '600',
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', flat: true }),
63
+ bars({ flat: true }),
64
+ {
65
+ VSwitch: { inset: true },
66
+ VSlider: { thumbSize: 18, trackSize: 4 },
67
+ },
68
+ icons({
69
+ dropdown: 'mdi-chevron-down',
70
+ collapse: 'mdi-chevron-up',
71
+ checkboxOn: 'mdi-check-circle',
72
+ checkboxOff: 'mdi-circle-outline',
73
+ ratingFull: 'mdi-star',
74
+ ratingEmpty: 'mdi-star-outline',
75
+ }),
76
+ ],
77
+ })
@@ -0,0 +1,14 @@
1
+ export { aurora } from './aurora.js'
2
+ export { brutalist } from './brutalist.js'
3
+ export { calm } from './calm.js'
4
+ export { classic } from './classic.js'
5
+ export { clay } from './clay.js'
6
+ export { darkGlass } from './darkGlass.js'
7
+ export { liquidGlass } from './liquidGlass.js'
8
+ export { lux } from './lux.js'
9
+ export { morph } from './morph.js'
10
+ export { neon } from './neon.js'
11
+ export { paper } from './paper.js'
12
+ export { sketchy } from './sketchy.js'
13
+ export { slate } from './slate.js'
14
+ export { soft } from './soft.js'
@@ -0,0 +1,111 @@
1
+ import { bars, controls, fields, icons, tables } from '../util/defaults.js'
2
+ import { defineTheme } from '../util/defineTheme.js'
3
+
4
+ /**
5
+ * Glass that refracts rather than merely blurs, after Apple's iOS 26
6
+ * language.
7
+ *
8
+ * Four things carry it, and dropping any one is what makes an imitation
9
+ * read as generic frosting:
10
+ *
11
+ * - Capsules. Every control is fully rounded; it is the shape cue people
12
+ * recognise before they register anything else.
13
+ * - SF. `-apple-system` comes first in the stack, so the theme renders in
14
+ * the real typeface on Apple hardware and falls back to Inter elsewhere.
15
+ * - Light-mode system colours. `#007AFF` and friends — the `#0A84FF` set
16
+ * belongs to dark mode and reads far too electric on a light ground.
17
+ * - A calm ground. The stylesheet washes `v-app` in two adjacent hues,
18
+ * because translucency over nothing is just grey, and translucency over
19
+ * a rainbow is a mess.
20
+ */
21
+ export const liquidGlass = defineTheme({
22
+ name: 'liquidGlass',
23
+ meta: {
24
+ title: 'Liquid Glass',
25
+ description: 'Capsule controls and refracting panes over a calm wash, after iOS 26.',
26
+ dark: false,
27
+ iconStyle: 'outline',
28
+ swatch: ['#F2F2F7', '#FFFFFF', '#007AFF', '#5856D6'],
29
+ fonts: ['Inter'],
30
+ },
31
+ theme: {
32
+ dark: false,
33
+ colors: {
34
+ // systemGroupedBackground over systemBackground, as iOS pairs them.
35
+ background: '#F2F2F7',
36
+ surface: '#FFFFFF',
37
+ 'surface-bright': '#FFFFFF',
38
+ 'surface-light': '#F7F7FA',
39
+ 'surface-variant': '#3A3A3C',
40
+ 'on-surface-variant': '#F2F2F7',
41
+ primary: '#007AFF',
42
+ 'primary-darken-1': '#0062CC',
43
+ secondary: '#5856D6',
44
+ 'secondary-darken-1': '#4341B5',
45
+ error: '#FF3B30',
46
+ info: '#007AFF',
47
+ success: '#34C759',
48
+ warning: '#FF9500',
49
+ 'on-surface': '#1C1C1E',
50
+ 'on-background': '#1C1C1E',
51
+ 'on-success': '#06140A',
52
+ 'on-warning': '#1A1004',
53
+ },
54
+ variables: {
55
+ 'border-color': '#3A3A3C',
56
+ // iOS separators are hairlines, not borders.
57
+ 'border-opacity': 0.1,
58
+ 'shadow-color': '#1B3A6B',
59
+ 'high-emphasis-opacity': 0.92,
60
+ 'medium-emphasis-opacity': 0.6,
61
+ 'hover-opacity': 0.04,
62
+ 'font-body': "-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', system-ui, sans-serif",
63
+ 'font-heading': "-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Inter', system-ui, sans-serif",
64
+ 'vw-radius': '12px',
65
+ // Capsule controls, but through the variable rather than the
66
+ // `rounded` prop — that would leak into button groups and split a
67
+ // segmented control back into separate pills.
68
+ 'vw-radius-btn': '999px',
69
+ 'vw-radius-lg': '22px',
70
+ 'vw-radius-chip': '999px',
71
+ 'vw-border-width': '1px',
72
+ 'vw-btn-transform': 'none',
73
+ 'vw-btn-tracking': '0',
74
+ 'vw-btn-weight': '590',
75
+ // Apple leaves links in the accent colour, unlined.
76
+ 'vw-link-decoration': 'none',
77
+ 'vw-heading-weight': '700',
78
+ 'vw-heading-tracking': '-0.022em',
79
+ },
80
+ },
81
+ defaults: [
82
+ {
83
+ VBtn: { variant: 'flat' },
84
+ VCard: { variant: 'elevated', elevation: 0 },
85
+ VAlert: { variant: 'tonal' },
86
+ VChip: { variant: 'tonal' },
87
+ VSwitch: { inset: true },
88
+ VSlider: { thumbSize: 22, trackSize: 6 },
89
+ },
90
+ fields({ variant: 'solo-filled', flat: true }),
91
+ controls({ density: 'comfortable' }),
92
+ tables('comfortable'),
93
+ bars({ flat: true }),
94
+ icons({
95
+ // Chevrons everywhere, as SF does, and the clear affordance is the
96
+ // filled circle iOS puts inside a field.
97
+ dropdown: 'mdi-chevron-down',
98
+ collapse: 'mdi-chevron-up',
99
+ next: 'mdi-chevron-right',
100
+ prev: 'mdi-chevron-left',
101
+ checkboxOn: 'mdi-check-circle',
102
+ checkboxOff: 'mdi-circle-outline',
103
+ ratingFull: 'mdi-star',
104
+ ratingEmpty: 'mdi-star-outline',
105
+ clear: 'mdi-close-circle',
106
+ close: 'mdi-close-circle',
107
+ sortAsc: 'mdi-chevron-up',
108
+ sortDesc: 'mdi-chevron-down',
109
+ }),
110
+ ],
111
+ })