@vmz/ui 0.3.5 → 0.3.7

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 (42) hide show
  1. package/package.json +2 -2
  2. package/presets/web-surface.v0.json +19 -7
  3. package/src/components/Accordion.vmz +2 -2
  4. package/src/components/AppShell.vmz +79 -32
  5. package/src/components/Autocomplete.vmz +3 -3
  6. package/src/components/Badge.vmz +1 -1
  7. package/src/components/Breadcrumb.vmz +3 -3
  8. package/src/components/BulkActions.vmz +2 -2
  9. package/src/components/Button.vmz +38 -17
  10. package/src/components/Callout.vmz +1 -1
  11. package/src/components/Card.vmz +19 -5
  12. package/src/components/Checkbox.vmz +2 -2
  13. package/src/components/CodeBlock.vmz +93 -19
  14. package/src/components/ConsoleShell.vmz +21 -21
  15. package/src/components/DataTable.vmz +4 -4
  16. package/src/components/DatePicker.vmz +9 -9
  17. package/src/components/Dialog.vmz +26 -7
  18. package/src/components/Drawer.vmz +3 -3
  19. package/src/components/Dropdown.vmz +181 -16
  20. package/src/components/Empty.vmz +1 -1
  21. package/src/components/Field.vmz +4 -4
  22. package/src/components/FormItem.vmz +1 -1
  23. package/src/components/Link.vmz +38 -4
  24. package/src/components/List.vmz +2 -2
  25. package/src/components/Menu.vmz +4 -4
  26. package/src/components/Pagination.vmz +7 -5
  27. package/src/components/Popover.vmz +3 -3
  28. package/src/components/Prose.vmz +1 -1
  29. package/src/components/RadioGroup.vmz +4 -4
  30. package/src/components/Segmented.vmz +1 -1
  31. package/src/components/Select.vmz +12 -12
  32. package/src/components/Steps.vmz +1 -1
  33. package/src/components/Switch.vmz +2 -2
  34. package/src/components/Table.vmz +45 -13
  35. package/src/components/Tabs.vmz +3 -3
  36. package/src/components/Tag.vmz +5 -2
  37. package/src/components/TextArea.vmz +4 -4
  38. package/src/components/Timeline.vmz +2 -2
  39. package/src/components/Toc.vmz +3 -3
  40. package/src/components/Tooltip.vmz +4 -4
  41. package/src/components/Tree.vmz +4 -4
  42. package/src/components/Upload.vmz +23 -13
@@ -1,10 +1,18 @@
1
1
  <template>
2
2
  <figure data-vmz-ui="code-block" class="vmz-ui-code-block">
3
- <div class="vmz-ui-code-block__bar">
4
- <figcaption v-if="caption" class="vmz-ui-code-block__caption">
5
- {{ caption }}
6
- </figcaption>
7
- <Button type="button" variant="ghost" @click="onCopy">
3
+ <div v-if="barVisible()" class="vmz-ui-code-block__bar">
4
+ <div class="vmz-ui-code-block__heading">
5
+ <span v-if="language" class="vmz-ui-code-block__lang">
6
+ {{ language }}
7
+ </span>
8
+ <span v-if="title" class="vmz-ui-code-block__caption">
9
+ {{ title }}
10
+ </span>
11
+ <span v-else-if="caption" class="vmz-ui-code-block__caption">
12
+ {{ caption }}
13
+ </span>
14
+ </div>
15
+ <Button v-if="canCopy()" type="button" variant="text" size="sm" @click="onCopy" class="vmz-ui-code-block__copy">
8
16
  {{ copyLabel }}
9
17
  </Button>
10
18
  </div>
@@ -20,54 +28,120 @@
20
28
  margin: 0;
21
29
  display: flex;
22
30
  flex-direction: column;
23
- gap: 0.45rem;
24
31
  border: 1px solid var(--vmz-line-default);
25
- border-radius: var(--vmz-radius-md, 6px);
32
+ border-radius: var(--vmz-radius-lg, 8px);
26
33
  background: var(--vmz-surface-mist);
27
34
  overflow: hidden;
28
35
  }
29
36
 
