@adminiumjs/tokens 0.1.0-rc.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/LICENSE +661 -0
- package/LICENSES/FONTS.md +17 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/pre-hydration.d.ts +15 -0
- package/dist/pre-hydration.d.ts.map +1 -0
- package/dist/pre-hydration.js +24 -0
- package/dist/pre-hydration.js.map +1 -0
- package/package.json +44 -0
- package/src/accents.css +24 -0
- package/src/density.css +16 -0
- package/src/exceptions.css +64 -0
- package/src/fonts/ibm-plex-sans-arabic/ibm-plex-sans-arabic-arabic-400-normal.woff2 +0 -0
- package/src/fonts/ibm-plex-sans-arabic/ibm-plex-sans-arabic-arabic-500-normal.woff2 +0 -0
- package/src/fonts/ibm-plex-sans-arabic/ibm-plex-sans-arabic-arabic-600-normal.woff2 +0 -0
- package/src/fonts/ibm-plex-sans-arabic/ibm-plex-sans-arabic-arabic-700-normal.woff2 +0 -0
- package/src/fonts/jetbrains-mono/jetbrains-mono-latin-ext-wght-italic.woff2 +0 -0
- package/src/fonts/jetbrains-mono/jetbrains-mono-latin-ext-wght-normal.woff2 +0 -0
- package/src/fonts/jetbrains-mono/jetbrains-mono-latin-wght-italic.woff2 +0 -0
- package/src/fonts/jetbrains-mono/jetbrains-mono-latin-wght-normal.woff2 +0 -0
- package/src/fonts/manrope/manrope-latin-ext-wght-normal.woff2 +0 -0
- package/src/fonts/manrope/manrope-latin-wght-normal.woff2 +0 -0
- package/src/fonts.css +106 -0
- package/src/index.css +9 -0
- package/src/index.ts +84 -0
- package/src/motion.css +174 -0
- package/src/pre-hydration.ts +24 -0
- package/src/tailwind.css +63 -0
- package/src/tokens.css +55 -0
- package/src/viz.css +27 -0
package/src/motion.css
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/* @adminium/tokens — motion vocabulary. See workplan/02-design-system.md §5.
|
|
2
|
+
Keyframe names keep the comps' nb- prefix for 1:1 traceability when porting.
|
|
3
|
+
Conventions: micro-transitions .1–.16s ease; entrances use cubic-bezier(.2,.7,.3,1). */
|
|
4
|
+
|
|
5
|
+
/* ---------------------------------------------------------------- keyframes */
|
|
6
|
+
|
|
7
|
+
/* screen/panel entrance: fade + rise (.24–.3s cubic-bezier(.2,.7,.3,1)) */
|
|
8
|
+
@keyframes nb-fade {
|
|
9
|
+
from { opacity: 0; transform: translateY(6px); }
|
|
10
|
+
to { opacity: 1; transform: none; }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* dropdown/modal pop: fade + translateY(-6px) + scale(.97) (.13–.22s) */
|
|
14
|
+
@keyframes nb-pop {
|
|
15
|
+
from { opacity: 0; transform: translateY(-6px) scale(.97); }
|
|
16
|
+
to { opacity: 1; transform: none; }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* modal entrance: scale .96–.98 + rise (.2–.22s cubic-bezier(.2,.8,.2,1)) */
|
|
20
|
+
@keyframes nb-modal {
|
|
21
|
+
from { opacity: 0; transform: translateY(8px) scale(.97); }
|
|
22
|
+
to { opacity: 1; transform: none; }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* drawer slide-in from inline-end (.22s); RTL consumers flip via --nb-slide-from */
|
|
26
|
+
@keyframes nb-slide {
|
|
27
|
+
from { opacity: 0; transform: translateX(var(--nb-slide-from, 24px)); }
|
|
28
|
+
to { opacity: 1; transform: none; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* toast slide + scale, direction-mirrored pair */
|
|
32
|
+
@keyframes nb-toastin {
|
|
33
|
+
from { opacity: 0; transform: translateX(28px) scale(.96); }
|
|
34
|
+
to { opacity: 1; transform: none; }
|
|
35
|
+
}
|
|
36
|
+
@keyframes nb-toastin-rtl {
|
|
37
|
+
from { opacity: 0; transform: translateX(-28px) scale(.96); }
|
|
38
|
+
to { opacity: 1; transform: none; }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* toast timer bar scaleX(1 -> 0); duration = toast duration */
|
|
42
|
+
@keyframes nb-toastbar {
|
|
43
|
+
from { transform: scaleX(1); }
|
|
44
|
+
to { transform: scaleX(0); }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* skeleton sweep (surface-3 <-> surface-2 gradient), 1.4s linear infinite */
|
|
48
|
+
@keyframes nb-shimmer {
|
|
49
|
+
from { background-position: 200% 0; }
|
|
50
|
+
to { background-position: -200% 0; }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* spinner rotation, .7–.8s linear infinite */
|
|
54
|
+
@keyframes nb-spin {
|
|
55
|
+
to { transform: rotate(360deg); }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* opacity pulse (live indicators) */
|
|
59
|
+
@keyframes nb-pulse {
|
|
60
|
+
0%, 100% { opacity: 1; }
|
|
61
|
+
50% { opacity: .45; }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* bar growth on mount (.85s); vertical bars set transform-origin: bottom */
|
|
65
|
+
@keyframes nb-grow {
|
|
66
|
+
from { transform: scale(var(--nb-grow-x, 1), var(--nb-grow-y, 0)); }
|
|
67
|
+
to { transform: scale(1, 1); }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* gauge stroke-dashoffset sweep (1.1s); element sets --nb-ring-from to its circumference */
|
|
71
|
+
@keyframes nb-ring-anim {
|
|
72
|
+
from { stroke-dashoffset: var(--nb-ring-from, 999); }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* ------------------------------------------------------- interaction classes */
|
|
76
|
+
|
|
77
|
+
/* hover lift: translateY(-3px) + menu shadow + strong border */
|
|
78
|
+
.nb-lift {
|
|
79
|
+
transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
|
|
80
|
+
}
|
|
81
|
+
.nb-lift:hover {
|
|
82
|
+
transform: translateY(-3px);
|
|
83
|
+
box-shadow: var(--shadow-md);
|
|
84
|
+
border-color: var(--border-strong);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* button press: hover brighten, active shrink */
|
|
88
|
+
.nb-press {
|
|
89
|
+
transition: transform .12s ease, filter .12s ease;
|
|
90
|
+
}
|
|
91
|
+
.nb-press:hover { filter: brightness(1.05); }
|
|
92
|
+
.nb-press:active { transform: scale(.97); }
|
|
93
|
+
|
|
94
|
+
/* icon button: hover well, active shrink */
|
|
95
|
+
.nb-ib {
|
|
96
|
+
transition: background-color .13s ease, transform .13s ease;
|
|
97
|
+
}
|
|
98
|
+
.nb-ib:hover { background-color: var(--surface-3); }
|
|
99
|
+
.nb-ib:active { transform: scale(.9); }
|
|
100
|
+
|
|
101
|
+
/* table-row hover */
|
|
102
|
+
.nb-rowh {
|
|
103
|
+
transition: background-color .13s ease;
|
|
104
|
+
}
|
|
105
|
+
.nb-rowh:hover { background-color: var(--surface-2); }
|
|
106
|
+
|
|
107
|
+
/* heat-cell hover accent outline */
|
|
108
|
+
.nb-heat {
|
|
109
|
+
outline: 2px solid transparent;
|
|
110
|
+
outline-offset: -1px;
|
|
111
|
+
transition: outline-color .13s ease;
|
|
112
|
+
}
|
|
113
|
+
.nb-heat:hover { outline-color: var(--accent); }
|
|
114
|
+
|
|
115
|
+
/* hover-revealed actions: opacity 0 -> 1 + 4px slide inside a .nb-hoverwrap */
|
|
116
|
+
.nb-reveal {
|
|
117
|
+
opacity: 0;
|
|
118
|
+
transform: translateX(4px);
|
|
119
|
+
transition: opacity .16s ease, transform .16s ease;
|
|
120
|
+
}
|
|
121
|
+
[dir="rtl"] .nb-reveal { transform: translateX(-4px); }
|
|
122
|
+
.nb-hoverwrap:hover .nb-reveal,
|
|
123
|
+
.nb-hoverwrap:focus-within .nb-reveal {
|
|
124
|
+
opacity: 1;
|
|
125
|
+
transform: none;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* pill transitions + active shrink */
|
|
129
|
+
.nb-pill {
|
|
130
|
+
transition: background-color .13s ease, color .13s ease, border-color .13s ease, transform .13s ease;
|
|
131
|
+
}
|
|
132
|
+
.nb-pill:active { transform: scale(.96); }
|
|
133
|
+
|
|
134
|
+
/* skeleton shimmer surface */
|
|
135
|
+
.nb-skel {
|
|
136
|
+
background: linear-gradient(90deg, var(--surface-3) 25%, var(--surface-2) 50%, var(--surface-3) 75%);
|
|
137
|
+
background-size: 200% 100%;
|
|
138
|
+
animation: nb-shimmer 1.4s linear infinite;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* custom 10px scrollbar, strong-border thumb, padding-box */
|
|
142
|
+
.nb-scroll {
|
|
143
|
+
scrollbar-width: thin;
|
|
144
|
+
scrollbar-color: var(--border-strong) transparent;
|
|
145
|
+
}
|
|
146
|
+
.nb-scroll::-webkit-scrollbar {
|
|
147
|
+
width: 10px;
|
|
148
|
+
height: 10px;
|
|
149
|
+
}
|
|
150
|
+
.nb-scroll::-webkit-scrollbar-thumb {
|
|
151
|
+
background-color: var(--border-strong);
|
|
152
|
+
border: 2px solid transparent;
|
|
153
|
+
border-radius: 999px;
|
|
154
|
+
background-clip: padding-box;
|
|
155
|
+
}
|
|
156
|
+
.nb-scroll::-webkit-scrollbar-track { background: transparent; }
|
|
157
|
+
|
|
158
|
+
/* ------------------------------------------------- prefers-reduced-motion */
|
|
159
|
+
/* Policy: entrances, lifts, grows, ring sweeps and toast slides collapse to instant;
|
|
160
|
+
spinners keep rotating (a frozen spinner reads as a hang); skeletons go static. */
|
|
161
|
+
@media (prefers-reduced-motion: reduce) {
|
|
162
|
+
*, *::before, *::after {
|
|
163
|
+
animation-duration: 0.01ms !important;
|
|
164
|
+
animation-iteration-count: 1 !important;
|
|
165
|
+
transition-duration: 0.01ms !important;
|
|
166
|
+
scroll-behavior: auto !important;
|
|
167
|
+
}
|
|
168
|
+
/* Loading affordances stay perceivable: spinner keeps rotating (slower), skeleton goes static */
|
|
169
|
+
.nb-spin, [class*="animate-nb-spin"] {
|
|
170
|
+
animation-duration: 1.4s !important;
|
|
171
|
+
animation-iteration-count: infinite !important;
|
|
172
|
+
}
|
|
173
|
+
.nb-skel { animation: none !important; background: var(--surface-3) !important; }
|
|
174
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-hydration script — flash prevention. See workplan/02-design-system.md §4.3.
|
|
3
|
+
*
|
|
4
|
+
* Inlined (as a string) as the FIRST <script> in <head> of apps/dashboard/index.html,
|
|
5
|
+
* the Electron renderer HTML and Storybook's preview-head.html, before any stylesheet
|
|
6
|
+
* paints content. It reads the localStorage pre-paint cache and stamps data-theme /
|
|
7
|
+
* data-accent / data-density / dir / lang on <html>, resolving theme "system" via
|
|
8
|
+
* prefers-color-scheme. On any storage failure (private mode) it leaves the baseline paint.
|
|
9
|
+
*
|
|
10
|
+
* The storage keys and fallbacks are intentionally written out as literals so the string
|
|
11
|
+
* is self-contained and inline-able; test/pre-hydration.test.ts asserts they stay in
|
|
12
|
+
* sync with STORAGE_KEYS / DEFAULT_PREFS from ./index.js.
|
|
13
|
+
*/
|
|
14
|
+
export const preHydrationScript =
|
|
15
|
+
'(function(){try{var d=document.documentElement,s=localStorage;' +
|
|
16
|
+
'var t=s.getItem("adminium-theme")||"system";' +
|
|
17
|
+
'if(t==="system")t=matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";' +
|
|
18
|
+
'd.setAttribute("data-theme",t);' +
|
|
19
|
+
'd.setAttribute("data-accent",s.getItem("adminium-accent")||"indigo");' +
|
|
20
|
+
'd.setAttribute("data-density",s.getItem("adminium-density")||"comfortable");' +
|
|
21
|
+
'var r=s.getItem("adminium-dir");' +
|
|
22
|
+
'if(r==="rtl")d.setAttribute("dir","rtl");' +
|
|
23
|
+
'var l=s.getItem("adminium-locale");' +
|
|
24
|
+
'if(l)d.setAttribute("lang",l.replace("_","-"))}catch(e){}})();';
|
package/src/tailwind.css
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/* @adminium/tokens — Tailwind v4 theme mapping. See workplan/02-design-system.md §3.1.
|
|
2
|
+
Import order in each app's entry CSS:
|
|
3
|
+
@import "tailwindcss";
|
|
4
|
+
@import "@adminium/tokens/index.css";
|
|
5
|
+
@import "@adminium/tokens/tailwind.css"; */
|
|
6
|
+
|
|
7
|
+
/* Dark utilities target the attribute, not media queries */
|
|
8
|
+
@custom-variant dark ([data-theme="dark"] &);
|
|
9
|
+
@custom-variant compact ([data-density="compact"] &);
|
|
10
|
+
|
|
11
|
+
@theme inline {
|
|
12
|
+
/* colors — `inline` keeps var() references live so runtime theme flips work */
|
|
13
|
+
--color-bg: var(--bg);
|
|
14
|
+
--color-surface: var(--surface);
|
|
15
|
+
--color-surface-2: var(--surface-2);
|
|
16
|
+
--color-surface-3: var(--surface-3);
|
|
17
|
+
--color-border: var(--border);
|
|
18
|
+
--color-border-strong: var(--border-strong);
|
|
19
|
+
--color-fg: var(--fg);
|
|
20
|
+
--color-fg-muted: var(--fg-muted);
|
|
21
|
+
--color-fg-subtle: var(--fg-subtle);
|
|
22
|
+
--color-accent: var(--accent);
|
|
23
|
+
--color-accent-fg: var(--accent-fg);
|
|
24
|
+
--color-accent-soft: var(--accent-soft);
|
|
25
|
+
--color-accent-hover: var(--accent-hover);
|
|
26
|
+
--color-accent-border: var(--accent-border);
|
|
27
|
+
--color-pos: var(--pos); --color-pos-soft: var(--pos-soft);
|
|
28
|
+
--color-warn: var(--warn); --color-warn-soft: var(--warn-soft);
|
|
29
|
+
--color-danger: var(--danger); --color-danger-soft: var(--danger-soft);
|
|
30
|
+
--color-info: var(--info); --color-info-soft: var(--info-soft);
|
|
31
|
+
--color-viz-1: var(--viz-1); --color-viz-2: var(--viz-2); --color-viz-3: var(--viz-3);
|
|
32
|
+
--color-viz-4: var(--viz-4); --color-viz-5: var(--viz-5); --color-viz-6: var(--viz-6);
|
|
33
|
+
--color-viz-7: var(--viz-7); --color-viz-8: var(--viz-8);
|
|
34
|
+
|
|
35
|
+
/* elevation */
|
|
36
|
+
--shadow-card: var(--shadow);
|
|
37
|
+
--shadow-menu: var(--shadow-md);
|
|
38
|
+
--shadow-modal: var(--shadow-lg);
|
|
39
|
+
--shadow-glow: var(--accent-glow);
|
|
40
|
+
|
|
41
|
+
/* radii → rounded-sm/md/lg/xl */
|
|
42
|
+
--radius-sm: 6px; --radius-md: 10px; --radius-lg: 14px; --radius-xl: 20px;
|
|
43
|
+
|
|
44
|
+
/* fonts */
|
|
45
|
+
--font-sans: "Manrope", system-ui, sans-serif;
|
|
46
|
+
--font-mono: "JetBrains Mono", ui-monospace, monospace;
|
|
47
|
+
--font-arabic: "IBM Plex Sans Arabic", "Manrope", system-ui, sans-serif;
|
|
48
|
+
|
|
49
|
+
/* type scale (§1.4) → text-display, text-title, … */
|
|
50
|
+
--text-display: 30px; --text-display--font-weight: 800; --text-display--letter-spacing: -0.03em;
|
|
51
|
+
--text-title: 20px; --text-title--font-weight: 800; --text-title--letter-spacing: -0.02em;
|
|
52
|
+
--text-modal: 16.5px; --text-modal--font-weight: 800;
|
|
53
|
+
--text-section: 14.5px; --text-section--font-weight: 700; --text-section--letter-spacing: -0.01em;
|
|
54
|
+
--text-body: 13px; --text-body--line-height: 1.5;
|
|
55
|
+
--text-body-sm: 12.5px; --text-body-sm--line-height: 1.5;
|
|
56
|
+
--text-caption: 11.5px;
|
|
57
|
+
--text-micro: 10.5px; --text-micro--font-weight: 700; --text-micro--letter-spacing: 0.05em;
|
|
58
|
+
|
|
59
|
+
/* layout */
|
|
60
|
+
--spacing-sidebar: 256px;
|
|
61
|
+
--container-form: 640px; --container-narrow: 720px; --container-page: 1080px;
|
|
62
|
+
--container-marketing: 1160px; --container-wide: 1200px; --container-max: 1360px;
|
|
63
|
+
}
|
package/src/tokens.css
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/* @adminium/tokens — core semantic tokens. Values are canonical; see workplan/02-design-system.md §1.1.
|
|
2
|
+
The dark palette is hand-tuned, never derived from light values. */
|
|
3
|
+
:root {
|
|
4
|
+
color-scheme: light;
|
|
5
|
+
--bg: #f6f6f8;
|
|
6
|
+
--surface: #ffffff;
|
|
7
|
+
--surface-2: #fafafa;
|
|
8
|
+
--surface-3: #f1f1f4;
|
|
9
|
+
--border: #ececef;
|
|
10
|
+
--border-strong: #e2e2e8;
|
|
11
|
+
--fg: #191920;
|
|
12
|
+
--fg-muted: #6b6b76;
|
|
13
|
+
--fg-subtle: #9a9aa5;
|
|
14
|
+
--accent-fg: #ffffff;
|
|
15
|
+
--pos: #12805c;
|
|
16
|
+
--pos-soft: #e6f5ee;
|
|
17
|
+
--warn: #b25e09;
|
|
18
|
+
--warn-soft: #fbf0e2;
|
|
19
|
+
--danger: #d1293d;
|
|
20
|
+
--danger-soft: #fdecec;
|
|
21
|
+
--info: #2563eb;
|
|
22
|
+
--info-soft: #e7edfd;
|
|
23
|
+
--shadow: 0 1px 2px rgba(20,20,35,.04), 0 1px 3px rgba(20,20,35,.05);
|
|
24
|
+
--shadow-md: 0 4px 14px rgba(20,20,35,.09);
|
|
25
|
+
--shadow-lg: 0 12px 34px rgba(20,20,35,.13);
|
|
26
|
+
--scrim: rgba(10,10,15,.5);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
[data-theme="dark"] {
|
|
30
|
+
color-scheme: dark;
|
|
31
|
+
--bg: #0a0a0d;
|
|
32
|
+
--surface: #141419;
|
|
33
|
+
--surface-2: #1a1a20;
|
|
34
|
+
--surface-3: #24242c;
|
|
35
|
+
--border: rgba(255,255,255,.07);
|
|
36
|
+
--border-strong: rgba(255,255,255,.13);
|
|
37
|
+
--fg: #f4f4f6;
|
|
38
|
+
--fg-muted: #9a9aa6;
|
|
39
|
+
--fg-subtle: #6a6a76;
|
|
40
|
+
--pos: #3ecf8e;
|
|
41
|
+
--pos-soft: rgba(62,207,142,.14);
|
|
42
|
+
--warn: #e0a458;
|
|
43
|
+
--warn-soft: rgba(224,164,88,.14);
|
|
44
|
+
--danger: #ff6b6b;
|
|
45
|
+
--danger-soft: rgba(255,107,107,.14);
|
|
46
|
+
--info: #6ea8ff;
|
|
47
|
+
--info-soft: rgba(110,168,255,.14);
|
|
48
|
+
--shadow: 0 1px 2px rgba(0,0,0,.4);
|
|
49
|
+
--shadow-md: 0 6px 20px rgba(0,0,0,.5);
|
|
50
|
+
--shadow-lg: 0 16px 40px rgba(0,0,0,.6);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
::selection {
|
|
54
|
+
background: var(--accent-selection);
|
|
55
|
+
}
|
package/src/viz.css
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* @adminium/tokens — data-viz palette. See workplan/02-design-system.md §1.3.
|
|
2
|
+
Fixed 8-color categorical palette (order canonical; series i gets --viz-((i mod 8)+1)),
|
|
3
|
+
sequential accent ramp for heatmaps/choropleth intensity, and chart area/ribbon fill.
|
|
4
|
+
@adminium/charts consumes only these vars — no hex literals in chart code. */
|
|
5
|
+
:root {
|
|
6
|
+
--viz-1: #4f46e5;
|
|
7
|
+
--viz-2: #0ea5e9;
|
|
8
|
+
--viz-3: #14b8a6;
|
|
9
|
+
--viz-4: #f59e0b;
|
|
10
|
+
--viz-5: #ef4444;
|
|
11
|
+
--viz-6: #8b5cf6;
|
|
12
|
+
--viz-7: #ec4899;
|
|
13
|
+
--viz-8: #22c55e;
|
|
14
|
+
|
|
15
|
+
--viz-ramp-1: color-mix(in srgb, var(--accent) 12%, transparent);
|
|
16
|
+
--viz-ramp-2: color-mix(in srgb, var(--accent) 28%, transparent);
|
|
17
|
+
--viz-ramp-3: color-mix(in srgb, var(--accent) 45%, transparent);
|
|
18
|
+
--viz-ramp-4: color-mix(in srgb, var(--accent) 65%, transparent);
|
|
19
|
+
--viz-ramp-5: color-mix(in srgb, var(--accent) 85%, transparent);
|
|
20
|
+
--viz-ramp-6: color-mix(in srgb, var(--accent) 100%, transparent);
|
|
21
|
+
|
|
22
|
+
--accent-area: color-mix(in srgb, var(--accent) 22%, transparent);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
[data-theme="dark"] {
|
|
26
|
+
--accent-area: color-mix(in srgb, var(--accent) 34%, transparent);
|
|
27
|
+
}
|