@vmz/ui 0.3.6 → 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 +53 -51
  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 +127 -94
  6. package/src/components/Alert.vmz +125 -28
  7. package/src/components/AppShell.vmz +125 -57
  8. package/src/components/Autocomplete.vmz +261 -154
  9. package/src/components/Avatar.vmz +20 -12
  10. package/src/components/Badge.vmz +62 -70
  11. package/src/components/Breadcrumb.vmz +86 -72
  12. package/src/components/BulkActions.vmz +56 -51
  13. package/src/components/Button.vmz +237 -211
  14. package/src/components/Callout.vmz +178 -77
  15. package/src/components/Card.vmz +141 -120
  16. package/src/components/Checkbox.vmz +131 -55
  17. package/src/components/CodeBlock.vmz +77 -30
  18. package/src/components/Collapse.vmz +64 -11
  19. package/src/components/ConsoleShell.vmz +405 -251
  20. package/src/components/Content.vmz +15 -1
  21. package/src/components/DataTable.vmz +294 -194
  22. package/src/components/DatePicker.vmz +766 -674
  23. package/src/components/Descriptions.vmz +90 -0
  24. package/src/components/Dialog.vmz +137 -38
  25. package/src/components/Divider.vmz +8 -1
  26. package/src/components/Drawer.vmz +518 -427
  27. package/src/components/Dropdown.vmz +195 -51
  28. package/src/components/Empty.vmz +96 -54
  29. package/src/components/Field.vmz +170 -115
  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 +78 -79
  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 +25 -10
  39. package/src/components/List.vmz +124 -102
  40. package/src/components/Menu.vmz +416 -243
  41. package/src/components/Message.vmz +167 -0
  42. package/src/components/Notification.vmz +132 -37
  43. package/src/components/Pagination.vmz +237 -69
  44. package/src/components/Popconfirm.vmz +287 -0
  45. package/src/components/Popover.vmz +341 -223
  46. package/src/components/Progress.vmz +16 -5
  47. package/src/components/Prose.vmz +180 -81
  48. package/src/components/QueryForm.vmz +31 -9
  49. package/src/components/RadioGroup.vmz +204 -124
  50. package/src/components/Result.vmz +60 -27
  51. package/src/components/Segmented.vmz +86 -51
  52. package/src/components/Select.vmz +620 -533
  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 +118 -103
  58. package/src/components/Switch.vmz +131 -98
  59. package/src/components/Table.vmz +270 -165
  60. package/src/components/Tabs.vmz +125 -110
  61. package/src/components/Tag.vmz +60 -43
  62. package/src/components/TextArea.vmz +125 -118
  63. package/src/components/Timeline.vmz +111 -76
  64. package/src/components/Toc.vmz +90 -74
  65. package/src/components/Tooltip.vmz +107 -58
  66. package/src/components/Tree.vmz +214 -191
  67. package/src/components/Typography.vmz +23 -8
  68. package/src/components/Upload.vmz +1394 -1289
