@vmz/ui 0.3.5 → 0.3.7

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 (42) hide show
  1. package/package.json +2 -2
  2. package/presets/web-surface.v0.json +19 -7
  3. package/src/components/Accordion.vmz +2 -2
  4. package/src/components/AppShell.vmz +79 -32
  5. package/src/components/Autocomplete.vmz +3 -3
  6. package/src/components/Badge.vmz +1 -1
  7. package/src/components/Breadcrumb.vmz +3 -3
  8. package/src/components/BulkActions.vmz +2 -2
  9. package/src/components/Button.vmz +38 -17
  10. package/src/components/Callout.vmz +1 -1
  11. package/src/components/Card.vmz +19 -5
  12. package/src/components/Checkbox.vmz +2 -2
  13. package/src/components/CodeBlock.vmz +93 -19
  14. package/src/components/ConsoleShell.vmz +21 -21
  15. package/src/components/DataTable.vmz +4 -4
  16. package/src/components/DatePicker.vmz +9 -9
  17. package/src/components/Dialog.vmz +26 -7
  18. package/src/components/Drawer.vmz +3 -3
  19. package/src/components/Dropdown.vmz +181 -16
  20. package/src/components/Empty.vmz +1 -1
  21. package/src/components/Field.vmz +4 -4
  22. package/src/components/FormItem.vmz +1 -1
  23. package/src/components/Link.vmz +38 -4
  24. package/src/components/List.vmz +2 -2
  25. package/src/components/Menu.vmz +4 -4
  26. package/src/components/Pagination.vmz +7 -5
  27. package/src/components/Popover.vmz +3 -3
  28. package/src/components/Prose.vmz +1 -1
  29. package/src/components/RadioGroup.vmz +4 -4
  30. package/src/components/Segmented.vmz +1 -1
  31. package/src/components/Select.vmz +12 -12
  32. package/src/components/Steps.vmz +1 -1
  33. package/src/components/Switch.vmz +2 -2
  34. package/src/components/Table.vmz +45 -13
  35. package/src/components/Tabs.vmz +3 -3
  36. package/src/components/Tag.vmz +5 -2
  37. package/src/components/TextArea.vmz +4 -4
  38. package/src/components/Timeline.vmz +2 -2
  39. package/src/components/Toc.vmz +3 -3
  40. package/src/components/Tooltip.vmz +4 -4
  41. package/src/components/Tree.vmz +4 -4
  42. package/src/components/Upload.vmz +23 -13
package/package.json CHANGED
@@ -82,7 +82,7 @@
82
82
  "license": "MIT",
83
83
  "name": "@vmz/ui",
84
84
  "peerDependencies": {
85
- "@vmz/ui-icons": "0.3.5"
85
+ "@vmz/ui-icons": "0.3.7"
86
86
  },
87
87
  "peerDependenciesMeta": {
88
88
  "@vmz/ui-icons": {
@@ -98,5 +98,5 @@
98
98
  "url": "git+https://github.com/doki-land/vmz-framework.git"
99
99
  },
100
100
  "type": "module",
101
- "version": "0.3.5"
101
+ "version": "0.3.7"
102
102
  }
@@ -4,7 +4,13 @@
4
4
  "package": "@vmz/ui",
5
5
  "materialize": "Copy or resolve into application /designs Style Theme (tokens/*.json + themes/*.json). Preset is not a second runtime theme.",
