@vmz/ui 0.3.4 → 0.3.6

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 (43) hide show
  1. package/README.md +51 -51
  2. package/package.json +2 -2
  3. package/presets/web-surface.v0.json +19 -7
  4. package/src/components/Accordion.vmz +94 -94
  5. package/src/components/AppShell.vmz +77 -33
  6. package/src/components/Autocomplete.vmz +154 -154
  7. package/src/components/Badge.vmz +70 -70
  8. package/src/components/Breadcrumb.vmz +72 -72
  9. package/src/components/BulkActions.vmz +51 -51
  10. package/src/components/Button.vmz +211 -192
  11. package/src/components/Callout.vmz +77 -77
  12. package/src/components/Card.vmz +120 -106
  13. package/src/components/Checkbox.vmz +55 -55
  14. package/src/components/CodeBlock.vmz +77 -18
  15. package/src/components/ConsoleShell.vmz +251 -251
  16. package/src/components/DataTable.vmz +194 -194
  17. package/src/components/DatePicker.vmz +674 -674
  18. package/src/components/Dialog.vmz +10 -7
  19. package/src/components/Drawer.vmz +427 -427
  20. package/src/components/Dropdown.vmz +135 -16
  21. package/src/components/Empty.vmz +54 -54
  22. package/src/components/Field.vmz +115 -115
  23. package/src/components/FormItem.vmz +79 -79
  24. package/src/components/Link.vmz +34 -4
  25. package/src/components/List.vmz +102 -102
  26. package/src/components/Menu.vmz +243 -243
  27. package/src/components/Pagination.vmz +69 -69
  28. package/src/components/Popover.vmz +223 -223
  29. package/src/components/Prose.vmz +81 -81
  30. package/src/components/RadioGroup.vmz +124 -124
  31. package/src/components/Segmented.vmz +51 -51
  32. package/src/components/Select.vmz +533 -533
  33. package/src/components/Steps.vmz +103 -103
  34. package/src/components/Switch.vmz +98 -98
  35. package/src/components/Table.vmz +165 -133
  36. package/src/components/Tabs.vmz +110 -110
  37. package/src/components/Tag.vmz +43 -40
  38. package/src/components/TextArea.vmz +118 -118
  39. package/src/components/Timeline.vmz +76 -76
  40. package/src/components/Toc.vmz +74 -74
  41. package/src/components/Tooltip.vmz +58 -58
  42. package/src/components/Tree.vmz +191 -191
  43. package/src/components/Upload.vmz +1289 -1289
