@vmz/ui 0.3.7 → 0.3.8

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 (68) hide show
  1. package/README.md +2 -0
  2. package/contracts/token-requirements.v0.json +58 -1
  3. package/package.json +5 -2
  4. package/presets/web-surface.v0.json +14 -12
  5. package/src/components/Accordion.vmz +49 -16
  6. package/src/components/Alert.vmz +125 -28
  7. package/src/components/AppShell.vmz +121 -56
  8. package/src/components/Autocomplete.vmz +136 -29
  9. package/src/components/Avatar.vmz +20 -12
  10. package/src/components/Badge.vmz +18 -26
  11. package/src/components/Breadcrumb.vmz +28 -14
  12. package/src/components/BulkActions.vmz +13 -8
  13. package/src/components/Button.vmz +68 -44
  14. package/src/components/Callout.vmz +128 -27
  15. package/src/components/Card.vmz +67 -46
  16. package/src/components/Checkbox.vmz +81 -5
  17. package/src/components/CodeBlock.vmz +59 -27
  18. package/src/components/Collapse.vmz +64 -11
  19. package/src/components/ConsoleShell.vmz +217 -63
  20. package/src/components/Content.vmz +15 -1
  21. package/src/components/DataTable.vmz +123 -23
  22. package/src/components/DatePicker.vmz +171 -79
  23. package/src/components/Descriptions.vmz +90 -0
  24. package/src/components/Dialog.vmz +133 -50
  25. package/src/components/Divider.vmz +8 -1
  26. package/src/components/Drawer.vmz +131 -40
  27. package/src/components/Dropdown.vmz +147 -49
  28. package/src/components/Empty.vmz +56 -14
  29. package/src/components/Field.vmz +78 -23
  30. package/src/components/FilterBar.vmz +34 -4
  31. package/src/components/Flex.vmz +3 -1
  32. package/src/components/Footer.vmz +6 -3
  33. package/src/components/Form.vmz +41 -0
  34. package/src/components/FormItem.vmz +2 -3
  35. package/src/components/Grid.vmz +6 -3
  36. package/src/components/Header.vmz +193 -6
  37. package/src/components/Layout.vmz +3 -1
  38. package/src/components/Link.vmz +20 -9
  39. package/src/components/List.vmz +35 -13
  40. package/src/components/Menu.vmz +198 -25
  41. package/src/components/Message.vmz +167 -0
  42. package/src/components/Notification.vmz +132 -37
  43. package/src/components/Pagination.vmz +186 -20
  44. package/src/components/Popconfirm.vmz +287 -0
  45. package/src/components/Popover.vmz +152 -34
  46. package/src/components/Progress.vmz +16 -5
  47. package/src/components/Prose.vmz +131 -32
  48. package/src/components/QueryForm.vmz +31 -9
  49. package/src/components/RadioGroup.vmz +91 -11
  50. package/src/components/Result.vmz +60 -27
  51. package/src/components/Segmented.vmz +46 -11
  52. package/src/components/Select.vmz +174 -87
  53. package/src/components/Sider.vmz +120 -7
  54. package/src/components/Skeleton.vmz +9 -7
  55. package/src/components/Space.vmz +9 -3
  56. package/src/components/Spinner.vmz +5 -4
  57. package/src/components/Steps.vmz +40 -25
  58. package/src/components/Switch.vmz +48 -15
  59. package/src/components/Table.vmz +130 -25
  60. package/src/components/Tabs.vmz +28 -13
  61. package/src/components/Tag.vmz +29 -12
  62. package/src/components/TextArea.vmz +32 -25
  63. package/src/components/Timeline.vmz +65 -30
  64. package/src/components/Toc.vmz +45 -29
  65. package/src/components/Tooltip.vmz +70 -21
  66. package/src/components/Tree.vmz +48 -25
  67. package/src/components/Typography.vmz +23 -8
  68. package/src/components/Upload.vmz +191 -96
@@ -1,23 +1,29 @@
1
1
  <template>
2
2
  <div data-vmz-ui="app-shell" class="vmz-ui-app-shell">
