jkushwaha commited on
Commit
6f7e232
·
verified ·
1 Parent(s): 72d2127

Delete tmp

Browse files
Files changed (1) hide show
  1. tmp +0 -1691
tmp DELETED
@@ -1,1691 +0,0 @@
1
- /* ── Reset ── */
2
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
3
- body {
4
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
5
- font-size: 14px;
6
- background: #f0f2f5;
7
- color: #1a1a2e;
8
- min-height: 100vh;
9
- }
10
- .app { display: flex; flex-direction: column; min-height: 100vh; }
11
-
12
- /* ── Header ── */
13
- .app-header {
14
- background: linear-gradient(135deg, #1a1a2e 0%, #16213e 60%, #0f3460 100%);
15
- color: #fff;
16
- padding: 14px 28px;
17
- box-shadow: 0 2px 12px rgba(0,0,0,0.3);
18
- display: flex;
19
- align-items: center;
20
- justify-content: space-between;
21
- gap: 12px;
22
- flex-wrap: wrap;
23
- position: sticky;
24
- top: 0;
25
- z-index: 100;
26
- }
27
- .header-left h1 { font-size: 1.25rem; font-weight: 700; }
28
- .header-sub { margin-top: 3px; color: rgba(255,255,255,0.55); font-size: 12px; }
29
-
30
- /* ── Brand Title ── */
31
- .brand-title {
32
- display: flex; align-items: center; gap: 12px;
33
- }
34
- .brand-icon {
35
- width: 44px; height: 44px; border-radius: 11px; flex-shrink: 0;
36
- background: linear-gradient(135deg, #4f86c6 0%, #9b73c8 100%);
37
- color: #fff; font-size: 12px; font-weight: 900;
38
- display: flex; align-items: center; justify-content: center;
39
- letter-spacing: 1.5px;
40
- box-shadow: 0 4px 14px rgba(79,134,198,0.45), inset 0 1px 0 rgba(255,255,255,0.2);
41
- }
42
- .brand-logo { width: 44px; height: 44px; border-radius: 11px; object-fit: contain; flex-shrink: 0; }
43
- .brand-text { display: flex; flex-direction: column; line-height: 1; }
44
- .brand-main {
45
- font-size: 1.25rem; font-weight: 800; letter-spacing: 0.2px;
46
- background: linear-gradient(100deg, #ffffff 0%, #b8d4f4 60%, #d4b8f4 100%);
47
- -webkit-background-clip: text; -webkit-text-fill-color: transparent;
48
- background-clip: text;
49
- }
50
- .brand-sub {
51
- margin-top: 4px; font-size: 10px; font-weight: 600;
52
- letter-spacing: 3px; text-transform: uppercase;
53
- color: rgba(255,255,255,0.45);
54
- }
55
- .header-right { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
56
-
57
- /* ── Profile menu ── */
58
- .profile-menu-wrap { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; }
59
- .logged-in-label {
60
- font-size: 13px;
61
- color: #555;
62
- white-space: nowrap;
63
- text-align: right;
64
- line-height: 1.4;
65
- background: #f0f2f7;
66
- border: 1px solid #dde1ec;
67
- border-radius: 20px;
68
- padding: 5px 16px;
69
- letter-spacing: 0.01em;
70
- min-width: 180px;
71
- }
72
- .logged-in-label strong { color: #2c3e6b; font-weight: 700; }
73
- .role-badge { display: inline-block; font-size: 11px; font-weight: 700; border-radius: 10px; padding: 2px 8px; text-transform: capitalize; vertical-align: middle; }
74
- .ticket-level-badge { display: inline-block; font-size: 10px; font-weight: 700; border-radius: 8px; padding: 2px 7px; white-space: nowrap; }
75
- .ticket-level-badge.level-I { background: #fde8e8; color: #c0392b; }
76
- .ticket-level-badge.level-II { background: #e8f0fe; color: #1a56c4; }
77
- .ticket-level-badge.level-III { background: #e6f9f0; color: #1a7a4a; }
78
- .role-badge--admin { background: #fde8e8; color: #c0392b; }
79
- .role-badge--reviewer { background: #e8f0fe; color: #1a56c4; }
80
- .role-badge--tester { background: #e6f9f0; color: #1a7a4a; }
81
- .profile-menu { position: relative; }
82
- .profile-btn {
83
- display: flex; align-items: center; gap: 8px;
84
- background: rgba(255,255,255,0.12);
85
- border: 1px solid rgba(255,255,255,0.2);
86
- border-radius: 20px;
87
- padding: 6px 12px 6px 6px;
88
- color: #fff; cursor: pointer;
89
- transition: background 0.15s;
90
- }
91
- .profile-btn:hover { background: rgba(255,255,255,0.22); }
92
- .profile-avatar {
93
- width: 28px; height: 28px;
94
- border-radius: 50%;
95
- background: linear-gradient(135deg, #4f86c6, #9b73c8);
96
- color: #fff; font-size: 13px; font-weight: 700;
97
- display: flex; align-items: center; justify-content: center;
98
- flex-shrink: 0;
99
- }
100
- .profile-name { font-size: 13px; font-weight: 600; max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
101
-
102
- .profile-dropdown {
103
- position: absolute; right: 0; top: calc(100% + 8px);
104
- background: #fff; border-radius: 12px;
105
- box-shadow: 0 8px 32px rgba(0,0,0,0.2);
106
- border: 1px solid #e8eaed;
107
- min-width: 180px; z-index: 500;
108
- overflow: hidden;
109
- animation: dd-in 0.15s ease;
110
- }
111
- @keyframes dd-in { from{opacity:0;transform:translateY(-6px)} to{opacity:1;transform:translateY(0)} }
112
- .profile-dd-info {
113
- display: flex; align-items: center; gap: 10px;
114
- padding: 14px 16px;
115
- background: #f7f9fc;
116
- }
117
- .profile-dd-avatar {
118
- width: 34px; height: 34px; border-radius: 50%;
119
- background: linear-gradient(135deg, #4f86c6, #9b73c8);
120
- color: #fff; font-size: 14px; font-weight: 700;
121
- display: flex; align-items: center; justify-content: center;
122
- flex-shrink: 0;
123
- }
124
- .profile-dd-name { font-size: 14px; font-weight: 600; color: #1a1a2e; }
125
- .profile-dd-divider { height: 1px; background: #e8eaed; }
126
- .profile-dd-item {
127
- width: 100%; padding: 12px 16px;
128
- background: none; border: none;
129
- text-align: left; font-size: 13px; font-weight: 600;
130
- color: #e05c5c; cursor: pointer;
131
- transition: background 0.1s;
132
- }
133
- .profile-dd-item:hover { background: #fde8e8; }
134
-
135
- /* Action buttons */
136
- .btn-logout {
137
- padding: 7px 14px;
138
- background: rgba(255,255,255,0.1);
139
- color: #fff;
140
- border: 1.5px solid rgba(255,255,255,0.3);
141
- border-radius: 7px;
142
- font-size: 13px; font-weight: 600;
143
- cursor: pointer; transition: background 0.15s; white-space: nowrap;
144
- }
145
- .btn-logout:hover { background: rgba(255,255,255,0.2); }
146
-
147
- .btn-danger-outline {
148
- padding: 7px 16px;
149
- background: transparent; color: #ff8a8a;
150
- border: 1.5px solid #ff8a8a; border-radius: 7px;
151
- font-size: 13px; font-weight: 700;
152
- cursor: pointer; transition: background 0.15s; white-space: nowrap;
153
- }
154
- .btn-danger-outline:hover { background: rgba(224,92,92,0.15); }
155
-
156
- .btn-view-report {
157
- padding: 8px 18px;
158
- background: #4f86c6; color: #fff;
159
- border: none; border-radius: 8px;
160
- font-size: 13px; font-weight: 600;
161
- cursor: pointer; white-space: nowrap; transition: background 0.15s;
162
- }
163
- .btn-view-report:hover { background: #3a70b0; }
164
- .btn-view-report.sm { font-size: 12px; padding: 6px 14px; }
165
- .btn-delete-report { padding: 8px 18px; background: #e05c5c; color: #fff; border: none; border-radius: 8px; font-size: 13px; font-weight: 600; cursor: pointer; white-space: nowrap; transition: background 0.15s; }
166
- .btn-delete-report:hover { background: #c94c4c; }
167
- .btn-delete-report.sm { font-size: 12px; padding: 6px 14px; }
168
-
169
- .btn-pdf {
170
- padding: 6px 14px;
171
- background: #2d9e5a; color: #fff;
172
- border: none; border-radius: 7px;
173
- font-size: 12px; font-weight: 700;
174
- cursor: pointer; white-space: nowrap;
175
- transition: background 0.15s;
176
- }
177
- .btn-pdf:hover { background: #228a49; }
178
- .btn-pdf-review { background: #9b73c8; }
179
- .btn-pdf-review:hover { background: #7e5bb0; }
180
- .btn-pdf-lg { padding: 8px 18px; font-size: 13px; }
181
-
182
- .report-actions { display: flex; align-items: center; gap: 6px; flex-wrap: nowrap; }
183
-
184
- .sort-arrow { font-size: 11px; opacity: 0.45; margin-left: 2px; }
185
- .sort-active { opacity: 1; color: #a8c8f0; }
186
-
187
- /* Countdown */
188
- .countdown {
189
- display: flex; flex-direction: column; align-items: center;
190
- background: rgba(255,255,255,0.1);
191
- border: 1.5px solid rgba(255,255,255,0.2);
192
- border-radius: 10px; padding: 6px 14px;
193
- min-width: 120px; text-align: center;
194
- transition: background 0.3s, border-color 0.3s;
195
- }
196
- .countdown.warning { background: rgba(224,140,74,0.2); border-color: #e08c4a; }
197
- .countdown.urgent { background: rgba(224,92,92,0.25); border-color: #e05c5c; animation: pulse-b 1s ease-in-out infinite; }
198
- @keyframes pulse-b { 0%,100%{border-color:#e05c5c} 50%{border-color:rgba(224,92,92,0.35)} }
199
- .countdown-label { font-size: 10px; color: rgba(255,255,255,0.6); text-transform: uppercase; letter-spacing: .6px; margin-bottom: 1px; }
200
- .countdown-time { font-size: 1.2rem; font-weight: 700; font-variant-numeric: tabular-nums; letter-spacing: 1px; }
201
- .countdown.urgent .countdown-time { color: #ff8a8a; }
202
- .countdown.warning .countdown-time { color: #ffc07a; }
203
-
204
- /* ── Portal selection ── */
205
- .portal-body { align-items: center; justify-content: center; padding: 20px 24px 32px; }
206
- .portal-welcome { text-align: center; margin-bottom: 20px; width: 100%; }
207
- .portal-welcome h2 { font-size: 1.3rem; font-weight: 700; margin-bottom: 4px; }
208
- .portal-welcome p { color: #666; font-size: 13px; }
209
-
210
- .portal-cards {
211
- display: flex;
212
- flex-wrap: nowrap;
213
- justify-content: center;
214
- gap: 16px;
215
- width: 100%;
216
- max-width: 1400px;
217
- margin: 0 auto;
218
- }
219
- .portal-card {
220
- flex: 1 1 200px;
221
- max-width: 260px;
222
- min-width: 0;
223
- background: #fff; border-radius: 18px; padding: 30px 20px 26px;
224
- box-shadow: 0 4px 24px rgba(0,0,0,0.08);
225
- border-top: 4px solid #4f86c6;
226
- display: flex; flex-direction: column; align-items: center;
227
- gap: 10px; text-align: center;
228
- animation: card-in 0.3s ease;
229
- }
230
- .portal-card-teal { border-top-color: #2d9e5a; }
231
- .portal-card-icon { font-size: 2.4rem; line-height: 1; }
232
- .portal-card h3 { font-size: 1rem; font-weight: 700; margin: 0; line-height: 1.3; }
233
- .portal-card p { color: #666; font-size: 12px; line-height: 1.6; margin: 0; flex: 1; }
234
- .portal-features { display: none; }
235
- .portal-card .btn-start { width: 100%; font-size: 13px; padding: 11px 10px; margin-top: auto; }
236
-
237
- .btn-start-teal { background: linear-gradient(135deg, #2d9e5a, #27875e) !important; }
238
- .btn-start-orange { background: linear-gradient(135deg, #e08c4a, #c4722a) !important; }
239
- .btn-start-purple { background: linear-gradient(135deg, #9b73c8, #7b55b0) !important; }
240
-
241
- .portal-card-orange { border-top-color: #e08c4a; }
242
- .portal-card-purple { border-top-color: #9b73c8; }
243
- .portal-card-gray { border-top-color: #888; }
244
- .portal-card-red { border-top-color: #e05c5c; }
245
-
246
- .btn-start-gray { background: linear-gradient(135deg, #666, #444) !important; }
247
- .btn-start-red { background: linear-gradient(135deg, #e05c5c, #c0392b) !important; }
248
-
249
- /* Product chip */
250
- .product-chip {
251
- display: inline-block;
252
- padding: 2px 9px;
253
- border-radius: 10px;
254
- font-size: 11px;
255
- font-weight: 700;
256
- letter-spacing: 0.03em;
257
- background: #fff0f0;
258
- color: #c0392b;
259
- border: 1px solid #f5c6c6;
260
- }
261
-
262
- /* Product ID badge (in ProductsPortal card) */
263
- .prod-id-badge {
264
- display: inline-block;
265
- padding: 1px 7px;
266
- border-radius: 6px;
267
- font-size: 11px;
268
- background: #f4f4f4;
269
- color: #888;
270
- font-family: monospace;
271
- }
272
-
273
- /* Product picker grid (2-step picker) */
274
- .prod-picker-grid {
275
- display: grid;
276
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
277
- gap: 16px;
278
- width: 100%;
279
- }
280
-
281
- .prod-picker-card {
282
- display: flex;
283
- flex-direction: column;
284
- align-items: center;
285
- gap: 8px;
286
- padding: 28px 16px 20px;
287
- border-radius: 14px;
288
- border: 2px solid #e8e8e8;
289
- background: #fff;
290
- cursor: pointer;
291
- transition: border-color 0.15s, box-shadow 0.15s, transform 0.1s;
292
- text-align: center;
293
- position: relative;
294
- }
295
- .prod-picker-card:hover {
296
- border-color: #e05c5c;
297
- box-shadow: 0 4px 20px rgba(224,92,92,0.15);
298
- transform: translateY(-2px);
299
- }
300
- .prod-picker-icon { font-size: 2rem; }
301
- .prod-picker-name { font-size: 1.3rem; font-weight: 800; color: #222; }
302
- .prod-picker-desc { font-size: 12px; color: #888; }
303
- .prod-picker-card .tp-picker-arrow {
304
- position: absolute;
305
- bottom: 12px;
306
- right: 14px;
307
- font-size: 14px;
308
- color: #ccc;
309
- }
310
- .prod-picker-card:hover .tp-picker-arrow { color: #e05c5c; }
311
-
312
- /* Product access modal list */
313
- .prod-access-list {
314
- display: flex;
315
- flex-direction: column;
316
- gap: 8px;
317
- max-height: 260px;
318
- overflow-y: auto;
319
- margin: 4px 0;
320
- }
321
- .prod-access-item {
322
- display: flex;
323
- align-items: center;
324
- gap: 10px;
325
- padding: 10px 12px;
326
- border-radius: 8px;
327
- background: #fafafa;
328
- border: 1px solid #eee;
329
- cursor: pointer;
330
- user-select: none;
331
- }
332
- .prod-access-item input[type="checkbox"] { width: 16px; height: 16px; cursor: pointer; }
333
- .prod-access-name { font-weight: 700; font-size: 13px; color: #222; }
334
- .prod-access-desc { font-size: 12px; color: #888; margin-left: auto; }
335
-
336
- /* Questions portal */
337
- .qp-toolbar {
338
- display: flex; align-items: center; gap: 12px;
339
- flex-wrap: wrap; justify-content: space-between;
340
- }
341
- .qp-actions { display: flex; gap: 8px; flex-wrap: wrap; }
342
- .qp-count { font-size: 13px; color: #555; display: flex; align-items: center; gap: 8px; }
343
- .qp-alert {
344
- padding: 10px 16px; border-radius: 8px; font-size: 13px; font-weight: 500;
345
- animation: card-in 0.2s ease;
346
- }
347
- .qp-alert.ok { background: #e6f7ee; color: #1a6e3c; border: 1px solid #2d9e5a; }
348
- .qp-alert.err { background: #fde8e8; color: #c0392b; border: 1px solid #e05c5c; }
349
- .qp-format-hint {
350
- font-size: 12px; color: #888; padding: 6px 2px;
351
- display: flex; flex-wrap: wrap; gap: 4px; align-items: center;
352
- }
353
- .qp-format-hint code { background: #f0f2f5; padding: 2px 6px; border-radius: 4px; font-size: 11px; }
354
-
355
- /* ── QuestionsPortal inline editing ── */
356
- .qp-edit-table td { vertical-align: top; padding: 8px 10px; }
357
- .qp-inline-input {
358
- width: 100%; padding: 7px 10px;
359
- border: 1.5px solid #d0d4db; border-radius: 6px;
360
- font-size: 13px; color: #1a1a2e; outline: none;
361
- transition: border-color 0.15s, box-shadow 0.15s;
362
- }
363
- .qp-inline-input:focus {
364
- border-color: #4f86c6; box-shadow: 0 0 0 2px rgba(79,134,198,0.15);
365
- }
366
- .qp-std-input { font-family: monospace; font-weight: 600; }
367
- .qp-inline-textarea {
368
- width: 100%; padding: 7px 10px;
369
- border: 1.5px solid #d0d4db; border-radius: 6px;
370
- font-size: 13px; color: #1a1a2e; outline: none; resize: vertical;
371
- min-height: 56px; line-height: 1.5;
372
- transition: border-color 0.15s, box-shadow 0.15s;
373
- }
374
- .qp-inline-textarea:focus {
375
- border-color: #4f86c6; box-shadow: 0 0 0 2px rgba(79,134,198,0.15);
376
- }
377
- .qp-marks-input {
378
- width: 68px; padding: 7px 8px; text-align: center;
379
- border: 1.5px solid #d0d4db; border-radius: 6px;
380
- font-size: 13px; font-weight: 700; color: #1a1a2e; outline: none;
381
- transition: border-color 0.15s;
382
- }
383
- .qp-marks-input:focus { border-color: #4f86c6; }
384
- .qp-delete-btn {
385
- width: 28px; height: 28px; border-radius: 6px;
386
- border: 1px solid #e0d0d0; background: #fdf2f2; color: #c0392b;
387
- font-size: 13px; font-weight: 700; cursor: pointer;
388
- display: flex; align-items: center; justify-content: center;
389
- transition: background 0.15s, border-color 0.15s;
390
- margin-top: 2px;
391
- }
392
- .qp-delete-btn:hover { background: #fde8e8; border-color: #e05c5c; }
393
- .qp-add-btn { font-weight: 700; background: #eef3fb; border-color: #4f86c6; color: #4f86c6; }
394
- .qp-add-btn:hover { background: #4f86c6; color: #fff; }
395
- .qp-footer-row {
396
- display: flex; align-items: center; gap: 10px;
397
- padding: 12px 0 4px;
398
- }
399
-
400
- /* grid overrides nothing — card sizing handled by grid-template-columns */
401
-
402
- /* ── Inline Report Viewer ── */
403
- .rv-table .rv-thumb-wrap { width: 220px; }
404
- .rv-thumb {
405
- width: 220px; height: 155px;
406
- object-fit: contain; border-radius: 8px;
407
- border: 1.5px solid #d0d4db; background: #f8f9fb;
408
- cursor: zoom-in !important;
409
- }
410
- .rv-note {
411
- margin-top: 6px; font-size: 12px; color: #666;
412
- font-style: italic; border-left: 3px solid #d0d4db;
413
- padding-left: 8px;
414
- }
415
- .rv-status {
416
- display: inline-block; padding: 3px 8px;
417
- border-radius: 4px; font-size: 11px; font-weight: 700;
418
- }
419
- .rv-pass { background: #e6f7ee; color: #2d9e5a; border: 1px solid #2d9e5a; }
420
- .rv-fail { background: #fde8e8; color: #e05c5c; border: 1px solid #e05c5c; }
421
- .rv-warn { background: #fff4e5; color: #e08c4a; border: 1px solid #e08c4a; }
422
- .rv-review-section { margin-top: 28px; }
423
- .rv-review-title {
424
- font-size: 13px; font-weight: 600; color: #555;
425
- margin-bottom: 12px; padding-bottom: 8px;
426
- border-bottom: 1px solid #e8eaed;
427
- }
428
-
429
- /* Review table */
430
- .review-table .col-comment { min-width: 220px; }
431
- .review-comment { width: 100%; min-height: 56px; }
432
- .review-table .screenshot-thumb {
433
- width: 240px; height: 170px;
434
- object-fit: contain; border-radius: 8px;
435
- border: 1.5px solid #d0d4db;
436
- background: #f8f9fb;
437
- }
438
- .review-table .screenshot-thumb-wrap { width: 240px; }
439
- .review-img { cursor: zoom-in !important; }
440
- .review-img-hint { font-size: 11px; color: #aaa; text-align: center; margin-top: 4px; }
441
-
442
- /* ── Image zoom modal ── */
443
- .zoom-overlay { align-items: center; }
444
- .zoom-modal {
445
- background: #1a1a2e; border-radius: 14px;
446
- width: min(92vw, 900px);
447
- max-height: 92vh;
448
- display: flex; flex-direction: column;
449
- overflow: hidden;
450
- box-shadow: 0 30px 80px rgba(0,0,0,0.6);
451
- animation: modal-in 0.2s ease;
452
- }
453
- .zoom-toolbar {
454
- display: flex; align-items: center; gap: 8px;
455
- padding: 12px 16px;
456
- background: rgba(255,255,255,0.06);
457
- border-bottom: 1px solid rgba(255,255,255,0.1);
458
- }
459
- .zoom-btn {
460
- width: 34px; height: 34px; border-radius: 7px;
461
- border: 1px solid rgba(255,255,255,0.2);
462
- background: rgba(255,255,255,0.1); color: #fff;
463
- font-size: 16px; font-weight: 700; cursor: pointer;
464
- display: flex; align-items: center; justify-content: center;
465
- transition: background 0.15s;
466
- }
467
- .zoom-btn:hover { background: rgba(255,255,255,0.22); }
468
- .zoom-reset-btn { font-size: 11px; width: auto; padding: 0 12px; }
469
- .zoom-pct { color: #fff; font-size: 13px; font-weight: 700; min-width: 46px; text-align: center; }
470
- .zoom-close-btn {
471
- margin-left: auto; width: 34px; height: 34px; border-radius: 7px;
472
- border: 1px solid rgba(255,255,255,0.2);
473
- background: rgba(224,92,92,0.3); color: #fff;
474
- font-size: 15px; font-weight: 700; cursor: pointer;
475
- display: flex; align-items: center; justify-content: center;
476
- transition: background 0.15s;
477
- }
478
- .zoom-close-btn:hover { background: rgba(224,92,92,0.7); }
479
- .zoom-body {
480
- flex: 1; overflow: hidden;
481
- display: flex; align-items: center; justify-content: center;
482
- min-height: 300px; background: #111;
483
- position: relative;
484
- }
485
- .zoom-body img {
486
- max-width: 100%; max-height: 100%;
487
- display: block; will-change: transform;
488
- pointer-events: none; user-select: none;
489
- }
490
- .zoom-hint { font-size: 11px; color: rgba(255,255,255,0.35); text-align: center; padding: 8px; }
491
-
492
- /* Misc portal UI */
493
- .portal-empty {
494
- display: flex; flex-direction: column; align-items: center;
495
- justify-content: center; padding: 60px 24px;
496
- text-align: center; color: #555;
497
- }
498
- .portal-empty-icon { font-size: 3rem; margin-bottom: 16px; }
499
- .portal-empty h3 { font-size: 1.2rem; font-weight: 700; margin-bottom: 8px; color: #1a1a2e; }
500
- .portal-empty p { font-size: 13px; color: #888; }
501
-
502
- .status-badge {
503
- display: inline-block; padding: 3px 10px; border-radius: 20px;
504
- font-size: 11px; font-weight: 700; white-space: nowrap;
505
- }
506
- .badge-done { background: #e6f7ee; color: #2d9e5a; border: 1px solid #2d9e5a; }
507
- .badge-pending { background: #fff4e5; color: #e08c4a; border: 1px solid #e08c4a; }
508
-
509
- .portal-type-badge {
510
- display: inline-block; padding: 3px 10px; border-radius: 20px;
511
- font-size: 11px; font-weight: 700; white-space: nowrap;
512
- }
513
- .type-admin { background: #eef4ff; color: #4f86c6; border: 1px solid #4f86c6; }
514
- .type-tester { background: #e6f7ee; color: #2d9e5a; border: 1px solid #2d9e5a; }
515
-
516
- .report-name { font-size: 11px; color: #333; background: #f0f2f5; padding: 2px 6px; border-radius: 4px; }
517
- .report-actions { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
518
-
519
- .upload-count { font-weight: 600; font-size: 13px; color: #333; }
520
- .upload-count.full { color: #2d9e5a; }
521
- .upload-count.partial { color: #e08c4a; }
522
-
523
- .btn-secondary-sm {
524
- padding: 7px 14px; background: rgba(255,255,255,0.12);
525
- border: 1.5px solid rgba(255,255,255,0.3); border-radius: 7px;
526
- color: #fff; font-size: 13px; font-weight: 600; cursor: pointer;
527
- transition: background 0.15s; white-space: nowrap;
528
- }
529
- .btn-secondary-sm:hover { background: rgba(255,255,255,0.22); }
530
-
531
- /* Upload progress badge */
532
- .upload-progress {
533
- background: rgba(255,255,255,0.15);
534
- border: 1px solid rgba(255,255,255,0.25);
535
- border-radius: 20px; padding: 5px 14px;
536
- font-size: 13px; font-weight: 600; color: #fff; white-space: nowrap;
537
- }
538
-
539
- /* ── Idle / Terminated screen ── */
540
- .idle-page { display: flex; flex-direction: column; min-height: 100vh; }
541
- .idle-body {
542
- flex: 1; display: flex; align-items: flex-start; justify-content: center;
543
- background: linear-gradient(135deg, #f0f2f5 0%, #e8edf5 100%);
544
- padding: 28px 32px 40px;
545
- overflow-y: auto;
546
- }
547
- .idle-card {
548
- background: #fff; border-radius: 18px; padding: 44px 40px;
549
- max-width: 540px; width: 100%; text-align: center;
550
- box-shadow: 0 8px 40px rgba(0,0,0,0.1);
551
- animation: card-in 0.3s ease;
552
- }
553
- @keyframes card-in { from{opacity:0;transform:translateY(16px)} to{opacity:1;transform:translateY(0)} }
554
- .idle-icon { font-size: 3rem; margin-bottom: 16px; }
555
- .idle-card h2 { font-size: 1.4rem; margin-bottom: 12px; }
556
- .idle-card p { color: #555; line-height: 1.8; font-size: 14px; margin-bottom: 24px; }
557
- .idle-meta {
558
- background: #f7f9fc; border-radius: 10px;
559
- padding: 14px 20px; margin-bottom: 28px;
560
- font-size: 13px; display: flex; flex-direction: column; gap: 6px; text-align: left;
561
- }
562
- .idle-meta > div { display: flex; justify-content: space-between; gap: 12px; }
563
- .idle-meta span { color: #888; }
564
- .idle-meta strong { color: #1a1a2e; }
565
-
566
- .btn-start {
567
- padding: 14px 36px;
568
- background: linear-gradient(135deg, #2d9e5a, #27875e);
569
- color: #fff; border: none; border-radius: 10px;
570
- font-size: 15px; font-weight: 700; cursor: pointer;
571
- box-shadow: 0 4px 16px rgba(45,158,90,0.4);
572
- transition: transform 0.15s, box-shadow 0.15s;
573
- }
574
- .btn-start:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(45,158,90,0.5); }
575
-
576
- .btn-secondary {
577
- padding: 13px 28px;
578
- background: #f0f2f5; color: #444;
579
- border: 1.5px solid #d0d4db; border-radius: 10px;
580
- font-size: 15px; font-weight: 600; cursor: pointer;
581
- transition: background 0.15s, border-color 0.15s;
582
- }
583
- .btn-secondary:hover { background: #e4e7ec; border-color: #aaa; }
584
-
585
- /* Terminated stats */
586
- .term-stats {
587
- display: flex; gap: 12px; flex-wrap: wrap;
588
- justify-content: center; margin-bottom: 28px;
589
- }
590
- .t-stat {
591
- flex: 1 1 80px; border-radius: 10px; padding: 12px 10px;
592
- text-align: center; border-top: 3px solid transparent;
593
- background: #f7f9fc;
594
- }
595
- .t-stat.blue { border-color: #4f86c6; }
596
- .t-stat.green { border-color: #2d9e5a; }
597
- .t-stat.purple { border-color: #9b73c8; }
598
- .t-stat.teal { border-color: #4ab8c8; }
599
- .t-stat.red { border-color: #e05c5c; }
600
- .t-val { display: block; font-size: 1.3rem; font-weight: 700; line-height: 1.1; color: #1a1a2e; }
601
- .t-lbl { display: block; font-size: 11px; color: #888; text-transform: uppercase; letter-spacing: .4px; margin-top: 4px; }
602
-
603
- .term-actions { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; }
604
-
605
- /* ── Expired overlay ── */
606
- .expired-overlay {
607
- position: fixed; inset: 0;
608
- background: linear-gradient(135deg, #1a1a2e 0%, #0f3460 100%);
609
- display: flex; align-items: center; justify-content: center; z-index: 2000;
610
- }
611
- .expired-box {
612
- background: #fff; border-radius: 16px; padding: 48px 40px;
613
- text-align: center; max-width: 420px; width: 90%;
614
- box-shadow: 0 24px 60px rgba(0,0,0,0.4);
615
- }
616
- .expired-icon { font-size: 3rem; margin-bottom: 16px; }
617
- .expired-box h2 { font-size: 1.4rem; margin-bottom: 10px; }
618
- .expired-box p { color: #666; line-height: 1.7; font-size: 14px; }
619
- .btn-logout-lg {
620
- padding: 11px 24px;
621
- background: #f0f2f5; color: #444;
622
- border: 1.5px solid #d0d4db; border-radius: 8px;
623
- font-size: 14px; font-weight: 600; cursor: pointer; transition: background 0.15s;
624
- }
625
- .btn-logout-lg:hover { background: #e4e7ec; }
626
-
627
- /* ── Modals ── */
628
- .modal-overlay {
629
- position: fixed; inset: 0;
630
- background: rgba(0,0,0,0.55);
631
- display: flex; align-items: flex-start; justify-content: center; z-index: 1000;
632
- backdrop-filter: blur(3px);
633
- overflow-y: auto;
634
- padding: 24px 0;
635
- }
636
- .modal {
637
- background: #fff; border-radius: 14px; padding: 32px;
638
- max-width: 900px; width: 90%;
639
- box-shadow: 0 20px 60px rgba(0,0,0,0.25);
640
- animation: modal-in 0.2s ease;
641
- }
642
- @keyframes modal-in { from{opacity:0;transform:translateY(-14px) scale(.97)} to{opacity:1;transform:translateY(0) scale(1)} }
643
- .modal h3 { font-size: 1.1rem; margin-bottom: 8px; }
644
- .modal p { color: #555; line-height: 1.6; font-size: 13px; margin-bottom: 4px; }
645
- .modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; }
646
-
647
- .submit-success-modal { text-align: center; }
648
- .submit-success-icon { font-size: 3rem; margin-bottom: 12px; }
649
- .submit-success-modal h3 { font-size: 1.2rem; margin-bottom: 10px; }
650
- .submit-success-modal .modal-actions { justify-content: center; }
651
- .btn-cancel {
652
- padding: 9px 20px; border: 1.5px solid #d0d4db; background: #f5f6f8;
653
- border-radius: 7px; cursor: pointer; font-size: 13px; font-weight: 600;
654
- color: #555; transition: background 0.15s;
655
- }
656
- .btn-cancel:hover { background: #e8eaed; }
657
- .btn-danger {
658
- padding: 9px 20px; background: #e05c5c; color: #fff;
659
- border: none; border-radius: 7px; cursor: pointer;
660
- font-size: 13px; font-weight: 700; transition: background 0.15s;
661
- }
662
- .btn-danger:hover { background: #c94c4c; }
663
- .btn-confirm {
664
- padding: 9px 20px;
665
- background: #1a1a2e; color: #fff;
666
- border: none; border-radius: 7px; cursor: pointer;
667
- font-size: 13px; font-weight: 700; transition: background 0.15s;
668
- }
669
- .btn-confirm:hover { background: #2d3a5a; }
670
-
671
- /* Validation list */
672
- .validation-list {
673
- list-style: none; margin-top: 12px;
674
- display: flex; flex-direction: column; gap: 6px;
675
- max-height: 280px; overflow-y: auto;
676
- }
677
- .validation-list li {
678
- display: flex; align-items: center; gap: 8px;
679
- background: #f7f9fc; border-radius: 7px; padding: 7px 10px;
680
- font-size: 13px;
681
- }
682
- .val-badge {
683
- display: inline-block; padding: 2px 8px; border-radius: 5px;
684
- background: #1a1a2e; color: #fff; font-size: 11px; font-weight: 700;
685
- white-space: nowrap; flex-shrink: 0;
686
- }
687
- .val-fields { color: #555; }
688
- .val-more { color: #999; font-style: italic; font-size: 12px; background: none !important; padding: 4px 10px !important; }
689
-
690
- /* ── Main dashboard ── */
691
- .app-main { flex: 1; padding: 20px 28px; display: flex; flex-direction: column; gap: 18px; }
692
-
693
- /* Summary bar */
694
- .summary-bar { display: flex; gap: 14px; flex-wrap: wrap; }
695
- .summary-card {
696
- flex: 1 1 130px; background: #fff; border-radius: 12px;
697
- padding: 14px 18px; display: flex; flex-direction: column; gap: 4px;
698
- box-shadow: 0 1px 4px rgba(0,0,0,0.08); border-top: 4px solid transparent;
699
- }
700
- .summary-card.blue { border-color: #4f86c6; }
701
- .summary-card.green { border-color: #2d9e5a; }
702
- .summary-card.purple { border-color: #9b73c8; }
703
- .summary-card.teal { border-color: #4ab8c8; }
704
- .summary-card.red { border-color: #e05c5c; }
705
- .summary-value { font-size: 1.7rem; font-weight: 700; line-height: 1; }
706
- .summary-value small { font-size: 1rem; color: #666; }
707
- .summary-label { font-size: 11px; color: #666; font-weight: 500; text-transform: uppercase; letter-spacing: .4px; }
708
-
709
- /* Toolbar */
710
- .toolbar { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
711
- .filter-chips { display: flex; gap: 7px; flex-wrap: wrap; }
712
- .chip {
713
- padding: 5px 12px; border-radius: 20px; border: 1.5px solid #d0d4db;
714
- background: #fff; cursor: pointer; font-size: 12px; font-weight: 600;
715
- color: #555; transition: all 0.15s;
716
- }
717
- .chip:hover { border-color: #999; color: #222; }
718
- .chip.active { background: #1a1a2e; border-color: #1a1a2e; color: #fff; }
719
- .search-box {
720
- margin-left: auto; padding: 7px 12px; border: 1.5px solid #d0d4db;
721
- border-radius: 8px; font-size: 13px; width: 220px; background: #fff;
722
- outline: none; transition: border-color 0.2s;
723
- }
724
- .search-box:focus { border-color: #4f86c6; }
725
-
726
- /* Table */
727
- .table-wrap { background: #fff; border-radius: 12px; box-shadow: 0 1px 4px rgba(0,0,0,0.08); overflow: auto; }
728
- .qa-table { width: 100%; border-collapse: collapse; min-width: 860px; }
729
- .qa-table thead tr { background: #1a1a2e; color: #fff; }
730
- .qa-table thead th { padding: 12px 14px; text-align: left; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .5px; white-space: nowrap; }
731
- .qa-table tbody tr { border-bottom: 1px solid #f0f2f5; transition: background 0.1s; }
732
- .qa-table tbody tr:hover { background: #f7f9fc; }
733
- .qa-table tbody tr:last-child { border-bottom: none; }
734
- .qa-table td { padding: 10px 14px; vertical-align: middle; }
735
-
736
- .row-pass { border-left: 4px solid #2d9e5a; }
737
- .row-warn { border-left: 4px solid #e08c4a; }
738
- .row-fail { border-left: 4px solid #e05c5c; }
739
- .row-neutral { border-left: 4px solid #d0d4db; }
740
-
741
- .col-num { width: 44px; text-align: center; color: #999; font-weight: 600; }
742
- .col-standard { width: 120px; }
743
- .col-obs { min-width: 400px; line-height: 1.6; color: #333; font-size: 14px; }
744
- .col-marks { width: 120px; text-align: center; }
745
- .col-score { width: 160px; }
746
- .col-shot { width: 230px; }
747
-
748
- .std-badge {
749
- display: inline-block; padding: 3px 9px; border-radius: 6px;
750
- color: #fff; font-size: 11px; font-weight: 700; letter-spacing: .4px; white-space: nowrap;
751
- }
752
-
753
- /* ── Possible Marks (static display) ── */
754
- .marks-static {
755
- display: inline-block;
756
- padding: 4px 12px;
757
- background: #f0f2f5;
758
- border-radius: 6px;
759
- font-size: 14px;
760
- font-weight: 700;
761
- color: #1a1a2e;
762
- min-width: 44px;
763
- text-align: center;
764
- }
765
-
766
- /* Score input */
767
- .score-cell { display: flex; flex-direction: column; gap: 4px; }
768
- .score-row { display: flex; align-items: center; gap: 6px; }
769
- .score-input {
770
- width: 58px; padding: 4px 8px; border: 2px solid #ccc;
771
- border-radius: 6px; font-size: 14px; font-weight: 600;
772
- text-align: center; outline: none; transition: border-color 0.2s;
773
- -moz-appearance: textfield;
774
- }
775
- .score-input::-webkit-outer-spin-button,
776
- .score-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
777
- .score-input:focus { outline: 2px solid #4f86c6; outline-offset: 1px; }
778
- .score-input:disabled { background: #f5f6f8; cursor: not-allowed; }
779
- .score-input.empty { border-color: #e0e3e8; }
780
- .score-max { color: #999; font-size: 13px; white-space: nowrap; }
781
- .score-bar-bg { height: 4px; background: #e8eaed; border-radius: 4px; overflow: hidden; }
782
- .score-bar-fill { height: 100%; border-radius: 4px; transition: width .3s, background .3s; }
783
-
784
- /* Screenshot cell */
785
- .screenshot-cell { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
786
- .screenshot-cell.has-image {
787
- flex-direction: row;
788
- align-items: center;
789
- gap: 10px;
790
- }
791
- .screenshot-cell.has-image .screenshot-thumb-wrap { flex-shrink: 0; }
792
- .screenshot-cell.has-image .shot-dd-wrap { flex-shrink: 0; }
793
- .screenshot-thumb {
794
- width: 110px; height: 76px; object-fit: cover; border-radius: 8px;
795
- border: 1.5px solid #e0e0e0; cursor: pointer; transition: transform .15s, box-shadow .15s;
796
- display: block;
797
- }
798
- .screenshot-thumb:hover { transform: scale(1.04); box-shadow: 0 4px 12px rgba(0,0,0,0.18); }
799
- .screenshot-name { font-size: 11px; color: #777; max-width: 90px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
800
- .screenshot-info { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
801
- .no-screenshot { color: #bbb; font-style: italic; font-size: 13px; }
802
- .btn-upload {
803
- display: inline-flex; align-items: center; gap: 4px; padding: 5px 12px;
804
- background: #f0f2f5; border: 1.5px solid #d0d4db; border-radius: 6px;
805
- font-size: 12px; font-weight: 600; color: #444; cursor: pointer; transition: background .15s;
806
- }
807
- .btn-upload:hover { background: #e4e7ec; border-color: #999; }
808
- .btn-upload.small { font-size: 11px; padding: 3px 8px; }
809
- .btn-upload.required { border-color: #e05c5c; color: #c0392b; }
810
- .btn-upload.required:hover { background: #fde8e8; }
811
- .req-dot { color: #e05c5c; font-weight: 700; margin-left: 2px; }
812
-
813
- /* ── Camera modal ── */
814
- .camera-modal {
815
- background: #fff; border-radius: 14px; padding: 24px;
816
- width: 90%; max-width: 520px;
817
- box-shadow: 0 20px 60px rgba(0,0,0,0.3);
818
- animation: modal-in 0.2s ease;
819
- display: flex; flex-direction: column; gap: 16px;
820
- }
821
- .camera-modal-header {
822
- display: flex; align-items: center; justify-content: space-between; gap: 12px;
823
- }
824
- .camera-modal-header h3 { font-size: 1.1rem; margin: 0; }
825
- .camera-switch-btn {
826
- background: #f0f4ff; border: 1px solid #c7d4f0; border-radius: 8px;
827
- padding: 5px 12px; font-size: 12px; cursor: pointer; color: #4f86c6;
828
- white-space: nowrap;
829
- }
830
- .camera-switch-btn:hover { background: #dce8ff; }
831
- .camera-preview {
832
- width: 100%; border-radius: 10px; background: #000;
833
- max-height: 360px; object-fit: cover;
834
- }
835
- .camera-mirror { transform: scaleX(-1); }
836
- .camera-error {
837
- color: #e05c5c; font-size: 13px; text-align: center;
838
- padding: 24px 16px; background: #fff5f5; border-radius: 8px;
839
- border: 1px solid #fcc; line-height: 1.6;
840
- }
841
-
842
- .shot-dd-wrap { position: relative; display: inline-block; }
843
- .shot-dropdown {
844
- position: absolute; left: 0; top: calc(100% + 5px);
845
- background: #fff; border: 1px solid #e0e3e8; border-radius: 8px;
846
- box-shadow: 0 6px 20px rgba(0,0,0,0.13);
847
- min-width: 150px; z-index: 200; overflow: hidden;
848
- animation: dd-in 0.12s ease;
849
- }
850
- .shot-dd-item {
851
- display: flex; align-items: center; gap: 8px;
852
- padding: 9px 14px; font-size: 13px; font-weight: 500;
853
- color: #333; cursor: pointer; transition: background 0.1s;
854
- }
855
- .shot-dd-item:hover { background: #f0f4ff; }
856
-
857
- .screenshot-thumb-wrap {
858
- position: relative;
859
- display: inline-block;
860
- }
861
- .btn-discard-x {
862
- position: absolute; top: -6px; right: -6px;
863
- width: 18px; height: 18px;
864
- background: #e05c5c; color: #fff;
865
- border: 2px solid #fff; border-radius: 50%;
866
- font-size: 9px; font-weight: 700; line-height: 1;
867
- display: flex; align-items: center; justify-content: center;
868
- cursor: pointer; padding: 0;
869
- box-shadow: 0 1px 4px rgba(0,0,0,0.25);
870
- transition: background 0.15s, transform 0.15s;
871
- }
872
- .btn-discard-x:hover { background: #c0392b; transform: scale(1.15); }
873
-
874
- /* Eval note sub-row */
875
- .note-row { border-bottom: 2px solid #e8eaed !important; }
876
- .note-row.row-pass { border-left: 4px solid #2d9e5a; }
877
- .note-row.row-warn { border-left: 4px solid #e08c4a; }
878
- .note-row.row-fail { border-left: 4px solid #e05c5c; }
879
- .note-row.row-neutral { border-left: 4px solid #d0d4db; }
880
- .note-cell { padding: 6px 14px 12px 14px !important; background: #fafbfc; }
881
- .note-wrap { display: flex; align-items: flex-start; gap: 10px; }
882
- .note-label {
883
- flex-shrink: 0; font-size: 11px; font-weight: 700; color: #888;
884
- text-transform: uppercase; letter-spacing: 0.4px; padding-top: 8px; min-width: 76px;
885
- }
886
- .note-textarea {
887
- flex: 1; padding: 6px 10px;
888
- border: 1.5px solid #e0e3e8; border-radius: 6px;
889
- font-family: inherit; font-size: 13px; line-height: 1.5; color: #333;
890
- background: #fff; resize: none; outline: none;
891
- transition: border-color 0.15s, box-shadow 0.15s;
892
- }
893
- .note-textarea:focus { border-color: #4f86c6; box-shadow: 0 0 0 3px rgba(79,134,198,0.12); }
894
- .note-textarea:disabled { background: #f5f6f8; color: #555; cursor: default; }
895
- .note-textarea::placeholder { color: #bbb; }
896
- .word-count { flex-shrink: 0; font-size: 11px; color: #aaa; padding-top: 8px; white-space: nowrap; }
897
- .word-count.near-limit { color: #e08c4a; font-weight: 600; }
898
- .word-count.at-limit { color: #e05c5c; font-weight: 700; }
899
-
900
- /* Required fields note */
901
- .req-star { color: #e05c5c; font-weight: 700; margin-left: 3px; }
902
- .req-note { font-size: 12px; color: #888; padding: 4px 2px; }
903
-
904
- .empty-row { text-align: center; color: #999; padding: 40px !important; font-style: italic; }
905
-
906
- /* ── Responsive ── */
907
- /* ── Tablet landscape / small desktop (≤1200px) → 3 per row ─────────────── */
908
- @media (max-width: 1200px) {
909
- .portal-cards { flex-wrap: wrap; gap: 14px; }
910
- .portal-card { flex: 0 1 calc(33.33% - 10px); max-width: calc(33.33% - 10px); }
911
- .portal-body { padding: 20px 20px 32px; }
912
- }
913
-
914
- /* ── Tablet portrait (≤900px) → 2 per row ───────────────────────────────── */
915
- @media (max-width: 900px) {
916
- .portal-cards { gap: 12px; }
917
- .portal-card { flex: 0 1 calc(50% - 6px); max-width: calc(50% - 6px); }
918
- .portal-body { padding: 16px 16px 28px; }
919
- .portal-card-icon { font-size: 2rem; }
920
- }
921
-
922
- /* ── General tablet tweaks (≤1024px) ─────────────────────────────────────── */
923
- @media (max-width: 1024px) {
924
- .app-header { padding: 12px 20px; }
925
- .app-main { padding: 16px 20px; }
926
- .countdown { min-width: 100px; }
927
- .countdown-time { font-size: 1.1rem; }
928
- .col-obs { min-width: 300px; font-size: 13px; }
929
- .search-box { width: 180px; }
930
- }
931
-
932
- /* ── Mobile landscape / small tablet (≤768px) ────────────────────────────── */
933
- @media (max-width: 768px) {
934
- .app-header { padding: 10px 14px; gap: 10px; }
935
- .header-left h1 { font-size: 1.05rem; }
936
- .header-right { gap: 8px; }
937
- .countdown { min-width: 90px; padding: 5px 10px; }
938
- .countdown-time { font-size: 1rem; }
939
- .btn-view-report { padding: 7px 12px; font-size: 12px; }
940
- .btn-danger-outline { padding: 7px 12px; font-size: 12px; }
941
- .profile-name { display: none; }
942
-
943
- .app-main { padding: 12px 14px; gap: 14px; }
944
-
945
- .summary-card { flex: 1 1 120px; padding: 12px 14px; }
946
- .summary-value { font-size: 1.5rem; }
947
-
948
- .filter-chips { gap: 5px; }
949
- .chip { padding: 4px 10px; font-size: 11px; }
950
- .search-box { width: 100%; margin-left: 0; }
951
- .toolbar { gap: 10px; }
952
-
953
- .table-wrap { border-radius: 8px; }
954
- .qa-table { min-width: 600px; }
955
- .qa-table thead th, .qa-table td { padding: 8px 10px; font-size: 12px; }
956
- .col-obs { min-width: 160px; font-size: 12px; }
957
- .screenshot-thumb { width: 80px; height: 56px; }
958
-
959
- .idle-card { padding: 32px 24px; }
960
- .btn-start { padding: 12px 28px; font-size: 14px; }
961
- .btn-secondary { padding: 11px 24px; font-size: 14px; }
962
- .term-stats { gap: 8px; }
963
- .t-stat { flex: 1 1 70px; padding: 10px 6px; }
964
- .t-val { font-size: 1.1rem; }
965
-
966
- .modal { padding: 24px 20px; }
967
- }
968
-
969
- /* ── Mobile portrait (≤480px) → 1 per row ───────────────────────────────── */
970
- @media (max-width: 480px) {
971
- .portal-cards { gap: 10px; }
972
- .portal-card { flex: 0 1 100%; max-width: 100%; padding: 20px 16px; }
973
- .portal-card-icon { font-size: 1.8rem; }
974
- .portal-card h3 { font-size: 0.95rem; }
975
- .portal-body { padding: 12px 12px 24px; }
976
-
977
- .header-sub { display: none; }
978
- .countdown { display: none; }
979
- .summary-bar { gap: 8px; }
980
- .summary-card { flex: 1 1 100px; padding: 10px 12px; }
981
- .summary-value { font-size: 1.3rem; }
982
- .idle-card { padding: 28px 18px; }
983
- .term-actions { flex-direction: column; align-items: stretch; }
984
- .btn-start, .btn-secondary { width: 100%; text-align: center; }
985
- }
986
-
987
- /* ── Test name badge (in tables) ──────────────────────────────────────────── */
988
- .tp-name-badge {
989
- display: inline-block;
990
- padding: 3px 10px;
991
- border-radius: 99px;
992
- background: #eef3fb;
993
- color: #4f86c6;
994
- font-size: 12px;
995
- font-weight: 600;
996
- white-space: nowrap;
997
- }
998
-
999
- /* ── Testing Profiles portal ─────────────────────────────────────────────── */
1000
- .tp-grid {
1001
- display: grid;
1002
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1003
- gap: 20px;
1004
- }
1005
- .tp-card {
1006
- background: #fff;
1007
- border-radius: 16px;
1008
- padding: 24px 22px;
1009
- box-shadow: 0 4px 20px rgba(0,0,0,0.08);
1010
- border-top: 4px solid #4f86c6;
1011
- display: flex;
1012
- flex-direction: column;
1013
- gap: 10px;
1014
- animation: card-in 0.2s ease;
1015
- }
1016
- .tp-card-top {
1017
- display: flex;
1018
- align-items: center;
1019
- gap: 10px;
1020
- }
1021
- .tp-card-icon { font-size: 1.8rem; flex-shrink: 0; }
1022
- .tp-card-name { font-size: 1.1rem; font-weight: 700; color: #1a1a2e; }
1023
- .tp-card-meta {
1024
- display: flex;
1025
- align-items: center;
1026
- gap: 6px;
1027
- font-size: 13px;
1028
- color: #555;
1029
- font-weight: 500;
1030
- }
1031
- .tp-dot { color: #bbb; }
1032
- .tp-card-date { font-size: 11px; color: #999; }
1033
- .tp-card-actions {
1034
- display: flex;
1035
- gap: 8px;
1036
- flex-wrap: wrap;
1037
- margin-top: 6px;
1038
- }
1039
-
1040
- .tp-empty {
1041
- display: flex;
1042
- flex-direction: column;
1043
- align-items: center;
1044
- justify-content: center;
1045
- padding: 80px 24px;
1046
- text-align: center;
1047
- }
1048
- .tp-empty-icon { font-size: 3rem; margin-bottom: 16px; }
1049
- .tp-empty h3 { font-size: 1.2rem; font-weight: 700; margin-bottom: 8px; }
1050
- .tp-empty p { color: #666; font-size: 14px; max-width: 400px; }
1051
-
1052
- /* ── Profile picker (full-page list) ─────────────────────────────────────── */
1053
- .tp-picker-list {
1054
- display: flex;
1055
- flex-direction: column;
1056
- gap: 12px;
1057
- }
1058
- .tp-picker-item {
1059
- display: flex;
1060
- align-items: center;
1061
- gap: 18px;
1062
- width: 100%;
1063
- padding: 20px 22px;
1064
- background: #fff;
1065
- border: 2px solid #e5e8ee;
1066
- border-radius: 14px;
1067
- cursor: pointer;
1068
- text-align: left;
1069
- box-shadow: 0 2px 12px rgba(0,0,0,0.05);
1070
- transition: border-color 0.15s, box-shadow 0.15s, transform 0.1s;
1071
- }
1072
- .tp-picker-item:hover {
1073
- border-color: #4f86c6;
1074
- box-shadow: 0 4px 20px rgba(79,134,198,0.15);
1075
- transform: translateY(-1px);
1076
- }
1077
- .tp-picker-icon { font-size: 2rem; flex-shrink: 0; }
1078
- .tp-picker-info { flex: 1; display: flex; flex-direction: column; gap: 3px; }
1079
- .tp-picker-info strong { font-size: 15px; font-weight: 700; color: #1a1a2e; }
1080
- .tp-picker-info span { font-size: 13px; color: #666; }
1081
- .tp-picker-arrow { font-size: 20px; color: #bbb; font-weight: 300; }
1082
- .tp-picker-item:hover .tp-picker-arrow { color: #4f86c6; }
1083
- .tp-picker-default { border-style: dashed; background: #fafafa; }
1084
- .tp-picker-default:hover { border-color: #888; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
1085
-
1086
- /* ── Indigo portal card (Manage Accounts) ─────────────────────────────────── */
1087
- .portal-card-indigo { border-top: 4px solid #6c5ce7; }
1088
- .btn-start-indigo {
1089
- background: linear-gradient(135deg, #6c5ce7, #a29bfe);
1090
- box-shadow: 0 4px 14px rgba(108,92,231,0.4);
1091
- }
1092
- .btn-start-indigo:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
1093
-
1094
- /* ── Session role badge (header subtitle) ─────────────────────────────────── */
1095
- .session-role-badge {
1096
- display: inline-block;
1097
- padding: 2px 9px;
1098
- border-radius: 99px;
1099
- font-size: 11px;
1100
- font-weight: 700;
1101
- color: #fff;
1102
- letter-spacing: 0.4px;
1103
- vertical-align: middle;
1104
- }
1105
-
1106
- /* ── Account management table ─────────────────────────────────────────────── */
1107
- .acct-table td { vertical-align: middle; }
1108
-
1109
- .acct-user {
1110
- display: flex;
1111
- align-items: center;
1112
- gap: 10px;
1113
- }
1114
- .acct-avatar {
1115
- width: 36px;
1116
- height: 36px;
1117
- border-radius: 50%;
1118
- color: #fff;
1119
- font-size: 15px;
1120
- font-weight: 700;
1121
- display: flex;
1122
- align-items: center;
1123
- justify-content: center;
1124
- flex-shrink: 0;
1125
- }
1126
- .acct-you-badge {
1127
- display: inline-block;
1128
- margin-left: 7px;
1129
- padding: 1px 7px;
1130
- border-radius: 99px;
1131
- font-size: 10px;
1132
- font-weight: 700;
1133
- background: #e8f0fe;
1134
- color: #4f86c6;
1135
- vertical-align: middle;
1136
- }
1137
-
1138
- .acct-role-select {
1139
- padding: 5px 10px;
1140
- border-radius: 7px;
1141
- border: 1.5px solid #d0d4db;
1142
- font-size: 13px;
1143
- font-weight: 600;
1144
- background: #fff;
1145
- cursor: pointer;
1146
- outline: none;
1147
- transition: border-color 0.2s, box-shadow 0.2s;
1148
- }
1149
- .acct-role-select:focus { box-shadow: 0 0 0 3px rgba(79,134,198,0.15); }
1150
-
1151
- .acct-desc {
1152
- font-size: 13px;
1153
- color: #666;
1154
- max-width: 280px;
1155
- }
1156
-
1157
- /* ── Role legend ──────────────────────────────────────────────────────────── */
1158
- .acct-legend {
1159
- display: flex;
1160
- gap: 20px;
1161
- flex-wrap: wrap;
1162
- margin-top: 24px;
1163
- padding: 20px 24px;
1164
- background: #f8f9fb;
1165
- border-radius: 12px;
1166
- border: 1px solid #e5e8ee;
1167
- }
1168
- .acct-legend-item {
1169
- display: flex;
1170
- align-items: center;
1171
- gap: 8px;
1172
- font-size: 13px;
1173
- color: #555;
1174
- }
1175
- .acct-legend-dot {
1176
- width: 10px;
1177
- height: 10px;
1178
- border-radius: 50%;
1179
- flex-shrink: 0;
1180
- }
1181
-
1182
- /* ── Phone input with prefix ─────────────────────────────────────────────── */
1183
- .acct-phone-wrap {
1184
- display: flex;
1185
- align-items: center;
1186
- border: 1.5px solid #d0d4db;
1187
- border-radius: 8px;
1188
- overflow: hidden;
1189
- transition: border-color 0.2s, box-shadow 0.2s;
1190
- }
1191
- .acct-phone-wrap:focus-within {
1192
- border-color: #4f86c6;
1193
- box-shadow: 0 0 0 3px rgba(79,134,198,0.15);
1194
- }
1195
- .acct-phone-prefix {
1196
- padding: 11px 12px;
1197
- background: #f0f2f5;
1198
- font-size: 14px;
1199
- font-weight: 600;
1200
- color: #444;
1201
- border-right: 1.5px solid #d0d4db;
1202
- flex-shrink: 0;
1203
- }
1204
- .acct-phone-input {
1205
- flex: 1;
1206
- border: none !important;
1207
- border-radius: 0 !important;
1208
- box-shadow: none !important;
1209
- outline: none;
1210
- }
1211
-
1212
- /* ── Danger small button ──────────────────────────────────────────────────── */
1213
- .btn-danger-sm {
1214
- padding: 5px 12px;
1215
- background: #fff;
1216
- color: #e05c5c;
1217
- border: 1.5px solid #e05c5c;
1218
- border-radius: 7px;
1219
- font-size: 12px;
1220
- font-weight: 600;
1221
- cursor: pointer;
1222
- transition: background 0.15s, color 0.15s;
1223
- }
1224
- .btn-danger-sm:hover { background: #e05c5c; color: #fff; }
1225
-
1226
- /* ── Portal card — Violet (Planner) ────────────────────────────────────────── */
1227
- .portal-card-violet { border-top-color: #7c3aed; }
1228
- .btn-start-violet {
1229
- background: linear-gradient(135deg, #7c3aed, #5b21b6) !important;
1230
- box-shadow: 0 4px 14px rgba(124,58,237,0.35) !important;
1231
- }
1232
- .btn-start-violet:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
1233
-
1234
- /* ── Portal card — Amber (Tickets) ─────────────────────────────────────────── */
1235
- .portal-card-amber { border-top-color: #d97706; }
1236
- .btn-start-amber {
1237
- background: linear-gradient(135deg, #d97706, #b45309) !important;
1238
- box-shadow: 0 4px 14px rgba(217,119,6,0.35) !important;
1239
- }
1240
- .btn-start-amber:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
1241
-
1242
- /* ── Kanban board ───────────────────────────────────────────────────────────── */
1243
- /* ── Task / Ticket modal two-column layout ──────────────────────────────────── */
1244
- .task-modal {
1245
- max-width: 900px !important;
1246
- width: 92% !important;
1247
- padding: 0 !important;
1248
- overflow: hidden;
1249
- max-height: calc(100vh - 48px);
1250
- display: flex;
1251
- flex-direction: column;
1252
- }
1253
-
1254
- /* Planner — violet theme */
1255
- .task-modal--planner .task-modal-header {
1256
- background: linear-gradient(135deg, #7c3aed 0%, #5b21b6 100%);
1257
- }
1258
- .task-modal--planner .task-modal-right {
1259
- background: #f3f0ff;
1260
- border-left: 1px solid #e0d4ff;
1261
- }
1262
- .task-modal--planner .task-modal-right .login-label { color: #6040b0; }
1263
- .task-modal--planner .task-modal-right .login-input:focus {
1264
- border-color: #7c3aed;
1265
- box-shadow: 0 0 0 3px rgba(124,58,237,0.12);
1266
- }
1267
-
1268
- /* Ticket — amber theme */
1269
- .task-modal--ticket .task-modal-header {
1270
- background: linear-gradient(135deg, #d97706 0%, #b45309 100%);
1271
- }
1272
- .task-modal--ticket .task-modal-right {
1273
- background: #fffbeb;
1274
- border-left: 1px solid #fde68a;
1275
- }
1276
- .task-modal--ticket .task-modal-right .login-label { color: #92400e; }
1277
- .task-modal--ticket .task-modal-right .login-input:focus {
1278
- border-color: #d97706;
1279
- box-shadow: 0 0 0 3px rgba(217,119,6,0.12);
1280
- }
1281
-
1282
- /* Shared header */
1283
- .task-modal-header {
1284
- padding: 18px 28px;
1285
- display: flex;
1286
- align-items: center;
1287
- justify-content: space-between;
1288
- }
1289
- .task-modal-header h3 {
1290
- color: #fff;
1291
- font-size: 1.1rem;
1292
- font-weight: 700;
1293
- margin: 0;
1294
- }
1295
-
1296
- /* Body */
1297
- .task-modal > form { flex: 1; overflow-y: auto; display: flex; flex-direction: column; min-height: 0; }
1298
- .task-modal-body { padding: 24px 28px; overflow-y: auto; flex: 1; min-height: 0; }
1299
- .task-modal-grid {
1300
- display: grid;
1301
- grid-template-columns: 2fr 240px;
1302
- gap: 0;
1303
- align-items: stretch;
1304
- }
1305
- .task-modal-left {
1306
- display: flex;
1307
- flex-direction: column;
1308
- padding-right: 24px;
1309
- }
1310
- .task-modal-right {
1311
- display: flex;
1312
- flex-direction: column;
1313
- padding: 20px 20px;
1314
- border-radius: 0 0 14px 0;
1315
- }
1316
- @media (max-width: 680px) {
1317
- .task-modal-grid { grid-template-columns: 1fr; }
1318
- .task-modal-right { border-left: none; border-top: 1px solid #e0e4ea; padding: 16px 0 0; }
1319
- }
1320
-
1321
- /* ── Kanban board ───────────────────────────────────────────────────────────── */
1322
- .kanban-board {
1323
- display: flex;
1324
- gap: 16px;
1325
- align-items: stretch;
1326
- overflow-x: auto;
1327
- padding-bottom: 16px;
1328
- height: calc(100vh - 160px);
1329
- }
1330
- /* Column accent colors */
1331
- .kanban-col[data-col="backlog"] { background: #f0f4ff; }
1332
- .kanban-col[data-col="in-progress"] { background: #fff8ed; }
1333
- .kanban-col[data-col="in-review"] { background: #f3f0ff; }
1334
- .kanban-col[data-col="done"] { background: #edfaf3; }
1335
-
1336
- .kanban-col[data-col="backlog"] .kanban-col-header { border-bottom-color: #93b4f0; color: #3a5da8; background: #f0f4ff; }
1337
- .kanban-col[data-col="in-progress"] .kanban-col-header { border-bottom-color: #f0b060; color: #a05a10; background: #fff8ed; }
1338
- .kanban-col[data-col="in-review"] .kanban-col-header { border-bottom-color: #b49af0; color: #6040b0; background: #f3f0ff; }
1339
- .kanban-col[data-col="done"] .kanban-col-header { border-bottom-color: #60c890; color: #1a7040; background: #edfaf3; }
1340
-
1341
- .kanban-col[data-col="backlog"] .kanban-col-count { background: #d0deff; color: #3a5da8; }
1342
- .kanban-col[data-col="in-progress"] .kanban-col-count { background: #ffe0b0; color: #a05a10; }
1343
- .kanban-col[data-col="in-review"] .kanban-col-count { background: #e0d4ff; color: #6040b0; }
1344
- .kanban-col[data-col="done"] .kanban-col-count { background: #c0f0d8; color: #1a7040; }
1345
-
1346
- .kanban-col {
1347
- flex: 1 1 300px;
1348
- border-radius: 12px;
1349
- padding: 12px;
1350
- min-height: 300px;
1351
- overflow-y: auto;
1352
- max-height: 100%;
1353
- }
1354
- .kanban-col-header {
1355
- display: flex;
1356
- justify-content: space-between;
1357
- align-items: center;
1358
- font-size: 13px;
1359
- font-weight: 700;
1360
- text-transform: uppercase;
1361
- letter-spacing: 0.5px;
1362
- margin-bottom: 10px;
1363
- padding-bottom: 8px;
1364
- border-bottom: 2px solid #e0e4ea;
1365
- position: sticky;
1366
- top: 0;
1367
- z-index: 2;
1368
- }
1369
- .kanban-col-count {
1370
- background: #e0e4ea;
1371
- color: #666;
1372
- font-size: 11px;
1373
- font-weight: 700;
1374
- border-radius: 20px;
1375
- padding: 1px 8px;
1376
- }
1377
- .kanban-empty {
1378
- text-align: center;
1379
- color: #bbb;
1380
- font-size: 13px;
1381
- padding: 20px 0;
1382
- }
1383
- .kanban-card {
1384
- background: #fff;
1385
- border-radius: 10px;
1386
- padding: 12px;
1387
- margin-bottom: 10px;
1388
- box-shadow: 0 2px 8px rgba(0,0,0,0.07);
1389
- transition: box-shadow 0.15s, transform 0.1s;
1390
- }
1391
- .kanban-card:hover { box-shadow: 0 4px 16px rgba(0,0,0,0.12); transform: translateY(-1px); }
1392
- .kanban-card.card-once { border-left: 4px solid #4f86c6; background: #f7faff; }
1393
- .kanban-card.card-daily { border-left: 4px solid #22a05a; background: #f4fbf7; }
1394
- .kanban-card.dragging { opacity: 0.45; transform: rotate(2deg); }
1395
- .kanban-col.drag-over { background: #eef3ff; outline: 2px dashed #4f86c6; outline-offset: -4px; }
1396
- .kanban-card-product {
1397
- display: inline-block;
1398
- font-size: 10px;
1399
- font-weight: 700;
1400
- background: #e8f0fe;
1401
- color: #4f86c6;
1402
- border-radius: 4px;
1403
- padding: 2px 6px;
1404
- margin-bottom: 6px;
1405
- text-transform: uppercase;
1406
- letter-spacing: 0.4px;
1407
- }
1408
- .kanban-card-title {
1409
- font-size: 13px;
1410
- font-weight: 700;
1411
- color: #1a1a2e;
1412
- margin-bottom: 4px;
1413
- line-height: 1.3;
1414
- }
1415
- .kanban-card-desc {
1416
- font-size: 12px;
1417
- color: #777;
1418
- margin-bottom: 6px;
1419
- line-height: 1.4;
1420
- }
1421
- .kanban-card-meta {
1422
- display: flex;
1423
- gap: 8px;
1424
- font-size: 11px;
1425
- color: #888;
1426
- margin-bottom: 8px;
1427
- flex-wrap: wrap;
1428
- }
1429
- .kanban-card-dates {
1430
- display: flex;
1431
- gap: 8px;
1432
- font-size: 10px;
1433
- color: #999;
1434
- margin-bottom: 6px;
1435
- flex-wrap: wrap;
1436
- }
1437
- .kanban-date-due { color: #555; }
1438
- .kanban-date-due.overdue { color: #e05c5c; font-weight: 600; }
1439
- .due-date { color: #555; }
1440
- .due-date-overdue { color: #e05c5c; font-weight: 600; }
1441
- .kanban-card-footer {
1442
- display: flex;
1443
- align-items: center;
1444
- gap: 6px;
1445
- }
1446
- .kanban-status-select {
1447
- flex: 1;
1448
- font-size: 11px;
1449
- padding: 4px 6px;
1450
- border: 1.5px solid #d0d4db;
1451
- border-radius: 6px;
1452
- outline: none;
1453
- cursor: pointer;
1454
- background: #f8f9fa;
1455
- color: #333;
1456
- }
1457
- .kanban-del-btn {
1458
- background: none;
1459
- border: 1.5px solid #e05c5c;
1460
- color: #e05c5c;
1461
- border-radius: 6px;
1462
- padding: 3px 7px;
1463
- font-size: 11px;
1464
- cursor: pointer;
1465
- transition: background 0.15s, color 0.15s;
1466
- }
1467
- .kanban-del-btn:hover { background: #e05c5c; color: #fff; }
1468
-
1469
- /* ── Tag chips ──────────────────────────────────────────────────────────────── */
1470
- .tag-chip-wrap {
1471
- display: flex;
1472
- flex-wrap: wrap;
1473
- gap: 6px;
1474
- margin-top: 4px;
1475
- margin-bottom: 4px;
1476
- }
1477
- .tag-chip {
1478
- padding: 4px 10px;
1479
- background: #f0f2f5;
1480
- color: #555;
1481
- border-radius: 20px;
1482
- font-size: 12px;
1483
- font-weight: 600;
1484
- cursor: pointer;
1485
- border: 1.5px solid transparent;
1486
- transition: all 0.15s;
1487
- }
1488
- .tag-chip.active {
1489
- background: #e8f0fe;
1490
- color: #4f86c6;
1491
- border-color: #4f86c6;
1492
- }
1493
- .tag-chip:hover { border-color: #aaa; }
1494
-
1495
- /* ── Ticket priority badges ─────────────────────────────────────────────────── */
1496
- .priority-high { background: #fde8e8; color: #c0392b; border-radius: 4px; padding: 2px 7px; font-size: 12px; font-weight: 600; }
1497
- .priority-medium { background: #fff8e1; color: #d97706; border-radius: 4px; padding: 2px 7px; font-size: 12px; font-weight: 600; }
1498
- .priority-low { background: #e6f7ee; color: #1a6e3c; border-radius: 4px; padding: 2px 7px; font-size: 12px; font-weight: 600; }
1499
-
1500
- /* ── Status pill ────────────────────────────────────────────────────────────── */
1501
- .status-pill {
1502
- background: #f0f2f5;
1503
- color: #555;
1504
- border-radius: 4px;
1505
- padding: 2px 7px;
1506
- font-size: 12px;
1507
- font-weight: 600;
1508
- text-transform: capitalize;
1509
- }
1510
-
1511
- /* ── Notification bell ──────────────────────────────────────────────────────── */
1512
- .notif-bell-wrap {
1513
- position: relative;
1514
- }
1515
- .notif-bell-btn {
1516
- background: rgba(255,255,255,0.12);
1517
- border: none;
1518
- border-radius: 8px;
1519
- color: #fff;
1520
- font-size: 18px;
1521
- padding: 7px 10px;
1522
- cursor: pointer;
1523
- position: relative;
1524
- transition: background 0.15s;
1525
- }
1526
- .notif-bell-btn:hover { background: rgba(255,255,255,0.22); }
1527
- .notif-badge {
1528
- position: absolute;
1529
- top: 2px;
1530
- right: 2px;
1531
- background: #e05c5c;
1532
- color: #fff;
1533
- font-size: 10px;
1534
- font-weight: 700;
1535
- border-radius: 10px;
1536
- padding: 1px 5px;
1537
- min-width: 16px;
1538
- text-align: center;
1539
- line-height: 1.4;
1540
- }
1541
- .notif-dropdown {
1542
- position: absolute;
1543
- top: calc(100% + 8px);
1544
- right: 0;
1545
- width: 320px;
1546
- background: #fff;
1547
- border-radius: 12px;
1548
- box-shadow: 0 8px 32px rgba(0,0,0,0.18);
1549
- z-index: 1000;
1550
- overflow: hidden;
1551
- max-height: 420px;
1552
- overflow-y: auto;
1553
- }
1554
- .notif-dd-header {
1555
- display: flex;
1556
- justify-content: space-between;
1557
- align-items: center;
1558
- padding: 12px 16px 10px;
1559
- font-size: 13px;
1560
- font-weight: 700;
1561
- color: #1a1a2e;
1562
- border-bottom: 1px solid #f0f2f5;
1563
- }
1564
- .notif-mark-all {
1565
- background: none;
1566
- border: none;
1567
- color: #4f86c6;
1568
- font-size: 12px;
1569
- font-weight: 600;
1570
- cursor: pointer;
1571
- padding: 0;
1572
- }
1573
- .notif-mark-all:hover { text-decoration: underline; }
1574
- .notif-item {
1575
- padding: 10px 16px;
1576
- border-bottom: 1px solid #f5f7fa;
1577
- cursor: pointer;
1578
- transition: background 0.1s;
1579
- }
1580
- .notif-item:hover { background: #f8f9fa; }
1581
- .notif-item.unread { background: #eef4ff; border-left: 3px solid #4f86c6; }
1582
- .notif-item.unread:hover { background: #e3ecfd; }
1583
- .notif-msg {
1584
- font-size: 13px;
1585
- color: #333;
1586
- line-height: 1.4;
1587
- margin-bottom: 3px;
1588
- }
1589
- .notif-time {
1590
- font-size: 11px;
1591
- color: #aaa;
1592
- }
1593
- .notif-empty {
1594
- padding: 24px 16px;
1595
- text-align: center;
1596
- color: #aaa;
1597
- font-size: 13px;
1598
- }
1599
-
1600
- /* ── Primary action button (modal submit) ───────────────────────────────────── */
1601
- .btn-primary {
1602
- padding: 10px 20px;
1603
- background: linear-gradient(135deg, #1a1a2e, #0f3460);
1604
- color: #fff;
1605
- border: none;
1606
- border-radius: 8px;
1607
- font-size: 14px;
1608
- font-weight: 700;
1609
- cursor: pointer;
1610
- transition: opacity 0.15s, transform 0.15s;
1611
- box-shadow: 0 3px 10px rgba(15,52,96,0.3);
1612
- }
1613
- .btn-primary:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
1614
- .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }
1615
-
1616
- /* ── Log Panel ───────────────────────────────────────────────────────────────── */
1617
- .log-panel-overlay {
1618
- position: fixed;
1619
- inset: 0;
1620
- background: rgba(0,0,0,0.35);
1621
- z-index: 2000;
1622
- display: flex;
1623
- justify-content: flex-end;
1624
- }
1625
- .log-panel {
1626
- width: 380px;
1627
- max-width: 95vw;
1628
- height: 100%;
1629
- background: #fff;
1630
- display: flex;
1631
- flex-direction: column;
1632
- box-shadow: -4px 0 24px rgba(0,0,0,0.18);
1633
- animation: slideInRight 0.2s ease;
1634
- }
1635
- @keyframes slideInRight {
1636
- from { transform: translateX(100%); }
1637
- to { transform: translateX(0); }
1638
- }
1639
- .log-panel-header {
1640
- display: flex;
1641
- align-items: center;
1642
- justify-content: space-between;
1643
- padding: 16px 20px;
1644
- border-bottom: 1px solid #e8ecf4;
1645
- font-weight: 700;
1646
- font-size: 15px;
1647
- color: #1a1a2e;
1648
- background: #f7f9ff;
1649
- flex-shrink: 0;
1650
- }
1651
- .log-panel-close {
1652
- background: none;
1653
- border: none;
1654
- font-size: 22px;
1655
- cursor: pointer;
1656
- color: #888;
1657
- line-height: 1;
1658
- padding: 0 4px;
1659
- }
1660
- .log-panel-close:hover { color: #333; }
1661
- .log-panel-body {
1662
- flex: 1;
1663
- overflow-y: auto;
1664
- padding: 12px 16px;
1665
- display: flex;
1666
- flex-direction: column;
1667
- gap: 8px;
1668
- }
1669
- .log-entry {
1670
- background: #f7f9ff;
1671
- border: 1px solid #e4e9f5;
1672
- border-radius: 8px;
1673
- padding: 10px 14px;
1674
- }
1675
- .log-entry-action {
1676
- font-size: 13px;
1677
- color: #1a1a2e;
1678
- font-weight: 500;
1679
- margin-bottom: 4px;
1680
- word-break: break-word;
1681
- }
1682
- .log-entry-meta {
1683
- font-size: 11px;
1684
- color: #888;
1685
- }
1686
- .log-empty {
1687
- color: #aaa;
1688
- font-size: 13px;
1689
- text-align: center;
1690
- padding: 32px 0;
1691
- }