vuetiwatch 0.2.0 → 0.2.2

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 (127) hide show
  1. package/README.md +25 -202
  2. package/dist/index.d.ts +2 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/plugin.d.ts.map +1 -1
  7. package/dist/plugin.js +19 -3
  8. package/dist/plugin.js.map +1 -1
  9. package/dist/styles/aurora.css +1 -1
  10. package/dist/styles/aurora.min.css +1 -1
  11. package/dist/styles/brutalist.css +1 -1
  12. package/dist/styles/brutalist.min.css +1 -1
  13. package/dist/styles/calm.css +1 -1
  14. package/dist/styles/calm.min.css +1 -1
  15. package/dist/styles/candy.css +1 -4
  16. package/dist/styles/candy.min.css +1 -1
  17. package/dist/styles/clay.css +1 -1
  18. package/dist/styles/clay.min.css +1 -1
  19. package/dist/styles/core.css +44 -2
  20. package/dist/styles/core.min.css +1 -1
  21. package/dist/styles/darkGlass.css +1 -1
  22. package/dist/styles/darkGlass.min.css +1 -1
  23. package/dist/styles/liquidGlass.css +10 -1
  24. package/dist/styles/liquidGlass.min.css +1 -1
  25. package/dist/styles/lux.css +1 -1
  26. package/dist/styles/lux.min.css +1 -1
  27. package/dist/styles/neon.css +1 -1
  28. package/dist/styles/neon.min.css +1 -1
  29. package/dist/styles/slate.css +1 -1
  30. package/dist/styles/slate.min.css +1 -1
  31. package/dist/styles/soft.css +3 -2
  32. package/dist/styles/soft.min.css +1 -1
  33. package/dist/styles.css +66 -17
  34. package/dist/styles.min.css +1 -1
  35. package/dist/themes/atlas.d.ts +35 -0
  36. package/dist/themes/atlas.d.ts.map +1 -1
  37. package/dist/themes/atlas.js +75 -1
  38. package/dist/themes/atlas.js.map +1 -1
  39. package/dist/themes/atlasDark.d.ts.map +1 -1
  40. package/dist/themes/atlasDark.js +5 -0
  41. package/dist/themes/atlasDark.js.map +1 -1
  42. package/dist/themes/atlasSepia.d.ts.map +1 -1
  43. package/dist/themes/atlasSepia.js +5 -0
  44. package/dist/themes/atlasSepia.js.map +1 -1
  45. package/dist/themes/aurora.d.ts.map +1 -1
  46. package/dist/themes/aurora.js +20 -1
  47. package/dist/themes/aurora.js.map +1 -1
  48. package/dist/themes/brutalist.d.ts.map +1 -1
  49. package/dist/themes/brutalist.js +63 -5
  50. package/dist/themes/brutalist.js.map +1 -1
  51. package/dist/themes/calm.d.ts.map +1 -1
  52. package/dist/themes/calm.js +22 -1
  53. package/dist/themes/calm.js.map +1 -1
  54. package/dist/themes/candy.d.ts.map +1 -1
  55. package/dist/themes/candy.js +23 -1
  56. package/dist/themes/candy.js.map +1 -1
  57. package/dist/themes/clay.d.ts.map +1 -1
  58. package/dist/themes/clay.js +14 -1
  59. package/dist/themes/clay.js.map +1 -1
  60. package/dist/themes/darkGlass.d.ts.map +1 -1
  61. package/dist/themes/darkGlass.js +13 -1
  62. package/dist/themes/darkGlass.js.map +1 -1
  63. package/dist/themes/graphite.d.ts.map +1 -1
  64. package/dist/themes/graphite.js +42 -7
  65. package/dist/themes/graphite.js.map +1 -1
  66. package/dist/themes/liquidGlass.d.ts.map +1 -1
  67. package/dist/themes/liquidGlass.js +41 -5
  68. package/dist/themes/liquidGlass.js.map +1 -1
  69. package/dist/themes/lux.d.ts.map +1 -1
  70. package/dist/themes/lux.js +48 -6
  71. package/dist/themes/lux.js.map +1 -1
  72. package/dist/themes/morph.d.ts.map +1 -1
  73. package/dist/themes/morph.js +21 -1
  74. package/dist/themes/morph.js.map +1 -1
  75. package/dist/themes/neon.d.ts.map +1 -1
  76. package/dist/themes/neon.js +35 -1
  77. package/dist/themes/neon.js.map +1 -1
  78. package/dist/themes/paper.d.ts.map +1 -1
  79. package/dist/themes/paper.js +38 -1
  80. package/dist/themes/paper.js.map +1 -1
  81. package/dist/themes/sketchy.d.ts.map +1 -1
  82. package/dist/themes/sketchy.js +27 -1
  83. package/dist/themes/sketchy.js.map +1 -1
  84. package/dist/themes/slate.d.ts.map +1 -1
  85. package/dist/themes/slate.js +42 -6
  86. package/dist/themes/slate.js.map +1 -1
  87. package/dist/themes/soft.d.ts.map +1 -1
  88. package/dist/themes/soft.js +49 -8
  89. package/dist/themes/soft.js.map +1 -1
  90. package/dist/util/defaults.d.ts +35 -0
  91. package/dist/util/defaults.d.ts.map +1 -1
  92. package/dist/util/defaults.js +51 -0
  93. package/dist/util/defaults.js.map +1 -1
  94. package/package.json +2 -1
  95. package/src/index.ts +2 -2
  96. package/src/plugin.ts +20 -3
  97. package/src/styles/core.css +152 -3
  98. package/src/styles/themes/aurora.css +1 -0
  99. package/src/styles/themes/brutalist.css +1 -0
  100. package/src/styles/themes/calm.css +1 -0
  101. package/src/styles/themes/candy.css +9 -4
  102. package/src/styles/themes/clay.css +1 -0
  103. package/src/styles/themes/darkGlass.css +1 -0
  104. package/src/styles/themes/liquidGlass.css +41 -0
  105. package/src/styles/themes/lux.css +1 -0
  106. package/src/styles/themes/neon.css +1 -0
  107. package/src/styles/themes/slate.css +1 -0
  108. package/src/styles/themes/soft.css +10 -0
  109. package/src/themes/atlas.ts +76 -1
  110. package/src/themes/atlasDark.ts +5 -0
  111. package/src/themes/atlasSepia.ts +5 -0
  112. package/src/themes/aurora.ts +21 -1
  113. package/src/themes/brutalist.ts +65 -5
  114. package/src/themes/calm.ts +23 -1
  115. package/src/themes/candy.ts +24 -1
  116. package/src/themes/clay.ts +15 -1
  117. package/src/themes/darkGlass.ts +14 -1
  118. package/src/themes/graphite.ts +44 -7
  119. package/src/themes/liquidGlass.ts +42 -5
  120. package/src/themes/lux.ts +50 -6
  121. package/src/themes/morph.ts +22 -1
  122. package/src/themes/neon.ts +37 -1
  123. package/src/themes/paper.ts +40 -1
  124. package/src/themes/sketchy.ts +29 -1
  125. package/src/themes/slate.ts +43 -6
  126. package/src/themes/soft.ts +50 -8
  127. package/src/util/defaults.ts +84 -0
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/util/defaults.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/util/defaults.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vuetiwatch",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "type": "module",
5
5
  "description": "Free, plug-and-play themes for Vuetify 4 — a Bootswatch for Vuetify",
