@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.
- package/package.json +1 -1
- package/src/components/Accordion.vmz +46 -63
- package/src/components/Alert.vmz +35 -38
- package/src/components/AppShell.vmz +92 -75
- package/src/components/Autocomplete.vmz +91 -119
- package/src/components/Avatar.vmz +37 -8
- package/src/components/Badge.vmz +29 -23
- package/src/components/Breadcrumb.vmz +36 -34
- package/src/components/BulkActions.vmz +22 -28
- package/src/components/Button.vmz +139 -121
- package/src/components/Callout.vmz +33 -36
- package/src/components/Card.vmz +68 -51
- package/src/components/Checkbox.vmz +28 -47
- package/src/components/CodeBlock.vmz +31 -25
- package/src/components/Collapse.vmz +34 -16
- package/src/components/ConsoleShell.vmz +183 -94
- package/src/components/Content.vmz +8 -4
- package/src/components/DataTable.vmz +124 -150
- package/src/components/DatePicker.vmz +526 -521
- package/src/components/Dialog.vmz +408 -327
- package/src/components/Divider.vmz +38 -11
- package/src/components/Drawer.vmz +325 -318
- package/src/components/Dropdown.vmz +53 -19
- package/src/components/Empty.vmz +23 -21
- package/src/components/Field.vmz +77 -83
- package/src/components/FilterBar.vmz +8 -10
- package/src/components/Flex.vmz +21 -6
- package/src/components/Footer.vmz +9 -4
- package/src/components/Form.vmz +35 -46
- package/src/components/FormItem.vmz +44 -43
- package/src/components/Grid.vmz +22 -6
- package/src/components/Header.vmz +11 -4
- package/src/components/Icon.vmz +43 -44
- package/src/components/Layout.vmz +9 -4
- package/src/components/Link.vmz +17 -25
- package/src/components/List.vmz +62 -75
- package/src/components/Menu.vmz +182 -197
- package/src/components/Notification.vmz +35 -38
- package/src/components/Pagination.vmz +37 -47
- package/src/components/Popover.vmz +157 -171
- package/src/components/Progress.vmz +36 -10
- package/src/components/Prose.vmz +29 -31
- package/src/components/QueryForm.vmz +14 -22
- package/src/components/RadioGroup.vmz +70 -84
- package/src/components/Result.vmz +36 -38
- package/src/components/Segmented.vmz +43 -22
- package/src/components/Select.vmz +404 -411
- package/src/components/Sider.vmz +21 -4
- package/src/components/Skeleton.vmz +34 -42
- package/src/components/Space.vmz +24 -9
- package/src/components/Spinner.vmz +17 -23
- package/src/components/Steps.vmz +48 -51
- package/src/components/Switch.vmz +50 -60
- package/src/components/Table.vmz +81 -84
- package/src/components/Tabs.vmz +66 -88
- package/src/components/Tag.vmz +36 -11
- package/src/components/TextArea.vmz +73 -77
- package/src/components/Timeline.vmz +36 -32
- package/src/components/Toc.vmz +31 -37
- package/src/components/Tooltip.vmz +25 -35
- package/src/components/Tree.vmz +127 -144
- package/src/components/Typography.vmz +33 -7
- package/src/components/Upload.vmz +1135 -1057
|
@@ -1,74 +1,55 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
25
|
+
.vmz-ui-checkbox__input:focus-visible {
|
|
33
26
|
box-shadow: 0 0 0 2px var(--vmz-focus-ring);
|
|
34
|
-
|
|
27
|
+
}
|
|
35
28
|
|
|
36
|
-
|
|
29
|
+
.vmz-ui-checkbox__input:disabled {
|
|
37
30
|
opacity: 0.55;
|
|
38
31
|
cursor: not-allowed;
|
|
39
|
-
|
|
32
|
+
}
|
|
40
33
|
|
|
41
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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{
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
40
|
+
public items: Array<{ id: string; title: string; body: string }> = [];
|
|
23
41
|
}
|
|
24
42
|
</script>
|
|
@@ -1,162 +1,251 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
40
|
+
.vmz-ui-console-shell {
|
|
27
41
|
display: grid;
|
|
28
|
-
grid-template-columns:
|
|
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, #
|
|
35
|
-
|
|
48
|
+
background: var(--vmz-surface-page, #f5f6f8);
|
|
49
|
+
}
|
|
36
50
|
|
|
37
|
-
|
|
51
|
+
.vmz-ui-console-shell__sidebar {
|
|
38
52
|
display: flex;
|
|
39
53
|
flex-direction: column;
|
|
40
54
|
gap: 1rem;
|
|
41
|
-
padding:
|
|
42
|
-
border-right: 1px solid var(--vmz-line-subtle,
|
|
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
|
-
|
|
62
|
+
.vmz-ui-console-shell__brand {
|
|
48
63
|
font: inherit;
|
|
49
|
-
font-weight:
|
|
50
|
-
font-size:
|
|
51
|
-
letter-spacing: 0
|
|
64
|
+
font-weight: 600;
|
|
65
|
+
font-size: 1rem;
|
|
66
|
+
letter-spacing: 0;
|
|
52
67
|
text-decoration: none;
|
|
53
|
-
color:
|
|
54
|
-
|
|
68
|
+
color: #1f2329;
|
|
69
|
+
}
|
|
55
70
|
|
|
56
|
-
|
|
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
|
-
|
|
76
|
+
.vmz-ui-console-shell__nav {
|
|
62
77
|
display: flex;
|
|
63
78
|
flex-direction: column;
|
|
64
|
-
gap: 0.
|
|
79
|
+
gap: 0.25rem;
|
|
65
80
|
flex: 1;
|
|
66
|
-
|
|
81
|
+
}
|
|
67
82
|
|
|
68
|
-
|
|
83
|
+
.vmz-ui-console-shell__nav a {
|
|
69
84
|
font: inherit;
|
|
70
|
-
font-weight:
|
|
85
|
+
font-weight: 400;
|
|
86
|
+
font-size: 0.875rem;
|
|
87
|
+
line-height: 1.375rem;
|
|
71
88
|
text-decoration: none;
|
|
72
|
-
color:
|
|
89
|
+
color: #51565d;
|
|
73
90
|
padding: 0.45rem 0.55rem;
|
|
74
|
-
|
|
91
|
+
border-radius: 6px;
|
|
92
|
+
}
|
|
75
93
|
|
|
76
|
-
|
|
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
|
-
|
|
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
|
-
|
|
114
|
+
.vmz-ui-console-shell__header {
|
|
91
115
|
position: sticky;
|
|
92
116
|
top: 0;
|
|
93
117
|
z-index: 20;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
141
|
+
.vmz-ui-console-shell__title {
|
|
100
142
|
margin: 0;
|
|
101
|
-
font-size: 1.
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
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.
|
|
183
|
+
padding: 1.5rem;
|
|
109
184
|
display: flex;
|
|
110
185
|
flex-direction: column;
|
|
111
|
-
gap:
|
|
112
|
-
|
|
186
|
+
gap: 1rem;
|
|
187
|
+
}
|
|
113
188
|
|
|
114
|
-
|
|
189
|
+
.vmz-ui-console-shell__footer {
|
|
115
190
|
margin-top: auto;
|
|
116
|
-
padding: 0.85rem 1.
|
|
117
|
-
border-top: 1px solid var(--vmz-line-subtle,
|
|
118
|
-
color: var(--vmz-text-steel, #
|
|
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:
|
|
121
|
-
|
|
195
|
+
background: #fff;
|
|
196
|
+
}
|
|
122
197
|
|
|
123
|
-
|
|
198
|
+
@media (max-width: 40rem) {
|
|
124
199
|
.vmz-ui-console-shell {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
133
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
2
|
+
<main data-vmz-ui="content" class="vmz-ui-content">
|
|
3
|
+
<slot />
|
|
4
|
+
</main>
|
|
3
5
|
</template>
|
|
4
|
-
|
|
5
6
|
<style>
|
|
6
|
-
|
|
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>
|