jkushwaha commited on
Commit
6be76da
Β·
verified Β·
1 Parent(s): ff268db

Create ap.css

Browse files
Files changed (1) hide show
  1. ap.css +1689 -0
ap.css ADDED
@@ -0,0 +1,1689 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ /* Short confirm/info modals should still appear centred */
637
+ .modal-overlay > .modal:not(.task-modal) { margin: auto; }
638
+ .modal {
639
+ background: #fff; border-radius: 14px; padding: 32px;
640
+ max-width: 900px; width: 90%;
641
+ box-shadow: 0 20px 60px rgba(0,0,0,0.25);
642
+ animation: modal-in 0.2s ease;
643
+ }
644
+ @keyframes modal-in { from{opacity:0;transform:translateY(-14px) scale(.97)} to{opacity:1;transform:translateY(0) scale(1)} }
645
+ .modal h3 { font-size: 1.1rem; margin-bottom: 8px; }
646
+ .modal p { color: #555; line-height: 1.6; font-size: 13px; margin-bottom: 4px; }
647
+ .modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; }
648
+
649
+ .submit-success-modal { text-align: center; }
650
+ .submit-success-icon { font-size: 3rem; margin-bottom: 12px; }
651
+ .submit-success-modal h3 { font-size: 1.2rem; margin-bottom: 10px; }
652
+ .submit-success-modal .modal-actions { justify-content: center; }
653
+ .btn-cancel {
654
+ padding: 9px 20px; border: 1.5px solid #d0d4db; background: #f5f6f8;
655
+ border-radius: 7px; cursor: pointer; font-size: 13px; font-weight: 600;
656
+ color: #555; transition: background 0.15s;
657
+ }
658
+ .btn-cancel:hover { background: #e8eaed; }
659
+ .btn-danger {
660
+ padding: 9px 20px; background: #e05c5c; color: #fff;
661
+ border: none; border-radius: 7px; cursor: pointer;
662
+ font-size: 13px; font-weight: 700; transition: background 0.15s;
663
+ }
664
+ .btn-danger:hover { background: #c94c4c; }
665
+ .btn-confirm {
666
+ padding: 9px 20px;
667
+ background: #1a1a2e; color: #fff;
668
+ border: none; border-radius: 7px; cursor: pointer;
669
+ font-size: 13px; font-weight: 700; transition: background 0.15s;
670
+ }
671
+ .btn-confirm:hover { background: #2d3a5a; }
672
+
673
+ /* Validation list */
674
+ .validation-list {
675
+ list-style: none; margin-top: 12px;
676
+ display: flex; flex-direction: column; gap: 6px;
677
+ max-height: 280px; overflow-y: auto;
678
+ }
679
+ .validation-list li {
680
+ display: flex; align-items: center; gap: 8px;
681
+ background: #f7f9fc; border-radius: 7px; padding: 7px 10px;
682
+ font-size: 13px;
683
+ }
684
+ .val-badge {
685
+ display: inline-block; padding: 2px 8px; border-radius: 5px;
686
+ background: #1a1a2e; color: #fff; font-size: 11px; font-weight: 700;
687
+ white-space: nowrap; flex-shrink: 0;
688
+ }
689
+ .val-fields { color: #555; }
690
+ .val-more { color: #999; font-style: italic; font-size: 12px; background: none !important; padding: 4px 10px !important; }
691
+
692
+ /* ── Main dashboard ── */
693
+ .app-main { flex: 1; padding: 20px 28px; display: flex; flex-direction: column; gap: 18px; }
694
+
695
+ /* Summary bar */
696
+ .summary-bar { display: flex; gap: 14px; flex-wrap: wrap; }
697
+ .summary-card {
698
+ flex: 1 1 130px; background: #fff; border-radius: 12px;
699
+ padding: 14px 18px; display: flex; flex-direction: column; gap: 4px;
700
+ box-shadow: 0 1px 4px rgba(0,0,0,0.08); border-top: 4px solid transparent;
701
+ }
702
+ .summary-card.blue { border-color: #4f86c6; }
703
+ .summary-card.green { border-color: #2d9e5a; }
704
+ .summary-card.purple { border-color: #9b73c8; }
705
+ .summary-card.teal { border-color: #4ab8c8; }
706
+ .summary-card.red { border-color: #e05c5c; }
707
+ .summary-value { font-size: 1.7rem; font-weight: 700; line-height: 1; }
708
+ .summary-value small { font-size: 1rem; color: #666; }
709
+ .summary-label { font-size: 11px; color: #666; font-weight: 500; text-transform: uppercase; letter-spacing: .4px; }
710
+
711
+ /* Toolbar */
712
+ .toolbar { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
713
+ .filter-chips { display: flex; gap: 7px; flex-wrap: wrap; }
714
+ .chip {
715
+ padding: 5px 12px; border-radius: 20px; border: 1.5px solid #d0d4db;
716
+ background: #fff; cursor: pointer; font-size: 12px; font-weight: 600;
717
+ color: #555; transition: all 0.15s;
718
+ }
719
+ .chip:hover { border-color: #999; color: #222; }
720
+ .chip.active { background: #1a1a2e; border-color: #1a1a2e; color: #fff; }
721
+ .search-box {
722
+ margin-left: auto; padding: 7px 12px; border: 1.5px solid #d0d4db;
723
+ border-radius: 8px; font-size: 13px; width: 220px; background: #fff;
724
+ outline: none; transition: border-color 0.2s;
725
+ }
726
+ .search-box:focus { border-color: #4f86c6; }
727
+
728
+ /* Table */
729
+ .table-wrap { background: #fff; border-radius: 12px; box-shadow: 0 1px 4px rgba(0,0,0,0.08); overflow: auto; }
730
+ .qa-table { width: 100%; border-collapse: collapse; min-width: 860px; }
731
+ .qa-table thead tr { background: #1a1a2e; color: #fff; }
732
+ .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; }
733
+ .qa-table tbody tr { border-bottom: 1px solid #f0f2f5; transition: background 0.1s; }
734
+ .qa-table tbody tr:hover { background: #f7f9fc; }
735
+ .qa-table tbody tr:last-child { border-bottom: none; }
736
+ .qa-table td { padding: 10px 14px; vertical-align: middle; }
737
+
738
+ .row-pass { border-left: 4px solid #2d9e5a; }
739
+ .row-warn { border-left: 4px solid #e08c4a; }
740
+ .row-fail { border-left: 4px solid #e05c5c; }
741
+ .row-neutral { border-left: 4px solid #d0d4db; }
742
+
743
+ .col-num { width: 44px; text-align: center; color: #999; font-weight: 600; }
744
+ .col-standard { width: 120px; }
745
+ .col-obs { min-width: 400px; line-height: 1.6; color: #333; font-size: 14px; }
746
+ .col-marks { width: 120px; text-align: center; }
747
+ .col-score { width: 160px; }
748
+ .col-shot { width: 230px; }
749
+
750
+ .std-badge {
751
+ display: inline-block; padding: 3px 9px; border-radius: 6px;
752
+ color: #fff; font-size: 11px; font-weight: 700; letter-spacing: .4px; white-space: nowrap;
753
+ }
754
+
755
+ /* ── Possible Marks (static display) ── */
756
+ .marks-static {
757
+ display: inline-block;
758
+ padding: 4px 12px;
759
+ background: #f0f2f5;
760
+ border-radius: 6px;
761
+ font-size: 14px;
762
+ font-weight: 700;
763
+ color: #1a1a2e;
764
+ min-width: 44px;
765
+ text-align: center;
766
+ }
767
+
768
+ /* Score input */
769
+ .score-cell { display: flex; flex-direction: column; gap: 4px; }
770
+ .score-row { display: flex; align-items: center; gap: 6px; }
771
+ .score-input {
772
+ width: 58px; padding: 4px 8px; border: 2px solid #ccc;
773
+ border-radius: 6px; font-size: 14px; font-weight: 600;
774
+ text-align: center; outline: none; transition: border-color 0.2s;
775
+ -moz-appearance: textfield;
776
+ }
777
+ .score-input::-webkit-outer-spin-button,
778
+ .score-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
779
+ .score-input:focus { outline: 2px solid #4f86c6; outline-offset: 1px; }
780
+ .score-input:disabled { background: #f5f6f8; cursor: not-allowed; }
781
+ .score-input.empty { border-color: #e0e3e8; }
782
+ .score-max { color: #999; font-size: 13px; white-space: nowrap; }
783
+ .score-bar-bg { height: 4px; background: #e8eaed; border-radius: 4px; overflow: hidden; }
784
+ .score-bar-fill { height: 100%; border-radius: 4px; transition: width .3s, background .3s; }
785
+
786
+ /* Screenshot cell */
787
+ .screenshot-cell { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
788
+ .screenshot-cell.has-image {
789
+ flex-direction: row;
790
+ align-items: center;
791
+ gap: 10px;
792
+ }
793
+ .screenshot-cell.has-image .screenshot-thumb-wrap { flex-shrink: 0; }
794
+ .screenshot-cell.has-image .shot-dd-wrap { flex-shrink: 0; }
795
+ .screenshot-thumb {
796
+ width: 110px; height: 76px; object-fit: cover; border-radius: 8px;
797
+ border: 1.5px solid #e0e0e0; cursor: pointer; transition: transform .15s, box-shadow .15s;
798
+ display: block;
799
+ }
800
+ .screenshot-thumb:hover { transform: scale(1.04); box-shadow: 0 4px 12px rgba(0,0,0,0.18); }
801
+ .screenshot-name { font-size: 11px; color: #777; max-width: 90px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
802
+ .screenshot-info { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
803
+ .no-screenshot { color: #bbb; font-style: italic; font-size: 13px; }
804
+ .btn-upload {
805
+ display: inline-flex; align-items: center; gap: 4px; padding: 5px 12px;
806
+ background: #f0f2f5; border: 1.5px solid #d0d4db; border-radius: 6px;
807
+ font-size: 12px; font-weight: 600; color: #444; cursor: pointer; transition: background .15s;
808
+ }
809
+ .btn-upload:hover { background: #e4e7ec; border-color: #999; }
810
+ .btn-upload.small { font-size: 11px; padding: 3px 8px; }
811
+ .btn-upload.required { border-color: #e05c5c; color: #c0392b; }
812
+ .btn-upload.required:hover { background: #fde8e8; }
813
+ .req-dot { color: #e05c5c; font-weight: 700; margin-left: 2px; }
814
+
815
+ /* ── Camera modal ── */
816
+ .camera-modal {
817
+ background: #fff; border-radius: 14px; padding: 24px;
818
+ width: 90%; max-width: 520px;
819
+ box-shadow: 0 20px 60px rgba(0,0,0,0.3);
820
+ animation: modal-in 0.2s ease;
821
+ display: flex; flex-direction: column; gap: 16px;
822
+ }
823
+ .camera-modal-header {
824
+ display: flex; align-items: center; justify-content: space-between; gap: 12px;
825
+ }
826
+ .camera-modal-header h3 { font-size: 1.1rem; margin: 0; }
827
+ .camera-switch-btn {
828
+ background: #f0f4ff; border: 1px solid #c7d4f0; border-radius: 8px;
829
+ padding: 5px 12px; font-size: 12px; cursor: pointer; color: #4f86c6;
830
+ white-space: nowrap;
831
+ }
832
+ .camera-switch-btn:hover { background: #dce8ff; }
833
+ .camera-preview {
834
+ width: 100%; border-radius: 10px; background: #000;
835
+ max-height: 360px; object-fit: cover;
836
+ }
837
+ .camera-mirror { transform: scaleX(-1); }
838
+ .camera-error {
839
+ color: #e05c5c; font-size: 13px; text-align: center;
840
+ padding: 24px 16px; background: #fff5f5; border-radius: 8px;
841
+ border: 1px solid #fcc; line-height: 1.6;
842
+ }
843
+
844
+ .shot-dd-wrap { position: relative; display: inline-block; }
845
+ .shot-dropdown {
846
+ position: absolute; left: 0; top: calc(100% + 5px);
847
+ background: #fff; border: 1px solid #e0e3e8; border-radius: 8px;
848
+ box-shadow: 0 6px 20px rgba(0,0,0,0.13);
849
+ min-width: 150px; z-index: 200; overflow: hidden;
850
+ animation: dd-in 0.12s ease;
851
+ }
852
+ .shot-dd-item {
853
+ display: flex; align-items: center; gap: 8px;
854
+ padding: 9px 14px; font-size: 13px; font-weight: 500;
855
+ color: #333; cursor: pointer; transition: background 0.1s;
856
+ }
857
+ .shot-dd-item:hover { background: #f0f4ff; }
858
+
859
+ .screenshot-thumb-wrap {
860
+ position: relative;
861
+ display: inline-block;
862
+ }
863
+ .btn-discard-x {
864
+ position: absolute; top: -6px; right: -6px;
865
+ width: 18px; height: 18px;
866
+ background: #e05c5c; color: #fff;
867
+ border: 2px solid #fff; border-radius: 50%;
868
+ font-size: 9px; font-weight: 700; line-height: 1;
869
+ display: flex; align-items: center; justify-content: center;
870
+ cursor: pointer; padding: 0;
871
+ box-shadow: 0 1px 4px rgba(0,0,0,0.25);
872
+ transition: background 0.15s, transform 0.15s;
873
+ }
874
+ .btn-discard-x:hover { background: #c0392b; transform: scale(1.15); }
875
+
876
+ /* Eval note sub-row */
877
+ .note-row { border-bottom: 2px solid #e8eaed !important; }
878
+ .note-row.row-pass { border-left: 4px solid #2d9e5a; }
879
+ .note-row.row-warn { border-left: 4px solid #e08c4a; }
880
+ .note-row.row-fail { border-left: 4px solid #e05c5c; }
881
+ .note-row.row-neutral { border-left: 4px solid #d0d4db; }
882
+ .note-cell { padding: 6px 14px 12px 14px !important; background: #fafbfc; }
883
+ .note-wrap { display: flex; align-items: flex-start; gap: 10px; }
884
+ .note-label {
885
+ flex-shrink: 0; font-size: 11px; font-weight: 700; color: #888;
886
+ text-transform: uppercase; letter-spacing: 0.4px; padding-top: 8px; min-width: 76px;
887
+ }
888
+ .note-textarea {
889
+ flex: 1; padding: 6px 10px;
890
+ border: 1.5px solid #e0e3e8; border-radius: 6px;
891
+ font-family: inherit; font-size: 13px; line-height: 1.5; color: #333;
892
+ background: #fff; resize: none; outline: none;
893
+ transition: border-color 0.15s, box-shadow 0.15s;
894
+ }
895
+ .note-textarea:focus { border-color: #4f86c6; box-shadow: 0 0 0 3px rgba(79,134,198,0.12); }
896
+ .note-textarea:disabled { background: #f5f6f8; color: #555; cursor: default; }
897
+ .note-textarea::placeholder { color: #bbb; }
898
+ .word-count { flex-shrink: 0; font-size: 11px; color: #aaa; padding-top: 8px; white-space: nowrap; }
899
+ .word-count.near-limit { color: #e08c4a; font-weight: 600; }
900
+ .word-count.at-limit { color: #e05c5c; font-weight: 700; }
901
+
902
+ /* Required fields note */
903
+ .req-star { color: #e05c5c; font-weight: 700; margin-left: 3px; }
904
+ .req-note { font-size: 12px; color: #888; padding: 4px 2px; }
905
+
906
+ .empty-row { text-align: center; color: #999; padding: 40px !important; font-style: italic; }
907
+
908
+ /* ── Responsive ── */
909
+ /* ── Tablet landscape / small desktop (≀1200px) β†’ 3 per row ─────────────── */
910
+ @media (max-width: 1200px) {
911
+ .portal-cards { flex-wrap: wrap; gap: 14px; }
912
+ .portal-card { flex: 0 1 calc(33.33% - 10px); max-width: calc(33.33% - 10px); }
913
+ .portal-body { padding: 20px 20px 32px; }
914
+ }
915
+
916
+ /* ── Tablet portrait (≀900px) β†’ 2 per row ───────────────────────────────── */
917
+ @media (max-width: 900px) {
918
+ .portal-cards { gap: 12px; }
919
+ .portal-card { flex: 0 1 calc(50% - 6px); max-width: calc(50% - 6px); }
920
+ .portal-body { padding: 16px 16px 28px; }
921
+ .portal-card-icon { font-size: 2rem; }
922
+ }
923
+
924
+ /* ── General tablet tweaks (≀1024px) ─────────────────────────────────────── */
925
+ @media (max-width: 1024px) {
926
+ .app-header { padding: 12px 20px; }
927
+ .app-main { padding: 16px 20px; }
928
+ .countdown { min-width: 100px; }
929
+ .countdown-time { font-size: 1.1rem; }
930
+ .col-obs { min-width: 300px; font-size: 13px; }
931
+ .search-box { width: 180px; }
932
+ }
933
+
934
+ /* ── Mobile landscape / small tablet (≀768px) ────────────────────────────── */
935
+ @media (max-width: 768px) {
936
+ .app-header { padding: 10px 14px; gap: 10px; }
937
+ .header-left h1 { font-size: 1.05rem; }
938
+ .header-right { gap: 8px; }
939
+ .countdown { min-width: 90px; padding: 5px 10px; }
940
+ .countdown-time { font-size: 1rem; }
941
+ .btn-view-report { padding: 7px 12px; font-size: 12px; }
942
+ .btn-danger-outline { padding: 7px 12px; font-size: 12px; }
943
+ .profile-name { display: none; }
944
+
945
+ .app-main { padding: 12px 14px; gap: 14px; }
946
+
947
+ .summary-card { flex: 1 1 120px; padding: 12px 14px; }
948
+ .summary-value { font-size: 1.5rem; }
949
+
950
+ .filter-chips { gap: 5px; }
951
+ .chip { padding: 4px 10px; font-size: 11px; }
952
+ .search-box { width: 100%; margin-left: 0; }
953
+ .toolbar { gap: 10px; }
954
+
955
+ .table-wrap { border-radius: 8px; }
956
+ .qa-table { min-width: 600px; }
957
+ .qa-table thead th, .qa-table td { padding: 8px 10px; font-size: 12px; }
958
+ .col-obs { min-width: 160px; font-size: 12px; }
959
+ .screenshot-thumb { width: 80px; height: 56px; }
960
+
961
+ .idle-card { padding: 32px 24px; }
962
+ .btn-start { padding: 12px 28px; font-size: 14px; }
963
+ .btn-secondary { padding: 11px 24px; font-size: 14px; }
964
+ .term-stats { gap: 8px; }
965
+ .t-stat { flex: 1 1 70px; padding: 10px 6px; }
966
+ .t-val { font-size: 1.1rem; }
967
+
968
+ .modal { padding: 24px 20px; }
969
+ }
970
+
971
+ /* ── Mobile portrait (≀480px) β†’ 1 per row ───────────────────────────────── */
972
+ @media (max-width: 480px) {
973
+ .portal-cards { gap: 10px; }
974
+ .portal-card { flex: 0 1 100%; max-width: 100%; padding: 20px 16px; }
975
+ .portal-card-icon { font-size: 1.8rem; }
976
+ .portal-card h3 { font-size: 0.95rem; }
977
+ .portal-body { padding: 12px 12px 24px; }
978
+
979
+ .header-sub { display: none; }
980
+ .countdown { display: none; }
981
+ .summary-bar { gap: 8px; }
982
+ .summary-card { flex: 1 1 100px; padding: 10px 12px; }
983
+ .summary-value { font-size: 1.3rem; }
984
+ .idle-card { padding: 28px 18px; }
985
+ .term-actions { flex-direction: column; align-items: stretch; }
986
+ .btn-start, .btn-secondary { width: 100%; text-align: center; }
987
+ }
988
+
989
+ /* ── Test name badge (in tables) ──────────────────────────────────────────── */
990
+ .tp-name-badge {
991
+ display: inline-block;
992
+ padding: 3px 10px;
993
+ border-radius: 99px;
994
+ background: #eef3fb;
995
+ color: #4f86c6;
996
+ font-size: 12px;
997
+ font-weight: 600;
998
+ white-space: nowrap;
999
+ }
1000
+
1001
+ /* ── Testing Profiles portal ─────────────────────────────────────────────── */
1002
+ .tp-grid {
1003
+ display: grid;
1004
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1005
+ gap: 20px;
1006
+ }
1007
+ .tp-card {
1008
+ background: #fff;
1009
+ border-radius: 16px;
1010
+ padding: 24px 22px;
1011
+ box-shadow: 0 4px 20px rgba(0,0,0,0.08);
1012
+ border-top: 4px solid #4f86c6;
1013
+ display: flex;
1014
+ flex-direction: column;
1015
+ gap: 10px;
1016
+ animation: card-in 0.2s ease;
1017
+ }
1018
+ .tp-card-top {
1019
+ display: flex;
1020
+ align-items: center;
1021
+ gap: 10px;
1022
+ }
1023
+ .tp-card-icon { font-size: 1.8rem; flex-shrink: 0; }
1024
+ .tp-card-name { font-size: 1.1rem; font-weight: 700; color: #1a1a2e; }
1025
+ .tp-card-meta {
1026
+ display: flex;
1027
+ align-items: center;
1028
+ gap: 6px;
1029
+ font-size: 13px;
1030
+ color: #555;
1031
+ font-weight: 500;
1032
+ }
1033
+ .tp-dot { color: #bbb; }
1034
+ .tp-card-date { font-size: 11px; color: #999; }
1035
+ .tp-card-actions {
1036
+ display: flex;
1037
+ gap: 8px;
1038
+ flex-wrap: wrap;
1039
+ margin-top: 6px;
1040
+ }
1041
+
1042
+ .tp-empty {
1043
+ display: flex;
1044
+ flex-direction: column;
1045
+ align-items: center;
1046
+ justify-content: center;
1047
+ padding: 80px 24px;
1048
+ text-align: center;
1049
+ }
1050
+ .tp-empty-icon { font-size: 3rem; margin-bottom: 16px; }
1051
+ .tp-empty h3 { font-size: 1.2rem; font-weight: 700; margin-bottom: 8px; }
1052
+ .tp-empty p { color: #666; font-size: 14px; max-width: 400px; }
1053
+
1054
+ /* ── Profile picker (full-page list) ─────────────────────────────────────── */
1055
+ .tp-picker-list {
1056
+ display: flex;
1057
+ flex-direction: column;
1058
+ gap: 12px;
1059
+ }
1060
+ .tp-picker-item {
1061
+ display: flex;
1062
+ align-items: center;
1063
+ gap: 18px;
1064
+ width: 100%;
1065
+ padding: 20px 22px;
1066
+ background: #fff;
1067
+ border: 2px solid #e5e8ee;
1068
+ border-radius: 14px;
1069
+ cursor: pointer;
1070
+ text-align: left;
1071
+ box-shadow: 0 2px 12px rgba(0,0,0,0.05);
1072
+ transition: border-color 0.15s, box-shadow 0.15s, transform 0.1s;
1073
+ }
1074
+ .tp-picker-item:hover {
1075
+ border-color: #4f86c6;
1076
+ box-shadow: 0 4px 20px rgba(79,134,198,0.15);
1077
+ transform: translateY(-1px);
1078
+ }
1079
+ .tp-picker-icon { font-size: 2rem; flex-shrink: 0; }
1080
+ .tp-picker-info { flex: 1; display: flex; flex-direction: column; gap: 3px; }
1081
+ .tp-picker-info strong { font-size: 15px; font-weight: 700; color: #1a1a2e; }
1082
+ .tp-picker-info span { font-size: 13px; color: #666; }
1083
+ .tp-picker-arrow { font-size: 20px; color: #bbb; font-weight: 300; }
1084
+ .tp-picker-item:hover .tp-picker-arrow { color: #4f86c6; }
1085
+ .tp-picker-default { border-style: dashed; background: #fafafa; }
1086
+ .tp-picker-default:hover { border-color: #888; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
1087
+
1088
+ /* ── Indigo portal card (Manage Accounts) ─────────────────────────────────── */
1089
+ .portal-card-indigo { border-top: 4px solid #6c5ce7; }
1090
+ .btn-start-indigo {
1091
+ background: linear-gradient(135deg, #6c5ce7, #a29bfe);
1092
+ box-shadow: 0 4px 14px rgba(108,92,231,0.4);
1093
+ }
1094
+ .btn-start-indigo:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
1095
+
1096
+ /* ── Session role badge (header subtitle) ─────────────────────────────────── */
1097
+ .session-role-badge {
1098
+ display: inline-block;
1099
+ padding: 2px 9px;
1100
+ border-radius: 99px;
1101
+ font-size: 11px;
1102
+ font-weight: 700;
1103
+ color: #fff;
1104
+ letter-spacing: 0.4px;
1105
+ vertical-align: middle;
1106
+ }
1107
+
1108
+ /* ── Account management table ─────────────────────────────────────────────── */
1109
+ .acct-table td { vertical-align: middle; }
1110
+
1111
+ .acct-user {
1112
+ display: flex;
1113
+ align-items: center;
1114
+ gap: 10px;
1115
+ }
1116
+ .acct-avatar {
1117
+ width: 36px;
1118
+ height: 36px;
1119
+ border-radius: 50%;
1120
+ color: #fff;
1121
+ font-size: 15px;
1122
+ font-weight: 700;
1123
+ display: flex;
1124
+ align-items: center;
1125
+ justify-content: center;
1126
+ flex-shrink: 0;
1127
+ }
1128
+ .acct-you-badge {
1129
+ display: inline-block;
1130
+ margin-left: 7px;
1131
+ padding: 1px 7px;
1132
+ border-radius: 99px;
1133
+ font-size: 10px;
1134
+ font-weight: 700;
1135
+ background: #e8f0fe;
1136
+ color: #4f86c6;
1137
+ vertical-align: middle;
1138
+ }
1139
+
1140
+ .acct-role-select {
1141
+ padding: 5px 10px;
1142
+ border-radius: 7px;
1143
+ border: 1.5px solid #d0d4db;
1144
+ font-size: 13px;
1145
+ font-weight: 600;
1146
+ background: #fff;
1147
+ cursor: pointer;
1148
+ outline: none;
1149
+ transition: border-color 0.2s, box-shadow 0.2s;
1150
+ }
1151
+ .acct-role-select:focus { box-shadow: 0 0 0 3px rgba(79,134,198,0.15); }
1152
+
1153
+ .acct-desc {
1154
+ font-size: 13px;
1155
+ color: #666;
1156
+ max-width: 280px;
1157
+ }
1158
+
1159
+ /* ── Role legend ──────────────────────────────────────────────────────────── */
1160
+ .acct-legend {
1161
+ display: flex;
1162
+ gap: 20px;
1163
+ flex-wrap: wrap;
1164
+ margin-top: 24px;
1165
+ padding: 20px 24px;
1166
+ background: #f8f9fb;
1167
+ border-radius: 12px;
1168
+ border: 1px solid #e5e8ee;
1169
+ }
1170
+ .acct-legend-item {
1171
+ display: flex;
1172
+ align-items: center;
1173
+ gap: 8px;
1174
+ font-size: 13px;
1175
+ color: #555;
1176
+ }
1177
+ .acct-legend-dot {
1178
+ width: 10px;
1179
+ height: 10px;
1180
+ border-radius: 50%;
1181
+ flex-shrink: 0;
1182
+ }
1183
+
1184
+ /* ── Phone input with prefix ─────────────────────────────────────────────── */
1185
+ .acct-phone-wrap {
1186
+ display: flex;
1187
+ align-items: center;
1188
+ border: 1.5px solid #d0d4db;
1189
+ border-radius: 8px;
1190
+ overflow: hidden;
1191
+ transition: border-color 0.2s, box-shadow 0.2s;
1192
+ }
1193
+ .acct-phone-wrap:focus-within {
1194
+ border-color: #4f86c6;
1195
+ box-shadow: 0 0 0 3px rgba(79,134,198,0.15);
1196
+ }
1197
+ .acct-phone-prefix {
1198
+ padding: 11px 12px;
1199
+ background: #f0f2f5;
1200
+ font-size: 14px;
1201
+ font-weight: 600;
1202
+ color: #444;
1203
+ border-right: 1.5px solid #d0d4db;
1204
+ flex-shrink: 0;
1205
+ }
1206
+ .acct-phone-input {
1207
+ flex: 1;
1208
+ border: none !important;
1209
+ border-radius: 0 !important;
1210
+ box-shadow: none !important;
1211
+ outline: none;
1212
+ }
1213
+
1214
+ /* ── Danger small button ──────────────────────────────────────────────────── */
1215
+ .btn-danger-sm {
1216
+ padding: 5px 12px;
1217
+ background: #fff;
1218
+ color: #e05c5c;
1219
+ border: 1.5px solid #e05c5c;
1220
+ border-radius: 7px;
1221
+ font-size: 12px;
1222
+ font-weight: 600;
1223
+ cursor: pointer;
1224
+ transition: background 0.15s, color 0.15s;
1225
+ }
1226
+ .btn-danger-sm:hover { background: #e05c5c; color: #fff; }
1227
+
1228
+ /* ── Portal card β€” Violet (Planner) ────────────────────────────────────────── */
1229
+ .portal-card-violet { border-top-color: #7c3aed; }
1230
+ .btn-start-violet {
1231
+ background: linear-gradient(135deg, #7c3aed, #5b21b6) !important;
1232
+ box-shadow: 0 4px 14px rgba(124,58,237,0.35) !important;
1233
+ }
1234
+ .btn-start-violet:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
1235
+
1236
+ /* ── Portal card β€” Amber (Tickets) ─────────────────────────────────────────── */
1237
+ .portal-card-amber { border-top-color: #d97706; }
1238
+ .btn-start-amber {
1239
+ background: linear-gradient(135deg, #d97706, #b45309) !important;
1240
+ box-shadow: 0 4px 14px rgba(217,119,6,0.35) !important;
1241
+ }
1242
+ .btn-start-amber:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
1243
+
1244
+ /* ── Kanban board ───────────────────────────────────────────────────────────── */
1245
+ /* ── Task / Ticket modal two-column layout ──────────────────────────────────── */
1246
+ .task-modal {
1247
+ max-width: 900px !important;
1248
+ width: 92% !important;
1249
+ padding: 0 !important;
1250
+ overflow: hidden;
1251
+ }
1252
+
1253
+ /* Planner β€” violet theme */
1254
+ .task-modal--planner .task-modal-header {
1255
+ background: linear-gradient(135deg, #7c3aed 0%, #5b21b6 100%);
1256
+ }
1257
+ .task-modal--planner .task-modal-right {
1258
+ background: #f3f0ff;
1259
+ border-left: 1px solid #e0d4ff;
1260
+ }
1261
+ .task-modal--planner .task-modal-right .login-label { color: #6040b0; }
1262
+ .task-modal--planner .task-modal-right .login-input:focus {
1263
+ border-color: #7c3aed;
1264
+ box-shadow: 0 0 0 3px rgba(124,58,237,0.12);
1265
+ }
1266
+
1267
+ /* Ticket β€” amber theme */
1268
+ .task-modal--ticket .task-modal-header {
1269
+ background: linear-gradient(135deg, #d97706 0%, #b45309 100%);
1270
+ }
1271
+ .task-modal--ticket .task-modal-right {
1272
+ background: #fffbeb;
1273
+ border-left: 1px solid #fde68a;
1274
+ }
1275
+ .task-modal--ticket .task-modal-right .login-label { color: #92400e; }
1276
+ .task-modal--ticket .task-modal-right .login-input:focus {
1277
+ border-color: #d97706;
1278
+ box-shadow: 0 0 0 3px rgba(217,119,6,0.12);
1279
+ }
1280
+
1281
+ /* Shared header */
1282
+ .task-modal-header {
1283
+ padding: 18px 28px;
1284
+ display: flex;
1285
+ align-items: center;
1286
+ justify-content: space-between;
1287
+ }
1288
+ .task-modal-header h3 {
1289
+ color: #fff;
1290
+ font-size: 1.1rem;
1291
+ font-weight: 700;
1292
+ margin: 0;
1293
+ }
1294
+
1295
+ /* Body */
1296
+ .task-modal-body { padding: 24px 28px; }
1297
+ .task-modal-grid {
1298
+ display: grid;
1299
+ grid-template-columns: 2fr 240px;
1300
+ gap: 0;
1301
+ align-items: stretch;
1302
+ }
1303
+ .task-modal-left {
1304
+ display: flex;
1305
+ flex-direction: column;
1306
+ padding-right: 24px;
1307
+ }
1308
+ .task-modal-right {
1309
+ display: flex;
1310
+ flex-direction: column;
1311
+ padding: 20px 20px;
1312
+ border-radius: 0 0 14px 0;
1313
+ }
1314
+ @media (max-width: 680px) {
1315
+ .task-modal-grid { grid-template-columns: 1fr; }
1316
+ .task-modal-right { border-left: none; border-top: 1px solid #e0e4ea; padding: 16px 0 0; }
1317
+ }
1318
+
1319
+ /* ── Kanban board ───────────────────────────────────────────────────────────── */
1320
+ .kanban-board {
1321
+ display: flex;
1322
+ gap: 16px;
1323
+ align-items: stretch;
1324
+ overflow-x: auto;
1325
+ padding-bottom: 16px;
1326
+ height: calc(100vh - 160px);
1327
+ }
1328
+ /* Column accent colors */
1329
+ .kanban-col[data-col="backlog"] { background: #f0f4ff; }
1330
+ .kanban-col[data-col="in-progress"] { background: #fff8ed; }
1331
+ .kanban-col[data-col="in-review"] { background: #f3f0ff; }
1332
+ .kanban-col[data-col="done"] { background: #edfaf3; }
1333
+
1334
+ .kanban-col[data-col="backlog"] .kanban-col-header { border-bottom-color: #93b4f0; color: #3a5da8; background: #f0f4ff; }
1335
+ .kanban-col[data-col="in-progress"] .kanban-col-header { border-bottom-color: #f0b060; color: #a05a10; background: #fff8ed; }
1336
+ .kanban-col[data-col="in-review"] .kanban-col-header { border-bottom-color: #b49af0; color: #6040b0; background: #f3f0ff; }
1337
+ .kanban-col[data-col="done"] .kanban-col-header { border-bottom-color: #60c890; color: #1a7040; background: #edfaf3; }
1338
+
1339
+ .kanban-col[data-col="backlog"] .kanban-col-count { background: #d0deff; color: #3a5da8; }
1340
+ .kanban-col[data-col="in-progress"] .kanban-col-count { background: #ffe0b0; color: #a05a10; }
1341
+ .kanban-col[data-col="in-review"] .kanban-col-count { background: #e0d4ff; color: #6040b0; }
1342
+ .kanban-col[data-col="done"] .kanban-col-count { background: #c0f0d8; color: #1a7040; }
1343
+
1344
+ .kanban-col {
1345
+ flex: 1 1 300px;
1346
+ border-radius: 12px;
1347
+ padding: 12px;
1348
+ min-height: 300px;
1349
+ overflow-y: auto;
1350
+ max-height: 100%;
1351
+ }
1352
+ .kanban-col-header {
1353
+ display: flex;
1354
+ justify-content: space-between;
1355
+ align-items: center;
1356
+ font-size: 13px;
1357
+ font-weight: 700;
1358
+ text-transform: uppercase;
1359
+ letter-spacing: 0.5px;
1360
+ margin-bottom: 10px;
1361
+ padding-bottom: 8px;
1362
+ border-bottom: 2px solid #e0e4ea;
1363
+ position: sticky;
1364
+ top: 0;
1365
+ z-index: 2;
1366
+ }
1367
+ .kanban-col-count {
1368
+ background: #e0e4ea;
1369
+ color: #666;
1370
+ font-size: 11px;
1371
+ font-weight: 700;
1372
+ border-radius: 20px;
1373
+ padding: 1px 8px;
1374
+ }
1375
+ .kanban-empty {
1376
+ text-align: center;
1377
+ color: #bbb;
1378
+ font-size: 13px;
1379
+ padding: 20px 0;
1380
+ }
1381
+ .kanban-card {
1382
+ background: #fff;
1383
+ border-radius: 10px;
1384
+ padding: 12px;
1385
+ margin-bottom: 10px;
1386
+ box-shadow: 0 2px 8px rgba(0,0,0,0.07);
1387
+ transition: box-shadow 0.15s, transform 0.1s;
1388
+ }
1389
+ .kanban-card:hover { box-shadow: 0 4px 16px rgba(0,0,0,0.12); transform: translateY(-1px); }
1390
+ .kanban-card.card-once { border-left: 4px solid #4f86c6; background: #f7faff; }
1391
+ .kanban-card.card-daily { border-left: 4px solid #22a05a; background: #f4fbf7; }
1392
+ .kanban-card.dragging { opacity: 0.45; transform: rotate(2deg); }
1393
+ .kanban-col.drag-over { background: #eef3ff; outline: 2px dashed #4f86c6; outline-offset: -4px; }
1394
+ .kanban-card-product {
1395
+ display: inline-block;
1396
+ font-size: 10px;
1397
+ font-weight: 700;
1398
+ background: #e8f0fe;
1399
+ color: #4f86c6;
1400
+ border-radius: 4px;
1401
+ padding: 2px 6px;
1402
+ margin-bottom: 6px;
1403
+ text-transform: uppercase;
1404
+ letter-spacing: 0.4px;
1405
+ }
1406
+ .kanban-card-title {
1407
+ font-size: 13px;
1408
+ font-weight: 700;
1409
+ color: #1a1a2e;
1410
+ margin-bottom: 4px;
1411
+ line-height: 1.3;
1412
+ }
1413
+ .kanban-card-desc {
1414
+ font-size: 12px;
1415
+ color: #777;
1416
+ margin-bottom: 6px;
1417
+ line-height: 1.4;
1418
+ }
1419
+ .kanban-card-meta {
1420
+ display: flex;
1421
+ gap: 8px;
1422
+ font-size: 11px;
1423
+ color: #888;
1424
+ margin-bottom: 8px;
1425
+ flex-wrap: wrap;
1426
+ }
1427
+ .kanban-card-dates {
1428
+ display: flex;
1429
+ gap: 8px;
1430
+ font-size: 10px;
1431
+ color: #999;
1432
+ margin-bottom: 6px;
1433
+ flex-wrap: wrap;
1434
+ }
1435
+ .kanban-date-due { color: #555; }
1436
+ .kanban-date-due.overdue { color: #e05c5c; font-weight: 600; }
1437
+ .due-date { color: #555; }
1438
+ .due-date-overdue { color: #e05c5c; font-weight: 600; }
1439
+ .kanban-card-footer {
1440
+ display: flex;
1441
+ align-items: center;
1442
+ gap: 6px;
1443
+ }
1444
+ .kanban-status-select {
1445
+ flex: 1;
1446
+ font-size: 11px;
1447
+ padding: 4px 6px;
1448
+ border: 1.5px solid #d0d4db;
1449
+ border-radius: 6px;
1450
+ outline: none;
1451
+ cursor: pointer;
1452
+ background: #f8f9fa;
1453
+ color: #333;
1454
+ }
1455
+ .kanban-del-btn {
1456
+ background: none;
1457
+ border: 1.5px solid #e05c5c;
1458
+ color: #e05c5c;
1459
+ border-radius: 6px;
1460
+ padding: 3px 7px;
1461
+ font-size: 11px;
1462
+ cursor: pointer;
1463
+ transition: background 0.15s, color 0.15s;
1464
+ }
1465
+ .kanban-del-btn:hover { background: #e05c5c; color: #fff; }
1466
+
1467
+ /* ── Tag chips ──────────────────────────────────────────────────────────────── */
1468
+ .tag-chip-wrap {
1469
+ display: flex;
1470
+ flex-wrap: wrap;
1471
+ gap: 6px;
1472
+ margin-top: 4px;
1473
+ margin-bottom: 4px;
1474
+ }
1475
+ .tag-chip {
1476
+ padding: 4px 10px;
1477
+ background: #f0f2f5;
1478
+ color: #555;
1479
+ border-radius: 20px;
1480
+ font-size: 12px;
1481
+ font-weight: 600;
1482
+ cursor: pointer;
1483
+ border: 1.5px solid transparent;
1484
+ transition: all 0.15s;
1485
+ }
1486
+ .tag-chip.active {
1487
+ background: #e8f0fe;
1488
+ color: #4f86c6;
1489
+ border-color: #4f86c6;
1490
+ }
1491
+ .tag-chip:hover { border-color: #aaa; }
1492
+
1493
+ /* ── Ticket priority badges ─────────────────────────────────────────────────── */
1494
+ .priority-high { background: #fde8e8; color: #c0392b; border-radius: 4px; padding: 2px 7px; font-size: 12px; font-weight: 600; }
1495
+ .priority-medium { background: #fff8e1; color: #d97706; border-radius: 4px; padding: 2px 7px; font-size: 12px; font-weight: 600; }
1496
+ .priority-low { background: #e6f7ee; color: #1a6e3c; border-radius: 4px; padding: 2px 7px; font-size: 12px; font-weight: 600; }
1497
+
1498
+ /* ── Status pill ────────────────────────────────────────────────────────────── */
1499
+ .status-pill {
1500
+ background: #f0f2f5;
1501
+ color: #555;
1502
+ border-radius: 4px;
1503
+ padding: 2px 7px;
1504
+ font-size: 12px;
1505
+ font-weight: 600;
1506
+ text-transform: capitalize;
1507
+ }
1508
+
1509
+ /* ── Notification bell ──────────────────────────────────────────────────────── */
1510
+ .notif-bell-wrap {
1511
+ position: relative;
1512
+ }
1513
+ .notif-bell-btn {
1514
+ background: rgba(255,255,255,0.12);
1515
+ border: none;
1516
+ border-radius: 8px;
1517
+ color: #fff;
1518
+ font-size: 18px;
1519
+ padding: 7px 10px;
1520
+ cursor: pointer;
1521
+ position: relative;
1522
+ transition: background 0.15s;
1523
+ }
1524
+ .notif-bell-btn:hover { background: rgba(255,255,255,0.22); }
1525
+ .notif-badge {
1526
+ position: absolute;
1527
+ top: 2px;
1528
+ right: 2px;
1529
+ background: #e05c5c;
1530
+ color: #fff;
1531
+ font-size: 10px;
1532
+ font-weight: 700;
1533
+ border-radius: 10px;
1534
+ padding: 1px 5px;
1535
+ min-width: 16px;
1536
+ text-align: center;
1537
+ line-height: 1.4;
1538
+ }
1539
+ .notif-dropdown {
1540
+ position: absolute;
1541
+ top: calc(100% + 8px);
1542
+ right: 0;
1543
+ width: 320px;
1544
+ background: #fff;
1545
+ border-radius: 12px;
1546
+ box-shadow: 0 8px 32px rgba(0,0,0,0.18);
1547
+ z-index: 1000;
1548
+ overflow: hidden;
1549
+ max-height: 420px;
1550
+ overflow-y: auto;
1551
+ }
1552
+ .notif-dd-header {
1553
+ display: flex;
1554
+ justify-content: space-between;
1555
+ align-items: center;
1556
+ padding: 12px 16px 10px;
1557
+ font-size: 13px;
1558
+ font-weight: 700;
1559
+ color: #1a1a2e;
1560
+ border-bottom: 1px solid #f0f2f5;
1561
+ }
1562
+ .notif-mark-all {
1563
+ background: none;
1564
+ border: none;
1565
+ color: #4f86c6;
1566
+ font-size: 12px;
1567
+ font-weight: 600;
1568
+ cursor: pointer;
1569
+ padding: 0;
1570
+ }
1571
+ .notif-mark-all:hover { text-decoration: underline; }
1572
+ .notif-item {
1573
+ padding: 10px 16px;
1574
+ border-bottom: 1px solid #f5f7fa;
1575
+ cursor: pointer;
1576
+ transition: background 0.1s;
1577
+ }
1578
+ .notif-item:hover { background: #f8f9fa; }
1579
+ .notif-item.unread { background: #eef4ff; border-left: 3px solid #4f86c6; }
1580
+ .notif-item.unread:hover { background: #e3ecfd; }
1581
+ .notif-msg {
1582
+ font-size: 13px;
1583
+ color: #333;
1584
+ line-height: 1.4;
1585
+ margin-bottom: 3px;
1586
+ }
1587
+ .notif-time {
1588
+ font-size: 11px;
1589
+ color: #aaa;
1590
+ }
1591
+ .notif-empty {
1592
+ padding: 24px 16px;
1593
+ text-align: center;
1594
+ color: #aaa;
1595
+ font-size: 13px;
1596
+ }
1597
+
1598
+ /* ── Primary action button (modal submit) ───────────────────────────────────── */
1599
+ .btn-primary {
1600
+ padding: 10px 20px;
1601
+ background: linear-gradient(135deg, #1a1a2e, #0f3460);
1602
+ color: #fff;
1603
+ border: none;
1604
+ border-radius: 8px;
1605
+ font-size: 14px;
1606
+ font-weight: 700;
1607
+ cursor: pointer;
1608
+ transition: opacity 0.15s, transform 0.15s;
1609
+ box-shadow: 0 3px 10px rgba(15,52,96,0.3);
1610
+ }
1611
+ .btn-primary:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
1612
+ .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }
1613
+
1614
+ /* ── Log Panel ───────────────────────────────────────────────────────────────── */
1615
+ .log-panel-overlay {
1616
+ position: fixed;
1617
+ inset: 0;
1618
+ background: rgba(0,0,0,0.35);
1619
+ z-index: 2000;
1620
+ display: flex;
1621
+ justify-content: flex-end;
1622
+ }
1623
+ .log-panel {
1624
+ width: 380px;
1625
+ max-width: 95vw;
1626
+ height: 100%;
1627
+ background: #fff;
1628
+ display: flex;
1629
+ flex-direction: column;
1630
+ box-shadow: -4px 0 24px rgba(0,0,0,0.18);
1631
+ animation: slideInRight 0.2s ease;
1632
+ }
1633
+ @keyframes slideInRight {
1634
+ from { transform: translateX(100%); }
1635
+ to { transform: translateX(0); }
1636
+ }
1637
+ .log-panel-header {
1638
+ display: flex;
1639
+ align-items: center;
1640
+ justify-content: space-between;
1641
+ padding: 16px 20px;
1642
+ border-bottom: 1px solid #e8ecf4;
1643
+ font-weight: 700;
1644
+ font-size: 15px;
1645
+ color: #1a1a2e;
1646
+ background: #f7f9ff;
1647
+ flex-shrink: 0;
1648
+ }
1649
+ .log-panel-close {
1650
+ background: none;
1651
+ border: none;
1652
+ font-size: 22px;
1653
+ cursor: pointer;
1654
+ color: #888;
1655
+ line-height: 1;
1656
+ padding: 0 4px;
1657
+ }
1658
+ .log-panel-close:hover { color: #333; }
1659
+ .log-panel-body {
1660
+ flex: 1;
1661
+ overflow-y: auto;
1662
+ padding: 12px 16px;
1663
+ display: flex;
1664
+ flex-direction: column;
1665
+ gap: 8px;
1666
+ }
1667
+ .log-entry {
1668
+ background: #f7f9ff;
1669
+ border: 1px solid #e4e9f5;
1670
+ border-radius: 8px;
1671
+ padding: 10px 14px;
1672
+ }
1673
+ .log-entry-action {
1674
+ font-size: 13px;
1675
+ color: #1a1a2e;
1676
+ font-weight: 500;
1677
+ margin-bottom: 4px;
1678
+ word-break: break-word;
1679
+ }
1680
+ .log-entry-meta {
1681
+ font-size: 11px;
1682
+ color: #888;
1683
+ }
1684
+ .log-empty {
1685
+ color: #aaa;
1686
+ font-size: 13px;
1687
+ text-align: center;
1688
+ padding: 32px 0;
1689
+ }