@neovici/cosmoz-tokens 4.9.1 → 4.10.0

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
@@ -24,6 +24,7 @@ This imports all token files:
24
24
  - Spacing (border radius, control heights)
25
25
  - Shadows
26
26
  - Semantic tokens (with dark mode support)
27
+ - Glass material and button recipes
27
28
 
28
29
  ### Import specific token files
29
30
 
@@ -183,3 +184,70 @@ npm run storybook:build
183
184
  ## License
184
185
 
185
186
  Apache-2.0
187
+
188
+ ## Glass material
189
+
190
+ The main stylesheet includes a shared glass material and separate button
191
+ recipes. Other components can reuse the material without adopting button
192
+ states, action colors, sizing or border radii. No element receives the effect
193
+ until its own styles use these tokens.
194
+
195
+ | Material token | Purpose |
196
+ | ---------------------------- | ----------------------------------------------------- |
197
+ | `--cz-color-bg-glass` | Translucent fill, opaque when transparency is reduced |
198
+ | `--cz-color-border-glass` | Fine surface edge |
199
+ | `--cz-color-glass-highlight` | Top highlight color |
200
+ | `--cz-color-glass-shade` | Bottom shade color |
201
+ | `--cz-glass-sheen` | Surface highlight gradient |
202
+ | `--cz-shadow-glass` | Inset top edge |
203
+ | `--cz-backdrop-filter-glass` | Backdrop blur and saturation |
204
+
205
+ Components choose their own text color, geometry and interaction states:
206
+
207
+ ```css
208
+ .surface {
209
+ background: var(--cz-glass-sheen), var(--cz-color-bg-glass);
210
+ border: 1px solid var(--cz-color-border-glass);
211
+ box-shadow: var(--cz-shadow-glass);
212
+ backdrop-filter: var(--cz-backdrop-filter-glass);
213
+ color: var(--cz-color-text-primary);
214
+ border-radius: var(--cz-radius-lg);
215
+ }
216
+ ```
217
+
218
+ To load only the material, import `@neovici/cosmoz-tokens/glass` alongside the
219
+ primitives. The example above also needs the semantic and spacing tokens, all
220
+ included by the main stylesheet. The material does not define hover, pressed,
221
+ destructive or disabled states. Those remain in `src/button-glass.css`.
222
+
223
+ The shared material uses `Canvas` and `CanvasText` in forced colors, with no
224
+ sheen, shadow or blur. Components remain responsible for readable text,
225
+ appropriate system colors and visible focus. Check contrast against the actual
226
+ backdrop when applying glass to a new component; the button contrast guarantees
227
+ do not cover arbitrary surfaces or content.
228
+
229
+ ## Glass buttons
230
+
231
+ The button recipes preserve the existing token names. Use `--cz-glass-sheen`
232
+ with `--cz-color-bg-glass` for secondary buttons, and `--cz-glass-action-sheen`
233
+ with `--cz-color-bg-glass-action` for primary buttons. Primary buttons use a
234
+ pale fill with dark labels in light mode and a deeper smoked fill with light
235
+ labels in dark mode. Pair them with `--cz-color-text-on-glass-action`.
236
+ Destructive fills use white text. Each fill has a matching `-hover` token.
237
+
238
+ Secondary buttons use `--cz-color-border-glass` and `--cz-shadow-glass`.
239
+
240
+ Held buttons use `--cz-color-bg-glass-pressed`,
241
+ `--cz-color-bg-glass-action-pressed`, or
242
+ `--cz-color-bg-glass-destructive-pressed` with `--cz-shadow-glass-pressed`.
243
+ Remove the sheen while pressed so the surface reads as inset.
244
+
245
+ Primary buttons use `--cz-color-border-glass-action` and
246
+ `--cz-shadow-glass-action`. Action fills retain AA label contrast over white
247
+ and black backdrops.
248
+
249
+ Apply `--cz-backdrop-filter-glass` to glass surfaces. It resolves to `none`
250
+ without backdrop-filter support and for reduced transparency. Reduced
251
+ transparency also restores opaque fills. Forced colors remove the material
252
+ effects; components must retain a system-colored border and visible focus
253
+ outline.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neovici/cosmoz-tokens",
3
- "version": "4.9.1",
3
+ "version": "4.10.0",
4
4
  "description": "Design tokens for Cosmoz web components based on Untitled UI",
5
5
  "keywords": [
6
6
  "design-tokens",
@@ -38,7 +38,8 @@
38
38
  "./truncate": {
39
39
  "types": "./src/truncate.css.d.ts",
40
40
  "default": "./src/truncate.css.js"
41
- }
41
+ },
42
+ "./glass": "./src/glass.css"
42
43
  },
