@opencoop/opencode-plugin 1.0.0 → 1.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.
@@ -1,639 +1,1475 @@
1
- * {
1
+ /* ============================================
2
+ OpenCOOP - Professional UI Theme
3
+ ============================================ */
4
+
5
+ :root {
6
+ /* Dark Theme (Default) */
7
+ --bg-primary: #0a0a0f;
8
+ --bg-secondary: #12121a;
9
+ --bg-tertiary: #1a1a25;
10
+ --bg-card: rgba(255, 255, 255, 0.03);
11
+ --bg-hover: rgba(255, 255, 255, 0.06);
12
+ --bg-glass: rgba(255, 255, 255, 0.04);
13
+
14
+ --text-primary: #f0f0f5;
15
+ --text-secondary: #9090a0;
16
+ --text-tertiary: #606070;
17
+ --text-accent: #8b5cf6;
18
+
19
+ --border-color: rgba(255, 255, 255, 0.08);
20
+ --border-focus: rgba(139, 92, 246, 0.5);
21
+
22
+ --accent-primary: #8b5cf6;
23
+ --accent-primary-hover: #7c3aed;
24
+ --accent-secondary: #06b6d4;
25
+ --accent-success: #10b981;
26
+ --accent-warning: #f59e0b;
27
+ --accent-danger: #ef4444;
28
+
29
+ --gradient-primary: linear-gradient(135deg, #8b5cf6 0%, #06b6d4 100%);
30
+ --gradient-card: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(6, 182, 212, 0.05) 100%);
31
+
32
+ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);
33
+ --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4);
34
+ --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5);
35
+ --shadow-glow: 0 0 40px rgba(139, 92, 246, 0.15);
36
+
37
+ --sidebar-width: 260px;
38
+ --topbar-height: 64px;
39
+ --radius-sm: 8px;
40
+ --radius-md: 12px;
41
+ --radius-lg: 16px;
42
+ --radius-xl: 20px;
43
+
44
+ --transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
45
+ --transition-normal: 0.25s cubic-bezier(0.4, 0, 0.2, 1);
46
+ --transition-slow: 0.4s cubic-bezier(0.4, 0, 0.2, 1);
47
+ --transition-spring: 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
48
+ }
49
+
50
+ [data-theme="light"] {
51
+ --bg-primary: #f8f9fc;
52
+ --bg-secondary: #ffffff;
53
+ --bg-tertiary: #f0f1f5;
54
+ --bg-card: rgba(0, 0, 0, 0.02);
55
+ --bg-hover: rgba(0, 0, 0, 0.04);
56
+ --bg-glass: rgba(255, 255, 255, 0.8);
57
+
58
+ --text-primary: #1a1a2e;
59
+ --text-secondary: #6b7280;
60
+ --text-tertiary: #9ca3af;
61
+ --text-accent: #7c3aed;
62
+
63
+ --border-color: rgba(0, 0, 0, 0.08);
64
+ --border-focus: rgba(124, 58, 237, 0.5);
65
+
66
+ --accent-primary: #7c3aed;
67
+ --accent-primary-hover: #6d28d9;
68
+
69
+ --gradient-card: linear-gradient(135deg, rgba(124, 58, 237, 0.08) 0%, rgba(6, 182, 212, 0.04) 100%);
70
+
71
+ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.08);
72
+ --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.1);
73
+ --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.12);
74
+ --shadow-glow: 0 0 40px rgba(124, 58, 237, 0.1);
75
+ }
76
+
77
+ /* ============================================
78
+ Reset & Base
79
+ ============================================ */
80
+
81
+ *, *::before, *::after {
2
82
  margin: 0;
3
83
  padding: 0;
4
84
  box-sizing: border-box;
5
85
  }
6
86
 
