@vmz/ui 0.2.2 → 0.2.4

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 (63) hide show
  1. package/package.json +1 -1
  2. package/src/components/Accordion.vmz +46 -63
  3. package/src/components/Alert.vmz +35 -38
  4. package/src/components/AppShell.vmz +92 -75
  5. package/src/components/Autocomplete.vmz +91 -119
  6. package/src/components/Avatar.vmz +37 -8
  7. package/src/components/Badge.vmz +29 -23
  8. package/src/components/Breadcrumb.vmz +36 -34
  9. package/src/components/BulkActions.vmz +22 -28
  10. package/src/components/Button.vmz +139 -121
  11. package/src/components/Callout.vmz +33 -36
  12. package/src/components/Card.vmz +68 -51
  13. package/src/components/Checkbox.vmz +28 -47
  14. package/src/components/CodeBlock.vmz +31 -25
  15. package/src/components/Collapse.vmz +34 -16
  16. package/src/components/ConsoleShell.vmz +183 -94
  17. package/src/components/Content.vmz +8 -4
  18. package/src/components/DataTable.vmz +124 -150
  19. package/src/components/DatePicker.vmz +526 -521
  20. package/src/components/Dialog.vmz +408 -327
  21. package/src/components/Divider.vmz +38 -11
  22. package/src/components/Drawer.vmz +325 -318
  23. package/src/components/Dropdown.vmz +53 -19
  24. package/src/components/Empty.vmz +23 -21
  25. package/src/components/Field.vmz +77 -83
  26. package/src/components/FilterBar.vmz +8 -10
  27. package/src/components/Flex.vmz +21 -6
  28. package/src/components/Footer.vmz +9 -4
  29. package/src/components/Form.vmz +35 -46
  30. package/src/components/FormItem.vmz +44 -43
  31. package/src/components/Grid.vmz +22 -6
  32. package/src/components/Header.vmz +11 -4
  33. package/src/components/Icon.vmz +43 -44
  34. package/src/components/Layout.vmz +9 -4
  35. package/src/components/Link.vmz +17 -25
  36. package/src/components/List.vmz +62 -75
  37. package/src/components/Menu.vmz +182 -197
  38. package/src/components/Notification.vmz +35 -38
  39. package/src/components/Pagination.vmz +37 -47
  40. package/src/components/Popover.vmz +157 -171
  41. package/src/components/Progress.vmz +36 -10
  42. package/src/components/Prose.vmz +29 -31
  43. package/src/components/QueryForm.vmz +14 -22
  44. package/src/components/RadioGroup.vmz +70 -84
  45. package/src/components/Result.vmz +36 -38
  46. package/src/components/Segmented.vmz +43 -22
  47. package/src/components/Select.vmz +404 -411
  48. package/src/components/Sider.vmz +21 -4
  49. package/src/components/Skeleton.vmz +34 -42
  50. package/src/components/Space.vmz +24 -9
  51. package/src/components/Spinner.vmz +17 -23
  52. package/src/components/Steps.vmz +48 -51
  53. package/src/components/Switch.vmz +50 -60
  54. package/src/components/Table.vmz +81 -84
  55. package/src/components/Tabs.vmz +66 -88
  56. package/src/components/Tag.vmz +36 -11
  57. package/src/components/TextArea.vmz +73 -77
  58. package/src/components/Timeline.vmz +36 -32
  59. package/src/components/Toc.vmz +31 -37
  60. package/src/components/Tooltip.vmz +25 -35
  61. package/src/components/Tree.vmz +127 -144
  62. package/src/components/Typography.vmz +33 -7
  63. package/src/components/Upload.vmz +1135 -1057
@@ -1,74 +1,55 @@
1
1
  <template>