43
44
  "files": [
44
45
  "src/"
@@ -0,0 +1,122 @@
1
+ /** Button recipes built on glass.css. Keep interaction and action semantics here. */
2
+ :root {
3
+ --cz-color-bg-glass-hover: light-dark(
4
+ var(--cz-color-gray-200),
5
+ var(--cz-color-gray-700)
6
+ );
7
+ --cz-color-bg-glass-action: light-dark(
8
+ var(--cz-color-gray-100),
9
+ var(--cz-color-gray-800)
10
+ );
11
+ --cz-color-bg-glass-pressed: light-dark(
12
+ var(--cz-color-gray-300),
13
+ var(--cz-color-gray-600)
14
+ );
15
+ --cz-color-bg-glass-action-pressed: light-dark(
16
+ var(--cz-color-gray-300),
17
+ var(--cz-color-gray-600)
18
+ );
19
+ --cz-color-bg-glass-action-hover: light-dark(
20
+ var(--cz-color-gray-200),
21
+ var(--cz-color-gray-700)
22
+ );
23
+ --cz-color-text-on-glass-action: light-dark(
24
+ var(--cz-color-gray-800),
25
+ var(--cz-color-gray-50)
26
+ );
27
+ --cz-color-bg-glass-destructive: light-dark(
28
+ var(--cz-color-error-700),
29
+ var(--cz-color-error-700)
30
+ );
31
+ --cz-color-bg-glass-destructive-hover: light-dark(
32
+ var(--cz-color-error-800),
33
+ var(--cz-color-error-800)
34
+ );
35
+ --cz-color-bg-glass-destructive-pressed: var(--cz-color-error-900);
36
+ --cz-color-glass-action-highlight: light-dark(
37
+ color-mix(in oklab, var(--cz-color-white) 3%, transparent),
38
+ color-mix(in oklab, var(--cz-color-white) 2%, transparent)
39
+ );
40
+ --cz-color-border-glass-action: var(--cz-color-border-glass);
41
+ --cz-glass-action-sheen: linear-gradient(
42
+ 180deg in oklab,
43
+ var(--cz-color-glass-action-highlight),
44
+ color-mix(in oklab, var(--cz-color-white) 1%, transparent) 46%,
45
+ var(--cz-color-glass-shade)
46
+ );
47
+ --cz-shadow-glass-action: inset 0 1px 0 var(--cz-color-glass-action-highlight);
48
+ --cz-shadow-glass-pressed: inset 0 1px 2px
49
+ light-dark(
50
+ color-mix(in oklab, var(--cz-color-gray-950) 8%, transparent),
51
+ color-mix(in oklab, var(--cz-color-black) 20%, transparent)
52
+ );
53
+ --cz-opacity-disabled: 0.45;
54
+ }
55
+
56
+ @supports (backdrop-filter: blur(16px)) {
57
+ :root {
58
+ --cz-color-bg-glass-hover: light-dark(
59
+ color-mix(in oklab, var(--cz-color-gray-200) 82%, transparent),
60
+ color-mix(in oklab, var(--cz-color-gray-600) 30%, transparent)
61
+ );
62
+ --cz-color-bg-glass-pressed: light-dark(
63
+ color-mix(in oklab, var(--cz-color-gray-300) 90%, transparent),
64
+ color-mix(in oklab, var(--cz-color-gray-500) 38%, transparent)
65
+ );
66
+ --cz-color-bg-glass-action-pressed: light-dark(
67
+ color-mix(in oklab, var(--cz-color-gray-300) 96%, transparent),
68
+ color-mix(in oklab, var(--cz-color-gray-600) 94%, transparent)
69
+ );
70
+ --cz-color-bg-glass-action: light-dark(
71
+ color-mix(in oklab, var(--cz-color-gray-100) 92%, transparent),
72
+ color-mix(in oklab, var(--cz-color-gray-800) 90%, transparent)
73
+ );
74
+ --cz-color-bg-glass-action-hover: light-dark(
75
+ color-mix(in oklab, var(--cz-color-gray-200) 94%, transparent),
76
+ color-mix(in oklab, var(--cz-color-gray-700) 92%, transparent)
77
+ );
78
+ }
79
+ }
80
+
81
+ @media (prefers-reduced-transparency: reduce) {
82
+ :root {
83
+ --cz-color-bg-glass-pressed: light-dark(
84
+ var(--cz-color-gray-300),
85
+ var(--cz-color-gray-600)
86
+ );
87
+ --cz-color-bg-glass-action-pressed: light-dark(
88
+ var(--cz-color-gray-300),
89
+ var(--cz-color-gray-600)
90
+ );
91
+ --cz-color-bg-glass-hover: light-dark(
92
+ var(--cz-color-gray-200),
93
+ var(--cz-color-gray-700)
94
+ );
95
+ --cz-color-bg-glass-action: light-dark(
96
+ var(--cz-color-gray-100),
97
+ var(--cz-color-gray-800)
98
+ );
99
+ --cz-color-bg-glass-action-hover: light-dark(
100
+ var(--cz-color-gray-200),
101
+ var(--cz-color-gray-700)
102
+ );
103
+ --cz-glass-action-sheen: none;
104
+ }
105
+ }
106
+
107
+ @media (forced-colors: active) {
108
+ :root {
109
+ --cz-color-bg-glass-pressed: ButtonFace;
110
+ --cz-color-bg-glass-action-pressed: ButtonFace;
111
+ --cz-color-bg-glass-destructive-pressed: ButtonFace;
112
+ --cz-color-bg-glass-hover: ButtonFace;
113
+ --cz-color-border-glass-action: ButtonText;
114
+ --cz-color-text-on-glass-action: ButtonText;
115
+ --cz-color-bg-glass-action: ButtonFace;
116
+ --cz-color-bg-glass-action-hover: ButtonFace;
117
+ --cz-color-glass-action-highlight: transparent;
118
+ --cz-glass-action-sheen: none;
119
+ --cz-shadow-glass-action: none;
120
+ --cz-shadow-glass-pressed: none;
121
+ }
122
+ }
package/src/glass.css ADDED
@@ -0,0 +1,60 @@
1
+ /** Shared glass material. Components choose geometry, content colors and interactions. */
2
+ :root {
3
+ --cz-color-bg-glass: light-dark(
4
+ var(--cz-color-gray-100),
5
+ var(--cz-color-gray-800)
6
+ );
7
+ --cz-color-border-glass: light-dark(
8
+ color-mix(in oklab, var(--cz-color-gray-500) 28%, transparent),
9
+ color-mix(in oklab, var(--cz-color-gray-300) 12%, transparent)
10
+ );
11
+ --cz-color-glass-highlight: light-dark(
12
+ color-mix(in oklab, var(--cz-color-white) 14%, transparent),
13
+ color-mix(in oklab, var(--cz-color-white) 3%, transparent)
14
+ );
15
+ --cz-color-glass-shade: light-dark(
16
+ color-mix(in oklab, var(--cz-color-gray-950) 1%, transparent),
17
+ color-mix(in oklab, var(--cz-color-black) 2%, transparent)
18
+ );
19
+ --cz-glass-sheen: linear-gradient(
20
+ 180deg in oklab,
21
+ var(--cz-color-glass-highlight),
22
+ transparent 46%,
23
+ var(--cz-color-glass-shade)
24
+ );
25
+ --cz-shadow-glass: inset 0 1px 0 var(--cz-color-glass-highlight);
26
+ --cz-backdrop-filter-glass: none;
27
+ }
28
+
29
+ @supports (backdrop-filter: blur(16px)) {
30
+ :root {
31
+ --cz-color-bg-glass: light-dark(
32
+ color-mix(in oklab, var(--cz-color-gray-100) 78%, transparent),
33
+ color-mix(in oklab, var(--cz-color-gray-700) 24%, transparent)
34
+ );
35
+ --cz-backdrop-filter-glass: blur(12px) saturate(1.1);
36
+ }
37
+ }
38
+
39
+ @media (prefers-reduced-transparency: reduce) {
40
+ :root {
41
+ --cz-color-bg-glass: light-dark(
42
+ var(--cz-color-gray-100),
43
+ var(--cz-color-gray-800)
44
+ );
45
+ --cz-glass-sheen: none;
46
+ --cz-backdrop-filter-glass: none;
47
+ }
48
+ }
49
+
50
+ @media (forced-colors: active) {
51
+ :root {
52
+ --cz-color-bg-glass: Canvas;
53
+ --cz-color-border-glass: CanvasText;
54
+ --cz-color-glass-highlight: transparent;
55
+ --cz-color-glass-shade: transparent;
56
+ --cz-glass-sheen: none;
57
+ --cz-shadow-glass: none;
58
+ --cz-backdrop-filter-glass: none;
59
+ }
60
+ }
package/src/index.css CHANGED
@@ -9,3 +9,5 @@
9
9
  @import './shadows.css';
10
10
  @import './semantic.css';
11
11
  @import './fallback.css';
12
+ @import './glass.css';
13
+ @import './button-glass.css';