6
6
  "license": "MIT",
@@ -54,6 +54,7 @@
54
54
  "clean": "node --eval \"fs.rmSync('dist', { recursive: true, force: true })\"",
55
55
  "dev": "tsc --watch",
56
56
  "typecheck": "tsc --noEmit",
57
+ "audit": "npm run build:types && node scripts/audit-contrast.mjs",
57
58
  "prepack": "npm run build"
58
59
  },
59
60
  "peerDependencies": {
package/src/index.ts CHANGED
@@ -27,12 +27,12 @@ export {
27
27
  } from './registry.js'
28
28
  export { createVuetiwatch, useVuetiwatch } from './plugin.js'
29
29
  export { defineTheme } from './util/defineTheme.js'
30
- export { bars, combine, controls, fields, icons, surfaces, tables } from './util/defaults.js'
30
+ export { bars, combine, controls, fields, icons, overlays, ripple, surfaces, tables } from './util/defaults.js'
31
31
 
32
32
  export type { Vuetiwatch, VuetiwatchOptions } from './plugin.js'
33
33
  export type { VuetiwatchThemeName } from './registry.js'
34
34
  export type { DefineThemeOptions } from './util/defineTheme.js'
35
- export type { VuetiwatchIcons } from './util/defaults.js'
35
+ export type { VuetiwatchIcons, VuetiwatchOverlays } from './util/defaults.js'
36
36
  export type {
37
37
  VuetiwatchAccent,
38
38
  VuetiwatchDefaults,
package/src/plugin.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { computed, inject, ref, watch } from 'vue'
1
+ import { computed, inject, ref, toRaw, watch } from 'vue'
2
2
  import type { App, ComputedRef, Plugin, Ref } from 'vue'
3
3
  import type { VuetiwatchAccent, VuetiwatchDefaults, VuetiwatchTheme } from './types.js'
4
4
  import { combine } from './util/defaults.js'
@@ -198,8 +198,25 @@ export function createVuetiwatch (
198
198
  let applied: VuetiwatchDefaults | undefined
199
199
 
200
200
  const defaultsFor = (name: string) => {
201
- if (applied && instance.defaults.value !== applied) {
202
- userDefaults = instance.defaults.value ?? {}
201
+ /**
202
+ * The comparison goes through `toRaw`, because Vuetify holds
203
+ * `defaults` in a deep `ref` — "if an object is assigned as a ref's
204
+ * value, the object is made deeply reactive" — so reading it back
205
+ * hands out a proxy of what was written, never the object itself.
206
+ * Comparing the two directly can only ever say "not ours", which is
207
+ * the opposite of what the check asks: every theme change would fold
208
+ * the outgoing theme's defaults into the app's own, and they would
209
+ * never come back off. A theme with none of its own, `classic` above
210
+ * all, then keeps whatever was on screen before it.
211
+ *
212
+ * Only the comparison is unwrapped. Vue asks callers not to hold a
213
+ * persistent reference to a raw object, so what is kept is the proxy
214
+ * Vuetify handed out — `mergeDeep` only ever reads it.
215
+ */
216
+ const live = instance.defaults.value
217
+
218
+ if (applied && toRaw(live) !== applied) {
219
+ userDefaults = live ?? {}
203
220
  }
204
221
 
205
222
  const themeDefaults = defaultsByName.get(name)
@@ -249,8 +249,6 @@
249
249
  .v-field:not([class*='rounded-']),
250
250
  .v-list-item:not([class*='rounded-']),
251
251
  .v-snackbar__wrapper,
252
- .v-menu > .v-overlay__content,
253
- .v-tooltip > .v-overlay__content,
254
252
  .v-overlay__content > :is(.v-list, .v-sheet)
255
253
  ) {
256
254
  border-radius: var(--v-vw-radius, 4px);
@@ -316,6 +314,34 @@
316
314
  background-color: rgb(var(--v-theme-surface));
317
315
  }
318
316
 
317
+ /**
318
+ * A tonal card tints its ground, not the things standing on it.
319
+ *
320
+ * Vuetify paints that tint with `.v-card__underlay`, positioned and left
321
+ * at `z-index: auto` — which puts it in the positioned layer, above every
322
+ * unpositioned child of the card. Its own `.v-card__content` wrapper is
323
+ * `position: relative` and so escapes, but a card is only given that
324
+ * wrapper for certain slots; content passed straight to the default slot
325
+ * gets none, and is painted over.
326
+ *
327
+ * What that costs is the whole point of the variant. A white field on a
328
+ * tonal card came out washed by `--v-activated-opacity` and read as
329
+ * disabled rather than as somewhere to type, and every label in the card
330
+ * lost the same fraction of its contrast — the stronger a theme sets that
331
+ * opacity, the more it loses.
332
+ *
333
+ * The card already establishes a stacking context of its own, so a
334
+ * negative index puts the tint under the content and no further: it stays
335
+ * inside the card and above the card's own background. Only the card is
336
+ * corrected here. The same shape appears on buttons, chips and avatars,
337
+ * where the tint is the entire visible surface rather than a ground —
338
+ * pushed back there, it disappears behind a transparent control and takes
339
+ * the variant with it.
340
+ */
341
+ & .v-card--variant-tonal > .v-card__underlay {
342
+ z-index: -1;
343
+ }
344
+
319
345
  /* --------------------------------------------------- nested surfaces */
320
346
 
321
347
  /**
@@ -406,12 +432,110 @@
406
432
  * theme built with `defineTheme()` gets the same knobs for free.
407
433
  */
408
434
 
409
- /* Every floating surface, so a tooltip is not left behind by a menu. */
435
+ /**
436
+ * Every floating surface, so a tooltip is not left behind by a menu.
437
+ *
438
+ * Written twice because an overlay is not where it looks like it is.
439
+ * Vuetify teleports one to `.v-overlay-container`, which hangs off
440
+ * `<body>` rather than off the application root, and stamps the theme
441
+ * class onto the overlay itself — so the theme class and `.v-dialog` land
442
+ * on one element and a descendant combinator has nothing to descend from.
443
+ * The compound form is what matches a teleported surface; the descendant
444
+ * one still covers a menu rendered in place with `attach`.
445
+ */
446
+ &:is(.v-menu, .v-dialog, .v-tooltip) > .v-overlay__content,
410
447
  & :is(.v-menu, .v-dialog, .v-tooltip) > .v-overlay__content {
411
448
  border: var(--v-vw-overlay-border, none);
412
449
  box-shadow: var(--v-vw-overlay-shadow, revert-layer);
413
450
  }
414
451
 
452
+ /**
453
+ * And give it the shape it is being painted in.
454
+ *
455
+ * The treatment above lands on the content box, and so does a theme's own
456
+ * — the glass themes blur there, `brutalist` puts its offset block there.
457
+ * Vuetify leaves that box square while the card inside it is rounded, so
458
+ * every one of those decorations came out as a rectangle drawn around a
459
+ * rounded panel, most visibly wherever the corner radius is large.
460
+ *
461
+ * A menu and a tooltip are controls and take the control radius; a dialog
462
+ * is a card-sized surface and takes the panel one — the same expression
463
+ * the card itself resolves, so the two edges cannot drift apart. A
464
+ * fullscreen dialog is the exception: it has no corners because it has no
465
+ * edges.
466
+ */
467
+ &:is(.v-menu, .v-tooltip) > .v-overlay__content,
468
+ & :is(.v-menu, .v-tooltip) > .v-overlay__content {
469
+ border-radius: var(--v-vw-radius, 4px);
470
+ }
471
+
472
+ &.v-dialog:not(.v-dialog--fullscreen) > .v-overlay__content,
473
+ & .v-dialog:not(.v-dialog--fullscreen) > .v-overlay__content {
474
+ border-radius: var(--v-vw-radius-lg, var(--v-vw-radius, 4px));
475
+ }
476
+
477
+ /**
478
+ * And how fast it gets there.
479
+ *
480
+ * Which transition a surface uses is a prop — a theme names it through
481
+ * `overlays()` — but the timing of every one of them is baked into
482
+ * Vuetify's own stylesheet: a fade takes 300ms whether it belongs to a
483
+ * theme that settles slowly or to one that repaints instantly. Naming a
484
+ * transition without owning its clock only half moves it.
485
+ *
486
+ * The class is on the content element itself, whatever the transition is
487
+ * called, so one selector reaches all of them — and `revert-layer` hands
488
+ * the timing straight back to Vuetify for a theme that says nothing, so
489
+ * the two numbers stay opt-in.
490
+ *
491
+ * The scrim is timed from the same pair, because it is the other half of
492
+ * the same event and Vuetify gives no way to say so: it is hard-wired to
493
+ * a 300ms `fade-transition` with no prop to change it. Left alone, a
494
+ * theme that opens its panels in 90ms gets the panel and then, a third of
495
+ * a second later, the room going dark behind it — two things happening
496
+ * where the user did one.
497
+ *
498
+ * Leave falls through to enter, because a theme normally has one speed
499
+ * and stating it twice is how the two drift apart. A theme that wants the
500
+ * asymmetry Material describes — leave faster than enter — says so.
501
+ */
502
+ & :is(.v-overlay__content, .v-overlay__scrim):is(
503
+ [class*='-transition-enter-active'],
504
+ [class*='-transition-leave-active']
505
+ ) {
506
+ transition-timing-function: var(--v-vw-overlay-ease, var(--v-vw-motion-ease, revert-layer));
507
+ }
508
+
509
+ & .v-overlay__content[class*='-transition-enter-active'] {
510
+ transition-duration: var(--v-vw-overlay-duration, revert-layer);
511
+ }
512
+
513
+ & .v-overlay__content[class*='-transition-leave-active'] {
514
+ transition-duration: var(--v-vw-overlay-exit, var(--v-vw-overlay-duration, revert-layer));
515
+ }
516
+
517
+ /**
518
+ * The scrim follows the panel unless a theme separates them.
519
+ *
520
+ * Most of the time one number is right for both — they are two halves of
521
+ * one event, and a panel that arrives before the room darkens reads as
522
+ * two things happening. The exception is a theme whose panel does not
523
+ * travel at all: dimming the whole screen in a single frame is not
524
+ * decisive, it is a flash, and the eye reads it as a fault rather than as
525
+ * a choice. Such a theme gives the scrim a clock of its own and keeps its
526
+ * panel instant.
527
+ */
528
+ & .v-overlay__scrim[class*='-transition-enter-active'] {
529
+ transition-duration: var(--v-vw-scrim-duration, var(--v-vw-overlay-duration, revert-layer));
530
+ }
531
+
532
+ & .v-overlay__scrim[class*='-transition-leave-active'] {
533
+ transition-duration: var(
534
+ --v-vw-scrim-duration,
535
+ var(--v-vw-overlay-exit, var(--v-vw-overlay-duration, revert-layer))
536
+ );
537
+ }
538
+
415
539
  /**
416
540
  * A relief theme paints outside the shape it lifts, and a chip group is a
417
541
  * scroller: it clips to its content box, so the glow around the chips
@@ -750,6 +874,31 @@
750
874
  text-decoration: var(--v-vw-link-decoration, underline);
751
875
  text-underline-offset: 0.15em;
752
876
  }
877
+
878
+ /* ------------------------------------------------------------ selection */
879
+
880
+ /**
881
+ * Dragging across a paragraph is the one interaction every theme shares
882
+ * and none of them owned: the browser answers in its own blue, which
883
+ * belongs to no palette here and reads as a piece of the operating
884
+ * system showing through the page.
885
+ *
886
+ * The default is the theme's accent rather than a value each theme has
887
+ * to state, so it costs a theme nothing and follows the accent when
888
+ * `setAccent()` repaints one. `24%` is the strongest tint that still
889
+ * leaves body text at its own contrast on both light and dark grounds —
890
+ * a theme that wants a solid highlight sets the pair below and takes
891
+ * responsibility for the ink on top of it.
892
+ *
893
+ * `background-color` rather than the shorthand on purpose: `::selection`
894
+ * paints no image, so a theme whose surface is a gradient cannot express
895
+ * it here and would silently get nothing.
896
+ */
897
+ &::selection,
898
+ & ::selection {
899
+ background-color: var(--v-vw-selection-fill, rgba(var(--v-theme-primary), 0.24));
900
+ color: var(--v-vw-selection-color, inherit);
901
+ }
753
902
  }
754
903
 
755
904
  @keyframes vw-pop {
@@ -98,6 +98,7 @@
98
98
  box-shadow: 0 0 14px rgba(124, 92, 255, 0.5);
99
99
  }
100
100
 
101
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
101
102
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
102
103
  box-shadow: 0 0 0 1px rgba(155, 140, 255, 0.16), 0 24px 64px rgba(0, 0, 0, 0.7);
103
104
  }
@@ -26,6 +26,7 @@
26
26
  box-shadow: 5px 5px 0 rgb(var(--v-shadow-color));
27
27
  }
28
28
 
29
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
29
30
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
30
31
  border: var(--v-vw-border-width) solid rgb(var(--v-shadow-color));
31
32
  box-shadow: 8px 8px 0 rgb(var(--v-shadow-color));
@@ -7,6 +7,7 @@
7
7
  box-shadow: none;
8
8
  }