2
- <label class="vmz-ui-checkbox" data-vmz-ui="checkbox" :for="controlId">
3
- <input
4
- :id="controlId"
5
- class="vmz-ui-checkbox__input"
6
- type="checkbox"
7
- :checked="checked"
8
- :disabled="disabled"
9
- :aria-describedby="describedBy"
10
- @click="onToggle"
11
- />
12
- <span class="vmz-ui-checkbox__label">{{ label }}</span>
2
+ <label data-vmz-ui="checkbox" :for="controlId" class="vmz-ui-checkbox">
3
+ <input :id="controlId" type="checkbox" :checked="checked" :disabled="disabled" :aria-describedby="describedBy" @change="onToggle" class="vmz-ui-checkbox__input" />
4
+ <span class="vmz-ui-checkbox__label">
5
+ {{ label }}
6
+ </span>
13
7
  </label>
14
8
  </template>
15
-
16
9
  <style>
17
- .vmz-ui-checkbox {
10
+ .vmz-ui-checkbox {
18
11
  display: inline-flex;
19
12
  align-items: center;
20
13
  gap: 0.45rem;
21
14
  font: inherit;
22
15
  cursor: pointer;
23
- }
16
+ }
24
17
 
25
- .vmz-ui-checkbox__input {
18
+ .vmz-ui-checkbox__input {
26
19
  width: 1rem;
27
20
  height: 1rem;
28
21
  accent-color: var(--vmz-action-primary-background);
29
22
  outline: none;
30
- }
23
+ }
31
24
 
32
- .vmz-ui-checkbox__input:focus-visible {
25
+ .vmz-ui-checkbox__input:focus-visible {
33
26
  box-shadow: 0 0 0 2px var(--vmz-focus-ring);
34
- }
27
+ }
35
28
 
36
- .vmz-ui-checkbox__input:disabled {
29
+ .vmz-ui-checkbox__input:disabled {
37
30
  opacity: 0.55;
38
31
  cursor: not-allowed;
39
- }
32
+ }
40
33
 
41
- .vmz-ui-checkbox__label {
34
+ .vmz-ui-checkbox__label {
42
35
  font-weight: 600;
43
- }
36
+ }
44
37
  </style>
45
-
46
38
  <script client>
47
39
  /**
48
- * VMZ UI — Checkbox (UI2).
49
- * Label association via wrapping label + for/id; parent owns checked (no parallel form store).
50
- * Toggle goes through onChange so live `checked` prop stays authoritative.
51
- */
40
+ * VMZ UI — Checkbox (UI2).
41
+ * Label association via wrapping label + for/id; parent owns checked (no parallel form store).
42
+ * Native change reports the committed checked state to the parent.
43
+ */
52
44
  export default class Checkbox {
53
- public label: string = "";
54
- public checked: boolean = false;
55
- public disabled: boolean = false;
56
- public controlId: string = "vmz-checkbox";
57
- public describedBy: string = "";
58
- public onChange: ((e: {
59
- target: {
60
- checked: boolean;
61
- };
62
- }) => void) | null = null;
63
- onToggle(ev) {
64
- if (this.disabled) return;
65
- if (ev && typeof ev.preventDefault === "function") ev.preventDefault();
66
- const next = !this.checked;
67
- const payload = { target: { checked: next } };
68
- this.emit("change", payload);
69
- if (typeof this.onChange === "function") {
70
- this.onChange(payload);
71
- }
72
- }
45
+ public label: string = "";
46
+ public checked: boolean = false;
47
+ public disabled: boolean = false;
48
+ public controlId: string = "vmz-checkbox";
49
+ public describedBy: string = "";
50
+ onToggle(ev) {
51
+ if (this.disabled) return;
52
+ this.emit("change", !!ev?.target?.checked);
53
+ }
73
54
  }
74
55
  </script>
@@ -1,15 +1,22 @@
1
1
  <template>
2
- <figure class="vmz-ui-code-block" data-vmz-ui="code-block">
3
- <div class="vmz-ui-code-block__bar">
4
- <figcaption v-if="caption" class="vmz-ui-code-block__caption">{{ caption }}</figcaption>
5
- <Button type="button" variant="ghost" @click="onCopy">{{ copyLabel }}</Button>
6
- </div>
7
- <pre class="vmz-ui-code-block__pre"><code class="vmz-ui-code-block__code">{{ code }}</code></pre>
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">
8
+ {{ copyLabel }}
9
+ </Button>
10
+ </div>
11
+ <pre class="vmz-ui-code-block__pre">
12
+ <code class="vmz-ui-code-block__code">
13
+ {{ code }}
14
+ </code>
15
+ </pre>
8
16
  </figure>
