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,88 @@
1
+ import { bars, fields, icons, surfaces } from '../util/defaults.js';
2
+ import { defineTheme } from '../util/defineTheme.js';
3
+ /**
4
+ * A hand-drawn look for mockups and wireframes, after Bootswatch's Sketchy.
5
+ *
6
+ * The whole effect rests on one trick: an asymmetric `border-radius` with
7
+ * wildly different horizontal and vertical radii reads as a wobbly pen
8
+ * stroke. Vuetify passes `variables` through verbatim, so the full
9
+ * multi-value syntax rides in on the same `--v-vw-radius` every other theme
10
+ * uses — no new plumbing.
11
+ */
12
+ export const sketchy = defineTheme({
13
+ name: 'sketchy',
14
+ meta: {
15
+ title: 'Sketchy',
16
+ description: 'Hand-drawn wobble and pencil greys — for mockups, wireframes and mirth.',
17
+ dark: false,
18
+ iconStyle: 'outline',
19
+ swatch: ['#FFFEF7', '#FFFFFF', '#333333', '#7A6A55'],
20
+ fonts: ['Neucha', 'Cabin Sketch'],
21
+ },
22
+ theme: {
23
+ dark: false,
24
+ colors: {
25
+ background: '#FFFEF7',
26
+ surface: '#FFFFFF',
27
+ 'surface-bright': '#FFFFFF',
28
+ 'surface-light': '#F5F2E8',
29
+ 'surface-variant': '#333333',
30
+ 'on-surface-variant': '#FFFEF7',
31
+ primary: '#333333',
32
+ 'primary-darken-1': '#111111',
33
+ secondary: '#7A6A55',
34
+ 'secondary-darken-1': '#5C4F3E',
35
+ error: '#C0392B',
36
+ info: '#2E6DA4',
37
+ success: '#3D8B54',
38
+ warning: '#C98A15',
39
+ 'on-surface': '#2B2B2B',
40
+ 'on-background': '#2B2B2B',
41
+ },
42
+ variables: {
43
+ 'border-color': '#2B2B2B',
44
+ 'border-opacity': 0.85,
45
+ 'high-emphasis-opacity': 0.95,
46
+ 'medium-emphasis-opacity': 0.7,
47
+ 'hover-opacity': 0.06,
48
+ 'font-body': "'Neucha', 'Comic Sans MS', cursive, sans-serif",
49
+ 'font-heading': "'Cabin Sketch', 'Neucha', cursive",
50
+ // Two wobbles, each scaled to its element: a 255px radius on a 36px
51
+ // button gets clamped back into a pill, so buttons get a smaller one
52
+ // and only cards are big enough to carry the full stroke.
53
+ 'vw-radius': '22px 5px 20px 6px / 6px 20px 5px 22px',
54
+ 'vw-radius-lg': '255px 15px 225px 15px / 15px 225px 15px 255px',
55
+ 'vw-radius-thumb': '7px 2px 6px 3px / 3px 6px 2px 7px',
56
+ 'vw-radius-chip': '18px 42px 18px 42px / 42px 18px 42px 18px',
57
+ 'vw-border-width': '2px',
58
+ 'vw-btn-transform': 'none',
59
+ 'vw-btn-tracking': '0.02em',
60
+ 'vw-btn-weight': '400',
61
+ 'vw-tab-slider-height': '3px',
62
+ },
63
+ },
64
+ defaults: [
65
+ {
66
+ VBtn: { variant: 'outlined' },
67
+ VSheet: { border: true },
68
+ VNavigationDrawer: { border: 'e' },
69
+ VSwitch: { inset: 'square' },
70
+ VSlider: { thumbSize: 18, trackSize: 4 },
71
+ },
72
+ surfaces({ variant: 'outlined' }),
73
+ fields({ variant: 'outlined' }),
74
+ bars({ flat: true, border: 'b' }),
75
+ icons({
76
+ // A drawn box with a marker tick scrawled over it, rather than the
77
+ // tidy printed checkbox.
78
+ dropdown: 'mdi-chevron-down',
79
+ collapse: 'mdi-chevron-up',
80
+ checkboxOn: 'mdi-check-bold',
81
+ checkboxOff: 'mdi-square-outline',
82
+ ratingFull: 'mdi-star',
83
+ ratingEmpty: 'mdi-star-outline',
84
+ close: 'mdi-close-thick',
85
+ }),
86
+ ],
87
+ });
88
+ //# sourceMappingURL=sketchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sketchy.js","sourceRoot":"","sources":["../../src/themes/sketchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC;IACjC,IAAI,EAAE,SAAS;IACf,IAAI,EAAE;QACJ,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,yEAAyE;QACtF,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;QACpD,KAAK,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC;KAClC;IACD,KAAK,EAAE;QACL,IAAI,EAAE,KAAK;QACX,MAAM,EAAE;YACN,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,SAAS;YAClB,gBAAgB,EAAE,SAAS;YAC3B,eAAe,EAAE,SAAS;YAC1B,iBAAiB,EAAE,SAAS;YAC5B,oBAAoB,EAAE,SAAS;YAC/B,OAAO,EAAE,SAAS;YAClB,kBAAkB,EAAE,SAAS;YAC7B,SAAS,EAAE,SAAS;YACpB,oBAAoB,EAAE,SAAS;YAC/B,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,SAAS;YACvB,eAAe,EAAE,SAAS;SAC3B;QACD,SAAS,EAAE;YACT,cAAc,EAAE,SAAS;YACzB,gBAAgB,EAAE,IAAI;YACtB,uBAAuB,EAAE,IAAI;YAC7B,yBAAyB,EAAE,GAAG;YAC9B,eAAe,EAAE,IAAI;YACrB,WAAW,EAAE,gDAAgD;YAC7D,cAAc,EAAE,mCAAmC;YACnD,oEAAoE;YACpE,qEAAqE;YACrE,0DAA0D;YAC1D,WAAW,EAAE,uCAAuC;YACpD,cAAc,EAAE,+CAA+C;YAC/D,iBAAiB,EAAE,mCAAmC;YACtD,gBAAgB,EAAE,2CAA2C;YAC7D,iBAAiB,EAAE,KAAK;YACxB,kBAAkB,EAAE,MAAM;YAC1B,iBAAiB,EAAE,QAAQ;YAC3B,eAAe,EAAE,KAAK;YACtB,sBAAsB,EAAE,KAAK;SAC9B;KACF;IACD,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;YAC7B,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;YACxB,iBAAiB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;YAClC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC5B,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;SACzC;QACD,QAAQ,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QACjC,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACjC,KAAK,CAAC;YACJ,mEAAmE;YACnE,yBAAyB;YACzB,QAAQ,EAAE,kBAAkB;YAC5B,QAAQ,EAAE,gBAAgB;YAC1B,UAAU,EAAE,gBAAgB;YAC5B,WAAW,EAAE,oBAAoB;YACjC,UAAU,EAAE,UAAU;YACtB,WAAW,EAAE,kBAAkB;YAC/B,KAAK,EAAE,iBAAiB;SACzB,CAAC;KACH;CACF,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The admin-panel theme: muted slate blues, tight radii, compact density
3
+ * everywhere, cards outlined rather than raised. Built for tables and
4
+ * forms that need to fit a lot on one screen.
5
+ */
6
+ export declare const slate: import("../types.js").VuetiwatchTheme<"slate">;
7
+ //# sourceMappingURL=slate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate.d.ts","sourceRoot":"","sources":["../../src/themes/slate.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,KAAK,gDAgFhB,CAAA"}
@@ -0,0 +1,89 @@
1
+ import { bars, controls, fields, icons, tables } from '../util/defaults.js';
2
+ import { defineTheme } from '../util/defineTheme.js';
3
+ /**
4
+ * The admin-panel theme: muted slate blues, tight radii, compact density
5
+ * everywhere, cards outlined rather than raised. Built for tables and
6
+ * forms that need to fit a lot on one screen.
7
+ */
8
+ export const slate = defineTheme({
9
+ name: 'slate',
10
+ meta: {
11
+ title: 'Slate',
12
+ description: 'Dense corporate dashboard — muted slate blue, compact density, tight radii.',
13
+ dark: false,
14
+ iconStyle: 'filled',
15
+ swatch: ['#F4F6F8', '#FFFFFF', '#2C5282', '#4A6FA5'],
16
+ fonts: ['Inter'],
17
+ },
18
+ theme: {
19
+ dark: false,
20
+ colors: {
21
+ background: '#F4F6F8',
22
+ surface: '#FFFFFF',
23
+ 'surface-bright': '#FFFFFF',
24
+ 'surface-light': '#EAEEF3',
25
+ 'surface-variant': '#33415C',
26
+ 'on-surface-variant': '#EAEEF3',
27
+ primary: '#2C5282',
28
+ 'primary-darken-1': '#1F3C63',
29
+ secondary: '#4A6FA5',
30
+ 'secondary-darken-1': '#375684',
31
+ error: '#C53030',
32
+ info: '#2B6CB0',
33
+ success: '#2F855A',
34
+ warning: '#B7791F',
35
+ 'on-surface': '#1A202C',
36
+ 'on-background': '#1A202C',
37
+ },
38
+ variables: {
39
+ 'border-color': '#1A202C',
40
+ 'border-opacity': 0.14,
41
+ 'shadow-color': '#1A202C',
42
+ 'high-emphasis-opacity': 0.9,
43
+ 'medium-emphasis-opacity': 0.62,
44
+ 'hover-opacity': 0.05,
45
+ 'font-body': "'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif",
46
+ 'vw-radius': '3px',
47
+ 'vw-radius-lg': '4px',
48
+ 'vw-radius-thumb': '3px',
49
+ 'vw-radius-chip': '3px',
50
+ 'vw-border-width': '1px',
51
+ 'vw-btn-transform': 'none',
52
+ 'vw-btn-tracking': '0.01em',
53
+ 'vw-btn-weight': '600',
54
+ 'vw-list-bar': '3px',
55
+ 'vw-list-bar-color': 'rgb(var(--v-theme-primary))',
56
+ 'vw-tab-slider-height': '3px',
57
+ },
58
+ },
59
+ defaults: [
60
+ {
61
+ VBtn: { variant: 'flat', density: 'comfortable' },
62
+ VCard: { variant: 'outlined' },
63
+ VAlert: { variant: 'tonal', density: 'compact' },
64
+ VChip: { variant: 'tonal', size: 'small' },
65
+ VNavigationDrawer: { border: 'e' },
66
+ },
67
+ fields({ variant: 'outlined', density: 'compact' }),
68
+ controls({ density: 'compact' }),
69
+ tables('compact'),
70
+ bars({ flat: true, border: 'b' }),
71
+ {
72
+ // Small, square and out of the way — controls should not outweigh the
73
+ // data they sit next to.
74
+ VSwitch: { inset: 'square' },
75
+ VSlider: { thumbSize: 14, trackSize: 2 },
76
+ },
77
+ icons({
78
+ // Solid triangles: they read at a glance and take less room than a
79
+ // chevron, which matters in a dense table.
80
+ dropdown: 'mdi-menu-down',
81
+ collapse: 'mdi-menu-up',
82
+ checkboxOn: 'mdi-checkbox-marked',
83
+ checkboxOff: 'mdi-checkbox-blank-outline',
84
+ sortAsc: 'mdi-menu-up',
85
+ sortDesc: 'mdi-menu-down',
86
+ }),
87
+ ],
88
+ });
89
+ //# sourceMappingURL=slate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slate.js","sourceRoot":"","sources":["../../src/themes/slate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Pastel and generous: large radii, diffuse coloured shadows, a rounded
3
+ * grotesque. Reads friendly rather than corporate — consumer apps,
4
+ * onboarding, anything that should not feel like a dashboard.
5
+ */
6
+ export declare const soft: import("../types.js").VuetiwatchTheme<"soft">;
7
+ //# sourceMappingURL=soft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soft.d.ts","sourceRoot":"","sources":["../../src/themes/soft.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,IAAI,+CA2Ef,CAAA"}
@@ -0,0 +1,84 @@
1
+ import { bars, fields, icons } from '../util/defaults.js';
2
+ import { defineTheme } from '../util/defineTheme.js';
3
+ /**
4
+ * Pastel and generous: large radii, diffuse coloured shadows, a rounded
5
+ * grotesque. Reads friendly rather than corporate — consumer apps,
6
+ * onboarding, anything that should not feel like a dashboard.
7
+ */
8
+ export const soft = defineTheme({
9
+ name: 'soft',
10
+ meta: {
11
+ title: 'Soft',
12
+ description: 'Pastel palette, large radii and diffuse shadows. Friendly and unhurried.',
13
+ dark: false,
14
+ iconStyle: 'filled',
15
+ swatch: ['#F7F5FF', '#FFFFFF', '#7C6CF0', '#F08CA8'],
16
+ fonts: ['Nunito'],
17
+ },
18
+ theme: {
19
+ dark: false,
20
+ colors: {
21
+ background: '#F7F5FF',
22
+ surface: '#FFFFFF',
23
+ 'surface-bright': '#FFFFFF',
24
+ 'surface-light': '#EAE3FF',
25
+ 'surface-variant': '#4A4458',
26
+ 'on-surface-variant': '#F7F5FF',
27
+ primary: '#7C6CF0',
28
+ 'primary-darken-1': '#5F4DE0',
29
+ secondary: '#F08CA8',
30
+ 'secondary-darken-1': '#DB6C8B',
31
+ error: '#F0736E',
32
+ info: '#58B7E8',
33
+ success: '#4FC38A',
34
+ warning: '#F5B851',
35
+ 'on-surface': '#2E2A3B',
36
+ 'on-background': '#2E2A3B',
37
+ },
38
+ variables: {
39
+ 'border-color': '#5F4DE0',
40
+ 'border-opacity': 0.1,
41
+ 'shadow-color': '#4A3F8C',
42
+ 'high-emphasis-opacity': 0.88,
43
+ 'medium-emphasis-opacity': 0.62,
44
+ 'hover-opacity': 0.06,
45
+ 'font-body': "'Nunito', 'Quicksand', system-ui, sans-serif",
46
+ 'vw-radius': '14px',
47
+ 'vw-radius-lg': '22px',
48
+ 'vw-radius-chip': '999px',
49
+ 'vw-btn-transform': 'none',
50
+ 'vw-btn-tracking': '0',
51
+ 'vw-btn-weight': '700',
52
+ },
53
+ },
54
+ defaults: [
55
+ {
56
+ VBtn: { variant: 'flat' },
57
+ VCard: { variant: 'elevated', elevation: 0 },
58
+ VAlert: { variant: 'tonal' },
59
+ VChip: { variant: 'tonal' },
60
+ },
61
+ fields({ variant: 'solo-filled' }),
62
+ bars({ flat: true }),
63
+ {
64
+ // Everything here rounds off: an inset pill switch, a fat slider, a
65
+ // pill behind the active tab instead of an underline, round tick boxes.
66
+ VSwitch: { inset: true },
67
+ VSlider: { thumbSize: 22, trackSize: 8 },
68
+ // `VTabs` owns its own inset radius, so the theme sets it here
69
+ // rather than through the shared `--v-vw-radius`.
70
+ VTabs: { inset: true, insetRadius: 12 },
71
+ },
72
+ icons({
73
+ // Round and filled, down to hearts instead of stars.
74
+ dropdown: 'mdi-chevron-down',
75
+ collapse: 'mdi-chevron-up',
76
+ checkboxOn: 'mdi-check-circle',
77
+ checkboxOff: 'mdi-circle-outline',
78
+ ratingFull: 'mdi-heart',
79
+ ratingEmpty: 'mdi-heart-outline',
80
+ close: 'mdi-close-circle',
81
+ }),
82
+ ],
83
+ });
84
+ //# sourceMappingURL=soft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soft.js","sourceRoot":"","sources":["../../src/themes/soft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,WAAW,CAAC;IAC9B,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,0EAA0E;QACvF,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;QACpD,KAAK,EAAE,CAAC,QAAQ,CAAC;KAClB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,KAAK;QACX,MAAM,EAAE;YACN,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,SAAS;YAClB,gBAAgB,EAAE,SAAS;YAC3B,eAAe,EAAE,SAAS;YAC1B,iBAAiB,EAAE,SAAS;YAC5B,oBAAoB,EAAE,SAAS;YAC/B,OAAO,EAAE,SAAS;YAClB,kBAAkB,EAAE,SAAS;YAC7B,SAAS,EAAE,SAAS;YACpB,oBAAoB,EAAE,SAAS;YAC/B,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,SAAS;YACvB,eAAe,EAAE,SAAS;SAC3B;QACD,SAAS,EAAE;YACT,cAAc,EAAE,SAAS;YACzB,gBAAgB,EAAE,GAAG;YACrB,cAAc,EAAE,SAAS;YACzB,uBAAuB,EAAE,IAAI;YAC7B,yBAAyB,EAAE,IAAI;YAC/B,eAAe,EAAE,IAAI;YACrB,WAAW,EAAE,8CAA8C;YAC3D,WAAW,EAAE,MAAM;YACnB,cAAc,EAAE,MAAM;YACtB,gBAAgB,EAAE,OAAO;YACzB,kBAAkB,EAAE,MAAM;YAC1B,iBAAiB,EAAE,GAAG;YACtB,eAAe,EAAE,KAAK;SACvB;KACF;IACD,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YACzB,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE;YAC5C,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;YAC5B,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;SAC5B;QACD,MAAM,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACpB;YACE,oEAAoE;YACpE,wEAAwE;YACxE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;YACxB,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;YACxC,+DAA+D;YAC/D,kDAAkD;YAClD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;SACxC;QACD,KAAK,CAAC;YACJ,qDAAqD;YACrD,QAAQ,EAAE,kBAAkB;YAC5B,QAAQ,EAAE,gBAAgB;YAC1B,UAAU,EAAE,kBAAkB;YAC9B,WAAW,EAAE,oBAAoB;YACjC,UAAU,EAAE,WAAW;YACvB,WAAW,EAAE,mBAAmB;YAChC,KAAK,EAAE,kBAAkB;SAC1B,CAAC;KACH;CACF,CAAC,CAAA"}
@@ -0,0 +1,40 @@
1
+ import type { createVuetify, ThemeDefinition } from 'vuetify';
2
+ /** Global component defaults, same shape as `createVuetify({ defaults })`. */
3
+ export type VuetiwatchDefaults = NonNullable<NonNullable<Parameters<typeof createVuetify>[0]>['defaults']>;
4
+ export interface VuetiwatchMeta {
5
+ /** Human readable name, for theme pickers. */
6
+ title: string;
7
+ /** One line pitch — what the theme feels like. */
8
+ description: string;
9
+ /** `true` when the theme is a dark variant. */
10
+ dark: boolean;
11
+ /** Preview swatch: background, surface, primary, secondary. */
12
+ swatch: [string, string, string, string];
13
+ /**
14
+ * How the theme would like *content* icons drawn — the ones an app passes
15
+ * itself, like a mailbox or a dashboard.
16
+ *
17
+ * Vuetify only lets a theme choose the glyphs of controls it renders
18
+ * (a checkbox tick, a sort arrow); anything an app passes as a literal
19
+ * name is its own content, and a theme has no business overriding it.
20
+ * So the theme states a preference here and an app may follow it — see
21
+ * the playground's navigation demo.
22
+ */
23
+ iconStyle: 'outline' | 'filled';
24
+ /**
25
+ * Web fonts the theme expects. The package never loads them for you —
26
+ * add them yourself (Google Fonts, Fontsource, self-hosted) for the full
27
+ * look, or skip it and fall back to the system stack.
28
+ */
29
+ fonts: string[];
30
+ }
31
+ export interface VuetiwatchTheme<Name extends string = string> {
32
+ /** Key used in `createVuetify({ theme: { themes } })`. */
33
+ name: Name;
34
+ meta: VuetiwatchMeta;
35
+ /** Colors and CSS variables, passed straight to Vuetify. */
36
+ theme: ThemeDefinition;
37
+ /** Component defaults applied while this theme is active. */
38
+ defaults: VuetiwatchDefaults;
39
+ }
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE7D,8EAA8E;AAC9E,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAC1C,WAAW,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAC7D,CAAA;AAED,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAA;IACb,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,IAAI,EAAE,OAAO,CAAA;IACb,+DAA+D;IAC/D,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC;;;;;;;;;OASG;IACH,SAAS,EAAE,SAAS,GAAG,QAAQ,CAAA;IAC/B;;;;OAIG;IACH,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,eAAe,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IAC3D,0DAA0D;IAC1D,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,cAAc,CAAA;IACpB,4DAA4D;IAC5D,KAAK,EAAE,eAAe,CAAA;IACtB,6DAA6D;IAC7D,QAAQ,EAAE,kBAAkB,CAAA;CAC7B"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import type { VuetiwatchDefaults } from '../types.js';
2
+ type Props = Record<string, unknown>;
3
+ /**
4
+ * Applies the same props to every field-based input, so a theme states its
5
+ * input style once instead of six times.
6
+ */
7
+ export declare const fields: (props: Props) => VuetiwatchDefaults;
8
+ /** Applies the same props to checkboxes, radio groups and switches. */
9
+ export declare const controls: (props: Props) => VuetiwatchDefaults;
10
+ /** Applies the same props to app bars and toolbars. */
11
+ export declare const bars: (props: Props) => VuetiwatchDefaults;
12
+ /** Applies the same props to cards, alerts and chips. */
13
+ export declare const surfaces: (props: Props) => VuetiwatchDefaults;
14
+ /** Applies the same `density` to lists and both table components. */
15
+ export declare const tables: (density: 'default' | 'comfortable' | 'compact') => VuetiwatchDefaults;
16
+ /**
17
+ * Layers default sets over each other so helpers compose without a later
18
+ * component key wiping an earlier one — `{ VSwitch: { density } }` followed
19
+ * by `{ VSwitch: { inset } }` keeps both.
20
+ */
21
+ export declare const combine: (...parts: VuetiwatchDefaults[]) => VuetiwatchDefaults;
22
+ /**
23
+ * Glyphs a theme can swap.
24
+ *
25
+ * Vuetify's icon *set* (`mdi`, `fa`, a custom SVG set) is global
26
+ * configuration and is not reactive, so it cannot vary per theme. Which
27
+ * glyph a component reaches for is an ordinary prop, though, and props go
28
+ * through defaults like everything else — so a theme can pick outlines
29
+ * where it is thin, solids where it is loud, and circles where it is round.
30
+ *
31
+ * Names must exist in whatever set the app installed; a missing one renders
32
+ * as blank. Everything here is left undefined by default, so a theme states
33
+ * only what it changes.
34
+ */
35
+ export interface VuetiwatchIcons {
36
+ /** Opens a select menu, an expansion panel or a list group. */
37
+ dropdown?: string;
38
+ /** Closes the same. */
39
+ collapse?: string;
40
+ next?: string;
41
+ prev?: string;
42
+ first?: string;
43
+ last?: string;
44
+ checkboxOn?: string;
45
+ checkboxOff?: string;
46
+ radioOn?: string;
47
+ radioOff?: string;
48
+ ratingFull?: string;
49
+ ratingEmpty?: string;
50
+ /** The clear affordance inside a field. */
51
+ clear?: string;
52
+ /** Dismisses a chip or an alert. */
53
+ close?: string;
54
+ sortAsc?: string;
55
+ sortDesc?: string;
56
+ /** Separates breadcrumb items; a plain string, not an icon name. */
57
+ breadcrumbDivider?: string;
58
+ }
59
+ /** Spreads one semantic icon set across every component that draws it. */
60
+ export declare function icons(set: VuetiwatchIcons): VuetiwatchDefaults;
61
+ export {};
62
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/util/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGrD,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AA0CpC;;;GAGG;AACH,eAAO,MAAM,MAAM,UAAW,KAAK,KAAG,kBACL,CAAA;AAEjC,uEAAuE;AACvE,eAAO,MAAM,QAAQ,UAAW,KAAK,KAAG,kBACL,CAAA;AAEnC,uDAAuD;AACvD,eAAO,MAAM,IAAI,UAAW,KAAK,KAAG,kBACL,CAAA;AAE/B,yDAAyD;AACzD,eAAO,MAAM,QAAQ,UAAW,KAAK,KAAG,kBACL,CAAA;AAEnC,qEAAqE;AACrE,eAAO,MAAM,MAAM,YAAa,SAAS,GAAG,aAAa,GAAG,SAAS,KAAG,kBAItE,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO,aAAc,kBAAkB,EAAE,KAAG,kBACkB,CAAA;AAE3E;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,0EAA0E;AAC1E,wBAAgB,KAAK,CAAE,GAAG,EAAE,eAAe,GAAG,kBAAkB,CA6C/D"}
@@ -0,0 +1,100 @@
1
+ import { mergeDeep } from './merge.js';
2
+ /** Every component that renders a `v-field` and shares its `variant` prop. */
3
+ const FIELD_COMPONENTS = [
4
+ 'VTextField',
5
+ 'VTextarea',
6
+ 'VSelect',
7
+ 'VAutocomplete',
8
+ 'VCombobox',
9
+ 'VFileInput',
10
+ ];
11
+ /** The subset of those that opens a menu, and so draws a dropdown glyph. */
12
+ const MENU_COMPONENTS = [
13
+ 'VSelect',
14
+ 'VAutocomplete',
15
+ 'VCombobox',
16
+ ];
17
+ /** Selection controls that share the `density` prop. */
18
+ const CONTROL_COMPONENTS = [
19
+ 'VCheckbox',
20
+ 'VRadioGroup',
21
+ 'VSwitch',
22
+ ];
23
+ /** Containers that share the `flat` / `border` props. */
24
+ const BAR_COMPONENTS = [
25
+ 'VAppBar',
26
+ 'VToolbar',
27
+ ];
28
+ /** Surfaces that share the `variant` prop with cards. */
29
+ const SURFACE_COMPONENTS = [
30
+ 'VCard',
31
+ 'VAlert',
32
+ 'VChip',
33
+ ];
34
+ const spread = (names, props) => Object.fromEntries(names.map(name => [name, props]));
35
+ /**
36
+ * Applies the same props to every field-based input, so a theme states its
37
+ * input style once instead of six times.
38
+ */
39
+ export const fields = (props) => spread(FIELD_COMPONENTS, props);
40
+ /** Applies the same props to checkboxes, radio groups and switches. */
41
+ export const controls = (props) => spread(CONTROL_COMPONENTS, props);
42
+ /** Applies the same props to app bars and toolbars. */
43
+ export const bars = (props) => spread(BAR_COMPONENTS, props);
44
+ /** Applies the same props to cards, alerts and chips. */
45
+ export const surfaces = (props) => spread(SURFACE_COMPONENTS, props);
46
+ /** Applies the same `density` to lists and both table components. */
47
+ export const tables = (density) => ({
48
+ VList: { density },
49
+ VTable: { density },
50
+ VDataTable: { density },
51
+ });
52
+ /**
53
+ * Layers default sets over each other so helpers compose without a later
54
+ * component key wiping an earlier one — `{ VSwitch: { density } }` followed
55
+ * by `{ VSwitch: { inset } }` keeps both.
56
+ */
57
+ export const combine = (...parts) => parts.reduce((acc, part) => mergeDeep(acc, part), {});
58
+ /** Spreads one semantic icon set across every component that draws it. */
59
+ export function icons(set) {
60
+ const out = {};
61
+ /**
62
+ * Merges rather than assigns, because a component can draw more than one
63
+ * of these glyphs — a select carries both `menuIcon` and `clearIcon`, and
64
+ * assigning would drop whichever came first. Props the theme left unset
65
+ * are skipped so they fall through to Vuetify's own.
66
+ */
67
+ const put = (names, props) => {
68
+ const given = Object.entries(props).filter(([, value]) => value !== undefined);
69
+ if (!given.length)
70
+ return;
71
+ for (const name of names) {
72
+ out[name] = { ...out[name], ...Object.fromEntries(given) };
73
+ }
74
+ };
75
+ const paging = {
76
+ nextIcon: set.next,
77
+ prevIcon: set.prev,
78
+ firstIcon: set.first,
79
+ lastIcon: set.last,
80
+ };
81
+ put(FIELD_COMPONENTS, { clearIcon: set.clear });
82
+ put(MENU_COMPONENTS, { menuIcon: set.dropdown });
83
+ put(['VExpansionPanelTitle', 'VList'], {
84
+ expandIcon: set.dropdown,
85
+ collapseIcon: set.collapse,
86
+ });
87
+ put(['VPagination', 'VDataTable'], paging);
88
+ put(['VDataTable'], { sortAscIcon: set.sortAsc, sortDescIcon: set.sortDesc });
89
+ put(['VSlideGroup'], { nextIcon: set.next, prevIcon: set.prev });
90
+ put(['VCheckbox', 'VCheckboxBtn'], {
91
+ trueIcon: set.checkboxOn,
92
+ falseIcon: set.checkboxOff,
93
+ });
94
+ put(['VRadio'], { trueIcon: set.radioOn, falseIcon: set.radioOff });
95
+ put(['VRating'], { fullIcon: set.ratingFull, emptyIcon: set.ratingEmpty });
96
+ put(['VChip', 'VAlert'], { closeIcon: set.close });
97
+ put(['VBreadcrumbs'], { divider: set.breadcrumbDivider });
98
+ return out;
99
+ }
100
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/util/defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ThemeDefinition } from 'vuetify';
2
+ import type { VuetiwatchDefaults, VuetiwatchMeta, VuetiwatchTheme } from '../types.js';
3
+ export interface DefineThemeOptions<Name extends string = string> {
4
+ name: Name;
5
+ meta: VuetiwatchMeta;
6
+ /**
7
+ * Colors and CSS variables. Only what the theme actually changes: Vuetify
8
+ * merges every theme over its own `light` or `dark` before use, picking
9
+ * the one matching `dark`, so anything left out is inherited rather than
10
+ * missing.
11
+ */
12
+ theme: ThemeDefinition;
13
+ /**
14
+ * Component defaults, as one object or as layers to fold together —
15
+ * `combine()` is applied for you, so helpers compose without a later
16
+ * component key wiping an earlier one.
17
+ */
18
+ defaults?: VuetiwatchDefaults | VuetiwatchDefaults[];
19
+ }
20
+ export declare function defineTheme<const Name extends string>(options: DefineThemeOptions<Name>): VuetiwatchTheme<Name>;
21
+ //# sourceMappingURL=defineTheme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineTheme.d.ts","sourceRoot":"","sources":["../../src/util/defineTheme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAgBtF,MAAM,WAAW,kBAAkB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IAC9D,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,cAAc,CAAA;IACpB;;;;;OAKG;IACH,KAAK,EAAE,eAAe,CAAA;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,kBAAkB,GAAG,kBAAkB,EAAE,CAAA;CACrD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,EACnD,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAChC,eAAe,CAAC,IAAI,CAAC,CAWvB"}
@@ -0,0 +1,25 @@
1
+ import { combine } from './defaults.js';
2
+ /**
3
+ * Applied under every theme's own defaults.
4
+ *
5
+ * A slider with no `color` falls back to `surface-variant`, which reads as
6
+ * dead grey whatever the palette — so the controls whose whole job is to
7
+ * show a value are coloured here once. A theme overrides this the way it
8
+ * overrides anything else.
9
+ */
10
+ const baseDefaults = {
11
+ VSlider: { color: 'primary' },
12
+ VRangeSlider: { color: 'primary' },
13
+ };
14
+ export function defineTheme(options) {
15
+ const layers = options.defaults
16
+ ? [options.defaults].flat()
17
+ : [];
18
+ return {
19
+ name: options.name,
20
+ meta: options.meta,
21
+ theme: options.theme,
22
+ defaults: combine(baseDefaults, ...layers),
23
+ };
24
+ }
25
+ //# sourceMappingURL=defineTheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineTheme.js","sourceRoot":"","sources":["../../src/util/defineTheme.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC;;;;;;;GAOG;AACH,MAAM,YAAY,GAAuB;IACvC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7B,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;CACnC,CAAA;AAoBD,MAAM,UAAU,WAAW,CACzB,OAAiC;IAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ;QAC7B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;QAC3B,CAAC,CAAC,EAAE,CAAA;IAEN,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC;KAC3C,CAAA;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ type Plain = Record<string, any>;
2
+ /**
3
+ * Recursively merges `source` onto `target` without mutating either.
4
+ * Arrays and primitives from `source` replace the target value outright.
5
+ */
6
+ export declare function mergeDeep<T extends Plain>(target: T, source?: Plain): T;
7
+ export {};
8
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/util/merge.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAKhC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,KAAK,EAAG,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAaxE"}
@@ -0,0 +1,17 @@
1
+ const isPlainObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
2
+ /**
3
+ * Recursively merges `source` onto `target` without mutating either.
4
+ * Arrays and primitives from `source` replace the target value outright.
5
+ */
6
+ export function mergeDeep(target, source) {
7
+ if (!source)
8
+ return { ...target };
9
+ const out = { ...target };
10
+ for (const key of Object.keys(source)) {
11
+ const a = out[key];
12
+ const b = source[key];
13
+ out[key] = isPlainObject(a) && isPlainObject(b) ? mergeDeep(a, b) : b;
14
+ }
15
+ return out;
16
+ }
17
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/util/merge.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,CAAC,KAAc,EAAkB,EAAE,CACvD,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAEtE;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAmB,MAAS,EAAE,MAAc;IACnE,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAA;IAEjC,MAAM,GAAG,GAAU,EAAE,GAAG,MAAM,EAAE,CAAA;IAEhC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QAErB,GAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvE,CAAC;IAED,OAAO,GAAQ,CAAA;AACjB,CAAC"}