9
9
 
10
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
10
11
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
11
12
  border: var(--v-vw-border-width) solid rgba(var(--v-border-color), 0.09);
12
13
  box-shadow: 0 16px 48px rgba(58, 58, 54, 0.06);
@@ -70,13 +70,18 @@
70
70
  * Inputs are the one place the padding goes the other way: a dent pressed
71
71
  * into the cushion, shaded at the top where the surface falls in. Without
72
72
  * it `solo-filled` is the same white as the card it sits on.
73
+ *
74
+ * The tint goes on the field, not on `.v-field__overlay`, which is where
75
+ * it used to be and where it did nothing: Vuetify holds that overlay at
76
+ * `opacity: 0.04`, so a colour set there arrives at a twenty-fifth of its
77
+ * strength — the dent stayed white, and against a tonal card the field
78
+ * read as an inert slab rather than as somewhere to type. Leaving the
79
+ * overlay alone also leaves Vuetify's own hover and focus shading, which
80
+ * recomputes that opacity and would have fought a value forced into it.
73
81
  */
74
82
  & .v-field.v-field--variant-solo-filled {
75
- box-shadow: inset 0 2px 5px rgba(var(--v-shadow-color), 0.16);
76
- }
77
-
78
- & .v-field.v-field--variant-solo-filled .v-field__overlay {
79
83
  background-color: rgb(var(--v-theme-surface-light));
84
+ box-shadow: inset 0 2px 5px rgba(var(--v-shadow-color), 0.16);
80
85
  }
