@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,77 +1,178 @@
1
- <template>
2
- <aside data-vmz-ui="callout" :data-tone="tone" :role="roleName" class="vmz-ui-callout">
3
- <p v-if="title" class="vmz-ui-callout__title">
4
- {{ title }}
5
- </p>
6
- <p v-if="description" class="vmz-ui-callout__description">
7
- {{ description }}
8
- </p>
9
- <div class="vmz-ui-callout__body">
10
- <slot />
11
- </div>
12
- </aside>
13
- </template>
14
- <style>
15
- .vmz-ui-callout {
16
- display: flex;
17
- flex-direction: column;
18
- gap: 0.5rem;
19
- padding: var(--vmz-density-control-padding-y) var(--vmz-density-control-padding-x);
20
- border: 1px solid var(--vmz-status-info-accent);
21
- border-left-width: 1px;
22
- border-radius: var(--vmz-radius-md, 6px);
23
- background: color-mix(in srgb, var(--vmz-status-info-accent) 10%, var(--vmz-surface-paper));
24
- color: var(--vmz-status-info-foreground);
25
- }
26
-
27
- .vmz-ui-callout[data-tone="info"] {
28
- border-color: var(--vmz-status-info-accent);
29
- background: color-mix(in srgb, var(--vmz-status-info-accent) 10%, var(--vmz-surface-paper));
30
- color: var(--vmz-status-info-foreground);
31
- }
32
-
33
- .vmz-ui-callout[data-tone="success"] {
34
- border-color: var(--vmz-status-success-accent);
35
- background: color-mix(in srgb, var(--vmz-status-success-accent) 10%, var(--vmz-surface-paper));
36
- color: var(--vmz-status-success-foreground);
37
- }
38
-
39
- .vmz-ui-callout[data-tone="warning"] {
40
- border-color: var(--vmz-status-warning-accent);
41
- background: color-mix(in srgb, var(--vmz-status-warning-accent) 10%, var(--vmz-surface-paper));
42
- color: var(--vmz-status-warning-foreground);
43
- }
44
-
45
- .vmz-ui-callout[data-tone="danger"] {
46
- border-color: var(--vmz-status-danger-accent);
47
- background: color-mix(in srgb, var(--vmz-status-danger-accent) 10%, var(--vmz-surface-paper));
48
- color: var(--vmz-status-danger-foreground);
49
- }
50
-
51
- .vmz-ui-callout__title {
52
- margin: 0;
53
- font-family: var(--vmz-font-display);
54
- font-weight: 700;
55
- }
56
-
57
- .vmz-ui-callout__description {
58
- margin: 0;
59
- line-height: 1.5;
60
- }
61
-
62
- .vmz-ui-callout__body:empty {
63
- display: none;
64
- }
65
- </style>
66
- <script client>
67
- /**
68
- * VMZ UI — Callout (Document/Product composition).
69
- * Inline guidance block for prose; shares status.* tones with Alert.
70
- */
71
- export default class Callout {
72
- public title: string = "";
73
- public description: string = "";
74
- public tone: string = "info";
75
- public roleName: string = "note";
76
- }
77
- </script>
1
+ <template>
2
+ <aside data-vmz-ui="callout" :data-tone="tone" :role="roleName" class="vmz-ui-callout">
3
+ <span aria-hidden="true" class="vmz-ui-callout__icon">
4
+ <Icon :name="toneIcon()" size="md" decorative />
5
+ </span>
6
+ <div class="vmz-ui-callout__content">
7
+ <p v-if="title" class="vmz-ui-callout__title">
8
+ {{ title }}
9
+ </p>
10
+ <p v-if="description" class="vmz-ui-callout__description">
11
+ {{ description }}
12
+ </p>
13
+ <div class="vmz-ui-callout__body">
14
+ <slot />
15
+ </div>
16
+ </div>
17
+ <button v-if="closable" type="button" :aria-label="closeLabel" @click="dismiss" class="vmz-ui-callout__close">
18
+ <Icon name="action.close" size="md" decorative />
19
+ </button>
20
+ </aside>
21
+ </template>
22
+ <style>
23
+ .vmz-ui-callout {
24
+ display: flex;
25
+ align-items: flex-start;
26
+ gap: var(--vmz-space-2, 0.5rem);
27
+ padding: var(--vmz-space-4, 1rem);
28
+ border: 1px solid var(--vmz-status-info-border, var(--vmz-line-default));
29
+ border-radius: var(--vmz-radius-lg, 8px);
30
+ background: var(--vmz-status-info-background, var(--vmz-surface-paper));
31
+ color: var(--vmz-status-info-foreground);
32
+ }
33
+
34
+ .vmz-ui-callout[data-tone="info"] {
35
+ border-color: var(--vmz-status-info-border, var(--vmz-line-default));
36
+ background: var(--vmz-status-info-background, var(--vmz-surface-paper));
37
+ color: var(--vmz-status-info-foreground);
38
+ }
39
+
40
+ .vmz-ui-callout[data-tone="success"] {
41
+ border-color: var(--vmz-status-success-border, var(--vmz-line-default));
42
+ background: var(--vmz-status-success-background, var(--vmz-surface-paper));
43
+ color: var(--vmz-status-success-foreground);
44
+ }
45
+
46
+ .vmz-ui-callout[data-tone="warning"] {
47
+ border-color: var(--vmz-status-warning-border, var(--vmz-line-default));
48
+ background: var(--vmz-status-warning-background, var(--vmz-surface-paper));
49
+ color: var(--vmz-status-warning-foreground);
50
+ }
51
+
52
+ .vmz-ui-callout[data-tone="danger"] {
53
+ border-color: var(--vmz-status-danger-border, var(--vmz-line-default));
54
+ background: var(--vmz-status-danger-background, var(--vmz-surface-paper));
55
+ color: var(--vmz-status-danger-foreground);
56
+ }
57
+
58
+ .vmz-ui-callout[data-tone="info"] .vmz-ui-callout__icon {
59
+ color: var(--vmz-status-info-accent);
60
+ }
61
+
62
+ .vmz-ui-callout[data-tone="success"] .vmz-ui-callout__icon {
63
+ color: var(--vmz-status-success-accent);
64
+ }
65
+
66
+ .vmz-ui-callout[data-tone="warning"] .vmz-ui-callout__icon {
67
+ color: var(--vmz-status-warning-accent);
68
+ }
69
+
70
+ .vmz-ui-callout[data-tone="danger"] .vmz-ui-callout__icon {
71
+ color: var(--vmz-status-danger-accent);
72
+ }
73
+
74
+ .vmz-ui-callout__icon {
75
+ flex: 0 0 auto;
76
+ display: inline-flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ height: 1.5rem;
80
+ }
81
+
82
+ .vmz-ui-callout__content {
83
+ flex: 1 1 auto;
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: var(--vmz-space-1, 0.25rem);
87
+ min-width: 0;
88
+ }
89
+
90
+ .vmz-ui-callout__title {
91
+ margin: 0;
92
+ font-family: var(--vmz-font-display, inherit);
93
+ font-size: 0.9375rem;
94
+ font-weight: 600;
95
+ line-height: 1.5;
96
+ color: inherit;
97
+ }
98
+
99
+ .vmz-ui-callout__description {
100
+ margin: 0;
101
+ color: var(--vmz-text-steel);
102
+ }
103
+
104
+ .vmz-ui-callout__body {
105
+ display: flex;
106
+ flex-direction: column;
107
+ gap: var(--vmz-space-2, 0.5rem);
108
+ color: var(--vmz-text-ink);
109
+ }
110
+
111
+ .vmz-ui-callout__body:empty {
112
+ display: none;
113
+ }
114
+
115
+ .vmz-ui-callout__close {
116
+ flex: 0 0 auto;
117
+ display: inline-flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ width: 1.5rem;
121
+ height: 1.5rem;
122
+ padding: 0;
123
+ border: 1px solid transparent;
124
+ border-radius: var(--vmz-radius-sm, 4px);
125
+ background: transparent;
126
+ color: var(--vmz-text-tertiary);
127
+ cursor: pointer;
128
+ outline: none;
129
+ transition:
130
+ color var(--vmz-motion-control-duration, 120ms) var(--vmz-motion-control-easing, cubic-bezier(0.2, 0, 0, 1)),
131
+ background-color var(--vmz-motion-control-duration, 120ms) var(--vmz-motion-control-easing, cubic-bezier(0.2, 0, 0, 1));
132
+ }
133
+
134
+ .vmz-ui-callout__close:hover {
135
+ color: var(--vmz-text-ink);
136
+ background: var(--vmz-surface-paper);
137
+ }
138
+
139
+ .vmz-ui-callout__close:focus-visible {
140
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
141
+ }
142
+
143
+ :where([data-density="compact"]) .vmz-ui-callout {
144
+ gap: var(--vmz-space-2, 0.5rem);
145
+ padding: var(--vmz-space-3, 0.75rem);
146
+ }
147
+
148
+ :where([data-density="dense"]) .vmz-ui-callout {
149
+ gap: var(--vmz-space-1, 0.25rem);
150
+ padding: var(--vmz-space-3, 0.75rem);
151
+ }
152
+ </style>
153
+ <script client>
154
+ /**
155
+ * VMZ UI — Callout (Document/Product composition).
156
+ * Inline guidance block for prose; shares status.{accent|foreground|background|border} tones with Alert.
157
+ */
158
+ export default class Callout {
159
+ public title: string = "";
160
+ public description: string = "";
161
+ public tone: string = "info";
162
+ public roleName: string = "note";
163
+ public closable: boolean = false;
164
+ public closeLabel: string = "";
165
+ public onClose: (() => void) | null = null;
166
+
167
+ toneIcon() {
168
+ const tone = String(this.tone || "").toLowerCase();
169
+ if (tone === "success" || tone === "warning" || tone === "danger") return `status.${tone}`;
170
+ return "status.info";
171
+ }
172
+
173
+ dismiss() {
174
+ this.emit("close");
175
+ if (typeof this.onClose === "function") this.onClose();
176
+ }
177
+ }
178
+ </script>
@@ -1,120 +1,141 @@
1
- <template>
2
- <section data-vmz-ui="card" :data-size="size" :data-bordered="bordered ? 'true' : 'false'" :data-hoverable="hoverable ? 'true' : 'false'" class="vmz-ui-card">
3
- <header v-if="title" class="vmz-ui-card__header">
4
- <h2 class="vmz-ui-card__title">
5
- {{ title }}
6
- </h2>
7
- <p v-if="description" class="vmz-ui-card__description">
8
- {{ description }}
9
- </p>
10
- </header>
11
- <div class="vmz-ui-card__body">
12
- <slot />
13
- </div>
14
- </section>
15
- </template>
16
- <style>
17
- .vmz-ui-card {
18
- display: flex;
19
- flex-direction: column;
20
- gap: 0.75rem;
21
- padding: 1.25rem 1.5rem;
22
- border: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
23
- border-radius: var(--vmz-radius-lg, 8px);
24
- background: var(--vmz-surface-paper);
25
- color: var(--vmz-text-ink);
26
- box-shadow: var(--vmz-shadow-card, none);
27
- }
28
- .vmz-ui-card[data-bordered="false"] {
29
- border-color: transparent;
30
- }
31
- .vmz-ui-card[data-hoverable="true"] {
32
- transition:
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));
36
- }
37
- .vmz-ui-card[data-hoverable="true"]:hover {
38
- border-color: var(--vmz-line-default);
39
- box-shadow: var(
40
- --vmz-shadow-card-hover,
41
- 0 1px 2px -2px rgba(0, 0, 0, 0.08),
42
- 0 3px 6px 0 rgba(0, 0, 0, 0.06)
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
- }
56
- }
57
- .vmz-ui-card[data-size="small"] {
58
- gap: 0.5rem;
59
- padding: 0.875rem 1rem;
60
- }
61
-
62
- :where([data-density="compact"]) .vmz-ui-card {
63
- gap: var(--vmz-density-compact-gap);
64
- padding: var(--vmz-density-compact-padding-y) var(--vmz-density-compact-padding-x);
65
- }
66
-
67
- :where([data-density="dense"]) .vmz-ui-card {
68
- gap: var(--vmz-density-dense-gap);
69
- padding: var(--vmz-density-dense-padding-y) var(--vmz-density-dense-padding-x);
70
- }
71
-
72
- .vmz-ui-card__header {
73
- display: flex;
74
- flex-direction: column;
75
- gap: 0.375rem;
76
- }
77
-
78
- .vmz-ui-card__title {
79
- margin: 0;
80
- font-family: var(--vmz-font-sans, inherit);
81
- font-size: 1rem;
82
- font-weight: 600;
83
- color: var(--vmz-text-ink);
84
- }
85
-
86
- .vmz-ui-card__description {
87
- margin: 0;
88
- color: var(--vmz-text-steel);
89
- line-height: 1.45;
90
- }
91
-
92
- .vmz-ui-card__body {
93
- display: flex;
94
- flex-direction: column;
95
- gap: var(--vmz-density-control-gap);
96
- }
97
-
98
- /* Direct host default is display:contents (runtime); Badge-only CSS special-case removed. */
99
-
100
- :where([data-density="compact"]) .vmz-ui-card__body {
101
- gap: var(--vmz-density-compact-gap);
102
- }
103
-
104
- :where([data-density="dense"]) .vmz-ui-card__body {
105
- gap: var(--vmz-density-dense-gap);
106
- }
107
- </style>
108
- <script client>
109
- /**
110
- * VMZ UI — Card (Commercial Surface).
111
- * Surface container; spacing from density.*; chrome from surface/line/text.
112
- */
113
- export default class Card {
114
- public title: string = "";
115
- public description: string = "";
116
- public size: string = "middle";
117
- public bordered: boolean = true;
118
- public hoverable: boolean = false;
119
- }
120
- </script>
1
+ <template>
2
+ <section data-vmz-ui="card" :data-size="size" :data-bordered="bordered ? 'true' : 'false'" :data-hoverable="hoverable ? 'true' : 'false'" class="vmz-ui-card">
3
+ <header v-if="title || description" class="vmz-ui-card__header">
4
+ <h2 v-if="title" class="vmz-ui-card__title">
5
+ {{ title }}
6
+ </h2>
7
+ <p v-if="description" class="vmz-ui-card__description">
8
+ {{ description }}
9
+ </p>
10
+ </header>
11
+ <div class="vmz-ui-card__body">
12
+ <slot />
13
+ </div>
14
+ <footer v-if="footer" class="vmz-ui-card__footer">
15
+ {{ footer }}
16
+ </footer>
17
+ </section>
18
+ </template>
19
+ <style>
20
+ .vmz-ui-card {
21
+ display: flex;
22
+ flex-direction: column;
23
+ box-sizing: border-box;
24
+ height: 100%;
25
+ border: 1px solid var(--vmz-line-default, var(--vmz-line-strong));
26
+ border-radius: var(--vmz-radius-lg, 8px);
27
+ background: var(--vmz-surface-paper);
28
+ color: var(--vmz-text-ink);
29
+ font-family: var(--vmz-font-sans, inherit);
30
+ box-shadow: none;
31
+ }
32
+
33
+ .vmz-ui-card[data-bordered="false"] {
34
+ border-color: transparent;
35
+ }
36
+
37
+ .vmz-ui-card[data-hoverable="true"] {
38
+ transition: border-color var(--vmz-motion-control-duration, 120ms)
39
+ var(--vmz-motion-control-easing, cubic-bezier(0.2, 0, 0, 1));
40
+ }
41
+
42
+ .vmz-ui-card[data-hoverable="true"]:hover {
43
+ border-color: var(--vmz-line-strong);
44
+ }
45
+
46
+ .vmz-ui-card[data-hoverable="true"]:focus-within {
47
+ border-color: var(--vmz-action-primary-background);
48
+ }
49
+
50
+ @media (prefers-reduced-motion: reduce) {
51
+ .vmz-ui-card[data-hoverable="true"] {
52
+ transition: none;
53
+ }
54
+ }
55
+
56
+ .vmz-ui-card__header {
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: var(--vmz-space-1, 0.25rem);
60
+ padding: var(--vmz-space-5, 1.5rem);
61
+ border-bottom: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
62
+ }
63
+
64
+ .vmz-ui-card__body {
65
+ display: flex;
66
+ flex-direction: column;
67
+ flex: 1 1 auto;
68
+ gap: var(--vmz-space-3, 0.75rem);
69
+ padding: var(--vmz-space-5, 1.5rem);
70
+ }
71
+
72
+ .vmz-ui-card__footer {
73
+ display: flex;
74
+ align-items: center;
75
+ gap: var(--vmz-space-2, 0.5rem);
76
+ padding: var(--vmz-space-4, 1rem) var(--vmz-space-5, 1.5rem);
77
+ border-top: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
78
+ color: var(--vmz-text-steel);
79
+ font-size: 0.875rem;
80
+ }
81
+
82
+ .vmz-ui-card[data-size="small"] .vmz-ui-card__header,
83
+ .vmz-ui-card[data-size="small"] .vmz-ui-card__body {
84
+ gap: var(--vmz-space-2, 0.5rem);
85
+ padding: var(--vmz-space-3, 0.75rem) var(--vmz-space-4, 1rem);
86
+ }
87
+
88
+ .vmz-ui-card[data-size="small"] .vmz-ui-card__footer {
89
+ padding: var(--vmz-space-2, 0.5rem) var(--vmz-space-4, 1rem);
90
+ }
91
+
92
+ .vmz-ui-card__title {
93
+ margin: 0;
94
+ font-family: var(--vmz-font-display, var(--vmz-font-sans, inherit));
95
+ font-size: 1rem;
96
+ font-weight: 600;
97
+ line-height: 1.4;
98
+ color: var(--vmz-text-ink);
99
+ }
100
+
101
+ .vmz-ui-card__description {
102
+ margin: 0;
103
+ font-size: 0.875rem;
104
+ line-height: 1.55;
105
+ color: var(--vmz-text-tertiary);
106
+ }
107
+
108
+ :where([data-density="compact"]) .vmz-ui-card__header,
109
+ :where([data-density="compact"]) .vmz-ui-card__body {
110
+ gap: var(--vmz-space-2, 0.5rem);
111
+ padding: var(--vmz-space-3, 0.75rem) var(--vmz-space-4, 1rem);
112
+ }
113
+
114
+ :where([data-density="compact"]) .vmz-ui-card__footer {
115
+ padding: var(--vmz-space-2, 0.5rem) var(--vmz-space-4, 1rem);
116
+ }
117
+
118
+ :where([data-density="dense"]) .vmz-ui-card__header,
119
+ :where([data-density="dense"]) .vmz-ui-card__body {
120
+ gap: var(--vmz-space-1, 0.25rem);
121
+ padding: var(--vmz-space-2, 0.5rem) var(--vmz-space-3, 0.75rem);
122
+ }
123
+
124
+ :where([data-density="dense"]) .vmz-ui-card__footer {
125
+ padding: var(--vmz-space-1, 0.25rem) var(--vmz-space-3, 0.75rem);
126
+ }
127
+ </style>
128
+ <script client>
129
+ /**
130
+ * VMZ UI — Card (Commercial Surface).
131
+ * Surface container: paper + 1px line + radius.lg; spacing from space/density tokens.
132
+ */
133
+ export default class Card {
134
+ public title: string = "";
135
+ public description: string = "";
136
+ public footer: string = "";
137
+ public size: string = "middle";
138
+ public bordered: boolean = true;
139
+ public hoverable: boolean = false;
140
+ }
141
+ </script>