@attrus-ds/core 0.2.0 → 1.0.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/LICENSE +27 -27
- package/dist/assets/flags/Brazil-rounded.svg +15 -15
- package/dist/assets/flags/Brazil-square.svg +16 -16
- package/dist/assets/flags/Chile-rounded.svg +10 -10
- package/dist/assets/flags/Chile-square.svg +10 -10
- package/dist/assets/flags/Colombia-rounded.svg +9 -9
- package/dist/assets/flags/Colombia-square.svg +9 -9
- package/dist/assets/flags/EUA-rounded.svg +10 -10
- package/dist/assets/flags/EUA-square.svg +10 -10
- package/dist/assets/flags/EUR-rounded.svg +8 -8
- package/dist/assets/flags/EUR-square.svg +8 -8
- package/dist/assets/flags/Mexico-rounded.svg +18 -18
- package/dist/assets/flags/Mexico-square.svg +18 -18
- package/dist/assets/icon-attrus-dark.svg +2 -2
- package/dist/assets/icon-attrus-light.svg +2 -2
- package/dist/assets/logo-attrus-dark.svg +7 -7
- package/dist/assets/logo-attrus-light.svg +7 -7
- package/dist/css/components/buttons.css +301 -301
- package/dist/css/components/callout.css +195 -195
- package/dist/css/components/cards.css +272 -272
- package/dist/css/components/combobox.css +319 -319
- package/dist/css/components/empty-states.css +61 -61
- package/dist/css/components/inputs.css +975 -975
- package/dist/css/components/number-input.css +138 -138
- package/dist/css/components/overlays.css +374 -374
- package/dist/css/components/primitives.css +314 -314
- package/dist/css/components/sidebar.css +179 -179
- package/dist/css/components/smart-search.css +91 -91
- package/dist/css/components/status-pills.css +207 -207
- package/dist/css/components/stepper.css +309 -309
- package/dist/css/components/table.css +602 -602
- package/dist/css/components/tabs.css +319 -319
- package/dist/css/components/toast.css +243 -243
- package/dist/css/components/tooltip.css +231 -231
- package/dist/css/components/topbar.css +148 -148
- package/dist/css/tokens.css +713 -666
- package/dist/react/AppSidebar/AppSidebar.d.ts +50 -50
- package/dist/react/AppSidebar/AppSidebar.tsx +197 -197
- package/dist/react/AppTopbar/AppTopbar.d.ts +58 -58
- package/dist/react/AppTopbar/AppTopbar.tsx +203 -203
- package/dist/react/Atoms/Atoms.d.ts +149 -149
- package/dist/react/Atoms/Atoms.tsx +407 -407
- package/dist/react/Button/Button.d.ts +25 -25
- package/dist/react/Button/Button.tsx +83 -83
- package/dist/react/Callout/Callout.d.ts +29 -29
- package/dist/react/Callout/Callout.tsx +98 -98
- package/dist/react/Card/Card.d.ts +38 -38
- package/dist/react/Card/Card.tsx +93 -93
- package/dist/react/Combobox/Combobox.d.ts +52 -52
- package/dist/react/Combobox/Combobox.tsx +254 -254
- package/dist/react/DataTable/DataTable.d.ts +81 -81
- package/dist/react/DataTable/DataTable.tsx +308 -308
- package/dist/react/Drawer/Drawer.d.ts +35 -35
- package/dist/react/Drawer/Drawer.tsx +226 -226
- package/dist/react/Input/Input.d.ts +155 -155
- package/dist/react/Input/Input.tsx +478 -478
- package/dist/react/Modal/Modal.d.ts +27 -27
- package/dist/react/Modal/Modal.tsx +173 -173
- package/dist/react/NumberInput/NumberInput.d.ts +25 -25
- package/dist/react/NumberInput/NumberInput.tsx +117 -117
- package/dist/react/Pill/Pill.d.ts +31 -31
- package/dist/react/Pill/Pill.tsx +104 -104
- package/dist/react/SearchPill/SearchPill.d.ts +14 -14
- package/dist/react/SearchPill/SearchPill.tsx +40 -40
- package/dist/react/SmartSearch/SmartSearch.d.ts +65 -65
- package/dist/react/SmartSearch/SmartSearch.tsx +271 -271
- package/dist/react/Stepper/Stepper.d.ts +25 -25
- package/dist/react/Stepper/Stepper.tsx +94 -94
- package/dist/react/Tabs/Tabs.d.ts +32 -32
- package/dist/react/Tabs/Tabs.tsx +147 -147
- package/dist/react/Toast/Toast.d.ts +30 -30
- package/dist/react/Toast/Toast.tsx +94 -94
- package/dist/react/Tooltip/Tooltip.d.ts +23 -23
- package/dist/react/Tooltip/Tooltip.tsx +80 -80
- package/dist/react/ZeroState/ZeroState.d.ts +17 -17
- package/dist/react/ZeroState/ZeroState.tsx +45 -45
- package/dist/react/index.ts +35 -35
- package/dist/tokens/attrus-tokens.flat.json +1234 -1234
- package/dist/tokens/attrus-tokens.json +1089 -1089
- package/package.json +66 -64
package/dist/css/tokens.css
CHANGED
|
@@ -1,695 +1,742 @@
|
|
|
1
1
|
/* @attrus/cabiros — design tokens + type classes (concatenated).
|
|
2
2
|
Generated by scripts/build.mjs from src/tokens/ and src/typography/. */
|
|
3
3
|
|
|
4
|
-
/* ============================================================
|
|
5
|
-
ATTRUS / Cabiros — BASE PALETTE (raw color tokens)
|
|
6
|
-
The primitive layer. Theme-agnostic. Referenced only by the
|
|
7
|
-
semantic layer (color-semantic.css) and effect layers — never
|
|
8
|
-
consumed directly by components.
|
|
9
|
-
============================================================ */
|
|
10
|
-
|
|
11
|
-
:root {
|
|
12
|
-
/* --- Brand (from manual: Lato + 4 HEX stops) --- */
|
|
13
|
-
--brand-attrus-ink: #0F0F1A; /* almost-black, blue-tinted */
|
|
14
|
-
--brand-attrus-navy: #002142; /* deep navy */
|
|
15
|
-
--brand-attrus-blue: #003399; /* PRIMARY brand blue */
|
|
16
|
-
--brand-attrus-sky: #3399FF; /* bright accent / highlight */
|
|
17
|
-
--brand-attrus-logo-ink: #000033; /* per logo SVG fills */
|
|
18
|
-
|
|
19
|
-
/* --- Neutrals (cool, with a subtle bluish tint — never pure) --- */
|
|
20
|
-
/* Pure achromatic primitives — referenced by transparency tokens */
|
|
21
|
-
--color-pure-white: #FFFFFF;
|
|
22
|
-
--color-pure-black: #000000;
|
|
23
|
-
--color-shadow-tint: var(--color-neutral-900); /* default — blue-tinted ink, aligned to neutral scale */
|
|
24
|
-
--shadow-tint-success-color: var(--color-success-900); /* green-tinted ink */
|
|
25
|
-
--shadow-tint-warning-color: var(--color-warning-900); /* amber-tinted ink */
|
|
26
|
-
--shadow-tint-danger-color: var(--color-danger-900); /* wine-tinted ink */
|
|
27
|
-
--shadow-tint-info-color: var(--color-info-900); /* steel-blue-tinted ink */
|
|
28
|
-
|
|
29
|
-
--color-neutral-0: var(--color-pure-white);
|
|
30
|
-
--color-neutral-25: #FAFBFD; /* app canvas bg */
|
|
31
|
-
--color-neutral-50: #F4F6FA; /* rows, subdued surfaces */
|
|
32
|
-
--color-neutral-100: #EDF0F5; /* hover, very soft chips */
|
|
33
|
-
--color-neutral-150: #E3E8F0; /* dividers, borders */
|
|
34
|
-
--color-neutral-200: #D6DCE7; /* stronger borders */
|
|
35
|
-
--color-neutral-300: #B8C1D1; /* placeholder */
|
|
36
|
-
--color-neutral-400: #8A94A8; /* muted text */
|
|
37
|
-
--color-neutral-500: #5E6A82; /* secondary text */
|
|
38
|
-
--color-neutral-600: #3F4A61; /* strong secondary */
|
|
39
|
-
--color-neutral-700: #27304A; /* headings on light */
|
|
40
|
-
--color-neutral-800: #141B2E; /* near-surface dark */
|
|
41
|
-
--color-neutral-900: #0A0F1F; /* inverse surface (never pure black) */
|
|
42
|
-
--color-neutral-950: #05081A; /* deepest inverse */
|
|
43
|
-
|
|
44
|
-
/* --- Inverse "ink" tones (variants of neutral-900/-950, used by inverse layer) --- */
|
|
45
|
-
--color-ink-base: #0B1230; /* near-black navy */
|
|
46
|
-
--color-ink-raised: #111A3D; /* card on inverse */
|
|
47
|
-
--color-ink-deep: #0A1128; /* deeper than base — wells, alt rows */
|
|
48
|
-
--color-ink-hover: #15214A; /* hover state on inverse */
|
|
49
|
-
|
|
50
|
-
/* --- Brand primary · Navy (institutional — logo, headings, primary surfaces)
|
|
51
|
-
10-stop scale anchored at -500: #002142 (ATTRUS Navy from brand book).
|
|
52
|
-
Interpolated in OKLCH from anchor for uniform perceptual distance.
|
|
53
|
-
Dominant brand colour — 40% of usage per brand book. */
|
|
54
|
-
--color-brand-primary-50: #E5EBF2;
|
|
55
|
-
--color-brand-primary-100: #C2CDDB;
|
|
56
|
-
--color-brand-primary-200: #8E9FB8;
|
|
57
|
-
--color-brand-primary-300: #5F7596;
|
|
58
|
-
--color-brand-primary-400: #2F4F75;
|
|
59
|
-
--color-brand-primary-500: #002142; /* ★ ATTRUS Navy — brand primary */
|
|
60
|
-
--color-brand-primary-600: #001D3A;
|
|
61
|
-
--color-brand-primary-700: #001830;
|
|
62
|
-
--color-brand-primary-800: #001226;
|
|
63
|
-
--color-brand-primary-900: #000C1A;
|
|
64
|
-
|
|
65
|
-
/* --- Brand secondary · Royal (support — highlights, secondary blocks)
|
|
66
|
-
10-stop scale anchored at -500: #003399 (ATTRUS Royal from brand book).
|
|
67
|
-
Used for accent surfaces with more presence than Sky but less than Navy.
|
|
68
|
-
10% of brand usage. */
|
|
69
|
-
--color-brand-secondary-50: #EAF1FF;
|
|
70
|
-
--color-brand-secondary-100: #D1DEFF;
|
|
71
|
-
--color-brand-secondary-200: #A3BEFF;
|
|
72
|
-
--color-brand-secondary-300: #6B95FB;
|
|
73
|
-
--color-brand-secondary-400: #3F6DEF;
|
|
74
|
-
--color-brand-secondary-500: #003399; /* brand */
|
|
75
|
-
--color-brand-secondary-600: #002A80;
|
|
76
|
-
--color-brand-secondary-700: #002166;
|
|
77
|
-
--color-brand-secondary-800: #001A4D;
|
|
78
|
-
--color-brand-secondary-900: #001133;
|
|
79
|
-
|
|
80
|
-
/* --- Brand accent · Sky (action — CTAs, links, highlights)
|
|
81
|
-
10-stop scale anchored at -500: #3399FF (ATTRUS Sky from brand book).
|
|
82
|
-
Used for primary actions and call-outs only — 3% of brand usage.
|
|
83
|
-
Stops 50/200/400/600/800/900 interpolated in OKLCH for uniform perceptual distance.
|
|
84
|
-
Dark stops (700-900) used as inverse surfaces in dark mode;
|
|
85
|
-
light stops (50-200) for foreground text on those surfaces. */
|
|
86
|
-
--color-brand-accent-50: #ECF5FF;
|
|
87
|
-
--color-brand-accent-100: #D9ECFF;
|
|
88
|
-
--color-brand-accent-200: #ADD2FF;
|
|
89
|
-
--color-brand-accent-300: #7AB8FF;
|
|
90
|
-
--color-brand-accent-400: #549EFF;
|
|
91
|
-
--color-brand-accent-500: #3399FF; /* accent */
|
|
92
|
-
--color-brand-accent-600: #2880DD;
|
|
93
|
-
--color-brand-accent-700: #1E6DC4;
|
|
94
|
-
--color-brand-accent-800: #155198;
|
|
95
|
-
--color-brand-accent-900: #0E3B70;
|
|
96
|
-
|
|
97
|
-
/* --- Semantic feedback (subdued, sober) — perceptually calibrated 10-stop scales (OKLCH) ---
|
|
98
|
-
Anchors at 50/100/500/700/900 are immutable (preserved from the original 5-stop palette).
|
|
99
|
-
Stops 200/300/400/600/800 are interpolated in OKLCH for uniform perceptual distance.
|
|
100
|
-
info-900 is derived from the average L/C trajectory of the other three families' 700→900. */
|
|
101
|
-
--color-success-50: #E8F5EE;
|
|
102
|
-
--color-success-100: #CDEBD9;
|
|
103
|
-
--color-success-200: #9CCEAF;
|
|
104
|
-
--color-success-300: #74B68C;
|
|
105
|
-
--color-success-400: #499D69;
|
|
106
|
-
--color-success-500: #1F8A4C;
|
|
107
|
-
--color-success-600: #1A7A43;
|
|
108
|
-
--color-success-700: #136236;
|
|
109
|
-
--color-success-800: #0E4F2B;
|
|
110
|
-
--color-success-900: #0A3D21;
|
|
111
|
-
|
|
112
|
-
--color-warning-50: #FDF5E3;
|
|
113
|
-
--color-warning-100: #FAE8BE;
|
|
114
|
-
--color-warning-200: #E4C790;
|
|
115
|
-
--color-warning-300: #D2AC69;
|
|
116
|
-
--color-warning-400: #C19040;
|
|
117
|
-
--color-warning-500: #B47A12;
|
|
118
|
-
--color-warning-600: #A16B0F;
|
|
119
|
-
--color-warning-700: #84560A;
|
|
120
|
-
--color-warning-800: #694307;
|
|
121
|
-
--color-warning-900: #4F3105;
|
|
122
|
-
|
|
123
|
-
--color-danger-50: #FCEBEA;
|
|
124
|
-
--color-danger-100: #F7CFCD;
|
|
125
|
-
--color-danger-200: #EBA4A0;
|
|
126
|
-
--color-danger-300: #DE807A;
|
|
127
|
-
--color-danger-400: #CF5B54;
|
|
128
|
-
--color-danger-500: #C23934;
|
|
129
|
-
--color-danger-600: #AB312D;
|
|
130
|
-
--color-danger-700: #8A2622;
|
|
131
|
-
--color-danger-800: #6C1D1A;
|
|
132
|
-
--color-danger-900: #4F1512;
|
|
133
|
-
|
|
134
|
-
--color-info-50: #E6F0FB;
|
|
135
|
-
--color-info-100: #C5DCF4;
|
|
136
|
-
--color-info-200: #93BBE8;
|
|
137
|
-
--color-info-300: #6B9FDD;
|
|
138
|
-
--color-info-400: #4383D1;
|
|
139
|
-
--color-info-500: #1F6BC7;
|
|
140
|
-
--color-info-600: #1A5EAF;
|
|
141
|
-
--color-info-700: #144B8C;
|
|
142
|
-
--color-info-800: #0D3A6E;
|
|
143
|
-
--color-info-900: #072951;
|
|
4
|
+
/* ============================================================
|
|
5
|
+
ATTRUS / Cabiros — BASE PALETTE (raw color tokens)
|
|
6
|
+
The primitive layer. Theme-agnostic. Referenced only by the
|
|
7
|
+
semantic layer (color-semantic.css) and effect layers — never
|
|
8
|
+
consumed directly by components.
|
|
9
|
+
============================================================ */
|
|
10
|
+
|
|
11
|
+
:root {
|
|
12
|
+
/* --- Brand (from manual: Lato + 4 HEX stops) --- */
|
|
13
|
+
--brand-attrus-ink: #0F0F1A; /* almost-black, blue-tinted */
|
|
14
|
+
--brand-attrus-navy: #002142; /* deep navy */
|
|
15
|
+
--brand-attrus-blue: #003399; /* PRIMARY brand blue */
|
|
16
|
+
--brand-attrus-sky: #3399FF; /* bright accent / highlight */
|
|
17
|
+
--brand-attrus-logo-ink: #000033; /* per logo SVG fills */
|
|
18
|
+
|
|
19
|
+
/* --- Neutrals (cool, with a subtle bluish tint — never pure) --- */
|
|
20
|
+
/* Pure achromatic primitives — referenced by transparency tokens */
|
|
21
|
+
--color-pure-white: #FFFFFF;
|
|
22
|
+
--color-pure-black: #000000;
|
|
23
|
+
--color-shadow-tint: var(--color-neutral-900); /* default — blue-tinted ink, aligned to neutral scale */
|
|
24
|
+
--shadow-tint-success-color: var(--color-success-900); /* green-tinted ink */
|
|
25
|
+
--shadow-tint-warning-color: var(--color-warning-900); /* amber-tinted ink */
|
|
26
|
+
--shadow-tint-danger-color: var(--color-danger-900); /* wine-tinted ink */
|
|
27
|
+
--shadow-tint-info-color: var(--color-info-900); /* steel-blue-tinted ink */
|
|
28
|
+
|
|
29
|
+
--color-neutral-0: var(--color-pure-white);
|
|
30
|
+
--color-neutral-25: #FAFBFD; /* app canvas bg */
|
|
31
|
+
--color-neutral-50: #F4F6FA; /* rows, subdued surfaces */
|
|
32
|
+
--color-neutral-100: #EDF0F5; /* hover, very soft chips */
|
|
33
|
+
--color-neutral-150: #E3E8F0; /* dividers, borders */
|
|
34
|
+
--color-neutral-200: #D6DCE7; /* stronger borders */
|
|
35
|
+
--color-neutral-300: #B8C1D1; /* placeholder */
|
|
36
|
+
--color-neutral-400: #8A94A8; /* muted text */
|
|
37
|
+
--color-neutral-500: #5E6A82; /* secondary text */
|
|
38
|
+
--color-neutral-600: #3F4A61; /* strong secondary */
|
|
39
|
+
--color-neutral-700: #27304A; /* headings on light */
|
|
40
|
+
--color-neutral-800: #141B2E; /* near-surface dark */
|
|
41
|
+
--color-neutral-900: #0A0F1F; /* inverse surface (never pure black) */
|
|
42
|
+
--color-neutral-950: #05081A; /* deepest inverse */
|
|
43
|
+
|
|
44
|
+
/* --- Inverse "ink" tones (variants of neutral-900/-950, used by inverse layer) --- */
|
|
45
|
+
--color-ink-base: #0B1230; /* near-black navy */
|
|
46
|
+
--color-ink-raised: #111A3D; /* card on inverse */
|
|
47
|
+
--color-ink-deep: #0A1128; /* deeper than base — wells, alt rows */
|
|
48
|
+
--color-ink-hover: #15214A; /* hover state on inverse */
|
|
49
|
+
|
|
50
|
+
/* --- Brand primary · Navy (institutional — logo, headings, primary surfaces)
|
|
51
|
+
10-stop scale anchored at -500: #002142 (ATTRUS Navy from brand book).
|
|
52
|
+
Interpolated in OKLCH from anchor for uniform perceptual distance.
|
|
53
|
+
Dominant brand colour — 40% of usage per brand book. */
|
|
54
|
+
--color-brand-primary-50: #E5EBF2;
|
|
55
|
+
--color-brand-primary-100: #C2CDDB;
|
|
56
|
+
--color-brand-primary-200: #8E9FB8;
|
|
57
|
+
--color-brand-primary-300: #5F7596;
|
|
58
|
+
--color-brand-primary-400: #2F4F75;
|
|
59
|
+
--color-brand-primary-500: #002142; /* ★ ATTRUS Navy — brand primary */
|
|
60
|
+
--color-brand-primary-600: #001D3A;
|
|
61
|
+
--color-brand-primary-700: #001830;
|
|
62
|
+
--color-brand-primary-800: #001226;
|
|
63
|
+
--color-brand-primary-900: #000C1A;
|
|
64
|
+
|
|
65
|
+
/* --- Brand secondary · Royal (support — highlights, secondary blocks)
|
|
66
|
+
10-stop scale anchored at -500: #003399 (ATTRUS Royal from brand book).
|
|
67
|
+
Used for accent surfaces with more presence than Sky but less than Navy.
|
|
68
|
+
10% of brand usage. */
|
|
69
|
+
--color-brand-secondary-50: #EAF1FF;
|
|
70
|
+
--color-brand-secondary-100: #D1DEFF;
|
|
71
|
+
--color-brand-secondary-200: #A3BEFF;
|
|
72
|
+
--color-brand-secondary-300: #6B95FB;
|
|
73
|
+
--color-brand-secondary-400: #3F6DEF;
|
|
74
|
+
--color-brand-secondary-500: #003399; /* brand */
|
|
75
|
+
--color-brand-secondary-600: #002A80;
|
|
76
|
+
--color-brand-secondary-700: #002166;
|
|
77
|
+
--color-brand-secondary-800: #001A4D;
|
|
78
|
+
--color-brand-secondary-900: #001133;
|
|
79
|
+
|
|
80
|
+
/* --- Brand accent · Sky (action — CTAs, links, highlights)
|
|
81
|
+
10-stop scale anchored at -500: #3399FF (ATTRUS Sky from brand book).
|
|
82
|
+
Used for primary actions and call-outs only — 3% of brand usage.
|
|
83
|
+
Stops 50/200/400/600/800/900 interpolated in OKLCH for uniform perceptual distance.
|
|
84
|
+
Dark stops (700-900) used as inverse surfaces in dark mode;
|
|
85
|
+
light stops (50-200) for foreground text on those surfaces. */
|
|
86
|
+
--color-brand-accent-50: #ECF5FF;
|
|
87
|
+
--color-brand-accent-100: #D9ECFF;
|
|
88
|
+
--color-brand-accent-200: #ADD2FF;
|
|
89
|
+
--color-brand-accent-300: #7AB8FF;
|
|
90
|
+
--color-brand-accent-400: #549EFF;
|
|
91
|
+
--color-brand-accent-500: #3399FF; /* accent */
|
|
92
|
+
--color-brand-accent-600: #2880DD;
|
|
93
|
+
--color-brand-accent-700: #1E6DC4;
|
|
94
|
+
--color-brand-accent-800: #155198;
|
|
95
|
+
--color-brand-accent-900: #0E3B70;
|
|
96
|
+
|
|
97
|
+
/* --- Semantic feedback (subdued, sober) — perceptually calibrated 10-stop scales (OKLCH) ---
|
|
98
|
+
Anchors at 50/100/500/700/900 are immutable (preserved from the original 5-stop palette).
|
|
99
|
+
Stops 200/300/400/600/800 are interpolated in OKLCH for uniform perceptual distance.
|
|
100
|
+
info-900 is derived from the average L/C trajectory of the other three families' 700→900. */
|
|
101
|
+
--color-success-50: #E8F5EE;
|
|
102
|
+
--color-success-100: #CDEBD9;
|
|
103
|
+
--color-success-200: #9CCEAF;
|
|
104
|
+
--color-success-300: #74B68C;
|
|
105
|
+
--color-success-400: #499D69;
|
|
106
|
+
--color-success-500: #1F8A4C;
|
|
107
|
+
--color-success-600: #1A7A43;
|
|
108
|
+
--color-success-700: #136236;
|
|
109
|
+
--color-success-800: #0E4F2B;
|
|
110
|
+
--color-success-900: #0A3D21;
|
|
111
|
+
|
|
112
|
+
--color-warning-50: #FDF5E3;
|
|
113
|
+
--color-warning-100: #FAE8BE;
|
|
114
|
+
--color-warning-200: #E4C790;
|
|
115
|
+
--color-warning-300: #D2AC69;
|
|
116
|
+
--color-warning-400: #C19040;
|
|
117
|
+
--color-warning-500: #B47A12;
|
|
118
|
+
--color-warning-600: #A16B0F;
|
|
119
|
+
--color-warning-700: #84560A;
|
|
120
|
+
--color-warning-800: #694307;
|
|
121
|
+
--color-warning-900: #4F3105;
|
|
122
|
+
|
|
123
|
+
--color-danger-50: #FCEBEA;
|
|
124
|
+
--color-danger-100: #F7CFCD;
|
|
125
|
+
--color-danger-200: #EBA4A0;
|
|
126
|
+
--color-danger-300: #DE807A;
|
|
127
|
+
--color-danger-400: #CF5B54;
|
|
128
|
+
--color-danger-500: #C23934;
|
|
129
|
+
--color-danger-600: #AB312D;
|
|
130
|
+
--color-danger-700: #8A2622;
|
|
131
|
+
--color-danger-800: #6C1D1A;
|
|
132
|
+
--color-danger-900: #4F1512;
|
|
133
|
+
|
|
134
|
+
--color-info-50: #E6F0FB;
|
|
135
|
+
--color-info-100: #C5DCF4;
|
|
136
|
+
--color-info-200: #93BBE8;
|
|
137
|
+
--color-info-300: #6B9FDD;
|
|
138
|
+
--color-info-400: #4383D1;
|
|
139
|
+
--color-info-500: #1F6BC7;
|
|
140
|
+
--color-info-600: #1A5EAF;
|
|
141
|
+
--color-info-700: #144B8C;
|
|
142
|
+
--color-info-800: #0D3A6E;
|
|
143
|
+
--color-info-900: #072951;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
/* ============================================================
|
|
147
|
-
ATTRUS / Cabiros — SEMANTIC COLOR TOKENS
|
|
148
|
-
Reference the base palette (palette.css). This is the layer
|
|
149
|
-
components consume.
|
|
150
|
-
Roles: default | secondary | muted | accent | placeholder
|
|
151
|
-
Contexts: fg (text/icon), bg (surface), br (border)
|
|
152
|
-
============================================================ */
|
|
153
|
-
|
|
154
|
-
:root {
|
|
155
|
-
/* Default (light) theme — the 60% whites/light grays */
|
|
156
|
-
--color-background-canvas: var(--color-neutral-25); /* app background */
|
|
157
|
-
--color-background-surface: var(--color-neutral-0); /* card / container */
|
|
158
|
-
--color-background-subtle: var(--color-neutral-50); /* row / nested */
|
|
159
|
-
--color-background-raised: var(--color-neutral-0); /* floating panels */
|
|
160
|
-
--color-background-sunken: var(--color-neutral-100); /* inputs, wells */
|
|
161
|
-
--color-background-hover: var(--color-neutral-100);
|
|
162
|
-
--color-background-press: var(--color-neutral-150);
|
|
163
|
-
--color-background-selected: var(--color-brand-
|
|
164
|
-
|
|
165
|
-
/* ─────────────────────────────────────────────────────────────────────────
|
|
166
|
-
|
|
167
|
-
─────────────────────────────────────────────────────────────────────────
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
--color-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
--color-
|
|
216
|
-
--color-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
--color-
|
|
225
|
-
--color-
|
|
226
|
-
--color-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
--color-
|
|
230
|
-
--color-
|
|
231
|
-
--color-
|
|
232
|
-
--color-
|
|
233
|
-
--color-
|
|
234
|
-
--color-
|
|
235
|
-
|
|
236
|
-
/*
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
--color-
|
|
241
|
-
--color-
|
|
242
|
-
--color-
|
|
243
|
-
--color-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
--color-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
--color-
|
|
250
|
-
--color-
|
|
251
|
-
--color-
|
|
252
|
-
--color-
|
|
253
|
-
--color-
|
|
254
|
-
--color-
|
|
255
|
-
--color-
|
|
256
|
-
--color-
|
|
257
|
-
--color-
|
|
258
|
-
--color-
|
|
259
|
-
--color-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
--color-
|
|
264
|
-
--color-
|
|
265
|
-
--color-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
--color-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
--color-feedback-
|
|
272
|
-
--color-feedback-
|
|
273
|
-
--color-feedback-
|
|
274
|
-
--color-feedback-
|
|
275
|
-
--color-feedback-
|
|
146
|
+
/* ============================================================
|
|
147
|
+
ATTRUS / Cabiros — SEMANTIC COLOR TOKENS
|
|
148
|
+
Reference the base palette (palette.css). This is the layer
|
|
149
|
+
components consume.
|
|
150
|
+
Roles: default | secondary | muted | accent | placeholder
|
|
151
|
+
Contexts: fg (text/icon), bg (surface), br (border)
|
|
152
|
+
============================================================ */
|
|
153
|
+
|
|
154
|
+
:root {
|
|
155
|
+
/* Default (light) theme — the 60% whites/light grays */
|
|
156
|
+
--color-background-canvas: var(--color-neutral-25); /* app background */
|
|
157
|
+
--color-background-surface: var(--color-neutral-0); /* card / container */
|
|
158
|
+
--color-background-subtle: var(--color-neutral-50); /* row / nested */
|
|
159
|
+
--color-background-raised: var(--color-neutral-0); /* floating panels */
|
|
160
|
+
--color-background-sunken: var(--color-neutral-100); /* inputs, wells */
|
|
161
|
+
--color-background-hover: var(--color-neutral-100);
|
|
162
|
+
--color-background-press: var(--color-neutral-150);
|
|
163
|
+
--color-background-selected: var(--color-brand-subtle-solid); /* product-aware via brand-subtle-solid (dark theme overrides below) */
|
|
164
|
+
|
|
165
|
+
/* ─────────────────────────────────────────────────────────────────────────
|
|
166
|
+
THEMING SURFACE — product axis (semantic brand/accent tokens)
|
|
167
|
+
─────────────────────────────────────────────────────────────────────────
|
|
168
|
+
A product theme (`[data-product="…"]`) redefines ONLY this short set; every
|
|
169
|
+
component fill, text and tint reads from these, so swapping them reskins the
|
|
170
|
+
whole catalog with no per-component edits. Primer/Spectrum-style aliasing.
|
|
171
|
+
|
|
172
|
+
The two axes stay orthogonal:
|
|
173
|
+
• PRODUCT axis → matiz: this set + the brand/accent scales, logo, hero grad.
|
|
174
|
+
• THEME axis (light/dark) → surface ramp + tint intensity. NEVER matiz.
|
|
175
|
+
|
|
176
|
+
Brand = institutional / primary action. */
|
|
177
|
+
--color-brand-solid: var(--color-brand-primary-500); /* Enterprise primary — ATTRUS Navy #002142 (buttons, avatars, toggles, badges, hero) */
|
|
178
|
+
--color-brand-solid-hover: color-mix(in srgb, var(--color-pure-white) 12%, var(--color-brand-primary-500)); /* navy is near-ink → states LIGHTEN */
|
|
179
|
+
--color-brand-solid-active: color-mix(in srgb, var(--color-pure-white) 6%, var(--color-brand-primary-500));
|
|
180
|
+
--color-brand-text: var(--color-brand-primary-500); /* navy as text — 15:1 on white */
|
|
181
|
+
--color-brand-text-strong: var(--color-brand-primary-700); /* brand text pressed/emphasis */
|
|
182
|
+
--color-brand-subtle: color-mix(in srgb, var(--color-brand-primary-500) 12%, transparent); /* tints: brand chips, selected, tags */
|
|
183
|
+
--color-brand-subtle-solid: var(--color-brand-primary-50); /* opaque light brand tint: brand avatars, selected-row base */
|
|
184
|
+
--color-brand-border: var(--color-brand-primary-200); /* light brand border: selected filter chips */
|
|
185
|
+
--color-brand-on-solid: var(--color-foreground-on-solid); /* text/icon on --color-brand-solid */
|
|
186
|
+
/* Accent = interactive / wayfinding (Sky). accent text = --color-foreground-accent. */
|
|
187
|
+
--color-accent-solid: var(--color-brand-accent-500); /* tab/active indicator, focus ring */
|
|
188
|
+
--color-accent-subtle: color-mix(in srgb, var(--color-brand-accent-500) 14%, transparent); /* counts, pagination, accent chips */
|
|
189
|
+
|
|
190
|
+
/* ─────────────────────────────────────────────────────────────────────────
|
|
191
|
+
INVERSE LAYER — contextual contrast surface, NOT dark theme
|
|
192
|
+
─────────────────────────────────────────────────────────────────────────
|
|
193
|
+
Inverse is a deliberate high-contrast surface usable inside ANY theme.
|
|
194
|
+
Use it for: institutional sidebars, premium hero panels, KPI emphasis
|
|
195
|
+
cards, command palettes, modal overlays — surfaces where contrast is the
|
|
196
|
+
intent, not the ambient theme.
|
|
197
|
+
|
|
198
|
+
Key rule (ATTRUS): inverse is ALWAYS the dark "preto-azulado" — even when
|
|
199
|
+
dark theme arrives. In dark theme, surface becomes dark and inverse stays
|
|
200
|
+
dark too, but inverse keeps a deliberate, branded character (deeper navy,
|
|
201
|
+
brand-tinted) that distinguishes it from the ambient surface.
|
|
202
|
+
|
|
203
|
+
Decision matrix:
|
|
204
|
+
Use --color-background-surface → ambient surface of current theme
|
|
205
|
+
Use --color-background-inverse → deliberate contrast vs. ambient
|
|
206
|
+
Use --color-background-inverse-brand → premium brand emphasis on inverse
|
|
207
|
+
|
|
208
|
+
Anti-patterns:
|
|
209
|
+
✗ Using inverse to fake dark mode (use a real theme switch)
|
|
210
|
+
✗ Mixing inverse and surface tokens in the same component without intent
|
|
211
|
+
✗ Hard-coding #0B1230 / white instead of inverse tokens
|
|
212
|
+
───────────────────────────────────────────────────────────────────────── */
|
|
213
|
+
--color-background-inverse: color-mix(in srgb, var(--color-brand-solid) 16%, var(--color-ink-base)); /* product-tinted dark panel */
|
|
214
|
+
--color-background-inverse-surface: color-mix(in srgb, var(--color-brand-solid) 20%, var(--color-ink-raised));
|
|
215
|
+
--color-background-inverse-subtle: color-mix(in srgb, var(--color-brand-solid) 12%, var(--color-ink-deep));
|
|
216
|
+
--color-background-inverse-hover: var(--color-ink-hover);
|
|
217
|
+
|
|
218
|
+
/* Scrim — modal/drawer/sheet backdrop. Same in light and dark themes.
|
|
219
|
+
Pairs --color-scrim (tint) with --scrim-blur (depth via backdrop-filter).
|
|
220
|
+
The lower tint (0.32) works because blur alone separates focus from background;
|
|
221
|
+
fallback for browsers without backdrop-filter is in components/overlays.css. */
|
|
222
|
+
--color-scrim: rgba(10, 15, 31, 0.32);
|
|
223
|
+
--scrim-blur: 6px;
|
|
224
|
+
--color-background-inverse-press: color-mix(in srgb, var(--color-ink-hover) 70%, var(--color-pure-white));
|
|
225
|
+
--color-background-inverse-selected: color-mix(in srgb, var(--color-brand-solid) 22%, var(--color-ink-base));
|
|
226
|
+
--color-background-inverse-brand: var(--color-brand-solid); /* CTA / hero with brand weight — follows product */
|
|
227
|
+
|
|
228
|
+
/* Foreground (text + icons) on LIGHT surfaces */
|
|
229
|
+
--color-foreground-default: var(--color-neutral-800); /* primary copy / headings */
|
|
230
|
+
--color-foreground-secondary: var(--color-neutral-600); /* hierarchy step 2 */
|
|
231
|
+
--color-foreground-muted: var(--color-neutral-500); /* captions, helper */
|
|
232
|
+
--color-foreground-placeholder: var(--color-neutral-300); /* disabled + placeholder */
|
|
233
|
+
--color-foreground-accent: var(--color-brand-accent-700); /* accent / highlight TEXT — accent-700 #1E6DC4 (5.20:1 on white). NOT Sky-500: that fails AA as text (2.94:1). For decorative Sky fills use --color-brand-accent-500 directly. */
|
|
234
|
+
--color-foreground-brand: var(--color-brand-primary-500); /* institutional brand text/icon — Navy */
|
|
235
|
+
--color-foreground-highlight: var(--color-brand-accent-700); /* links, selected TEXT — accent-700 #1E6DC4 (legible on light). */
|
|
236
|
+
--color-foreground-on-solid: var(--color-neutral-0); /* text on any solid/strong fill (brand, ink, navy, dark hovers) */
|
|
237
|
+
--color-foreground-disabled: var(--color-neutral-300);
|
|
238
|
+
|
|
239
|
+
/* Foreground on INVERSE (dark navy/ink) surfaces */
|
|
240
|
+
--color-foreground-inverse-default: var(--color-neutral-50);
|
|
241
|
+
--color-foreground-inverse-secondary: var(--color-neutral-300);
|
|
242
|
+
--color-foreground-inverse-muted: var(--color-neutral-400);
|
|
243
|
+
--color-foreground-inverse-placeholder: var(--color-neutral-500);
|
|
244
|
+
--color-foreground-inverse-accent: var(--color-brand-accent-500);
|
|
245
|
+
--color-foreground-inverse-highlight: var(--color-brand-accent-300);
|
|
246
|
+
--color-foreground-inverse-disabled: var(--color-neutral-600);
|
|
247
|
+
|
|
248
|
+
/* Borders */
|
|
249
|
+
--color-border-subtle: var(--color-neutral-100);
|
|
250
|
+
--color-border-default: var(--color-neutral-150);
|
|
251
|
+
--color-border-strong: var(--color-neutral-200);
|
|
252
|
+
--color-border-focus: var(--color-accent-solid); /* per-theme accent (Sky default) — follows the product's accent */
|
|
253
|
+
--color-border-accent: var(--color-accent-solid);
|
|
254
|
+
--color-border-success: var(--color-success-500);
|
|
255
|
+
--color-border-warning: var(--color-warning-500);
|
|
256
|
+
--color-border-danger: var(--color-danger-500);
|
|
257
|
+
--color-border-info: var(--color-info-500);
|
|
258
|
+
--color-border-inverse: color-mix(in srgb, var(--color-pure-white) 10%, transparent);
|
|
259
|
+
--color-border-inverse-strong: color-mix(in srgb, var(--color-pure-white) 18%, transparent);
|
|
260
|
+
|
|
261
|
+
/* White-alpha overlays — for chips, ghost buttons, hairlines on dark/brand surfaces.
|
|
262
|
+
Use these instead of rgba(255,255,255,…) literals. */
|
|
263
|
+
--color-overlay-white-08: color-mix(in srgb, var(--color-pure-white) 8%, transparent);
|
|
264
|
+
--color-overlay-white-12: color-mix(in srgb, var(--color-pure-white) 12%, transparent);
|
|
265
|
+
--color-overlay-white-14: color-mix(in srgb, var(--color-pure-white) 14%, transparent);
|
|
266
|
+
--color-overlay-white-16: color-mix(in srgb, var(--color-pure-white) 16%, transparent);
|
|
267
|
+
--color-overlay-white-18: color-mix(in srgb, var(--color-pure-white) 18%, transparent);
|
|
268
|
+
--color-overlay-white-22: color-mix(in srgb, var(--color-pure-white) 22%, transparent);
|
|
269
|
+
|
|
270
|
+
/* Semantic fg/bg pairs (status chips, alerts) */
|
|
271
|
+
--color-feedback-success-foreground: var(--color-success-700);
|
|
272
|
+
--color-feedback-success-foreground-muted: var(--color-success-500);
|
|
273
|
+
--color-feedback-success-foreground-subtle: color-mix(in srgb, var(--color-success-500) 70%, var(--color-foreground-muted));
|
|
274
|
+
--color-feedback-success-background: var(--color-success-50);
|
|
275
|
+
--color-feedback-success-border: var(--color-success-100);
|
|
276
|
+
--color-feedback-warning-foreground: var(--color-warning-700);
|
|
277
|
+
--color-feedback-warning-foreground-muted: var(--color-warning-500);
|
|
278
|
+
--color-feedback-warning-foreground-subtle: color-mix(in srgb, var(--color-warning-500) 70%, var(--color-foreground-muted));
|
|
279
|
+
--color-feedback-warning-background: var(--color-warning-50);
|
|
280
|
+
--color-feedback-warning-border: var(--color-warning-100);
|
|
281
|
+
--color-feedback-danger-foreground: var(--color-danger-700);
|
|
282
|
+
--color-feedback-danger-foreground-muted: var(--color-danger-500);
|
|
283
|
+
--color-feedback-danger-foreground-subtle: color-mix(in srgb, var(--color-danger-500) 70%, var(--color-foreground-muted));
|
|
284
|
+
--color-feedback-danger-background: var(--color-danger-50);
|
|
285
|
+
--color-feedback-danger-border: var(--color-danger-100);
|
|
286
|
+
--color-feedback-info-foreground: var(--color-info-700);
|
|
287
|
+
--color-feedback-info-foreground-muted: var(--color-info-500);
|
|
288
|
+
--color-feedback-info-foreground-subtle: color-mix(in srgb, var(--color-info-500) 70%, var(--color-foreground-muted));
|
|
289
|
+
--color-feedback-info-background: var(--color-info-50);
|
|
290
|
+
--color-feedback-info-border: var(--color-info-100);
|
|
291
|
+
|
|
292
|
+
/* Semantic foregrounds on INVERSE surfaces (chips/banners over dark) */
|
|
293
|
+
--color-feedback-success-foreground-on-inverse: var(--color-success-100);
|
|
294
|
+
--color-feedback-success-foreground-on-inverse-muted: color-mix(in srgb, var(--color-success-100) 70%, var(--color-foreground-inverse-muted));
|
|
295
|
+
--color-feedback-warning-foreground-on-inverse: var(--color-warning-100);
|
|
296
|
+
--color-feedback-warning-foreground-on-inverse-muted: color-mix(in srgb, var(--color-warning-100) 70%, var(--color-foreground-inverse-muted));
|
|
297
|
+
--color-feedback-danger-foreground-on-inverse: var(--color-danger-100);
|
|
298
|
+
--color-feedback-danger-foreground-on-inverse-muted: color-mix(in srgb, var(--color-danger-100) 70%, var(--color-foreground-inverse-muted));
|
|
299
|
+
--color-feedback-info-foreground-on-inverse: var(--color-info-100);
|
|
300
|
+
--color-feedback-info-foreground-on-inverse-muted: color-mix(in srgb, var(--color-info-100) 70%, var(--color-foreground-inverse-muted));
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/* ============================================================
|
|
304
|
+
ATTRUS / Cabiros — GRADIENTS (primary brand + layers)
|
|
305
|
+
============================================================ */
|
|
306
|
+
|
|
307
|
+
/* Brand gradients — DERIVED from --color-brand-solid so they follow the
|
|
308
|
+
active product automatically (Enterprise Navy / Business Blue / …). The
|
|
309
|
+
var() resolves at use-site, so an element under [data-product] recomputes
|
|
310
|
+
these with that product's primary — no per-product override needed.
|
|
311
|
+
--grad-brand tips into the shared Sky accent. */
|
|
312
|
+
:root {
|
|
313
|
+
--grad-brand: linear-gradient(135deg,
|
|
314
|
+
color-mix(in srgb, var(--color-pure-black) 45%, var(--color-brand-solid)) 0%,
|
|
315
|
+
var(--color-brand-solid) 55%,
|
|
316
|
+
var(--color-accent-solid) 100%);
|
|
317
|
+
--grad-brand-soft: linear-gradient(135deg,
|
|
318
|
+
var(--color-brand-solid) 0%,
|
|
319
|
+
color-mix(in srgb, var(--color-pure-black) 20%, var(--color-brand-solid)) 100%);
|
|
320
|
+
--grad-ink: linear-gradient(160deg,
|
|
321
|
+
color-mix(in srgb, var(--color-pure-black) 68%, var(--color-brand-solid)) 0%,
|
|
322
|
+
color-mix(in srgb, var(--color-pure-black) 45%, var(--color-brand-solid)) 55%,
|
|
323
|
+
color-mix(in srgb, var(--color-pure-black) 25%, var(--color-brand-solid)) 100%);
|
|
324
|
+
--grad-hero: linear-gradient(180deg,
|
|
325
|
+
color-mix(in srgb, var(--color-pure-black) 52%, var(--color-brand-solid)) 0%,
|
|
326
|
+
color-mix(in srgb, var(--color-pure-black) 18%, var(--color-brand-solid)) 100%);
|
|
327
|
+
--grad-sheen: linear-gradient(120deg,
|
|
328
|
+
color-mix(in srgb, var(--color-pure-white) 14%, transparent) 0%,
|
|
329
|
+
color-mix(in srgb, var(--color-pure-white) 0%, transparent) 40%,
|
|
330
|
+
color-mix(in srgb, var(--color-pure-white) 0%, transparent) 60%,
|
|
331
|
+
color-mix(in srgb, var(--color-pure-white) 8%, transparent) 100%);
|
|
332
|
+
--grad-surface-top: linear-gradient(180deg,
|
|
333
|
+
color-mix(in srgb, var(--color-pure-white) 65%, transparent) 0%,
|
|
334
|
+
color-mix(in srgb, var(--color-pure-white) 0%, transparent) 100%);
|
|
335
|
+
--grad-radial-glow: radial-gradient(1200px 500px at 20% -10%,
|
|
336
|
+
color-mix(in srgb, var(--color-accent-solid) 25%, transparent) 0%,
|
|
337
|
+
color-mix(in srgb, var(--color-accent-solid) 0%, transparent) 60%);
|
|
338
|
+
--grad-data-pos: linear-gradient(180deg,
|
|
339
|
+
color-mix(in srgb, var(--color-success-500) 35%, transparent) 0%,
|
|
340
|
+
color-mix(in srgb, var(--color-success-500) 0%, transparent) 100%);
|
|
341
|
+
--grad-data-neg: linear-gradient(180deg,
|
|
342
|
+
color-mix(in srgb, var(--color-danger-500) 35%, transparent) 0%,
|
|
343
|
+
color-mix(in srgb, var(--color-danger-500) 0%, transparent) 100%);
|
|
344
|
+
--grad-data-brand: linear-gradient(180deg,
|
|
345
|
+
color-mix(in srgb, var(--color-brand-accent-500) 30%, transparent) 0%,
|
|
346
|
+
color-mix(in srgb, var(--color-brand-accent-500) 0%, transparent) 100%);
|
|
276
347
|
}
|
|
277
348
|
|
|
278
|
-
/* ============================================================
|
|
279
|
-
ATTRUS / Cabiros —
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
--
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
--
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
--
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
--
|
|
305
|
-
|
|
306
|
-
|
|
349
|
+
/* ============================================================
|
|
350
|
+
ATTRUS / Cabiros — DATA VISUALIZATION (chart palettes & structure)
|
|
351
|
+
Categorical = qualitative series (distinct, on-brand, cool).
|
|
352
|
+
Sequential = single-hue magnitude ramp (Sky).
|
|
353
|
+
Diverging = danger ← neutral → success (variance/heatmap).
|
|
354
|
+
Structure = grid / axis / track / reference (semantic → theme).
|
|
355
|
+
Categorical gets dark-theme overrides (lift the dark hues, in
|
|
356
|
+
theme-dark.css); ramps + structure follow semantic tokens.
|
|
357
|
+
============================================================ */
|
|
358
|
+
|
|
359
|
+
:root {
|
|
360
|
+
/* Categorical — order chosen for max adjacent contrast */
|
|
361
|
+
--dataviz-cat-1: #003399; /* Royal — brand-anchored series 1 */
|
|
362
|
+
--dataviz-cat-2: #3399FF; /* Sky */
|
|
363
|
+
--dataviz-cat-3: #0F9A8C; /* Teal */
|
|
364
|
+
--dataviz-cat-4: #C68A1A; /* Gold */
|
|
365
|
+
--dataviz-cat-5: #6B5CE0; /* Violet */
|
|
366
|
+
--dataviz-cat-6: #CC4F7A; /* Rose */
|
|
367
|
+
--dataviz-cat-7: #18A0B8; /* Cyan */
|
|
368
|
+
--dataviz-cat-8: #5E6A82; /* Slate (neutral-500) */
|
|
369
|
+
|
|
370
|
+
/* Sequential — Sky single-hue ramp (low → high). Reuses accent stops. */
|
|
371
|
+
--dataviz-seq-1: var(--color-brand-accent-100); /* #D9ECFF */
|
|
372
|
+
--dataviz-seq-2: var(--color-brand-accent-200); /* #ADD2FF */
|
|
373
|
+
--dataviz-seq-3: var(--color-brand-accent-300); /* #7AB8FF */
|
|
374
|
+
--dataviz-seq-4: var(--color-brand-accent-500); /* #3399FF */
|
|
375
|
+
--dataviz-seq-5: var(--color-brand-accent-700); /* #1E6DC4 */
|
|
376
|
+
--dataviz-seq-6: var(--color-brand-accent-900); /* #0E3B70 */
|
|
377
|
+
|
|
378
|
+
/* Diverging — danger ← neutral mid → success (7 stops) */
|
|
379
|
+
--dataviz-div-1: var(--color-danger-500); /* most negative */
|
|
380
|
+
--dataviz-div-2: var(--color-danger-300);
|
|
381
|
+
--dataviz-div-3: var(--color-danger-100);
|
|
382
|
+
--dataviz-div-mid: var(--color-neutral-100); /* neutral midpoint */
|
|
383
|
+
--dataviz-div-5: var(--color-success-100);
|
|
384
|
+
--dataviz-div-6: var(--color-success-300);
|
|
385
|
+
--dataviz-div-7: var(--color-success-500); /* most positive */
|
|
386
|
+
|
|
387
|
+
/* Semantic data encodings */
|
|
388
|
+
--dataviz-positive: var(--color-success-500);
|
|
389
|
+
--dataviz-negative: var(--color-danger-500);
|
|
390
|
+
--dataviz-neutral: var(--color-neutral-400);
|
|
391
|
+
|
|
392
|
+
/* Structure — grid, axis, track, reference lines */
|
|
393
|
+
--dataviz-grid: var(--color-border-subtle); /* gridlines */
|
|
394
|
+
--dataviz-axis: var(--color-border-strong); /* axis baseline */
|
|
395
|
+
--dataviz-axis-label: var(--color-foreground-muted); /* tick labels */
|
|
396
|
+
--dataviz-track: var(--color-background-subtle); /* empty bar / gauge track */
|
|
397
|
+
--dataviz-reference: var(--color-foreground-muted); /* dashed target/avg line */
|
|
307
398
|
}
|
|
308
399
|
|
|
309
|
-
/* ============================================================
|
|
310
|
-
ATTRUS / Cabiros —
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
:
|
|
320
|
-
|
|
321
|
-
--
|
|
322
|
-
--
|
|
323
|
-
--
|
|
324
|
-
--
|
|
325
|
-
--
|
|
326
|
-
--
|
|
327
|
-
--dataviz-cat-7: #18A0B8; /* Cyan */
|
|
328
|
-
--dataviz-cat-8: #5E6A82; /* Slate (neutral-500) */
|
|
329
|
-
|
|
330
|
-
/* Sequential — Sky single-hue ramp (low → high). Reuses accent stops. */
|
|
331
|
-
--dataviz-seq-1: var(--color-brand-accent-100); /* #D9ECFF */
|
|
332
|
-
--dataviz-seq-2: var(--color-brand-accent-200); /* #ADD2FF */
|
|
333
|
-
--dataviz-seq-3: var(--color-brand-accent-300); /* #7AB8FF */
|
|
334
|
-
--dataviz-seq-4: var(--color-brand-accent-500); /* #3399FF */
|
|
335
|
-
--dataviz-seq-5: var(--color-brand-accent-700); /* #1E6DC4 */
|
|
336
|
-
--dataviz-seq-6: var(--color-brand-accent-900); /* #0E3B70 */
|
|
337
|
-
|
|
338
|
-
/* Diverging — danger ← neutral mid → success (7 stops) */
|
|
339
|
-
--dataviz-div-1: var(--color-danger-500); /* most negative */
|
|
340
|
-
--dataviz-div-2: var(--color-danger-300);
|
|
341
|
-
--dataviz-div-3: var(--color-danger-100);
|
|
342
|
-
--dataviz-div-mid: var(--color-neutral-100); /* neutral midpoint */
|
|
343
|
-
--dataviz-div-5: var(--color-success-100);
|
|
344
|
-
--dataviz-div-6: var(--color-success-300);
|
|
345
|
-
--dataviz-div-7: var(--color-success-500); /* most positive */
|
|
346
|
-
|
|
347
|
-
/* Semantic data encodings */
|
|
348
|
-
--dataviz-positive: var(--color-success-500);
|
|
349
|
-
--dataviz-negative: var(--color-danger-500);
|
|
350
|
-
--dataviz-neutral: var(--color-neutral-400);
|
|
351
|
-
|
|
352
|
-
/* Structure — grid, axis, track, reference lines */
|
|
353
|
-
--dataviz-grid: var(--color-border-subtle); /* gridlines */
|
|
354
|
-
--dataviz-axis: var(--color-border-strong); /* axis baseline */
|
|
355
|
-
--dataviz-axis-label: var(--color-foreground-muted); /* tick labels */
|
|
356
|
-
--dataviz-track: var(--color-background-subtle); /* empty bar / gauge track */
|
|
357
|
-
--dataviz-reference: var(--color-foreground-muted); /* dashed target/avg line */
|
|
400
|
+
/* ============================================================
|
|
401
|
+
ATTRUS / Cabiros — LIQUID GLASS (transparent / frosted layers)
|
|
402
|
+
Use with backdrop-filter: blur().
|
|
403
|
+
============================================================ */
|
|
404
|
+
|
|
405
|
+
:root {
|
|
406
|
+
--glass-white: color-mix(in srgb, var(--color-pure-white) 58%, transparent);
|
|
407
|
+
--glass-white-hi: color-mix(in srgb, var(--color-pure-white) 78%, transparent);
|
|
408
|
+
--glass-white-lo: color-mix(in srgb, var(--color-pure-white) 38%, transparent);
|
|
409
|
+
--glass-tint: color-mix(in srgb, var(--color-neutral-50) 55%, transparent); /* bluish white */
|
|
410
|
+
--glass-ink: color-mix(in srgb, var(--color-background-inverse) 55%, transparent); /* dark navy */
|
|
411
|
+
--glass-ink-hi: color-mix(in srgb, var(--color-background-inverse) 78%, transparent);
|
|
412
|
+
--glass-ink-lo: color-mix(in srgb, var(--color-background-inverse) 35%, transparent);
|
|
413
|
+
--glass-blur: saturate(140%) blur(18px);
|
|
414
|
+
--glass-blur-sm: saturate(130%) blur(10px);
|
|
415
|
+
--glass-blur-lg: saturate(160%) blur(28px);
|
|
416
|
+
--glass-border: 1px solid color-mix(in srgb, var(--color-pure-white) 45%, transparent);
|
|
417
|
+
--glass-border-dark: 1px solid color-mix(in srgb, var(--color-pure-white) 10%, transparent);
|
|
358
418
|
}
|
|
359
419
|
|
|
360
|
-
/* ============================================================
|
|
361
|
-
ATTRUS / Cabiros —
|
|
362
|
-
|
|
363
|
-
============================================================ */
|
|
364
|
-
|
|
365
|
-
:root {
|
|
366
|
-
--
|
|
367
|
-
--
|
|
368
|
-
--
|
|
369
|
-
--
|
|
370
|
-
--
|
|
371
|
-
--
|
|
372
|
-
--
|
|
373
|
-
--
|
|
374
|
-
--
|
|
375
|
-
--
|
|
376
|
-
--
|
|
377
|
-
--glass-border-dark: 1px solid color-mix(in srgb, var(--color-pure-white) 10%, transparent);
|
|
420
|
+
/* ============================================================
|
|
421
|
+
ATTRUS / Cabiros — RADII
|
|
422
|
+
Mostly softly rounded; buttons fully rounded.
|
|
423
|
+
============================================================ */
|
|
424
|
+
|
|
425
|
+
:root {
|
|
426
|
+
--radius-2xs: 2px; /* never-square minimum — tiny chips, ticks, dividers */
|
|
427
|
+
--radius-xs: 4px;
|
|
428
|
+
--radius-sm: 6px;
|
|
429
|
+
--radius-sm-md: 8px; /* in-between — avatar tiles, square icon buttons */
|
|
430
|
+
--radius-md: 10px; /* cards, inputs — softly rounded */
|
|
431
|
+
--radius-md-lg: 12px; /* in-between — medium cards, drawer rows */
|
|
432
|
+
--radius-lg: 14px; /* containers */
|
|
433
|
+
--radius-lg-xl: 16px; /* in-between — hero / large panels */
|
|
434
|
+
--radius-xl: 20px; /* hero / large panels */
|
|
435
|
+
--radius-2xl: 28px;
|
|
436
|
+
--radius-pill: 999px; /* BUTTONS — fully rounded */
|
|
378
437
|
}
|
|
379
438
|
|
|
380
|
-
/* ============================================================
|
|
381
|
-
ATTRUS / Cabiros —
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
:
|
|
386
|
-
--
|
|
387
|
-
|
|
388
|
-
--
|
|
389
|
-
|
|
390
|
-
--
|
|
391
|
-
|
|
392
|
-
--
|
|
393
|
-
|
|
394
|
-
--
|
|
395
|
-
|
|
396
|
-
--
|
|
439
|
+
/* ============================================================
|
|
440
|
+
ATTRUS / Cabiros — SHADOWS (soft, blue-tinted, multi-layer)
|
|
441
|
+
============================================================ */
|
|
442
|
+
|
|
443
|
+
:root {
|
|
444
|
+
--shadow-xs: 0 1px 2px color-mix(in srgb, var(--color-shadow-tint) 5%, transparent);
|
|
445
|
+
--shadow-sm: 0 1px 2px color-mix(in srgb, var(--color-shadow-tint) 6%, transparent),
|
|
446
|
+
0 2px 6px color-mix(in srgb, var(--color-shadow-tint) 4%, transparent);
|
|
447
|
+
--shadow-md: 0 2px 4px color-mix(in srgb, var(--color-shadow-tint) 6%, transparent),
|
|
448
|
+
0 8px 20px color-mix(in srgb, var(--color-shadow-tint) 6%, transparent);
|
|
449
|
+
--shadow-lg: 0 4px 8px color-mix(in srgb, var(--color-shadow-tint) 6%, transparent),
|
|
450
|
+
0 20px 40px color-mix(in srgb, var(--color-shadow-tint) 10%, transparent);
|
|
451
|
+
--shadow-xl: 0 12px 24px color-mix(in srgb, var(--color-shadow-tint) 10%, transparent),
|
|
452
|
+
0 32px 80px color-mix(in srgb, var(--color-shadow-tint) 18%, transparent);
|
|
453
|
+
--shadow-2xl: 0 24px 48px color-mix(in srgb, var(--color-shadow-tint) 14%, transparent),
|
|
454
|
+
0 48px 120px color-mix(in srgb, var(--color-shadow-tint) 24%, transparent); /* deepest — modals, drawers, floating overlays above scrim */
|
|
455
|
+
--shadow-focus: 0 0 0 4px color-mix(in srgb, var(--color-accent-solid) 22%, transparent); /* per-theme accent */
|
|
456
|
+
--shadow-focus-sky: 0 0 0 4px color-mix(in srgb, var(--color-brand-accent-500) 25%, transparent);
|
|
457
|
+
--shadow-focus-success: 0 0 0 4px color-mix(in srgb, var(--color-success-500) 22%, transparent);
|
|
458
|
+
--shadow-focus-warning: 0 0 0 4px color-mix(in srgb, var(--color-warning-500) 22%, transparent);
|
|
459
|
+
--shadow-focus-danger: 0 0 0 4px color-mix(in srgb, var(--color-danger-500) 22%, transparent);
|
|
460
|
+
--shadow-focus-info: 0 0 0 4px color-mix(in srgb, var(--color-info-500) 22%, transparent);
|
|
461
|
+
|
|
462
|
+
/* Semantic elevation — for status cards, toasts, banners, action buttons */
|
|
463
|
+
--shadow-success-sm: 0 1px 2px color-mix(in srgb, var(--shadow-tint-success-color) 8%, transparent),
|
|
464
|
+
0 4px 12px color-mix(in srgb, var(--shadow-tint-success-color) 12%, transparent);
|
|
465
|
+
--shadow-success-md: 0 4px 8px color-mix(in srgb, var(--shadow-tint-success-color) 10%, transparent),
|
|
466
|
+
0 16px 32px color-mix(in srgb, var(--shadow-tint-success-color) 16%, transparent);
|
|
467
|
+
--shadow-warning-sm: 0 1px 2px color-mix(in srgb, var(--shadow-tint-warning-color) 8%, transparent),
|
|
468
|
+
0 4px 12px color-mix(in srgb, var(--shadow-tint-warning-color) 12%, transparent);
|
|
469
|
+
--shadow-warning-md: 0 4px 8px color-mix(in srgb, var(--shadow-tint-warning-color) 10%, transparent),
|
|
470
|
+
0 16px 32px color-mix(in srgb, var(--shadow-tint-warning-color) 16%, transparent);
|
|
471
|
+
--shadow-danger-sm: 0 1px 2px color-mix(in srgb, var(--shadow-tint-danger-color) 8%, transparent),
|
|
472
|
+
0 4px 12px color-mix(in srgb, var(--shadow-tint-danger-color) 14%, transparent);
|
|
473
|
+
--shadow-danger-md: 0 4px 8px color-mix(in srgb, var(--shadow-tint-danger-color) 12%, transparent),
|
|
474
|
+
0 16px 32px color-mix(in srgb, var(--shadow-tint-danger-color) 18%, transparent);
|
|
475
|
+
--shadow-info-sm: 0 1px 2px color-mix(in srgb, var(--shadow-tint-info-color) 8%, transparent),
|
|
476
|
+
0 4px 12px color-mix(in srgb, var(--shadow-tint-info-color) 12%, transparent);
|
|
477
|
+
--shadow-info-md: 0 4px 8px color-mix(in srgb, var(--shadow-tint-info-color) 10%, transparent),
|
|
478
|
+
0 16px 32px color-mix(in srgb, var(--shadow-tint-info-color) 16%, transparent);
|
|
479
|
+
--shadow-inset: inset 0 1px 0 color-mix(in srgb, var(--color-pure-white) 60%, transparent),
|
|
480
|
+
inset 0 -1px 0 color-mix(in srgb, var(--color-shadow-tint) 4%, transparent);
|
|
481
|
+
--shadow-glass: 0 1px 0 color-mix(in srgb, var(--color-pure-white) 50%, transparent) inset,
|
|
482
|
+
0 10px 30px color-mix(in srgb, var(--color-shadow-tint) 12%, transparent);
|
|
483
|
+
--shadow-glass-dark: 0 1px 0 color-mix(in srgb, var(--color-pure-white) 8%, transparent) inset,
|
|
484
|
+
0 10px 40px color-mix(in srgb, var(--color-pure-black) 35%, transparent);
|
|
397
485
|
}
|
|
398
486
|
|
|
399
|
-
/* ============================================================
|
|
400
|
-
ATTRUS / Cabiros —
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
--
|
|
406
|
-
|
|
407
|
-
--
|
|
408
|
-
|
|
409
|
-
--
|
|
410
|
-
|
|
411
|
-
--
|
|
412
|
-
|
|
413
|
-
--
|
|
414
|
-
|
|
415
|
-
--
|
|
416
|
-
--
|
|
417
|
-
--
|
|
418
|
-
--
|
|
419
|
-
--
|
|
420
|
-
--
|
|
421
|
-
|
|
422
|
-
/* Semantic elevation — for status cards, toasts, banners, action buttons */
|
|
423
|
-
--shadow-success-sm: 0 1px 2px color-mix(in srgb, var(--shadow-tint-success-color) 8%, transparent),
|
|
424
|
-
0 4px 12px color-mix(in srgb, var(--shadow-tint-success-color) 12%, transparent);
|
|
425
|
-
--shadow-success-md: 0 4px 8px color-mix(in srgb, var(--shadow-tint-success-color) 10%, transparent),
|
|
426
|
-
0 16px 32px color-mix(in srgb, var(--shadow-tint-success-color) 16%, transparent);
|
|
427
|
-
--shadow-warning-sm: 0 1px 2px color-mix(in srgb, var(--shadow-tint-warning-color) 8%, transparent),
|
|
428
|
-
0 4px 12px color-mix(in srgb, var(--shadow-tint-warning-color) 12%, transparent);
|
|
429
|
-
--shadow-warning-md: 0 4px 8px color-mix(in srgb, var(--shadow-tint-warning-color) 10%, transparent),
|
|
430
|
-
0 16px 32px color-mix(in srgb, var(--shadow-tint-warning-color) 16%, transparent);
|
|
431
|
-
--shadow-danger-sm: 0 1px 2px color-mix(in srgb, var(--shadow-tint-danger-color) 8%, transparent),
|
|
432
|
-
0 4px 12px color-mix(in srgb, var(--shadow-tint-danger-color) 14%, transparent);
|
|
433
|
-
--shadow-danger-md: 0 4px 8px color-mix(in srgb, var(--shadow-tint-danger-color) 12%, transparent),
|
|
434
|
-
0 16px 32px color-mix(in srgb, var(--shadow-tint-danger-color) 18%, transparent);
|
|
435
|
-
--shadow-info-sm: 0 1px 2px color-mix(in srgb, var(--shadow-tint-info-color) 8%, transparent),
|
|
436
|
-
0 4px 12px color-mix(in srgb, var(--shadow-tint-info-color) 12%, transparent);
|
|
437
|
-
--shadow-info-md: 0 4px 8px color-mix(in srgb, var(--shadow-tint-info-color) 10%, transparent),
|
|
438
|
-
0 16px 32px color-mix(in srgb, var(--shadow-tint-info-color) 16%, transparent);
|
|
439
|
-
--shadow-inset: inset 0 1px 0 color-mix(in srgb, var(--color-pure-white) 60%, transparent),
|
|
440
|
-
inset 0 -1px 0 color-mix(in srgb, var(--color-shadow-tint) 4%, transparent);
|
|
441
|
-
--shadow-glass: 0 1px 0 color-mix(in srgb, var(--color-pure-white) 50%, transparent) inset,
|
|
442
|
-
0 10px 30px color-mix(in srgb, var(--color-shadow-tint) 12%, transparent);
|
|
443
|
-
--shadow-glass-dark: 0 1px 0 color-mix(in srgb, var(--color-pure-white) 8%, transparent) inset,
|
|
444
|
-
0 10px 40px color-mix(in srgb, var(--color-pure-black) 35%, transparent);
|
|
487
|
+
/* ============================================================
|
|
488
|
+
ATTRUS / Cabiros — SPACING
|
|
489
|
+
4px base; dense, data-heavy layouts.
|
|
490
|
+
============================================================ */
|
|
491
|
+
|
|
492
|
+
:root {
|
|
493
|
+
--space-0: 0;
|
|
494
|
+
--space-1: 2px;
|
|
495
|
+
--space-2: 4px;
|
|
496
|
+
--space-2-5: 6px; /* half-step — dense chips, tight icon gaps */
|
|
497
|
+
--space-3: 8px;
|
|
498
|
+
--space-3-5: 10px; /* half-step — control padding, list-row gaps */
|
|
499
|
+
--space-4: 12px;
|
|
500
|
+
--space-4-5: 14px; /* half-step — card padding, section gaps */
|
|
501
|
+
--space-5: 16px;
|
|
502
|
+
--space-6: 20px;
|
|
503
|
+
--space-7: 24px;
|
|
504
|
+
--space-8: 32px;
|
|
505
|
+
--space-9: 40px;
|
|
506
|
+
--space-10: 48px;
|
|
507
|
+
--space-12: 64px;
|
|
508
|
+
--space-14: 80px;
|
|
509
|
+
--space-16: 96px;
|
|
445
510
|
}
|
|
446
511
|
|
|
447
|
-
/* ============================================================
|
|
448
|
-
ATTRUS / Cabiros —
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
:
|
|
453
|
-
--
|
|
454
|
-
--
|
|
455
|
-
--
|
|
456
|
-
--
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
--
|
|
460
|
-
--
|
|
461
|
-
--
|
|
462
|
-
--space-6: 20px;
|
|
463
|
-
--space-7: 24px;
|
|
464
|
-
--space-8: 32px;
|
|
465
|
-
--space-9: 40px;
|
|
466
|
-
--space-10: 48px;
|
|
467
|
-
--space-12: 64px;
|
|
468
|
-
--space-14: 80px;
|
|
469
|
-
--space-16: 96px;
|
|
512
|
+
/* ============================================================
|
|
513
|
+
ATTRUS / Cabiros — ICONOGRAPHY (Lucide; sized to pair with type scale)
|
|
514
|
+
============================================================ */
|
|
515
|
+
|
|
516
|
+
:root {
|
|
517
|
+
--icon-xs: 12px; /* helper text, micro caption (paired w/ 11–12px text) */
|
|
518
|
+
--icon-sm: 14px; /* input affix, dense inline (paired w/ 13px text) */
|
|
519
|
+
--icon-md: 16px; /* default — buttons, nav, body (paired w/ 14px text) */
|
|
520
|
+
--icon-lg: 20px; /* iconography grid, prominent CTAs (paired w/ 16+ text) */
|
|
521
|
+
--icon-xl: 24px; /* hero, empty states, splash (paired w/ 18+ text) */
|
|
522
|
+
|
|
523
|
+
/* Stroke widths — Lucide */
|
|
524
|
+
--icon-stroke: 1.75; /* default — slightly bolder than 1.5, calmer than 2 */
|
|
525
|
+
--icon-stroke-bold: 2; /* close buttons, X marks, indicators where weight matters */
|
|
526
|
+
--icon-stroke-thin: 1.5; /* decorative / large hero icons where 1.75 looks heavy */
|
|
470
527
|
}
|
|
471
528
|
|
|
472
|
-
/* ============================================================
|
|
473
|
-
ATTRUS / Cabiros —
|
|
474
|
-
============================================================ */
|
|
475
|
-
|
|
476
|
-
:root {
|
|
477
|
-
|
|
478
|
-
--
|
|
479
|
-
--
|
|
480
|
-
--
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
/*
|
|
484
|
-
--
|
|
485
|
-
--
|
|
486
|
-
--
|
|
529
|
+
/* ============================================================
|
|
530
|
+
ATTRUS / Cabiros — MOTION (durations + easings for transitions/animations)
|
|
531
|
+
============================================================ */
|
|
532
|
+
|
|
533
|
+
:root {
|
|
534
|
+
/* Easing — single curve across the system; "out-expo-ish" for snappy UI */
|
|
535
|
+
--ease-standard: cubic-bezier(.2, .8, .2, 1);
|
|
536
|
+
--ease-emphasis: cubic-bezier(.2, .9, .15, 1); /* slightly more overshoot — for entries */
|
|
537
|
+
--ease-linear: linear; /* loading bars, scrubbers */
|
|
538
|
+
|
|
539
|
+
/* Durations — paired with --ease-standard unless noted */
|
|
540
|
+
--duration-instant: 80ms; /* micro feedback (tap echo) */
|
|
541
|
+
--duration-fast: 140ms; /* hover, focus, color shifts */
|
|
542
|
+
--duration-base: 200ms; /* default for most UI */
|
|
543
|
+
--duration-slow: 320ms; /* expansions, reveals */
|
|
544
|
+
--duration-slower: 480ms; /* page-level transitions */
|
|
545
|
+
--duration-deliberate: 640ms; /* overlays — modal/drawer entry */
|
|
546
|
+
|
|
547
|
+
/* Pre-composed transition shorthand (most common cases) */
|
|
548
|
+
--transition-fast: 140ms var(--ease-standard); /* default for buttons/inputs */
|
|
549
|
+
--transition-base: 200ms var(--ease-standard);
|
|
550
|
+
--transition-slow: 320ms var(--ease-standard);
|
|
487
551
|
}
|
|
488
552
|
|
|
489
|
-
/* ============================================================
|
|
490
|
-
ATTRUS / Cabiros —
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
--
|
|
497
|
-
--
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
--
|
|
502
|
-
--
|
|
503
|
-
--
|
|
504
|
-
--
|
|
505
|
-
--
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
--
|
|
553
|
+
/* ============================================================
|
|
554
|
+
ATTRUS / Cabiros — TYPOGRAPHY TOKENS (Lato family per brand manual)
|
|
555
|
+
Font families, weights, type scale, line heights, letter spacing.
|
|
556
|
+
Ready-to-use type CLASSES live in ../typography/index.css.
|
|
557
|
+
============================================================ */
|
|
558
|
+
|
|
559
|
+
:root {
|
|
560
|
+
--font-sans: 'Lato', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
561
|
+
--font-mono: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace;
|
|
562
|
+
--font-display: 'Lato', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
563
|
+
|
|
564
|
+
/* Weights (per manual) */
|
|
565
|
+
--w-light: 300;
|
|
566
|
+
--w-regular: 400;
|
|
567
|
+
--w-medium: 500; /* Lato doesn't ship 500 natively; maps to 400 */
|
|
568
|
+
--w-semibold: 600;
|
|
569
|
+
--w-bold: 700;
|
|
570
|
+
--w-extrabold: 800;
|
|
571
|
+
--w-black: 900;
|
|
572
|
+
|
|
573
|
+
/* Type scale (px) */
|
|
574
|
+
--fs-xxs: 10px;
|
|
575
|
+
--fs-xs: 11px;
|
|
576
|
+
--fs-sm: 12px;
|
|
577
|
+
--fs-md: 13px; /* default UI */
|
|
578
|
+
--fs-base:14px; /* default body */
|
|
579
|
+
--fs-lg: 16px;
|
|
580
|
+
--fs-xl: 18px;
|
|
581
|
+
--fs-2xl: 20px;
|
|
582
|
+
--fs-3xl: 24px;
|
|
583
|
+
--fs-4xl: 28px;
|
|
584
|
+
--fs-5xl: 32px;
|
|
585
|
+
--fs-6xl: 40px;
|
|
586
|
+
--fs-7xl: 56px;
|
|
587
|
+
--fs-8xl: 72px;
|
|
588
|
+
|
|
589
|
+
/* Line heights */
|
|
590
|
+
--lh-tight: 1.15;
|
|
591
|
+
--lh-snug: 1.3;
|
|
592
|
+
--lh-normal: 1.5;
|
|
593
|
+
--lh-relaxed: 1.65;
|
|
594
|
+
|
|
595
|
+
/* Letter spacing — per Lato manual rules */
|
|
596
|
+
--ls-display: -0.03em; /* 32–80px headlines */
|
|
597
|
+
--ls-tight: -0.01em; /* large numerics / stat values — between display and body */
|
|
598
|
+
--ls-title: -0.015em; /* 16–32px titles (manual says -5%, but -5% looks tight on screens; using -1.5%) */
|
|
599
|
+
--ls-body: 0em; /* <16px body */
|
|
600
|
+
--ls-label: 0.02em; /* small caps / labels */
|
|
601
|
+
--ls-caps: 0.08em;
|
|
511
602
|
}
|
|
512
603
|
|
|
513
|
-
/* ============================================================
|
|
514
|
-
ATTRUS / Cabiros —
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
--
|
|
530
|
-
--
|
|
531
|
-
--
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
--
|
|
535
|
-
--
|
|
536
|
-
--
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
--
|
|
542
|
-
--
|
|
543
|
-
--
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
--
|
|
547
|
-
--
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
--
|
|
552
|
-
--
|
|
553
|
-
--
|
|
554
|
-
|
|
555
|
-
/*
|
|
556
|
-
--
|
|
557
|
-
--
|
|
558
|
-
--
|
|
559
|
-
--
|
|
560
|
-
|
|
561
|
-
|
|
604
|
+
/* ============================================================
|
|
605
|
+
ATTRUS / Cabiros — DARK THEME
|
|
606
|
+
[data-theme="dark"] remaps the AMBIENT semantic tokens to a dark
|
|
607
|
+
ink ramp. Components consume semantic tokens, so they flip
|
|
608
|
+
automatically — no per-component dark CSS needed.
|
|
609
|
+
Philosophy: the INVERSE layer stays a deliberate, brand-tinted
|
|
610
|
+
dark even here (see note in color-semantic.css), distinct from the
|
|
611
|
+
ambient surface. Raw palette + brand/accent scales are theme-agnostic.
|
|
612
|
+
Toggle via JS: set data-theme on <html>, persist to localStorage,
|
|
613
|
+
seed from prefers-color-scheme.
|
|
614
|
+
============================================================ */
|
|
615
|
+
|
|
616
|
+
[data-theme="dark"] {
|
|
617
|
+
color-scheme: dark;
|
|
618
|
+
|
|
619
|
+
/* Ambient surfaces — dark ink ramp (canvas deepest → surface raised) */
|
|
620
|
+
--color-background-canvas: var(--color-ink-deep); /* #0A1128 — app background */
|
|
621
|
+
--color-background-surface: var(--color-ink-raised); /* #111A3D — cards sit above canvas */
|
|
622
|
+
--color-background-subtle: var(--color-ink-base); /* #0B1230 — nested rows / wells-lite */
|
|
623
|
+
--color-background-raised: var(--color-ink-raised);
|
|
624
|
+
--color-background-sunken: color-mix(in srgb, var(--color-pure-black) 28%, var(--color-ink-deep)); /* inputs / wells — deeper */
|
|
625
|
+
--color-background-hover: color-mix(in srgb, var(--color-pure-white) 6%, var(--color-ink-raised));
|
|
626
|
+
--color-background-press: color-mix(in srgb, var(--color-pure-white) 10%, var(--color-ink-raised));
|
|
627
|
+
--color-background-selected: var(--color-background-inverse-selected);
|
|
628
|
+
|
|
629
|
+
/* Enterprise primary is Navy (#002142) — near-ink, so it vanishes as a solid
|
|
630
|
+
fill on the dark canvas. Lift it to a visible deep-blue in dark (Business,
|
|
631
|
+
via [data-product=business], re-asserts its own #1F6FD6 and wins by order). */
|
|
632
|
+
--color-brand-solid: var(--color-brand-primary-400); /* #2F4F75 — reads on ink */
|
|
633
|
+
--color-brand-solid-hover: var(--color-brand-primary-300); /* #5F7596 */
|
|
634
|
+
--color-brand-solid-active: var(--color-brand-primary-500); /* settles to navy */
|
|
635
|
+
|
|
636
|
+
/* Inverse layer — stays distinct: a brand-tinted dark, lifted off the ambient ink */
|
|
637
|
+
--color-background-inverse: color-mix(in srgb, var(--color-brand-solid) 24%, var(--color-ink-base));
|
|
638
|
+
--color-background-inverse-surface: color-mix(in srgb, var(--color-brand-solid) 30%, var(--color-ink-raised));
|
|
639
|
+
--color-background-inverse-subtle: color-mix(in srgb, var(--color-brand-solid) 18%, var(--color-ink-deep));
|
|
640
|
+
|
|
641
|
+
/* Foreground — light on dark */
|
|
642
|
+
--color-foreground-default: var(--color-neutral-50);
|
|
643
|
+
--color-foreground-secondary: var(--color-neutral-300);
|
|
644
|
+
--color-foreground-muted: var(--color-neutral-400);
|
|
645
|
+
--color-foreground-placeholder: var(--color-neutral-600);
|
|
646
|
+
--color-foreground-accent: var(--color-brand-accent-400); /* Sky lightens on dark for contrast (light used accent-700) */
|
|
647
|
+
--color-foreground-highlight: var(--color-brand-accent-300); /* links on dark */
|
|
648
|
+
--color-foreground-brand: var(--color-brand-secondary-200);/* Navy is invisible on dark → light royal */
|
|
649
|
+
--color-foreground-disabled: var(--color-neutral-600);
|
|
650
|
+
/* --color-foreground-on-solid stays neutral-0 (white text on Royal/accent fills) */
|
|
651
|
+
|
|
652
|
+
/* Borders — white-alpha hairlines */
|
|
653
|
+
--color-border-subtle: color-mix(in srgb, var(--color-pure-white) 8%, transparent);
|
|
654
|
+
--color-border-default: color-mix(in srgb, var(--color-pure-white) 12%, transparent);
|
|
655
|
+
--color-border-strong: color-mix(in srgb, var(--color-pure-white) 20%, transparent);
|
|
656
|
+
/* focus / accent borders stay Sky-500 — reads well on dark */
|
|
657
|
+
|
|
658
|
+
/* Feedback pairs flip: light foreground + dark-tinted background */
|
|
659
|
+
--color-feedback-success-foreground: var(--color-success-300);
|
|
660
|
+
--color-feedback-success-background: color-mix(in srgb, var(--color-success-500) 18%, var(--color-ink-base));
|
|
661
|
+
--color-feedback-success-border: color-mix(in srgb, var(--color-success-500) 34%, transparent);
|
|
662
|
+
--color-feedback-warning-foreground: var(--color-warning-300);
|
|
663
|
+
--color-feedback-warning-background: color-mix(in srgb, var(--color-warning-500) 18%, var(--color-ink-base));
|
|
664
|
+
--color-feedback-warning-border: color-mix(in srgb, var(--color-warning-500) 34%, transparent);
|
|
665
|
+
--color-feedback-danger-foreground: var(--color-danger-300);
|
|
666
|
+
--color-feedback-danger-background: color-mix(in srgb, var(--color-danger-500) 18%, var(--color-ink-base));
|
|
667
|
+
--color-feedback-danger-border: color-mix(in srgb, var(--color-danger-500) 34%, transparent);
|
|
668
|
+
--color-feedback-info-foreground: var(--color-info-300);
|
|
669
|
+
--color-feedback-info-background: color-mix(in srgb, var(--color-info-500) 18%, var(--color-ink-base));
|
|
670
|
+
--color-feedback-info-border: color-mix(in srgb, var(--color-info-500) 34%, transparent);
|
|
671
|
+
|
|
672
|
+
/* Surface-top sheen reads wrong on dark → neutralize */
|
|
673
|
+
--grad-surface-top: linear-gradient(180deg, color-mix(in srgb, var(--color-pure-white) 6%, transparent) 0%, transparent 100%);
|
|
674
|
+
|
|
675
|
+
/* Data-viz categorical — lift the dark hues so every series reads on dark ink.
|
|
676
|
+
Ramps (seq/div) + structure follow the semantic tokens already remapped above. */
|
|
677
|
+
--dataviz-cat-1: #6B95FB; /* Royal 300 — 500 is invisible on dark */
|
|
678
|
+
--dataviz-cat-2: #7AB8FF; /* Sky, lightened */
|
|
679
|
+
--dataviz-cat-3: #2BC2B1; /* Teal, lightened */
|
|
680
|
+
--dataviz-cat-4: #E0AC45; /* Gold, lightened */
|
|
681
|
+
--dataviz-cat-5: #9385F2; /* Violet, lightened */
|
|
682
|
+
--dataviz-cat-6: #E87BA1; /* Rose, lightened */
|
|
683
|
+
--dataviz-cat-7: #3FC4DC; /* Cyan, lightened */
|
|
684
|
+
--dataviz-cat-8: #A6B0C4; /* Slate, lightened */
|
|
562
685
|
}
|
|
563
686
|
|
|
564
|
-
/* ============================================================
|
|
565
|
-
ATTRUS / Cabiros —
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
/* Ambient surfaces — dark ink ramp (canvas deepest → surface raised) */
|
|
580
|
-
--color-background-canvas: var(--color-ink-deep); /* #0A1128 — app background */
|
|
581
|
-
--color-background-surface: var(--color-ink-raised); /* #111A3D — cards sit above canvas */
|
|
582
|
-
--color-background-subtle: var(--color-ink-base); /* #0B1230 — nested rows / wells-lite */
|
|
583
|
-
--color-background-raised: var(--color-ink-raised);
|
|
584
|
-
--color-background-sunken: color-mix(in srgb, var(--color-pure-black) 28%, var(--color-ink-deep)); /* inputs / wells — deeper */
|
|
585
|
-
--color-background-hover: color-mix(in srgb, var(--color-pure-white) 6%, var(--color-ink-raised));
|
|
586
|
-
--color-background-press: color-mix(in srgb, var(--color-pure-white) 10%, var(--color-ink-raised));
|
|
587
|
-
--color-background-selected: var(--color-background-inverse-selected);
|
|
588
|
-
|
|
589
|
-
/* Inverse layer — stays distinct: a brand-tinted dark, lifted off the ambient ink */
|
|
590
|
-
--color-background-inverse: color-mix(in srgb, var(--color-brand-primary-500) 24%, var(--color-ink-base));
|
|
591
|
-
--color-background-inverse-surface: color-mix(in srgb, var(--color-brand-primary-500) 30%, var(--color-ink-raised));
|
|
592
|
-
--color-background-inverse-subtle: color-mix(in srgb, var(--color-brand-primary-500) 18%, var(--color-ink-deep));
|
|
593
|
-
|
|
594
|
-
/* Foreground — light on dark */
|
|
595
|
-
--color-foreground-default: var(--color-neutral-50);
|
|
596
|
-
--color-foreground-secondary: var(--color-neutral-300);
|
|
597
|
-
--color-foreground-muted: var(--color-neutral-400);
|
|
598
|
-
--color-foreground-placeholder: var(--color-neutral-600);
|
|
599
|
-
--color-foreground-accent: var(--color-brand-accent-400); /* Sky lightens on dark for contrast (light used accent-700) */
|
|
600
|
-
--color-foreground-highlight: var(--color-brand-accent-300); /* links on dark */
|
|
601
|
-
--color-foreground-brand: var(--color-brand-secondary-200);/* Navy is invisible on dark → light royal */
|
|
602
|
-
--color-foreground-disabled: var(--color-neutral-600);
|
|
603
|
-
/* --color-foreground-on-solid stays neutral-0 (white text on Royal/accent fills) */
|
|
604
|
-
|
|
605
|
-
/* Borders — white-alpha hairlines */
|
|
606
|
-
--color-border-subtle: color-mix(in srgb, var(--color-pure-white) 8%, transparent);
|
|
607
|
-
--color-border-default: color-mix(in srgb, var(--color-pure-white) 12%, transparent);
|
|
608
|
-
--color-border-strong: color-mix(in srgb, var(--color-pure-white) 20%, transparent);
|
|
609
|
-
/* focus / accent borders stay Sky-500 — reads well on dark */
|
|
610
|
-
|
|
611
|
-
/* Feedback pairs flip: light foreground + dark-tinted background */
|
|
612
|
-
--color-feedback-success-foreground: var(--color-success-300);
|
|
613
|
-
--color-feedback-success-background: color-mix(in srgb, var(--color-success-500) 18%, var(--color-ink-base));
|
|
614
|
-
--color-feedback-success-border: color-mix(in srgb, var(--color-success-500) 34%, transparent);
|
|
615
|
-
--color-feedback-warning-foreground: var(--color-warning-300);
|
|
616
|
-
--color-feedback-warning-background: color-mix(in srgb, var(--color-warning-500) 18%, var(--color-ink-base));
|
|
617
|
-
--color-feedback-warning-border: color-mix(in srgb, var(--color-warning-500) 34%, transparent);
|
|
618
|
-
--color-feedback-danger-foreground: var(--color-danger-300);
|
|
619
|
-
--color-feedback-danger-background: color-mix(in srgb, var(--color-danger-500) 18%, var(--color-ink-base));
|
|
620
|
-
--color-feedback-danger-border: color-mix(in srgb, var(--color-danger-500) 34%, transparent);
|
|
621
|
-
--color-feedback-info-foreground: var(--color-info-300);
|
|
622
|
-
--color-feedback-info-background: color-mix(in srgb, var(--color-info-500) 18%, var(--color-ink-base));
|
|
623
|
-
--color-feedback-info-border: color-mix(in srgb, var(--color-info-500) 34%, transparent);
|
|
624
|
-
|
|
625
|
-
/* Surface-top sheen reads wrong on dark → neutralize */
|
|
626
|
-
--grad-surface-top: linear-gradient(180deg, color-mix(in srgb, var(--color-pure-white) 6%, transparent) 0%, transparent 100%);
|
|
627
|
-
|
|
628
|
-
/* Data-viz categorical — lift the dark hues so every series reads on dark ink.
|
|
629
|
-
Ramps (seq/div) + structure follow the semantic tokens already remapped above. */
|
|
630
|
-
--dataviz-cat-1: #6B95FB; /* Royal 300 — 500 is invisible on dark */
|
|
631
|
-
--dataviz-cat-2: #7AB8FF; /* Sky, lightened */
|
|
632
|
-
--dataviz-cat-3: #2BC2B1; /* Teal, lightened */
|
|
633
|
-
--dataviz-cat-4: #E0AC45; /* Gold, lightened */
|
|
634
|
-
--dataviz-cat-5: #9385F2; /* Violet, lightened */
|
|
635
|
-
--dataviz-cat-6: #E87BA1; /* Rose, lightened */
|
|
636
|
-
--dataviz-cat-7: #3FC4DC; /* Cyan, lightened */
|
|
637
|
-
--dataviz-cat-8: #A6B0C4; /* Slate, lightened */
|
|
687
|
+
/* ============================================================
|
|
688
|
+
ATTRUS / Cabiros — SEMANTIC TYPE CLASSES (ready-to-use)
|
|
689
|
+
Base document styles + the display/heading/body/utility classes.
|
|
690
|
+
Consumes typography + color tokens (see ../tokens).
|
|
691
|
+
============================================================ */
|
|
692
|
+
|
|
693
|
+
html, body {
|
|
694
|
+
font-family: var(--font-sans);
|
|
695
|
+
font-size: var(--fs-base);
|
|
696
|
+
line-height: var(--lh-normal);
|
|
697
|
+
color: var(--color-foreground-default);
|
|
698
|
+
background: var(--color-background-canvas);
|
|
699
|
+
-webkit-font-smoothing: antialiased;
|
|
700
|
+
-moz-osx-font-smoothing: grayscale;
|
|
638
701
|
}
|
|
639
702
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
line-height: var(--lh-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
-
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
.
|
|
657
|
-
|
|
658
|
-
.
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
.
|
|
668
|
-
.
|
|
669
|
-
.
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
.
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
.
|
|
678
|
-
|
|
679
|
-
/* Utility text colors */
|
|
680
|
-
.fg-default { color: var(--color-foreground-default); }
|
|
681
|
-
.fg-secondary { color: var(--color-foreground-secondary); }
|
|
682
|
-
.color-foreground-muted { color: var(--color-foreground-muted); }
|
|
683
|
-
.fg-accent { color: var(--color-foreground-accent); }
|
|
684
|
-
.fg-highlight { color: var(--color-foreground-highlight); }
|
|
685
|
-
.fg-placeholder { color: var(--color-foreground-placeholder); }
|
|
686
|
-
|
|
687
|
-
/* Inverse layer helper — apply to any container to flip to dark */
|
|
688
|
-
.inverse {
|
|
689
|
-
background: var(--color-background-inverse);
|
|
690
|
-
color: var(--color-foreground-inverse-default);
|
|
691
|
-
}
|
|
692
|
-
.inverse .fg-secondary { color: var(--color-foreground-inverse-secondary); }
|
|
693
|
-
.inverse .color-foreground-muted { color: var(--color-foreground-inverse-muted); }
|
|
703
|
+
.display-xl { font-family: var(--font-display); font-weight: var(--w-black); font-size: var(--fs-8xl); line-height: var(--lh-tight); letter-spacing: var(--ls-display); }
|
|
704
|
+
.display-lg { font-family: var(--font-display); font-weight: var(--w-extrabold);font-size: var(--fs-7xl); line-height: var(--lh-tight); letter-spacing: var(--ls-display); }
|
|
705
|
+
.display { font-family: var(--font-display); font-weight: var(--w-bold); font-size: var(--fs-6xl); line-height: var(--lh-tight); letter-spacing: var(--ls-display); }
|
|
706
|
+
|
|
707
|
+
h1, .h1 { font-weight: var(--w-bold); font-size: var(--fs-5xl); line-height: var(--lh-tight); letter-spacing: var(--ls-display); }
|
|
708
|
+
h2, .h2 { font-weight: var(--w-bold); font-size: var(--fs-4xl); line-height: var(--lh-snug); letter-spacing: var(--ls-title); }
|
|
709
|
+
h3, .h3 { font-weight: var(--w-bold); font-size: var(--fs-3xl); line-height: var(--lh-snug); letter-spacing: var(--ls-title); }
|
|
710
|
+
h4, .h4 { font-weight: var(--w-semibold); font-size: var(--fs-2xl); line-height: var(--lh-snug); letter-spacing: var(--ls-title); }
|
|
711
|
+
h5, .h5 { font-weight: var(--w-semibold); font-size: var(--fs-xl); line-height: var(--lh-snug); letter-spacing: var(--ls-title); }
|
|
712
|
+
h6, .h6 { font-weight: var(--w-semibold); font-size: var(--fs-lg); line-height: var(--lh-snug); letter-spacing: var(--ls-body); }
|
|
713
|
+
|
|
714
|
+
.body-lg { font-size: var(--fs-lg); line-height: var(--lh-relaxed); }
|
|
715
|
+
.body { font-size: var(--fs-base);line-height: var(--lh-normal); }
|
|
716
|
+
.body-sm { font-size: var(--fs-md); line-height: var(--lh-normal); }
|
|
717
|
+
.caption { font-size: var(--fs-sm); line-height: var(--lh-normal); color: var(--color-foreground-muted); }
|
|
718
|
+
.overline { font-size: var(--fs-xs); line-height: var(--lh-normal); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); font-weight: var(--w-semibold); }
|
|
719
|
+
.label { font-size: var(--fs-sm); font-weight: var(--w-semibold); letter-spacing: var(--ls-label); }
|
|
720
|
+
|
|
721
|
+
.mono, code, pre, kbd { font-family: var(--font-mono); font-size: .92em; }
|
|
722
|
+
|
|
723
|
+
/* Numbers that must line up in tables */
|
|
724
|
+
.tabular { font-variant-numeric: tabular-nums; font-feature-settings: 'tnum' on, 'lnum' on; }
|
|
725
|
+
|
|
726
|
+
/* Utility text colors */
|
|
727
|
+
.fg-default { color: var(--color-foreground-default); }
|
|
728
|
+
.fg-secondary { color: var(--color-foreground-secondary); }
|
|
729
|
+
.color-foreground-muted { color: var(--color-foreground-muted); }
|
|
730
|
+
.fg-accent { color: var(--color-foreground-accent); }
|
|
731
|
+
.fg-highlight { color: var(--color-foreground-highlight); }
|
|
732
|
+
.fg-placeholder { color: var(--color-foreground-placeholder); }
|
|
733
|
+
|
|
734
|
+
/* Inverse layer helper — apply to any container to flip to dark */
|
|
735
|
+
.inverse {
|
|
736
|
+
background: var(--color-background-inverse);
|
|
737
|
+
color: var(--color-foreground-inverse-default);
|
|
738
|
+
}
|
|
739
|
+
.inverse .fg-secondary { color: var(--color-foreground-inverse-secondary); }
|
|
740
|
+
.inverse .color-foreground-muted { color: var(--color-foreground-inverse-muted); }
|
|
694
741
|
.inverse .fg-accent { color: var(--color-foreground-inverse-accent); }
|
|
695
742
|
|