81
86
 
82
87
  & :is(.v-switch__track, .v-slider-track__background) {
@@ -63,6 +63,7 @@
63
63
  -2px -2px 6px rgba(255, 255, 255, 0.9);
64
64
  }
65
65
 
66
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
66
67
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
67
68
  box-shadow: 12px 12px 40px rgba(var(--v-shadow-color), 0.24);
68
69
  }
@@ -28,6 +28,7 @@
28
28
  0 8px 32px rgba(var(--v-shadow-color), 0.45);
29
29
  }
30
30
 
31
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
31
32
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
32
33
  backdrop-filter: blur(18px) saturate(160%);
33
34
  box-shadow: 0 16px 48px rgba(var(--v-shadow-color), 0.55);
@@ -39,6 +39,7 @@
39
39
  0 10px 34px rgba(var(--v-shadow-color), 0.1);
40
40
  }
41
41
 
42
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
42
43
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
43
44
  backdrop-filter: blur(30px) saturate(190%);
44
45
  box-shadow:
@@ -47,6 +48,46 @@
47
48
  0 18px 52px rgba(var(--v-shadow-color), 0.18);
48
49
  }
49
50
 
51
+ /**
52
+ * The pane arrives already frosted.
53
+ *
54
+ * Not a browser bug but the filter model working as specified: an element
55
+ * with `opacity` below 1 becomes a backdrop root, and a `backdrop-filter`
56
+ * inside one samples that root rather than the page. Every Vuetify
57
+ * transition fades, so for the length of the entrance the blur has
58
+ * nothing behind it to blur, and the frost only appears at the frame
59
+ * opacity reaches 1 — which reads as the effect loading late.
60
+ *
61
+ * So the entrance is split across two clocks rather than one. The scale
62
+ * keeps the theme's own length and carries the movement; opacity runs on
63
+ * `--vw-glass-lit`, short enough to end the backdrop root while the pane
64
+ * is still on its way in, so the frost is alight for almost all of the
65
+ * arrival.
66
+ *
67
+ * The scrim is put on that same short clock — that is what
68
+ * `--v-vw-scrim-duration` is, and core reads it — and this is the half
69
+ * that is easy to get wrong: cutting the pane's fade altogether was the first
70
+ * attempt, and it traded a late blur for something worse — a solid pane
71
+ * in frame one with the room still darkening behind it for another three
72
+ * hundred milliseconds, which reads as two events instead of one. What
73
+ * has to agree is when the pane is lit and when the room is dark. The
74
+ * scale finishing later is movement, and movement is allowed to settle.
75
+ *
76
+ * The start scale is gentler than the transition's own `scale(0)`, since
77
+ * a pane already visible at 120ms should not still be a dot. The exit
78
+ * keeps one clock: a blur going out early is not something anyone sees.
79
+ */
80
+ &:is(.v-menu, .v-dialog) > .v-overlay__content[class*='-transition-enter-from'],
81
+ & :is(.v-menu, .v-dialog) > .v-overlay__content[class*='-transition-enter-from'] {
82
+ transform: scale(0.92);
83
+ }
84
+
85
+ &:is(.v-menu, .v-dialog) > .v-overlay__content[class*='-transition-enter-active'],
86
+ & :is(.v-menu, .v-dialog) > .v-overlay__content[class*='-transition-enter-active'] {
87
+ transition-property: transform, opacity;
88
+ transition-duration: var(--v-vw-overlay-duration, 320ms), var(--v-vw-scrim-duration, 120ms);
89
+ }
90
+
50
91
  /**
51
92
  * A text field is a recess, not a raised pane — so it takes a fill rather
52
93
  * than glass, and gets no specular rim.
@@ -20,6 +20,7 @@
20
20
  font-size: 0.75rem;
21
21
  }
22
22
 
23
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
23
24
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
24
25
  border: var(--v-vw-border-width) solid rgba(var(--v-border-color), 0.14);
25
26
  box-shadow: 0 24px 64px rgba(0, 0, 0, 0.08);
@@ -22,6 +22,7 @@
22
22
  box-shadow: 0 0 22px rgba(var(--v-theme-primary), 0.45);
23
23
  }
24
24
 
25
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
25
26
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
26
27
  box-shadow:
27
28
  0 0 0 1px rgba(var(--v-theme-primary), 0.35),
@@ -12,6 +12,7 @@
12
12
  font-weight: 600;
13
13
  }
14
14
 
15
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
15
16
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
16
17
  box-shadow: 0 8px 24px rgba(var(--v-shadow-color), 0.16);
17
18
  }
@@ -20,6 +20,7 @@
20
20
  box-shadow: 0 2px 8px rgba(var(--v-theme-primary), 0.24);
21
21
  }
22
22
 
23
+ &:is(.v-menu, .v-dialog) > .v-overlay__content,
23
24
  & :is(.v-menu, .v-dialog) > .v-overlay__content {
24
25
  box-shadow: 0 16px 48px rgba(var(--v-theme-primary), 0.18);
25
26
  }
@@ -28,9 +29,18 @@
28
29
  * `solo-filled` paints itself `surface`, which sits a couple of percent
29
30
  * from this theme's `background`. Without the shadow the field has no
30
31
  * edge at all, so it keeps one — in the theme's own tint.
32
+ *
33
+ * A cast shadow is not enough on its own, though, and the newsletter
34
+ * band is where that shows: on a tonal card the ground is already a
35
+ * tinted grey, a diffuse violet glow over it is invisible, and the field
36
+ * loses its only edge. What is left is a pale slab a few per cent from
37
+ * what surrounds it, which reads as disabled rather than as somewhere to
38
+ * type. The ring restores the boundary wherever the glow cannot — inset,
39
+ * so it costs no layout the way a real border would.
31
40
  */
