@vmz/ui 0.3.7 → 0.3.9

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 +249 -69
  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,18 +1,27 @@
1
1
  <template>
2
2
  <div data-vmz-ui="popover" :data-vmz-overlay-open="open" class="vmz-ui-popover-root">
3
3
  <div v-if="open" data-vmz-overlay="popover" data-vmz-overlay-owner="popover" :data-vmz-overlay-stack="stackLevel" class="vmz-ui-popover">
4
- <button type="button" data-vmz-overlay-layer="backdrop" aria-label="Dismiss popover" @click="dismiss" class="vmz-ui-popover__backdrop" />
5
- <div role="dialog" aria-modal="false" :aria-labelledby="titleId" tabindex="-1" data-vmz-overlay-layer="panel" data-vmz-focus="enter" :onKeyDown="onPanelKeyDown" class="vmz-ui-popover__panel">
6
- <h2 :id="titleId" class="vmz-ui-popover__title">
7
- {{ title }}
8
- </h2>
4
+ <button type="button" data-vmz-overlay-layer="backdrop" :aria-label="dismissLabel || closeLabel || title" @click="dismiss" class="vmz-ui-popover__backdrop" />
5
+ <div role="dialog" aria-modal="false" :aria-labelledby="title ? titleId : null" tabindex="-1" data-vmz-overlay-layer="panel" data-vmz-focus="enter" :onKeyDown="onPanelKeyDown" class="vmz-ui-popover__panel">
6
+ <span aria-hidden="true" data-vmz-popover="arrow" class="vmz-ui-popover__arrow" />
7
+ <header v-if="title || description" class="vmz-ui-popover__header">
8
+ <div class="vmz-ui-popover__heading">
9
+ <h2 v-if="title" :id="titleId" class="vmz-ui-popover__title">
10
+ {{ title }}
11
+ </h2>
12
+ <p v-if="description" class="vmz-ui-popover__description">
13
+ {{ description }}
14
+ </p>
15
+ </div>
16
+ <button type="button" data-vmz-focus="close" :aria-label="closeLabel || title" @click="dismiss" class="vmz-ui-popover__close">
17
+ <Icon name="action.close" size="md" decorative />
18
+ </button>
19
+ </header>
9
20
  <div class="vmz-ui-popover__body">
10
21
  <slot />
11
22
  </div>
12
23
  <div class="vmz-ui-popover__actions">
13
- <button type="button" data-vmz-focus="close" @click="dismiss" class="vmz-ui-popover__close">
14
- Close
15
- </button>
24
+ <slot name="actions" />
16
25
  </div>
17
26
  </div>
18
27
  </div>
@@ -60,55 +69,168 @@
60
69
  left: 50%;
61
70
  transform: translateX(-50%);
62
71
  box-sizing: border-box;
63
- width: min(20rem, calc(100vw - 2rem));
64
- min-height: 8rem;
65
- padding: 0.85rem 1rem 1rem;
66
- border: 1px solid var(--vmz-line-default);
67
- border-radius: var(--vmz-radius-md, 6px);
68
- background: var(--vmz-action-primary-foreground);
69
- color: var(--vmz-action-primary-active);
72
+ width: min(320px, calc(100vw - 32px));
73
+ padding: 12px;
74
+ border: 1px solid var(--vmz-line-subtle);
75
+ border-radius: var(--vmz-radius-lg);
76
+ background: var(--vmz-surface-paper);
77
+ color: var(--vmz-text-ink);
78
+ box-shadow: var(--vmz-shadow-popup);
70
79
  outline: none;
71
80
  pointer-events: auto;
81
+ animation: vmz-ui-popover-in var(--vmz-motion-overlay-duration)
82
+ var(--vmz-motion-overlay-easing);
83
+ }
84
+
85
+ .vmz-ui-popover__arrow {
86
+ position: absolute;
87
+ top: -5px;
88
+ left: 50%;
89
+ width: 8px;
90
+ height: 8px;
91
+ border-top: 1px solid var(--vmz-line-subtle);
92
+ border-left: 1px solid var(--vmz-line-subtle);
93
+ border-radius: 1px 0 0 0;
94
+ background: var(--vmz-surface-paper);
95
+ transform: translateX(-50%) rotate(45deg);
72
96
  }
73
97
 