6
6
  "foundation": {
7
- "radius": { "sm": "2px", "md": "6px", "lg": "8px" },
7
+ "radius": {
8
+ "xs": "2px",
9
+ "sm": "4px",
10
+ "md": "6px",
11
+ "lg": "8px",
12
+ "pill": "999px"
13
+ },
8
14
  "controlHeight": { "sm": "1.5rem", "middle": "2rem", "lg": "2.5rem" },
9
15
  "layoutMaxWidth": "75rem",
10
16
  "surfacePage": "#F5F5F5",
@@ -14,22 +20,28 @@
14
20
  "lineSubtle": "#F0F0F0",
15
21
  "shadowCard": "none",
16
22
  "shadowCardHover": "0 1px 2px -2px rgba(0,0,0,.08), 0 3px 6px 0 rgba(0,0,0,.06), 0 5px 12px 4px rgba(0,0,0,.04)",
17
- "shadowPopup": "0 6px 16px 0 rgba(0,0,0,.08), 0 3px 6px -4px rgba(0,0,0,.12), 0 9px 28px 8px rgba(0,0,0,.05)"
23
+ "shadowPopup": "0 6px 16px 0 rgba(0,0,0,.08), 0 3px 6px -4px rgba(0,0,0,.12), 0 9px 28px 8px rgba(0,0,0,.05)",
24
+ "elevation": {
25
+ "note": "Floating layers only. Cards stay flat per visualIntent; interactive surfaces lift on hover, never at rest.",
26
+ "float-sm": "0 1px 2px 0 rgba(0,0,0,.03), 0 1px 6px -1px rgba(0,0,0,.02), 0 2px 4px 0 rgba(0,0,0,.02)",
27
+ "float-md": "0 6px 16px 0 rgba(0,0,0,.08), 0 3px 6px -4px rgba(0,0,0,.12), 0 9px 28px 8px rgba(0,0,0,.05)",
28
+ "float-lg": "0 6px 16px 0 rgba(0,0,0,.08), 0 3px 6px -4px rgba(0,0,0,.12), 0 9px 28px 8px rgba(0,0,0,.05), 0 12px 48px 16px rgba(0,0,0,.03)"
29
+ }
18
30
  },
19
31
  "density": {
20
32
  "control": {
21
33
  "padding-y": "0.25rem",
22
- "padding-x": "0.75rem",
34
+ "padding-x": "0.9375rem",
23
35
  "gap": "0.5rem"
24
36
  },
25
37
  "compact": {
26
38
  "padding-y": "0.125rem",
27
- "padding-x": "0.5rem",
28
- "gap": "0.35rem"
39
+ "padding-x": "0.625rem",
40
+ "gap": "0.375rem"
29
41
  },
30
42
  "dense": {
31
43
  "padding-y": "0",
32
- "padding-x": "0.35rem",
44
+ "padding-x": "0.4375rem",
33
45
  "gap": "0.25rem"
34
46
  }
35
47
  },
@@ -44,5 +56,5 @@
44
56
  "dark": "themes/dark.json overlay",
45
57
  "high-contrast": "themes/high-contrast.json overlay — stronger ink/line/focus"
46
58
  },
47
- "visualIntent": "Modern commercial product chrome: neutral structure borders (never brand outline on every box), flat cards, soft focus rings, quiet page fill. Brand color is for actions/selection — not scaffolding."
59
+ "visualIntent": "Modern commercial product chrome: neutral structure borders (never brand outline on every box), flat cards, soft focus rings, quiet page fill. Brand color is for actions/selection — not scaffolding. Elevation is reserved for floating layers and hover lift; nothing casts a resting shadow. Motion eases, never jumps: control transitions use a decelerate curve, overlays use a fast-in curve, and reduced-motion is honored."
48
60
  }
@@ -16,7 +16,7 @@
16
16
  .vmz-ui-accordion {
17
17
  display: flex;
18
18
  flex-direction: column;
19
- gap: 0.35rem;
19
+ gap: 0.375rem;
20
20
  max-width: 36rem;
21
21
  border: 1px solid var(--vmz-line-default);
22
22
  border-radius: var(--vmz-radius-md, 6px);
@@ -56,7 +56,7 @@
56
56
  }
57
57
 
58
58
  .vmz-ui-accordion__trigger:focus-visible {
59
- box-shadow: inset 0 0 0 2px var(--vmz-focus-ring);
59
+ box-shadow: inset 0 0 0 3px var(--vmz-focus-ring);
60
60
  }
61
61
 
