@vmz/ui 0.3.8 → 0.3.10

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/README.md CHANGED
@@ -13,6 +13,24 @@ VMZ Design ≠ VMZ UI
13
13
  `componentsRoot` config.
14
14
  - **Never** hardcodes brand hex (`#176BFF`, etc.). Applications provide values via `/designs`.
15
15
 
16
+ ## Design preset
17
+
18
+ `presets/web-surface.v0.json` is the manifest for the first official design preset. Its files live
19
+ under `presets/web-surface/` and are exported as `@vmz/ui/presets/web-surface/*`, so an application
20
+ can materialize an editable `designs/` starting point:
21
+
22
+ ```bash
23
+ pnpm exec vmz init design
24
+ ```
25
+
26
+ The CLI reads the manifest `files` list, copies it into the project `designs/` directory, and
27
+ skips files that already exist (`--force` overwrites, `--dry-run` previews, `--designs-dir` and
28
+ `--preset` select another target).
29
+
30
+ A preset is Style Theme source files, not a runtime theme. It is never injected automatically and
31
+ carries no hidden semantics. `contracts/token-requirements.v0.json` remains the truth source for
32
+ which tokens the components require; the `ui-automation` gate checks this preset against it.
33
+
16
34
  ## Preview `0.0.4`
17
35
 
18
36
  This is a **preview** release. It is **not** `production-ready` and **not** a mature / production UI.
package/package.json CHANGED
@@ -68,7 +68,8 @@
68
68
  "./Upload": "./src/components/Upload.vmz",
69
69
  "./conformance/pack": "./conformance/pack.v0.json",
70
70
  "./contracts/token-requirements": "./contracts/token-requirements.v0.json",
71
- "./presets/web-surface": "./presets/web-surface.v0.json"
71
+ "./presets/web-surface": "./presets/web-surface.v0.json",
72
+ "./presets/web-surface/*": "./presets/web-surface/*"
72
73
  },