3
- <header data-vmz-shell="header" class="vmz-ui-app-shell__header">
3
+ <header data-vmz-shell="header" :onKeyDown="onHeaderKeyDown" class="vmz-ui-app-shell__header">
4
4
  <div class="vmz-ui-app-shell__header-inner">
5
- <a :href="homeHref" class="vmz-ui-app-shell__brand">
5
+ <a v-if="brand" :href="homeHref" class="vmz-ui-app-shell__brand">
6
6
  {{ brand }}
7
7
  </a>
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" :data-active="item.id === activeId ? 'true' : 'false'" :aria-current="item.id === activeId ? 'page' : null" class="vmz-ui-app-shell__nav-item">
8
+ <nav :id="navId" :aria-label="navLabel" :data-open="menuOpen ? 'true' : null" class="vmz-ui-app-shell__nav">
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" @click="closeMenu" class="vmz-ui-app-shell__nav-item">
10
10
  {{ item.title }}
11
11
  </a>
12
12
  </nav>
13
13
  <div class="vmz-ui-app-shell__actions">
14
14
  <slot name="actions" />
15
15
  </div>
16
+ <button type="button" :aria-label="menuLabel ? menuLabel : navLabel" :aria-expanded="menuOpen ? 'true' : 'false'" :aria-controls="navId" @click="toggleMenu" class="vmz-ui-app-shell__menu">
17
+ <Icon :name="menuOpen ? 'action.close' : 'action.menu'" size="md" decorative />
18
+ </button>
16
19
  </div>
17
20
  </header>
18
21
  <main data-vmz-shell="main" class="vmz-ui-app-shell__main">
19
22
  <slot />
20
23
  </main>
24
+ <footer v-if="footer" data-vmz-shell="footer" class="vmz-ui-app-shell__footer">
25
+ {{ footer }}
26
+ </footer>
21
27
  </div>
22
28
  </template>
23
29
  <style>
@@ -26,26 +32,25 @@
26
32
  flex-direction: column;
27
33
  min-height: 100%;
28
34
  color: var(--vmz-text-ink);
29
- background: transparent;
35
+ background: var(--vmz-surface-page);
36
+ font-family: var(--vmz-font-sans);
30
37
  }
31
38
 
32
39
  .vmz-ui-app-shell__header {
33
40
  position: sticky;
34
41
  top: 0;
35
42
  z-index: 30;
36
- border-bottom: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
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);
43
+ border-bottom: 1px solid var(--vmz-line-subtle);
44
+ background: var(--vmz-surface-paper);
40
45
  }
41
46
 
42
47
  .vmz-ui-app-shell__header-inner {
43
- width: min(var(--vmz-layout-max-width, 75rem), calc(100% - 2rem));
44
- min-height: 3.5rem;
48
+ width: min(var(--vmz-layout-max-width, 75rem), calc(100% - (var(--vmz-layout-gutter, 1rem) * 2)));
49
+ height: var(--vmz-layout-header-height, 4rem);
45
50
  margin: 0 auto;
46
51
  display: flex;
47
52
  align-items: center;
48
- gap: 1.5rem;
53
+ gap: var(--vmz-space-6, 2rem);
49
54
  }
50
55
 
51
56
  .vmz-ui-app-shell__brand {
@@ -53,7 +58,8 @@
53
58
  color: var(--vmz-text-ink);
54
59
  font-family: var(--vmz-font-sans);
55
60
  font-size: 1.0625rem;
56
- font-weight: 650;
61
+ font-weight: 600;
62
+ line-height: 1.25;
57
63
  letter-spacing: -0.01em;
58
64
  text-decoration: none;
59
65
  border-radius: var(--vmz-radius-sm, 4px);
@@ -70,91 +76,133 @@
70
76
  }
71
77
 
72
78
  .vmz-ui-app-shell__nav {
73
- display: flex;
74
- flex: 1 1 auto;
75
- flex-wrap: wrap;
76
- gap: 0.125rem;
79
+ flex: 0 1 auto;
77
80
  min-width: 0;
81
+ height: 100%;
82
+ display: flex;
83
+ align-items: center;
84
+ gap: var(--vmz-space-5, 1.5rem);
78
85
  }