@@ -1,51 +1,51 @@
1
- <template>
2
- <div data-vmz-ui="bulk-actions" role="region" :aria-label="label" :data-open="selectedCount ? 'true' : 'false'" class="vmz-ui-bulk-actions">
3
- <p data-vmz-fixture="bulk-count" class="vmz-ui-bulk-actions__count">
4
- {{ countLabel }}
5
- </p>
6
- <div class="vmz-ui-bulk-actions__actions">
7
- <slot />
8
- </div>
9
- </div>
10
- </template>
11
- <style>
12
- .vmz-ui-bulk-actions {
13
- display: flex;
14
- flex-wrap: wrap;
15
- align-items: center;
16
- justify-content: space-between;
17
- gap: 0.65rem 1rem;
18
- padding: 0.65rem 0.85rem;
19
- border: 1px solid var(--vmz-line-default);
20
- border-radius: var(--vmz-radius-md, 6px);
21
- background: transparent;
22
- }
23
-
24
- /* Keep host+slot mounted so default slot projects at create time (not inside v-if). */
25
- .vmz-ui-bulk-actions[data-open="false"] {
26
- display: none;
27
- }
28
-
29
- .vmz-ui-bulk-actions__count {
30
- margin: 0;
31
- font-weight: 700;
32
- color: var(--vmz-action-primary-active);
33
- }
34
-
35
- .vmz-ui-bulk-actions__actions {
36
- display: flex;
37
- flex-wrap: wrap;
38
- gap: 0.5rem;
39
- }
40
- </style>
41
- <script client>
42
- /**
43
- * VMZ UI — BulkActions (Console composition).
44
- * Hides when selectedCount is falsy but keeps the tree mounted so parent slot children project.
45
- */
46
- export default class BulkActions {
47
- public label: string = "Bulk actions";
48
- public selectedCount: number = 0;
49
- public countLabel: string = "";
50
- }
51
- </script>
1
+ <template>
2
+ <div data-vmz-ui="bulk-actions" role="region" :aria-label="label" :data-open="selectedCount ? 'true' : 'false'" class="vmz-ui-bulk-actions">
3
+ <p data-vmz-fixture="bulk-count" class="vmz-ui-bulk-actions__count">
4
+ {{ countLabel }}
5
+ </p>
6
+ <div class="vmz-ui-bulk-actions__actions">
7
+ <slot />
8
+ </div>
9
+ </div>
10
+ </template>
11
+ <style>
12
+ .vmz-ui-bulk-actions {
13
+ display: flex;
14
+ flex-wrap: wrap;
15
+ align-items: center;
16
+ justify-content: space-between;
17
+ gap: 0.625rem 1rem;
18
+ padding: 0.625rem 0.85rem;
19
+ border: 1px solid var(--vmz-line-default);
20
+ border-radius: var(--vmz-radius-md, 6px);
21
+ background: transparent;
22
+ }
23
+
24
+ /* Keep host+slot mounted so default slot projects at create time (not inside v-if). */
25
+ .vmz-ui-bulk-actions[data-open="false"] {
26
+ display: none;
27
+ }
28
+
29
+ .vmz-ui-bulk-actions__count {
30
+ margin: 0;
31
+ font-weight: 700;
32
+ color: var(--vmz-action-primary-active);
33
+ }
34
+
35
+ .vmz-ui-bulk-actions__actions {
36
+ display: flex;
37
+ flex-wrap: wrap;
38
+ gap: 0.5rem;
39
+ }
40
+ </style>
41
+ <script client>
42
+ /**
43
+ * VMZ UI — BulkActions (Console composition).
44
+ * Hides when selectedCount is falsy but keeps the tree mounted so parent slot children project.
45
+ */
46
+ export default class BulkActions {
47
+ public label: string = "Bulk actions";
48
+ public selectedCount: number = 0;
49
+ public countLabel: string = "";
50
+ }
51
+ </script>
@@ -1,192 +1,211 @@
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.35rem;
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: 400;
24
- line-height: 1.5715;
25
- cursor: pointer;
26
- background: var(--vmz-action-primary-background);
27
- color: var(--vmz-action-primary-foreground);
28
- outline: none;
29
- box-shadow: none;
30
- 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
- }
35
-
36
- .vmz-ui-btn[data-size="small"] {
37
- min-height: var(--vmz-control-height-sm, 1.5rem);
38
- padding: 0 0.5rem;
39
- font-size: 0.875rem;
40
- }
41
- .vmz-ui-btn[data-size="large"] {
42
- min-height: var(--vmz-control-height-lg, 2.5rem);
43
- padding: 0.4rem 1rem;
44
- font-size: 1rem;
45
- }
46
- .vmz-ui-btn[data-block="true"] {
47
- width: 100%;
48
- }
49
- .vmz-ui-btn[data-loading="true"] {
50
- cursor: wait;
51
- }
52
- .vmz-ui-btn__spinner {
53
- width: 1em;
54
- height: 1em;
55
- border: 2px solid currentColor;
56
- border-right-color: transparent;
57
- border-radius: 50%;
58
- animation: vmz-btn-spin 0.7s linear infinite;
59
- }
60
- @keyframes vmz-btn-spin {
61
- to {
62
- transform: rotate(360deg);
63
- }
64
- }
65
-
66
- .vmz-ui-btn:hover:not(:disabled) {
67
- background: var(--vmz-action-primary-hover);
68
- }
69
-
70
- .vmz-ui-btn:active:not(:disabled) {
71
- background: var(--vmz-action-primary-active);
72
- }
73
-
74
- .vmz-ui-btn[data-variant="secondary"] {
75
- background: var(--vmz-action-secondary-background);
76
- color: var(--vmz-action-secondary-foreground);
77
- border-color: var(--vmz-action-secondary-border);
78
- }
79
- .vmz-ui-btn[data-variant="default"] {
80
- background: #fff;
81
- color: var(--vmz-text-ink);
82
- border-color: var(--vmz-line-default);
83
- box-shadow: none;
84
- }
85
- .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;
89
- }
90
- .vmz-ui-btn[data-variant="text"],
91
- .vmz-ui-btn[data-variant="link"] {
92
- min-height: auto;
93
- padding: 0.25rem 0.35rem;
94
- border-color: transparent;
95
- background: transparent;
96
- color: var(--vmz-action-primary-background);
97
- box-shadow: none;
98
- }
99
- .vmz-ui-btn[data-variant="dashed"] {
100
- background: #fff;
101
- color: var(--vmz-text-ink);
102
- border: 1px dashed var(--vmz-line-default);
103
- box-shadow: none;
104
- }
105
-
106
- .vmz-ui-btn[data-variant="secondary"]:hover:not(:disabled) {
107
- background: var(--vmz-action-secondary-hover);
108
- }
109
-
110
- .vmz-ui-btn[data-variant="secondary"]:active:not(:disabled) {
111
- background: var(--vmz-action-secondary-hover);
112
- border-color: var(--vmz-action-primary-active);
113
- }
114
-
115
- .vmz-ui-btn[data-variant="ghost"] {
116
- background: transparent;
117
- color: var(--vmz-text-ink);
118
- border-color: transparent;
119
- }
120
-
121
- .vmz-ui-btn[data-variant="ghost"]:hover:not(:disabled) {
122
- background: color-mix(in srgb, var(--vmz-surface-mist) 85%, transparent);
123
- }
124
-
125
- .vmz-ui-btn[data-variant="ghost"]:active:not(:disabled) {
126
- background: var(--vmz-surface-mist);
127
- }
128
-
129
- .vmz-ui-btn[data-variant="danger"] {
130
- background: var(--vmz-status-danger-accent);
131
- color: var(--vmz-action-primary-foreground);
132
- border-color: transparent;
133
- }
134
-
135
- .vmz-ui-btn[data-variant="danger"]:hover:not(:disabled) {
136
- background: color-mix(in srgb, var(--vmz-status-danger-accent) 82%, var(--vmz-text-ink));
137
- }
138
-
139
- .vmz-ui-btn[data-variant="danger"]:active:not(:disabled) {
140
- background: var(--vmz-status-danger-foreground);
141
- }
142
-
143
- .vmz-ui-btn:focus-visible {
144
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
145
- }
146
-
147
- .vmz-ui-btn:disabled {
148
- opacity: 0.55;
149
- cursor: not-allowed;
150
- }
151
-
152
- :where([data-density="compact"]) .vmz-ui-btn {
153
- padding: var(--vmz-density-compact-padding-y) var(--vmz-density-compact-padding-x);
154
- }
155
-
156
- :where([data-density="dense"]) .vmz-ui-btn {
157
- padding: var(--vmz-density-dense-padding-y) var(--vmz-density-dense-padding-x);
158
- }
159
-
160
- @media (prefers-reduced-motion: reduce) {
161
- .vmz-ui-btn {
162
- transition: none;
163
- }
164
- }
165
- </style>
166
- <script client>
167
- /**
168
- * VMZ UI — Button (variants + motion control feedback).
169
- * Colors / motion come only from Style Theme semantic tokens — never brand hex.
170
- * Variants: primary | secondary | ghost | danger
171
- */
172
- export default class Button {
173
- /** @type {'contents'} Direct host: no layout box (`ui-direct-host-box`). */
174
- static __vmzHostBox = "contents";
175
- public type: string = "button";
176
- public variant: string = "primary";
177
- public disabled: boolean = false;
178
- public loading: boolean = false;
179
- public block: boolean = false;
180
- public size: string = "middle";
181
- public href: string = "";
182
- public target: string = "";
183
- public rel: string = "";
184
- public ariaHaspopup: string = "";
185
- public ariaControls: string = "";
186
- public onClick: ((e: Event) => void) | null = null;
187
- onDomClick(e: Event) {
188
- this.emit("click", e);
189
- if (typeof this.onClick === "function") this.onClick(e);
190
- }
191
- }
192
- </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" @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>