73
74
  "files": [
74
75
  "src",
@@ -85,7 +86,7 @@
85
86
  "license": "MIT",
86
87
  "name": "@vmz/ui",
87
88
  "peerDependencies": {
88
- "@vmz/ui-icons": "0.3.8"
89
+ "@vmz/ui-icons": "0.3.10"
89
90
  },
90
91
  "peerDependenciesMeta": {
91
92
  "@vmz/ui-icons": {
@@ -101,5 +102,5 @@
101
102
  "url": "git+https://github.com/doki-land/vmz-framework.git"
102
103
  },
103
104
  "type": "module",
104
- "version": "0.3.8"
105
+ "version": "0.3.10"
105
106
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "default": "default",
3
+ "activationAttr": "data-theme",
4
+ "prefersColorScheme": {
5
+ "dark": "dark",
6
+ "light": "default"
7
+ }
8
+ }
@@ -0,0 +1,204 @@
1
+ {
2
+ "entries": [
3
+ {
4
+ "key": { "path": ["action", "primary", "background"] },
5
+ "value": "#4096FF"
6
+ },
7
+ {
8
+ "key": { "path": ["action", "primary", "foreground"] },
9
+ "value": "#FFFFFF"
10
+ },
11
+ {
12
+ "key": { "path": ["action", "primary", "hover"] },
13
+ "value": "#69B1FF"
14
+ },
15
+ {
16
+ "key": { "path": ["action", "primary", "active"] },
17
+ "value": "#1677FF"
18
+ },
19
+ {
20
+ "key": { "path": ["action", "primary", "soft"] },
21
+ "value": "#102A4C"
22
+ },
23
+ {
24
+ "key": { "path": ["focus", "ring"] },
25
+ "value": "color-mix(in srgb, #4096FF 35%, transparent)"
26
+ },
27
+ {
28
+ "key": { "path": ["brand", "primary"] },
29
+ "value": "#4096FF"
30
+ },
31
+ {
32
+ "key": { "path": ["brand", "energy"] },
33
+ "value": "#FFC53D"
34
+ },
35
+ {
36
+ "key": { "path": ["surface", "paper"] },
37
+ "value": "#1A1D21"
38
+ },
39
+ {
40
+ "key": { "path": ["surface", "mist"] },
41
+ "value": "#23272D"
42
+ },
43
+ {
44
+ "key": { "path": ["surface", "page"] },
45
+ "value": "#121417"
46
+ },
47
+ {
48
+ "key": { "path": ["surface", "fill"] },
49
+ "value": "#1F2328"
50
+ },
51
+ {
52
+ "key": { "path": ["surface", "ink"] },
53
+ "value": "#F5F7FA"
54
+ },
55
+ {
56
+ "key": { "path": ["surface", "graphite"] },
57
+ "value": "#2A2F36"
58
+ },
59
+ {
60
+ "key": { "path": ["surface", "code"] },
61
+ "value": "#0D0F12"
62
+ },
63
+ {
64
+ "key": { "path": ["surface", "inverse"] },
65
+ "value": "#F5F7FA"
66
+ },
67
+ {
68
+ "key": { "path": ["text", "ink"] },
69
+ "value": "#F5F7FA"
70
+ },
71
+ {
72
+ "key": { "path": ["text", "steel"] },
73
+ "value": "#B6BEC9"
74
+ },
75
+ {
76
+ "key": { "path": ["text", "tertiary"] },
77
+ "value": "#9AA3AF"
78
+ },
79
+ {
80
+ "key": { "path": ["text", "muted"] },
81
+ "value": "#7C8592"
82
+ },
83
+ {
84
+ "key": { "path": ["text", "on-brand"] },
85
+ "value": "#FFFFFF"
86
+ },
87
+ {
88
+ "key": { "path": ["text", "on-ink"] },
89
+ "value": "#121417"
90
+ },
91
+ {
92
+ "key": { "path": ["text", "on-inverse"] },
93
+ "value": "#1F2329"
94
+ },
95
+ {
96
+ "key": { "path": ["line", "default"] },
97
+ "value": "#363B42"
98
+ },
99
+ {
100
+ "key": { "path": ["line", "subtle"] },
101
+ "value": "#262A30"
102
+ },
103
+ {
104
+ "key": { "path": ["line", "strong"] },
105
+ "value": "#5A626D"
106
+ },
107
+ {
108
+ "key": { "path": ["action", "secondary", "background"] },
109
+ "value": "#23272D"
110
+ },
111
+ {
112
+ "key": { "path": ["action", "secondary", "foreground"] },
113
+ "value": "#F5F7FA"
114
+ },
115
+ {
116
+ "key": { "path": ["action", "secondary", "border"] },
117
+ "value": "#363B42"
118
+ },
119
+ {
120
+ "key": { "path": ["action", "secondary", "hover"] },
121
+ "value": "#2C3138"
122
+ },
123
+ {
124
+ "key": { "path": ["action", "secondary", "active"] },
125
+ "value": "#333941"
126
+ },
127
+ {
128
+ "key": { "path": ["action", "link", "foreground"] },
129
+ "value": "#69B1FF"
130
+ },
131
+ {
132
+ "key": { "path": ["action", "link", "hover"] },
133
+ "value": "#91CAFF"
134
+ },
135
+ {
136
+ "key": { "path": ["status", "info", "accent"] },
137
+ "value": "#4096FF"
138
+ },
139
+ {
140
+ "key": { "path": ["status", "info", "foreground"] },
141
+ "value": "#69B1FF"
142
+ },
143
+ {
144
+ "key": { "path": ["status", "info", "background"] },
145
+ "value": "#102A4C"
146
+ },
147
+ {
148
+ "key": { "path": ["status", "info", "border"] },
149
+ "value": "#1D4C85"
150
+ },
151
+ {
152
+ "key": { "path": ["status", "success", "foreground"] },
153
+ "value": "#73D13D"
154
+ },
155
+ {
156
+ "key": { "path": ["status", "success", "background"] },
157
+ "value": "#162B12"
158
+ },
159
+ {
160
+ "key": { "path": ["status", "success", "border"] },
161
+ "value": "#2F5A22"
162
+ },
163
+ {
164
+ "key": { "path": ["status", "warning", "foreground"] },
165
+ "value": "#FFC53D"
166
+ },
167
+ {
168
+ "key": { "path": ["status", "warning", "background"] },
169
+ "value": "#33260A"
170
+ },
171
+ {
172
+ "key": { "path": ["status", "warning", "border"] },
173
+ "value": "#66491A"
174
+ },
175
+ {
176
+ "key": { "path": ["status", "danger", "foreground"] },
177
+ "value": "#FF7875"
178
+ },
179
+ {
180
+ "key": { "path": ["status", "danger", "background"] },
181
+ "value": "#3A1717"
182
+ },
183
+ {
184
+ "key": { "path": ["status", "danger", "border"] },
185
+ "value": "#6B2A2A"
186
+ },
187
+ {
188
+ "key": { "path": ["shadow", "popup"] },
189
+ "value": "0 12px 32px 0 rgba(0,0,0,.48), 0 2px 8px 0 rgba(0,0,0,.32)"
190
+ },
191
+ {
192
+ "key": { "path": ["elevation", "1"] },
193
+ "value": "0 1px 2px 0 rgba(0,0,0,.4), 0 1px 4px -1px rgba(0,0,0,.32)"
194
+ },
195
+ {
196
+ "key": { "path": ["elevation", "2"] },
197
+ "value": "0 4px 12px 0 rgba(0,0,0,.4), 0 1px 3px 0 rgba(0,0,0,.32)"
198
+ },
199
+ {
200
+ "key": { "path": ["elevation", "3"] },
201
+ "value": "0 12px 32px 0 rgba(0,0,0,.48), 0 2px 8px 0 rgba(0,0,0,.32)"
202
+ }
203
+ ]
204
+ }
@@ -0,0 +1,176 @@
1
+ {
2
+ "entries": [
3
+ {
4
+ "key": { "path": ["action", "primary", "background"] },
5
+ "value": "#003DB8"
6
+ },
7
+ {
8
+ "key": { "path": ["action", "primary", "foreground"] },
9
+ "value": "#FFFFFF"
10
+ },
11
+ {
12
+ "key": { "path": ["action", "primary", "hover"] },
13
+ "value": "#002A80"
14
+ },
15
+ {
16
+ "key": { "path": ["action", "primary", "active"] },
17
+ "value": "#001F5C"
18
+ },
19
+ {
20
+ "key": { "path": ["action", "primary", "soft"] },
21
+ "value": "#E6F4FF"
22
+ },
23
+ {
24
+ "key": { "path": ["focus", "ring"] },
25
+ "value": "#FFB000"
26
+ },
27
+ {
28
+ "key": { "path": ["surface", "paper"] },
29
+ "value": "#FFFFFF"
30
+ },
31
+ {
32
+ "key": { "path": ["surface", "mist"] },
33
+ "value": "#FFFFFF"
34
+ },
35
+ {
36
+ "key": { "path": ["surface", "page"] },
37
+ "value": "#FFFFFF"
38
+ },
39
+ {
40
+ "key": { "path": ["surface", "fill"] },
41
+ "value": "#F5F5F5"
42
+ },
43
+ {
44
+ "key": { "path": ["surface", "ink"] },
45
+ "value": "#000000"
46
+ },
47
+ {
48
+ "key": { "path": ["surface", "graphite"] },
49
+ "value": "#000000"
50
+ },
51
+ {
52
+ "key": { "path": ["surface", "code"] },
53
+ "value": "#000000"
54
+ },
55
+ {
56
+ "key": { "path": ["surface", "inverse"] },
57
+ "value": "#000000"
58
+ },
59
+ {
60
+ "key": { "path": ["text", "ink"] },
61
+ "value": "#000000"
62
+ },
63
+ {
64
+ "key": { "path": ["text", "steel"] },
65
+ "value": "#000000"
66
+ },
67
+ {
68
+ "key": { "path": ["text", "tertiary"] },
69
+ "value": "#1A1A1A"
70
+ },
71
+ {
72
+ "key": { "path": ["text", "muted"] },
73
+ "value": "#333333"
74
+ },
75
+ {
76
+ "key": { "path": ["text", "on-brand"] },
77
+ "value": "#FFFFFF"
78
+ },
79
+ {
80
+ "key": { "path": ["text", "on-ink"] },
81
+ "value": "#FFFFFF"
82
+ },
83
+ {
84
+ "key": { "path": ["text", "on-inverse"] },
85
+ "value": "#FFFFFF"
86
+ },
87
+ {
88
+ "key": { "path": ["line", "default"] },
89
+ "value": "#000000"
90
+ },
91
+ {
92
+ "key": { "path": ["line", "subtle"] },
93
+ "value": "#767676"
94
+ },
95
+ {
96
+ "key": { "path": ["line", "strong"] },
97
+ "value": "#000000"
98
+ },
99
+ {
100
+ "key": { "path": ["action", "secondary", "background"] },
101
+ "value": "#FFFFFF"
102
+ },
103
+ {
104
+ "key": { "path": ["action", "secondary", "foreground"] },
105
+ "value": "#000000"
106
+ },
107
+ {
108
+ "key": { "path": ["action", "secondary", "border"] },
109
+ "value": "#000000"
110
+ },
111
+ {
112
+ "key": { "path": ["action", "secondary", "hover"] },
113
+ "value": "#F2F2F2"
114
+ },
115
+ {
116
+ "key": { "path": ["action", "secondary", "active"] },
117
+ "value": "#E6E6E6"
118
+ },
119
+ {
120
+ "key": { "path": ["action", "link", "foreground"] },
121
+ "value": "#003DB8"
122
+ },
123
+ {
124
+ "key": { "path": ["action", "link", "hover"] },
125
+ "value": "#001F5C"
126
+ },
127
+ {
128
+ "key": { "path": ["status", "info", "foreground"] },
129
+ "value": "#003DB8"
130
+ },
131
+ {
132
+ "key": { "path": ["status", "info", "background"] },
133
+ "value": "#E6F4FF"
134
+ },
135
+ {
136
+ "key": { "path": ["status", "info", "border"] },
137
+ "value": "#003DB8"
138
+ },
139
+ {
140
+ "key": { "path": ["status", "success", "foreground"] },
141
+ "value": "#1A5C0A"
142
+ },
143
+ {
144
+ "key": { "path": ["status", "success", "background"] },
145
+ "value": "#F6FFED"
146
+ },
147
+ {
148
+ "key": { "path": ["status", "success", "border"] },
149
+ "value": "#2F5A22"
150
+ },
151
+ {
152
+ "key": { "path": ["status", "warning", "foreground"] },
153
+ "value": "#6B3A00"
154
+ },
155
+ {
156
+ "key": { "path": ["status", "warning", "background"] },
157
+ "value": "#FFFBE6"
158
+ },
159
+ {
160
+ "key": { "path": ["status", "warning", "border"] },
161
+ "value": "#8A5A00"
162
+ },
163
+ {
164
+ "key": { "path": ["status", "danger", "foreground"] },
165
+ "value": "#8A0A0A"
166
+ },
167
+ {
168
+ "key": { "path": ["status", "danger", "background"] },
169
+ "value": "#FFF1F0"
170
+ },
171
+ {
172
+ "key": { "path": ["status", "danger", "border"] },
173
+ "value": "#A8071A"
174
+ }
175
+ ]
176
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "brand": {
3
+ "primary": "#1677FF",
4
+ "energy": "#FAAD14"
5
+ },
6
+ "scale": {
7
+ "50": "#E6F4FF",
8
+ "100": "#BAE0FF",
9
+ "200": "#91CAFF",
10
+ "300": "#69B1FF",
11
+ "400": "#4096FF",
12
+ "500": "#1677FF",
13
+ "600": "#0958D9",
14
+ "700": "#003EB3",
15
+ "800": "#002C8C",
16
+ "900": "#001D66",
17
+ "950": "#000D33"
18
+ },
19
+ "surface": {
20
+ "paper": "#FFFFFF",
21
+ "mist": "#F7F8FA",
22
+ "page": "#F5F6F8",
23
+ "fill": "#FAFBFC",
24
+ "ink": "#1F2329",
25
+ "graphite": "#3A3F45",
26
+ "code": "#0F1115",
27
+ "inverse": "#1F2329"
28
+ },
29
+ "text": {
30
+ "ink": "#1F2329",
31
+ "steel": "#51565D",
32
+ "tertiary": "#646A73",
33
+ "muted": "#8A9099",
34
+ "on-brand": "#FFFFFF",
35
+ "on-ink": "#F7F8FA",
36
+ "on-inverse": "#F7F8FA"
37
+ },
38
+ "line": {
39
+ "default": "#E5E6EB",
40
+ "subtle": "#F0F1F3",
41
+ "strong": "#C9CDD4"
42
+ },
43
+ "status": {
44
+ "success": "#52C41A",
45
+ "warning": "#FAAD14",
46
+ "error": "#FF4D4F",
47
+ "analysis": "#722ED1",
48
+ "runtime": "#13C2C2"
49
+ },
50
+ "font": {
51
+ "sans": "-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", \"Noto Sans CJK SC\", Roboto, \"Helvetica Neue\", Arial, sans-serif",
52
+ "mono": "ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace",
53
+ "display": "-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", \"Noto Sans CJK SC\", Roboto, \"Helvetica Neue\", Arial, sans-serif"
54
+ }
55
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "entries": [
3
+ {
4
+ "key": { "path": ["action", "primary", "background"] },
5
+ "value": "#1677FF"
6
+ },
7
+ {
8
+ "key": { "path": ["action", "primary", "foreground"] },
9
+ "value": "#FFFFFF"
10
+ },
11
+ {
12
+ "key": { "path": ["action", "primary", "hover"] },
13
+ "value": "#4096FF"
14
+ },
15
+ {
16
+ "key": { "path": ["action", "primary", "active"] },
17
+ "value": "#0958D9"
18
+ },
19
+ {
20
+ "key": { "path": ["action", "primary", "soft"] },
21
+ "value": "#E6F4FF"
22
+ },
23
+ {
24
+ "key": { "path": ["action", "secondary", "background"] },
25
+ "value": "#FFFFFF"
26
+ },
27
+ {
28
+ "key": { "path": ["action", "secondary", "foreground"] },
29
+ "value": "#1F2329"
30
+ },
31
+ {
32
+ "key": { "path": ["action", "secondary", "border"] },
33
+ "value": "#E5E6EB"
34
+ },
35
+ {
36
+ "key": { "path": ["action", "secondary", "hover"] },
37
+ "value": "#F7F8FA"
38
+ },
39
+ {
40
+ "key": { "path": ["action", "secondary", "active"] },
41
+ "value": "#F0F1F3"
42
+ },
43
+ {
44
+ "key": { "path": ["action", "link", "foreground"] },
45
+ "value": "#0958D9"
46
+ },
47
+ {
48
+ "key": { "path": ["action", "link", "hover"] },
49
+ "value": "#1677FF"
50
+ },
51
+ {
52
+ "key": { "path": ["focus", "ring"] },
53
+ "value": "color-mix(in srgb, #1677FF 20%, transparent)"
54
+ }
55
+ ]
56
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "entries": [
3
+ {
4
+ "key": { "path": ["density", "control", "padding-y"] },
5
+ "value": "0.25rem"
6
+ },
7
+ {
8
+ "key": { "path": ["density", "control", "padding-x"] },
9
+ "value": "0.75rem"
10
+ },
11
+ {
12
+ "key": { "path": ["density", "control", "gap"] },
13
+ "value": "0.5rem"
14
+ },
15
+ {
16
+ "key": { "path": ["density", "compact", "padding-y"] },
17
+ "value": "0.125rem"
18
+ },
19
+ {
20
+ "key": { "path": ["density", "compact", "padding-x"] },
21
+ "value": "0.625rem"
22
+ },
23
+ {
24
+ "key": { "path": ["density", "compact", "gap"] },
25
+ "value": "0.375rem"
26
+ },
27
+ {
28
+ "key": { "path": ["density", "dense", "padding-y"] },
29
+ "value": "0"
30
+ },
31
+ {
32
+ "key": { "path": ["density", "dense", "padding-x"] },
33
+ "value": "0.4375rem"
34
+ },
35
+ {
36
+ "key": { "path": ["density", "dense", "gap"] },
37
+ "value": "0.25rem"
38
+ },
39
+ {
40
+ "key": { "path": ["control", "height"] },
41
+ "value": "2rem"
42
+ },
43
+ {
44
+ "key": { "path": ["control", "height", "sm"] },
45
+ "value": "1.5rem"
46
+ },
47
+ {
48
+ "key": { "path": ["control", "height", "lg"] },
49
+ "value": "2.5rem"
50
+ },
51
+ {
52
+ "key": { "path": ["control", "height", "mobile"] },
53
+ "value": "2.75rem"
54
+ },
55
+ {
56
+ "key": { "path": ["radius", "xs"] },
57
+ "value": "2px"
58
+ },
59
+ {
60
+ "key": { "path": ["radius", "sm"] },
61
+ "value": "4px"
62
+ },
63
+ {
64
+ "key": { "path": ["radius", "md"] },
65
+ "value": "6px"
66
+ },
67
+ {
68
+ "key": { "path": ["radius", "lg"] },
69
+ "value": "8px"
70
+ },
71
+ {
72
+ "key": { "path": ["radius", "xl"] },
73
+ "value": "12px"
74
+ },
75
+ {
76
+ "key": { "path": ["radius", "pill"] },
77
+ "value": "999px"
78
+ },
79
+ {
80
+ "key": { "path": ["shadow", "card"] },
81
+ "value": "none"
82
+ },
83
+ {
84
+ "key": { "path": ["shadow", "card", "hover"] },
85
+ "value": "none"
86
+ },
87
+ {
88
+ "key": { "path": ["shadow", "popup"] },
89
+ "value": "0 12px 32px 0 rgba(15,23,42,.12), 0 2px 8px 0 rgba(15,23,42,.06)"
90
+ },
91
+ {
92
+ "key": { "path": ["layout", "max", "width"] },
93
+ "value": "75rem"
94
+ },
95
+ {
96
+ "key": { "path": ["surface", "page"] },
97
+ "value": "#F5F6F8"
98
+ },
99
+ {
100
+ "key": { "path": ["surface", "fill"] },
101
+ "value": "#FAFBFC"
102
+ },
103
+ {
104
+ "key": { "path": ["line", "subtle"] },
105
+ "value": "#F0F1F3"
106
+ }
107
+ ]
108
+ }
@@ -0,0 +1,144 @@
1
+ {
2
+ "entries": [
3
+ {
4
+ "key": { "path": ["space", "0"] },
5
+ "value": "0"
6
+ },
7
+ {
8
+ "key": { "path": ["space", "1"] },
9
+ "value": "0.25rem"
10
+ },
11
+ {
12
+ "key": { "path": ["space", "2"] },
13
+ "value": "0.5rem"
14
+ },
15
+ {
16
+ "key": { "path": ["space", "3"] },
17
+ "value": "0.75rem"
18
+ },
19
+ {
20
+ "key": { "path": ["space", "4"] },
21
+ "value": "1rem"
22
+ },
23
+ {
24
+ "key": { "path": ["space", "5"] },
25
+ "value": "1.5rem"
26
+ },
27
+ {
28
+ "key": { "path": ["space", "6"] },
29
+ "value": "2rem"
30
+ },
31
+ {
32
+ "key": { "path": ["space", "7"] },
33
+ "value": "3rem"
34
+ },
35
+ {
36
+ "key": { "path": ["space", "8"] },
37
+ "value": "4rem"
38
+ },
39
+ {
40
+ "key": { "path": ["space", "9"] },
41
+ "value": "5rem"
42
+ },
43
+ {
44
+ "key": { "path": ["space", "10"] },
45
+ "value": "6rem"
46
+ },
47
+ {
48
+ "key": { "path": ["space", "11"] },
49
+ "value": "8rem"
50
+ },
51
+ {
52
+ "key": { "path": ["space", "12"] },
53
+ "value": "10rem"
54
+ },
55
+ {
56
+ "key": { "path": ["elevation", "0"] },
57
+ "value": "none"
58
+ },
59
+ {
60
+ "key": { "path": ["elevation", "1"] },
61
+ "value": "0 1px 2px 0 rgba(15,23,42,.04), 0 1px 4px -1px rgba(15,23,42,.03)"
62
+ },
63
+ {
64
+ "key": { "path": ["elevation", "2"] },
65
+ "value": "0 4px 12px 0 rgba(15,23,42,.08), 0 1px 3px 0 rgba(15,23,42,.04)"
66
+ },
67
+ {
68
+ "key": { "path": ["elevation", "3"] },
69
+ "value": "0 12px 32px 0 rgba(15,23,42,.12), 0 2px 8px 0 rgba(15,23,42,.06)"
70
+ },
71
+ {
72
+ "key": { "path": ["layout", "gutter"] },
73
+ "value": "clamp(1rem, 4vw, 2rem)"
74
+ },
75
+ {
76
+ "key": { "path": ["layout", "section"] },
77
+ "value": "clamp(3rem, 6vw, 5rem)"
78
+ },
79
+ {
80
+ "key": { "path": ["layout", "header-height"] },
81
+ "value": "4rem"
82
+ },
83
+ {
84
+ "key": { "path": ["layout", "header-height-compact"] },
85
+ "value": "3.5rem"
86
+ },
87
+ {
88
+ "key": { "path": ["type", "display"] },
89
+ "value": "clamp(2rem, 3.4vw, 3rem)"
90
+ },
91
+ {
92
+ "key": { "path": ["type", "title"] },
93
+ "value": "clamp(1.5rem, 2.2vw, 1.875rem)"
94
+ },
95
+ {
96
+ "key": { "path": ["type", "subtitle"] },
97
+ "value": "1.125rem"
98
+ },
99
+ {
100
+ "key": { "path": ["type", "body"] },
101
+ "value": "1rem"
102
+ },
103
+ {
104
+ "key": { "path": ["type", "caption"] },
105
+ "value": "0.8125rem"
106
+ },
107
+ {
108
+ "key": { "path": ["type", "code"] },
109
+ "value": "0.875rem"
110
+ },
111
+ {
112
+ "key": { "path": ["type", "weight", "regular"] },
113
+ "value": "400"
114
+ },
115
+ {
116
+ "key": { "path": ["type", "weight", "medium"] },
117
+ "value": "500"
118
+ },
119
+ {
120
+ "key": { "path": ["type", "weight", "semibold"] },
121
+ "value": "600"
122
+ },
123
+ {
124
+ "key": { "path": ["type", "line-height", "display"] },
125
+ "value": "1.18"
126
+ },
127
+ {
128
+ "key": { "path": ["type", "line-height", "title"] },
129
+ "value": "1.32"
130
+ },
131
+ {
132
+ "key": { "path": ["type", "line-height", "body"] },
133
+ "value": "1.625"
134
+ },
135
+ {
136
+ "key": { "path": ["type", "line-height", "caption"] },
137
+ "value": "1.55"
138
+ },
139
+ {
140
+ "key": { "path": ["type", "line-height", "code"] },
141
+ "value": "1.6"
142
+ }
143
+ ]
144
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "entries": [
3
+ {
4
+ "key": { "path": ["motion", "control", "duration"] },
5
+ "value": "120ms"
6
+ },
7
+ {
8
+ "key": { "path": ["motion", "control", "easing"] },
9
+ "value": "cubic-bezier(0.2, 0, 0, 1)"
10
+ },
11
+ {
12
+ "key": { "path": ["motion", "emphasis", "duration"] },
13
+ "value": "240ms"
14
+ },
15
+ {
16
+ "key": { "path": ["motion", "emphasis", "easing"] },
17
+ "value": "cubic-bezier(0.16, 1, 0.3, 1)"
18
+ },
19
+ {
20
+ "key": { "path": ["motion", "overlay", "duration"] },
21
+ "value": "160ms"
22
+ },
23
+ {
24
+ "key": { "path": ["motion", "overlay", "easing"] },
25
+ "value": "cubic-bezier(0.2, 0, 0, 1)"
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "entries": [
3
+ {
4
+ "key": { "path": ["status", "info", "accent"] },
5
+ "value": "#1677FF"
6
+ },
7
+ {
8
+ "key": { "path": ["status", "info", "foreground"] },
9
+ "value": "#0958D9"
10
+ },
11
+ {
12
+ "key": { "path": ["status", "info", "background"] },
13
+ "value": "#E6F4FF"
14
+ },
15
+ {
16
+ "key": { "path": ["status", "info", "border"] },
17
+ "value": "#91CAFF"
18
+ },
19
+ {
20
+ "key": { "path": ["status", "success", "accent"] },
21
+ "value": "#52C41A"
22
+ },
23
+ {
24
+ "key": { "path": ["status", "success", "foreground"] },
25
+ "value": "#237804"
26
+ },
27
+ {
28
+ "key": { "path": ["status", "success", "background"] },
29
+ "value": "#F6FFED"
30
+ },
31
+ {
32
+ "key": { "path": ["status", "success", "border"] },
33
+ "value": "#B7EB8F"
34
+ },
35
+ {
36
+ "key": { "path": ["status", "warning", "accent"] },
37
+ "value": "#FAAD14"
38
+ },
39
+ {
40
+ "key": { "path": ["status", "warning", "foreground"] },
41
+ "value": "#874D00"
42
+ },
43
+ {
44
+ "key": { "path": ["status", "warning", "background"] },
45
+ "value": "#FFFBE6"
46
+ },
47
+ {
48
+ "key": { "path": ["status", "warning", "border"] },
49
+ "value": "#FFE58F"
50
+ },
51
+ {
52
+ "key": { "path": ["status", "danger", "accent"] },
53
+ "value": "#FF4D4F"
54
+ },
55
+ {
56
+ "key": { "path": ["status", "danger", "foreground"] },
57
+ "value": "#A8071A"
58
+ },
59
+ {
60
+ "key": { "path": ["status", "danger", "background"] },
61
+ "value": "#FFF1F0"
62
+ },
63
+ {
64
+ "key": { "path": ["status", "danger", "border"] },
65
+ "value": "#FFA39E"
66
+ }
67
+ ]
68
+ }
@@ -3,6 +3,19 @@
3
3
  "id": "web-surface",
4
4
  "package": "@vmz/ui",
5
5
  "materialize": "Copy or resolve into application /designs Style Theme (tokens/*.json + themes/*.json). Preset is not a second runtime theme.",
6
+ "files": {
7
+ "root": "presets/web-surface",
8
+ "theme": "theme.json",
9
+ "tokens": [
10
+ "tokens/brand.json",
11
+ "tokens/semantic-action.json",
12
+ "tokens/semantic-density.json",
13
+ "tokens/semantic-layout.json",
14
+ "tokens/semantic-motion.json",
15
+ "tokens/semantic-status.json"
16
+ ],
17
+ "themes": ["themes/dark.json", "themes/high-contrast.json"]
18
+ },
6
19
  "foundation": {
7
20
  "radius": {
8
21
  "xs": "2px",
@@ -100,9 +100,9 @@
100
100
  .vmz-ui-console-shell__brand {
101
101
  padding: var(--vmz-space-1, 0.25rem) var(--vmz-space-3, 0.75rem);
102
102
  color: var(--vmz-text-ink);
103
- font-size: 1rem;
104
- font-weight: 600;
105
- line-height: 1.5rem;
103
+ font-size: var(--vmz-type-body);
104
+ font-weight: var(--vmz-type-weight-semibold);
105
+ line-height: var(--vmz-type-line-height-body);
106
106
  letter-spacing: 0;
107
107
  text-decoration: none;
108
108
  outline: none;
@@ -127,13 +127,13 @@
127
127
  .vmz-ui-console-shell__nav a {
128
128
  display: flex;
129
129
  align-items: center;
130
- min-height: 2.25rem;
130
+ min-height: calc(var(--vmz-control-height) * 1.125);
131
131
  padding: 0 var(--vmz-space-3, 0.75rem);
132
132
  border-radius: var(--vmz-radius-md, 6px);
133
133
  color: var(--vmz-text-steel);
134
- font-size: 0.875rem;
135
- font-weight: 500;
136
- line-height: 1.25rem;
134
+ font-size: var(--vmz-type-code);
135
+ font-weight: var(--vmz-type-weight-medium);
136
+ line-height: var(--vmz-type-line-height-caption);
137
137
  text-decoration: none;
138
138
  outline: none;
139
139
  transition:
@@ -149,7 +149,7 @@
149
149
  .vmz-ui-console-shell__nav a[data-active="true"] {
150
150
  color: var(--vmz-action-primary-background);
151
151
  background: var(--vmz-action-primary-soft);
152
- font-weight: 600;
152
+ font-weight: var(--vmz-type-weight-semibold);
153
153
  box-shadow: inset 2px 0 0 var(--vmz-action-primary-background);
154
154
  }
155
155
 
@@ -204,30 +204,30 @@
204
204
 
205
205
  .vmz-ui-console-shell__header-copy {
206
206
  display: grid;
207
- gap: 0.125rem;
207
+ gap: var(--vmz-space-1, 0.25rem);
208
208
  min-width: 0;
209
209
  }
210
210
 
211
211
  .vmz-ui-console-shell__breadcrumb {
212
212
  margin: 0;
213
213
  color: var(--vmz-text-tertiary);
214
- font-size: 0.75rem;
215
- line-height: 1.125rem;
214
+ font-size: var(--vmz-type-caption);
215
+ line-height: var(--vmz-type-line-height-caption);
216
216
  }
217
217
 
218
218
  .vmz-ui-console-shell__title {
219
219
  margin: 0;
220
220
  color: var(--vmz-text-ink);
221
- font-size: 1.25rem;
222
- line-height: 1.75rem;
223
- font-weight: 600;
221
+ font-size: var(--vmz-type-subtitle);
222
+ line-height: var(--vmz-type-line-height-title);
223
+ font-weight: var(--vmz-type-weight-semibold);
224
224
  }
225
225
 
226
226
  .vmz-ui-console-shell__subtitle {
227
227
  margin: 0;
228
228
  color: var(--vmz-text-steel);
229
- font-size: 0.8125rem;
230
- line-height: 1.25rem;
229
+ font-size: var(--vmz-type-caption);
230
+ line-height: var(--vmz-type-line-height-caption);
231
231
  }
232
232
 
233
233
  .vmz-ui-console-shell__action {
@@ -235,13 +235,13 @@
235
235
  align-items: center;
236
236
  justify-content: center;
237
237
  flex: none;
238
- min-height: 2rem;
238
+ min-height: var(--vmz-control-height);
239
239
  padding: 0 var(--vmz-space-3, 0.75rem);
240
240
  border-radius: var(--vmz-radius-md, 6px);
241
241
  background: var(--vmz-action-primary-background);
242
242
  color: var(--vmz-action-primary-foreground);
243
- font-size: 0.875rem;
244
- font-weight: 500;
243
+ font-size: var(--vmz-type-code);
244
+ font-weight: var(--vmz-type-weight-medium);
245
245
  text-decoration: none;
246
246
  white-space: nowrap;
247
247
  outline: none;
@@ -278,7 +278,7 @@
278
278
  padding: var(--vmz-space-4, 1rem) var(--vmz-space-5, 1.5rem);
279
279
  border-top: 1px solid var(--vmz-line-subtle);
280
280
  color: var(--vmz-text-tertiary);
281
- font-size: 0.8125rem;
281
+ font-size: var(--vmz-type-caption);
282
282
  background: var(--vmz-surface-paper);
283
283
  }
284
284
 
@@ -291,6 +291,7 @@
291
291
  }
292
292
 
293
293
  .vmz-ui-console-shell__sidebar {
294
+ position: relative;
294
295
  border-right: 0;
295
296
  border-bottom: 1px solid var(--vmz-line-subtle);
296
297
  gap: var(--vmz-space-2, 0.5rem);
@@ -299,8 +300,8 @@
299
300
 
300
301
  .vmz-ui-console-shell__menu {
301
302
  display: inline-flex;
302
- width: calc(var(--vmz-control-height, 2rem) * 1.5);
303
- min-height: calc(var(--vmz-control-height, 2rem) * 1.5);
303
+ width: calc(var(--vmz-control-height) * 1.5);
304
+ min-height: calc(var(--vmz-control-height) * 1.5);
304
305
  }
305
306
 
306
307
  .vmz-ui-console-shell__nav {
@@ -310,12 +311,23 @@
310
311
  flex: none;
311
312
  }
312
313
 
314
+ /* The menu overlays the page instead of inserting a new row, so opening
315
+ it never moves the current task down. */
313
316
  .vmz-ui-console-shell__nav[data-open="true"] {
314
317
  display: flex;
318
+ position: absolute;
319
+ top: 100%;
320
+ right: 0;
321
+ left: 0;
322
+ z-index: 30;
323
+ padding: var(--vmz-space-2, 0.5rem) var(--vmz-space-4, 1rem);
324
+ border-bottom: 1px solid var(--vmz-line-subtle);
325
+ background: var(--vmz-surface-paper);
326
+ box-shadow: var(--vmz-shadow-popup);
315
327
  }
316
328
 
317
329
  .vmz-ui-console-shell__nav a {
318
- min-height: calc(var(--vmz-control-height, 2rem) * 1.5);
330
+ min-height: calc(var(--vmz-control-height) * 1.5);
319
331
  white-space: normal;
320
332
  }
321
333
 
@@ -324,14 +336,14 @@
324
336
  grid-template-columns: auto minmax(0, 1fr) auto;
325
337
  align-items: center;
326
338
  gap: var(--vmz-space-2, 0.5rem);
327
- min-height: calc(var(--vmz-control-height, 2rem) * 1.5);
339
+ min-height: calc(var(--vmz-control-height) * 1.5);
328
340
  padding: var(--vmz-space-3, 0.75rem) var(--vmz-space-4, 1rem);
329
341
  }
330
342
 
331
343
  .vmz-ui-console-shell__back {
332
344
  display: inline-flex;
333
345
  grid-column: 1;
334
- min-height: calc(var(--vmz-control-height, 2rem) * 1.5);
346
+ min-height: calc(var(--vmz-control-height) * 1.5);
335
347
  }
336
348
 
337
349
  .vmz-ui-console-shell__header-copy {
@@ -355,7 +367,7 @@
355
367
  .vmz-ui-console-shell__action {
356
368
  grid-column: 3;
357
369
  justify-self: end;
358
- min-height: calc(var(--vmz-control-height, 2rem) * 1.5);
370
+ min-height: calc(var(--vmz-control-height) * 1.5);
359
371
  }
360
372
 
361
373
  .vmz-ui-console-shell__main {
@@ -393,6 +405,20 @@ export default class ConsoleShell {
393
405
  title: string;
394
406
  href: string;
395
407
  }[] = [];
408
+ _onDocumentClick = null;
409
+ onMount() {
410
+ this._onDocumentClick = (ev) => {
411
+ if (!this.menuOpen) return;
412
+ const target = ev.target;
413
+ if (target && target.closest && target.closest('[data-vmz-shell="sidebar"]')) return;
414
+ this.menuOpen = false;
415
+ };
416
+ document.addEventListener("click", this._onDocumentClick);
417
+ }
418
+ onDestroy() {
419
+ if (this._onDocumentClick) document.removeEventListener("click", this._onDocumentClick);
420
+ this._onDocumentClick = null;
421
+ }
396
422
  toggleMenu() {
397
423
  this.menuOpen = !this.menuOpen;
398
424
  }