79
86
 
80
87
  .vmz-ui-app-shell__nav-item {
81
88
  position: relative;
82
- padding: 0.375rem 0.75rem;
83
- border-radius: var(--vmz-radius-sm, 4px);
89
+ display: inline-flex;
90
+ align-items: center;
91
+ height: 100%;
92
+ box-sizing: border-box;
93
+ border-bottom: 2px solid transparent;
84
94
  color: var(--vmz-text-steel);
85
- font: inherit;
86
95
  font-size: 0.875rem;
87
96
  font-weight: 500;
88
- line-height: 1.4286;
97
+ line-height: 1;
89
98
  text-decoration: none;
90
99
  white-space: nowrap;
91
100
  outline: none;
92
101
  transition:
93
102
  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));
103
+ border-color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1));
95
104
  }
96
105
 
97
106
  .vmz-ui-app-shell__nav-item:hover {
98
- color: var(--vmz-text-ink);
99
- background: var(--vmz-surface-mist, #fafafa);
100
- }
101
-
102
- .vmz-ui-app-shell__nav-item:focus-visible {
103
- box-shadow: 0 0 0 3px var(--vmz-focus-ring);
107
+ color: var(--vmz-action-primary-background);
104
108
  }
105
109
 
106
- /* Current section: ink emphasis plus a hairline marker, no brand fill. */
107
110
  .vmz-ui-app-shell__nav-item[data-active="true"] {
108
- color: var(--vmz-text-ink);
109
- font-weight: 600;
111
+ color: var(--vmz-action-primary-background);
112
+ border-bottom-color: var(--vmz-action-primary-background);
110
113
  }
111
114
 
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);
115
+ .vmz-ui-app-shell__nav-item:focus-visible {
116
+ border-radius: var(--vmz-radius-sm, 4px);
117
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
119
118
  }
120
119
 
121
120
  .vmz-ui-app-shell__actions {
122
121
  flex: none;
123
122
  display: flex;
124
123
  align-items: center;
125
- gap: 0.5rem;
124
+ gap: var(--vmz-space-2, 0.5rem);
126
125
  margin-left: auto;
127
126
  }
128
127
 
128
+ .vmz-ui-app-shell__menu {
129
+ display: none;
130
+ }
131
+
129
132
  .vmz-ui-app-shell__main {
130
133
  flex: 1;
131
- width: min(var(--vmz-layout-max-width, 75rem), calc(100% - 2rem));
134
+ box-sizing: border-box;
135
+ width: min(var(--vmz-layout-max-width, 75rem), calc(100% - (var(--vmz-layout-gutter, 1rem) * 2)));
132
136
  margin: 0 auto;
133
- padding: 1.75rem 0 3rem;
137
+ padding: var(--vmz-space-6, 2rem) 0 var(--vmz-space-8, 4rem);
134
138
  display: flex;
135
139
  flex-direction: column;
136
- gap: 1rem;
140
+ gap: var(--vmz-space-6, 2rem);
141
+ }
142
+
143
+ .vmz-ui-app-shell__footer {
144
+ border-top: 1px solid var(--vmz-line-subtle);
145
+ background: var(--vmz-surface-paper);
146
+ padding: var(--vmz-space-6, 2rem) var(--vmz-space-5, 1.5rem);
147
+ color: var(--vmz-text-tertiary);
148
+ font-size: 0.8125rem;
149
+ line-height: 1.5;
150
+ text-align: center;
137
151
  }
138
152
 