62
62
  .vmz-ui-accordion__trigger[aria-expanded="true"] {
@@ -6,10 +6,13 @@
6
6
  {{ brand }}
7
7
  </a>
8
8
  <nav :aria-label="navLabel" class="vmz-ui-app-shell__nav">
9
- <a v-for="item in nav" :key="item.id" :href="item.href" :data-vmz-nav="item.id">
9
+ <a v-for="item in nav" :key="item.id" :href="item.href" :data-vmz-nav="item.id" :data-active="item.id === activeId ? 'true' : 'false'" :aria-current="item.id === activeId ? 'page' : null" class="vmz-ui-app-shell__nav-item">
10
10
  {{ item.title }}
11
11
  </a>
12
12
  </nav>
13
+ <div class="vmz-ui-app-shell__actions">
14
+ <slot name="actions" />
15
+ </div>
13
16
  </div>
14
17
  </header>
15
18
  <main data-vmz-shell="main" class="vmz-ui-app-shell__main">
@@ -31,83 +34,124 @@
31
34
  top: 0;
32
35
  z-index: 30;
33
36
  border-bottom: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
34
- background: var(--vmz-surface-paper);
37
+ background: color-mix(in srgb, var(--vmz-surface-paper) 88%, transparent);
38
+ backdrop-filter: saturate(180%) blur(0.5rem);
39
+ -webkit-backdrop-filter: saturate(180%) blur(0.5rem);
35
40
  }
41
+
36
42
  .vmz-ui-app-shell__header-inner {
37
43
  width: min(var(--vmz-layout-max-width, 75rem), calc(100% - 2rem));
38
- min-height: 3rem;
44
+ min-height: 3.5rem;
39
45
  margin: 0 auto;
40
46
  display: flex;
41
47
  align-items: center;
42
- justify-content: space-between;
43
48
  gap: 1.5rem;
44
49
  }
45
50
 
46
51
  .vmz-ui-app-shell__brand {
52
+ flex: none;
53
+ color: var(--vmz-text-ink);
47
54
  font-family: var(--vmz-font-sans);
48
- font-weight: 600;
49
- font-size: 1.125rem;
50
- letter-spacing: 0;
55
+ font-size: 1.0625rem;
56
+ font-weight: 650;
57
+ letter-spacing: -0.01em;
51
58
  text-decoration: none;
52
- color: var(--vmz-text-ink);
59
+ border-radius: var(--vmz-radius-sm, 4px);
60
+ outline: none;
61
+ transition: color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1));
62
+ }
63
+
64
+ .vmz-ui-app-shell__brand:hover {
65
+ color: var(--vmz-action-primary-background);
53
66
  }
54
67
 
55
68
  .vmz-ui-app-shell__brand:focus-visible {
56
- outline: none;
57
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
69
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
58
70
  }
59
71
 
60
72
  .vmz-ui-app-shell__nav {
61
73
  display: flex;
74
+ flex: 1 1 auto;
62
75
  flex-wrap: wrap;
63
- gap: 0.25rem 0.15rem;
76
+ gap: 0.125rem;
77
+ min-width: 0;
64
78
  }
65
79
 
66
- .vmz-ui-app-shell__nav a {
80
+ .vmz-ui-app-shell__nav-item {
81
+ position: relative;
82
+ padding: 0.375rem 0.75rem;
83
+ border-radius: var(--vmz-radius-sm, 4px);
84
+ color: var(--vmz-text-steel);
67
85
  font: inherit;
68
86
  font-size: 0.875rem;
69
- font-weight: 400;
87
+ font-weight: 500;
88
+ line-height: 1.4286;
70
89
  text-decoration: none;
71
- color: var(--vmz-text-ink);
72
- padding: 0.25rem 0.75rem;
73
- border-radius: var(--vmz-radius-md, 6px);
90
+ white-space: nowrap;
91
+ outline: none;
92
+ transition:
93
+ color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1)),
94
+ background-color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1));
74
95
  }
75
96
 
