@chdlabs/my-shield 0.1.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.
@@ -0,0 +1,534 @@
1
+ /**
2
+ * Shield Security Dashboard Theme
3
+ * High-contrast dark cybersecurity aesthetic with subtle glassmorphism and clean typography.
4
+ */
5
+
6
+ :root {
7
+ --bg-base: #09090b;
8
+ --bg-surface: #121215;
9
+ --bg-surface-hover: #1c1c21;
10
+ --bg-card: #18181b;
11
+ --border-subtle: #27272a;
12
+ --border-highlight: #3f3f46;
13
+
14
+ --text-primary: #f4f4f5;
15
+ --text-secondary: #a1a1aa;
16
+ --text-muted: #71717a;
17
+
18
+ --accent-red: #ef4444;
19
+ --accent-red-bg: rgba(239, 68, 68, 0.12);
20
+ --accent-green: #10b981;
21
+ --accent-green-bg: rgba(16, 185, 129, 0.12);
22
+ --accent-amber: #f59e0b;
23
+ --accent-amber-bg: rgba(245, 158, 11, 0.12);
24
+ --accent-cyan: #06b6d4;
25
+ --accent-cyan-bg: rgba(6, 182, 212, 0.12);
26
+
27
+ --radius-sm: 4px;
28
+ --radius-md: 8px;
29
+ --radius-lg: 12px;
30
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
31
+ }
32
+
33
+ * {
34
+ box-sizing: border-box;
35
+ margin: 0;
36
+ padding: 0;
37
+ }
38
+
39
+ body.shield-body {
40
+ background-color: var(--bg-base);
41
+ color: var(--text-primary);
42
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
43
+ line-height: 1.5;
44
+ min-height: 100vh;
45
+ display: flex;
46
+ flex-direction: column;
47
+ }
48
+
49
+ /* Header */
50
+ .shield-header {
51
+ background-color: var(--bg-surface);
52
+ border-bottom: 1px solid var(--border-subtle);
53
+ padding: 1rem 2rem;
54
+ display: flex;
55
+ justify-content: space-between;
56
+ align-items: center;
57
+ position: sticky;
58
+ top: 0;
59
+ z-index: 100;
60
+ }
61
+
62
+ .header-left {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 1.5rem;
66
+ }
67
+
68
+ .shield-logo {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 0.75rem;
72
+ }
73
+
74
+ .logo-icon {
75
+ font-size: 1.75rem;
76
+ }
77
+
78
+ .logo-text {
79
+ display: flex;
80
+ flex-direction: column;
81
+ }
82
+
83
+ .logo-title {
84
+ font-weight: 800;
85
+ letter-spacing: 0.05em;
86
+ font-size: 1.05rem;
87
+ color: var(--text-primary);
88
+ }
89
+
90
+ .logo-sub {
91
+ font-size: 0.75rem;
92
+ color: var(--text-muted);
93
+ letter-spacing: 0.02em;
94
+ }
95
+
96
+ .status-pill {
97
+ display: inline-flex;
98
+ align-items: center;
99
+ gap: 0.4rem;
100
+ padding: 0.25rem 0.65rem;
101
+ border-radius: 9999px;
102
+ font-size: 0.75rem;
103
+ font-weight: 600;
104
+ letter-spacing: 0.04em;
105
+ background-color: var(--accent-green-bg);
106
+ color: var(--accent-green);
107
+ border: 1px solid rgba(16, 185, 129, 0.3);
108
+ }
109
+
110
+ .pulse-dot {
111
+ width: 6px;
112
+ height: 6px;
113
+ border-radius: 50%;
114
+ background-color: var(--accent-green);
115
+ box-shadow: 0 0 8px var(--accent-green);
116
+ animation: pulse 2s infinite ease-in-out;
117
+ }
118
+
119
+ @keyframes pulse {
120
+ 0%, 100% { opacity: 1; transform: scale(1); }
121
+ 50% { opacity: 0.4; transform: scale(0.85); }
122
+ }
123
+
124
+ .header-right {
125
+ display: flex;
126
+ gap: 0.75rem;
127
+ }
128
+
129
+ /* Navigation */
130
+ .shield-layout {
131
+ display: flex;
132
+ flex: 1;
133
+ }
134
+
135
+ .shield-nav {
136
+ width: 240px;
137
+ background-color: var(--bg-surface);
138
+ border-right: 1px solid var(--border-subtle);
139
+ padding: 1.5rem 1rem;
140
+ display: flex;
141
+ flex-direction: column;
142
+ gap: 0.5rem;
143
+ }
144
+
145
+ .nav-tab {
146
+ display: flex;
147
+ align-items: center;
148
+ gap: 0.75rem;
149
+ padding: 0.75rem 1rem;
150
+ border-radius: var(--radius-md);
151
+ background: transparent;
152
+ border: none;
153
+ color: var(--text-secondary);
154
+ font-size: 0.9rem;
155
+ font-weight: 600;
156
+ cursor: pointer;
157
+ text-align: left;
158
+ transition: all 0.15s ease;
159
+ }
160
+
161
+ .nav-tab:hover {
162
+ background-color: var(--bg-surface-hover);
163
+ color: var(--text-primary);
164
+ }
165
+
166
+ .nav-tab.active {
167
+ background-color: var(--bg-card);
168
+ color: var(--text-primary);
169
+ border: 1px solid var(--border-highlight);
170
+ box-shadow: 0 1px 3px rgba(0,0,0,0.4);
171
+ }
172
+
173
+ /* Main Content Area */
174
+ .shield-main {
175
+ flex: 1;
176
+ padding: 2rem;
177
+ overflow-y: auto;
178
+ }
179
+
180
+ .view-panel {
181
+ display: none;
182
+ }
183
+
184
+ .view-panel.active {
185
+ display: block;
186
+ animation: fadeIn 0.2s ease-in-out;
187
+ }
188
+
189
+ @keyframes fadeIn {
190
+ from { opacity: 0; transform: translateY(4px); }
191
+ to { opacity: 1; transform: translateY(0); }
192
+ }
193
+
194
+ /* Metrics Grid */
195
+ .metric-grid {
196
+ display: grid;
197
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
198
+ gap: 1.25rem;
199
+ margin-bottom: 2rem;
200
+ }
201
+
202
+ .metric-card {
203
+ background-color: var(--bg-card);
204
+ border: 1px solid var(--border-subtle);
205
+ border-radius: var(--radius-lg);
206
+ padding: 1.25rem;
207
+ display: flex;
208
+ flex-direction: column;
209
+ gap: 0.5rem;
210
+ }
211
+
212
+ .metric-label {
213
+ font-size: 0.8rem;
214
+ text-transform: uppercase;
215
+ letter-spacing: 0.05em;
216
+ color: var(--text-muted);
217
+ font-weight: 600;
218
+ }
219
+
220
+ .metric-value {
221
+ font-size: 2rem;
222
+ font-weight: 800;
223
+ line-height: 1.1;
224
+ font-family: var(--font-mono);
225
+ }
226
+
227
+ .metric-hint {
228
+ font-size: 0.75rem;
229
+ color: var(--text-muted);
230
+ }
231
+
232
+ .text-danger { color: var(--accent-red); }
233
+ .text-emerald { color: var(--accent-green); }
234
+ .text-amber { color: var(--accent-amber); }
235
+ .text-cyan { color: var(--accent-cyan); }
236
+ .text-white { color: var(--text-primary); }
237
+
238
+ /* Layout Splits */
239
+ .split-grid {
240
+ display: grid;
241
+ grid-template-columns: 1fr 1fr;
242
+ gap: 1.5rem;
243
+ }
244
+
245
+ @media (max-width: 1024px) {
246
+ .split-grid {
247
+ grid-template-columns: 1fr;
248
+ }
249
+ }
250
+
251
+ /* Panels */
252
+ .panel {
253
+ background-color: var(--bg-card);
254
+ border: 1px solid var(--border-subtle);
255
+ border-radius: var(--radius-lg);
256
+ padding: 1.5rem;
257
+ display: flex;
258
+ flex-direction: column;
259
+ }
260
+
261
+ .mb-4 { margin-bottom: 1.5rem; }
262
+
263
+ .panel-header {
264
+ display: flex;
265
+ justify-content: space-between;
266
+ align-items: center;
267
+ margin-bottom: 1.25rem;
268
+ padding-bottom: 0.75rem;
269
+ border-bottom: 1px solid var(--border-subtle);
270
+ }
271
+
272
+ .panel-title {
273
+ font-size: 1.05rem;
274
+ font-weight: 700;
275
+ color: var(--text-primary);
276
+ }
277
+
278
+ /* Buttons */
279
+ .btn {
280
+ display: inline-flex;
281
+ align-items: center;
282
+ justify-content: center;
283
+ gap: 0.4rem;
284
+ padding: 0.5rem 1rem;
285
+ border-radius: var(--radius-sm);
286
+ font-size: 0.85rem;
287
+ font-weight: 600;
288
+ cursor: pointer;
289
+ border: 1px solid transparent;
290
+ text-decoration: none;
291
+ transition: background-color 0.15s ease;
292
+ }
293
+
294
+ .btn-primary {
295
+ background-color: var(--text-primary);
296
+ color: var(--bg-base);
297
+ }
298
+ .btn-primary:hover {
299
+ background-color: #e4e4e7;
300
+ }
301
+
302
+ .btn-secondary {
303
+ background-color: var(--bg-surface);
304
+ color: var(--text-primary);
305
+ border-color: var(--border-highlight);
306
+ }
307
+ .btn-secondary:hover {
308
+ background-color: var(--bg-surface-hover);
309
+ }
310
+
311
+ .btn-danger {
312
+ background-color: var(--accent-red);
313
+ color: #ffffff;
314
+ }
315
+ .btn-danger:hover {
316
+ background-color: #dc2626;
317
+ }
318
+
319
+ .btn-sm {
320
+ padding: 0.25rem 0.65rem;
321
+ font-size: 0.75rem;
322
+ }
323
+
324
+ /* Tables */
325
+ .table-container {
326
+ overflow-x: auto;
327
+ }
328
+
329
+ .data-table {
330
+ width: 100%;
331
+ border-collapse: collapse;
332
+ font-size: 0.85rem;
333
+ }
334
+
335
+ .data-table th {
336
+ text-align: left;
337
+ padding: 0.65rem 0.85rem;
338
+ font-size: 0.75rem;
339
+ color: var(--text-muted);
340
+ border-bottom: 1px solid var(--border-subtle);
341
+ font-weight: 600;
342
+ text-transform: uppercase;
343
+ }
344
+
345
+ .data-table td {
346
+ padding: 0.75rem 0.85rem;
347
+ border-bottom: 1px solid var(--border-subtle);
348
+ color: var(--text-primary);
349
+ }
350
+
351
+ .data-table tr:hover td {
352
+ background-color: var(--bg-surface-hover);
353
+ }
354
+
355
+ .text-muted { color: var(--text-muted); }
356
+ .text-xs { font-size: 0.75rem; }
357
+
358
+ /* Real-Time Event Feed */
359
+ .event-feed-container {
360
+ max-height: 400px;
361
+ overflow-y: auto;
362
+ display: flex;
363
+ flex-direction: column;
364
+ gap: 0.5rem;
365
+ font-family: var(--font-mono);
366
+ font-size: 0.8rem;
367
+ }
368
+
369
+ .feed-item {
370
+ background-color: var(--bg-surface);
371
+ border: 1px solid var(--border-subtle);
372
+ border-radius: var(--radius-sm);
373
+ padding: 0.6rem 0.8rem;
374
+ display: flex;
375
+ justify-content: space-between;
376
+ align-items: center;
377
+ }
378
+
379
+ .feed-badge {
380
+ padding: 0.15rem 0.45rem;
381
+ border-radius: var(--radius-sm);
382
+ font-size: 0.7rem;
383
+ font-weight: 700;
384
+ }
385
+
386
+ .feed-badge.honeypot {
387
+ background-color: var(--accent-red-bg);
388
+ color: var(--accent-red);
389
+ }
390
+
391
+ .feed-badge.anomaly {
392
+ background-color: var(--accent-amber-bg);
393
+ color: var(--accent-amber);
394
+ }
395
+
396
+ .feed-badge.blocked {
397
+ background-color: rgba(147, 51, 234, 0.15);
398
+ color: #c084fc;
399
+ }
400
+
401
+ /* Forms */
402
+ .inline-form {
403
+ display: flex;
404
+ gap: 0.75rem;
405
+ }
406
+
407
+ .input-text {
408
+ flex: 1;
409
+ background-color: var(--bg-surface);
410
+ border: 1px solid var(--border-highlight);
411
+ color: var(--text-primary);
412
+ padding: 0.55rem 0.85rem;
413
+ border-radius: var(--radius-sm);
414
+ font-size: 0.85rem;
415
+ }
416
+
417
+ .input-text:focus {
418
+ outline: none;
419
+ border-color: var(--text-primary);
420
+ }
421
+
422
+ /* Modals */
423
+ .modal-backdrop {
424
+ position: fixed;
425
+ top: 0; left: 0; right: 0; bottom: 0;
426
+ background-color: rgba(0, 0, 0, 0.7);
427
+ display: flex;
428
+ align-items: center;
429
+ justify-content: center;
430
+ z-index: 1000;
431
+ }
432
+
433
+ .modal-backdrop[hidden] {
434
+ display: none;
435
+ }
436
+
437
+ .modal-dialog {
438
+ background-color: var(--bg-card);
439
+ border: 1px solid var(--border-highlight);
440
+ border-radius: var(--radius-lg);
441
+ width: 100%;
442
+ max-width: 440px;
443
+ padding: 1.5rem;
444
+ box-shadow: 0 10px 30px rgba(0,0,0,0.6);
445
+ }
446
+
447
+ .modal-header {
448
+ display: flex;
449
+ justify-content: space-between;
450
+ align-items: center;
451
+ margin-bottom: 1.25rem;
452
+ }
453
+
454
+ .btn-close {
455
+ background: none;
456
+ border: none;
457
+ color: var(--text-muted);
458
+ font-size: 1.2rem;
459
+ cursor: pointer;
460
+ }
461
+
462
+ .form-group {
463
+ display: flex;
464
+ flex-direction: column;
465
+ gap: 0.4rem;
466
+ margin-bottom: 1rem;
467
+ }
468
+
469
+ .form-group label {
470
+ font-size: 0.8rem;
471
+ font-weight: 600;
472
+ color: var(--text-secondary);
473
+ }
474
+
475
+ .modal-actions {
476
+ display: flex;
477
+ justify-content: flex-end;
478
+ gap: 0.75rem;
479
+ margin-top: 1.5rem;
480
+ }
481
+
482
+ /* Health and Telemetry Lists */
483
+ .health-list {
484
+ display: flex;
485
+ flex-direction: column;
486
+ gap: 0.75rem;
487
+ }
488
+
489
+ .health-item {
490
+ display: flex;
491
+ justify-content: space-between;
492
+ padding: 0.75rem;
493
+ background-color: var(--bg-surface);
494
+ border-radius: var(--radius-sm);
495
+ border: 1px solid var(--border-subtle);
496
+ font-size: 0.85rem;
497
+ }
498
+
499
+ .health-item-label {
500
+ color: var(--text-secondary);
501
+ }
502
+
503
+ .health-item-val {
504
+ font-family: var(--font-mono);
505
+ font-weight: 700;
506
+ color: var(--text-primary);
507
+ }
508
+
509
+ /* Toast Notification */
510
+ .toast-container {
511
+ position: fixed;
512
+ bottom: 2rem;
513
+ right: 2rem;
514
+ display: flex;
515
+ flex-direction: column;
516
+ gap: 0.5rem;
517
+ z-index: 2000;
518
+ }
519
+
520
+ .toast {
521
+ padding: 0.75rem 1.25rem;
522
+ border-radius: var(--radius-md);
523
+ background-color: var(--bg-card);
524
+ border: 1px solid var(--border-highlight);
525
+ color: var(--text-primary);
526
+ box-shadow: 0 4px 12px rgba(0,0,0,0.5);
527
+ font-size: 0.85rem;
528
+ animation: slideIn 0.2s ease-out;
529
+ }
530
+
531
+ @keyframes slideIn {
532
+ from { transform: translateX(20px); opacity: 0; }
533
+ to { transform: translateX(0); opacity: 1; }
534
+ }