139
153
  @media (max-width: 720px) {
140
154
  .vmz-ui-app-shell__header-inner {
141
- flex-wrap: wrap;
142
- gap: 0.5rem 0.75rem;
143
- padding: 0.625rem 0;
155
+ height: var(--vmz-layout-header-height-compact, 3.5rem);
156
+ gap: var(--vmz-space-3, 0.75rem);
144
157
  }
145
158
  .vmz-ui-app-shell__nav {
146
- order: 3;
147
- flex-basis: 100%;
148
- overflow-x: auto;
149
- flex-wrap: nowrap;
150
- padding-bottom: 0.125rem;
151
- scrollbar-width: none;
152
- }
153
- .vmz-ui-app-shell__nav::-webkit-scrollbar {
154
159
  display: none;
160
+ position: absolute;
161
+ top: 100%;
162
+ left: 0;
163
+ right: 0;
164
+ height: auto;
165
+ flex-direction: column;
166
+ align-items: stretch;
167
+ gap: 0;
168
+ padding: var(--vmz-space-2, 0.5rem) var(--vmz-layout-gutter, 1rem) var(--vmz-space-4, 1rem);
169
+ border-bottom: 1px solid var(--vmz-line-subtle);
170
+ background: var(--vmz-surface-paper);
171
+ box-shadow: var(--vmz-shadow-popup);
172
+ }
173
+ .vmz-ui-app-shell__nav[data-open="true"] {
174
+ display: flex;
175
+ }
176
+ .vmz-ui-app-shell__nav-item {
177
+ height: 2.5rem;
178
+ padding: 0 var(--vmz-space-1, 0.25rem);
179
+ border-bottom: 0;
180
+ }
181
+ .vmz-ui-app-shell__menu {
182
+ flex: none;
183
+ display: inline-flex;
184
+ align-items: center;
185
+ justify-content: center;
186
+ width: 2.5rem;
187
+ height: 2.5rem;
188
+ padding: 0;
189
+ border: 0;
190
+ border-radius: var(--vmz-radius-md, 6px);
191
+ background: transparent;
192
+ color: var(--vmz-text-ink);
193
+ cursor: pointer;
194
+ outline: none;
195
+ transition: background-color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1));
196
+ }
197
+ .vmz-ui-app-shell__menu:hover {
198
+ background: var(--vmz-surface-mist);
199
+ }
200
+ .vmz-ui-app-shell__menu:focus-visible {
201
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
155
202
  }
156
203
  .vmz-ui-app-shell__main {
157
- padding-top: 1.25rem;
204
+ padding: var(--vmz-space-5, 1.5rem) 0 var(--vmz-space-7, 3rem);
205
+ gap: var(--vmz-space-5, 1.5rem);
158
206
  }
159
207
  }
160
208
  </style>
@@ -165,16 +213,33 @@
165
213
  * go into the named `actions` slot. Parent supplies copy; no private theme.
166
214
  */
167
215
  export default class AppShell {
168
- public brand: string = "VMZ";
216
+ public brand: string = "";
169
217
  public homeHref: string = "/";
170
- public navLabel: string = "Primary";
218
+ public navLabel: string = "";
219
+ public menuLabel: string = "";
171
220
  /** Id of the nav item representing the current page, for `aria-current` + marker. */
172
221
  public activeId: string = "";
222
+ public navId: string = "vmz-ui-app-shell-nav";
223
+ /** Optional footer copy; the footer band only renders when supplied. */
224
+ public footer: string = "";
173
225
  /** @type {{ id: string, title: string, href: string }[]} */
174
226
  public nav: {
175
227
  id: string;
176
228
  title: string;
177
229
  href: string;
178
230
  }[] = [];
231
+ menuOpen = false;
232
+
233
+ toggleMenu() {
234
+ this.menuOpen = !this.menuOpen;
235
+ }
236
+
237
+ closeMenu() {
238
+ if (this.menuOpen) this.menuOpen = false;
239
+ }
240
+
241
+ onHeaderKeyDown(e) {
242
+ if (e && e.key === "Escape") this.closeMenu();
243
+ }
179
244
  }
180
245
  </script>
@@ -3,15 +3,25 @@
3
3
  <label v-if="label" :for="controlId" class="vmz-ui-autocomplete__label">
4
4
  {{ label }}
5
5
  </label>