32
41
  & .v-field.v-field--variant-solo-filled {
33
42
  box-shadow:
43
+ inset 0 0 0 1px rgba(var(--v-theme-primary), 0.3),
34
44
  0 1px 2px rgba(var(--v-theme-primary), 0.08),
35
45
  0 4px 12px rgba(var(--v-theme-primary), 0.06);
36
46
  }
@@ -1,5 +1,5 @@
1
1
  import type { VuetiwatchAccent, VuetiwatchDefaults } from '../types.js'
2
- import { bars, controls, fields, icons, tables } from '../util/defaults.js'
2
+ import { bars, controls, fields, icons, overlays, ripple, tables } from '../util/defaults.js'
3
3
  import { defineTheme } from '../util/defineTheme.js'
4
4
 
5
5
  /**
@@ -93,6 +93,42 @@ export const atlasVariables = {
93
93
  'vw-pop-scale': '1.08',
94
94
  'vw-pop-duration': '180ms',
95
95
  'vw-theme-transition': '320ms',
96
+ /**
97
+ * Overlays move at the same speed as everything else, which Vuetify's
98
+ * own 300ms fade does not. A menu opened two hundred times a day is the
99
+ * one surface where the difference between 140ms and 300ms stops being
100
+ * taste and becomes lag; the exit is quicker still, because a panel on
101
+ * its way out is already answered and only has to get off the screen.
102
+ */
103
+ 'vw-overlay-duration': '140ms',
104
+ 'vw-overlay-exit': '100ms',
105
+
106
+ /**
107
+ * Keyboard focus, four times the hover it has to be told apart from.
108
+ * Vuetify's 0.12 against a 0.04 hover is a difference you have to look
109
+ * for, and the person driving an admin panel from the keyboard is the
110
+ * one who cannot afford to.
111
+ */
112
+ 'focus-opacity': 0.16,
113
+ /**
114
+ * The tonal fill under chips and alerts — this theme's whole status
115
+ * vocabulary, and it carries it at `size="small"` and `density="compact"`
116
+ * where Vuetify's 0.12 thins out to nearly nothing.
117
+ */
118
+ 'activated-opacity': 0.14,
119
+ /**
120
+ * A form here disables half its fields depending on the other half, so
121
+ * "off" has to stay readable rather than dissolve. Vuetify's 0.38 puts a
122
+ * label under 3:1 on this ground; 0.45 keeps it legible and still
123
+ * unmistakably inactive.
124
+ */
125
+ 'disabled-opacity': 0.45,
126
+ /**
127
+ * A table waiting on its data is an everyday sight here, not an edge
128
+ * case. Vuetify derives the block from `border-opacity`, which at 0.22
129
+ * draws a row of grey slabs heavier than the data they stand in for.
130
+ */
131
+ 'vw-skeleton-opacity': '0.09',
96
132
  } as const
