source: lan-frontend/src/styles/theme.css

Last change on this file was a762898, checked in by istevanoska <ilinastevanoska@…>, 5 months ago

Added visualizations

  • Property mode set to 100644
File size: 16.6 KB
Line 
1/* =========================
2 LAN Security Monitor Theme
3 Dark Navy + Light Blue
4 ========================= */
5@tailwind base;
6@tailwind components;
7@tailwind utilities;
8
9:root{
10 --bg0: #070b16;
11 --bg1: #0a1020;
12 --bg2: #0e1730;
13
14 --panel: rgba(15,23,42,0.62);
15 --panel2: rgba(2,6,23,0.35);
16
17 --border: rgba(96,165,250,0.18);
18 --border2: rgba(147,197,253,0.28);
19
20 --text: rgba(255,255,255,0.92);
21 --muted: rgba(191,219,254,0.82);
22 --dim: rgba(148,163,184,0.85);
23
24 --accent: rgba(96,165,250,0.95); /* light blue */
25 --accent2: rgba(34,211,238,0.80); /* cyan */
26 --danger: rgba(239,68,68,0.95);
27 --warn: rgba(245,158,11,0.95);
28 --ok: rgba(34,197,94,0.95);
29
30 --shadow: 0 18px 45px rgba(0,0,0,0.32);
31 --shadow2: 0 10px 25px rgba(0,0,0,0.22);
32
33 --r12: 12px;
34 --r16: 16px;
35 --r18: 18px;
36}
37
38*{ box-sizing: border-box; }
39html, body { height: 100%; }
40body{
41 margin:0;
42 color: var(--text);
43 background:
44 radial-gradient(900px 460px at 20% -10%, rgba(96,165,250,0.18), transparent 60%),
45 radial-gradient(800px 420px at 80% 0%, rgba(34,211,238,0.10), transparent 55%),
46 radial-gradient(1000px 700px at 50% 120%, rgba(30,64,175,0.16), transparent 60%),
47 linear-gradient(180deg, var(--bg0), var(--bg1) 45%, #060913 100%);
48 font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, "Noto Sans", "Apple Color Emoji", "Segoe UI Emoji";
49}
50
51/* Layout */
52.app-wrap{
53 max-width: 1200px;
54 margin: 0 auto;
55 padding: 16px 18px 40px;
56}
57
58/* =========================
59 Panels
60 ========================= */
61.panel{
62 background: var(--panel);
63 border: 1px solid var(--border);
64 border-radius: var(--r18);
65 box-shadow: var(--shadow2);
66 overflow: hidden;
67 backdrop-filter: blur(10px);
68}
69.panel-head{
70 display:flex;
71 align-items:center;
72 justify-content: space-between;
73 gap: 12px;
74 padding: 14px 16px;
75 border-bottom: 1px solid rgba(96,165,250,0.14);
76 background: linear-gradient(180deg, rgba(2,6,23,0.32), rgba(2,6,23,0.12));
77}
78.panel-title{
79 font-weight: 900;
80 letter-spacing: 0.3px;
81 color: rgba(255,255,255,0.95);
82}
83.panel-body{
84 padding: 16px;
85}
86
87/* small helpers */
88.pill{
89 display:inline-flex;
90 align-items:center;
91 gap: 10px;
92 padding: 8px 12px;
93 border-radius: 999px;
94 background: rgba(30,41,59,0.60);
95 border: 1px solid rgba(96,165,250,0.22);
96 color: rgba(255,255,255,0.92);
97 font-weight: 800;
98 font-size: 12px;
99 box-shadow: inset 0 1px 0 rgba(255,255,255,0.06);
100}
101.small{
102 font-size: 12px;
103 color: var(--dim);
104 line-height: 1.35;
105}
106.dim{ color: var(--dim); font-weight: 700; }
107
108/* =========================
109 Inputs / Selects / Buttons
110 ========================= */
111.input, .select{
112 width: 100%;
113 padding: 10px 12px;
114 border-radius: var(--r12);
115 border: 1px solid rgba(96,165,250,0.18);
116 background: rgba(2,6,23,0.35);
117 color: rgba(255,255,255,0.92);
118 outline: none;
119 font-weight: 700;
120 transition: border-color .12s ease, background .12s ease, transform .12s ease;
121}
122.input::placeholder{ color: rgba(148,163,184,0.75); }
123.input:focus, .select:focus{
124 border-color: rgba(96,165,250,0.42);
125 background: rgba(2,6,23,0.46);
126}
127
128.btn{
129 appearance: none;
130 border: 1px solid rgba(96,165,250,0.22);
131 background: rgba(15,23,42,0.55);
132 color: rgba(255,255,255,0.92);
133 padding: 9px 12px;
134 border-radius: var(--r12);
135 font-weight: 900;
136 font-size: 13px;
137 cursor: pointer;
138 transition: transform .12s ease, background .12s ease, border-color .12s ease, opacity .12s ease;
139 box-shadow: 0 8px 20px rgba(0,0,0,0.18);
140}
141.btn:hover{
142 transform: translateY(-1px);
143 background: rgba(30,41,59,0.65);
144 border-color: rgba(96,165,250,0.38);
145}
146.btn:disabled{
147 opacity: .6;
148 cursor: not-allowed;
149 transform: none;
150}
151.btn.primary{
152 background: linear-gradient(135deg, rgba(37,99,235,0.95), rgba(56,189,248,0.70));
153 border-color: rgba(147,197,253,0.35);
154 color: rgba(5,12,24,0.95);
155}
156.btn.primary:hover{
157 background: linear-gradient(135deg, rgba(59,130,246,0.95), rgba(34,211,238,0.75));
158}
159
160/* Filters row */
161.filters{
162 display:grid;
163 grid-template-columns: 1.6fr 0.6fr auto;
164 gap: 10px;
165}
166@media (max-width: 820px){
167 .filters{ grid-template-columns: 1fr; }
168}
169
170/* =========================
171 Stats grid
172 ========================= */
173.stats-grid{
174 display: grid;
175 grid-template-columns: repeat(3, minmax(0, 1fr));
176 gap: 12px;
177 margin: 14px 0;
178}
179@media (max-width: 900px){
180 .stats-grid{ grid-template-columns: 1fr; }
181}
182
183.stat-card{
184 background:
185 radial-gradient(500px 180px at 20% 0%, rgba(96,165,250,0.16), transparent 55%),
186 rgba(15,23,42,0.58);
187 border: 1px solid rgba(96,165,250,0.18);
188 border-radius: var(--r18);
189 padding: 14px 16px;
190 box-shadow: var(--shadow2);
191 backdrop-filter: blur(10px);
192}
193.stat-card .label{
194 color: var(--dim);
195 font-size: 12px;
196 font-weight: 900;
197 letter-spacing: .8px;
198 text-transform: uppercase;
199}
200.stat-card .value{
201 font-size: 28px;
202 font-weight: 1000;
203 margin: 8px 0 2px;
204 color: rgba(255,255,255,0.95);
205}
206.stat-card .sub{
207 color: var(--muted);
208 font-size: 12px;
209}
210
211/* =========================
212 Computers grid + Card
213 ========================= */
214.computers-grid{
215 display:grid;
216 grid-template-columns: repeat(3, minmax(0, 1fr));
217 gap: 12px;
218}
219@media (max-width: 980px){
220 .computers-grid{ grid-template-columns: 1fr; }
221}
222
223.card{
224 width:100%;
225 text-align:left;
226 border-radius: var(--r18);
227 border: 1px solid rgba(96,165,250,0.18);
228 background:
229 radial-gradient(520px 220px at 20% 0%, rgba(96,165,250,0.14), transparent 55%),
230 rgba(15,23,42,0.54);
231 box-shadow: var(--shadow2);
232 padding: 14px;
233 cursor: pointer;
234 transition: transform .14s ease, border-color .14s ease, background .14s ease;
235 backdrop-filter: blur(10px);
236}
237.card:hover{
238 transform: translateY(-3px);
239 border-color: rgba(96,165,250,0.38);
240 background:
241 radial-gradient(520px 220px at 20% 0%, rgba(34,211,238,0.12), transparent 55%),
242 rgba(15,23,42,0.62);
243}
244.card:active{ transform: translateY(-1px); }
245
246.card-head{
247 display:flex;
248 justify-content: space-between;
249 align-items:center;
250 gap: 10px;
251 margin-bottom: 10px;
252}
253.card-title{
254 font-weight: 1000;
255 color: rgba(255,255,255,0.95);
256 letter-spacing: .2px;
257}
258.dot{
259 width: 10px;
260 height: 10px;
261 border-radius: 999px;
262 box-shadow: 0 0 0 4px rgba(255,255,255,0.04);
263}
264.dot.online{ background: var(--ok); box-shadow: 0 0 0 4px rgba(34,197,94,0.12); }
265.dot.idle{ background: var(--warn); box-shadow: 0 0 0 4px rgba(245,158,11,0.12); }
266.dot.offline{ background: rgba(148,163,184,0.8); box-shadow: 0 0 0 4px rgba(148,163,184,0.10); }
267
268.meta{
269 display:grid;
270 gap: 6px;
271 color: rgba(226,232,240,0.92);
272 font-size: 13px;
273 line-height: 1.25;
274}
275
276.kpis{
277 display:grid;
278 grid-template-columns: repeat(3, minmax(0, 1fr));
279 gap: 10px;
280 margin-top: 12px;
281 padding-top: 12px;
282 border-top: 1px solid rgba(96,165,250,0.14);
283}
284.kpi{
285 border-radius: var(--r16);
286 border: 1px solid rgba(96,165,250,0.14);
287 background: rgba(2,6,23,0.30);
288 padding: 10px 10px;
289}
290.kpi .k{
291 font-size: 11px;
292 color: var(--dim);
293 font-weight: 900;
294 letter-spacing: .6px;
295 text-transform: uppercase;
296}
297.kpi .v{
298 margin-top: 6px;
299 font-size: 18px;
300 font-weight: 1000;
301 color: rgba(255,255,255,0.95);
302}
303
304/* =========================
305 Modal (shared classes)
306 ========================= */
307.backdrop{
308 position: fixed;
309 inset: 0;
310 background: rgba(2,6,23,0.72);
311 backdrop-filter: blur(6px);
312 display:flex;
313 align-items:center;
314 justify-content:center;
315 padding: 20px;
316 z-index: 60;
317}
318.modal{
319 width: min(920px, 96vw);
320 border-radius: var(--r18);
321 background:
322 radial-gradient(900px 420px at 20% 0%, rgba(96,165,250,0.18), transparent 60%),
323 radial-gradient(700px 350px at 80% 10%, rgba(34,211,238,0.10), transparent 55%),
324 rgba(10,16,32,0.92);
325 border: 1px solid rgba(96,165,250,0.22);
326 box-shadow: 0 30px 80px rgba(0,0,0,0.45);
327 overflow: hidden;
328}
329.modal-head{
330 padding: 14px 16px;
331 display:flex;
332 align-items:center;
333 justify-content: space-between;
334 gap: 10px;
335 border-bottom: 1px solid rgba(96,165,250,0.18);
336}
337.modal-title{
338 font-weight: 1000;
339 color: rgba(255,255,255,0.95);
340 letter-spacing: .2px;
341}
342.modal-sub{
343 margin-top: 2px;
344 font-size: 12px;
345 color: var(--muted);
346}
347
348/* If you have drawer classes */
349.ai-drawer{
350 position: fixed;
351 top: 0;
352 right: 0;
353 height: 100vh;
354 width: min(420px, 92vw);
355 background:
356 radial-gradient(700px 400px at 20% 0%, rgba(96,165,250,0.18), transparent 55%),
357 rgba(10,16,32,0.94);
358 border-left: 1px solid rgba(96,165,250,0.20);
359 box-shadow: -20px 0 60px rgba(0,0,0,0.35);
360 z-index: 70;
361 padding: 14px;
362}
363.ai-header{
364 font-weight: 1000;
365 color: rgba(255,255,255,0.95);
366 margin-bottom: 10px;
367}
368.ai-messages{
369 height: calc(100vh - 160px);
370 overflow: auto;
371 border-radius: var(--r16);
372 border: 1px solid rgba(96,165,250,0.14);
373 background: rgba(2,6,23,0.28);
374 padding: 10px;
375}
376.ai-msg{
377 color: rgba(226,232,240,0.92);
378 font-size: 13px;
379 line-height: 1.35;
380 padding: 10px;
381 border-radius: 12px;
382 border: 1px solid rgba(96,165,250,0.12);
383 background: rgba(15,23,42,0.45);
384 margin-bottom: 10px;
385}
386.ai-input{
387 width: 100%;
388 margin-top: 10px;
389 padding: 10px 12px;
390 border-radius: var(--r12);
391 border: 1px solid rgba(96,165,250,0.18);
392 background: rgba(2,6,23,0.35);
393 color: rgba(255,255,255,0.92);
394 outline: none;
395 font-weight: 700;
396}
397.ai-input::placeholder{ color: rgba(148,163,184,0.75); }
398
399/* Scrollbars (nice) */
400*::-webkit-scrollbar{ width: 10px; height: 10px; }
401*::-webkit-scrollbar-thumb{
402 background: rgba(96,165,250,0.20);
403 border: 2px solid rgba(2,6,23,0.35);
404 border-radius: 999px;
405}
406*::-webkit-scrollbar-track{ background: rgba(2,6,23,0.25); }
407.aiDrawer-backdrop{
408 position: fixed;
409 inset: 0;
410 background: rgba(0,0,0,.55);
411 backdrop-filter: blur(2px);
412 z-index: 999;
413}
414
415/* десен drawer */
416.aiDrawer{
417 position: fixed;
418 top: 0;
419 right: 0;
420 height: 100vh;
421 width: min(520px, 92vw);
422 background: #0b1220; /* темна */
423 color: #e7eefc;
424 border-left: 1px solid rgba(255,255,255,.08);
425 z-index: 1000;
426 display: grid;
427 grid-template-rows: auto auto 1fr auto;
428
429 /* slide in */
430 transform: translateX(0);
431 animation: aiSlideIn .18s ease-out;
432}
433
434@keyframes aiSlideIn{
435 from { transform: translateX(24px); opacity: .7; }
436 to { transform: translateX(0); opacity: 1; }
437}
438
439.aiDrawer-head{
440 padding: 14px 16px;
441 display: flex;
442 align-items: center;
443 justify-content: space-between;
444 border-bottom: 1px solid rgba(255,255,255,.08);
445}
446
447.aiDrawer-title{
448 font-size: 16px;
449 font-weight: 700;
450}
451
452.aiDrawer-sub{
453 font-size: 12px;
454 opacity: .75;
455 margin-top: 2px;
456}
457
458.aiDrawer-toolbar{
459 padding: 12px 16px;
460 border-bottom: 1px solid rgba(255,255,255,.08);
461 display: grid;
462 gap: 8px;
463}
464
465.aiSelect{
466 width: 100%;
467 background: rgba(255,255,255,.06);
468 border: 1px solid rgba(255,255,255,.10);
469 color: #e7eefc;
470 padding: 10px 12px;
471 border-radius: 10px;
472 outline: none;
473}
474
475.aiHint{
476 font-size: 12px;
477 opacity: .75;
478}
479
480.aiDrawer-body{
481 padding: 14px 16px;
482 overflow: auto;
483 display: grid;
484 gap: 10px;
485}
486
487/* chat bubbles */
488.aiMsg{
489 max-width: 92%;
490 border: 1px solid rgba(255,255,255,.08);
491 border-radius: 14px;
492 padding: 10px 12px;
493 background: rgba(255,255,255,.04);
494}
495
496.aiMsg.user{
497 margin-left: auto;
498 background: rgba(88, 167, 255, .12);
499 border-color: rgba(88, 167, 255, .20);
500}
501
502.aiMsg-meta{
503 font-size: 11px;
504 opacity: .7;
505 margin-bottom: 6px;
506}
507
508.aiMsg-text{
509 white-space: pre-wrap;
510 line-height: 1.35;
511 font-size: 14px;
512}
513
514.aiDrawer-foot{
515 padding: 12px 16px;
516 border-top: 1px solid rgba(255,255,255,.08);
517 display: grid;
518 grid-template-columns: 1fr auto;
519 gap: 10px;
520 align-items: end;
521 background: rgba(255,255,255,.02);
522}
523
524.aiTextarea{
525 width: 100%;
526 resize: none;
527 background: rgba(255,255,255,.06);
528 border: 1px solid rgba(255,255,255,.10);
529 color: #e7eefc;
530 padding: 10px 12px;
531 border-radius: 12px;
532 outline: none;
533}
534
535.aiBtn{
536 background: rgba(255,255,255,.06);
537 border: 1px solid rgba(255,255,255,.10);
538 color: #e7eefc;
539 padding: 10px 12px;
540 border-radius: 12px;
541 cursor: pointer;
542}
543
544.aiBtn:disabled{
545 opacity: .5;
546 cursor: not-allowed;
547}
548
549.aiBtnPrimary{
550 background: rgba(88, 167, 255, .22);
551 border-color: rgba(88, 167, 255, .35);
552}
553
554/* ====== LAYOUT with LEFT SIDEBAR ====== */
555.app-shell {
556 display: grid;
557 grid-template-columns: 240px 1fr;
558 min-height: 100vh;
559}
560
561.app-main {
562 padding: 14px;
563}
564
565/* Sidebar */
566.side {
567 background: rgba(255,255,255,0.04);
568 border-right: 1px solid rgba(255,255,255,0.10);
569 padding: 14px;
570 position: sticky;
571 top: 0;
572 height: 100vh;
573}
574
575.side-brand {
576 display: flex;
577 gap: 10px;
578 align-items: center;
579 padding: 10px;
580 border: 1px solid rgba(255,255,255,0.10);
581 border-radius: 14px;
582 background: rgba(0,0,0,0.12);
583 margin-bottom: 14px;
584}
585
586.side-brand-dot {
587 width: 10px;
588 height: 10px;
589 border-radius: 999px;
590 background: #7dd3fc;
591 box-shadow: 0 0 0 4px rgba(125,211,252,0.15);
592}
593
594.side-brand-title {
595 font-weight: 700;
596 letter-spacing: 0.2px;
597}
598
599.side-brand-sub {
600 font-size: 12px;
601 color: var(--dim);
602}
603
604.side-section-title {
605 font-size: 11px;
606 color: var(--dim);
607 margin: 12px 8px 8px;
608 letter-spacing: 0.12em;
609}
610
611.side-item {
612 width: 100%;
613 display: flex;
614 align-items: center;
615 gap: 10px;
616 padding: 10px 12px;
617 border-radius: 12px;
618 border: 1px solid transparent;
619 background: transparent;
620 color: inherit;
621 cursor: pointer;
622 text-align: left;
623}
624
625.side-item:hover {
626 background: rgba(255,255,255,0.06);
627 border-color: rgba(255,255,255,0.08);
628}
629
630.side-item.active {
631 background: rgba(125,211,252,0.12);
632 border-color: rgba(125,211,252,0.25);
633}
634
635.side-icon {
636 width: 26px;
637 display: grid;
638 place-items: center;
639 font-size: 18px;
640}
641
642.side-label {
643 font-size: 14px;
644 font-weight: 600;
645}
646
647.side-footer {
648 position: absolute;
649 bottom: 12px;
650 left: 14px;
651 right: 14px;
652 padding: 10px;
653 border-radius: 12px;
654 border: 1px solid rgba(255,255,255,0.10);
655 background: rgba(0,0,0,0.12);
656}
657
658.side-footer-hint {
659 font-size: 12px;
660 color: var(--dim);
661}
662/* ==== Collapsible Side Menu ==== */
663.side {
664 position: sticky;
665 top: 0;
666 height: 100vh;
667 z-index: 20;
668
669 width: 260px;
670 transition: width 180ms ease;
671 border-right: 1px solid rgba(255,255,255,0.08);
672 background: rgba(6, 12, 24, 0.72);
673 backdrop-filter: blur(10px);
674}
675
676.side.collapsed {
677 width: 54px; /* само тенка лента */
678}
679
680.side-inner {
681 height: 100%;
682 padding: 14px 10px;
683 display: flex;
684 flex-direction: column;
685}
686
687.side-handle {
688 position: absolute;
689 left: 6px;
690 top: 10px;
691 width: 42px;
692 height: 34px;
693 border-radius: 12px;
694 border: 1px solid rgba(255,255,255,0.12);
695 background: rgba(255,255,255,0.06);
696 color: rgba(255,255,255,0.9);
697 cursor: pointer;
698}
699
700.side-brand {
701 display: flex;
702 align-items: center;
703 gap: 10px;
704 padding: 10px;
705 margin-top: 38px; /* за да не се судри со handle */
706 border-radius: 16px;
707 background: rgba(255,255,255,0.03);
708 border: 1px solid rgba(255,255,255,0.06);
709}
710
711.side-brand-dot {
712 width: 12px;
713 height: 12px;
714 border-radius: 999px;
715 background: rgba(80, 160, 255, 0.95);
716 box-shadow: 0 0 18px rgba(80,160,255,0.45);
717}
718
719.side-brand-text { min-width: 0; }
720.side-brand-title { font-weight: 800; color: rgba(255,255,255,0.92); }
721.side-brand-sub { font-size: 12px; color: rgba(255,255,255,0.55); }
722
723.side-section { margin-top: 14px; }
724.side-section-title {
725 font-size: 11px;
726 letter-spacing: 0.12em;
727 color: rgba(255,255,255,0.45);
728 padding: 10px;
729}
730
731.side-item {
732 width: 100%;
733 display: flex;
734 align-items: center;
735 gap: 10px;
736 padding: 10px 12px;
737 margin: 6px 0;
738 border-radius: 14px;
739 border: 1px solid transparent;
740 background: transparent;
741 color: rgba(255,255,255,0.82);
742 cursor: pointer;
743 text-align: left;
744}
745
746.side-item:hover {
747 background: rgba(255,255,255,0.06);
748 border-color: rgba(255,255,255,0.08);
749}
750
751.side-item.active {
752 background: rgba(80,160,255,0.16);
753 border-color: rgba(80,160,255,0.25);
754}
755
756.side-icon {
757 width: 28px;
758 display: grid;
759 place-items: center;
760 font-size: 18px;
761}
762
763.side-label {
764 white-space: nowrap;
765 overflow: hidden;
766 text-overflow: ellipsis;
767}
768
769.side-footer {
770 margin-top: auto;
771 padding: 10px;
772 color: rgba(255,255,255,0.55);
773 font-size: 12px;
774}
775.layout { display: flex; }
776.content { flex: 1; min-width: 0; }
777/* collapsed = центрирање иконите + тргање празни простори */
778.side.collapsed .side-inner {
779 padding: 10px 6px;
780 align-items: center;
781}
782
783.side.collapsed .side-brand {
784 width: 42px;
785 padding: 10px 0;
786 justify-content: center;
787 margin-top: 48px;
788}
789
790.side.collapsed .side-item {
791 justify-content: center;
792 padding: 10px 0;
793}
794
795.side.collapsed .side-icon {
796 width: 42px;
797}
798
799/* handle во средина (поубаво) */
800.side-handle {
801 left: 6px;
802 top: 10px;
803 width: 42px;
804 height: 34px;
805}
806
807/* кога е open да си е нормално */
808.side.open .side-inner {
809 align-items: stretch;
810}
811
812.cont{
813 margin-right: 50px;
814}
Note: See TracBrowser for help on using the repository browser.