6
- <input :id="controlId" type="text" role="combobox" autocomplete="off" aria-autocomplete="list" :aria-expanded="openAttr" :aria-controls="listId" :aria-invalid="error ? 'true' : 'false'" :aria-describedby="describedBy" :value="value" :disabled="disabled" @input="onDomInput" :onKeyDown="onKeyDown" class="vmz-ui-autocomplete__control" />
7
- <ul v-if="listOpen" :id="listId" role="listbox" data-vmz-autocomplete="list" @click="onListClick" class="vmz-ui-autocomplete__list">
8
- <li v-for="opt in options" :key="opt.value" role="option" :data-vmz-option="opt.value" tabindex="-1" class="vmz-ui-autocomplete__option">
9
- {{ opt.label }}
10
- </li>
11
- </ul>
12
- <p v-if="showEmpty" data-vmz-autocomplete="empty" class="vmz-ui-autocomplete__empty">
13
- {{ emptyText }}
14
- </p>
6
+ <div class="vmz-ui-autocomplete__field">
7
+ <div class="vmz-ui-autocomplete__control-wrap">
8
+ <Icon name="action.search" size="md" decorative class="vmz-ui-autocomplete__search-icon" />
9
+ <input :id="controlId" type="text" role="combobox" autocomplete="off" aria-autocomplete="list" :aria-expanded="openAttr" :aria-controls="listId" :aria-invalid="error ? 'true' : 'false'" :aria-describedby="describedBy" :value="value" :placeholder="placeholder" :disabled="disabled" @input="onDomInput" :onKeyDown="onKeyDown" class="vmz-ui-autocomplete__control" />
10
+ </div>
11
+ <div v-if="listOpen || (showEmpty && emptyText)" class="vmz-ui-autocomplete__panel">
12
+ <ul v-if="listOpen" :id="listId" role="listbox" data-vmz-autocomplete="list" @click="onListClick" class="vmz-ui-autocomplete__list">
13
+ <li v-for="opt in options" :key="opt.value" role="option" :data-vmz-option="opt.value" :aria-selected="opt.value === value ? 'true' : 'false'" tabindex="-1" :class='"vmz-ui-autocomplete__option" + (opt.value === value ? " is-on" : "")'>
14
+ <span class="vmz-ui-autocomplete__option-label">
15
+ {{ opt.label }}
16
+ </span>
17
+ <Icon v-if="opt.value === value" name="action.check" size="md" decorative class="vmz-ui-autocomplete__option-check" />
18
+ </li>
19
+ </ul>
20
+ <p v-if="showEmpty && emptyText" data-vmz-autocomplete="empty" class="vmz-ui-autocomplete__empty">
21
+ {{ emptyText }}
22
+ </p>
23
+ </div>
24
+ </div>
15
25
  <p v-if="description" :id="descriptionId" class="vmz-ui-autocomplete__description">
16
26
  {{ description }}
17
27
  </p>
@@ -25,55 +35,142 @@
25
35
  position: relative;
26
36
  display: flex;
27
37
  flex-direction: column;
28
- gap: 0.375rem;
38
+ gap: var(--vmz-space-2);
39
+ width: 100%;
29
40
  max-width: 28rem;
30
41
  }
31
42
 
43
+ .vmz-ui-autocomplete__field {
44
+ position: relative;
45
+ display: flex;
46
+ flex-direction: column;
47
+ width: 100%;
48
+ }
49
+
32
50
  .vmz-ui-autocomplete__label {
33
51
  font: inherit;
34
- font-weight: 600;
52
+ font-weight: 500;
53
+ font-size: 0.875rem;
54
+ line-height: 1.5715;
55
+ color: var(--vmz-text-ink);
56
+ }
57
+
58
+ .vmz-ui-autocomplete__control-wrap {
59
+ position: relative;
60
+ display: flex;
61
+ align-items: center;
62
+ width: 100%;
63
+ }
64
+
65
+ .vmz-ui-autocomplete__search-icon {
66
+ position: absolute;
67
+ left: var(--vmz-density-control-padding-x);
68
+ z-index: 1;
69
+ color: var(--vmz-text-tertiary);
70
+ pointer-events: none;
35
71
  }
36
72
 
