@vmz/ui 0.2.3 → 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 +107 -110
  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,45 +1,43 @@
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
7
- v-for="item in nav"
8
- :key="item.id"
9
- :href="item.href"
10
- :data-vmz-nav="item.id"
11
- :data-active="item.id === activeNavId ? 'true' : null"
12
- :aria-current="item.id === activeNavId ? 'page' : null"
13
- >
14
- {{ item.title }}
15
- </a>
16
- </nav>
17
- </aside>
18
- <div class="vmz-ui-console-shell__body">
19
- <header class="vmz-ui-console-shell__header" data-vmz-shell="header">
20
- <div class="vmz-ui-console-shell__header-copy">
21
- <p v-if="breadcrumbLabel" class="vmz-ui-console-shell__breadcrumb" data-vmz-shell="breadcrumb">{{ breadcrumbLabel }}</p>
22
- <h1 class="vmz-ui-console-shell__title">{{ title }}</h1>
23
- <p v-if="subtitle" class="vmz-ui-console-shell__subtitle">{{ subtitle }}</p>
24
- </div>
25
- <a
26
- v-if="primaryActionLabel && primaryActionHref"
27
- class="vmz-ui-console-shell__action"
28
- :href="primaryActionHref"
29
- >{{ primaryActionLabel }}</a>
30
- </header>
31
- <main class="vmz-ui-console-shell__main" data-vmz-shell="main">
32
- <slot />
33
- </main>
34
- <footer v-if="footer" class="vmz-ui-console-shell__footer" data-vmz-shell="footer">
35
- {{ footer }}
36
- </footer>
37
- </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>
38
37
  </div>
39
38
  </template>
40
-
41
39
  <style>