74
98
  .vmz-ui-popover__panel:focus-visible {
75
- box-shadow: 0 0 0 3px var(--vmz-focus-ring);
99
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring), var(--vmz-shadow-popup);
100
+ }
101
+
102
+ .vmz-ui-popover__header {
103
+ display: flex;
104
+ align-items: flex-start;
105
+ gap: 8px;
106
+ }
107
+
108
+ .vmz-ui-popover__heading {
109
+ flex: 1 1 auto;
110
+ min-width: 0;
76
111
  }
77
112
 
78
113
  .vmz-ui-popover__title {
79
- margin: 0 0 0.5rem;
80
- font-size: 1rem;
114
+ margin: 0;
115
+ font-size: 14px;
116
+ font-weight: 600;
117
+ line-height: 22px;
118
+ color: var(--vmz-text-ink);
81
119
  }
82
120
 
83
- .vmz-ui-popover__body {
84
- margin-bottom: 0.75rem;
121
+ .vmz-ui-popover__description {
122
+ margin: 2px 0 0;
123
+ font-size: 14px;
124
+ line-height: 22px;
125
+ color: var(--vmz-text-tertiary);
85
126
  }
86
127
 
87
128
  .vmz-ui-popover__close {
88
- font: inherit;
89
- font-weight: 600;
90
- padding: 0.375rem 0.7rem;
91
- border: 1px solid transparent;
92
- border-radius: var(--vmz-radius-md, 6px);
129
+ flex: 0 0 auto;
130
+ display: inline-flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ width: 28px;
134
+ height: 28px;
135
+ margin: -4px -4px 0 0;
136
+ padding: 0;
137
+ border: 0;
138
+ border-radius: var(--vmz-radius-md);
139
+ background: transparent;
140
+ color: var(--vmz-text-steel);
93
141
  cursor: pointer;
94
- background: var(--vmz-action-primary-background);
95
- color: var(--vmz-action-primary-foreground);
142
+ outline: none;
143
+ transition:
144
+ color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing),
145
+ background-color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing);
146
+ }
147
+
148
+ .vmz-ui-popover__close:hover {
149
+ background: var(--vmz-surface-mist);
150
+ color: var(--vmz-text-ink);
96
151
  }
97
152
 
98
153
  .vmz-ui-popover__close:focus-visible {
99
154
  box-shadow: 0 0 0 3px var(--vmz-focus-ring);
100
155
  }
156
+
157
+ .vmz-ui-popover__body {
158
+ margin-top: 4px;
159
+ font-size: 14px;
160
+ line-height: 22px;
161
+ color: var(--vmz-text-ink);
162
+ }
163
+
164
+ .vmz-ui-popover__header + .vmz-ui-popover__body {
165
+ margin-top: 8px;
166
+ }
167
+
168
+ .vmz-ui-popover__body :where(a) {
169
+ color: var(--vmz-action-primary-background);
170
+ text-underline-offset: 2px;
171
+ }
172
+
173
+ .vmz-ui-popover__body :where(a):hover {
174
+ background: var(--vmz-action-primary-background);
175
+ color: var(--vmz-action-primary-foreground);
176
+ }
177
+
178
+ .vmz-ui-popover__body :where(a):active {
179
+ background: var(--vmz-action-primary-active);
180
+ }
181
+
182
+ .vmz-ui-popover__actions {
183
+ display: flex;
184
+ flex-wrap: wrap;
185
+ align-items: center;
186
+ justify-content: flex-end;
187
+ gap: 8px;
188
+ margin-top: 12px;
189
+ }
190
+
191
+ .vmz-ui-popover__actions:empty {
192
+ display: none;
193
+ }
194
+
195
+ .vmz-ui-popover__actions :where(button, a) {
196
+ min-height: var(--vmz-control-height, 32px);
197
+ }
198
+
199
+ @keyframes vmz-ui-popover-in {
200
+ from {
201
+ opacity: 0;
202
+ transform: translateX(-50%) translateY(-6px) scale(0.98);
203
+ }
204
+ to {
205
+ opacity: 1;
206
+ transform: translateX(-50%) translateY(0) scale(1);
207
+ }
208
+ }
209
+
210
+ @media (prefers-reduced-motion: reduce) {
211
+ .vmz-ui-popover__panel,
212
+ .vmz-ui-popover__close {
213
+ animation: none;
214
+ transition: none;
215
+ }
216
+ }
101
217
  </style>
102
218
  <script client>