30
37
  .vmz-ui-code-block__bar {
31
38
  display: flex;
32
- flex-wrap: wrap;
33
39
  align-items: center;
34
40
  justify-content: space-between;
35
- gap: 0.45rem;
36
- padding: 0.35rem 0.55rem;
37
- border-bottom: 1px solid var(--vmz-line-default);
41
+ gap: 0.5rem;
42
+ min-height: 2.25rem;
43
+ padding: 0 0.5rem 0 0.75rem;
44
+ border-bottom: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
38
45
  background: var(--vmz-surface-paper);
39
46
  }
40
47
 
41
- .vmz-ui-code-block__caption {
42
- margin: 0;
48
+ .vmz-ui-code-block__heading {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 0.5rem;
52
+ min-width: 0;
53
+ }
54
+
55
+ .vmz-ui-code-block__lang {
56
+ flex: none;
57
+ padding: 0.0625rem 0.4375rem;
58
+ border: 1px solid var(--vmz-line-default);
59
+ border-radius: var(--vmz-radius-xs, 2px);
60
+ background: var(--vmz-surface-mist);
61
+ color: var(--vmz-text-steel);
43
62
  font-family: var(--vmz-font-mono);
44
- font-size: 0.8rem;
63
+ font-size: 0.6875rem;
64
+ font-weight: 600;
65
+ line-height: 1.4;
66
+ letter-spacing: 0.04em;
67
+ text-transform: uppercase;
68
+ }
69
+
70
+ .vmz-ui-code-block__caption {
71
+ overflow: hidden;
45
72
  color: var(--vmz-text-steel);
73
+ font-size: 0.8125rem;
74
+ line-height: 1.5;
75
+ text-overflow: ellipsis;
76
+ white-space: nowrap;
77
+ }
78
+
79
+ .vmz-ui-code-block__copy {
80
+ flex: none;
81
+ opacity: 0.72;
82
+ transition: opacity var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1));
83
+ }
84
+
85
+ .vmz-ui-code-block:hover .vmz-ui-code-block__copy,
86
+ .vmz-ui-code-block__copy:focus-visible {
87
+ opacity: 1;
46
88
  }
47
89
 
48
90
  .vmz-ui-code-block__pre {
49
91
  margin: 0;
50
- padding: 0.85rem 1rem;
92
+ padding: 0.875rem 1rem;
51
93
  overflow-x: auto;
94
+ overflow-y: auto;
95
+ max-height: 32rem;
52
96
  }
53
97
 
54
98
  .vmz-ui-code-block__code {
55
- font-family: var(--vmz-font-mono);
56
- font-size: 0.88rem;
57
- line-height: 1.5;
99
+ display: block;
58
100
  color: var(--vmz-text-ink);
101
+ font-family: var(--vmz-font-mono);
102
+ font-size: 0.8125rem;
103
+ line-height: 1.65;
59
104
  white-space: pre;
105
+ tab-size: 2;
106
+ }
107
+
108
+ .vmz-ui-code-block__pre::-webkit-scrollbar {
109
+ width: 0.5rem;
110
+ height: 0.5rem;
111
+ }
112
+
113
+ .vmz-ui-code-block__pre::-webkit-scrollbar-thumb {
114
+ border-radius: var(--vmz-radius-pill, 999px);
115
+ background: var(--vmz-line-default);
60
116
  }
61
117
  </style>
62
118
  <script client>
63
119
  /**
64
120
  * VMZ UI — CodeBlock (Document/Product composition).
65
- * Source is readable in SSR HTML; copy is progressive enhancement via onCopy.
121
+ * Readable `<pre><code>` shell: no syntax highlighting (use `<Shiki>` / `<Code>`).
122
+ * `title` wins over legacy `caption`; `language` is a display-only chip.
123
+ * Source and bar are server-rendered; copy is progressive enhancement via onCopy.
66
124
  */
67
125
  export default class CodeBlock {
68
126
  public code: string = "";
127
+ /** Legacy heading text; kept for existing callers and used when `title` is empty. */
69
128
  public caption: string = "";
129
+ /** Preferred heading text; falls back to `caption` when absent. */
130
+ public title: string = "";
131
+ /** Optional syntax label rendered as a chip in the bar (e.g. `ts`, `bash`). */
132
+ public language: string = "";
133
+ /** Visible label of the copy control. */
70
134
  public copyLabel: string = "Copy";
71
135
  public onCopy: ((e: Event) => void) | null = null;
136
+
137
+ /** The bar renders when there is anything to show in it. */
138
+ public barVisible(): boolean {
139
+ return !!(this.title || this.caption || this.language || this.canCopy());
140
+ }
141
+
142
+ /** Copy is a real control only when a handler exists; no dead button. */
143
+ public canCopy(): boolean {
144
+ return typeof this.onCopy === "function";
145
+ }
72
146
  }