37
73
  .vmz-ui-autocomplete__control {
38
- font: inherit;
74
+ box-sizing: border-box;
75
+ width: 100%;
76
+ min-height: var(--vmz-control-height);
77
+ font-family: inherit;
78
+ font-size: 0.875rem;
79
+ line-height: 1.5715;
39
80
  padding: var(--vmz-density-control-padding-y) var(--vmz-density-control-padding-x);
81
+ padding-left: calc(
82
+ var(--vmz-density-control-padding-x) + var(--vmz-space-4) + var(--vmz-space-1)
83
+ );
40
84
  border: 1px solid var(--vmz-line-default);
41
- border-radius: var(--vmz-radius-md, 6px);
42
- background: transparent;
43
- color: inherit;
85
+ border-radius: var(--vmz-radius-lg);
86
+ background: var(--vmz-surface-paper);
87
+ color: var(--vmz-text-ink);
44
88
  outline: none;
89
+ transition:
90
+ border-color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing),
91
+ box-shadow var(--vmz-motion-control-duration) var(--vmz-motion-control-easing),
92
+ background-color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing);
93
+ }
94
+
95
+ .vmz-ui-autocomplete__control::placeholder {
96
+ color: var(--vmz-text-tertiary);
97
+ opacity: 1;
45
98
  }
46
99
 
47
100
  .vmz-ui-autocomplete[data-invalid="true"] .vmz-ui-autocomplete__control {
48
101
  border-color: var(--vmz-status-danger-accent);
49
102
  }
50
103
 
104
+ .vmz-ui-autocomplete[data-invalid="true"] .vmz-ui-autocomplete__control:hover:not(:disabled),
105
+ .vmz-ui-autocomplete[data-invalid="true"] .vmz-ui-autocomplete__control:focus-visible {
106
+ border-color: var(--vmz-status-danger-foreground);
107
+ }
108
+
109
+ .vmz-ui-autocomplete__control:hover:not(:disabled):not(:focus-visible) {
110
+ border-color: var(--vmz-action-primary-hover);
111
+ }
112
+
51
113
  .vmz-ui-autocomplete__control:focus-visible {
114
+ border-color: var(--vmz-action-primary-background);
52
115
  box-shadow: 0 0 0 3px var(--vmz-focus-ring);
53
116
  }
54
117
 
55
118
  .vmz-ui-autocomplete__control:disabled {
56
- opacity: 0.55;
119
+ opacity: 0.6;
120
+ color: var(--vmz-text-muted);
57
121
  cursor: not-allowed;
122
+ background: var(--vmz-surface-mist);
123
+ }
124
+
125
+ .vmz-ui-autocomplete__panel {
126
+ position: absolute;
127
+ z-index: 40;
128
+ top: calc(100% + var(--vmz-space-1));
129
+ left: 0;
130
+ right: 0;
131
+ padding: var(--vmz-space-1);
132
+ border: 1px solid var(--vmz-line-default);
133
+ border-radius: var(--vmz-radius-lg);
134
+ background: var(--vmz-surface-paper);
135
+ box-shadow: var(--vmz-shadow-popup);
58
136
  }
59
137
 
60
138
  .vmz-ui-autocomplete__list {
61
139
  list-style: none;
62
140
  margin: 0;
63
- padding: 0.25rem 0;
64
- border: 1px solid var(--vmz-line-default);
65
- border-radius: var(--vmz-radius-md, 6px);
66
- background: var(--vmz-surface-paper);
141
+ padding: 0;
67
142
  max-height: 12rem;
68
143
  overflow: auto;
69
144
  }
70
145
 
71
146
  .vmz-ui-autocomplete__option {
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: space-between;
150
+ gap: var(--vmz-space-2);
151
+ box-sizing: border-box;
152
+ min-height: var(--vmz-control-height);
72
153
  margin: 0;
73
- padding: 0.5rem 0.75rem;
74
- cursor: pointer;
75
- font-weight: 600;
154
+ padding: 0 var(--vmz-density-control-padding-x);
155
+ border-radius: var(--vmz-radius-md);
76
156
  color: var(--vmz-text-ink);
157
+ font-size: 0.875rem;
158
+ line-height: 1.5715;
159
+ cursor: pointer;
160
+ outline: none;
161
+ }
162
+
163
+ .vmz-ui-autocomplete__option-label {
164
+ flex: 1 1 auto;
165
+ min-width: 0;
166
+ overflow: hidden;
167
+ text-overflow: ellipsis;
168
+ white-space: nowrap;
169
+ }
170
+
171
+ .vmz-ui-autocomplete__option-check {
172
+ flex: 0 0 auto;
173
+ color: var(--vmz-action-primary-background);
77
174
  }