9
17
  </template>
10
-
11
18
  <style>
12
- .vmz-ui-code-block {
19
+ .vmz-ui-code-block {
13
20
  margin: 0;
14
21
  display: flex;
15
22
  flex-direction: column;
@@ -18,9 +25,9 @@
18
25
  border-radius: var(--vmz-radius-md, 6px);
19
26
  background: var(--vmz-surface-mist);
20
27
  overflow: hidden;
21
- }
28
+ }
22
29
 
23
- .vmz-ui-code-block__bar {
30
+ .vmz-ui-code-block__bar {
24
31
  display: flex;
25
32
  flex-wrap: wrap;
26
33
  align-items: center;
@@ -29,39 +36,38 @@
29
36
  padding: 0.35rem 0.55rem;
30
37
  border-bottom: 1px solid var(--vmz-line-default);
31
38
  background: var(--vmz-surface-paper);
32
- }
39
+ }
33
40
 
34
- .vmz-ui-code-block__caption {
41
+ .vmz-ui-code-block__caption {
35
42
  margin: 0;
36
43
  font-family: var(--vmz-font-mono);
37
44
  font-size: 0.8rem;
38
45
  color: var(--vmz-text-steel);
39
- }
46
+ }
40
47
 
41
- .vmz-ui-code-block__pre {
48
+ .vmz-ui-code-block__pre {
42
49
  margin: 0;
43
50
  padding: 0.85rem 1rem;
44
51
  overflow-x: auto;
45
- }
52
+ }
46
53
 
47
- .vmz-ui-code-block__code {
54
+ .vmz-ui-code-block__code {
48
55
  font-family: var(--vmz-font-mono);
49
56
  font-size: 0.88rem;
50
57
  line-height: 1.5;
51
58
  color: var(--vmz-text-ink);
52
59
  white-space: pre;
53
- }
60
+ }
54
61
  </style>
55
-
56
62
  <script client>
57
63
  /**
58
- * VMZ UI — CodeBlock (Document/Product composition).
59
- * Source is readable in SSR HTML; copy is progressive enhancement via onCopy.
60
- */
64
+ * VMZ UI — CodeBlock (Document/Product composition).
65
+ * Source is readable in SSR HTML; copy is progressive enhancement via onCopy.
66
+ */
61
67
  export default class CodeBlock {
62
- public code: string = "";
63
- public caption: string = "";
64
- public copyLabel: string = "Copy";
65
- public onCopy: ((e: Event) => void) | null = null;
68
+ public code: string = "";
69
+ public caption: string = "";
70
+ public copyLabel: string = "Copy";
71
+ public onCopy: ((e: Event) => void) | null = null;
66
72
  }
67
73
  </script>
@@ -1,24 +1,42 @@
1
1
  <template>
2
- <div class="vmz-ui-collapse" data-vmz-ui="collapse">
3
- <details
4
- v-for="item in items"
5
- :key="item.id"
6
- :data-vmz-collapse-item="item.id"
7
- >
8
- <summary :data-vmz-collapse-trigger="item.id">{{ item.title }}</summary>
9
- <div class="vmz-ui-collapse__body" :data-vmz-collapse-body="item.id">{{ item.body }}</div>
10
- </details>
11
- </div>
2
+ <div data-vmz-ui="collapse" class="vmz-ui-collapse">
3
+ <details v-for="item in items" :key="item.id" :data-vmz-collapse-item="item.id">
4
+ <summary :data-vmz-collapse-trigger="item.id">
5
+ {{ item.title }}
6
+ </summary>
7
+ <div :data-vmz-collapse-body="item.id" class="vmz-ui-collapse__body">
8
+ {{ item.body }}
9
+ </div>
10
+ </details>
11
+ </div>
12
12
  </template>