73
147
  </script>
@@ -56,7 +56,7 @@
56
56
  border-right: 1px solid var(--vmz-line-subtle, #e5e6eb);
57
57
  min-height: 100%;
58
58
  align-self: stretch;
59
- background: #fff;
59
+ background: var(--vmz-surface-paper);
60
60
  }
61
61
 
62
62
  .vmz-ui-console-shell__brand {
@@ -65,12 +65,12 @@
65
65
  font-size: 1rem;
66
66
  letter-spacing: 0;
67
67
  text-decoration: none;
68
- color: #1f2329;
68
+ color: var(--vmz-text-ink);
69
69
  }
70
70
 
71
71
  .vmz-ui-console-shell__brand:focus-visible {
72
72
  outline: none;
73
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
73
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
74
74
  }
75
75
 
76
76
  .vmz-ui-console-shell__nav {
@@ -86,20 +86,20 @@
86
86
  font-size: 0.875rem;
87
87
  line-height: 1.375rem;
88
88
  text-decoration: none;
89
- color: #51565d;
90
- padding: 0.45rem 0.55rem;
91
- border-radius: 6px;
89
+ color: var(--vmz-text-steel);
90
+ padding: 0.5rem 0.5rem;
91
+ border-radius: var(--vmz-radius-sm);
92
92
  }
93
93
 
94
94
  .vmz-ui-console-shell__nav a[data-active="true"] {
95
- color: #0958d9;
95
+ color: var(--vmz-action-link-foreground);
96
96
  font-weight: 500;
97
- background: #e6f4ff;
97
+ background: color-mix(in srgb, var(--vmz-action-primary-background) 10%, var(--vmz-surface-paper));
98
98
  }
99
99
 
100
100
  .vmz-ui-console-shell__nav a:focus-visible {
101
101
  outline: none;
102
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
102
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
103
103
  }
104
104
 
105
105
  .vmz-ui-console-shell__body {
@@ -122,18 +122,18 @@
122
122
  min-height: 3.5rem;
123
123
  padding: 0.75rem 1.5rem;
124
124
  border-bottom: 1px solid var(--vmz-line-subtle, #e5e6eb);
125
- background: #fff;
125
+ background: var(--vmz-surface-paper);
126
126
  }
127
127
 
128
128
  .vmz-ui-console-shell__header-copy {
129
129
  display: grid;
130
- gap: 0.15rem;
130
+ gap: 0.125rem;
131
131
  min-width: 0;
132
132
  }
133
133
 
134
134
  .vmz-ui-console-shell__breadcrumb {
135
135
  margin: 0;
136
- color: #646a73;
136
+ color: var(--vmz-text-steel);
137
137
  font-size: 0.8125rem;
138
138
  line-height: 1.25rem;
139
139
  }
@@ -143,12 +143,12 @@
143
143
  font-size: 1.5rem;
144
144
  line-height: 2rem;
145
145
  font-weight: 600;
146
- color: #1f2329;
146
+ color: var(--vmz-text-ink);
147
147
  }
148
148
 
149
149
  .vmz-ui-console-shell__subtitle {
150
150
  margin: 0;
151
- color: #51565d;
151
+ color: var(--vmz-text-steel);
152
152
  font-size: 0.875rem;
153
153
  line-height: 1.375rem;
154
154
  }
@@ -159,9 +159,9 @@
159
159
  justify-content: center;
160
160
  min-height: 2rem;
161
161
  padding: 0.25rem 0.75rem;
162
- border-radius: 6px;
163
- background: #1677ff;
164
- color: #fff;
162
+ border-radius: var(--vmz-radius-sm);
163
+ background: var(--vmz-action-primary-background);
164
+ color: var(--vmz-action-primary-foreground);
165
165
  font-size: 0.875rem;
166
166
  font-weight: 500;
167
167
  text-decoration: none;
