@tapizlabs/ui 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/theme.css ADDED
@@ -0,0 +1,774 @@
1
+ @import "tailwindcss";
2
+
3
+ /* stylelint-disable */
4
+ @theme {
5
+ /* Grid Brutalism Electric Cyan + Signal Lime */
6
+ --color-ink-000: #050608;
7
+ --color-ink-100: #06080c;
8
+ --color-ink-200: #0c0f16;
9
+ --color-ink-300: #11151e;
10
+ --color-ink-400: #1d222d;
11
+ --color-ink-500: #262d3b;
12
+ --color-border: #1d2330;
13
+ --color-border-hi: #2a3346;
14
+ --color-txt-1: #f1f4f9;
15
+ --color-txt-2: #aab3c2;
16
+ --color-txt-3: #6b7686;
17
+ --color-txt-4: #7a8496;
18
+
19
+ /* Accent ramp electric cyan replaces Prussian Navy */
20
+ --color-primary-50: #e8fbff;
21
+ --color-primary-100: #c7f5ff;
22
+ --color-primary-200: #99eeff;
23
+ --color-primary-300: #5ee7ff;
24
+ --color-primary-400: #38d4f0;
25
+ --color-primary-500: #1eb5d4;
26
+ --color-primary-600: #1496b3;
27
+ --color-primary-700: #0e7088;
28
+ --color-primary-800: #0a4f60;
29
+ --color-primary-900: #062f3b;
30
+ --color-primary-950: #03161c;
31
+
32
+ /* Signal lime */
33
+ --color-signal-300: #e4ff66;
34
+ --color-signal-400: #d4ff3a;
35
+ --color-signal-500: #b8e620;
36
+
37
+ --color-warn: #ff7a4d;
38
+ --color-good: #4dd6a3;
39
+
40
+ /* Icon background for icon containers dark mode default */
41
+ --color-icon-bg: #03161c; /* = primary-950 */
42
+ /* btn-primary text color dark mode: black on bright cyan */
43
+ --btn-primary-color: #000;
44
+
45
+ --font-display: 'IBM Plex Sans', system-ui, sans-serif;
46
+ --font-body: 'IBM Plex Sans', system-ui, sans-serif;
47
+ --font-mono: 'IBM Plex Mono', ui-monospace, monospace;
48
+
49
+ /* Kill all rounding */
50
+ --radius-none: 0;
51
+ --radius-sm: 0;
52
+ --radius-md: 0;
53
+ --radius-lg: 0;
54
+ --radius-xl: 0;
55
+ --radius-2xl: 0;
56
+ --radius-full: 9999px;
57
+
58
+ /* Animations */
59
+ --animate-fade-in-up: fade-in-up 0.5s ease both;
60
+ --animate-fade-in-down: fade-in-down 0.4s ease both;
61
+ --animate-fade-in: fade-in 0.3s ease both;
62
+ --animate-fade-out: fade-out 0.25s ease both;
63
+ --animate-count-up: count-up 0.5s ease both;
64
+ --animate-slide-in-right: slide-in-right 0.35s ease both;
65
+ --animate-slide-in-left: slide-in-left 0.35s ease both;
66
+ --animate-scale-in: scale-in 0.3s cubic-bezier(0.34,1.56,0.64,1) both;
67
+ --animate-progress-fill: progress-fill 1s ease both;
68
+ --animate-pulse-soft: pulse-soft 2s ease-in-out infinite;
69
+ --animate-shake: shake 0.4s ease both;
70
+ --animate-bounce-in: bounce-in 0.5s cubic-bezier(0.34,1.56,0.64,1) both;
71
+ --animate-flip-in: flip-in 0.4s ease both;
72
+ --animate-blur-in: blur-in 0.35s ease both;
73
+ --animate-slide-up-fade: slide-up-fade 0.3s ease both;
74
+
75
+ @keyframes fade-in-up { from { opacity:0; transform:translateY(12px); } to { opacity:1; transform:translateY(0); } }
76
+ @keyframes fade-in-down { from { opacity:0; transform:translateY(-12px); } to { opacity:1; transform:translateY(0); } }
77
+ @keyframes fade-in { from { opacity:0; } to { opacity:1; } }
78
+ @keyframes fade-out { from { opacity:1; } to { opacity:0; } }
79
+ @keyframes count-up { from { opacity:0; transform:scale(0.85); } to { opacity:1; transform:scale(1); } }
80
+ @keyframes slide-in-right { from { opacity:0; transform:translateX(20px); } to { opacity:1; transform:translateX(0); } }
81
+ @keyframes slide-in-left { from { opacity:0; transform:translateX(-20px); } to { opacity:1; transform:translateX(0); } }
82
+ @keyframes scale-in { from { opacity:0; transform:scale(0.88); } to { opacity:1; transform:scale(1); } }
83
+ @keyframes progress-fill { from { width: 0%; } }
84
+ @keyframes pulse-soft { 0%,100% { opacity:1; } 50% { opacity:0.6; } }
85
+ @keyframes shake {
86
+ 0%,100% { transform:translateX(0); } 20% { transform:translateX(-6px); }
87
+ 40% { transform:translateX(6px); } 60% { transform:translateX(-4px); }
88
+ 80% { transform:translateX(4px); }
89
+ }
90
+ @keyframes bounce-in { from { opacity:0; transform:scale(0.7); } to { opacity:1; transform:scale(1); } }
91
+ @keyframes flip-in { from { opacity:0; transform:rotateX(-30deg) translateY(8px); } to { opacity:1; transform:rotateX(0deg) translateY(0); } }
92
+ @keyframes blur-in { from { opacity:0; filter:blur(6px); transform:scale(0.97); } to { opacity:1; filter:blur(0px); transform:scale(1); } }
93
+ @keyframes slide-up-fade { from { opacity:0; transform:translateY(6px); } to { opacity:1; transform:translateY(0); } }
94
+ @keyframes accordion-open { from { grid-template-rows: 0fr; opacity: 0; } to { grid-template-rows: 1fr; opacity: 1; } }
95
+ @keyframes accordion-close { from { grid-template-rows: 1fr; opacity: 1; } to { grid-template-rows: 0fr; opacity: 0; } }
96
+ @keyframes tz-pulse { 0%,100% { opacity:1; } 50% { opacity:.35; } }
97
+ @keyframes tz-bar-grow { from { transform:scaleY(0); } to { transform:scaleY(1); } }
98
+ @keyframes skeleton-shimmer { 0% { background-position:-400px 0; } 100% { background-position:400px 0; } }
99
+ @keyframes slowSlideFade {
100
+ 0% { transform:translateX(-120px); opacity:0; }
101
+ 15% { transform:translateX(-80px); opacity:1; }
102
+ 85% { transform:translateX(80px); opacity:1; }
103
+ 100% { transform:translateX(120px); opacity:0; }
104
+ }
105
+ @keyframes thinPulse {
106
+ 0%,100% { box-shadow:0 0 4px rgba(94,231,255,.15); background:rgba(94,231,255,.05); width:70px; height:2px; }
107
+ 50% { box-shadow:0 0 14px rgba(94,231,255,.4); background:rgba(94,231,255,.15); width:90px; height:3px; }
108
+ }
109
+ }
110
+
111
+ .cmd-input::placeholder { color: var(--color-txt-4); opacity: 1; }
112
+ .cmd-input::selection { background: rgba(94,231,255,0.15); }
113
+
114
+ /*
115
+ LIGHT MODE OVERRIDES
116
+ */
117
+ html:not(.dark) {
118
+ --color-ink-000: #ffffff;
119
+ --color-ink-100: #f5f6f8;
120
+ --color-ink-200: #ebedf1;
121
+ --color-ink-300: #dde0e8;
122
+ --color-ink-400: #cdd1db;
123
+ --color-ink-500: #b8bec9;
124
+ --color-border: #d8dce6;
125
+ --color-border-hi: #c4c9d6;
126
+ --color-txt-1: #0d1117;
127
+ --color-txt-2: #3a4255;
128
+ --color-txt-3: #6b7280;
129
+ --color-txt-4: #6b7280;
130
+
131
+ /* Shift primary accent slightly darker for light bg readability */
132
+ --color-primary-300: #0ea5c9;
133
+ --color-primary-400: #0891b2;
134
+ --color-primary-500: #0e7490;
135
+
136
+ /* Signal lime stays vivid but darkened for contrast */
137
+ --color-signal-300: #65a30d;
138
+ --color-signal-400: #4d7c0f;
139
+ --color-signal-500: #3f6212;
140
+
141
+ --color-warn: #dc4f1e;
142
+ --color-good: #059669;
143
+
144
+ /* Icon background light tint of primary for icon containers */
145
+ --color-icon-bg: color-mix(in srgb, var(--color-primary-300) 12%, var(--color-ink-200));
146
+
147
+ /* btn-primary text: black on dark (cyan bg), white on light (darker cyan bg) */
148
+ --btn-primary-color: #fff;
149
+ }
150
+
151
+ /*
152
+ BASE
153
+ */
154
+ @layer base {
155
+ *, ::after, ::before, ::backdrop, ::file-selector-button {
156
+ border-color: var(--color-border, currentcolor);
157
+ border-radius: 0 !important;
158
+ }
159
+
160
+ html {
161
+ font-family: var(--font-body);
162
+ letter-spacing: 0;
163
+ -webkit-font-smoothing: antialiased;
164
+ background: var(--color-ink-100);
165
+ color: var(--color-txt-1);
166
+ }
167
+
168
+ body {
169
+ background: var(--color-ink-100);
170
+ color: var(--color-txt-1);
171
+ font-family: var(--font-body);
172
+ }
173
+
174
+ h1, h2, h3, h4 {
175
+ font-family: var(--font-display);
176
+ font-weight: 600;
177
+ letter-spacing: 0;
178
+ }
179
+
180
+ [class*="rounded"] { border-radius: 0 !important; }
181
+
182
+ html *:not([class*="animate-"]):not(.sliding-logo):not(.pulse-line) {
183
+ transition:
184
+ background-color 0.15s ease,
185
+ border-color 0.15s ease,
186
+ color 0.12s ease,
187
+ transform 0.15s ease;
188
+ }
189
+
190
+ /* Surface mapping */
191
+ .bg-white { background-color: var(--color-ink-200) !important; }
192
+ .bg-gray-50 { background-color: var(--color-ink-100) !important; }
193
+ .bg-gray-100 { background-color: var(--color-ink-300) !important; }
194
+ .bg-gray-200 { background-color: var(--color-ink-400) !important; }
195
+
196
+ .border-gray-100,
197
+ .border-gray-200,
198
+ .border-gray-300 { border-color: var(--color-border) !important; }
199
+ hr { border-color: var(--color-border) !important; }
200
+
201
+ .text-gray-900, .text-gray-800 { color: var(--color-txt-1) !important; }
202
+ .text-gray-700, .text-gray-600 { color: var(--color-txt-2) !important; }
203
+ .text-gray-500, .text-gray-400 { color: var(--color-txt-3) !important; }
204
+ .text-gray-300 { color: var(--color-txt-4) !important; }
205
+
206
+ .hover\:bg-gray-50:hover { background-color: var(--color-ink-300) !important; }
207
+ .hover\:bg-gray-100:hover { background-color: var(--color-ink-400) !important; }
208
+ .hover\:text-gray-900:hover,
209
+ .hover\:text-gray-800:hover { color: var(--color-txt-1) !important; }
210
+ .hover\:text-gray-600:hover { color: var(--color-txt-2) !important; }
211
+
212
+ /* Kill shadows */
213
+ .shadow-sm, .shadow-md, .shadow-xl, .shadow-2xl { box-shadow: none !important; }
214
+
215
+ /* Inputs */
216
+ input, textarea {
217
+ background-color: var(--color-ink-100) !important;
218
+ border-color: var(--color-border-hi) !important;
219
+ color: var(--color-txt-1) !important;
220
+ }
221
+ input::placeholder, textarea::placeholder { color: var(--color-txt-4) !important; }
222
+ input:focus, textarea:focus {
223
+ border-color: var(--color-primary-300) !important;
224
+ box-shadow: inset 3px 0 0 0 var(--color-signal-400), 0 0 0 1px var(--color-primary-300) !important;
225
+ outline: none !important;
226
+ }
227
+ .cmd-input:focus {
228
+ border-color: transparent !important;
229
+ box-shadow: none !important;
230
+ outline: none !important;
231
+ }
232
+
233
+ /* Tables */
234
+ table { color: var(--color-txt-2) !important; }
235
+ thead, thead tr { background-color: var(--color-ink-300) !important; }
236
+ thead th {
237
+ background-color: var(--color-ink-300) !important;
238
+ color: var(--color-txt-3) !important;
239
+ border-color: var(--color-border) !important;
240
+ font-family: var(--font-mono);
241
+ font-size: 10px;
242
+ letter-spacing: 0.18em;
243
+ text-transform: uppercase;
244
+ font-weight: 500;
245
+ }
246
+ tbody tr { background-color: var(--color-ink-200) !important; border-color: var(--color-border) !important; }
247
+ tbody tr:nth-child(even) { background-color: var(--color-ink-100) !important; }
248
+ tbody tr:hover { background-color: var(--color-ink-300) !important; }
249
+ tbody td, tbody th { color: var(--color-txt-2) !important; border-color: var(--color-border) !important; }
250
+
251
+ /* Cards */
252
+ .card, .stat-card {
253
+ background-color: var(--color-ink-200) !important;
254
+ border-color: var(--color-border) !important;
255
+ box-shadow: none !important;
256
+ }
257
+ header:not(.landing-nav) { background-color: var(--color-ink-200) !important; border-color: var(--color-border) !important; }
258
+
259
+ /* Primary cyan overrides */
260
+ .bg-primary-50 { background-color: color-mix(in srgb, var(--color-primary-300) 8%, var(--color-ink-300)) !important; }
261
+ .bg-primary-100 { background-color: color-mix(in srgb, var(--color-primary-300) 14%, var(--color-ink-300)) !important; }
262
+ .bg-primary-200 { background-color: color-mix(in srgb, var(--color-primary-300) 22%, var(--color-ink-300)) !important; }
263
+ .bg-primary-500 { background-color: var(--color-primary-300) !important; }
264
+ .bg-primary-600 { background-color: var(--color-primary-400) !important; }
265
+ .bg-primary-700 { background-color: var(--color-primary-300) !important; color: #fff !important; }
266
+ .bg-primary-800 { background-color: var(--color-primary-400) !important; }
267
+ .bg-primary-900 { background-color: var(--color-primary-600) !important; }
268
+
269
+ .text-primary-800, .text-primary-700 { color: var(--color-primary-300) !important; }
270
+ .text-primary-600, .text-primary-500 { color: var(--color-primary-400) !important; }
271
+ .text-primary-400 { color: var(--color-primary-500) !important; }
272
+ .text-primary-50 { color: #000 !important; }
273
+
274
+ .border-primary-100 { border-color: color-mix(in srgb, var(--color-primary-300) 35%, transparent) !important; }
275
+ .border-primary-200 { border-color: var(--color-border-hi) !important; }
276
+ .border-primary-300 { border-color: var(--color-primary-300) !important; }
277
+ .border-primary-500 { border-color: var(--color-primary-300) !important; }
278
+ .border-primary-600 { border-color: var(--color-primary-400) !important; }
279
+
280
+ .hover\:bg-primary-50:hover { background-color: var(--color-ink-300) !important; }
281
+ .hover\:bg-primary-100:hover { background-color: var(--color-ink-300) !important; }
282
+ .hover\:bg-primary-200:hover { background-color: var(--color-ink-400) !important; }
283
+ .hover\:bg-primary-800:hover { background-color: var(--color-primary-400) !important; }
284
+ .hover\:text-primary-700:hover { color: var(--color-primary-300) !important; }
285
+ .hover\:text-primary-600:hover { color: var(--color-primary-400) !important; }
286
+ .hover\:border-primary-300:hover { border-color: var(--color-primary-300) !important; }
287
+
288
+ .group:hover .group-hover\:text-primary-600 { color: var(--color-primary-300) !important; }
289
+ [class*="bg-primary-50"][class*="text-primary"] {
290
+ color: var(--color-primary-400) !important;
291
+ }
292
+
293
+ /* Emerald signal lime */
294
+ .bg-emerald-400, .bg-green-400 { background-color: var(--color-signal-400) !important; }
295
+ .text-emerald-600, .text-green-600 { color: var(--color-good) !important; }
296
+ .animate-pulse { animation: tz-pulse 1.8s ease-in-out infinite !important; }
297
+
298
+ /* Red/danger */
299
+ .text-red-600 { color: var(--color-warn) !important; }
300
+ .bg-red-50 { background-color: rgba(255,122,77,.08) !important; }
301
+ .border-red-100 { border-color: rgba(255,122,77,.2) !important; }
302
+ .text-red-700 { color: var(--color-warn) !important; }
303
+ .hover\:bg-red-50:hover { background-color: rgba(255,122,77,.12) !important; }
304
+
305
+ /* Role badge */
306
+ .bg-primary-500.text-primary-50 {
307
+ background-color: transparent !important;
308
+ border: 1px solid var(--color-primary-300) !important;
309
+ color: var(--color-primary-300) !important;
310
+ font-family: var(--font-mono);
311
+ font-size: 9px;
312
+ letter-spacing: 0.15em;
313
+ text-transform: uppercase;
314
+ }
315
+
316
+ /* Zinc / Slate / Stone */
317
+ .bg-zinc-50, .bg-slate-50, .bg-stone-50 { background-color: var(--color-ink-100) !important; }
318
+ .bg-zinc-100, .bg-slate-100, .bg-stone-100 { background-color: var(--color-ink-200) !important; }
319
+ .bg-zinc-200, .bg-slate-200 { background-color: var(--color-ink-300) !important; }
320
+ .border-zinc-100, .border-slate-100, .border-zinc-200, .border-slate-200 { border-color: var(--color-border) !important; }
321
+ .text-zinc-900,.text-slate-900,.text-zinc-700,.text-slate-700 { color: var(--color-txt-1) !important; }
322
+ .text-zinc-600,.text-slate-600,.text-zinc-500,.text-slate-500 { color: var(--color-txt-3) !important; }
323
+
324
+ /* Select */
325
+ select {
326
+ display: block;
327
+ background-color: var(--color-ink-100) !important;
328
+ border: 1px solid var(--color-border-hi) !important;
329
+ border-radius: 0 !important;
330
+ font-size: 0.875rem;
331
+ color: var(--color-txt-1) !important;
332
+ appearance: none;
333
+ -webkit-appearance: none;
334
+ padding-right: 2.25rem !important;
335
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%235ee7ff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E") !important;
336
+ background-repeat: no-repeat !important;
337
+ background-position: right 0.65rem center !important;
338
+ background-size: 1rem 1rem !important;
339
+ background-origin: padding-box !important;
340
+ }
341
+ select::-ms-expand { display: none; }
342
+ select option {
343
+ background: var(--color-ink-200);
344
+ color: var(--color-txt-1);
345
+ }
346
+ select:focus {
347
+ outline: none;
348
+ border-color: var(--color-primary-300) !important;
349
+ box-shadow: inset 3px 0 0 0 var(--color-signal-400) !important;
350
+ }
351
+ select:disabled { opacity: 0.4; cursor: not-allowed; }
352
+ }
353
+
354
+ /*
355
+ DARK MODE primary surface overrides
356
+ */
357
+ html.dark .bg-primary-50 { background-color: var(--color-primary-950) !important; }
358
+ html.dark .bg-primary-100 { background-color: color-mix(in srgb, var(--color-primary-300) 5%, var(--color-ink-200)) !important; }
359
+ html.dark .bg-primary-200 { background-color: color-mix(in srgb, var(--color-primary-300) 10%, var(--color-ink-200)) !important; }
360
+ html.dark .border-primary-100 { border-color: color-mix(in srgb, var(--color-primary-300) 12%, transparent) !important; }
361
+ html.dark .text-primary-700,
362
+ html.dark .text-primary-800 { color: var(--color-primary-300) !important; }
363
+
364
+ /*
365
+ KICKER
366
+ */
367
+ .kicker {
368
+ font-family: var(--font-mono);
369
+ font-size: 10px;
370
+ letter-spacing: 0.18em;
371
+ text-transform: uppercase;
372
+ font-weight: 500;
373
+ color: var(--color-txt-3);
374
+ }
375
+
376
+ .font-mono { font-family: var(--font-mono) !important; }
377
+ .font-display { font-family: var(--font-display) !important; }
378
+
379
+ /* Grid background */
380
+ .grid-bg {
381
+ background-image:
382
+ linear-gradient(var(--color-border) 1px, transparent 1px),
383
+ linear-gradient(90deg, var(--color-border) 1px, transparent 1px);
384
+ background-size: 24px 24px;
385
+ background-position: -1px -1px;
386
+ }
387
+
388
+ .tz-pulse { animation: tz-pulse 1.8s ease-in-out infinite; }
389
+ .tz-bar { transform-origin: bottom; animation: tz-bar-grow .6s cubic-bezier(.4,1.4,.4,1) both; }
390
+
391
+ /*
392
+ UTILITIES
393
+ */
394
+ @utility btn-primary {
395
+ display: inline-flex;
396
+ align-items: center;
397
+ justify-content: center;
398
+ padding: 0.5rem 1rem;
399
+ background: var(--color-primary-300);
400
+ color: var(--btn-primary-color);
401
+ font-family: var(--font-display);
402
+ font-size: 0.875rem;
403
+ font-weight: 600;
404
+ border-radius: 0 !important;
405
+ box-shadow: 4px 4px 0 0 var(--color-signal-400);
406
+ cursor: pointer;
407
+ &:hover { transform: translate(-1px,-1px); box-shadow: 6px 6px 0 0 var(--color-signal-400); }
408
+ &:active { transform: translate(1px,1px); box-shadow: 2px 2px 0 0 var(--color-signal-400); }
409
+ &:disabled { opacity: 0.4; cursor: not-allowed; transform: none; box-shadow: none; }
410
+ }
411
+
412
+ @utility btn-secondary {
413
+ display: inline-flex;
414
+ align-items: center;
415
+ justify-content: center;
416
+ padding: 0.5rem 1rem;
417
+ background: transparent;
418
+ color: var(--color-txt-2);
419
+ font-family: var(--font-mono);
420
+ font-size: 0.875rem;
421
+ font-weight: 500;
422
+ border: 1px solid var(--color-border-hi);
423
+ border-radius: 0 !important;
424
+ cursor: pointer;
425
+ &:hover { color: var(--color-txt-1); border-color: var(--color-primary-300); }
426
+ &:active { background: var(--color-ink-300); }
427
+ &:disabled { opacity: 0.4; cursor: not-allowed; }
428
+ }
429
+
430
+ @utility btn-danger {
431
+ display: inline-flex;
432
+ align-items: center;
433
+ justify-content: center;
434
+ background: transparent;
435
+ color: var(--color-warn);
436
+ font-family: var(--font-mono);
437
+ border: 1px solid var(--color-warn);
438
+ border-radius: 0 !important;
439
+ cursor: pointer;
440
+ &:hover { background: rgba(255,122,77,.12); }
441
+ }
442
+
443
+ @utility input-field {
444
+ display: block;
445
+ width: 100%;
446
+ padding: 0.625rem 0.875rem;
447
+ background: var(--color-ink-100);
448
+ border: 1px solid var(--color-border-hi);
449
+ border-radius: 0 !important;
450
+ font-size: 0.875rem;
451
+ color: var(--color-txt-1);
452
+ outline: none;
453
+ &::placeholder { color: var(--color-txt-4); }
454
+ &:focus {
455
+ border-color: var(--color-primary-300);
456
+ box-shadow: inset 3px 0 0 0 var(--color-signal-400);
457
+ }
458
+ }
459
+
460
+ @utility skeleton {
461
+ border-radius: 0 !important;
462
+ background: linear-gradient(90deg, var(--color-ink-300) 25%, var(--color-ink-400) 50%, var(--color-ink-300) 75%);
463
+ background-size: 800px 100%;
464
+ animation: skeleton-shimmer 1.5s infinite linear;
465
+ }
466
+
467
+ @utility card {
468
+ background: var(--color-ink-200);
469
+ border: 1px solid var(--color-border);
470
+ border-radius: 0 !important;
471
+ box-shadow: none;
472
+ padding: 1.25rem;
473
+ }
474
+
475
+ @utility form-panel {
476
+ background: var(--color-ink-200);
477
+ border: 1px solid var(--color-border-hi);
478
+ border-top: 2px solid var(--color-primary-300);
479
+ border-radius: 0 !important;
480
+ box-shadow: none;
481
+ padding: 1.25rem;
482
+ }
483
+
484
+ @utility stat-card {
485
+ background: var(--color-ink-200);
486
+ border: 1px solid var(--color-border);
487
+ border-radius: 0 !important;
488
+ box-shadow: none;
489
+ padding: 1.25rem;
490
+ display: flex;
491
+ flex-direction: column;
492
+ gap: 0.25rem;
493
+ }
494
+
495
+ @utility label {
496
+ display: block;
497
+ font-size: 0.875rem;
498
+ font-weight: 500;
499
+ margin-bottom: 0.375rem;
500
+ color: var(--color-txt-2);
501
+ }
502
+
503
+ @utility hover-lift {
504
+ &:hover { transform: translate(-1px, -1px); }
505
+ }
506
+ @utility card-hover {
507
+ &:hover { transform: translate(-1px, -1px); border-color: var(--color-primary-300) !important; }
508
+ }
509
+
510
+ @utility animate-delay-50 { animation-delay: 50ms; }
511
+ @utility animate-delay-100 { animation-delay: 100ms; }
512
+ @utility animate-delay-150 { animation-delay: 150ms; }
513
+ @utility animate-delay-200 { animation-delay: 200ms; }
514
+ @utility animate-delay-250 { animation-delay: 250ms; }
515
+ @utility animate-delay-300 { animation-delay: 300ms; }
516
+ @utility animate-delay-350 { animation-delay: 350ms; }
517
+ @utility animate-delay-400 { animation-delay: 400ms; }
518
+ @utility animate-delay-500 { animation-delay: 500ms; }
519
+ @utility animate-delay-600 { animation-delay: 600ms; }
520
+ @utility animate-delay-700 { animation-delay: 700ms; }
521
+
522
+ /*
523
+ AUTH PANEL
524
+ */
525
+ .auth-panel-bg {
526
+ background: var(--color-ink-200);
527
+ background-image:
528
+ linear-gradient(var(--color-border) 1px, transparent 1px),
529
+ linear-gradient(90deg, var(--color-border) 1px, transparent 1px);
530
+ background-size: 24px 24px;
531
+ }
532
+ .auth-panel-sweep { background: none !important; }
533
+
534
+ /*
535
+ MOBILE NAV
536
+ */
537
+ .mobile-nav-bar {
538
+ background: rgba(12,15,22,0.35) !important;
539
+ border-top-color: var(--color-border) !important;
540
+ }
541
+ html:not(.dark) .mobile-nav-bar {
542
+ background: rgba(235,237,241,0.85) !important;
543
+ }
544
+
545
+ /*
546
+ LIGHT MODE PATCHES
547
+ */
548
+ html:not(.dark) {
549
+ /* Select chevron in darker cyan for light backgrounds */
550
+ select {
551
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%230ea5c9' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E") !important;
552
+ }
553
+
554
+ /* Skeleton shimmer on light */
555
+ .skeleton, [class*="skeleton"] {
556
+ background: linear-gradient(90deg, var(--color-ink-300) 25%, var(--color-ink-400) 50%, var(--color-ink-300) 75%) !important;
557
+ }
558
+
559
+ /* Red tints */
560
+ .bg-red-50 { background-color: rgba(220,79,30,.07) !important; }
561
+ .border-red-100 { border-color: rgba(220,79,30,.2) !important; }
562
+ .hover\:bg-red-50:hover { background-color: rgba(220,79,30,.10) !important; }
563
+
564
+ /* btn-primary shadow in light uses same signal lime, keep */
565
+ .btn-secondary:active { background: var(--color-ink-300) !important; }
566
+
567
+ /* Role badge */
568
+ .bg-primary-500.text-primary-50 {
569
+ border-color: var(--color-primary-400) !important;
570
+ color: var(--color-primary-400) !important;
571
+ }
572
+ }
573
+
574
+ /* Logo on light theme keep bg dark so white squares stay visible */
575
+ html:not(.dark) .light-logo {
576
+ background-color: var(--color-primary-700) !important;
577
+ color: #fff !important;
578
+ }
579
+
580
+ /* Landing page respects global theme */
581
+ .landing-shell {
582
+ background: var(--color-ink-100);
583
+ color: var(--color-txt-1);
584
+ }
585
+ .landing-shell section,
586
+ .landing-shell footer {
587
+ background: var(--color-ink-100) !important;
588
+ }
589
+ .landing-shell [class*="border-white/"] {
590
+ border-color: var(--color-border) !important;
591
+ }
592
+ .landing-shell [class*="bg-white/"] {
593
+ background-color: var(--color-ink-300) !important;
594
+ }
595
+ .landing-shell [class*="shadow"] {
596
+ box-shadow: none !important;
597
+ }
598
+ .landing-shell [class*="tracking-tight"],
599
+ .landing-shell [class*="tracking-tighter"] {
600
+ letter-spacing: 0 !important;
601
+ }
602
+ .landing-shell .landing-accent {
603
+ color: var(--color-primary-300) !important;
604
+ }
605
+ /* Dashboard mockup illustration always dark regardless of theme */
606
+ .dashboard-mockup-wrapper {
607
+ --color-ink-000: #050608;
608
+ --color-ink-100: #06080c;
609
+ --color-border: #1d2330;
610
+ --color-txt-1: #f1f4f9;
611
+ --color-txt-3: #6b7686;
612
+ --color-primary-300: #5ee7ff;
613
+ }
614
+
615
+ /* Landing text/bg overrides in light mode for any remaining hardcoded white classes */
616
+ html:not(.dark) .landing-shell .text-white { color: var(--color-txt-1) !important; }
617
+ html:not(.dark) .landing-shell .text-white\/90,
618
+ html:not(.dark) .landing-shell .text-white\/80,
619
+ html:not(.dark) .landing-shell .text-white\/70,
620
+ html:not(.dark) .landing-shell .text-white\/65,
621
+ html:not(.dark) .landing-shell .text-white\/60 { color: var(--color-txt-2) !important; }
622
+ html:not(.dark) .landing-shell .text-white\/50,
623
+ html:not(.dark) .landing-shell .text-white\/45,
624
+ html:not(.dark) .landing-shell .text-white\/40,
625
+ html:not(.dark) .landing-shell .text-white\/35,
626
+ html:not(.dark) .landing-shell .text-white\/30,
627
+ html:not(.dark) .landing-shell .text-white\/25 { color: var(--color-txt-3) !important; }
628
+ html:not(.dark) .landing-shell .text-white\/20,
629
+ html:not(.dark) .landing-shell .text-white\/15,
630
+ html:not(.dark) .landing-shell .text-white\/10 { color: var(--color-txt-4) !important; }
631
+ html:not(.dark) .landing-shell .bg-black\/40,
632
+ html:not(.dark) .landing-shell .bg-black\/60 { background-color: rgba(235,237,241,0.9) !important; }
633
+ html:not(.dark) .landing-shell .border-white\/10,
634
+ html:not(.dark) .landing-shell .border-white\/15,
635
+ html:not(.dark) .landing-shell .border-white\/20 { border-color: var(--color-border) !important; }
636
+ /* Landing navbar white background in light mode */
637
+ html:not(.dark) .landing-nav {
638
+ --color-ink-100: #ffffff;
639
+ --color-ink-200: #ffffff;
640
+ }
641
+
642
+ /* Any remaining inline dark backgrounds via utility classes */
643
+ html:not(.dark) .landing-shell .bg-white\/3,
644
+ html:not(.dark) .landing-shell .bg-white\/4,
645
+ html:not(.dark) .landing-shell .bg-white\/5 { background-color: var(--color-ink-200) !important; }
646
+
647
+ /*
648
+ LOADING SCREEN
649
+ */
650
+ .track {
651
+ position: relative; width: 280px; height: 60px;
652
+ display: flex; align-items: center; justify-content: center; overflow: visible;
653
+ }
654
+ .pulse-line {
655
+ position: absolute; width: 70px; height: 2px;
656
+ background: rgba(94,231,255,.05);
657
+ animation: thinPulse 3.5s ease-in-out infinite; z-index: 1;
658
+ }
659
+ .sliding-logo { position: relative; z-index: 2; animation: slowSlideFade 5s ease-in-out infinite; }
660
+ .sliding-logo > div { transition: all 0.3s ease; }
661
+
662
+ /*
663
+ MISC
664
+ */
665
+ .fade-in { animation: fade-in 0.2s ease-out; }
666
+
667
+ ::-webkit-scrollbar { width:0 !important; height:0 !important; background:transparent !important; }
668
+ ::-webkit-scrollbar-button { display:none !important; }
669
+ ::-webkit-scrollbar-track,
670
+ ::-webkit-scrollbar-thumb,
671
+ ::-webkit-scrollbar-corner { background:transparent !important; display:none !important; }
672
+ * { scrollbar-width:none !important; -ms-overflow-style:none !important; }
673
+
674
+ /*
675
+ TIPTAP EDITOR
676
+ */
677
+ .tiptap-editor .ProseMirror,
678
+ .tiptap-readonly .ProseMirror {
679
+ outline: none;
680
+ color: var(--color-txt-1);
681
+ font-size: 0.875rem;
682
+ line-height: 1.7;
683
+ }
684
+
685
+ .tiptap-editor .ProseMirror p.is-editor-empty:first-child::before {
686
+ content: attr(data-placeholder);
687
+ color: var(--color-txt-4);
688
+ pointer-events: none;
689
+ float: left;
690
+ height: 0;
691
+ }
692
+
693
+ /* Headings */
694
+ .tiptap-editor .ProseMirror h1,
695
+ .tiptap-readonly .ProseMirror h1 { font-size: 1.4rem; font-weight: 700; margin: 1rem 0 0.5rem; color: var(--color-txt-1); font-family: var(--font-display); }
696
+ .tiptap-editor .ProseMirror h2,
697
+ .tiptap-readonly .ProseMirror h2 { font-size: 1.15rem; font-weight: 600; margin: 0.9rem 0 0.4rem; color: var(--color-txt-1); font-family: var(--font-display); }
698
+ .tiptap-editor .ProseMirror h3,
699
+ .tiptap-readonly .ProseMirror h3 { font-size: 1rem; font-weight: 600; margin: 0.75rem 0 0.35rem; color: var(--color-txt-2); font-family: var(--font-display); }
700
+
701
+ /* Paragraph */
702
+ .tiptap-editor .ProseMirror p,
703
+ .tiptap-readonly .ProseMirror p { margin: 0 0 0.5rem; }
704
+
705
+ /* Lists */
706
+ .tiptap-editor .ProseMirror ul,
707
+ .tiptap-readonly .ProseMirror ul { list-style: disc; padding-left: 1.4rem; margin: 0.4rem 0; }
708
+ .tiptap-editor .ProseMirror ol,
709
+ .tiptap-readonly .ProseMirror ol { list-style: decimal; padding-left: 1.4rem; margin: 0.4rem 0; }
710
+ .tiptap-editor .ProseMirror li,
711
+ .tiptap-readonly .ProseMirror li { margin: 0.15rem 0; }
712
+
713
+ /* Blockquote */
714
+ .tiptap-editor .ProseMirror blockquote,
715
+ .tiptap-readonly .ProseMirror blockquote {
716
+ border-left: 3px solid var(--color-primary-300);
717
+ margin: 0.6rem 0;
718
+ padding: 0.4rem 0 0.4rem 1rem;
719
+ color: var(--color-txt-3);
720
+ background: rgba(94,231,255,0.04);
721
+ }
722
+
723
+ /* Inline code */
724
+ .tiptap-editor .ProseMirror code,
725
+ .tiptap-readonly .ProseMirror code {
726
+ font-family: var(--font-mono);
727
+ font-size: 0.82em;
728
+ background: rgba(94,231,255,0.08);
729
+ border: 1px solid rgba(94,231,255,0.15);
730
+ color: var(--color-primary-300);
731
+ padding: 0.1em 0.4em;
732
+ }
733
+
734
+ /* Code block */
735
+ .tiptap-code-block,
736
+ .tiptap-editor .ProseMirror pre,
737
+ .tiptap-readonly .ProseMirror pre {
738
+ font-family: var(--font-mono);
739
+ font-size: 0.8rem;
740
+ background: var(--color-ink-300);
741
+ border: 1px solid var(--color-border-hi);
742
+ border-left: 3px solid var(--color-primary-300);
743
+ padding: 0.8rem 1rem;
744
+ margin: 0.6rem 0;
745
+ overflow-x: auto;
746
+ color: var(--color-txt-2);
747
+ }
748
+ .tiptap-editor .ProseMirror pre code,
749
+ .tiptap-readonly .ProseMirror pre code {
750
+ background: none;
751
+ border: none;
752
+ padding: 0;
753
+ color: inherit;
754
+ font-size: inherit;
755
+ }
756
+
757
+ /* Links */
758
+ .tiptap-link,
759
+ .tiptap-editor .ProseMirror a,
760
+ .tiptap-readonly .ProseMirror a {
761
+ color: var(--color-primary-300);
762
+ text-decoration: underline;
763
+ text-underline-offset: 2px;
764
+ }
765
+
766
+ /* Strong / em */
767
+ .tiptap-editor .ProseMirror strong,
768
+ .tiptap-readonly .ProseMirror strong { color: var(--color-txt-1); font-weight: 700; }
769
+ .tiptap-editor .ProseMirror em,
770
+ .tiptap-readonly .ProseMirror em { color: var(--color-txt-2); }
771
+
772
+ /* Faculty branding logo */
773
+ .faculty-logo { filter: none; }
774
+ html.dark .faculty-logo { filter: invert(1); }