97
133
 
98
134
  /** Component defaults. Identical across the family. */
@@ -122,7 +158,36 @@ export const atlasDefaults: VuetiwatchDefaults[] = [
122
158
  * each button floating on its own elevation.
123
159
  */
124
160
  VBtnToggle: { variant: 'outlined', divided: true, density: 'compact' },
161
+ // Flush stacked rows rather than floating panels with gaps: a settings
162
+ // page is a list of settings, not a deck of cards.
163
+ VExpansionPanels: { variant: 'accordion' },
164
+ /**
165
+ * Half the controls on a console are icon-only, so a tooltip fires
166
+ * every time the cursor crosses the toolbar on its way somewhere else.
167
+ * A short wait means the tip appears when it was wanted and stays out
168
+ * of the way when it was not.
169
+ */
170
+ VTooltip: { openDelay: 400 },
125
171
  },
172
+ /**
173
+ * Nothing travels. A dropdown you open all day should not slide into
174
+ * place before it can be read, a dialog holds a form you start filling
175
+ * the moment it lands, and a tooltip that scales is a word changing size
176
+ * while you read it. Fading is the only motion here that does not ask to
177
+ * be waited out — and at 140ms it is barely motion at all.
178
+ */
179
+ overlays({
180
+ dialog: 'fade-transition',
181
+ menu: 'fade-transition',
182
+ tooltip: 'fade-transition',
183
+ }),
184
+ /**
185
+ * No ripple. It is an animation about the weight of a surface, and this
186
+ * theme draws none — but the real cost is that it puts 300ms of spreading
187
+ * ink between a click and the look of an answer, on the screen where that
188
+ * click gets repeated all day.
189
+ */
190
+ ripple(false),
126
191
  // Compact throughout: an admin screen is a working surface, and a field
