|
61 | 61 | } |
62 | 62 | } |
63 | 63 |
|
| 64 | +/* ─── Brand palette ────────────────────────────────────────────────────────── |
| 65 | + * ObjectStack Account uses a violet → indigo brand gradient. |
| 66 | + * - `--brand-from` : violet (primary brand hue) |
| 67 | + * - `--brand-to` : indigo (gradient terminus) |
| 68 | + * `--primary` is wired to `--brand-from` so every default button, focus ring, |
| 69 | + * link colour and active-state automatically picks up the brand identity. |
| 70 | + * The composite gradients (`--brand-gradient`, `--brand-gradient-subtle`) are |
| 71 | + * intended for hero surfaces, the login split-screen panel and the page-header |
| 72 | + * banner. Tweak the two HSL triplets to re-skin the whole portal. |
| 73 | + */ |
64 | 74 | :root { |
65 | | - --radius: 0.625rem; |
| 75 | + --radius: 0.75rem; |
| 76 | + |
| 77 | + --brand-from: 262 83% 58%; |
| 78 | + --brand-to: 221 83% 53%; |
| 79 | + --brand-gradient: linear-gradient(135deg, hsl(var(--brand-from)), hsl(var(--brand-to))); |
| 80 | + --brand-gradient-subtle: linear-gradient( |
| 81 | + 135deg, |
| 82 | + hsl(var(--brand-from) / 0.08), |
| 83 | + hsl(var(--brand-to) / 0.08) |
| 84 | + ); |
| 85 | + |
66 | 86 | --background: 0 0% 100%; |
67 | 87 | --foreground: 240 10% 3.9%; |
68 | 88 | --card: 0 0% 100%; |
69 | 89 | --card-foreground: 240 10% 3.9%; |
70 | 90 | --popover: 0 0% 100%; |
71 | 91 | --popover-foreground: 240 10% 3.9%; |
72 | | - --primary: 240 5.9% 10%; |
| 92 | + --primary: var(--brand-from); |
73 | 93 | --primary-foreground: 0 0% 98%; |
74 | 94 | --secondary: 240 4.8% 95.9%; |
75 | 95 | --secondary-foreground: 240 5.9% 10%; |
76 | 96 | --muted: 240 4.8% 95.9%; |
77 | 97 | --muted-foreground: 240 3.8% 46.1%; |
78 | | - --accent: 240 4.8% 95.9%; |
79 | | - --accent-foreground: 240 5.9% 10%; |
| 98 | + --accent: 262 83% 96%; |
| 99 | + --accent-foreground: 262 60% 30%; |
80 | 100 | --destructive: 0 84.2% 60.2%; |
81 | 101 | --destructive-foreground: 0 0% 98%; |
82 | 102 | --border: 240 5.9% 90%; |
83 | 103 | --input: 240 5.9% 90%; |
84 | | - --ring: 240 5.9% 10%; |
85 | | - --chart-1: 12 76% 61%; |
86 | | - --chart-2: 173 58% 39%; |
87 | | - --chart-3: 197 37% 24%; |
| 104 | + --ring: var(--brand-from); |
| 105 | + --chart-1: 262 83% 58%; |
| 106 | + --chart-2: 221 83% 53%; |
| 107 | + --chart-3: 173 58% 39%; |
88 | 108 | --chart-4: 43 74% 66%; |
89 | 109 | --chart-5: 27 87% 67%; |
90 | | - --sidebar-background: 0 0% 98%; |
| 110 | + --sidebar-background: 0 0% 98.5%; |
91 | 111 | --sidebar-foreground: 240 5.3% 26.1%; |
92 | | - --sidebar-primary: 240 5.9% 10%; |
| 112 | + --sidebar-primary: var(--brand-from); |
93 | 113 | --sidebar-primary-foreground: 0 0% 98%; |
94 | | - --sidebar-accent: 240 4.8% 95.9%; |
95 | | - --sidebar-accent-foreground: 240 5.9% 10%; |
| 114 | + --sidebar-accent: 262 83% 96%; |
| 115 | + --sidebar-accent-foreground: 262 60% 30%; |
96 | 116 | --sidebar-border: 220 13% 91%; |
97 | | - --sidebar-ring: 240 5.9% 10%; |
| 117 | + --sidebar-ring: var(--brand-from); |
98 | 118 | } |
99 | 119 |
|
100 | 120 | .dark { |
101 | | - --background: 240 10% 3.9%; |
| 121 | + --background: 222 47% 6%; |
102 | 122 | --foreground: 0 0% 98%; |
103 | | - --card: 240 10% 3.9%; |
| 123 | + --card: 222 47% 8%; |
104 | 124 | --card-foreground: 0 0% 98%; |
105 | | - --popover: 240 10% 3.9%; |
| 125 | + --popover: 222 47% 8%; |
106 | 126 | --popover-foreground: 0 0% 98%; |
107 | | - --primary: 0 0% 98%; |
108 | | - --primary-foreground: 240 5.9% 10%; |
109 | | - --secondary: 240 3.7% 15.9%; |
| 127 | + --primary: 262 83% 68%; |
| 128 | + --primary-foreground: 222 47% 6%; |
| 129 | + --secondary: 222 32% 14%; |
110 | 130 | --secondary-foreground: 0 0% 98%; |
111 | | - --muted: 240 3.7% 15.9%; |
112 | | - --muted-foreground: 240 5% 64.9%; |
113 | | - --accent: 240 3.7% 15.9%; |
114 | | - --accent-foreground: 0 0% 98%; |
115 | | - --destructive: 0 62.8% 30.6%; |
| 131 | + --muted: 222 32% 14%; |
| 132 | + --muted-foreground: 220 9% 64%; |
| 133 | + --accent: 262 50% 20%; |
| 134 | + --accent-foreground: 262 80% 90%; |
| 135 | + --destructive: 0 62.8% 50%; |
116 | 136 | --destructive-foreground: 0 0% 98%; |
117 | | - --border: 240 3.7% 15.9%; |
118 | | - --input: 240 3.7% 15.9%; |
119 | | - --ring: 240 4.9% 83.9%; |
120 | | - --chart-1: 220 70% 50%; |
121 | | - --chart-2: 160 60% 45%; |
122 | | - --chart-3: 30 80% 55%; |
123 | | - --chart-4: 280 65% 60%; |
124 | | - --chart-5: 340 75% 55%; |
125 | | - --sidebar-background: 240 5.9% 10%; |
126 | | - --sidebar-foreground: 240 4.8% 95.9%; |
127 | | - --sidebar-primary: 224.3 76.3% 48%; |
128 | | - --sidebar-primary-foreground: 0 0% 100%; |
129 | | - --sidebar-accent: 240 3.7% 15.9%; |
130 | | - --sidebar-accent-foreground: 240 4.8% 95.9%; |
131 | | - --sidebar-border: 240 3.7% 15.9%; |
132 | | - --sidebar-ring: 240 4.9% 83.9%; |
| 137 | + --border: 222 32% 16%; |
| 138 | + --input: 222 32% 16%; |
| 139 | + --ring: 262 83% 68%; |
| 140 | + --chart-1: 262 83% 68%; |
| 141 | + --chart-2: 221 83% 63%; |
| 142 | + --chart-3: 173 58% 49%; |
| 143 | + --chart-4: 43 74% 66%; |
| 144 | + --chart-5: 27 87% 67%; |
| 145 | + --sidebar-background: 222 47% 7%; |
| 146 | + --sidebar-foreground: 220 9% 80%; |
| 147 | + --sidebar-primary: 262 83% 68%; |
| 148 | + --sidebar-primary-foreground: 222 47% 6%; |
| 149 | + --sidebar-accent: 262 50% 18%; |
| 150 | + --sidebar-accent-foreground: 262 80% 90%; |
| 151 | + --sidebar-border: 222 32% 14%; |
| 152 | + --sidebar-ring: 262 83% 68%; |
133 | 153 | } |
134 | 154 |
|
135 | 155 | @layer base { |
136 | 156 | * { |
137 | 157 | @apply border-border outline-ring/50; |
138 | 158 | } |
139 | 159 | body { |
140 | | - @apply bg-background text-foreground; |
| 160 | + @apply bg-background text-foreground antialiased; |
| 161 | + font-feature-settings: "rlig" 1, "calt" 1, "ss01" 1; |
| 162 | + } |
| 163 | +} |
| 164 | + |
| 165 | +@layer utilities { |
| 166 | + /* ─── Brand surface helpers ─────────────────────────────────────────────── |
| 167 | + * Apply on any element that should sit on the brand gradient (login hero |
| 168 | + * panel, top-bar logo tile, primary CTA, etc.). The `-subtle` variant is a |
| 169 | + * 8%-opacity wash for page headers and empty-state cards. |
| 170 | + */ |
| 171 | + .bg-brand-gradient { |
| 172 | + background-image: var(--brand-gradient); |
| 173 | + } |
| 174 | + .bg-brand-gradient-subtle { |
| 175 | + background-image: var(--brand-gradient-subtle); |
| 176 | + } |
| 177 | + .text-brand-gradient { |
| 178 | + background-image: var(--brand-gradient); |
| 179 | + -webkit-background-clip: text; |
| 180 | + background-clip: text; |
| 181 | + color: transparent; |
| 182 | + } |
| 183 | + .ring-brand { |
| 184 | + --tw-ring-color: hsl(var(--brand-from) / 0.35); |
141 | 185 | } |
| 186 | + |
| 187 | + /* Soft radial "spotlight" used on hero / empty-state surfaces. */ |
| 188 | + .bg-brand-spotlight { |
| 189 | + background-image: |
| 190 | + radial-gradient(ellipse 80% 50% at 50% -20%, hsl(var(--brand-from) / 0.18), transparent 60%), |
| 191 | + radial-gradient(ellipse 60% 50% at 100% 100%, hsl(var(--brand-to) / 0.18), transparent 60%); |
| 192 | + } |
| 193 | + |
| 194 | + /* Mesh/grid backdrop for the login split-screen brand column. */ |
| 195 | + .bg-brand-mesh { |
| 196 | + background-color: hsl(var(--brand-from)); |
| 197 | + background-image: |
| 198 | + radial-gradient(at 20% 20%, hsl(var(--brand-from)) 0%, transparent 50%), |
| 199 | + radial-gradient(at 80% 0%, hsl(var(--brand-to)) 0%, transparent 50%), |
| 200 | + radial-gradient(at 0% 80%, hsl(280 90% 60%) 0%, transparent 50%), |
| 201 | + radial-gradient(at 80% 80%, hsl(199 89% 48%) 0%, transparent 50%); |
| 202 | + } |
| 203 | +} |
| 204 | + |
| 205 | +/* ─── Page transition ──────────────────────────────────────────────────────── |
| 206 | + * Tiny fade-up applied to route content; opt in by adding `.page-enter` |
| 207 | + * to a wrapper around <Outlet/>. |
| 208 | + */ |
| 209 | +@keyframes page-enter { |
| 210 | + from { |
| 211 | + opacity: 0; |
| 212 | + transform: translateY(4px); |
| 213 | + } |
| 214 | + to { |
| 215 | + opacity: 1; |
| 216 | + transform: translateY(0); |
| 217 | + } |
| 218 | +} |
| 219 | + |
| 220 | +.page-enter { |
| 221 | + animation: page-enter 240ms cubic-bezier(0.16, 1, 0.3, 1); |
142 | 222 | } |
0 commit comments