@apliteni/apliteni-ui 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/LICENSE +6 -0
- package/README.md +159 -0
- package/package.json +49 -0
- package/src/assets/brand.js +18 -0
- package/src/assets/icons.js +36 -0
- package/src/components/feedback.js +171 -0
- package/src/components/index.js +126 -0
- package/src/components/shell.js +46 -0
- package/src/components/topbar.js +133 -0
- package/src/index.css +19 -0
- package/src/index.js +8 -0
- package/src/inline.js +55 -0
- package/src/styles/badge.css +64 -0
- package/src/styles/base.css +127 -0
- package/src/styles/button.css +118 -0
- package/src/styles/callout.css +69 -0
- package/src/styles/card.css +79 -0
- package/src/styles/code.css +72 -0
- package/src/styles/feedback.css +113 -0
- package/src/styles/input.css +155 -0
- package/src/styles/layout.css +164 -0
- package/src/styles/segmented.css +55 -0
- package/src/styles/table.css +51 -0
- package/src/styles/topbar.css +199 -0
- package/src/tokens/accents.css +92 -0
- package/src/tokens/tokens.css +185 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* Topbar — canonical strategy topbar, extracted verbatim (class names kept so
|
|
3
|
+
* viz/ adopts it with no markup change): brand, Deck/Text switch, theme
|
|
4
|
+
* toggle, version switcher, account menu.
|
|
5
|
+
* Source of truth previously inlined in viz/topbar.mjs.
|
|
6
|
+
* ========================================================================== */
|
|
7
|
+
|
|
8
|
+
.topbar {
|
|
9
|
+
height: 52px;
|
|
10
|
+
display: flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
background: var(--bg);
|
|
13
|
+
border-bottom: 1px solid var(--border);
|
|
14
|
+
}
|
|
15
|
+
.topbar__in {
|
|
16
|
+
width: 100%;
|
|
17
|
+
max-width: 1180px;
|
|
18
|
+
margin: 0 auto;
|
|
19
|
+
padding: 0 clamp(14px, 2.4vw, 26px);
|
|
20
|
+
display: flex;
|
|
21
|
+
align-items: center;
|
|
22
|
+
gap: 14px;
|
|
23
|
+
}
|
|
24
|
+
.topbar .brand {
|
|
25
|
+
display: inline-flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: 9px;
|
|
28
|
+
font-size: 13px;
|
|
29
|
+
font-weight: 600;
|
|
30
|
+
color: var(--strong);
|
|
31
|
+
text-decoration: none;
|
|
32
|
+
}
|
|
33
|
+
.topbar .brand svg { display: block; flex: none; }
|
|
34
|
+
.topbar .spacer { flex: 1; }
|
|
35
|
+
|
|
36
|
+
/* Deck / Text (segmented, pill) */
|
|
37
|
+
.dtsw {
|
|
38
|
+
display: none;
|
|
39
|
+
align-items: center;
|
|
40
|
+
gap: 2px;
|
|
41
|
+
background: var(--surface-2);
|
|
42
|
+
border: 1px solid var(--border);
|
|
43
|
+
border-radius: 24px;
|
|
44
|
+
padding: 3px;
|
|
45
|
+
}
|
|
46
|
+
.dtsw.on { display: inline-flex; }
|
|
47
|
+
.dtsw a {
|
|
48
|
+
text-decoration: none;
|
|
49
|
+
font-family: var(--font-sans);
|
|
50
|
+
font-size: 12px;
|
|
51
|
+
font-weight: 600;
|
|
52
|
+
letter-spacing: 0.04em;
|
|
53
|
+
color: var(--muted);
|
|
54
|
+
padding: 4px 13px;
|
|
55
|
+
border-radius: 24px;
|
|
56
|
+
transition: color 0.2s ease, background 0.2s ease;
|
|
57
|
+
}
|
|
58
|
+
.dtsw a:hover { color: var(--text); }
|
|
59
|
+
.dtsw a.cur { color: var(--strong); background: var(--surface); box-shadow: var(--shadow-sm); }
|
|
60
|
+
|
|
61
|
+
/* Theme toggle */
|
|
62
|
+
.toggle {
|
|
63
|
+
display: inline-flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
gap: 8px;
|
|
66
|
+
cursor: pointer;
|
|
67
|
+
background: var(--surface);
|
|
68
|
+
color: var(--text);
|
|
69
|
+
border: 1px solid var(--border);
|
|
70
|
+
border-radius: 24px;
|
|
71
|
+
padding: 7px 12px;
|
|
72
|
+
font-family: var(--font-sans);
|
|
73
|
+
font-size: 12px;
|
|
74
|
+
font-weight: 500;
|
|
75
|
+
transition: transform 0.15s ease, background 0.35s ease, border-color 0.35s ease;
|
|
76
|
+
}
|
|
77
|
+
.toggle:hover { transform: translateY(-1px); }
|
|
78
|
+
.toggle .ic { width: 15px; height: 15px; display: inline-block; color: var(--accent); }
|
|
79
|
+
.toggle .ic svg { display: block; width: 100%; height: 100%; }
|
|
80
|
+
|
|
81
|
+
/* Version switcher */
|
|
82
|
+
.vsw { position: relative; }
|
|
83
|
+
.vsw__btn {
|
|
84
|
+
display: inline-flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: 8px;
|
|
87
|
+
cursor: pointer;
|
|
88
|
+
font-family: var(--font-sans);
|
|
89
|
+
font-size: 12.5px;
|
|
90
|
+
font-weight: 500;
|
|
91
|
+
color: var(--text);
|
|
92
|
+
background: var(--surface);
|
|
93
|
+
border: 1px solid var(--border);
|
|
94
|
+
border-radius: 24px;
|
|
95
|
+
padding: 7px 11px 7px 13px;
|
|
96
|
+
transition: border-color 0.2s ease, background 0.2s ease;
|
|
97
|
+
}
|
|
98
|
+
.vsw__btn:hover { border-color: var(--accent); }
|
|
99
|
+
.vsw__btn .lbl { color: var(--muted); }
|
|
100
|
+
.vsw__btn .cur { color: var(--strong); font-weight: 600; letter-spacing: 0.01em; }
|
|
101
|
+
.vsw__btn .car {
|
|
102
|
+
width: 8px; height: 8px;
|
|
103
|
+
border-right: 1.6px solid var(--muted);
|
|
104
|
+
border-bottom: 1.6px solid var(--muted);
|
|
105
|
+
transform: rotate(45deg) translateY(-1px);
|
|
106
|
+
transition: transform 0.2s ease;
|
|
107
|
+
}
|
|
108
|
+
.vsw.open .vsw__btn .car { transform: rotate(-135deg) translateY(2px); }
|
|
109
|
+
.vsw__menu {
|
|
110
|
+
position: absolute;
|
|
111
|
+
top: calc(100% + 9px);
|
|
112
|
+
left: 0;
|
|
113
|
+
min-width: 266px;
|
|
114
|
+
background: var(--surface-2);
|
|
115
|
+
border: 1px solid var(--border);
|
|
116
|
+
border-radius: 16px;
|
|
117
|
+
padding: 6px;
|
|
118
|
+
box-shadow: var(--shadow-lg);
|
|
119
|
+
opacity: 0;
|
|
120
|
+
visibility: hidden;
|
|
121
|
+
transform: translateY(-6px);
|
|
122
|
+
transition: 0.18s ease;
|
|
123
|
+
z-index: var(--z-dropdown);
|
|
124
|
+
}
|
|
125
|
+
.vsw.open .vsw__menu { opacity: 1; visibility: visible; transform: translateY(0); }
|
|
126
|
+
.vopt {
|
|
127
|
+
display: flex;
|
|
128
|
+
gap: 11px;
|
|
129
|
+
align-items: flex-start;
|
|
130
|
+
padding: 10px 13px;
|
|
131
|
+
border-radius: 10px;
|
|
132
|
+
cursor: pointer;
|
|
133
|
+
transition: background 0.15s ease;
|
|
134
|
+
}
|
|
135
|
+
.vopt:hover { background: var(--surface); }
|
|
136
|
+
.vopt .vname { font-family: var(--font-sans); font-size: 12.5px; color: var(--strong); font-weight: 600; letter-spacing: 0.01em; }
|
|
137
|
+
.vopt .vmeta { font-size: 11px; color: var(--muted); margin-top: 2px; }
|
|
138
|
+
.vopt .vbadge {
|
|
139
|
+
font-size: 9.5px;
|
|
140
|
+
letter-spacing: 0.12em;
|
|
141
|
+
text-transform: uppercase;
|
|
142
|
+
font-weight: 700;
|
|
143
|
+
padding: 2px 7px;
|
|
144
|
+
border-radius: 999px;
|
|
145
|
+
margin-left: auto;
|
|
146
|
+
flex: none;
|
|
147
|
+
margin-top: 1px;
|
|
148
|
+
}
|
|
149
|
+
.vbadge.live { color: var(--green); background: var(--glow-green); }
|
|
150
|
+
.vbadge.arch { color: var(--muted); background: var(--surface); }
|
|
151
|
+
@media (max-width: 600px) { .vsw__btn .lbl { display: none; } }
|
|
152
|
+
|
|
153
|
+
/* Account — avatar + dropdown. Gated: hidden until the app confirms a session
|
|
154
|
+
and adds `.on` (mirrors the portal's /auth/me reveal). */
|
|
155
|
+
.acct { position: relative; display: none; }
|
|
156
|
+
.acct.on { display: inline-flex; }
|
|
157
|
+
.avatar {
|
|
158
|
+
width: 32px; height: 32px;
|
|
159
|
+
border-radius: 50%;
|
|
160
|
+
border: 1px solid var(--border);
|
|
161
|
+
background: linear-gradient(145deg, #2b6b4b, #1d4a5e);
|
|
162
|
+
color: #fff;
|
|
163
|
+
font-weight: 600;
|
|
164
|
+
font-size: 12.5px;
|
|
165
|
+
display: grid;
|
|
166
|
+
place-items: center;
|
|
167
|
+
cursor: pointer;
|
|
168
|
+
letter-spacing: 0.02em;
|
|
169
|
+
transition: border-color 0.2s ease;
|
|
170
|
+
}
|
|
171
|
+
.acct .avatar:hover { border-color: var(--accent); }
|
|
172
|
+
.amenu {
|
|
173
|
+
position: absolute;
|
|
174
|
+
right: 0; top: 44px;
|
|
175
|
+
width: 252px;
|
|
176
|
+
background: var(--surface-2);
|
|
177
|
+
border: 1px solid var(--border);
|
|
178
|
+
border-radius: 14px;
|
|
179
|
+
box-shadow: var(--shadow-lg);
|
|
180
|
+
overflow: hidden;
|
|
181
|
+
opacity: 0;
|
|
182
|
+
visibility: hidden;
|
|
183
|
+
transform: translateY(-6px);
|
|
184
|
+
transition: 0.16s ease;
|
|
185
|
+
z-index: var(--z-dropdown);
|
|
186
|
+
}
|
|
187
|
+
.acct.open .amenu { opacity: 1; visibility: visible; transform: translateY(0); }
|
|
188
|
+
.amenu .ahead { padding: 13px 15px; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 11px; }
|
|
189
|
+
.amenu .ahead .avatar { cursor: default; }
|
|
190
|
+
.amenu .ahead .aw { min-width: 0; display: flex; flex-direction: column; gap: 1px; line-height: 1.35; }
|
|
191
|
+
.amenu .ahead .anm { color: var(--strong); font-size: 13px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
192
|
+
.amenu .ahead .aem { color: var(--muted); font-size: 11.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
193
|
+
.amenu a { display: flex; align-items: center; gap: 11px; padding: 10px 15px; color: var(--text); text-decoration: none; font-family: var(--font-sans); font-size: 13px; cursor: pointer; }
|
|
194
|
+
.amenu a:hover { background: var(--surface); }
|
|
195
|
+
.amenu a.cur { color: var(--accent); }
|
|
196
|
+
.amenu a svg { width: 19px; height: 19px; flex: none; stroke: currentColor; fill: none; stroke-width: 1.8; opacity: 0.85; }
|
|
197
|
+
.amenu .asep { height: 1px; background: var(--border); margin: 5px 0; }
|
|
198
|
+
.amenu a.aout { color: var(--muted); }
|
|
199
|
+
.amenu a.aout:hover { color: var(--accent); }
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* Accent sub-themes — an orthogonal `data-accent` dimension on top of
|
|
3
|
+
* `data-theme` (dark/light). Set both on <html>:
|
|
4
|
+
*
|
|
5
|
+
* <html data-theme="dark" data-accent="phoenix">
|
|
6
|
+
*
|
|
7
|
+
* Each sub-theme only re-points the accent family (--accent, --purple*,
|
|
8
|
+
* --glow-purple, --ring, --grad-*). Surfaces, text and signal colours (green =
|
|
9
|
+
* live, pink = danger) stay put, so every accent works in light AND dark and
|
|
10
|
+
* every component follows with zero component-level changes.
|
|
11
|
+
*
|
|
12
|
+
* Selectors carry two attributes + :root, so they always out-specify the
|
|
13
|
+
* single-attribute theme blocks in tokens.css regardless of import order.
|
|
14
|
+
* ========================================================================== */
|
|
15
|
+
|
|
16
|
+
/* ---- Phoenix — ember / rising fire (the strategy's namesake) ------------- */
|
|
17
|
+
:root[data-theme="dark"][data-accent="phoenix"] {
|
|
18
|
+
--purple: #e0531f;
|
|
19
|
+
--purple-light: #ff8a5c;
|
|
20
|
+
--purple-mid: #ffa273;
|
|
21
|
+
--accent: #ff6a3d;
|
|
22
|
+
--accent-strong: var(--accent);
|
|
23
|
+
--accent-contrast: #241006;
|
|
24
|
+
--glow-purple: rgba(255, 106, 61, 0.18);
|
|
25
|
+
--ring: 0 0 0 3px rgba(255, 106, 61, 0.38);
|
|
26
|
+
--grad-from: #ff7a45;
|
|
27
|
+
--grad-to: #ffcf6a;
|
|
28
|
+
}
|
|
29
|
+
:root[data-theme="light"][data-accent="phoenix"] {
|
|
30
|
+
--purple: #c2400f;
|
|
31
|
+
--purple-light: #d64a12;
|
|
32
|
+
--purple-mid: #b8420f;
|
|
33
|
+
--accent: #d64a12;
|
|
34
|
+
--accent-strong: var(--accent);
|
|
35
|
+
--accent-contrast: #ffffff;
|
|
36
|
+
--glow-purple: rgba(214, 74, 18, 0.10);
|
|
37
|
+
--ring: 0 0 0 3px rgba(214, 74, 18, 0.28);
|
|
38
|
+
--grad-from: #d64a12;
|
|
39
|
+
--grad-to: #e8992a;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* ---- Ocean — azure ------------------------------------------------------- */
|
|
43
|
+
:root[data-theme="dark"][data-accent="ocean"] {
|
|
44
|
+
--purple: #1f7fe0;
|
|
45
|
+
--purple-light: #5ab0ff;
|
|
46
|
+
--purple-mid: #7cc0ff;
|
|
47
|
+
--accent: #3b9dff;
|
|
48
|
+
--accent-strong: var(--accent);
|
|
49
|
+
--accent-contrast: #04121f;
|
|
50
|
+
--glow-purple: rgba(59, 157, 255, 0.18);
|
|
51
|
+
--ring: 0 0 0 3px rgba(59, 157, 255, 0.38);
|
|
52
|
+
--grad-from: #3b9dff;
|
|
53
|
+
--grad-to: #20dcf5;
|
|
54
|
+
}
|
|
55
|
+
:root[data-theme="light"][data-accent="ocean"] {
|
|
56
|
+
--purple: #1156b8;
|
|
57
|
+
--purple-light: #1568d6;
|
|
58
|
+
--purple-mid: #1560c8;
|
|
59
|
+
--accent: #1568d6;
|
|
60
|
+
--accent-strong: var(--accent);
|
|
61
|
+
--accent-contrast: #ffffff;
|
|
62
|
+
--glow-purple: rgba(21, 104, 214, 0.10);
|
|
63
|
+
--ring: 0 0 0 3px rgba(21, 104, 214, 0.28);
|
|
64
|
+
--grad-from: #1568d6;
|
|
65
|
+
--grad-to: #17a2c0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* ---- Emerald — jade ------------------------------------------------------ */
|
|
69
|
+
:root[data-theme="dark"][data-accent="emerald"] {
|
|
70
|
+
--purple: #0fa876;
|
|
71
|
+
--purple-light: #3ad9a0;
|
|
72
|
+
--purple-mid: #5fe3b4;
|
|
73
|
+
--accent: #16c98a;
|
|
74
|
+
--accent-strong: var(--accent);
|
|
75
|
+
--accent-contrast: #04180f;
|
|
76
|
+
--glow-purple: rgba(22, 201, 138, 0.18);
|
|
77
|
+
--ring: 0 0 0 3px rgba(22, 201, 138, 0.38);
|
|
78
|
+
--grad-from: #16c98a;
|
|
79
|
+
--grad-to: #20dcf5;
|
|
80
|
+
}
|
|
81
|
+
:root[data-theme="light"][data-accent="emerald"] {
|
|
82
|
+
--purple: #0a865a;
|
|
83
|
+
--purple-light: #0b9c68;
|
|
84
|
+
--purple-mid: #0a9060;
|
|
85
|
+
--accent: #0b9c68;
|
|
86
|
+
--accent-strong: var(--accent);
|
|
87
|
+
--accent-contrast: #ffffff;
|
|
88
|
+
--glow-purple: rgba(11, 156, 104, 0.10);
|
|
89
|
+
--ring: 0 0 0 3px rgba(11, 156, 104, 0.28);
|
|
90
|
+
--grad-from: #0b9c68;
|
|
91
|
+
--grad-to: #12b0a0;
|
|
92
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* apliteni-ui — design tokens
|
|
3
|
+
* Single source of truth for the Apliteni deck theme.
|
|
4
|
+
*
|
|
5
|
+
* Colour semantics are identical to viz/ (deck index.html, account.mjs):
|
|
6
|
+
* purple accent, near-black surfaces, green = live, cyan = link/flag.
|
|
7
|
+
* Two themes: dark (default) and light. Toggle with `data-theme` on <html>.
|
|
8
|
+
*
|
|
9
|
+
* Everything downstream references the SEMANTIC tokens (--bg, --surface,
|
|
10
|
+
* --accent, --text…), never the raw ramp. Swap a ramp value once, and every
|
|
11
|
+
* component follows.
|
|
12
|
+
* ========================================================================== */
|
|
13
|
+
|
|
14
|
+
:root {
|
|
15
|
+
/* -- Brand ramp (theme-invariant hues) ---------------------------------- */
|
|
16
|
+
--purple-900: #4c1f94;
|
|
17
|
+
--purple-700: #6a2dcc;
|
|
18
|
+
--purple-500: #9b5dff;
|
|
19
|
+
--purple-400: #b479ff;
|
|
20
|
+
--cyan-500: #20dcf5;
|
|
21
|
+
--green-500: #98ff8f;
|
|
22
|
+
|
|
23
|
+
/* -- Radius scale ------------------------------------------------------- */
|
|
24
|
+
--radius-xs: 6px;
|
|
25
|
+
--radius-sm: 9px;
|
|
26
|
+
--radius-md: 12px;
|
|
27
|
+
--radius-lg: 16px;
|
|
28
|
+
--radius-xl: 18px;
|
|
29
|
+
--radius-2xl: 24px;
|
|
30
|
+
--radius-pill: 999px;
|
|
31
|
+
|
|
32
|
+
/* -- Spacing scale (4px base) ------------------------------------------- */
|
|
33
|
+
--space-1: 4px;
|
|
34
|
+
--space-2: 8px;
|
|
35
|
+
--space-3: 12px;
|
|
36
|
+
--space-4: 16px;
|
|
37
|
+
--space-5: 20px;
|
|
38
|
+
--space-6: 24px;
|
|
39
|
+
--space-8: 32px;
|
|
40
|
+
--space-10: 40px;
|
|
41
|
+
--space-12: 48px;
|
|
42
|
+
--space-16: 64px;
|
|
43
|
+
|
|
44
|
+
/* -- Typography --------------------------------------------------------- */
|
|
45
|
+
--font-sans: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
46
|
+
--font-mono: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
|
|
47
|
+
|
|
48
|
+
--text-xs: 11px;
|
|
49
|
+
--text-sm: 13px;
|
|
50
|
+
--text-base: 14.5px;
|
|
51
|
+
--text-md: 15.5px;
|
|
52
|
+
--text-lg: 18px;
|
|
53
|
+
--text-xl: 22px;
|
|
54
|
+
--text-2xl: 30px;
|
|
55
|
+
--text-3xl: 40px;
|
|
56
|
+
--text-4xl: 56px;
|
|
57
|
+
|
|
58
|
+
--weight-light: 300;
|
|
59
|
+
--weight-normal: 400;
|
|
60
|
+
--weight-medium: 500;
|
|
61
|
+
--weight-semibold: 600;
|
|
62
|
+
--weight-bold: 700;
|
|
63
|
+
|
|
64
|
+
--leading-tight: 1.2;
|
|
65
|
+
--leading-snug: 1.4;
|
|
66
|
+
--leading-normal: 1.62;
|
|
67
|
+
|
|
68
|
+
--tracking-tight: -0.01em;
|
|
69
|
+
--tracking-normal: 0;
|
|
70
|
+
--tracking-wide: 0.04em;
|
|
71
|
+
--tracking-caps: 0.14em;
|
|
72
|
+
|
|
73
|
+
/* -- Motion ------------------------------------------------------------- */
|
|
74
|
+
--ease: cubic-bezier(0.4, 0, 0.2, 1);
|
|
75
|
+
--dur-fast: 0.15s;
|
|
76
|
+
--dur-med: 0.25s;
|
|
77
|
+
--dur-slow: 0.4s;
|
|
78
|
+
|
|
79
|
+
/* -- Elevation (z) ------------------------------------------------------ */
|
|
80
|
+
--z-base: 1;
|
|
81
|
+
--z-sticky: 10;
|
|
82
|
+
--z-dropdown: 30;
|
|
83
|
+
--z-overlay: 100;
|
|
84
|
+
--z-toast: 200;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* ============================================================================
|
|
88
|
+
* DARK THEME (default) — deck palette from viz/index.html
|
|
89
|
+
* ========================================================================== */
|
|
90
|
+
:root,
|
|
91
|
+
:root[data-theme="dark"] {
|
|
92
|
+
color-scheme: dark;
|
|
93
|
+
|
|
94
|
+
--purple: #6a2dcc;
|
|
95
|
+
--purple-light: #9b5dff;
|
|
96
|
+
--purple-mid: #b479ff;
|
|
97
|
+
--cyan: #20dcf5;
|
|
98
|
+
--green: #98ff8f;
|
|
99
|
+
--pink: #e35b8f;
|
|
100
|
+
--amber: #ffcf6a;
|
|
101
|
+
|
|
102
|
+
--bg: #16151f;
|
|
103
|
+
--bg-elevated: #1c1a28;
|
|
104
|
+
--surface: #221f2e;
|
|
105
|
+
--surface-2: #1b1927;
|
|
106
|
+
--surface-3: #2a2739;
|
|
107
|
+
--seg-active-bg: #34314a; /* raised pill — clearly above the inset track in dark */
|
|
108
|
+
--border: #332f45;
|
|
109
|
+
--border-strong: #453f5c;
|
|
110
|
+
|
|
111
|
+
--text: #e9e7f0;
|
|
112
|
+
--strong: #ffffff;
|
|
113
|
+
--dim: #c6c2d6;
|
|
114
|
+
--muted: #948fa8;
|
|
115
|
+
|
|
116
|
+
--accent: #9b5dff;
|
|
117
|
+
--accent-strong: #7c3aed; /* button bg — white text clears WCAG AA (~6.5:1) */
|
|
118
|
+
--accent-contrast: #ffffff;
|
|
119
|
+
--ink: #e9e7f0;
|
|
120
|
+
|
|
121
|
+
--glow-green: rgba(152, 255, 143, 0.16);
|
|
122
|
+
--glow-purple: rgba(155, 93, 255, 0.18);
|
|
123
|
+
--glow-cyan: rgba(32, 220, 245, 0.14);
|
|
124
|
+
--glow-pink: rgba(227, 91, 143, 0.16);
|
|
125
|
+
|
|
126
|
+
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.28);
|
|
127
|
+
--shadow-md: 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
128
|
+
--shadow-lg: 0 18px 50px rgba(0, 0, 0, 0.5);
|
|
129
|
+
/* Tight elevation for the active segmented pill — stays contained in its track. */
|
|
130
|
+
--shadow-seg: 0 1px 2px rgba(0, 0, 0, 0.45), 0 2px 4px rgba(0, 0, 0, 0.3);
|
|
131
|
+
--ring: 0 0 0 3px rgba(155, 93, 255, 0.35);
|
|
132
|
+
|
|
133
|
+
/* Accent gradient stops (hero headline, marketing) — overridden per sub-theme. */
|
|
134
|
+
--grad-from: var(--purple-light);
|
|
135
|
+
--grad-to: var(--cyan);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* ============================================================================
|
|
139
|
+
* LIGHT THEME — deck light palette from viz/account.mjs
|
|
140
|
+
* ========================================================================== */
|
|
141
|
+
:root[data-theme="light"] {
|
|
142
|
+
color-scheme: light;
|
|
143
|
+
|
|
144
|
+
--purple: #6a2dcc;
|
|
145
|
+
--purple-light: #6a2dcc;
|
|
146
|
+
--purple-mid: #7a3be0;
|
|
147
|
+
--cyan: #0c8fa8;
|
|
148
|
+
--green: #1c8a2c;
|
|
149
|
+
--pink: #d63c72;
|
|
150
|
+
--amber: #b5730a;
|
|
151
|
+
|
|
152
|
+
--bg: #f6f6f8;
|
|
153
|
+
--bg-elevated: #ffffff;
|
|
154
|
+
--surface: #ffffff;
|
|
155
|
+
--surface-2: #f0f1f5;
|
|
156
|
+
--surface-3: #e7e9f0;
|
|
157
|
+
--seg-active-bg: #ffffff; /* white pill raised above the grey track in light */
|
|
158
|
+
--border: #d7dae2;
|
|
159
|
+
--border-strong: #c3c7d4;
|
|
160
|
+
|
|
161
|
+
--text: #1e232b;
|
|
162
|
+
--strong: #0f0f13;
|
|
163
|
+
--dim: #3d434e;
|
|
164
|
+
--muted: #565c68;
|
|
165
|
+
|
|
166
|
+
--accent: #6a2dcc;
|
|
167
|
+
--accent-strong: #6a2dcc; /* already dark enough for white text */
|
|
168
|
+
--accent-contrast: #ffffff;
|
|
169
|
+
--ink: #1e232b;
|
|
170
|
+
|
|
171
|
+
--glow-green: rgba(30, 150, 50, 0.1);
|
|
172
|
+
--glow-purple: rgba(106, 45, 204, 0.09);
|
|
173
|
+
--glow-cyan: rgba(12, 143, 168, 0.1);
|
|
174
|
+
--glow-pink: rgba(214, 60, 114, 0.1);
|
|
175
|
+
|
|
176
|
+
--shadow-sm: 0 1px 3px rgba(30, 30, 50, 0.08);
|
|
177
|
+
--shadow-md: 0 8px 24px rgba(30, 30, 50, 0.1);
|
|
178
|
+
--shadow-lg: 0 18px 50px rgba(30, 30, 50, 0.16);
|
|
179
|
+
/* Tight elevation for the active segmented pill — stays contained in its track. */
|
|
180
|
+
--shadow-seg: 0 1px 2px rgba(30, 30, 50, 0.12), 0 2px 4px rgba(30, 30, 50, 0.1);
|
|
181
|
+
--ring: 0 0 0 3px rgba(106, 45, 204, 0.25);
|
|
182
|
+
|
|
183
|
+
--grad-from: var(--purple-light);
|
|
184
|
+
--grad-to: var(--cyan);
|
|
185
|
+
}
|