103
219
  /**
104
220
  * VMZ UI — Popover (UI2).
105
221
  * Non-modal disclosure: Escape + outside dismiss + focus enter/restore.
106
- * Parent owns live `open`. Fixed min size for layout stability.
107
- * `stackLevel` raises z-index; Escape dismisses only the topmost stacked overlay.
222
+ * Parent owns live `open`. `stackLevel` raises z-index; Escape dismisses only
223
+ * the topmost stacked overlay.
224
+ *
225
+ * Appearance props: `title`, `description`. Visible copy is author-supplied;
226
+ * `closeLabel` / `dismissLabel` only name the icon button and backdrop.
108
227
  */
109
228
  export default class Popover {
110
229
  public open: boolean = false;
111
- public title: string = "Popover";
230
+ public title: string = "";
231
+ public description: string = "";
232
+ public closeLabel: string = "";
233
+ public dismissLabel: string = "";
112
234
  public titleId: string = "vmz-popover-title";
113
235
  public stackLevel: string = "0";
114
236
  public onClose: (() => void) | null = null;
@@ -140,10 +262,6 @@ export default class Popover {
140
262
  this.emit("close");
141
263
  if (typeof this.onClose === "function") this.onClose();
142
264
  }
143
- _stackValue() {
144
- const n = Number(this.stackLevel);
145
- return Number.isFinite(n) ? n : 0;
146
- }
147
265
  _isTopmostStack() {
148
266
  if (typeof document === "undefined") return true;
149
267
  const root = this.__vmzDomRoot;
@@ -13,27 +13,38 @@
13
13
  .vmz-ui-progress {
14
14
  display: flex;
15
15
  align-items: center;
16
- gap: 0.75rem;
16
+ gap: var(--vmz-space-3);
17
17
  width: 100%;
18
18
  }
19
+
19
20
  .vmz-ui-progress__track {
20
- height: 0.5rem;
21
+ height: var(--vmz-space-2);
21
22
  flex: 1;
22
23
  overflow: hidden;
23
- border-radius: 999px;
24
+ border-radius: var(--vmz-radius-pill);
24
25
  background: var(--vmz-surface-mist);
25
26
  }
27
+
26
28
  .vmz-ui-progress__track span {
27
29
  display: block;
28
30
  height: 100%;
29
31
  border-radius: inherit;
30
32
  background: var(--vmz-action-primary-background);
31
- transition: width var(--vmz-motion-control-duration, 0.16s);
33
+ transition: width var(--vmz-motion-control-duration) var(--vmz-motion-control-easing);
32
34
  }
35
+
33
36
  .vmz-ui-progress__text {
34
- min-width: 2.5rem;
37
+ min-width: var(--vmz-space-7);
35
38
  color: var(--vmz-text-steel);
36
39
  font-size: 0.875rem;
40
+ font-variant-numeric: tabular-nums;
41
+ line-height: 1.5715;
42
+ }
43
+
44
+ @media (prefers-reduced-motion: reduce) {
45
+ .vmz-ui-progress__track span {
46
+ transition: none;
47
+ }
37
48
  }
38
49
  </style>
39
50
  <script client>
@@ -5,71 +5,170 @@
5
5
  </template>
6
6
  <style>
7
7
  .vmz-ui-prose {
8
- display: flex;
9
- flex-direction: column;
10
- gap: 1rem;
11
- max-width: 42rem;
8
+ max-width: 46rem;
12
9
  color: var(--vmz-text-ink);
13
10
  font-family: var(--vmz-font-sans);
14
- line-height: 1.65;
11
+ font-size: 1rem;
12
+ line-height: 1.625;
15
13
  }
16
-
17
- .vmz-ui-prose :where(h1, h2, h3) {
14
+ .vmz-ui-prose :where(h1, h2, h3, h4, h5, h6, p, ul, ol, dl, blockquote, pre, figure, table, hr) {
18
15
  margin: 0;
19
- font-family: var(--vmz-font-display);
20
- font-weight: 700;
21
- letter-spacing: -0.02em;
22
- line-height: 1.2;
16
+ }
17
+ .vmz-ui-prose > * + * {
18
+ margin-top: 1em;
19
+ }
20
+ .vmz-ui-prose :where(div, section, article) > * + * {
21
+ margin-top: 1em;
22
+ }
23
+ .vmz-ui-prose :where(h1, h2, h3, h4, h5, h6) {
24
+ margin: 1.5em 0 0.5em;
23
25
  color: var(--vmz-text-ink);
24
- scroll-margin-top: 1.25rem;
26
+ font-family: var(--vmz-font-display);
27
+ font-weight: 600;
28
+ letter-spacing: -0.01em;
29
+ line-height: 1.25;
30
+ scroll-margin-top: 5rem;
25
31
  }
26
-
27
32
  .vmz-ui-prose :where(h1) {
28
- font-size: clamp(1.85rem, 4vw, 2.35rem);
33
+ font-size: 1.875rem;
34
+ line-height: 1.2;
29
35
  }
30
-
31
36
  .vmz-ui-prose :where(h2) {
32
- font-size: 1.35rem;
33
- margin-top: 0.5rem;
37
+ font-size: 1.5rem;
38
+ line-height: 1.33;
34
39
  }
35
-
36
40
  .vmz-ui-prose :where(h3) {
37
- font-size: 1.1rem;
41
+ font-size: 1.25rem;
42
+ line-height: 1.4;
43
+ }
44
+ .vmz-ui-prose :where(h4) {
45
+ font-size: 1.0625rem;
46
+ line-height: 1.47;
47
+ }
48
+ .vmz-ui-prose :where(h5) {
49
+ font-size: 1rem;
50
+ line-height: 1.5;
51
+ }
52
+ .vmz-ui-prose :where(h6) {
53
+ font-size: 0.875rem;
54
+ line-height: 1.57;
55
+ color: var(--vmz-text-tertiary);
56
+ }
57
+ .vmz-ui-prose > :first-child,
58
+ .vmz-ui-prose :where(div, section, article) > :first-child {
59
+ margin-top: 0;
60
+ }
61
+ .vmz-ui-prose > :last-child,
62
+ .vmz-ui-prose :where(div, section, article) > :last-child {
63
+ margin-bottom: 0;
38
64
  }
39
-
40
65
  .vmz-ui-prose :where(p) {
41
- margin: 0;
42
66
  color: var(--vmz-text-ink);
43
67
  }
44
-
45
68
  .vmz-ui-prose :where(p.lead) {
46
- font-size: 1.05rem;
47
69
  color: var(--vmz-text-steel);
70
+ font-size: 1.125rem;
71
+ line-height: 1.6;
48
72
  }
49
-
50
73
  .vmz-ui-prose :where(ul, ol) {
51
- margin: 0;
52
- padding-left: 1.25rem;
74
+ padding-left: 1.25em;
53
75
  color: var(--vmz-text-ink);
54
76
  }
55
-
56
77
  .vmz-ui-prose :where(li + li) {
57
- margin-top: 0.375rem;
78
+ margin-top: 0.35em;
79
+ }
80
+ .vmz-ui-prose :where(dl) {
81
+ display: grid;
82
+ gap: 0.35em;
83
+ }
84
+ .vmz-ui-prose :where(dt) {
85
+ font-weight: 600;
86
+ }
87
+ .vmz-ui-prose :where(dd) {
88
+ margin: 0;
89
+ padding-left: 1.25em;
90
+ color: var(--vmz-text-steel);
58
91
  }
59
-
60
92
  .vmz-ui-prose :where(a) {
61
93
  color: var(--vmz-action-primary-background);
94
+ text-decoration: underline;
95
+ text-decoration-thickness: 1px;
62
96
  text-underline-offset: 0.15em;
97
+ transition: color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1));
63
98
  }
64
-
65
99
  .vmz-ui-prose :where(a:hover) {
66
100
  color: var(--vmz-action-primary-hover);
67
101
  }
68
-
102
+ .vmz-ui-prose :where(a:focus-visible) {
103
+ border-radius: var(--vmz-radius-xs, 2px);
104
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
105
+ outline: none;
106
+ }
107
+ .vmz-ui-prose :where(strong) {
108
+ font-weight: 600;
109
+ }
110
+ .vmz-ui-prose :where(small) {
111
+ color: var(--vmz-text-tertiary);
112
+ font-size: 0.875em;
113
+ }
114
+ .vmz-ui-prose :where(blockquote) {
115
+ padding: 0.25em 0 0.25em 1em;
116
+ border-left: 3px solid var(--vmz-line-default);
117
+ color: var(--vmz-text-steel);
118
+ }
119
+ .vmz-ui-prose :where(blockquote) :where(p) {
120
+ color: inherit;
121
+ }
69
122
  .vmz-ui-prose :where(hr) {
123
+ margin: 2em 0;
70
124
  border: 0;
71
125
  border-top: 1px solid var(--vmz-line-default);
72
- margin: 0.5rem 0;
126
+ }
127
+ .vmz-ui-prose :where(img, video) {
128
+ max-width: 100%;
129
+ height: auto;
130
+ border-radius: var(--vmz-radius-md, 6px);
131
+ }
132
+ .vmz-ui-prose :where(pre:not(.vmz-ui-code-block__pre)) {
133
+ padding: var(--vmz-space-4, 1rem);
134
+ border-radius: var(--vmz-radius-lg, 8px);
135
+ background: var(--vmz-surface-code);
136
+ color: var(--vmz-text-on-brand);
137
+ font-family: var(--vmz-font-mono);
138
+ font-size: 0.875rem;
139
+ line-height: 1.5714;
140
+ overflow-x: auto;
141
+ }
142
+ .vmz-ui-prose :where(pre:not(.vmz-ui-code-block__pre)) :where(code) {
143
+ padding: 0;
144
+ background: transparent;
145
+ color: inherit;
146
+ font-size: inherit;
147
+ }
148
+ .vmz-ui-prose :where(p, li, td, th, blockquote, dd) :where(code, kbd, samp) {
149
+ padding: 0.15em 0.35em;
150
+ border-radius: var(--vmz-radius-xs, 2px);
151
+ background: var(--vmz-surface-mist);
152
+ color: var(--vmz-text-ink);
153
+ font-family: var(--vmz-font-mono);
154
+ font-size: 0.875em;
155
+ }
156
+ .vmz-ui-prose :where(table) {
157
+ width: 100%;
158
+ border-collapse: collapse;
159
+ font-size: 0.9375rem;
160
+ line-height: 1.5;
161
+ }
162
+ .vmz-ui-prose :where(th, td) {
163
+ padding: 0.625em 0.75em;
164
+ border-bottom: 1px solid var(--vmz-line-subtle);
165
+ text-align: left;
166
+ vertical-align: top;
167
+ }
168
+ .vmz-ui-prose :where(thead th) {
169
+ color: var(--vmz-text-tertiary);
170
+ font-weight: 600;
171
+ border-bottom-color: var(--vmz-line-default);
73
172
  }
74
173
  </style>
75
174
  <script client>
@@ -5,22 +5,44 @@
5
5
  </template>
6
6
  <style>
7
7
  .vmz-ui-query-form {
8
- display: flex;
9
- flex-wrap: wrap;
10
- align-items: flex-end;
11
- gap: var(--vmz-density-compact-gap);
12
- padding: var(--vmz-density-compact-padding-y) var(--vmz-density-compact-padding-x);
8
+ display: grid;
9
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
10
+ align-items: end;
11
+ gap: 0.75rem;
12
+ padding: 1rem;
13
13
  border: 1px solid var(--vmz-line-default);
14
- border-radius: var(--vmz-radius-md, 6px);
14
+ border-radius: var(--vmz-radius-lg, 8px);
15
+ background: var(--vmz-surface-paper);
16
+ }
17
+
18
+ .vmz-ui-query-form .vmz-ui-field__control,
19
+ .vmz-ui-query-form .vmz-ui-select__control,
20
+ .vmz-ui-query-form .vmz-ui-btn {
21
+ min-height: 2rem;
22
+ }
23
+
24
+ .vmz-ui-query-form > :has(.vmz-ui-btn),
25
+ .vmz-ui-query-form > button.vmz-ui-btn {
26
+ justify-self: end;
27
+ }
28
+
29
+ .vmz-ui-query-form .vmz-ui-field {
30
+ min-width: 0;
31
+ }
32
+
33
+ @media (max-width: 640px) {
34
+ .vmz-ui-query-form {
35
+ grid-template-columns: 1fr;
36
+ }
15
37
  }
16
38
  </style>
17
39
  <script client>
18
40
  /**
19
- * VMZ UI — QueryForm (UI5 Console Surface).
20
- * Dense multi-field query landmark; spacing from density.compact.* tokens.
41
+ * VMZ UI — QueryForm (Console composition).
42
+ * Dense multi-field query landmark; single column on narrow screens.
21
43
  */
22
44
  export default class QueryForm {
23
- public label: string = "Query";
45
+ public label: string = "";
24
46
  public onSubmit: (() => void) | null = null;
25
47
  onSubmitGuard(ev) {
26
48
  if (ev && typeof ev.preventDefault === "function") ev.preventDefault();