13
13
  <style>
14
- .vmz-ui-collapse{border:1px solid var(--vmz-line-default);border-radius:var(--vmz-radius-lg,8px);background:var(--vmz-surface-paper);overflow:hidden}
15
- .vmz-ui-collapse details+details{border-top:1px solid var(--vmz-line-default)}
16
- .vmz-ui-collapse summary{padding:.85rem 1rem;font-weight:600;cursor:pointer;background:var(--vmz-surface-paper)}
17
- .vmz-ui-collapse summary:hover{background:var(--vmz-surface-mist)}
18
- .vmz-ui-collapse__body{padding:0 1rem 1rem;color:var(--vmz-text-steel);line-height:1.6}
14
+ .vmz-ui-collapse {
15
+ border: 1px solid var(--vmz-line-default);
16
+ border-radius: var(--vmz-radius-lg, 8px);
17
+ background: var(--vmz-surface-paper);
18
+ overflow: hidden;
19
+ }
20
+ .vmz-ui-collapse details + details {
21
+ border-top: 1px solid var(--vmz-line-default);
22
+ }
23
+ .vmz-ui-collapse summary {
24
+ padding: 0.85rem 1rem;
25
+ font-weight: 600;
26
+ cursor: pointer;
27
+ background: var(--vmz-surface-paper);
28
+ }
29
+ .vmz-ui-collapse summary:hover {
30
+ background: var(--vmz-surface-mist);
31
+ }
32
+ .vmz-ui-collapse__body {
33
+ padding: 0 1rem 1rem;
34
+ color: var(--vmz-text-steel);
35
+ line-height: 1.6;
36
+ }
19
37
  </style>
20
38
  <script client>
21
39
  export default class Collapse {
22
- public items: Array<{ id: string; title: string; body: string }> = [];
40
+ public items: Array<{ id: string; title: string; body: string }> = [];
23
41
  }
24
42
  </script>
@@ -1,162 +1,251 @@
1
1
  <template>
2
- <div class="vmz-ui-console-shell" data-vmz-ui="console-shell">
3
- <aside class="vmz-ui-console-shell__sidebar" data-vmz-shell="sidebar" :aria-label="navLabel">
4
- <a class="vmz-ui-console-shell__brand" :href="homeHref">{{ brand }}</a>
5
- <nav class="vmz-ui-console-shell__nav">
6
- <a v-for="item in nav" :key="item.id" :href="item.href" :data-vmz-nav="item.id">
7
- {{ item.title }}
8
- </a>
9
- </nav>
10
- </aside>
11
- <div class="vmz-ui-console-shell__body">
12
- <header class="vmz-ui-console-shell__header" data-vmz-shell="header">
13
- <h1 class="vmz-ui-console-shell__title">{{ title }}</h1>
14
- </header>
15
- <main class="vmz-ui-console-shell__main" data-vmz-shell="main">
16
- <slot />
17
- </main>
18
- <footer v-if="footer" class="vmz-ui-console-shell__footer" data-vmz-shell="footer">
19
- {{ footer }}
20
- </footer>
21
- </div>
2
+ <div data-vmz-ui="console-shell" class="vmz-ui-console-shell">
3
+ <aside data-vmz-shell="sidebar" :aria-label="navLabel" class="vmz-ui-console-shell__sidebar">
4
+ <a :href="homeHref" class="vmz-ui-console-shell__brand">
5
+ {{ brand }}
6
+ </a>
7
+ <nav class="vmz-ui-console-shell__nav">
8
+ <a v-for="item in nav" :key="item.id" :href="item.href" :data-vmz-nav="item.id" :data-active='item.id === activeNavId ? "true" : null' :aria-current='item.id === activeNavId ? "page" : null'>
9
+ {{ item.title }}
10
+ </a>
11
+ </nav>
12
+ </aside>
13
+ <div class="vmz-ui-console-shell__body">
14
+ <header data-vmz-shell="header" class="vmz-ui-console-shell__header">
15
+ <div class="vmz-ui-console-shell__header-copy">
16
+ <p v-if="breadcrumbLabel" data-vmz-shell="breadcrumb" class="vmz-ui-console-shell__breadcrumb">
17
+ {{ breadcrumbLabel }}
18
+ </p>
19
+ <h1 class="vmz-ui-console-shell__title">
20
+ {{ title }}
21
+ </h1>
22
+ <p v-if="subtitle" class="vmz-ui-console-shell__subtitle">
23
+ {{ subtitle }}
24
+ </p>
25
+ </div>
26
+ <a v-if="primaryActionLabel && primaryActionHref" :href="primaryActionHref" class="vmz-ui-console-shell__action">
27
+ {{ primaryActionLabel }}
28
+ </a>
29
+ </header>
30
+ <main data-vmz-shell="main" class="vmz-ui-console-shell__main">
31
+ <slot />
32
+ </main>
33
+ <footer v-if="footer" data-vmz-shell="footer" class="vmz-ui-console-shell__footer">
34
+ {{ footer }}
35
+ </footer>
36
+ </div>
22
37
  </div>
