@cloudgrid-io/ui 0.0.1
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/dist/.gitkeep +0 -0
- package/dist/fonts.css +21 -0
- package/dist/prose.css +156 -0
- package/dist/shadcn.css +206 -0
- package/dist/theme.css +240 -0
- package/dist/tokens/base.json +1043 -0
- package/dist/tokens/surface-ink.json +136 -0
- package/dist/tokens/surface-panel.json +120 -0
- package/dist/tokens.css +289 -0
- package/dist/tokens.json +151 -0
- package/package.json +39 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
{
|
|
2
|
+
"semantic-text": {
|
|
3
|
+
"text-primary": {
|
|
4
|
+
"$value": "#ffffff",
|
|
5
|
+
"$type": "color",
|
|
6
|
+
"$extensions": {
|
|
7
|
+
"io.cloudgrid": {
|
|
8
|
+
"css": "--cg-text-primary"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"text-secondary": {
|
|
13
|
+
"$value": "rgba(255, 255, 255, 0.78)",
|
|
14
|
+
"$type": "color",
|
|
15
|
+
"$extensions": {
|
|
16
|
+
"io.cloudgrid": {
|
|
17
|
+
"css": "--cg-text-secondary"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"text-muted": {
|
|
22
|
+
"$value": "rgba(255, 255, 255, 0.56)",
|
|
23
|
+
"$type": "color",
|
|
24
|
+
"$extensions": {
|
|
25
|
+
"io.cloudgrid": {
|
|
26
|
+
"css": "--cg-text-muted"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"text-accent": {
|
|
31
|
+
"$value": "{brand.secondary}",
|
|
32
|
+
"$extensions": {
|
|
33
|
+
"io.cloudgrid": {
|
|
34
|
+
"css": "--cg-text-accent"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"semantic-surfaces": {
|
|
40
|
+
"surface-card": {
|
|
41
|
+
"$value": "rgba(255, 255, 255, 0.04)",
|
|
42
|
+
"$type": "color",
|
|
43
|
+
"$extensions": {
|
|
44
|
+
"io.cloudgrid": {
|
|
45
|
+
"css": "--cg-surface-card"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"surface-page-alt": {
|
|
50
|
+
"$value": "rgba(255, 255, 255, 0.06)",
|
|
51
|
+
"$type": "color",
|
|
52
|
+
"$extensions": {
|
|
53
|
+
"io.cloudgrid": {
|
|
54
|
+
"css": "--cg-surface-page-alt"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"semantic-lines": {
|
|
60
|
+
"border-control": {
|
|
61
|
+
"$value": "rgba(255, 255, 255, 0.4)",
|
|
62
|
+
"$type": "color",
|
|
63
|
+
"$extensions": {
|
|
64
|
+
"io.cloudgrid": {
|
|
65
|
+
"css": "--cg-border-control"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"border-hairline": {
|
|
70
|
+
"$value": "rgba(255, 255, 255, 0.16)",
|
|
71
|
+
"$type": "color",
|
|
72
|
+
"$extensions": {
|
|
73
|
+
"io.cloudgrid": {
|
|
74
|
+
"css": "--cg-border-hairline"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"border-strong": {
|
|
79
|
+
"$value": "#ffffff",
|
|
80
|
+
"$type": "color",
|
|
81
|
+
"$extensions": {
|
|
82
|
+
"io.cloudgrid": {
|
|
83
|
+
"css": "--cg-border-strong"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"border-accent": {
|
|
88
|
+
"$value": "{brand.secondary}",
|
|
89
|
+
"$extensions": {
|
|
90
|
+
"io.cloudgrid": {
|
|
91
|
+
"css": "--cg-border-accent"
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"focus-ring": {
|
|
96
|
+
"$value": "rgba(182, 222, 104, 0.45)",
|
|
97
|
+
"$type": "color",
|
|
98
|
+
"$extensions": {
|
|
99
|
+
"io.cloudgrid": {
|
|
100
|
+
"css": "--cg-focus-ring"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"link": {
|
|
106
|
+
"link": {
|
|
107
|
+
"$value": "#ffffff",
|
|
108
|
+
"$type": "color",
|
|
109
|
+
"$extensions": {
|
|
110
|
+
"io.cloudgrid": {
|
|
111
|
+
"css": "--cg-link"
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"link-hover": {
|
|
116
|
+
"$value": "{brand.secondary}",
|
|
117
|
+
"$extensions": {
|
|
118
|
+
"io.cloudgrid": {
|
|
119
|
+
"css": "--cg-link-hover"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"danger": {
|
|
125
|
+
"danger": {
|
|
126
|
+
"$value": "#FF8A80",
|
|
127
|
+
"$type": "color",
|
|
128
|
+
"$description": "Ink has more headroom than the panel, so this stays recognisably red rather\nthan washing out to pink: 6.97:1 against #222, comfortably past AA for body\ntext. The source red would have managed only 3.76:1 here.",
|
|
129
|
+
"$extensions": {
|
|
130
|
+
"io.cloudgrid": {
|
|
131
|
+
"css": "--cg-danger"
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
{
|
|
2
|
+
"semantic-text": {
|
|
3
|
+
"text-primary": {
|
|
4
|
+
"$value": "#ffffff",
|
|
5
|
+
"$type": "color",
|
|
6
|
+
"$extensions": {
|
|
7
|
+
"io.cloudgrid": {
|
|
8
|
+
"css": "--cg-text-primary"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"text-secondary": {
|
|
13
|
+
"$value": "rgba(255, 255, 255, 0.82)",
|
|
14
|
+
"$type": "color",
|
|
15
|
+
"$extensions": {
|
|
16
|
+
"io.cloudgrid": {
|
|
17
|
+
"css": "--cg-text-secondary"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"text-muted": {
|
|
22
|
+
"$value": "rgba(255, 255, 255, 0.66)",
|
|
23
|
+
"$type": "color",
|
|
24
|
+
"$extensions": {
|
|
25
|
+
"io.cloudgrid": {
|
|
26
|
+
"css": "--cg-text-muted"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"text-accent": {
|
|
31
|
+
"$value": "#ffffff",
|
|
32
|
+
"$type": "color",
|
|
33
|
+
"$extensions": {
|
|
34
|
+
"io.cloudgrid": {
|
|
35
|
+
"css": "--cg-text-accent"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"semantic-lines": {
|
|
41
|
+
"border-control": {
|
|
42
|
+
"$value": "rgba(255, 255, 255, 0.62)",
|
|
43
|
+
"$type": "color",
|
|
44
|
+
"$extensions": {
|
|
45
|
+
"io.cloudgrid": {
|
|
46
|
+
"css": "--cg-border-control"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"border-hairline": {
|
|
51
|
+
"$value": "rgba(255, 255, 255, 0.24)",
|
|
52
|
+
"$type": "color",
|
|
53
|
+
"$extensions": {
|
|
54
|
+
"io.cloudgrid": {
|
|
55
|
+
"css": "--cg-border-hairline"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"border-strong": {
|
|
60
|
+
"$value": "#ffffff",
|
|
61
|
+
"$type": "color",
|
|
62
|
+
"$extensions": {
|
|
63
|
+
"io.cloudgrid": {
|
|
64
|
+
"css": "--cg-border-strong"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"focus-ring": {
|
|
69
|
+
"$value": "rgba(255, 255, 255, 0.5)",
|
|
70
|
+
"$type": "color",
|
|
71
|
+
"$extensions": {
|
|
72
|
+
"io.cloudgrid": {
|
|
73
|
+
"css": "--cg-focus-ring"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"link": {
|
|
79
|
+
"link": {
|
|
80
|
+
"$value": "#ffffff",
|
|
81
|
+
"$type": "color",
|
|
82
|
+
"$extensions": {
|
|
83
|
+
"io.cloudgrid": {
|
|
84
|
+
"css": "--cg-link"
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"link-hover": {
|
|
89
|
+
"$value": "{brand.secondary}",
|
|
90
|
+
"$extensions": {
|
|
91
|
+
"io.cloudgrid": {
|
|
92
|
+
"css": "--cg-link-hover"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"semantic-surfaces": {
|
|
98
|
+
"surface-card": {
|
|
99
|
+
"$value": "transparent",
|
|
100
|
+
"$type": "color",
|
|
101
|
+
"$extensions": {
|
|
102
|
+
"io.cloudgrid": {
|
|
103
|
+
"css": "--cg-surface-card"
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"danger": {
|
|
109
|
+
"danger": {
|
|
110
|
+
"$value": "#FFDAD6",
|
|
111
|
+
"$type": "color",
|
|
112
|
+
"$description": "The source red measures 1.38:1 against this purple, which is invisible.\nSame class as #41. This tint is derived from it and measures 4.52:1, so it\nclears AA for body text as well as the 3:1 UI bar.",
|
|
113
|
+
"$extensions": {
|
|
114
|
+
"io.cloudgrid": {
|
|
115
|
+
"css": "--cg-danger"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
package/dist/tokens.css
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/*
|
|
2
|
+
GENERATED by scripts/build-css.mjs from src/tokens/*.json. Do not edit.
|
|
3
|
+
|
|
4
|
+
The DTCG sets are the source. Edit those, or let a Figma sync open a PR
|
|
5
|
+
against them, then run `pnpm build`. Editing this file works until the
|
|
6
|
+
next build silently reverts it.
|
|
7
|
+
|
|
8
|
+
CloudGrid tokens: the CloudGrid Web 2026 design language.
|
|
9
|
+
|
|
10
|
+
This is the @cloudgrid-io/ui copy, ported 2026-08-10 from the v0 library
|
|
11
|
+
(atomicfuse/ui, src/styles/tokens.css), which was itself synced from
|
|
12
|
+
cloudgrid-landing. That makes this the third copy in the chain, and three
|
|
13
|
+
copies is one too many: the intent is that this package becomes authoritative
|
|
14
|
+
and the other two consume it. Until that migration happens, treat the SITE's
|
|
15
|
+
src/styles/tokens.css as the source of truth and sync changes forward to here.
|
|
16
|
+
|
|
17
|
+
The site's copy carries a superset (a legacy alias shim, --bg/--ink/etc., for
|
|
18
|
+
its unrebuilt surfaces) that is deliberately NOT part of this package.
|
|
19
|
+
|
|
20
|
+
Values here are the real brand system. The setup guide's Step 2 sketch
|
|
21
|
+
(cyan/magenta, dark-first, Nunito/DM Mono) does not describe this brand and
|
|
22
|
+
was not used.
|
|
23
|
+
|
|
24
|
+
Originally ported from the Claude Design project "Cloudgrid"
|
|
25
|
+
(303a54ca-2f23-4906-8040-879e8d9a7b6f), token files colors/typography/fonts/
|
|
26
|
+
spacing/radius/elevation/motion. Values marked SOURCE were sampled from the
|
|
27
|
+
supplied 1440px brand frames or given by the brand owner.
|
|
28
|
+
|
|
29
|
+
The system is light, flat and gradient-free. Containment is done with 1px
|
|
30
|
+
hairlines, not elevation. The one dramatic move is the purple panel, which is
|
|
31
|
+
a token flip rather than a separate stylesheet: put data-cg-surface="panel" on
|
|
32
|
+
any container filled with --cg-surface-panel and every semantic token below
|
|
33
|
+
switches to its on-purple value.
|
|
34
|
+
|
|
35
|
+
A theme change is a value swap in this file. Components consume custom
|
|
36
|
+
properties exclusively and must never hardcode a hex.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
:root,
|
|
40
|
+
[data-theme='default'] {
|
|
41
|
+
/* ---- brand ----
|
|
42
|
+
brand (SOURCE) */
|
|
43
|
+
--cg-ink: #222222;
|
|
44
|
+
--cg-primary: #5a47f0;
|
|
45
|
+
--cg-secondary: #b6de68;
|
|
46
|
+
--cg-tertiary: #60e9f0;
|
|
47
|
+
|
|
48
|
+
/* ---- danger ----
|
|
49
|
+
danger (PLACEHOLDER, not a brand value)
|
|
50
|
+
|
|
51
|
+
Operator decision 2026-08-16, issue #62, stated as a placeholder in the
|
|
52
|
+
operator's own words: "its just a red i found. one day the brand designer
|
|
53
|
+
might change it, but until then this is it."
|
|
54
|
+
|
|
55
|
+
It lives here, beside the brand sources, because that is the one place a
|
|
56
|
+
designer should have to edit. Nothing else in the system carries a red.
|
|
57
|
+
|
|
58
|
+
Measured against every surface before it was chosen, because a flat value
|
|
59
|
+
cannot work on all three:
|
|
60
|
+
|
|
61
|
+
#E53935 on white #ffffff : 4.23:1
|
|
62
|
+
#E53935 on panel #5a47f0 : 1.38:1 <-- invisible, hence the override
|
|
63
|
+
#E53935 on ink #222222 : 3.76:1
|
|
64
|
+
|
|
65
|
+
1.38:1 on purple is the #41 failure repeating: that issue found the primary
|
|
66
|
+
button rendering the panel's own colour at 1:1. The per-surface values in
|
|
67
|
+
the panel and ink scopes below are derived from this red rather than being
|
|
68
|
+
new brand decisions.
|
|
69
|
+
|
|
70
|
+
KNOWN, and deliberately not "fixed" by changing the operator's value: 4.23:1
|
|
71
|
+
on white clears the 3:1 bar for UI components and borders, and is just under
|
|
72
|
+
the 4.5:1 AA bar for body text. `text-destructive` has 5 uses. A future
|
|
73
|
+
brand pass can darken it; that is a decision, not a tidy-up. */
|
|
74
|
+
--cg-danger: #E53935;
|
|
75
|
+
|
|
76
|
+
/* ---- brand-derived ----
|
|
77
|
+
brand derived (interaction only) */
|
|
78
|
+
--cg-primary-press: #4b39db;
|
|
79
|
+
--cg-primary-tint: #eeecfe;
|
|
80
|
+
--cg-secondary-press: #a6cf57;
|
|
81
|
+
--cg-tertiary-press: #4dd8e0;
|
|
82
|
+
|
|
83
|
+
/* ---- neutrals ---- */
|
|
84
|
+
--cg-neutral-0: #ffffff;
|
|
85
|
+
--cg-lavender-50: #f2f1f7; /* SOURCE: alternate page wash */ --cg-neutral-100: #f1f1f1; /* SOURCE: hairline / card border */ --cg-neutral-200: #e3e3e3; /* SOURCE: control border, inactive pill fill */ --cg-neutral-400: #acacac; /* SOURCE: placeholder */ --cg-neutral-500: #8e8e8e; /* SOURCE: footer text */ --cg-neutral-700: #595959; /* SOURCE: legal / secondary text */ --cg-neutral-900: #222222; /* SOURCE: ink */ /* ---- semantic surfaces ---- */ --cg-surface-page: var(--cg-neutral-0);
|
|
86
|
+
--cg-neutral-100: #f1f1f1; /* SOURCE: hairline / card border */ --cg-neutral-200: #e3e3e3; /* SOURCE: control border, inactive pill fill */ --cg-neutral-400: #acacac; /* SOURCE: placeholder */ --cg-neutral-500: #8e8e8e; /* SOURCE: footer text */ --cg-neutral-700: #595959; /* SOURCE: legal / secondary text */ --cg-neutral-900: #222222; /* SOURCE: ink */ /* ---- semantic surfaces ---- */ --cg-surface-page: var(--cg-neutral-0);
|
|
87
|
+
--cg-neutral-200: #e3e3e3; /* SOURCE: control border, inactive pill fill */ --cg-neutral-400: #acacac; /* SOURCE: placeholder */ --cg-neutral-500: #8e8e8e; /* SOURCE: footer text */ --cg-neutral-700: #595959; /* SOURCE: legal / secondary text */ --cg-neutral-900: #222222; /* SOURCE: ink */ /* ---- semantic surfaces ---- */ --cg-surface-page: var(--cg-neutral-0);
|
|
88
|
+
--cg-neutral-400: #acacac; /* SOURCE: placeholder */ --cg-neutral-500: #8e8e8e; /* SOURCE: footer text */ --cg-neutral-700: #595959; /* SOURCE: legal / secondary text */ --cg-neutral-900: #222222; /* SOURCE: ink */ /* ---- semantic surfaces ---- */ --cg-surface-page: var(--cg-neutral-0);
|
|
89
|
+
--cg-neutral-500: #8e8e8e; /* SOURCE: footer text */ --cg-neutral-700: #595959; /* SOURCE: legal / secondary text */ --cg-neutral-900: #222222; /* SOURCE: ink */ /* ---- semantic surfaces ---- */ --cg-surface-page: var(--cg-neutral-0);
|
|
90
|
+
--cg-neutral-700: #595959; /* SOURCE: legal / secondary text */ --cg-neutral-900: #222222; /* SOURCE: ink */ /* ---- semantic surfaces ---- */ --cg-surface-page: var(--cg-neutral-0);
|
|
91
|
+
--cg-neutral-900: #222222; /* SOURCE: ink */ /* ---- semantic surfaces ---- */ --cg-surface-page: var(--cg-neutral-0);
|
|
92
|
+
|
|
93
|
+
/* ---- semantic-surfaces ---- */
|
|
94
|
+
--cg-surface-page: var(--cg-neutral-0);
|
|
95
|
+
--cg-surface-page-alt: var(--cg-lavender-50);
|
|
96
|
+
--cg-surface-card: var(--cg-neutral-0);
|
|
97
|
+
--cg-surface-subtle: var(--cg-lavender-50);
|
|
98
|
+
--cg-surface-control: var(--cg-neutral-200);
|
|
99
|
+
--cg-surface-panel: var(--cg-primary);
|
|
100
|
+
--cg-surface-code: var(--cg-ink);
|
|
101
|
+
|
|
102
|
+
/* ---- semantic-text ---- */
|
|
103
|
+
--cg-text-primary: var(--cg-neutral-900);
|
|
104
|
+
--cg-text-secondary: var(--cg-neutral-700);
|
|
105
|
+
--cg-text-muted: var(--cg-neutral-500);
|
|
106
|
+
--cg-text-placeholder: var(--cg-neutral-400);
|
|
107
|
+
--cg-text-accent: var(--cg-primary);
|
|
108
|
+
--cg-text-inverse: var(--cg-neutral-0);
|
|
109
|
+
--cg-text-on-primary: var(--cg-neutral-0);
|
|
110
|
+
--cg-text-on-accent: var(--cg-ink);
|
|
111
|
+
--cg-text-on-code: #e7e7e7;
|
|
112
|
+
|
|
113
|
+
/* ---- semantic-lines ---- */
|
|
114
|
+
--cg-border-hairline: var(--cg-neutral-100);
|
|
115
|
+
--cg-border-control: var(--cg-neutral-200);
|
|
116
|
+
--cg-border-strong: var(--cg-ink);
|
|
117
|
+
--cg-border-accent: var(--cg-primary);
|
|
118
|
+
--cg-focus-ring: rgba(90, 71, 240, 0.28);
|
|
119
|
+
|
|
120
|
+
/* ---- link ---- */
|
|
121
|
+
--cg-link: var(--cg-text-primary);
|
|
122
|
+
--cg-link-hover: var(--cg-primary);
|
|
123
|
+
|
|
124
|
+
/* ---- type-families ----
|
|
125
|
+
H1 is Futura Condensed Extra Bold where it is installed. It is a licensed
|
|
126
|
+
face, NOT a webfont, so Saira Semi Condensed 800 is the self-hosted
|
|
127
|
+
fallback that keeps every H1 heavy and condensed everywhere else. Drop the
|
|
128
|
+
licensed woff2 in and it takes over with no other change. */
|
|
129
|
+
--cg-font-display: 'Futura Condensed ExtraBold', 'Futura Condensed', 'Saira Semi Condensed Variable', 'Saira Semi Condensed', 'Arial Narrow', sans-serif;
|
|
130
|
+
--cg-font-body: 'Manrope Variable', 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
131
|
+
--cg-font-mono: 'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
132
|
+
|
|
133
|
+
/* ---- weights ----
|
|
134
|
+
weights (Manrope ships 400/500/700) */
|
|
135
|
+
--cg-weight-regular: 400;
|
|
136
|
+
--cg-weight-medium: 500;
|
|
137
|
+
--cg-weight-bold: 700;
|
|
138
|
+
--cg-weight-display: 800;
|
|
139
|
+
|
|
140
|
+
/* ---- h1-display-ramp ----
|
|
141
|
+
H1 display ramp: uppercase, condensed, Primary or white
|
|
142
|
+
|
|
143
|
+
Stepped down one notch 2026-08-06 (operator: main headings read too
|
|
144
|
+
dominant). The SOURCE values were xl 64 / lg 48 / md 42 / sm 32. */
|
|
145
|
+
--cg-display-xl: 56px;
|
|
146
|
+
--cg-display-lg: 44px;
|
|
147
|
+
--cg-display-md: 38px; /* SOURCE: onboarding H1 (was 42px) */ --cg-display-sm: 30px;
|
|
148
|
+
--cg-display-sm: 30px;
|
|
149
|
+
--cg-display-line: 1.06;
|
|
150
|
+
--cg-display-tracking: 0.012em;
|
|
151
|
+
|
|
152
|
+
/* ---- manrope-ramp ---- */
|
|
153
|
+
--cg-heading-lg: 24px;
|
|
154
|
+
--cg-heading-md: 20px; /* SOURCE: card title */ --cg-heading-sm: 17px; /* SOURCE: step title */ --cg-heading-line: 1.3;
|
|
155
|
+
--cg-heading-sm: 17px; /* SOURCE: step title */ --cg-heading-line: 1.3;
|
|
156
|
+
--cg-heading-line: 1.3;
|
|
157
|
+
--cg-body-lg: 19px; /* SOURCE: H1 subline */ --cg-body-md: 16px; /* SOURCE: default UI text */ --cg-body-sm: 15px; /* SOURCE: card body, legal */ --cg-caption: 13px; /* SOURCE: footer, helper */ --cg-body-line: 1.5;
|
|
158
|
+
--cg-body-md: 16px; /* SOURCE: default UI text */ --cg-body-sm: 15px; /* SOURCE: card body, legal */ --cg-caption: 13px; /* SOURCE: footer, helper */ --cg-body-line: 1.5;
|
|
159
|
+
--cg-body-sm: 15px; /* SOURCE: card body, legal */ --cg-caption: 13px; /* SOURCE: footer, helper */ --cg-body-line: 1.5;
|
|
160
|
+
--cg-caption: 13px; /* SOURCE: footer, helper */ --cg-body-line: 1.5;
|
|
161
|
+
--cg-body-line: 1.5;
|
|
162
|
+
--cg-body-tracking: 0em;
|
|
163
|
+
--cg-mono-size: 14px;
|
|
164
|
+
--cg-mono-line: 1.7;
|
|
165
|
+
--cg-label-size: 15px;
|
|
166
|
+
--cg-label-weight: var(--cg-weight-medium);
|
|
167
|
+
|
|
168
|
+
/* ---- spacing ----
|
|
169
|
+
spacing: 4px base */
|
|
170
|
+
--cg-space-1: 4px;
|
|
171
|
+
--cg-space-2: 8px;
|
|
172
|
+
--cg-space-3: 12px;
|
|
173
|
+
--cg-space-4: 16px;
|
|
174
|
+
--cg-space-5: 20px;
|
|
175
|
+
--cg-space-6: 24px;
|
|
176
|
+
--cg-space-8: 32px;
|
|
177
|
+
--cg-space-10: 40px;
|
|
178
|
+
--cg-space-12: 48px;
|
|
179
|
+
--cg-space-16: 64px;
|
|
180
|
+
--cg-space-20: 80px;
|
|
181
|
+
--cg-space-30: 120px;
|
|
182
|
+
|
|
183
|
+
/* ---- layout ----
|
|
184
|
+
layout (SOURCE measurements from the 1440px frames) */
|
|
185
|
+
--cg-column-form: 414px;
|
|
186
|
+
--cg-column-wide: 920px; /* SOURCE 844px; widened 2026-08-06 with the container */ --cg-page-pad: 32px;
|
|
187
|
+
--cg-page-pad: 32px;
|
|
188
|
+
--cg-header-height: 90px;
|
|
189
|
+
--cg-footer-height: 64px;
|
|
190
|
+
--cg-stack-tight: 8px;
|
|
191
|
+
--cg-stack: 16px;
|
|
192
|
+
--cg-stack-loose: 24px;
|
|
193
|
+
--cg-section-gap: 56px;
|
|
194
|
+
/*
|
|
195
|
+
Marketing pages are wider than the onboarding frames the system was
|
|
196
|
+
measured from, so the site adds one container width of its own.
|
|
197
|
+
1120 -> 1280 on 2026-08-06 (operator: too much white space at the sides). */
|
|
198
|
+
--cg-container: 1280px;
|
|
199
|
+
--cg-measure: 68ch;
|
|
200
|
+
|
|
201
|
+
/* ---- corners ---- */
|
|
202
|
+
--cg-radius-xs: 8px;
|
|
203
|
+
--cg-radius-sm: 10px;
|
|
204
|
+
--cg-radius-md: 12px; /* SOURCE: code block, OTP cell */ --cg-radius-lg: 14px; /* SOURCE: provider button, input, tool card */ --cg-radius-xl: 16px; /* SOURCE: option card */ --cg-radius-2xl: 24px; /* SOURCE: full-bleed purple panel */ --cg-radius-pill: 999px;
|
|
205
|
+
--cg-radius-lg: 14px; /* SOURCE: provider button, input, tool card */ --cg-radius-xl: 16px; /* SOURCE: option card */ --cg-radius-2xl: 24px; /* SOURCE: full-bleed purple panel */ --cg-radius-pill: 999px;
|
|
206
|
+
--cg-radius-xl: 16px; /* SOURCE: option card */ --cg-radius-2xl: 24px; /* SOURCE: full-bleed purple panel */ --cg-radius-pill: 999px;
|
|
207
|
+
--cg-radius-2xl: 24px; /* SOURCE: full-bleed purple panel */ --cg-radius-pill: 999px;
|
|
208
|
+
--cg-radius-pill: 999px;
|
|
209
|
+
--cg-border-width: 1px;
|
|
210
|
+
--cg-border-width-strong: 1.5px;
|
|
211
|
+
|
|
212
|
+
/* ---- elevation ----
|
|
213
|
+
elevation: hairlines first, shadow only on the wash or on hover */
|
|
214
|
+
--cg-shadow-none: none;
|
|
215
|
+
--cg-shadow-card: 0 1px 2px rgba(34, 34, 34, 0.04);
|
|
216
|
+
--cg-shadow-raised: 0 4px 14px rgba(34, 34, 34, 0.06);
|
|
217
|
+
--cg-shadow-hover: 0 8px 24px rgba(34, 34, 34, 0.08);
|
|
218
|
+
--cg-shadow-panel: 0 10px 40px rgba(90, 71, 240, 0.18);
|
|
219
|
+
--cg-ring-focus: 0 0 0 3px var(--cg-focus-ring);
|
|
220
|
+
|
|
221
|
+
/* ---- motion ----
|
|
222
|
+
motion: small and quick, nothing slides in */
|
|
223
|
+
--cg-duration-fast: 120ms;
|
|
224
|
+
--cg-duration: 180ms;
|
|
225
|
+
--cg-duration-slow: 280ms;
|
|
226
|
+
--cg-ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
227
|
+
--cg-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
228
|
+
--cg-transition-control: background-color var(--cg-duration) var(--cg-ease-out), border-color var(--cg-duration) var(--cg-ease-out), color var(--cg-duration) var(--cg-ease-out), box-shadow var(--cg-duration) var(--cg-ease-out);
|
|
229
|
+
--cg-lift-hover: translateY(-1px);
|
|
230
|
+
--cg-press-scale: 0.985;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
[data-cg-surface='panel'] {
|
|
234
|
+
/* ---- semantic-text ---- */
|
|
235
|
+
--cg-text-primary: #ffffff;
|
|
236
|
+
--cg-text-secondary: rgba(255, 255, 255, 0.82);
|
|
237
|
+
--cg-text-muted: rgba(255, 255, 255, 0.66);
|
|
238
|
+
--cg-text-accent: #ffffff;
|
|
239
|
+
|
|
240
|
+
/* ---- semantic-lines ---- */
|
|
241
|
+
--cg-border-control: rgba(255, 255, 255, 0.62);
|
|
242
|
+
--cg-border-hairline: rgba(255, 255, 255, 0.24);
|
|
243
|
+
--cg-border-strong: #ffffff;
|
|
244
|
+
--cg-focus-ring: rgba(255, 255, 255, 0.5);
|
|
245
|
+
|
|
246
|
+
/* ---- link ---- */
|
|
247
|
+
--cg-link: #ffffff;
|
|
248
|
+
--cg-link-hover: var(--cg-secondary);
|
|
249
|
+
|
|
250
|
+
/* ---- semantic-surfaces ---- */
|
|
251
|
+
--cg-surface-card: transparent;
|
|
252
|
+
|
|
253
|
+
/* ---- danger ---- */
|
|
254
|
+
/*
|
|
255
|
+
The source red measures 1.38:1 against this purple, which is invisible.
|
|
256
|
+
Same class as #41. This tint is derived from it and measures 4.52:1, so it
|
|
257
|
+
clears AA for body text as well as the 3:1 UI bar. */
|
|
258
|
+
--cg-danger: #FFDAD6;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
[data-cg-surface='ink'] {
|
|
262
|
+
/* ---- semantic-text ---- */
|
|
263
|
+
--cg-text-primary: #ffffff;
|
|
264
|
+
--cg-text-secondary: rgba(255, 255, 255, 0.78);
|
|
265
|
+
--cg-text-muted: rgba(255, 255, 255, 0.56);
|
|
266
|
+
--cg-text-accent: var(--cg-secondary);
|
|
267
|
+
|
|
268
|
+
/* ---- semantic-surfaces ---- */
|
|
269
|
+
--cg-surface-card: rgba(255, 255, 255, 0.04);
|
|
270
|
+
--cg-surface-page-alt: rgba(255, 255, 255, 0.06);
|
|
271
|
+
|
|
272
|
+
/* ---- semantic-lines ---- */
|
|
273
|
+
--cg-border-control: rgba(255, 255, 255, 0.4);
|
|
274
|
+
--cg-border-hairline: rgba(255, 255, 255, 0.16);
|
|
275
|
+
--cg-border-strong: #ffffff;
|
|
276
|
+
--cg-border-accent: var(--cg-secondary);
|
|
277
|
+
--cg-focus-ring: rgba(182, 222, 104, 0.45);
|
|
278
|
+
|
|
279
|
+
/* ---- link ---- */
|
|
280
|
+
--cg-link: #ffffff;
|
|
281
|
+
--cg-link-hover: var(--cg-secondary);
|
|
282
|
+
|
|
283
|
+
/* ---- danger ---- */
|
|
284
|
+
/*
|
|
285
|
+
Ink has more headroom than the panel, so this stays recognisably red rather
|
|
286
|
+
than washing out to pink: 6.97:1 against #222, comfortably past AA for body
|
|
287
|
+
text. The source red would have managed only 3.76:1 here. */
|
|
288
|
+
--cg-danger: #FF8A80;
|
|
289
|
+
}
|