@@ -169,13 +169,13 @@
169
169
  }
170
170
 
171
171
  .vmz-ui-console-shell__action:hover {
172
- color: #fff;
173
- background: #0958d9;
172
+ color: var(--vmz-action-primary-foreground);
173
+ background: var(--vmz-action-primary-active);
174
174
  }
175
175
 
176
176
  .vmz-ui-console-shell__action:focus-visible {
177
177
  outline: none;
178
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
178
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
179
179
  }
180
180
 
181
181
  .vmz-ui-console-shell__main {
@@ -192,7 +192,7 @@
192
192
  border-top: 1px solid var(--vmz-line-subtle, #e5e6eb);
193
193
  color: var(--vmz-text-steel, #646a73);
194
194
  font-size: 0.82rem;
195
- background: #fff;
195
+ background: var(--vmz-surface-paper);
196
196
  }
197
197
 
198
198
  @media (max-width: 40rem) {
@@ -80,7 +80,7 @@
80
80
  }
81
81
 
82
82
  .vmz-ui-datatable__box:focus-visible {
83
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
83
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
84
84
  }
85
85
 
86
86
  .vmz-ui-datatable tr[data-selected="true"] {
@@ -99,13 +99,13 @@
99
99
  }
100
100
 
101
101
  .vmz-ui-datatable__sort:focus-visible {
102
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
102
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
103
103
  }
104
104
 
105
105
  .vmz-ui-datatable__row-action {
106
106
  font: inherit;
107
107
  font-weight: 600;
108
- padding: 0.3rem 0.55rem;
108
+ padding: 0.25rem 0.5rem;
109
109
  border: 1px solid var(--vmz-line-default);
110
110
  border-radius: var(--vmz-radius-md, 6px);
111
111
  background: transparent;
@@ -115,7 +115,7 @@
115
115
  }
116
116
 
117
117
  .vmz-ui-datatable__row-action:focus-visible {
118
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
118
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
119
119
  }
120
120
 
121
121
  .vmz-ui-datatable__row-action:disabled {
@@ -63,7 +63,7 @@
63
63
  position: relative;
64
64
  display: flex;
65
65
  flex-direction: column;
66
- gap: 0.35rem;
66
+ gap: 0.375rem;
67
67
  max-width: 28rem;
68
68
  }
69
69
 
@@ -76,7 +76,7 @@
76
76
  display: inline-flex;
77
77
  align-items: center;
78
78
  justify-content: space-between;
79
- gap: 0.55rem;
79
+ gap: 0.5rem;
80
80
  width: 100%;
81
81
  box-sizing: border-box;
82
82
  font: inherit;
@@ -96,7 +96,7 @@
96
96
 
97
97
  .vmz-ui-date-picker__control:focus-visible,
98
98
  .vmz-ui-date-picker.is-opened .vmz-ui-date-picker__control {
99
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
99
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
100
100
  }
101
101
 
102
102
  .vmz-ui-date-picker__control:disabled {
@@ -133,7 +133,7 @@
133
133
  left: 0;
134
134
  right: 0;
135
135
  box-sizing: border-box;
136
- padding: 0.65rem 0.75rem 0.75rem;
136
+ padding: 0.625rem 0.75rem 0.75rem;
137
137
  border: 1px solid var(--vmz-line-default);
138
138
  border-radius: var(--vmz-radius-md, 6px);
139
139
  background: var(--vmz-surface-paper, #fff);
@@ -147,7 +147,7 @@
147
147
  align-items: center;
148
148
  justify-content: space-between;
149
149
  gap: 0.5rem;
150
- margin-bottom: 0.55rem;
150
+ margin-bottom: 0.5rem;
151
151
  }
152
152
 
153
153
  .vmz-ui-date-picker__month {
@@ -176,13 +176,13 @@
176
176
  .vmz-ui-date-picker__nav:hover,
177
177
  .vmz-ui-date-picker__nav:focus-visible {
178
178
  border-color: var(--vmz-action-primary-background);
179
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
179
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
180
180
  }
181
181
 
182
182
  .vmz-ui-date-picker__weekdays {
183
183
  display: grid;
184
184
  grid-template-columns: repeat(7, 1fr);
185
- gap: 0.15rem;
185
+ gap: 0.125rem;
186
186
  margin-bottom: 0.25rem;
187
187
  font-size: 0.75rem;
188
188
  opacity: 0.7;
@@ -192,7 +192,7 @@
192
192
  .vmz-ui-date-picker__grid {
193
193
  display: grid;
194
194
  grid-template-columns: repeat(7, 1fr);
195
- gap: 0.15rem;
195
+ gap: 0.125rem;
196
196
  }
197
197
 
198
198
  .vmz-ui-date-picker__day {
@@ -211,7 +211,7 @@
211
211
  .vmz-ui-date-picker__day:hover,
212
212
  .vmz-ui-date-picker__day:focus-visible {
213
213
  background: color-mix(in srgb, var(--vmz-action-primary-background) 18%, transparent);
214
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
214
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
215
215
  }
216
216
 
217
217
  .vmz-ui-date-picker__day.is-outside {
@@ -86,7 +86,7 @@
86
86
  }
87
87
 
88
88
  .vmz-ui-dialog__panel:focus-visible {
89
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
89
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
90
90
  }
91
91
 
92
92
  .vmz-ui-dialog__title {
@@ -105,23 +105,42 @@
105
105
  .vmz-ui-dialog__close {
106
106
  font: inherit;
107
107
  font-size: 0.875rem;
108
- font-weight: 400;
108
+ font-weight: 500;
109
109
  min-height: var(--vmz-control-height, 2rem);
110
- padding: 0.25rem 0.95rem;
110
+ padding: 0.25rem 0.9375rem;
111
111
  border: 1px solid var(--vmz-line-default);
112
112
  border-radius: var(--vmz-radius-md, 6px);
113
113
  cursor: pointer;
114
- background: var(--vmz-surface-paper, #fff);
114
+ background: var(--vmz-surface-paper);
115
115
  color: var(--vmz-text-ink);
116
+ transition:
117
+ color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1)),
118
+ border-color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1)),
119
+ background-color var(--vmz-motion-control-duration, 150ms) var(--vmz-motion-control-easing, cubic-bezier(0.4, 0, 0.2, 1));
120
+ }
121
+
122
+ .vmz-ui-dialog__close[data-variant="primary"] {
123
+ background: var(--vmz-action-primary-background);
124
+ color: var(--vmz-action-primary-foreground);
125
+ border-color: transparent;
126
+ }
127
+
128
+ .vmz-ui-dialog__close[data-variant="primary"]:hover {
129
+ background: var(--vmz-action-primary-hover);
130
+ border-color: transparent;
131
+ }
132
+
133
+ .vmz-ui-dialog__close[data-variant="primary"]:active {
134
+ background: var(--vmz-action-primary-active);
116
135
  }
117
136
 
118
137
  .vmz-ui-dialog__close:hover {
119
- color: var(--vmz-action-primary-background);
120
- border-color: var(--vmz-action-primary-background);
138
+ color: var(--vmz-action-primary-hover);
139
+ border-color: var(--vmz-action-primary-hover);
121
140
  }
122
141
 
123
142
  .vmz-ui-dialog__close:focus-visible {
124
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
143
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
125
144
  }
126
145
 
127
146
  @keyframes vmz-ui-overlay-fade-in {
@@ -89,7 +89,7 @@
89
89
  }
90
90
 
91
91
  .vmz-ui-drawer__panel:focus-visible {
92
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
92
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
93
93
  }
94
94
 
95
95
  .vmz-ui-drawer__title {
@@ -111,7 +111,7 @@
111
111
  font-size: 0.875rem;
112
112
  font-weight: 400;
113
113
  min-height: var(--vmz-control-height, 2rem);
114
- padding: 0.25rem 0.95rem;
114
+ padding: 0.25rem 1rem;
115
115
  border: 1px solid var(--vmz-line-default);
116
116
  border-radius: var(--vmz-radius-md, 6px);
117
117
  cursor: pointer;
@@ -125,7 +125,7 @@
125
125
  }
126
126
 
127
127
  .vmz-ui-drawer__close:focus-visible {
128
- box-shadow: 0 0 0 2px var(--vmz-focus-ring);
128
+ box-shadow: 0 0 0 3px var(--vmz-focus-ring);
129
129
  }
130
130
 
131
131
  @keyframes vmz-ui-drawer-fade-in {