76
- .vmz-ui-app-shell__nav a:hover {
77
- color: var(--vmz-action-primary-background);
97
+ .vmz-ui-app-shell__nav-item:hover {
98
+ color: var(--vmz-text-ink);
78
99
  background: var(--vmz-surface-mist, #fafafa);
79
100
  }
80
101
 
81
- .vmz-ui-app-shell__nav a:focus-visible {
82
- outline: none;
83
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
102
+ .vmz-ui-app-shell__nav-item:focus-visible {
103
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
104
+ }
105
+
106
+ /* Current section: ink emphasis plus a hairline marker, no brand fill. */
107
+ .vmz-ui-app-shell__nav-item[data-active="true"] {
108
+ color: var(--vmz-text-ink);
109
+ font-weight: 600;
110
+ }
111
+
112
+ .vmz-ui-app-shell__nav-item[data-active="true"]::after {
113
+ content: "";
114
+ position: absolute;
115
+ inset: auto 0.75rem 0;
116
+ height: 2px;
117
+ border-radius: var(--vmz-radius-pill, 999px);
118
+ background: var(--vmz-action-primary-background);
119
+ }
120
+
121
+ .vmz-ui-app-shell__actions {
122
+ flex: none;
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 0.5rem;
126
+ margin-left: auto;
84
127
  }
85
128
 
86
129
  .vmz-ui-app-shell__main {
87
130
  flex: 1;
88
131
  width: min(var(--vmz-layout-max-width, 75rem), calc(100% - 2rem));
89
132
  margin: 0 auto;
90
- padding: 1.5rem 0 2.5rem;
133
+ padding: 1.75rem 0 3rem;
91
134
  display: flex;
92
135
  flex-direction: column;
93
136
  gap: 1rem;
94
137
  }
138
+
95
139
  @media (max-width: 720px) {
96
140
  .vmz-ui-app-shell__header-inner {
97
- min-height: 3.5rem;
98
- align-items: flex-start;
99
- flex-direction: column;
100
- gap: 0.35rem;
101
- padding: 0.7rem 0;
141
+ flex-wrap: wrap;
142
+ gap: 0.5rem 0.75rem;
143
+ padding: 0.625rem 0;
102
144
  }
103
145
  .vmz-ui-app-shell__nav {
104
- width: 100%;
146
+ order: 3;
147
+ flex-basis: 100%;
105
148
  overflow-x: auto;
106
149
  flex-wrap: nowrap;
107
- padding-bottom: 0.2rem;
150
+ padding-bottom: 0.125rem;
151
+ scrollbar-width: none;
108
152
  }
109
- .vmz-ui-app-shell__nav a {
110
- white-space: nowrap;
153
+ .vmz-ui-app-shell__nav::-webkit-scrollbar {
154
+ display: none;
111
155
  }
112
156
  .vmz-ui-app-shell__main {
113
157
  padding-top: 1.25rem;
@@ -117,12 +161,15 @@
117
161
  <script client>
118
162
  /**
119
163
  * VMZ UI — AppShell (Commercial composition).
120
- * Landmark header/nav + main slot. Parent supplies nav items; no private theme.
164
+ * Landmark header/nav + main slot. `nav` stays flat link-only; non-nav controls
165
+ * go into the named `actions` slot. Parent supplies copy; no private theme.
121
166
  */
122
167
  export default class AppShell {
123
168
  public brand: string = "VMZ";
124
169
  public homeHref: string = "/";
125
170
  public navLabel: string = "Primary";
171
+ /** Id of the nav item representing the current page, for `aria-current` + marker. */
172
+ public activeId: string = "";
126
173
  /** @type {{ id: string, title: string, href: string }[]} */
127
174
  public nav: {
128
175
  id: string;
@@ -25,7 +25,7 @@
25
25
  position: relative;
26
26
  display: flex;
27
27
  flex-direction: column;
28
- gap: 0.35rem;
28
+ gap: 0.375rem;
29
29
  max-width: 28rem;
30
30
  }
31
31
 
@@ -49,7 +49,7 @@
49
49
  }
50
50
 
51
51
  .vmz-ui-autocomplete__control:focus-visible {
52
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
52
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
53
53
  }
54
54
 
55
55
  .vmz-ui-autocomplete__control:disabled {
@@ -70,7 +70,7 @@
70
70
 
71
71
  .vmz-ui-autocomplete__option {
72
72
  margin: 0;
73
- padding: 0.45rem 0.75rem;
73
+ padding: 0.5rem 0.75rem;
74
74
  cursor: pointer;
75
75
  font-weight: 600;
76
76
  color: var(--vmz-text-ink);
@@ -8,7 +8,7 @@
8
8
  display: inline-flex;
9
9
  align-items: center;
10
10
  gap: 0.25rem;
11
- padding: 0.15rem 0.45rem;
11
+ padding: 0.125rem 0.5rem;
12
12
  border: 1px solid var(--vmz-line-default);
13
13
  border-radius: var(--vmz-radius-md, 6px);
14
14
  font-size: 0.75rem;
@@ -20,7 +20,7 @@
20
20
  .vmz-ui-breadcrumb__list {
21
21
  display: flex;
22
22
  flex-wrap: wrap;
23
- gap: 0.35rem 0.55rem;
23
+ gap: 0.375rem 0.5rem;
24
24
  margin: 0;
25
25
  padding: 0;
26
26
  list-style: none;
@@ -30,7 +30,7 @@
30
30
  .vmz-ui-breadcrumb__item {
31
31
  display: inline-flex;
32
32
  align-items: center;
33
- gap: 0.55rem;
33
+ gap: 0.5rem;
34
34
  font-weight: 600;
35
35
  }
36
36
 
@@ -48,7 +48,7 @@
48
48
 
49
49
  .vmz-ui-breadcrumb__link:focus-visible {
50
50
  outline: none;
51
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
51
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
52
52
  }
53
53
 
54
54
  .vmz-ui-breadcrumb__current {
@@ -14,8 +14,8 @@
14
14
  flex-wrap: wrap;
15
15
  align-items: center;
16
16
  justify-content: space-between;
17
- gap: 0.65rem 1rem;
18
- padding: 0.65rem 0.85rem;
17
+ gap: 0.625rem 1rem;
18
+ padding: 0.625rem 0.85rem;
19
19
  border: 1px solid var(--vmz-line-default);
20
20
  border-radius: var(--vmz-radius-md, 6px);
21
21
  background: transparent;
@@ -13,34 +13,38 @@
13
13
  display: inline-flex;
14
14
  align-items: center;
15
15
  justify-content: center;
16
- gap: 0.35rem;
16
+ gap: 0.375rem;
17
+ /* Inline control: never stretch when the parent is a flex column (shells, card bodies). */
18
+ width: fit-content;
17
19
  min-height: var(--vmz-control-height, 2rem);
18
20
  padding: var(--vmz-density-control-padding-y) var(--vmz-density-control-padding-x);
19
21
  border: 1px solid transparent;
20
22
  border-radius: var(--vmz-radius-md, 6px);
21
23
  font: inherit;
22
24
  font-size: 0.875rem;
23
- font-weight: 400;
25
+ font-weight: 500;
24
26
  line-height: 1.5715;
27
+ white-space: nowrap;
25
28
  cursor: pointer;
26
29
  background: var(--vmz-action-primary-background);
27
30
  color: var(--vmz-action-primary-foreground);
28
31
  outline: none;
29
- box-shadow: none;
32
+ box-shadow: 0 2px 0 color-mix(in srgb, var(--vmz-action-primary-background) 12%, transparent);
30
33
  transition:
31
- background-color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing),
32
- border-color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing),
33
- color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing);
34
+ background-color var(--vmz-motion-control-duration, 120ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1)),
35
+ border-color var(--vmz-motion-control-duration, 120ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1)),
36
+ color var(--vmz-motion-control-duration, 120ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1)),
37
+ box-shadow var(--vmz-motion-control-duration, 120ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1));
34
38
  }
35
39
 
36
40
  .vmz-ui-btn[data-size="small"] {
37
41
  min-height: var(--vmz-control-height-sm, 1.5rem);
38
- padding: 0 0.5rem;
39
- font-size: 0.875rem;
42
+ padding: 0 0.625rem;
43
+ font-size: 0.8125rem;
40
44
  }
41
45
  .vmz-ui-btn[data-size="large"] {
42
46
  min-height: var(--vmz-control-height-lg, 2.5rem);
43
- padding: 0.4rem 1rem;
47
+ padding: 0.4375rem 1.125rem;
44
48
  font-size: 1rem;
45
49
  }
46
50
  .vmz-ui-btn[data-block="true"] {
@@ -52,9 +56,10 @@
52
56
  .vmz-ui-btn__spinner {
53
57
  width: 1em;
54
58
  height: 1em;
55
- border: 2px solid currentColor;
59
+ border: 1.5px solid currentColor;
56
60
  border-right-color: transparent;
57
61
  border-radius: 50%;
62
+ opacity: 0.8;
58
63
  animation: vmz-btn-spin 0.7s linear infinite;
59
64
  }
60
65
  @keyframes vmz-btn-spin {
@@ -69,35 +74,37 @@
69
74
 
70
75
  .vmz-ui-btn:active:not(:disabled) {
71
76
  background: var(--vmz-action-primary-active);
77
+ transform: translateY(0.5px);
72
78
  }
73
79
 
74
80
  .vmz-ui-btn[data-variant="secondary"] {
75
81
  background: var(--vmz-action-secondary-background);
76
82
  color: var(--vmz-action-secondary-foreground);
77
83
  border-color: var(--vmz-action-secondary-border);
84
+ box-shadow: none;
78
85
  }
79
86
  .vmz-ui-btn[data-variant="default"] {
80
- background: #fff;
87
+ background: var(--vmz-surface-paper);
81
88
  color: var(--vmz-text-ink);
82
89
  border-color: var(--vmz-line-default);
83
90
  box-shadow: none;
84
91
  }
85
92
  .vmz-ui-btn[data-variant="default"]:hover:not(:disabled) {
86
- color: var(--vmz-action-primary-background);
87
- border-color: var(--vmz-action-primary-background);
88
- background: #fff;
93
+ color: var(--vmz-action-primary-hover);
94
+ border-color: var(--vmz-action-primary-hover);
95
+ background: var(--vmz-surface-paper);
89
96
  }
90
97
  .vmz-ui-btn[data-variant="text"],
91
98
  .vmz-ui-btn[data-variant="link"] {
92
99
  min-height: auto;
93
- padding: 0.25rem 0.35rem;
100
+ padding: 0.25rem 0.5rem;
94
101
  border-color: transparent;
95
102
  background: transparent;
96
103
  color: var(--vmz-action-primary-background);
97
104
  box-shadow: none;
98
105
  }
99
106
  .vmz-ui-btn[data-variant="dashed"] {
100
- background: #fff;
107
+ background: var(--vmz-surface-paper);
101
108
  color: var(--vmz-text-ink);
102
109
  border: 1px dashed var(--vmz-line-default);
103
110
  box-shadow: none;
@@ -141,12 +148,23 @@
141
148
  }
142
149
 
143
150
  .vmz-ui-btn:focus-visible {
144
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
151
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
152
+ }
153
+
154
+ .vmz-ui-btn[data-variant="default"]:focus-visible,
155
+ .vmz-ui-btn[data-variant="dashed"]:focus-visible,
156
+ .vmz-ui-btn[data-variant="secondary"]:focus-visible,
157
+ .vmz-ui-btn[data-variant="ghost"]:focus-visible,
158
+ .vmz-ui-btn[data-variant="text"]:focus-visible,
159
+ .vmz-ui-btn[data-variant="link"]:focus-visible {
160
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
145
161
  }
146
162
 
147
163
  .vmz-ui-btn:disabled {
148
164
  opacity: 0.55;
149
165
  cursor: not-allowed;
166
+ box-shadow: none;
167
+ transform: none;
150
168
  }
151
169
 
152
170
  :where([data-density="compact"]) .vmz-ui-btn {
@@ -161,6 +179,9 @@
161
179
  .vmz-ui-btn {
162
180
  transition: none;
163
181
  }
182
+ .vmz-ui-btn:active:not(:disabled) {
183
+ transform: none;
184
+ }
164
185
  }
165
186
  </style>
166
187
  <script client>
@@ -15,7 +15,7 @@
15
15
  .vmz-ui-callout {
16
16
  display: flex;
17
17
  flex-direction: column;
18
- gap: 0.45rem;
18
+ gap: 0.5rem;
19
19
  padding: var(--vmz-density-control-padding-y) var(--vmz-density-control-padding-x);
20
20
  border: 1px solid var(--vmz-status-info-accent);
21
21
  border-left-width: 1px;
@@ -18,7 +18,7 @@
18
18
  display: flex;
19
19
  flex-direction: column;
20
20
  gap: 0.75rem;
21
- padding: 1rem 1.25rem;
21
+ padding: 1.25rem 1.5rem;
22
22
  border: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
23
23
  border-radius: var(--vmz-radius-lg, 8px);
24
24
  background: var(--vmz-surface-paper);
@@ -30,19 +30,33 @@
30
30
  }
31
31
  .vmz-ui-card[data-hoverable="true"] {
32
32
  transition:
33
- border-color var(--vmz-motion-control-duration, 0.16s),
34
- box-shadow var(--vmz-motion-control-duration, 0.16s);
33
+ border-color var(--vmz-motion-emphasis-duration, 240ms) var(--vmz-motion-emphasis-easing, cubic-bezier(0.16, 1, 0.3, 1)),
34
+ box-shadow var(--vmz-motion-emphasis-duration, 240ms) var(--vmz-motion-emphasis-easing, cubic-bezier(0.16, 1, 0.3, 1)),
35
+ transform var(--vmz-motion-emphasis-duration, 240ms) var(--vmz-motion-emphasis-easing, cubic-bezier(0.16, 1, 0.3, 1));
35
36
  }
36
37
  .vmz-ui-card[data-hoverable="true"]:hover {
38
+ border-color: var(--vmz-line-default);
37
39
  box-shadow: var(
38
40
  --vmz-shadow-card-hover,
39
41
  0 1px 2px -2px rgba(0, 0, 0, 0.08),
40
42
  0 3px 6px 0 rgba(0, 0, 0, 0.06)
41
43
  );
44
+ transform: translateY(-1px);
45
+ }
46
+ .vmz-ui-card[data-hoverable="true"]:focus-within {
47
+ border-color: var(--vmz-action-primary-background);
48
+ }
49
+ @media (prefers-reduced-motion: reduce) {
50
+ .vmz-ui-card[data-hoverable="true"] {
51
+ transition: none;
52
+ }
53
+ .vmz-ui-card[data-hoverable="true"]:hover {
54
+ transform: none;
55
+ }
42
56
  }
43
57
  .vmz-ui-card[data-size="small"] {
44
58
  gap: 0.5rem;
45
- padding: 0.75rem 1rem;
59
+ padding: 0.875rem 1rem;
46
60
  }
47
61
 
48
62
  :where([data-density="compact"]) .vmz-ui-card {
@@ -58,7 +72,7 @@
58
72
  .vmz-ui-card__header {
59
73
  display: flex;
60
74
  flex-direction: column;
61
- gap: 0.35rem;
75
+ gap: 0.375rem;
62
76
  }
63
77
 
64
78
  .vmz-ui-card__title {
@@ -10,7 +10,7 @@
10
10
  .vmz-ui-checkbox {
11
11
  display: inline-flex;
12
12
  align-items: center;
13
- gap: 0.45rem;
13
+ gap: 0.5rem;
14
14
  font: inherit;
15
15
  cursor: pointer;
16
16
  }
@@ -23,7 +23,7 @@
23
23
  }
24
24
 
25
25
  .vmz-ui-checkbox__input:focus-visible {
26
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
26
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
27
27
  }
28
28
 
29
29
  .vmz-ui-checkbox__input:disabled {