78
175
 
79
176
  .vmz-ui-autocomplete__option:hover,
@@ -82,22 +179,31 @@
82
179
  outline: none;
83
180
  }
84
181
 
182
+ .vmz-ui-autocomplete__option.is-on {
183
+ background: var(--vmz-action-primary-soft);
184
+ color: var(--vmz-action-primary-active);
185
+ }
186
+
85
187
  .vmz-ui-autocomplete__empty {
86
188
  margin: 0;
87
- color: var(--vmz-text-steel);
88
- font-size: 0.9em;
189
+ padding: var(--vmz-space-2) var(--vmz-density-control-padding-x);
190
+ color: var(--vmz-text-tertiary);
191
+ font-size: 0.875rem;
192
+ line-height: 1.5715;
89
193
  }
90
194
 
91
195
  .vmz-ui-autocomplete__description {
92
196
  margin: 0;
93
- opacity: 0.75;
94
- font-size: 0.9em;
197
+ color: var(--vmz-text-steel);
198
+ font-size: 0.875rem;
199
+ line-height: 1.5715;
95
200
  }
96
201
 
97
202
  .vmz-ui-autocomplete__error {
98
203
  margin: 0;
99
204
  color: var(--vmz-status-danger-foreground);
100
- font-size: 0.9em;
205
+ font-size: 0.875rem;
206
+ line-height: 1.5715;
101
207
  }
102
208
  </style>
103
209
  <script client>