@@ -1,211 +1,237 @@
1
- <template>
2
- <a v-if="href" data-vmz-ui="button" data-vmz-motion="control" data-vmz-motion-token="motion.control" :data-variant="variant" :data-size="size" :data-block="block ? 'true' : 'false'" :href="href" :target="target" :rel="rel" @click="onDomClick" class="vmz-ui-btn">
3
- <span v-if="loading" aria-hidden="true" class="vmz-ui-btn__spinner" />
4
- <slot />
5
- </a>
6
- <button v-else :type="type" data-vmz-ui="button" data-vmz-motion="control" data-vmz-motion-token="motion.control" :data-variant="variant" :data-size="size" :data-block="block ? 'true' : 'false'" :data-loading="loading ? 'true' : 'false'" :disabled="disabled" :aria-busy="loading ? 'true' : 'false'" :aria-haspopup="ariaHaspopup" :aria-controls="ariaControls" @click="onDomClick" class="vmz-ui-btn">
7
- <span v-if="loading" aria-hidden="true" class="vmz-ui-btn__spinner" />
8
- <slot />
9
- </button>
10
- </template>
11
- <style>
12
- .vmz-ui-btn {
13
- display: inline-flex;
14
- align-items: center;
15
- justify-content: center;
16
- gap: 0.375rem;
17
- min-height: var(--vmz-control-height, 2rem);
18
- padding: var(--vmz-density-control-padding-y) var(--vmz-density-control-padding-x);
19
- border: 1px solid transparent;
20
- border-radius: var(--vmz-radius-md, 6px);
21
- font: inherit;
22
- font-size: 0.875rem;
23
- font-weight: 500;
24
- line-height: 1.5715;
25
- white-space: nowrap;
26
- cursor: pointer;
27
- background: var(--vmz-action-primary-background);
28
- color: var(--vmz-action-primary-foreground);
29
- outline: none;
30
- box-shadow: 0 2px 0 color-mix(in srgb, var(--vmz-action-primary-background) 12%, transparent);
31
- transition:
32
- background-color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1)),
33
- border-color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1)),
34
- color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1)),
35
- box-shadow var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1));
36
- }
37
-
38
- .vmz-ui-btn[data-size="small"] {
39
- min-height: var(--vmz-control-height-sm, 1.5rem);
40
- padding: 0 0.625rem;
41
- font-size: 0.8125rem;
42
- }
43
- .vmz-ui-btn[data-size="large"] {
44
- min-height: var(--vmz-control-height-lg, 2.5rem);
45
- padding: 0.4375rem 1.125rem;
46
- font-size: 1rem;
47
- }
48
- .vmz-ui-btn[data-block="true"] {
49
- width: 100%;
50
- }
51
- .vmz-ui-btn[data-loading="true"] {
52
- cursor: wait;
53
- }
54
- .vmz-ui-btn__spinner {
55
- width: 1em;
56
- height: 1em;
57
- border: 1.5px solid currentColor;
58
- border-right-color: transparent;
59
- border-radius: 50%;
60
- opacity: 0.8;
61
- animation: vmz-btn-spin 0.7s linear infinite;
62
- }
63
- @keyframes vmz-btn-spin {
64
- to {
65
- transform: rotate(360deg);
66
- }
67
- }
68
-
69
- .vmz-ui-btn:hover:not(:disabled) {
70
- background: var(--vmz-action-primary-hover);
71
- }
72
-
73
- .vmz-ui-btn:active:not(:disabled) {
74
- background: var(--vmz-action-primary-active);
75
- transform: translateY(0.5px);
76
- }
77
-
78
- .vmz-ui-btn[data-variant="secondary"] {
79
- background: var(--vmz-action-secondary-background);
80
- color: var(--vmz-action-secondary-foreground);
81
- border-color: var(--vmz-action-secondary-border);
82
- box-shadow: none;
83
- }
84
- .vmz-ui-btn[data-variant="default"] {
85
- background: var(--vmz-surface-paper);
86
- color: var(--vmz-text-ink);
87
- border-color: var(--vmz-line-default);
88
- box-shadow: none;
89
- }
90
- .vmz-ui-btn[data-variant="default"]:hover:not(:disabled) {
91
- color: var(--vmz-action-primary-hover);
92
- border-color: var(--vmz-action-primary-hover);
93
- background: var(--vmz-surface-paper);
94
- }
95
- .vmz-ui-btn[data-variant="text"],
96
- .vmz-ui-btn[data-variant="link"] {
97
- min-height: auto;
98
- padding: 0.25rem 0.5rem;
99
- border-color: transparent;
100
- background: transparent;
101
- color: var(--vmz-action-primary-background);
102
- box-shadow: none;
103
- }
104
- .vmz-ui-btn[data-variant="dashed"] {
105
- background: var(--vmz-surface-paper);
106
- color: var(--vmz-text-ink);
107
- border: 1px dashed var(--vmz-line-default);
108
- box-shadow: none;
109
- }
110
-
111
- .vmz-ui-btn[data-variant="secondary"]:hover:not(:disabled) {
112
- background: var(--vmz-action-secondary-hover);
113
- }
114
-
115
- .vmz-ui-btn[data-variant="secondary"]:active:not(:disabled) {
116
- background: var(--vmz-action-secondary-hover);
117
- border-color: var(--vmz-action-primary-active);
118
- }
119
-
120
- .vmz-ui-btn[data-variant="ghost"] {
121
- background: transparent;
122
- color: var(--vmz-text-ink);
123
- border-color: transparent;
124
- }
125
-
126
- .vmz-ui-btn[data-variant="ghost"]:hover:not(:disabled) {
127
- background: color-mix(in srgb, var(--vmz-surface-mist) 85%, transparent);
128
- }
129
-
130
- .vmz-ui-btn[data-variant="ghost"]:active:not(:disabled) {
131
- background: var(--vmz-surface-mist);
132
- }
133
-
134
- .vmz-ui-btn[data-variant="danger"] {
135
- background: var(--vmz-status-danger-accent);
136
- color: var(--vmz-action-primary-foreground);
137
- border-color: transparent;
138
- }
139
-
140
- .vmz-ui-btn[data-variant="danger"]:hover:not(:disabled) {
141
- background: color-mix(in srgb, var(--vmz-status-danger-accent) 82%, var(--vmz-text-ink));
142
- }
143
-
144
- .vmz-ui-btn[data-variant="danger"]:active:not(:disabled) {
145
- background: var(--vmz-status-danger-foreground);
146
- }
147
-
148
- .vmz-ui-btn:focus-visible {
149
- box-shadow: 0 0 0 3px var(--vmz-focus-ring);
150
- }
151
-
152
- .vmz-ui-btn[data-variant="default"]:focus-visible,
153
- .vmz-ui-btn[data-variant="dashed"]:focus-visible,
154
- .vmz-ui-btn[data-variant="secondary"]:focus-visible,
155
- .vmz-ui-btn[data-variant="ghost"]:focus-visible,
156
- .vmz-ui-btn[data-variant="text"]:focus-visible,
157
- .vmz-ui-btn[data-variant="link"]:focus-visible {
158
- box-shadow: 0 0 0 3px var(--vmz-focus-ring);
159
- }
160
-
161
- .vmz-ui-btn:disabled {
162
- opacity: 0.55;
163
- cursor: not-allowed;
164
- box-shadow: none;
165
- transform: none;
166
- }
167
-
168
- :where([data-density="compact"]) .vmz-ui-btn {
169
- padding: var(--vmz-density-compact-padding-y) var(--vmz-density-compact-padding-x);
170
- }
171
-
172
- :where([data-density="dense"]) .vmz-ui-btn {
173
- padding: var(--vmz-density-dense-padding-y) var(--vmz-density-dense-padding-x);
174
- }
175
-
176
- @media (prefers-reduced-motion: reduce) {
177
- .vmz-ui-btn {
178
- transition: none;
179
- }
180
- .vmz-ui-btn:active:not(:disabled) {
181
- transform: none;
182
- }
183
- }
184
- </style>
185
- <script client>
186
- /**
187
- * VMZ UI — Button (variants + motion control feedback).
188
- * Colors / motion come only from Style Theme semantic tokens — never brand hex.
189
- * Variants: primary | secondary | ghost | danger
190
- */
191
- export default class Button {
192
- /** @type {'contents'} Direct host: no layout box (`ui-direct-host-box`). */
193
- static __vmzHostBox = "contents";
194
- public type: string = "button";
195
- public variant: string = "primary";
196
- public disabled: boolean = false;
197
- public loading: boolean = false;
198
- public block: boolean = false;
199
- public size: string = "middle";
200
- public href: string = "";
201
- public target: string = "";
202
- public rel: string = "";
203
- public ariaHaspopup: string = "";
204
- public ariaControls: string = "";
205
- public onClick: ((e: Event) => void) | null = null;
206
- onDomClick(e: Event) {
207
- this.emit("click", e);
208
- if (typeof this.onClick === "function") this.onClick(e);
209
- }
210
- }
211
- </script>
1
+ <template>
2
+ <a v-if="href" data-vmz-ui="button" data-vmz-motion="control" data-vmz-motion-token="motion.control" :data-variant="variant" :data-size="size" :data-block="block ? 'true' : 'false'" :href="href" :target="target" :rel="rel" :aria-busy="loading ? 'true' : 'false'" @click="onDomClick" class="vmz-ui-btn">
3
+ <span v-if="loading" aria-hidden="true" class="vmz-ui-btn__spinner" />
4
+ <slot />
5
+ </a>
6
+ <button v-else :type="type" data-vmz-ui="button" data-vmz-motion="control" data-vmz-motion-token="motion.control" :data-variant="variant" :data-size="size" :data-block="block ? 'true' : 'false'" :data-loading="loading ? 'true' : 'false'" :disabled="disabled" :aria-busy="loading ? 'true' : 'false'" :aria-haspopup="ariaHaspopup" :aria-controls="ariaControls" :aria-expanded="ariaExpanded ? ariaExpanded : null" @click="onDomClick" class="vmz-ui-btn">
7
+ <span v-if="loading" aria-hidden="true" class="vmz-ui-btn__spinner" />
8
+ <slot />
9
+ </button>
10
+ </template>
11
+ <style>
12
+ .vmz-ui-btn {
13
+ display: inline-flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ gap: var(--vmz-space-2);
17
+ /* Inline control: never stretch when the parent is a flex column (shells, card bodies). */
18
+ width: fit-content;
19
+ box-sizing: border-box;
20
+ min-height: var(--vmz-control-height);
21
+ padding: var(--vmz-density-control-padding-y) var(--vmz-density-control-padding-x);
22
+ border: 1px solid transparent;
23
+ border-radius: var(--vmz-radius-md);
24
+ font: inherit;
25
+ font-size: 0.875rem;
26
+ font-weight: 500;
27
+ line-height: 1.5715;
28
+ white-space: nowrap;
29
+ cursor: pointer;
30
+ background: var(--vmz-action-primary-background);
31
+ color: var(--vmz-action-primary-foreground);
32
+ outline: none;
33
+ box-shadow: none;
34
+ transition:
35
+ background-color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing),
36
+ border-color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing),
37
+ color var(--vmz-motion-control-duration) var(--vmz-motion-control-easing),
38
+ box-shadow var(--vmz-motion-control-duration) var(--vmz-motion-control-easing);
39
+ }
40
+
41
+ .vmz-ui-btn[data-size="small"] {
42
+ min-height: var(--vmz-control-height-sm);
43
+ padding: 0 var(--vmz-space-3);
44
+ font-size: 0.875rem;
45
+ }
46
+
47
+ .vmz-ui-btn[data-size="large"] {
48
+ min-height: var(--vmz-control-height-lg);
49
+ padding: var(--vmz-density-control-padding-y) var(--vmz-space-4);
50
+ font-size: 0.875rem;
51
+ }
52
+
53
+ .vmz-ui-btn[data-block="true"] {
54
+ width: 100%;
55
+ }
56
+
57
+ .vmz-ui-btn[data-loading="true"] {
58
+ cursor: wait;
59
+ }
60
+
61
+ .vmz-ui-btn__spinner {
62
+ flex: 0 0 auto;
63
+ width: 1em;
64
+ height: 1em;
65
+ border: 1.5px solid currentColor;
66
+ border-right-color: transparent;
67
+ border-radius: var(--vmz-radius-pill);
68
+ color: currentColor;
69
+ opacity: 0.9;
70
+ animation: vmz-btn-spin 0.7s linear infinite;
71
+ }
72
+
73
+ @keyframes vmz-btn-spin {
74
+ to {
75
+ transform: rotate(360deg);
76
+ }
77
+ }
78
+
79
+ .vmz-ui-btn:hover:not(:disabled) {
80
+ background: var(--vmz-action-primary-hover);
81
+ }
82
+
83
+ .vmz-ui-btn:active:not(:disabled) {
84
+ background: var(--vmz-action-primary-active);
85
+ }
86
+
87
+ .vmz-ui-btn[data-variant="secondary"] {
88
+ background: var(--vmz-action-secondary-background);
89
+ color: var(--vmz-action-secondary-foreground);
90
+ border-color: var(--vmz-action-secondary-border);
91
+ }
92
+
93
+ .vmz-ui-btn[data-variant="default"] {
94
+ background: var(--vmz-action-secondary-background);
95
+ color: var(--vmz-text-ink);
96
+ border-color: var(--vmz-line-default);
97
+ }
98
+
99
+ .vmz-ui-btn[data-variant="default"]:hover:not(:disabled) {
100
+ color: var(--vmz-action-primary-hover);
101
+ border-color: var(--vmz-action-primary-hover);
102
+ background: var(--vmz-action-secondary-background);
103
+ }
104
+
105
+ .vmz-ui-btn[data-variant="default"]:active:not(:disabled) {
106
+ color: var(--vmz-action-primary-active);
107
+ border-color: var(--vmz-action-primary-active);
108
+ background: var(--vmz-action-secondary-active);
109
+ }
110
+
111
+ .vmz-ui-btn[data-variant="text"],
112
+ .vmz-ui-btn[data-variant="link"] {
113
+ min-height: auto;
114
+ padding: var(--vmz-space-1) var(--vmz-space-2);
115
+ border-color: transparent;
116
+ background: transparent;
117
+ color: var(--vmz-action-link-foreground);
118
+ }
119
+
120
+ .vmz-ui-btn[data-variant="text"]:hover:not(:disabled),
121
+ .vmz-ui-btn[data-variant="link"]:hover:not(:disabled) {
122
+ background: var(--vmz-surface-mist);
123
+ color: var(--vmz-action-link-hover);
124
+ }
125
+
126
+ .vmz-ui-btn[data-variant="text"]:active:not(:disabled),
127
+ .vmz-ui-btn[data-variant="link"]:active:not(:disabled) {
128
+ background: var(--vmz-surface-fill);
129
+ }
130
+
131
+ .vmz-ui-btn[data-variant="dashed"] {
132
+ background: var(--vmz-action-secondary-background);
133
+ color: var(--vmz-text-ink);
134
+ border: 1px dashed var(--vmz-line-default);
135
+ }
136
+
137
+ .vmz-ui-btn[data-variant="dashed"]:hover:not(:disabled) {
138
+ color: var(--vmz-action-primary-hover);
139
+ border-color: var(--vmz-action-primary-hover);
140
+ }
141
+
142
+ .vmz-ui-btn[data-variant="secondary"]:hover:not(:disabled) {
143
+ background: var(--vmz-action-secondary-hover);
144
+ border-color: var(--vmz-action-primary-hover);
145
+ color: var(--vmz-action-primary-hover);
146
+ }
147
+
148
+ .vmz-ui-btn[data-variant="secondary"]:active:not(:disabled) {
149
+ background: var(--vmz-action-secondary-active);
150
+ border-color: var(--vmz-action-primary-active);
151
+ color: var(--vmz-action-primary-active);
152
+ }
153
+
154
+ .vmz-ui-btn[data-variant="ghost"] {
155
+ background: transparent;
156
+ color: var(--vmz-text-ink);
157
+ border-color: transparent;
158
+ }
159
+
160
+ .vmz-ui-btn[data-variant="ghost"]:hover:not(:disabled) {
161
+ background: var(--vmz-surface-mist);
162
+ }
163
+
164
+ .vmz-ui-btn[data-variant="ghost"]:active:not(:disabled) {
165
+ background: var(--vmz-surface-fill);
166
+ }
167
+
168
+ .vmz-ui-btn[data-variant="danger"] {
169
+ background: var(--vmz-status-danger-accent);
170
+ color: var(--vmz-action-primary-foreground);
171
+ border-color: transparent;
172
+ }
173
+
174
+ .vmz-ui-btn[data-variant="danger"]:hover:not(:disabled) {
175
+ background: var(--vmz-status-danger-foreground);
176
+ }
177
+
178
+ .vmz-ui-btn[data-variant="danger"]:active:not(:disabled) {
179
+ background: var(--vmz-status-danger-foreground);
180
+ }
181
+
182
+ .vmz-ui-btn:focus-visible {
183
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
184
+ }
185
+
186
+ .vmz-ui-btn:disabled {
187
+ opacity: 0.55;
188
+ cursor: not-allowed;
189
+ box-shadow: none;
190
+ transform: none;
191
+ }
192
+
193
+ :where([data-density="compact"]) .vmz-ui-btn {
194
+ padding: var(--vmz-density-compact-padding-y) var(--vmz-density-compact-padding-x);
195
+ }
196
+
197
+ :where([data-density="dense"]) .vmz-ui-btn {
198
+ padding: var(--vmz-density-dense-padding-y) var(--vmz-density-dense-padding-x);
199
+ }
200
+
201
+ @media (prefers-reduced-motion: reduce) {
202
+ .vmz-ui-btn {
203
+ transition: none;
204
+ }
205
+ .vmz-ui-btn__spinner {
206
+ animation-duration: 1.4s;
207
+ }
208
+ }
209
+ </style>
210
+ <script client>
211
+ /**
212
+ * VMZ UI — Button (variants + motion control feedback).
213
+ * Colors / motion come only from Style Theme semantic tokens — never brand hex.
214
+ * Variants: primary | secondary | default | dashed | ghost | text | link | danger
215
+ */
216
+ export default class Button {
217
+ /** @type {'contents'} Direct host: no layout box (`ui-direct-host-box`). */
218
+ static __vmzHostBox = "contents";
219
+ public type: string = "button";
220
+ public variant: string = "primary";
221
+ public disabled: boolean = false;
222
+ public loading: boolean = false;
223
+ public block: boolean = false;
224
+ public size: string = "middle";
225
+ public href: string = "";
226
+ public target: string = "";
227
+ public rel: string = "";
228
+ public ariaHaspopup: string = "";
229
+ public ariaControls: string = "";
230
+ public ariaExpanded: string = "";
231
+ public onClick: ((e: Event) => void) | null = null;
232
+ onDomClick(e: Event) {
233
+ this.emit("click", e);
234
+ if (typeof this.onClick === "function") this.onClick(e);
235
+ }
236
+ }
237
+ </script>