127
192
  // at Vuetify's default height is a third taller than the row it sits in.
128
193
  fields({ variant: 'outlined', density: 'compact' }),
@@ -204,6 +269,16 @@ export const atlas = defineTheme({
204
269
  'shadow-color': '#0B101C',
205
270
  'vw-overlay-border': '1px solid rgba(var(--v-border-color), 0.1)',
206
271
  'vw-overlay-shadow': '0 8px 28px rgba(var(--v-shadow-color), 0.1)',
272
+ /**
273
+ * Ids, tokens and shortcuts are what an admin panel is full of, and
274
+ * Vuetify draws both on a grey that belongs to no theme. They take
275
+ * the same tinted band the table headers and filled rows use, so a
276
+ * key cap reads as part of the panel rather than pasted onto it.
277
+ */
278
+ 'theme-code': '#F5F8FD',
279
+ 'theme-on-code': '#0B101C',
280
+ 'theme-kbd': '#F5F8FD',
281
+ 'theme-on-kbd': '#0B101C',
207
282
  ...atlasVariables,
208
283
  },
209
284
  },
@@ -57,6 +57,11 @@ export const atlasDark = defineTheme({
57
57
  'shadow-color': '#000000',
58
58
  'vw-overlay-border': '1px solid rgba(var(--v-border-color), 0.16)',
59
59
  'vw-overlay-shadow': '0 12px 32px rgba(0, 0, 0, 0.5)',
60
+ // The same tinted band as the light variant, in this ground's register.
61
+ 'theme-code': '#151E35',
62
+ 'theme-on-code': '#EEF2F9',
63
+ 'theme-kbd': '#151E35',
64
+ 'theme-on-kbd': '#EEF2F9',
60
65
  ...atlasVariables,
61
66
  },
62
67
  },