@@ -111,6 +217,7 @@ export default class Autocomplete {
111
217
  public description: string = "";
112
218
  public error: string = "";
113
219
  public value: string = "";
220
+ public placeholder: string = "";
114
221
  public options: Array<{
115
222
  value: string;
116
223
  label: string;
@@ -118,7 +225,7 @@ export default class Autocomplete {
118
225
  public listOpen: boolean = false;
119
226
  public openAttr: string = "false";
120
227
  public showEmpty: boolean = false;
121
- public emptyText: string = "No matches";
228
+ public emptyText: string = "";
122
229
  public disabled: boolean = false;
123
230
  public invalidAttr: string = "false";
124
231
  public controlId: string = "vmz-autocomplete";
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <span data-vmz-ui="avatar" :data-size="size" :aria-label="label" class="vmz-ui-avatar">
3
- <img v-if="src" :src="src" alt />
3
+ <img v-if="src" :src="src" :alt="label" />
4
4
  <span v-if="!src">
5
5
  {{ text }}
6
6
  </span>
@@ -9,26 +9,34 @@
9
9
  <style>
10
10
  .vmz-ui-avatar {
11
11
  display: inline-flex;
12
+ flex: 0 0 auto;
12
13
  align-items: center;
13
14
  justify-content: center;
14
- width: 2rem;
15
- height: 2rem;
15
+ box-sizing: border-box;
16
+ width: var(--vmz-control-height);
17
+ height: var(--vmz-control-height);
16
18
  overflow: hidden;
17
- border-radius: 50%;
18
- background: color-mix(in srgb, var(--vmz-action-primary-background, #1677ff) 14%, white);
19
- color: var(--vmz-action-primary-active, #0958d9);
20
- font-weight: 650;
19
+ border-radius: var(--vmz-radius-pill);
20
+ background: var(--vmz-action-primary-soft);
21
+ color: var(--vmz-action-primary-active);
22
+ font-size: 0.875rem;
23
+ font-weight: 500;
24
+ line-height: 1;
25
+ user-select: none;
21
26
  }
27
+
22
28
  .vmz-ui-avatar[data-size="small"] {
23
- width: 1.5rem;
24
- height: 1.5rem;
29
+ width: var(--vmz-control-height-sm);
30
+ height: var(--vmz-control-height-sm);
25
31
  font-size: 0.75rem;
26
32
  }
33
+
27
34
  .vmz-ui-avatar[data-size="large"] {
28
- width: 2.75rem;
29
- height: 2.75rem;
30
- font-size: 1.1rem;
35
+ width: var(--vmz-control-height-lg);
36
+ height: var(--vmz-control-height-lg);
37
+ font-size: 1rem;
31
38
  }
39
+
32
40
  .vmz-ui-avatar img {
33
41
  width: 100%;
34
42
  height: 100%;
@@ -7,54 +7,46 @@
7
7
  .vmz-ui-badge {
8
8
  display: inline-flex;
9
9
  align-items: center;
10
- gap: 0.25rem;
11
- padding: 0.125rem 0.5rem;
10
+ gap: var(--vmz-space-1);
11
+ max-width: 100%;
12
+ padding: 0 var(--vmz-space-2);
12
13
  border: 1px solid var(--vmz-line-default);
13
- border-radius: var(--vmz-radius-md, 6px);
14
+ border-radius: var(--vmz-radius-sm);
14
15
  font-size: 0.75rem;
15
- font-weight: 700;
16
- letter-spacing: 0.04em;
17
- text-transform: uppercase;
18
- line-height: 1.2;
16
+ font-weight: 500;
17
+ line-height: 1.6667;
18
+ white-space: nowrap;
19
19
  background: var(--vmz-surface-mist);
20
- color: var(--vmz-text-ink);
20
+ color: var(--vmz-text-steel);
21
21
  }
22
22
 
23
23
  .vmz-ui-badge[data-tone="brand"] {
24
- border-color: color-mix(
25
- in srgb,
26
- var(--vmz-action-primary-background) 35%,
27
- var(--vmz-line-default)
28
- );
29
- background: color-mix(
30
- in srgb,
31
- var(--vmz-action-primary-background) 12%,
32
- var(--vmz-surface-paper)
33
- );
24
+ border-color: var(--vmz-action-primary-hover);
25
+ background: var(--vmz-action-primary-soft);
34
26
  color: var(--vmz-action-primary-active);
35
27
  }
36
28
 
37
29
  .vmz-ui-badge[data-tone="info"] {
38
- border-color: var(--vmz-status-info-accent);
39
- background: color-mix(in srgb, var(--vmz-status-info-accent) 12%, var(--vmz-surface-paper));
30
+ border-color: var(--vmz-status-info-border);
31
+ background: var(--vmz-status-info-background);
40
32
  color: var(--vmz-status-info-foreground);
41
33
  }
42
34
 
43
35
  .vmz-ui-badge[data-tone="success"] {
44
- border-color: var(--vmz-status-success-accent);
45
- background: color-mix(in srgb, var(--vmz-status-success-accent) 12%, var(--vmz-surface-paper));
36
+ border-color: var(--vmz-status-success-border);
37
+ background: var(--vmz-status-success-background);
46
38
  color: var(--vmz-status-success-foreground);
47
39
  }
48
40
 
49
41
  .vmz-ui-badge[data-tone="warning"] {
50
- border-color: var(--vmz-status-warning-accent);
51
- background: color-mix(in srgb, var(--vmz-status-warning-accent) 12%, var(--vmz-surface-paper));
42
+ border-color: var(--vmz-status-warning-border);
43
+ background: var(--vmz-status-warning-background);
52
44
  color: var(--vmz-status-warning-foreground);
53
45
  }
54
46
 
55
47
  .vmz-ui-badge[data-tone="danger"] {
56
- border-color: var(--vmz-status-danger-accent);
57
- background: color-mix(in srgb, var(--vmz-status-danger-accent) 12%, var(--vmz-surface-paper));
48
+ border-color: var(--vmz-status-danger-border);
49
+ background: var(--vmz-status-danger-background);
58
50
  color: var(--vmz-status-danger-foreground);
59
51
  }
60
52
  </style>