23
38
  </template>
24
-
25
39
  <style>
26
- .vmz-ui-console-shell {
40
+ .vmz-ui-console-shell {
27
41
  display: grid;
28
- grid-template-columns: minmax(12rem, 15rem) minmax(0, 1fr);
42
+ grid-template-columns: 13rem minmax(0, 1fr);
29
43
  grid-template-rows: minmax(100%, 100%);
30
44
  min-height: 100vh;
31
45
  min-height: 100dvh;
32
46
  height: 100dvh;
33
47
  color: inherit;
34
- background: var(--vmz-surface-page, #f5f5f5);
35
- }
48
+ background: var(--vmz-surface-page, #f5f6f8);
49
+ }
36
50
 
37
- .vmz-ui-console-shell__sidebar {
51
+ .vmz-ui-console-shell__sidebar {
38
52
  display: flex;
39
53
  flex-direction: column;
40
54
  gap: 1rem;
41
- padding: 1.15rem 0.95rem 1.5rem;
42
- border-right: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
55
+ padding: 1rem 0.75rem 1.5rem;
56
+ border-right: 1px solid var(--vmz-line-subtle, #e5e6eb);
43
57
  min-height: 100%;
44
58
  align-self: stretch;
45
- }
59
+ background: #fff;
60
+ }
46
61
 
47
- .vmz-ui-console-shell__brand {
62
+ .vmz-ui-console-shell__brand {
48
63
  font: inherit;
49
- font-weight: 700;
50
- font-size: 1.05rem;
51
- letter-spacing: 0.04em;
64
+ font-weight: 600;
65
+ font-size: 1rem;
66
+ letter-spacing: 0;
52
67
  text-decoration: none;
53
- color: var(--vmz-action-primary-background);
54
- }
68
+ color: #1f2329;
69
+ }
55
70
 
56
- .vmz-ui-console-shell__brand:focus-visible {
71
+ .vmz-ui-console-shell__brand:focus-visible {
57
72
  outline: none;
58
73
  box-shadow: 0 0 0 2px var(--vmz-focus-ring);
59
- }
74
+ }
60
75
 
61
- .vmz-ui-console-shell__nav {
76
+ .vmz-ui-console-shell__nav {
62
77
  display: flex;
63
78
  flex-direction: column;
64
- gap: 0.35rem;
79
+ gap: 0.25rem;
65
80
  flex: 1;
66
- }
81
+ }
67
82
 
68
- .vmz-ui-console-shell__nav a {
83
+ .vmz-ui-console-shell__nav a {
69
84
  font: inherit;
70
- font-weight: 600;
85
+ font-weight: 400;
86
+ font-size: 0.875rem;
87
+ line-height: 1.375rem;
71
88
  text-decoration: none;
72
- color: var(--vmz-action-primary-active);
89
+ color: #51565d;
73
90
  padding: 0.45rem 0.55rem;
74
- }
91
+ border-radius: 6px;
92
+ }
75
93
 
76
- .vmz-ui-console-shell__nav a:focus-visible {
94
+ .vmz-ui-console-shell__nav a[data-active="true"] {
95
+ color: #0958d9;
96
+ font-weight: 500;
97
+ background: #e6f4ff;
98
+ }
99
+
100
+ .vmz-ui-console-shell__nav a:focus-visible {
77
101
  outline: none;
78
102
  box-shadow: 0 0 0 2px var(--vmz-focus-ring);
79
- }
103
+ }
80
104
 
81
- .vmz-ui-console-shell__body {
105
+ .vmz-ui-console-shell__body {
82
106
  display: flex;
83
107
  flex-direction: column;
84
108
  min-width: 0;
85
109
  min-height: 0;
86
110
  height: 100%;
87
111
  overflow: auto;
88
- }
112
+ }
89
113
 
90
- .vmz-ui-console-shell__header {
114
+ .vmz-ui-console-shell__header {
91
115
  position: sticky;
92
116
  top: 0;
93
117
  z-index: 20;
94
- padding: 0.9rem 1.25rem;
95
- border-bottom: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
96
- background: var(--vmz-surface-paper, #fff);
97
- }
118
+ display: flex;
119
+ align-items: center;
120
+ justify-content: space-between;
121
+ gap: 1rem;
122
+ min-height: 3.5rem;
123
+ padding: 0.75rem 1.5rem;
124
+ border-bottom: 1px solid var(--vmz-line-subtle, #e5e6eb);
125
+ background: #fff;
126
+ }
127
+
128
+ .vmz-ui-console-shell__header-copy {
129
+ display: grid;
130
+ gap: 0.15rem;
131
+ min-width: 0;
132
+ }
133
+
134
+ .vmz-ui-console-shell__breadcrumb {
135
+ margin: 0;
136
+ color: #646a73;
137
+ font-size: 0.8125rem;
138
+ line-height: 1.25rem;
139
+ }
98
140
 
99
- .vmz-ui-console-shell__title {
141
+ .vmz-ui-console-shell__title {
100
142
  margin: 0;
101
- font-size: 1.15rem;
102
- font-weight: 700;
103
- color: var(--vmz-action-primary-active);
104
- }
143
+ font-size: 1.5rem;
144
+ line-height: 2rem;
145
+ font-weight: 600;
146
+ color: #1f2329;
147
+ }
148
+
149
+ .vmz-ui-console-shell__subtitle {
150
+ margin: 0;
151
+ color: #51565d;
152
+ font-size: 0.875rem;
153
+ line-height: 1.375rem;
154
+ }
155
+
156
+ .vmz-ui-console-shell__action {
157
+ display: inline-flex;
158
+ align-items: center;
159
+ justify-content: center;
160
+ min-height: 2rem;
161
+ padding: 0.25rem 0.75rem;
162
+ border-radius: 6px;
163
+ background: #1677ff;
164
+ color: #fff;
165
+ font-size: 0.875rem;
166
+ font-weight: 500;
167
+ text-decoration: none;
168
+ white-space: nowrap;
169
+ }
170
+
171
+ .vmz-ui-console-shell__action:hover {
172
+ color: #fff;
173
+ background: #0958d9;
174
+ }
105
175
 
106
- .vmz-ui-console-shell__main {
176
+ .vmz-ui-console-shell__action:focus-visible {
177
+ outline: none;
178
+ box-shadow: 0 0 0 2px var(--vmz-focus-ring);
179
+ }
180
+
181
+ .vmz-ui-console-shell__main {
107
182
  flex: 1 1 auto;
108
- padding: 1.15rem 1.25rem 1.5rem;
183
+ padding: 1.5rem;
109
184
  display: flex;
110
185
  flex-direction: column;
111
- gap: 0.85rem;
112
- }
186
+ gap: 1rem;
187
+ }
113
188
 
114
- .vmz-ui-console-shell__footer {
189
+ .vmz-ui-console-shell__footer {
115
190
  margin-top: auto;
116
- padding: 0.85rem 1.25rem 1.1rem;
117
- border-top: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
118
- color: var(--vmz-text-steel, #6b7466);
191
+ padding: 0.85rem 1.5rem 1.1rem;
192
+ border-top: 1px solid var(--vmz-line-subtle, #e5e6eb);
193
+ color: var(--vmz-text-steel, #646a73);
119
194
  font-size: 0.82rem;
120
- background: var(--vmz-surface-paper, #fff);
121
- }
195
+ background: #fff;
196
+ }
122
197
 
123
- @media (max-width: 40rem) {
198
+ @media (max-width: 40rem) {
124
199
  .vmz-ui-console-shell {
125
- grid-template-columns: 1fr;
126
- grid-template-rows: auto minmax(0, 1fr);
127
- height: auto;
128
- min-height: 100dvh;
200
+ grid-template-columns: 1fr;
201
+ grid-template-rows: auto minmax(0, 1fr);
202
+ height: auto;
203
+ min-height: 100dvh;
129
204
  }
130
205
 
131
206
  .vmz-ui-console-shell__sidebar {
132
- border-right: 0;
133
- border-bottom: 1px solid var(--vmz-line-subtle, var(--vmz-line-default));
207
+ border-right: 0;
208
+ border-bottom: 1px solid var(--vmz-line-subtle, #e5e6eb);
134
209
  }
135
210
 
136
211
  .vmz-ui-console-shell__nav {
137
- flex-direction: row;
138
- flex-wrap: wrap;
139
- flex: 0;
212
+ flex-direction: row;
213
+ flex-wrap: wrap;
214
+ flex: 0;
140
215
  }
141
- }
142
- </style>
143
216
 
217
+ .vmz-ui-console-shell__header {
218
+ flex-direction: column;
219
+ align-items: flex-start;
220
+ padding-inline: 1rem;
221
+ }
222
+
223
+ .vmz-ui-console-shell__main {
224
+ padding: 1rem;
225
+ }
226
+ }
227
+ </style>
144
228
  <script client>
145
229
  /**
146
- * VMZ UI — ConsoleShell (Console composition).
147
- * Sidebar + sticky header + main slot + optional footer. Parent supplies nav.
148
- */
230
+ * VMZ UI — ConsoleShell (Console composition).
231
+ * Sidebar + sticky header + main slot + optional footer. Parent supplies nav.
232
+ */
149
233
  export default class ConsoleShell {
150
- public brand: string = "VMZ";
151
- public homeHref: string = "/";
152
- public title: string = "Console";
153
- public navLabel: string = "Console";
154
- public footer: string = "";
155
- /** @type {{ id: string, title: string, href: string }[]} */
156
- public nav: {
157
- id: string;
158
- title: string;
159
- href: string;
160
- }[] = [];
234
+ public brand: string = "VMZ";
235
+ public homeHref: string = "/";
236
+ public title: string = "Console";
237
+ public subtitle: string = "";
238
+ public breadcrumbLabel: string = "";
239
+ public primaryActionLabel: string = "";
240
+ public primaryActionHref: string = "";
241
+ public activeNavId: string = "";
242
+ public navLabel: string = "Console";
243
+ public footer: string = "";
244
+ /** @type {{ id: string, title: string, href: string }[]} */
245
+ public nav: {
246
+ id: string;
247
+ title: string;
248
+ href: string;
249
+ }[] = [];
161
250
  }
162
251
  </script>
@@ -1,11 +1,15 @@
1
1
  <template>
2
- <main class="vmz-ui-content" data-vmz-ui="content"><slot /></main>
2
+ <main data-vmz-ui="content" class="vmz-ui-content">
3
+ <slot />
4
+ </main>
3
5
  </template>
4
-
5
6
  <style>
6
- .vmz-ui-content{flex:1;min-width:0;padding:1.5rem}
7
+ .vmz-ui-content {
8
+ flex: 1;
9
+ min-width: 0;
10
+ padding: 1.5rem;
11
+ }
7
12
  </style>
8
-
9
13
  <script client>
10
14
  export default class Content {}
11
15
  </script>