@@ -53,6 +53,11 @@ export const atlasSepia = defineTheme({
53
53
  'shadow-color': '#3B332A',
54
54
  'vw-overlay-border': '1px solid rgba(var(--v-border-color), 0.12)',
55
55
  'vw-overlay-shadow': '0 8px 28px rgba(var(--v-shadow-color), 0.14)',
56
+ // The same tinted band as the light variant, in the warm register.
57
+ 'theme-code': '#F4EEE3',
58
+ 'theme-on-code': '#241E16',
59
+ 'theme-kbd': '#F4EEE3',
60
+ 'theme-on-kbd': '#241E16',
56
61
  ...atlasVariables,
57
62
  },
58
63
  },
@@ -1,4 +1,4 @@
1
- import { bars, fields, icons } from '../util/defaults.js'
1
+ import { bars, fields, icons, overlays } from '../util/defaults.js'
2
2
  import { defineTheme } from '../util/defineTheme.js'
3
3
 
4
4
  /**
@@ -86,6 +86,19 @@ export const aurora = defineTheme({
86
86
  'vw-pop-duration': '300ms',
87
87
  'vw-theme-transition': '560ms',
88
88
 
89
+ // The showcase theme, so the overlays show off too.
90
+ 'vw-overlay-duration': '300ms',
91
+ 'vw-overlay-exit': '200ms',
92
+ // Saturated ground, saturated states.
93
+ 'focus-opacity': 0.18,
94
+ 'activated-opacity': 0.16,
95
+ /**
96
+ * Vuetify tints a raised surface with plain white on a dark ground.
97
+ * Here the light in the room is violet, so the tint that stands for
98
+ * height is the theme's own hue rather than a neutral.
99
+ */
100
+ 'elevation-overlay-color': '#7C5CFF',
101
+
89
102
  // The line is the theme's own gradient, top to bottom.
90
103
  'vw-timeline-line': 'var(--v-vw-gradient)',
91
104
  'vw-timeline-line-width': '2px',
@@ -110,5 +123,12 @@ export const aurora = defineTheme({
110
123
  ratingFull: 'mdi-star',
111
124
  ratingEmpty: 'mdi-star-outline',
112
125
  }),
126
+ // Everything swells into place, at the length the rest of the theme
127
+ // moves on.
128
+ overlays({
129
+ dialog: 'scale-transition',
130
+ menu: 'scale-transition',
131
+ tooltip: 'scale-transition',
132
+ }),
113
133
  ],
114
134
  })