42
- .vmz-ui-console-shell {
40
+ .vmz-ui-console-shell {
43
41
  display: grid;
44
42
  grid-template-columns: 13rem minmax(0, 1fr);
45
43
  grid-template-rows: minmax(100%, 100%);
@@ -48,9 +46,9 @@
48
46
  height: 100dvh;
49
47
  color: inherit;
50
48
  background: var(--vmz-surface-page, #f5f6f8);
51
- }
49
+ }
52
50
 
53
- .vmz-ui-console-shell__sidebar {
51
+ .vmz-ui-console-shell__sidebar {
54
52
  display: flex;
55
53
  flex-direction: column;
56
54
  gap: 1rem;
@@ -59,30 +57,30 @@
59
57
  min-height: 100%;
60
58
  align-self: stretch;
61
59
  background: #fff;
62
- }
60
+ }
63
61
 
64
- .vmz-ui-console-shell__brand {
62
+ .vmz-ui-console-shell__brand {
65
63
  font: inherit;
66
64
  font-weight: 600;
67
65
  font-size: 1rem;
68
66
  letter-spacing: 0;
69
67
  text-decoration: none;
70
68
  color: #1f2329;
71
- }
69
+ }
72
70
 
73
- .vmz-ui-console-shell__brand:focus-visible {
71
+ .vmz-ui-console-shell__brand:focus-visible {
74
72
  outline: none;
75
73
  box-shadow: 0 0 0 2px var(--vmz-focus-ring);
76
- }
74
+ }
77
75
 
78
- .vmz-ui-console-shell__nav {
76
+ .vmz-ui-console-shell__nav {
79
77
  display: flex;
80
78
  flex-direction: column;
81
79
  gap: 0.25rem;
82
80
  flex: 1;
83
- }
81
+ }
84
82
 
85
- .vmz-ui-console-shell__nav a {
83
+ .vmz-ui-console-shell__nav a {
86
84
  font: inherit;
87
85
  font-weight: 400;
88
86
  font-size: 0.875rem;
@@ -91,29 +89,29 @@
91
89
  color: #51565d;
92
90
  padding: 0.45rem 0.55rem;
93
91
  border-radius: 6px;
94
- }
92
+ }
95
93
 
96
- .vmz-ui-console-shell__nav a[data-active='true'] {
94
+ .vmz-ui-console-shell__nav a[data-active="true"] {
97
95
  color: #0958d9;
98
96
  font-weight: 500;
99
97
  background: #e6f4ff;
100
- }
98
+ }
101
99
 
102
- .vmz-ui-console-shell__nav a:focus-visible {
100
+ .vmz-ui-console-shell__nav a:focus-visible {
103
101
  outline: none;
104
102
  box-shadow: 0 0 0 2px var(--vmz-focus-ring);
105
- }
103
+ }
106
104
 
107
- .vmz-ui-console-shell__body {
105
+ .vmz-ui-console-shell__body {
108
106
  display: flex;
109
107
  flex-direction: column;
110
108
  min-width: 0;
111
109
  min-height: 0;
112
110
  height: 100%;
113
111
  overflow: auto;
114
- }
112
+ }
115
113
 
116
- .vmz-ui-console-shell__header {
114
+ .vmz-ui-console-shell__header {
117
115
  position: sticky;
118
116
  top: 0;
119
117
  z-index: 20;
@@ -125,37 +123,37 @@
125
123
  padding: 0.75rem 1.5rem;
126
124
  border-bottom: 1px solid var(--vmz-line-subtle, #e5e6eb);
127
125
  background: #fff;
128
- }
126
+ }
129
127
 
130
- .vmz-ui-console-shell__header-copy {
128
+ .vmz-ui-console-shell__header-copy {
131
129
  display: grid;
132
130
  gap: 0.15rem;
133
131
  min-width: 0;
134
- }
132
+ }
135
133
 
136
- .vmz-ui-console-shell__breadcrumb {
134
+ .vmz-ui-console-shell__breadcrumb {
137
135
  margin: 0;
138
136
  color: #646a73;
139
137
  font-size: 0.8125rem;
140
138
  line-height: 1.25rem;
141
- }
139
+ }
142
140
 
143
- .vmz-ui-console-shell__title {
141
+ .vmz-ui-console-shell__title {
144
142
  margin: 0;
145
143
  font-size: 1.5rem;
146
144
  line-height: 2rem;
147
145
  font-weight: 600;
148
146
  color: #1f2329;
149
- }
147
+ }
150
148
 
151
- .vmz-ui-console-shell__subtitle {
149
+ .vmz-ui-console-shell__subtitle {
152
150
  margin: 0;
153
151
  color: #51565d;
154
152
  font-size: 0.875rem;
155
153
  line-height: 1.375rem;
156
- }
154
+ }
157
155
 
158
- .vmz-ui-console-shell__action {
156
+ .vmz-ui-console-shell__action {
159
157
  display: inline-flex;
160
158
  align-items: center;
161
159
  justify-content: center;
@@ -168,87 +166,86 @@
168
166
  font-weight: 500;
169
167
  text-decoration: none;
170
168
  white-space: nowrap;
171
- }
169
+ }
172
170
 
173
- .vmz-ui-console-shell__action:hover {
171
+ .vmz-ui-console-shell__action:hover {
174
172
  color: #fff;
175
173
  background: #0958d9;
176
- }
174
+ }
177
175
 
178
- .vmz-ui-console-shell__action:focus-visible {
176
+ .vmz-ui-console-shell__action:focus-visible {
179
177
  outline: none;
180
178
  box-shadow: 0 0 0 2px var(--vmz-focus-ring);
181
- }
179
+ }
182
180
 
183
- .vmz-ui-console-shell__main {
181
+ .vmz-ui-console-shell__main {
184
182
  flex: 1 1 auto;
185
183
  padding: 1.5rem;
186
184
  display: flex;
187
185
  flex-direction: column;
188
186
  gap: 1rem;
189
- }
187
+ }
190
188
 
191
- .vmz-ui-console-shell__footer {
189
+ .vmz-ui-console-shell__footer {
192
190
  margin-top: auto;
193
191
  padding: 0.85rem 1.5rem 1.1rem;
194
192
  border-top: 1px solid var(--vmz-line-subtle, #e5e6eb);
195
193
  color: var(--vmz-text-steel, #646a73);
196
194
  font-size: 0.82rem;
197
195
  background: #fff;
198
- }
196
+ }
199
197
 
200
- @media (max-width: 40rem) {
198
+ @media (max-width: 40rem) {
201
199
  .vmz-ui-console-shell {
202
- grid-template-columns: 1fr;
203
- grid-template-rows: auto minmax(0, 1fr);
204
- height: auto;
205
- min-height: 100dvh;
200
+ grid-template-columns: 1fr;
201
+ grid-template-rows: auto minmax(0, 1fr);
202
+ height: auto;
203
+ min-height: 100dvh;
206
204
  }
207
205
 
208
206
  .vmz-ui-console-shell__sidebar {
209
- border-right: 0;
210
- border-bottom: 1px solid var(--vmz-line-subtle, #e5e6eb);
207
+ border-right: 0;
208
+ border-bottom: 1px solid var(--vmz-line-subtle, #e5e6eb);
211
209
  }
212
210
 
213
211
  .vmz-ui-console-shell__nav {
214
- flex-direction: row;
215
- flex-wrap: wrap;
216
- flex: 0;
212
+ flex-direction: row;
213
+ flex-wrap: wrap;
214
+ flex: 0;
217
215
  }
218
216
 
219
217
  .vmz-ui-console-shell__header {
220
- flex-direction: column;
221
- align-items: flex-start;
222
- padding-inline: 1rem;
218
+ flex-direction: column;
219
+ align-items: flex-start;
220
+ padding-inline: 1rem;
223
221
  }
224
222
 
225
223
  .vmz-ui-console-shell__main {
226
- padding: 1rem;
224
+ padding: 1rem;
227
225
  }
228
- }
226
+ }
229
227
  </style>
230
-
231
228
  <script client>
232
229
  /**
233
- * VMZ UI — ConsoleShell (Console composition).
234
- * Sidebar + sticky header + main slot + optional footer. Parent supplies nav.
235
- */
230
+ * VMZ UI — ConsoleShell (Console composition).
231
+ * Sidebar + sticky header + main slot + optional footer. Parent supplies nav.
232
+ */
236
233
  export default class ConsoleShell {
237
- public brand: string = "VMZ";
238
- public homeHref: string = "/";
239
- public title: string = "Console";
240
- public subtitle: string = "";
241
- public breadcrumbLabel: string = "";
242
- public primaryActionLabel: string = "";
243
- public primaryActionHref: string = "";
244
- public activeNavId: string = "";
245
- public navLabel: string = "Console";
246
- public footer: string = "";
247
- /** @type {{ id: string, title: string, href: string }[]} */
248
- public nav: {
249
- id: string;
250
- title: string;
251
- href: string;
252
- }[] = [];
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
+ }[] = [];
253
250
  }
254
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>