7
- :root {
8
- --bg-primary: #0a0e17;
9
- --bg-secondary: #111827;
10
- --bg-card: #1f2937;
11
- --bg-hover: #374151;
12
- --border: #374151;
13
- --text-primary: #f9fafb;
14
- --text-secondary: #9ca3af;
15
- --text-muted: #6b7280;
16
- --accent: #3b82f6;
17
- --accent-hover: #2563eb;
18
- --success: #10b981;
19
- --warning: #f59e0b;
20
- --danger: #ef4444;
87
+ html {
88
+ font-size: 14px;
89
+ scroll-behavior: smooth;
21
90
  }
22
91
 
23
92
  body {
24
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
93
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
25
94
  background: var(--bg-primary);
26
95
  color: var(--text-primary);
27
96
  line-height: 1.6;
97
+ overflow: hidden;
98
+ -webkit-font-smoothing: antialiased;
99
+ }
100
+
101
+ a {
102
+ color: inherit;
103
+ text-decoration: none;
104
+ }
105
+
106
+ button {
107
+ cursor: pointer;
108
+ border: none;
109
+ background: none;
110
+ font-family: inherit;
111
+ font-size: inherit;
112
+ color: inherit;
113
+ }
114
+
115
+ input, select, textarea {
116
+ font-family: inherit;
117
+ font-size: inherit;
118
+ color: inherit;
119
+ }
120
+
121
+ /* ============================================
122
+ Loading Screen
123
+ ============================================ */
124
+
125
+ .loading-screen {
126
+ position: fixed;
127
+ inset: 0;
128
+ display: flex;
129
+ flex-direction: column;
130
+ align-items: center;
131
+ justify-content: center;
132
+ background: var(--bg-primary);
133
+ z-index: 9999;
134
+ animation: fadeOut 0.5s ease forwards;
135
+ animation-delay: 1.5s;
136
+ pointer-events: none;
137
+ }
138
+
139
+ @keyframes fadeOut {
140
+ to { opacity: 0; visibility: hidden; }
141
+ }
142
+
143
+ .loader {
144
+ position: relative;
145
+ width: 80px;
146
+ height: 80px;
147
+ }
148
+
149
+ .loader-ring {
150
+ position: absolute;
151
+ inset: 0;
152
+ border-radius: 50%;
153
+ border: 3px solid transparent;
154
+ animation: spin 1.5s linear infinite;
28
155
  }
29
156
 
157
+ .loader-ring:nth-child(1) {
158
+ border-top-color: var(--accent-primary);
159
+ animation-duration: 1.5s;
160
+ }
161
+
162
+ .loader-ring:nth-child(2) {
163
+ inset: 8px;
164
+ border-right-color: var(--accent-secondary);
165
+ animation-duration: 2s;
166
+ animation-direction: reverse;
167
+ }
168
+
169
+ .loader-ring:nth-child(3) {
170
+ inset: 16px;
171
+ border-bottom-color: var(--accent-success);
172
+ animation-duration: 1s;
173
+ }
174
+
175
+ .loader-logo {
176
+ position: absolute;
177
+ inset: 24px;
178
+ display: flex;
179
+ align-items: center;
180
+ justify-content: center;
181
+ font-weight: 800;
182
+ font-size: 1.2rem;
183
+ background: var(--gradient-primary);
184
+ -webkit-background-clip: text;
185
+ -webkit-text-fill-color: transparent;
186
+ background-clip: text;
187
+ }
188
+
189
+ @keyframes spin {
190
+ to { transform: rotate(360deg); }
191
+ }
192
+
193
+ .loading-text {
194
+ margin-top: 24px;
195
+ color: var(--text-secondary);
196
+ font-size: 0.9rem;
197
+ animation: pulse 1.5s ease-in-out infinite;
198
+ }
199
+
200
+ @keyframes pulse {
201
+ 0%, 100% { opacity: 0.5; }
202
+ 50% { opacity: 1; }
203
+ }
204
+
205
+ /* ============================================
206
+ App Layout
207
+ ============================================ */
208
+
30
209
  .app {
31
210
  display: flex;
32
- min-height: 100vh;
211
+ height: 100vh;
212
+ opacity: 0;
213
+ animation: fadeIn 0.6s ease forwards;
214
+ animation-delay: 1.5s;
33
215
  }
34
216
 
35
- /* SIDEBAR */
217
+ @keyframes fadeIn {
218
+ to { opacity: 1; }
219
+ }
220
+
221
+ /* ============================================
222
+ Sidebar
223
+ ============================================ */
224
+
36
225
  .sidebar {
37
- width: 260px;
226
+ width: var(--sidebar-width);
227
+ height: 100vh;
38
228
  background: var(--bg-secondary);
39
- border-right: 1px solid var(--border);
229
+ border-right: 1px solid var(--border-color);
40
230
  display: flex;
41
231
  flex-direction: column;
42
- position: fixed;
43
- height: 100vh;
232
+ transition: transform var(--transition-normal);
233
+ z-index: 100;
44
234
  }
45
235
 
46
- .logo {
47
- padding: 1.5rem;
48
- border-bottom: 1px solid var(--border);
236
+ .sidebar-header {
237
+ padding: 20px;
238
+ border-bottom: 1px solid var(--border-color);
49
239
  }
50
240
 
51
- .logo h1 {
52
- font-size: 1.5rem;
53
- color: var(--accent);
241
+ .logo-wrapper {
242
+ display: flex;
243
+ align-items: center;
244
+ gap: 12px;
245
+ }
246
+
247
+ .logo-icon {
248
+ width: 44px;
249
+ height: 44px;
250
+ border-radius: var(--radius-md);
251
+ background: var(--gradient-primary);
252
+ display: flex;
253
+ align-items: center;
254
+ justify-content: center;
255
+ color: white;
256
+ box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);
257
+ }
258
+
259
+ .logo-text h1 {
260
+ font-size: 1.2rem;
54
261
  font-weight: 700;
262
+ background: var(--gradient-primary);
263
+ -webkit-background-clip: text;
264
+ -webkit-text-fill-color: transparent;
265
+ background-clip: text;
55
266
  }
56
267
 
57
- .logo span {
268
+ .logo-text .version {
58
269
  font-size: 0.75rem;
59
- color: var(--text-muted);
270
+ color: var(--text-tertiary);
60
271
  }
61
272
 
62
- .nav-links {
63
- list-style: none;
64
- padding: 1rem 0;
273
+ .sidebar-nav {
65
274
  flex: 1;
275
+ padding: 12px;
276
+ overflow-y: auto;
66
277
  }
67
278
 
68
- .nav-links li a {
69
- display: block;
70
- padding: 0.75rem 1.5rem;
279
+ .nav-item {
280
+ display: flex;
281
+ align-items: center;
282
+ gap: 12px;
283
+ padding: 12px 16px;
284
+ border-radius: var(--radius-md);
71
285
  color: var(--text-secondary);
72
- text-decoration: none;
73
- transition: all 0.2s;
286
+ transition: all var(--transition-fast);
287
+ position: relative;
288
+ margin-bottom: 4px;
74
289
  }
75
290
 
76
- .nav-links li a:hover,
77
- .nav-links li a.active {
291
+ .nav-item:hover {
78
292
  background: var(--bg-hover);
79
293
  color: var(--text-primary);
80
- border-left: 3px solid var(--accent);
81
294
  }
82
295
 
83
- .nav-status {
84
- padding: 1rem 1.5rem;
85
- border-top: 1px solid var(--border);
296
+ .nav-item.active {
297
+ background: rgba(139, 92, 246, 0.15);
298
+ color: var(--accent-primary);
299
+ }
300
+
301
+ .nav-item.active::before {
302
+ content: '';
303
+ position: absolute;
304
+ left: 0;
305
+ top: 50%;
306
+ transform: translateY(-50%);
307
+ width: 3px;
308
+ height: 24px;
309
+ background: var(--accent-primary);
310
+ border-radius: 0 4px 4px 0;
311
+ }
312
+
313
+ .nav-item svg {
314
+ flex-shrink: 0;
315
+ }
316
+
317
+ .sidebar-footer {
318
+ padding: 16px 20px;
319
+ border-top: 1px solid var(--border-color);
320
+ }
321
+
322
+ .connection-status {
86
323
  display: flex;
87
324
  align-items: center;
88
- gap: 0.5rem;
325
+ gap: 10px;
326
+ padding: 10px 14px;
327
+ background: var(--bg-tertiary);
328
+ border-radius: var(--radius-md);
329
+ font-size: 0.85rem;
89
330
  }
90
331
 
91
- .status-dot {
332
+ .status-indicator {
92
333
  width: 8px;
93
334
  height: 8px;
94
335
  border-radius: 50%;
95
- background: var(--danger);
336
+ background: var(--accent-warning);
337
+ animation: statusPulse 2s ease-in-out infinite;
338
+ }
339
+
340
+ .connection-status.connected .status-indicator {
341
+ background: var(--accent-success);
96
342
  }
97
343
 
98
- .status-dot.online {
99
- background: var(--success);
344
+ .connection-status.error .status-indicator {
345
+ background: var(--accent-danger);
346
+ animation: none;
100
347
  }
101
348
 
102
- /* MAIN CONTENT */
103
- .content {
349
+ @keyframes statusPulse {
350
+ 0%, 100% { opacity: 1; transform: scale(1); }
351
+ 50% { opacity: 0.5; transform: scale(0.8); }
352
+ }
353
+
354
+ /* ============================================
355
+ Main Content
356
+ ============================================ */
357
+
358
+ .main-content {
104
359
  flex: 1;
105
- margin-left: 260px;
106
- padding: 2rem;
360
+ display: flex;
361
+ flex-direction: column;
362
+ overflow: hidden;
363
+ }
364
+
365
+ .topbar {
366
+ height: var(--topbar-height);
367
+ padding: 0 24px;
368
+ display: flex;
369
+ align-items: center;
370
+ gap: 16px;
371
+ background: var(--bg-secondary);
372
+ border-bottom: 1px solid var(--border-color);
373
+ flex-shrink: 0;
374
+ }
375
+
376
+ .menu-toggle {
377
+ display: none;
378
+ padding: 8px;
379
+ border-radius: var(--radius-sm);
380
+ color: var(--text-secondary);
381
+ transition: all var(--transition-fast);
382
+ }
383
+
384
+ .menu-toggle:hover {
385
+ background: var(--bg-hover);
386
+ color: var(--text-primary);
387
+ }
388
+
389
+ .topbar-title {
390
+ flex: 1;
391
+ font-size: 1.1rem;
392
+ font-weight: 600;
393
+ }
394
+
395
+ .topbar-actions {
396
+ display: flex;
397
+ align-items: center;
398
+ gap: 8px;
399
+ }
400
+
401
+ .theme-toggle {
402
+ padding: 10px;
403
+ border-radius: var(--radius-sm);
404
+ color: var(--text-secondary);
405
+ transition: all var(--transition-fast);
406
+ }
407
+
408
+ .theme-toggle:hover {
409
+ background: var(--bg-hover);
410
+ color: var(--text-primary);
411
+ }
412
+
413
+ [data-theme="dark"] .theme-toggle .sun { display: block; }
414
+ [data-theme="dark"] .theme-toggle .moon { display: none; }
415
+ [data-theme="light"] .theme-toggle .sun { display: none; }
416
+ [data-theme="light"] .theme-toggle .moon { display: block; }
417
+
418
+ /* ============================================
419
+ Page Container
420
+ ============================================ */
421
+
422
+ .page-container {
423
+ flex: 1;
424
+ overflow-y: auto;
425
+ overflow-x: hidden;
426
+ padding: 32px;
427
+ scroll-behavior: smooth;
428
+ }
429
+
430
+ .page-container::-webkit-scrollbar {
431
+ width: 6px;
432
+ }
433
+
434
+ .page-container::-webkit-scrollbar-track {
435
+ background: transparent;
436
+ }
437
+
438
+ .page-container::-webkit-scrollbar-thumb {
439
+ background: var(--border-color);
440
+ border-radius: 3px;
441
+ }
442
+
443
+ .page-container::-webkit-scrollbar-thumb:hover {
444
+ background: var(--text-tertiary);
107
445
  }
108
446
 
109
447
  .page {
110
448
  display: none;
449
+ animation: slideUp 0.4s ease forwards;
111
450
  }
112
451
 
113
452
  .page.active {
114
453
  display: block;
115
454
  }
116
455
 
117
- h2 {
118
- font-size: 1.75rem;
119
- margin-bottom: 1.5rem;
120
- color: var(--text-primary);
456
+ @keyframes slideUp {
457
+ from {
458
+ opacity: 0;
459
+ transform: translateY(20px);
460
+ }
461
+ to {
462
+ opacity: 1;
463
+ transform: translateY(0);
464
+ }
121
465
  }
122
466
 
123
- h3 {
124
- font-size: 1.25rem;
125
- margin-bottom: 1rem;
126
- color: var(--text-primary);
467
+ .page-header {
468
+ margin-bottom: 32px;
469
+ }
470
+
471
+ .page-header h2 {
472
+ font-size: 1.8rem;
473
+ font-weight: 700;
474
+ margin-bottom: 8px;
475
+ background: var(--gradient-primary);
476
+ -webkit-background-clip: text;
477
+ -webkit-text-fill-color: transparent;
478
+ background-clip: text;
479
+ }
480
+
481
+ .page-header p {
482
+ color: var(--text-secondary);
483
+ font-size: 1rem;
127
484
  }
128
485
 
129
- /* MODE SELECTION */
130
- .mode-selection {
486
+ /* ============================================
487
+ Mode Cards
488
+ ============================================ */
489
+
490
+ .mode-cards {
131
491
  display: grid;
132
- grid-template-columns: 1fr 1fr;
133
- gap: 1.5rem;
134
- margin-bottom: 2rem;
492
+ grid-template-columns: repeat(2, 1fr);
493
+ gap: 20px;
494
+ margin-bottom: 24px;
135
495
  }
136
496
 
137
497
  .mode-card {
498
+ position: relative;
138
499
  background: var(--bg-card);
139
- border: 2px solid var(--border);
140
- border-radius: 12px;
141
- padding: 2rem;
142
- text-align: center;
500
+ border: 1px solid var(--border-color);
501
+ border-radius: var(--radius-lg);
502
+ overflow: hidden;
143
503
  cursor: pointer;
144
- transition: all 0.3s;
504
+ transition: all var(--transition-normal);
145
505
  }
146
506
 
147
507
  .mode-card:hover {
148
- border-color: var(--accent);
149
- background: rgba(59, 130, 246, 0.1);
508
+ border-color: var(--accent-primary);
509
+ transform: translateY(-4px);
510
+ box-shadow: var(--shadow-glow);
150
511
  }
151
512
 
152
513
  .mode-card.selected {
153
- border-color: var(--accent);
154
- background: rgba(59, 130, 246, 0.15);
514
+ border-color: var(--accent-primary);
515
+ background: rgba(139, 92, 246, 0.08);
516
+ }
517
+
518
+ .mode-card-glow {
519
+ position: absolute;
520
+ inset: 0;
521
+ background: var(--gradient-card);
522
+ opacity: 0;
523
+ transition: opacity var(--transition-normal);
524
+ }
525
+
526
+ .mode-card:hover .mode-card-glow {
527
+ opacity: 1;
528
+ }
529
+
530
+ .mode-card-content {
531
+ position: relative;
532
+ padding: 28px;
533
+ text-align: center;
155
534
  }
156
535
 
157
536
  .mode-icon {
158
- font-size: 2rem;
159
- font-weight: 700;
160
- color: var(--accent);
161
- margin-bottom: 0.5rem;
537
+ width: 72px;
538
+ height: 72px;
539
+ margin: 0 auto 20px;
540
+ border-radius: var(--radius-lg);
541
+ display: flex;
542
+ align-items: center;
543
+ justify-content: center;
544
+ transition: transform var(--transition-spring);
545
+ }
546
+
547
+ .mode-card:hover .mode-icon {
548
+ transform: scale(1.1);
549
+ }
550
+
551
+ .mode-icon.host {
552
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.2) 0%, rgba(6, 182, 212, 0.2) 100%);
553
+ color: var(--accent-success);
554
+ }
555
+
556
+ .mode-icon.remote {
557
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.2) 0%, rgba(236, 72, 153, 0.2) 100%);
558
+ color: var(--accent-primary);
162
559
  }
163
560
 
164
561
  .mode-card h3 {
165
- margin-bottom: 0.5rem;
562
+ font-size: 1.2rem;
563
+ font-weight: 600;
564
+ margin-bottom: 8px;
166
565
  }
167
566
 
168
567
  .mode-card p {
169
568
  color: var(--text-secondary);
170
569
  font-size: 0.9rem;
570
+ line-height: 1.5;
171
571
  }
172
572
 
173
- /* FORMS */
174
- .config-section {
175
- background: var(--bg-card);
176
- border-radius: 12px;
177
- padding: 1.5rem;
178
- margin-bottom: 1.5rem;
573
+ .mode-badge {
574
+ display: inline-block;
575
+ margin-top: 16px;
576
+ padding: 4px 12px;
577
+ font-size: 0.75rem;
578
+ font-weight: 600;
579
+ text-transform: uppercase;
580
+ letter-spacing: 0.5px;
581
+ border-radius: 20px;
582
+ background: var(--accent-success);
583
+ color: white;
179
584
  }
180
585
 
181
- .form-group {
182
- margin-bottom: 1rem;
586
+ .mode-badge.secondary {
587
+ background: var(--accent-primary);
183
588
  }
184
589
 
185
- .form-group label {
186
- display: block;
187
- margin-bottom: 0.5rem;
188
- color: var(--text-secondary);
189
- font-size: 0.9rem;
590
+ /* ============================================
591
+ Config Panel
592
+ ============================================ */
593
+
594
+ .config-panel {
595
+ background: var(--bg-card);
596
+ border: 1px solid var(--border-color);
597
+ border-radius: var(--radius-lg);
598
+ padding: 24px;
599
+ margin-bottom: 24px;
600
+ animation: slideUp 0.4s ease forwards;
190
601
  }
191
602
 
192
- input, select {
193
- width: 100%;
194
- padding: 0.75rem 1rem;
195
- background: var(--bg-primary);
196
- border: 1px solid var(--border);
197
- border-radius: 8px;
198
- color: var(--text-primary);
199
- font-size: 0.95rem;
603
+ .panel-header {
604
+ display: flex;
605
+ align-items: center;
606
+ gap: 12px;
607
+ margin-bottom: 24px;
608
+ padding-bottom: 16px;
609
+ border-bottom: 1px solid var(--border-color);
610
+ color: var(--accent-primary);
200
611
  }
201
612
 
202
- input:focus, select:focus {
203
- outline: none;
204
- border-color: var(--accent);
613
+ .panel-header h3 {
614
+ font-size: 1.1rem;
615
+ font-weight: 600;
205
616
  }
206
617
 
207
- .input-row {
208
- display: flex;
209
- gap: 0.5rem;
618
+ .form-group {
619
+ margin-bottom: 20px;
210
620
  }
211
621
 
212
- .input-row input {
213
- flex: 1;
622
+ .form-group label {
623
+ display: block;
624
+ margin-bottom: 8px;
625
+ font-weight: 500;
626
+ color: var(--text-secondary);
214
627
  }
215
628
 
216
- .form-row {
629
+ .input-group {
217
630
  display: flex;
218
- gap: 0.5rem;
219
- flex-wrap: wrap;
631
+ align-items: center;
632
+ gap: 12px;
633
+ padding: 0 16px;
634
+ background: var(--bg-tertiary);
635
+ border: 1px solid var(--border-color);
636
+ border-radius: var(--radius-md);
637
+ transition: all var(--transition-fast);
220
638
  }
221
639
 
222
- .form-row input, .form-row select {
223
- width: auto;
224
- flex: 1;
225
- min-width: 150px;
640
+ .input-group:focus-within {
641
+ border-color: var(--border-focus);
642
+ box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
226
643
  }
227
644
 
228
- /* BUTTONS */
229
- .btn-primary {
230
- background: var(--accent);
231
- color: white;
645
+ .input-group svg {
646
+ flex-shrink: 0;
647
+ color: var(--text-tertiary);
648
+ }
649
+
650
+ .input-group input {
651
+ flex: 1;
652
+ padding: 14px 0;
653
+ background: none;
232
654
  border: none;
233
- padding: 0.75rem 1.5rem;
234
- border-radius: 8px;
235
- font-weight: 600;
236
- cursor: pointer;
237
- transition: background 0.2s;
655
+ outline: none;
238
656
  }
239
657
 
240
- .btn-primary:hover {
241
- background: var(--accent-hover);
658
+ .input-group input::placeholder {
659
+ color: var(--text-tertiary);
242
660
  }
243
661
 
244
- .btn-secondary {
245
- background: var(--bg-hover);
246
- color: var(--text-primary);
247
- border: 1px solid var(--border);
248
- padding: 0.75rem 1.5rem;
249
- border-radius: 8px;
250
- cursor: pointer;
251
- transition: background 0.2s;
662
+ .save-bar {
663
+ display: flex;
664
+ justify-content: flex-end;
665
+ gap: 12px;
252
666
  }
253
667
 
254
- .btn-secondary:hover {
255
- background: var(--border);
668
+ .hidden {
669
+ display: none !important;
256
670
  }
257
671
 
258
- /* STATS */
672
+ /* ============================================
673
+ Stats Grid
674
+ ============================================ */
675
+
259
676
  .stats-grid {
260
677
  display: grid;
261
678
  grid-template-columns: repeat(4, 1fr);
262
- gap: 1rem;
263
- margin-bottom: 2rem;
679
+ gap: 16px;
680
+ margin-bottom: 24px;
264
681
  }
265
682
 
266
683
  .stat-card {
684
+ display: flex;
685
+ align-items: center;
686
+ gap: 16px;
687
+ padding: 20px;
267
688
  background: var(--bg-card);
268
- border-radius: 12px;
269
- padding: 1.5rem;
270
- text-align: center;
689
+ border: 1px solid var(--border-color);
690
+ border-radius: var(--radius-lg);
691
+ transition: all var(--transition-normal);
692
+ }
693
+
694
+ .stat-card:hover {
695
+ transform: translateY(-2px);
696
+ box-shadow: var(--shadow-md);
697
+ }
698
+
699
+ .stat-icon {
700
+ width: 48px;
701
+ height: 48px;
702
+ border-radius: var(--radius-md);
703
+ display: flex;
704
+ align-items: center;
705
+ justify-content: center;
706
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.2) 0%, rgba(139, 92, 246, 0.1) 100%);
707
+ color: var(--accent-primary);
708
+ flex-shrink: 0;
709
+ }
710
+
711
+ .stat-icon.green {
712
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.2) 0%, rgba(16, 185, 129, 0.1) 100%);
713
+ color: var(--accent-success);
714
+ }
715
+
716
+ .stat-icon.orange {
717
+ background: linear-gradient(135deg, rgba(245, 158, 11, 0.2) 0%, rgba(245, 158, 11, 0.1) 100%);
718
+ color: var(--accent-warning);
719
+ }
720
+
721
+ .stat-icon.purple {
722
+ background: linear-gradient(135deg, rgba(236, 72, 153, 0.2) 0%, rgba(236, 72, 153, 0.1) 100%);
723
+ color: #ec4899;
271
724
  }
272
725
 
273
726
  .stat-value {
274
- font-size: 2rem;
727
+ font-size: 1.8rem;
275
728
  font-weight: 700;
276
- color: var(--accent);
729
+ line-height: 1;
730
+ margin-bottom: 4px;
277
731
  }
278
732
 
279
733
  .stat-label {
734
+ font-size: 0.85rem;
280
735
  color: var(--text-secondary);
281
- font-size: 0.9rem;
282
- margin-top: 0.25rem;
283
736
  }
284
737
 
285
- /* DASHBOARD */
738
+ /* ============================================
739
+ Dashboard Grid
740
+ ============================================ */
741
+
286
742
  .dashboard-grid {
287
743
  display: grid;
288
- grid-template-columns: 1fr 1fr;
289
- gap: 1.5rem;
744
+ grid-template-columns: repeat(2, 1fr);
745
+ gap: 20px;
290
746
  }
291
747
 
748
+ /* ============================================
749
+ Cards
750
+ ============================================ */
751
+
292
752
  .card {
293
753
  background: var(--bg-card);
294
- border-radius: 12px;
295
- padding: 1.5rem;
754
+ border: 1px solid var(--border-color);
755
+ border-radius: var(--radius-lg);
756
+ overflow: hidden;
757
+ transition: all var(--transition-normal);
758
+ }
759
+
760
+ .card:hover {
761
+ box-shadow: var(--shadow-md);
762
+ }
763
+
764
+ .card-lg {
765
+ grid-column: span 2;
296
766
  }
297
767
 
298
768
  .card-header {
299
769
  display: flex;
300
- justify-content: space-between;
301
770
  align-items: center;
302
- margin-bottom: 1rem;
771
+ justify-content: space-between;
772
+ padding: 16px 20px;
773
+ border-bottom: 1px solid var(--border-color);
774
+ }
775
+
776
+ .card-header h3 {
777
+ font-size: 1rem;
778
+ font-weight: 600;
303
779
  }
304
780
 
305
- /* ACTIVITY LIST */
781
+ /* ============================================
782
+ Activity List
783
+ ============================================ */
784
+
306
785
  .activity-list, .user-list, .lock-list, .member-list {
786
+ padding: 16px;
307
787
  max-height: 300px;
308
788
  overflow-y: auto;
309
789
  }
310
790
 
311
791
  .activity-item {
312
- padding: 0.75rem 0;
313
- border-bottom: 1px solid var(--border);
314
792
  display: flex;
315
- justify-content: space-between;
316
- align-items: center;
793
+ align-items: flex-start;
794
+ gap: 12px;
795
+ padding: 12px;
796
+ border-radius: var(--radius-md);
797
+ transition: background var(--transition-fast);
798
+ animation: fadeInUp 0.3s ease forwards;
799
+ opacity: 0;
317
800
  }
318
801
 
319
- .activity-item:last-child {
320
- border-bottom: none;
802
+ .activity-item:hover {
803
+ background: var(--bg-hover);
321
804
  }
322
805
 
323
- .activity-file {
324
- font-weight: 500;
325
- color: var(--text-primary);
806
+ @keyframes fadeInUp {
807
+ from {
808
+ opacity: 0;
809
+ transform: translateY(10px);
810
+ }
811
+ to {
812
+ opacity: 1;
813
+ transform: translateY(0);
814
+ }
326
815
  }
327
816
 
328
- .activity-action {
329
- padding: 0.25rem 0.5rem;
330
- border-radius: 4px;
817
+ .activity-icon {
818
+ width: 32px;
819
+ height: 32px;
820
+ border-radius: var(--radius-sm);
821
+ display: flex;
822
+ align-items: center;
823
+ justify-content: center;
824
+ flex-shrink: 0;
331
825
  font-size: 0.75rem;
332
- font-weight: 500;
333
- text-transform: uppercase;
826
+ font-weight: 600;
334
827
  }
335
828
 
336
- .activity-action.read { background: rgba(59, 130, 246, 0.2); color: #60a5fa; }
337
- .activity-action.create { background: rgba(16, 185, 129, 0.2); color: #34d399; }
338
- .activity-action.update { background: rgba(245, 158, 11, 0.2); color: #fbbf24; }
339
- .activity-action.delete { background: rgba(239, 68, 68, 0.2); color: #f87171; }
829
+ .activity-icon.read { background: rgba(6, 182, 212, 0.15); color: var(--accent-secondary); }
830
+ .activity-icon.create { background: rgba(16, 185, 129, 0.15); color: var(--accent-success); }
831
+ .activity-icon.update { background: rgba(245, 158, 11, 0.15); color: var(--accent-warning); }
832
+ .activity-icon.delete { background: rgba(239, 68, 68, 0.15); color: var(--accent-danger); }
833
+ .activity-icon.lock { background: rgba(139, 92, 246, 0.15); color: var(--accent-primary); }
834
+ .activity-icon.unlock { background: rgba(139, 92, 246, 0.15); color: var(--accent-primary); }
340
835
 
341
- .activity-user {
342
- color: var(--text-muted);
343
- font-size: 0.85rem;
836
+ .activity-info {
837
+ flex: 1;
838
+ min-width: 0;
344
839
  }
345
840
 
346
- .activity-time {
347
- color: var(--text-muted);
348
- font-size: 0.85rem;
841
+ .activity-file {
842
+ font-weight: 500;
843
+ white-space: nowrap;
844
+ overflow: hidden;
845
+ text-overflow: ellipsis;
349
846
  }
350
847
 
848
+ .activity-meta {
849
+ font-size: 0.8rem;
850
+ color: var(--text-tertiary);
851
+ }
852
+
853
+ /* ============================================
854
+ User List
855
+ ============================================ */
856
+
351
857
  .user-item {
352
- padding: 0.75rem 0;
353
- border-bottom: 1px solid var(--border);
354
858
  display: flex;
355
859
  align-items: center;
356
- gap: 0.75rem;
860
+ gap: 12px;
861
+ padding: 10px 12px;
862
+ border-radius: var(--radius-md);
863
+ transition: background var(--transition-fast);
864
+ animation: fadeInUp 0.3s ease forwards;
865
+ opacity: 0;
866
+ }
867
+
868
+ .user-item:hover {
869
+ background: var(--bg-hover);
357
870
  }
358
871
 
359
872
  .user-avatar {
360
- width: 32px;
361
- height: 32px;
873
+ width: 36px;
874
+ height: 36px;
362
875
  border-radius: 50%;
363
- background: var(--accent);
364
876
  display: flex;
365
877
  align-items: center;
366
878
  justify-content: center;
367
879
  font-weight: 600;
368
880
  font-size: 0.85rem;
881
+ color: white;
882
+ flex-shrink: 0;
883
+ }
884
+
885
+ .user-info {
886
+ flex: 1;
369
887
  }
370
888
 
371
889
  .user-name {
372
890
  font-weight: 500;
891
+ font-size: 0.9rem;
373
892
  }
374
893
 
375
894
  .user-status {
376
- margin-left: auto;
377
- padding: 0.25rem 0.5rem;
378
- border-radius: 4px;
379
895
  font-size: 0.75rem;
896
+ color: var(--text-tertiary);
380
897
  }
381
898
 
382
899
  .user-status.online {
383
- background: rgba(16, 185, 129, 0.2);
384
- color: var(--success);
900
+ color: var(--accent-success);
901
+ }
902
+
903
+ /* ============================================
904
+ Lock List
905
+ ============================================ */
906
+
907
+ .lock-item {
908
+ display: flex;
909
+ align-items: center;
910
+ gap: 12px;
911
+ padding: 12px;
912
+ border-radius: var(--radius-md);
913
+ border: 1px solid var(--border-color);
914
+ margin-bottom: 8px;
915
+ animation: fadeInUp 0.3s ease forwards;
916
+ opacity: 0;
917
+ }
918
+
919
+ .lock-icon {
920
+ width: 32px;
921
+ height: 32px;
922
+ border-radius: var(--radius-sm);
923
+ display: flex;
924
+ align-items: center;
925
+ justify-content: center;
926
+ background: rgba(245, 158, 11, 0.15);
927
+ color: var(--accent-warning);
928
+ flex-shrink: 0;
929
+ }
930
+
931
+ .lock-info {
932
+ flex: 1;
933
+ }
934
+
935
+ .lock-file {
936
+ font-weight: 500;
937
+ font-family: 'JetBrains Mono', monospace;
938
+ font-size: 0.85rem;
385
939
  }
386
940
 
387
- /* CHANGES */
388
- .filters {
941
+ .lock-meta {
942
+ font-size: 0.75rem;
943
+ color: var(--text-tertiary);
944
+ }
945
+
946
+ /* ============================================
947
+ Filters
948
+ ============================================ */
949
+
950
+ .filters-bar {
951
+ display: flex;
952
+ align-items: center;
953
+ gap: 12px;
954
+ margin-bottom: 20px;
955
+ padding: 16px 20px;
956
+ background: var(--bg-card);
957
+ border: 1px solid var(--border-color);
958
+ border-radius: var(--radius-lg);
959
+ }
960
+
961
+ .filter-group {
389
962
  display: flex;
390
- gap: 0.5rem;
391
- margin-bottom: 1.5rem;
392
- flex-wrap: wrap;
963
+ gap: 12px;
964
+ flex: 1;
393
965
  }
394
966
 
395
- .filters input, .filters select {
396
- width: auto;
967
+ .filter-input, .filter-select {
397
968
  flex: 1;
398
- min-width: 150px;
969
+ padding: 10px 14px;
970
+ background: var(--bg-tertiary);
971
+ border: 1px solid var(--border-color);
972
+ border-radius: var(--radius-md);
973
+ outline: none;
974
+ transition: all var(--transition-fast);
975
+ }
976
+
977
+ .filter-input:focus, .filter-select:focus {
978
+ border-color: var(--border-focus);
979
+ box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
980
+ }
981
+
982
+ .filter-select {
983
+ min-width: 140px;
399
984
  }
400
985
 
986
+ /* ============================================
987
+ Changes List
988
+ ============================================ */
989
+
401
990
  .changes-list {
402
991
  background: var(--bg-card);
403
- border-radius: 12px;
992
+ border: 1px solid var(--border-color);
993
+ border-radius: var(--radius-lg);
404
994
  overflow: hidden;
405
995
  }
406
996
 
407
997
  .change-item {
408
- padding: 1rem 1.5rem;
409
- border-bottom: 1px solid var(--border);
410
- display: grid;
411
- grid-template-columns: auto 1fr auto auto;
412
- gap: 1rem;
998
+ display: flex;
413
999
  align-items: center;
1000
+ gap: 16px;
1001
+ padding: 16px 20px;
1002
+ border-bottom: 1px solid var(--border-color);
1003
+ transition: background var(--transition-fast);
1004
+ animation: fadeInUp 0.3s ease forwards;
1005
+ opacity: 0;
414
1006
  }
415
1007
 
416
1008
  .change-item:last-child {
417
1009
  border-bottom: none;
418
1010
  }
419
1011
 
420
- .change-badge {
421
- padding: 0.25rem 0.5rem;
422
- border-radius: 4px;
1012
+ .change-item:hover {
1013
+ background: var(--bg-hover);
1014
+ }
1015
+
1016
+ .change-action {
1017
+ padding: 4px 10px;
1018
+ border-radius: 6px;
423
1019
  font-size: 0.75rem;
424
1020
  font-weight: 600;
425
1021
  text-transform: uppercase;
1022
+ letter-spacing: 0.5px;
1023
+ flex-shrink: 0;
426
1024
  }
427
1025
 
428
- .change-badge.read { background: rgba(59, 130, 246, 0.2); color: #60a5fa; }
429
- .change-badge.create { background: rgba(16, 185, 129, 0.2); color: #34d399; }
430
- .change-badge.update { background: rgba(245, 158, 11, 0.2); color: #fbbf24; }
431
- .change-badge.delete { background: rgba(239, 68, 68, 0.2); color: #f87171; }
1026
+ .change-action.read { background: rgba(6, 182, 212, 0.15); color: var(--accent-secondary); }
1027
+ .change-action.create { background: rgba(16, 185, 129, 0.15); color: var(--accent-success); }
1028
+ .change-action.update { background: rgba(245, 158, 11, 0.15); color: var(--accent-warning); }
1029
+ .change-action.delete { background: rgba(239, 68, 68, 0.15); color: var(--accent-danger); }
432
1030
 
433
- .change-path {
434
- font-family: 'Fira Code', monospace;
1031
+ .change-file {
1032
+ flex: 1;
1033
+ font-family: 'JetBrains Mono', monospace;
435
1034
  font-size: 0.9rem;
436
- color: var(--text-primary);
437
1035
  }
438
1036
 
439
1037
  .change-user {
440
- color: var(--text-secondary);
441
1038
  font-size: 0.85rem;
1039
+ color: var(--text-secondary);
442
1040
  }
443
1041
 
444
1042
  .change-time {
445
- color: var(--text-muted);
446
- font-size: 0.85rem;
1043
+ font-size: 0.8rem;
1044
+ color: var(--text-tertiary);
447
1045
  }
448
1046
 
449
- /* LOCKS TABLE */
450
- .locks-table {
451
- overflow-x: auto;
1047
+ /* ============================================
1048
+ Team Page
1049
+ ============================================ */
1050
+
1051
+ .invite-form {
1052
+ padding: 20px;
452
1053
  }
453
1054
 
454
- .locks-table table {
455
- width: 100%;
456
- border-collapse: collapse;
1055
+ .form-row {
1056
+ display: flex;
1057
+ gap: 12px;
1058
+ align-items: center;
457
1059
  }
458
1060
 
459
- .locks-table th,
460
- .locks-table td {
461
- padding: 0.75rem 1rem;
462
- text-align: left;
463
- border-bottom: 1px solid var(--border);
1061
+ .form-input, .form-select {
1062
+ padding: 12px 16px;
1063
+ background: var(--bg-tertiary);
1064
+ border: 1px solid var(--border-color);
1065
+ border-radius: var(--radius-md);
1066
+ outline: none;
1067
+ transition: all var(--transition-fast);
464
1068
  }
465
1069
 
466
- .locks-table th {
467
- background: var(--bg-primary);
468
- color: var(--text-secondary);
469
- font-weight: 600;
470
- font-size: 0.85rem;
471
- text-transform: uppercase;
1070
+ .form-input:focus, .form-select:focus {
1071
+ border-color: var(--border-focus);
1072
+ box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
1073
+ }
1074
+
1075
+ .form-input {
1076
+ flex: 1;
1077
+ }
1078
+
1079
+ .form-select {
1080
+ min-width: 160px;
1081
+ }
1082
+
1083
+ .days-input {
1084
+ width: 80px;
1085
+ flex: none;
472
1086
  }
473
1087
 
474
- /* INVITE RESULT */
475
1088
  .invite-result {
476
- margin-top: 1rem;
477
- padding: 1rem;
478
- background: rgba(16, 185, 129, 0.1);
479
- border: 1px solid var(--success);
480
- border-radius: 8px;
1089
+ margin-top: 16px;
1090
+ padding: 16px;
1091
+ background: var(--bg-tertiary);
1092
+ border-radius: var(--radius-md);
1093
+ animation: slideUp 0.3s ease forwards;
481
1094
  }
482
1095
 
483
1096
  .invite-result label {
484
1097
  display: block;
485
- margin-bottom: 0.5rem;
486
- color: var(--success);
1098
+ margin-bottom: 8px;
487
1099
  font-weight: 500;
1100
+ color: var(--accent-success);
488
1101
  }
489
1102
 
490
- /* INVITE PAGE */
491
- .invite-page {
492
- min-height: 100vh;
1103
+ .invite-result .input-group {
1104
+ background: var(--bg-secondary);
1105
+ }
1106
+
1107
+ .member-item {
493
1108
  display: flex;
494
1109
  align-items: center;
495
- justify-content: center;
496
- padding: 2rem;
1110
+ gap: 12px;
1111
+ padding: 12px 16px;
1112
+ border-bottom: 1px solid var(--border-color);
1113
+ animation: fadeInUp 0.3s ease forwards;
1114
+ opacity: 0;
497
1115
  }
498
1116
 
499
- .invite-card {
500
- background: var(--bg-card);
501
- border-radius: 16px;
502
- padding: 2.5rem;
503
- max-width: 500px;
504
- width: 100%;
1117
+ .member-item:last-child {
1118
+ border-bottom: none;
1119
+ }
1120
+
1121
+ .member-role {
1122
+ padding: 4px 10px;
1123
+ border-radius: 6px;
1124
+ font-size: 0.75rem;
1125
+ font-weight: 600;
1126
+ background: rgba(139, 92, 246, 0.15);
1127
+ color: var(--accent-primary);
1128
+ }
1129
+
1130
+ /* ============================================
1131
+ Empty State
1132
+ ============================================ */
1133
+
1134
+ .empty-state {
1135
+ display: flex;
1136
+ flex-direction: column;
1137
+ align-items: center;
1138
+ justify-content: center;
1139
+ padding: 40px 20px;
505
1140
  text-align: center;
506
1141
  }
507
1142
 
508
- .invite-card h1 {
509
- color: var(--accent);
510
- margin-bottom: 0.5rem;
1143
+ .empty-state p {
1144
+ color: var(--text-tertiary);
1145
+ margin-top: 12px;
1146
+ }
1147
+
1148
+ /* ============================================
1149
+ Buttons
1150
+ ============================================ */
1151
+
1152
+ .btn {
1153
+ display: inline-flex;
1154
+ align-items: center;
1155
+ gap: 8px;
1156
+ padding: 12px 20px;
1157
+ border-radius: var(--radius-md);
1158
+ font-weight: 500;
1159
+ transition: all var(--transition-fast);
1160
+ white-space: nowrap;
511
1161
  }
512
1162
 
513
- .invite-card h2 {
1163
+ .btn-primary {
1164
+ background: var(--gradient-primary);
1165
+ color: white;
1166
+ box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);
1167
+ }
1168
+
1169
+ .btn-primary:hover {
1170
+ transform: translateY(-2px);
1171
+ box-shadow: 0 6px 20px rgba(139, 92, 246, 0.4);
1172
+ }
1173
+
1174
+ .btn-primary:active {
1175
+ transform: translateY(0);
1176
+ }
1177
+
1178
+ .btn-success {
1179
+ background: var(--accent-success);
1180
+ color: white;
1181
+ box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
1182
+ }
1183
+
1184
+ .btn-success:hover {
1185
+ transform: translateY(-2px);
1186
+ box-shadow: 0 6px 20px rgba(16, 185, 129, 0.4);
1187
+ }
1188
+
1189
+ .btn-secondary {
1190
+ background: var(--bg-tertiary);
1191
+ color: var(--text-primary);
1192
+ border: 1px solid var(--border-color);
1193
+ }
1194
+
1195
+ .btn-secondary:hover {
1196
+ background: var(--bg-hover);
1197
+ border-color: var(--text-tertiary);
1198
+ }
1199
+
1200
+ .btn-ghost {
514
1201
  color: var(--text-secondary);
515
- font-size: 1.25rem;
516
- margin-bottom: 2rem;
517
1202
  }
518
1203
 
519
- .invite-info {
520
- background: var(--bg-primary);
521
- border-radius: 8px;
522
- padding: 1rem;
523
- margin-bottom: 1.5rem;
524
- text-align: left;
1204
+ .btn-ghost:hover {
1205
+ background: var(--bg-hover);
1206
+ color: var(--text-primary);
525
1207
  }
526
1208
 
527
- .invite-info p {
528
- margin-bottom: 0.5rem;
529
- font-size: 0.9rem;
1209
+ .btn-sm {
1210
+ padding: 8px 14px;
1211
+ font-size: 0.85rem;
530
1212
  }
531
1213
 
532
- .invite-info p:last-child {
533
- margin-bottom: 0;
1214
+ /* ============================================
1215
+ Toast Notifications
1216
+ ============================================ */
1217
+
1218
+ .toast-container {
1219
+ position: fixed;
1220
+ top: 24px;
1221
+ right: 24px;
1222
+ z-index: 10000;
1223
+ display: flex;
1224
+ flex-direction: column;
1225
+ gap: 12px;
534
1226
  }
535
1227
 
536
- .invite-status {
537
- padding: 2rem;
1228
+ .toast {
1229
+ display: flex;
1230
+ align-items: center;
1231
+ gap: 12px;
1232
+ padding: 14px 20px;
1233
+ background: var(--bg-secondary);
1234
+ border: 1px solid var(--border-color);
1235
+ border-radius: var(--radius-md);
1236
+ box-shadow: var(--shadow-lg);
1237
+ animation: toastIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
1238
+ min-width: 280px;
1239
+ max-width: 400px;
538
1240
  }
539
1241
 
540
- .spinner {
541
- width: 40px;
542
- height: 40px;
543
- border: 3px solid var(--border);
544
- border-top-color: var(--accent);
545
- border-radius: 50%;
546
- animation: spin 1s linear infinite;
547
- margin: 0 auto 1rem;
1242
+ .toast.removing {
1243
+ animation: toastOut 0.3s ease forwards;
548
1244
  }
549
1245
 
550
- @keyframes spin {
551
- to { transform: rotate(360deg); }
1246
+ @keyframes toastIn {
1247
+ from {
1248
+ opacity: 0;
1249
+ transform: translateX(100px) scale(0.8);
1250
+ }
1251
+ to {
1252
+ opacity: 1;
1253
+ transform: translateX(0) scale(1);
1254
+ }
552
1255
  }
553
1256
 
554
- .invite-success {
555
- padding: 1rem 0;
1257
+ @keyframes toastOut {
1258
+ to {
1259
+ opacity: 0;
1260
+ transform: translateX(100px) scale(0.8);
1261
+ }
556
1262
  }
557
1263
 
558
- .success-icon {
559
- display: inline-block;
560
- padding: 0.5rem 1rem;
561
- background: var(--success);
562
- color: white;
563
- border-radius: 8px;
564
- font-weight: 700;
565
- margin-bottom: 1rem;
1264
+ .toast-icon {
1265
+ width: 24px;
1266
+ height: 24px;
1267
+ display: flex;
1268
+ align-items: center;
1269
+ justify-content: center;
1270
+ flex-shrink: 0;
566
1271
  }
567
1272
 
568
- .error-icon {
569
- display: inline-block;
570
- padding: 0.5rem 1rem;
571
- background: var(--danger);
572
- color: white;
573
- border-radius: 8px;
574
- font-weight: 700;
575
- margin-bottom: 1rem;
1273
+ .toast.success { border-left: 3px solid var(--accent-success); }
1274
+ .toast.success .toast-icon { color: var(--accent-success); }
1275
+
1276
+ .toast.error { border-left: 3px solid var(--accent-danger); }
1277
+ .toast.error .toast-icon { color: var(--accent-danger); }
1278
+
1279
+ .toast.warning { border-left: 3px solid var(--accent-warning); }
1280
+ .toast.warning .toast-icon { color: var(--accent-warning); }
1281
+
1282
+ .toast.info { border-left: 3px solid var(--accent-secondary); }
1283
+ .toast.info .toast-icon { color: var(--accent-secondary); }
1284
+
1285
+ .toast-content {
1286
+ flex: 1;
576
1287
  }
577
1288
 
578
- .config-code {
579
- background: var(--bg-primary);
580
- border-radius: 8px;
581
- padding: 1rem;
582
- margin: 1rem 0;
583
- text-align: left;
584
- position: relative;
1289
+ .toast-title {
1290
+ font-weight: 600;
1291
+ font-size: 0.9rem;
585
1292
  }
586
1293
 
587
- .config-code pre {
588
- font-family: 'Fira Code', monospace;
1294
+ .toast-message {
589
1295
  font-size: 0.8rem;
1296
+ color: var(--text-secondary);
1297
+ margin-top: 2px;
1298
+ }
1299
+
1300
+ .toast-close {
1301
+ padding: 4px;
1302
+ color: var(--text-tertiary);
1303
+ border-radius: 4px;
1304
+ transition: all var(--transition-fast);
1305
+ }
1306
+
1307
+ .toast-close:hover {
1308
+ background: var(--bg-hover);
1309
+ color: var(--text-primary);
1310
+ }
1311
+
1312
+ /* ============================================
1313
+ Responsive
1314
+ ============================================ */
1315
+
1316
+ @media (max-width: 1200px) {
1317
+ .stats-grid {
1318
+ grid-template-columns: repeat(2, 1fr);
1319
+ }
1320
+ .dashboard-grid {
1321
+ grid-template-columns: 1fr;
1322
+ }
1323
+ .card-lg {
1324
+ grid-column: span 1;
1325
+ }
1326
+ }
1327
+
1328
+ @media (max-width: 768px) {
1329
+ .sidebar {
1330
+ position: fixed;
1331
+ left: 0;
1332
+ top: 0;
1333
+ transform: translateX(-100%);
1334
+ z-index: 1000;
1335
+ }
1336
+ .sidebar.open {
1337
+ transform: translateX(0);
1338
+ }
1339
+ .menu-toggle {
1340
+ display: flex;
1341
+ }
1342
+ .page-container {
1343
+ padding: 20px;
1344
+ }
1345
+ .mode-cards {
1346
+ grid-template-columns: 1fr;
1347
+ }
1348
+ .stats-grid {
1349
+ grid-template-columns: 1fr;
1350
+ }
1351
+ .form-row {
1352
+ flex-wrap: wrap;
1353
+ }
1354
+ .filters-bar {
1355
+ flex-direction: column;
1356
+ }
1357
+ .filter-group {
1358
+ flex-direction: column;
1359
+ width: 100%;
1360
+ }
1361
+ }
1362
+
1363
+ /* ============================================
1364
+ Locks Table
1365
+ ============================================ */
1366
+
1367
+ .locks-table {
1368
+ padding: 16px;
1369
+ }
1370
+
1371
+ .locks-table-header {
1372
+ display: grid;
1373
+ grid-template-columns: 2fr 1fr 1fr 1fr;
1374
+ gap: 16px;
1375
+ padding: 12px 16px;
1376
+ margin-bottom: 8px;
1377
+ font-size: 0.8rem;
1378
+ font-weight: 600;
1379
+ color: var(--text-tertiary);
1380
+ text-transform: uppercase;
1381
+ letter-spacing: 0.5px;
1382
+ }
1383
+
1384
+ .locks-table-row {
1385
+ display: grid;
1386
+ grid-template-columns: 2fr 1fr 1fr 1fr;
1387
+ gap: 16px;
1388
+ padding: 14px 16px;
1389
+ border-radius: var(--radius-md);
1390
+ transition: background var(--transition-fast);
1391
+ animation: fadeInUp 0.3s ease forwards;
1392
+ opacity: 0;
1393
+ align-items: center;
1394
+ }
1395
+
1396
+ .locks-table-row:hover {
1397
+ background: var(--bg-hover);
1398
+ }
1399
+
1400
+ /* ============================================
1401
+ Table
1402
+ ============================================ */
1403
+
1404
+ .table-container {
590
1405
  overflow-x: auto;
591
- white-space: pre-wrap;
592
1406
  }
593
1407
 
594
- .config-code button {
595
- position: absolute;
596
- top: 0.5rem;
597
- right: 0.5rem;
1408
+ table {
1409
+ width: 100%;
1410
+ border-collapse: collapse;
598
1411
  }
599
1412
 
600
- code {
601
- background: var(--bg-primary);
602
- padding: 0.2rem 0.4rem;
603
- border-radius: 4px;
604
- font-family: 'Fira Code', monospace;
605
- font-size: 0.9rem;
1413
+ th, td {
1414
+ padding: 12px 16px;
1415
+ text-align: left;
1416
+ border-bottom: 1px solid var(--border-color);
606
1417
  }
607
1418
 
608
- .hidden {
609
- display: none !important;
1419
+ th {
1420
+ font-size: 0.8rem;
1421
+ font-weight: 600;
1422
+ color: var(--text-tertiary);
1423
+ text-transform: uppercase;
1424
+ letter-spacing: 0.5px;
610
1425
  }
611
1426
 
612
- /* EMPTY STATE */
613
- .empty-state {
614
- text-align: center;
615
- padding: 3rem;
616
- color: var(--text-muted);
1427
+ tr:hover td {
1428
+ background: var(--bg-hover);
617
1429
  }
618
1430
 
619
- .empty-state p {
620
- margin-bottom: 1rem;
1431
+ /* ============================================
1432
+ Animations
1433
+ ============================================ */
1434
+
1435
+ @keyframes bounce {
1436
+ 0%, 100% { transform: translateY(0); }
1437
+ 50% { transform: translateY(-5px); }
621
1438
  }
622
1439
 
623
- /* SCROLLBAR */
624
- ::-webkit-scrollbar {
625
- width: 6px;
1440
+ @keyframes shake {
1441
+ 0%, 100% { transform: translateX(0); }
1442
+ 25% { transform: translateX(-5px); }
1443
+ 75% { transform: translateX(5px); }
626
1444
  }
627
1445
 
628
- ::-webkit-scrollbar-track {
629
- background: var(--bg-primary);
1446
+ @keyframes glow {
1447
+ 0%, 100% { box-shadow: 0 0 5px rgba(139, 92, 246, 0.2); }
1448
+ 50% { box-shadow: 0 0 20px rgba(139, 92, 246, 0.4); }
630
1449
  }
631
1450
 
632
- ::-webkit-scrollbar-thumb {
633
- background: var(--border);
634
- border-radius: 3px;
1451
+ /* ============================================
1452
+ Scrollbar for all scrollable elements
1453
+ ============================================ */
1454
+
1455
+ .activity-list::-webkit-scrollbar,
1456
+ .user-list::-webkit-scrollbar,
1457
+ .lock-list::-webkit-scrollbar,
1458
+ .member-list::-webkit-scrollbar {
1459
+ width: 4px;
1460
+ }
1461
+
1462
+ .activity-list::-webkit-scrollbar-track,
1463
+ .user-list::-webkit-scrollbar-track,
1464
+ .lock-list::-webkit-scrollbar-track,
1465
+ .member-list::-webkit-scrollbar-track {
1466
+ background: transparent;
635
1467
  }
636
1468
 
637
- ::-webkit-scrollbar-thumb:hover {
638
- background: var(--text-muted);
1469
+ .activity-list::-webkit-scrollbar-thumb,
1470
+ .user-list::-webkit-scrollbar-thumb,
1471
+ .lock-list::-webkit-scrollbar-thumb,
1472
+ .member-list::-webkit-scrollbar-thumb {
1473
+ background: var(--border-color);
1474
+ border-radius: 2px;
639
1475
  }