jkushwaha commited on
Commit
1f2d640
·
verified ·
1 Parent(s): efd000b

Update tmp

Browse files
Files changed (1) hide show
  1. tmp +1691 -20
tmp CHANGED
@@ -1,20 +1,1691 @@
1
- SELECT table_name
2
- FROM information_schema.tables
3
- WHERE table_schema = 'public'
4
- ORDER BY table_name;
5
-
6
- You should see all 8 tables:
7
- qa_notifications
8
- qa_products
9
- qa_profiles
10
- qa_submissions
11
- qa_tasks
12
- qa_tickets
13
- qa_user_products
14
- qa_users
15
-
16
- Option 3 — Check columns on a specific table
17
- SELECT column_name, data_type, column_default
18
- FROM information_schema.columns
19
- WHERE table_schema = 'public' AND table_name = 'qa_tasks'
20
- ORDER BY ordinal_position;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ }