GuglielmoTor commited on
Commit
8010fdc
·
verified ·
1 Parent(s): d04e05d

Update ui/okr_ui_generator.py

Browse files
Files changed (1) hide show
  1. ui/okr_ui_generator.py +95 -418
ui/okr_ui_generator.py CHANGED
@@ -19,7 +19,7 @@ def create_enhanced_okr_tab():
19
  okr_custom_css = """
20
  <style>
21
  /* ----------------------------------------- */
22
- /* --- THEME & COLOR VARIABLES (NEW) --- */
23
  /* ----------------------------------------- */
24
  :root {
25
  --okr-bg-start: #667eea;
@@ -36,8 +36,8 @@ def create_enhanced_okr_tab():
36
  --objective-card-border: #3b82f6;
37
  --objective-shadow: 0 4px 16px rgba(0,0,0,0.05);
38
  --objective-shadow-hover: 0 8px 24px rgba(0,0,0,0.1);
39
- --objective-header-bg: transparent; /* Cleaner header background */
40
- --objective-title-color: #1e40af; /* Make title the colored element */
41
  --objective-meta-text-color: #475569;
42
  --key-result-bg: white;
43
  --key-result-border: #e5e7eb;
@@ -68,50 +68,9 @@ def create_enhanced_okr_tab():
68
  --priority-low-border: #86efac;
69
  }
70
 
71
- /* --- DARK MODE OVERRIDES (IMPROVED) --- */
72
- html.dark {
73
- --header-text-color: #e5e7eb;
74
- --stat-card-bg: rgba(28, 28, 28, 0.7);
75
- --stat-card-bg-hover: rgba(40, 40, 40, 0.8);
76
- --stat-card-border: rgba(50, 50, 50, 0.8);
77
- --content-bg: #0d1117; /* Black background for content */
78
- --content-shadow: rgba(0,0,0,0.6);
79
- --objective-card-bg: #161b22; /* Blackish card background */
80
- --objective-card-border: #3b82f6;
81
- --objective-shadow: 0 8px 24px rgba(0,0,0,0.5);
82
- --objective-shadow-hover: 0 10px 28px rgba(0,0,0,0.6);
83
- --objective-title-color: #58a6ff; /* White-ish blue for title */
84
- --objective-meta-text-color: #8b949e; /* White-ish grey for meta */
85
- --key-result-bg: #161b22;
86
- --key-result-border: #30363d;
87
- --key-result-border-hover: #58a6ff;
88
- --kr-header-bg: #161b22;
89
- --kr-title-color: #c9d1d9; /* White text */
90
- --kr-metric-bg: rgba(56, 139, 253, 0.15);
91
- --kr-metric-color: #58a6ff;
92
- --kr-metric-border: rgba(56, 139, 253, 0.4);
93
- --task-item-bg: #21262d;
94
- --task-item-bg-hover: #30363d;
95
- --task-item-border: #30363d;
96
- --task-item-border-hover: #8b949e;
97
- --task-title-color: #c9d1d9; /* White text */
98
- --task-detail-label-color: #8b949e;
99
- --task-detail-text-color: #8b949e;
100
- --task-description-bg: #0d1117;
101
- --task-description-border: #30363d;
102
- --task-description-color: #8b949e;
103
- --priority-high-bg: rgba(248, 81, 73, 0.15);
104
- --priority-high-color: #ff7b72;
105
- --priority-high-border: rgba(248, 81, 73, 0.4);
106
- --priority-medium-bg: rgba(210, 153, 34, 0.15);
107
- --priority-medium-color: #d29922;
108
- --priority-medium-border: rgba(210, 153, 34, 0.4);
109
- --priority-low-bg: rgba(63, 185, 80, 0.15);
110
- --priority-low-color: #56d364;
111
- --priority-low-border: rgba(63, 185, 80, 0.4);
112
- }
113
-
114
- /* Overall Container */
115
  .okr-container {
116
  font-family: 'Inter', sans-serif;
117
  background: linear-gradient(135deg, var(--okr-bg-start) 0%, var(--okr-bg-end) 100%);
@@ -122,385 +81,98 @@ def create_enhanced_okr_tab():
122
  overflow-y: auto;
123
  }
124
 
125
- /* Header Section */
126
- .okr-header {
127
- text-align: center;
128
- margin-bottom: 3rem;
129
- color: var(--header-text-color);
130
- }
131
-
132
- .okr-title {
133
- font-size: 2.5rem;
134
- font-weight: 700;
135
- margin-bottom: 0.5rem;
136
- text-shadow: 0 2px 4px var(--header-text-shadow);
137
- display: flex;
138
- justify-content: center;
139
- align-items: center;
140
- gap: 0.75rem;
141
- }
142
-
143
- .okr-title-content {
144
- background: linear-gradient(45deg, #ffffff, #e0e7ff);
145
- -webkit-background-clip: text;
146
- -webkit-text-fill-color: transparent;
147
- background-clip: text;
148
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
 
150
- html.dark .okr-title-content {
151
- background: linear-gradient(45deg, #e5e7eb, #9ca3af);
152
- -webkit-background-clip: text;
153
- -webkit-text-fill-color: transparent;
154
- background-clip: text;
155
- }
156
-
157
- .okr-title-emoji {
158
- font-size: 2.5rem;
159
- -webkit-text-fill-color: initial;
160
- }
161
-
162
- .okr-subtitle {
163
- font-size: 1.2rem;
164
- opacity: 0.9;
165
- font-weight: 300;
166
- letter-spacing: 0.5px;
167
- }
168
-
169
- /* Stats Bar */
170
- .okr-stats-bar {
171
- display: flex;
172
- justify-content: center;
173
- gap: 2rem;
174
- margin: 2rem 0;
175
- flex-wrap: wrap;
176
- }
177
-
178
- .stat-card {
179
- background: var(--stat-card-bg);
180
- backdrop-filter: blur(10px);
181
- border: 1px solid var(--stat-card-border);
182
- border-radius: 16px;
183
- padding: 1.5rem;
184
- text-align: center;
185
- color: var(--header-text-color);
186
- min-width: 140px;
187
- transition: all 0.3s ease;
188
- }
189
-
190
- .stat-card:hover {
191
- transform: translateY(-2px);
192
- background: var(--stat-card-bg-hover);
193
- box-shadow: 0 8px 32px var(--content-shadow);
194
- }
195
-
196
- .stat-number {
197
- font-size: 2rem;
198
- font-weight: 700;
199
- margin-bottom: 0.25rem;
200
- color: var(--stat-number-color);
201
- }
202
-
203
- .stat-label {
204
- font-size: 0.9rem;
205
- opacity: 0.9;
206
- text-transform: uppercase;
207
- letter-spacing: 1px;
208
- }
209
-
210
- /* Main Content Area */
211
- .okr-content {
212
- background: var(--content-bg);
213
- border-radius: 24px;
214
- padding: 0;
215
- box-shadow: 0 20px 40px var(--content-shadow);
216
- overflow: hidden;
217
- margin-top: 2rem;
218
- }
219
-
220
- /* Objective Card */
221
- .okr-objective {
222
- background: var(--objective-card-bg);
223
- border-left: 6px solid var(--objective-card-border);
224
- margin: 2rem;
225
- border-radius: 16px;
226
- overflow: hidden;
227
- box-shadow: var(--objective-shadow);
228
- transition: all 0.3s ease;
229
- }
230
-
231
- .okr-objective:hover {
232
- transform: translateY(-2px);
233
- box-shadow: var(--objective-shadow-hover);
234
- }
235
-
236
- /* --- Objective Header (REDESIGNED) --- */
237
- .objective-header {
238
- padding: 2rem;
239
- background: var(--objective-header-bg);
240
- border-bottom: 1px solid var(--key-result-border); /* Use variable for consistency */
241
- position: relative;
242
- }
243
-
244
- .objective-title {
245
- font-size: 1.5rem;
246
- font-weight: 700;
247
- margin-bottom: 0.75rem;
248
- position: relative;
249
- z-index: 1;
250
- color: var(--objective-title-color); /* Use variable */
251
- }
252
-
253
- .objective-meta {
254
- display: flex;
255
- gap: 2rem;
256
- margin-top: 1rem;
257
- flex-wrap: wrap;
258
- position: relative;
259
- z-index: 1;
260
- }
261
-
262
- .meta-item {
263
- display: flex;
264
- align-items: center;
265
- gap: 0.5rem;
266
- font-size: 0.9rem;
267
- color: var(--objective-meta-text-color);
268
- }
269
-
270
- .meta-icon {
271
- width: 16px;
272
- height: 16px;
273
- opacity: 0.8;
274
- }
275
-
276
- /* Key Results Container */
277
- .key-results-container {
278
- padding: 2rem;
279
- }
280
-
281
- /* Key Result Card */
282
- .key-result {
283
- background: var(--key-result-bg);
284
- border: 2px solid var(--key-result-border);
285
- border-radius: 12px;
286
- margin: 1.5rem 0;
287
- overflow: hidden;
288
- transition: all 0.3s ease;
289
- }
290
-
291
- .key-result:hover {
292
- border-color: var(--key-result-border-hover);
293
- box-shadow: 0 4px 12px rgba(59, 130, 246, 0.1);
294
- }
295
-
296
- html.dark .key-result:hover {
297
- box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);
298
- }
299
-
300
- .kr-header {
301
- background: var(--kr-header-bg);
302
- padding: 1.5rem;
303
- border-bottom: 1px solid var(--key-result-border);
304
- }
305
-
306
- .kr-title {
307
- font-size: 1.2rem;
308
- font-weight: 600;
309
- color: var(--kr-title-color);
310
- margin-bottom: 0.75rem;
311
- }
312
-
313
- .kr-metrics {
314
- display: flex;
315
- gap: 1.5rem;
316
- flex-wrap: wrap;
317
- margin-top: 1rem;
318
- }
319
-
320
- .kr-metric {
321
- background: var(--kr-metric-bg);
322
- color: var(--kr-metric-color);
323
- padding: 0.5rem 1rem;
324
- border-radius: 8px;
325
- font-size: 0.85rem;
326
- font-weight: 500;
327
- border: 1px solid var(--kr-metric-border);
328
- }
329
-
330
- /* Tasks Section */
331
- .tasks-section {
332
- padding: 1.5rem;
333
- }
334
-
335
- .tasks-title {
336
- font-size: 1rem;
337
- font-weight: 600;
338
- color: var(--task-detail-label-color);
339
- margin-bottom: 1rem;
340
- display: flex;
341
- align-items: center;
342
- gap: 0.5rem;
343
- }
344
-
345
- .task-item {
346
- background: var(--task-item-bg);
347
- border: 1px solid var(--task-item-border);
348
- border-radius: 8px;
349
- padding: 1.25rem;
350
- margin: 1rem 0;
351
- transition: all 0.2s ease;
352
- }
353
-
354
- .task-item:hover {
355
- background: var(--task-item-bg-hover);
356
- border-color: var(--task-item-border-hover);
357
- }
358
-
359
- .task-header {
360
- display: flex;
361
- justify-content: space-between;
362
- align-items: flex-start;
363
- margin-bottom: 1rem;
364
- gap: 1rem;
365
- }
366
-
367
- .task-title {
368
- font-weight: 600;
369
- color: var(--task-title-color);
370
- flex: 1;
371
- line-height: 1.4;
372
- }
373
-
374
- .task-priority {
375
- padding: 0.25rem 0.75rem;
376
- border-radius: 12px;
377
- font-size: 0.75rem;
378
- font-weight: 600;
379
- text-transform: uppercase;
380
- letter-spacing: 0.5px;
381
- white-space: nowrap;
382
- }
383
-
384
- /* Priority Colors */
385
- .priority-high {
386
- background: var(--priority-high-bg);
387
- color: var(--priority-high-color);
388
- border: 1px solid var(--priority-high-border);
389
- }
390
-
391
- .priority-medium {
392
- background: var(--priority-medium-bg);
393
- color: var(--priority-medium-color);
394
- border: 1px solid var(--priority-medium-border);
395
- }
396
-
397
- .priority-low {
398
- background: var(--priority-low-bg);
399
- color: var(--priority-low-color);
400
- border: 1px solid var(--priority-low-border);
401
- }
402
-
403
- /* Task Details Grid */
404
- .task-details {
405
- display: grid;
406
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
407
- gap: 1rem;
408
- margin-top: 1rem;
409
- }
410
-
411
- .task-detail-item {
412
- display: flex;
413
- align-items: center;
414
- gap: 0.5rem;
415
- font-size: 0.875rem;
416
- color: var(--task-detail-text-color);
417
- }
418
-
419
- .task-detail-label {
420
- font-weight: 500;
421
- color: var(--task-detail-label-color);
422
- min-width: 80px;
423
- }
424
-
425
- /* Task Description/Rationale */
426
- .task-description {
427
- margin-top: 1rem;
428
- padding: 1rem;
429
- background: var(--task-description-bg);
430
- border-radius: 6px;
431
- border-left: 3px solid var(--task-description-border);
432
- font-size: 0.9rem;
433
- line-height: 1.5;
434
- color: var(--task-description-color);
435
- }
436
-
437
- /* Empty State */
438
- .empty-state {
439
- text-align: center;
440
- padding: 4rem 2rem;
441
- color: var(--task-detail-text-color);
442
- }
443
-
444
- .empty-state-icon {
445
- font-size: 3rem;
446
- margin-bottom: 1rem;
447
- }
448
-
449
- .empty-state-title {
450
- font-size: 1.5rem;
451
- font-weight: 600;
452
- margin-bottom: 0.5rem;
453
- color: var(--objective-title-color);
454
- }
455
-
456
- /* Loading Spinner */
457
- .loading-spinner {
458
- display: inline-block;
459
- width: 20px;
460
- height: 20px;
461
- border: 3px solid var(--task-item-bg-hover);
462
- border-radius: 50%;
463
- border-top-color: var(--objective-card-border);
464
- animation: spin 1s ease-in-out infinite;
465
- }
466
-
467
- @keyframes spin {
468
- to { transform: rotate(360deg); }
469
- }
470
 
471
  /* Responsive Adjustments */
472
  @media (max-width: 768px) {
473
- .okr-container {
474
- padding: 1rem;
475
- }
476
- .okr-title {
477
- font-size: 2rem;
478
- }
479
- .okr-stats-bar {
480
- gap: 1rem;
481
- }
482
- .stat-card {
483
- min-width: 120px;
484
- padding: 1rem;
485
- }
486
- .objective-meta {
487
- flex-direction: column;
488
- gap: 1rem;
489
- }
490
- .task-details {
491
- grid-template-columns: 1fr;
492
- }
493
- .task-header {
494
- flex-direction: column;
495
- align-items: flex-start;
496
- }
497
  }
498
  </style>
499
  <script>
500
  function syncThemeWithParent() {
501
  // This script runs inside the Gradio iframe. It looks at the parent page's
502
  // <html> tag to see if the 'dark' class is present and applies it to the
503
- // iframe's own <html> tag, ensuring the CSS variables for dark mode are activated.
504
  try {
505
  const parentHtml = window.parent.document.querySelector('html');
506
  if (parentHtml) {
@@ -527,8 +199,13 @@ def create_enhanced_okr_tab():
527
  console.error("Could not set up theme MutationObserver:", e);
528
  }
529
 
530
- // Also run the sync function once when the iframe's content has loaded.
531
- document.addEventListener('DOMContentLoaded', syncThemeWithParent);
 
 
 
 
 
532
  </script>
533
  """
534
 
 
19
  okr_custom_css = """
20
  <style>
21
  /* ----------------------------------------- */
22
+ /* --- LIGHT MODE THEME & COLOR VARIABLES --- */
23
  /* ----------------------------------------- */
24
  :root {
25
  --okr-bg-start: #667eea;
 
36
  --objective-card-border: #3b82f6;
37
  --objective-shadow: 0 4px 16px rgba(0,0,0,0.05);
38
  --objective-shadow-hover: 0 8px 24px rgba(0,0,0,0.1);
39
+ --objective-header-bg: transparent;
40
+ --objective-title-color: #1e40af;
41
  --objective-meta-text-color: #475569;
42
  --key-result-bg: white;
43
  --key-result-border: #e5e7eb;
 
68
  --priority-low-border: #86efac;
69
  }
70
 
71
+ /* ----------------------------------------- */
72
+ /* --- BASE STYLES (Uses Variables) --- */
73
+ /* ----------------------------------------- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  .okr-container {
75
  font-family: 'Inter', sans-serif;
76
  background: linear-gradient(135deg, var(--okr-bg-start) 0%, var(--okr-bg-end) 100%);
 
81
  overflow-y: auto;
82
  }
83
 
84
+ .okr-header { text-align: center; margin-bottom: 3rem; color: var(--header-text-color); }
85
+ .okr-title { font-size: 2.5rem; font-weight: 700; margin-bottom: 0.5rem; text-shadow: 0 2px 4px var(--header-text-shadow); display: flex; justify-content: center; align-items: center; gap: 0.75rem; }
86
+ .okr-title-content { background: linear-gradient(45deg, #ffffff, #e0e7ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
87
+ .okr-title-emoji { font-size: 2.5rem; -webkit-text-fill-color: initial; }
88
+ .okr-subtitle { font-size: 1.2rem; opacity: 0.9; font-weight: 300; letter-spacing: 0.5px; }
89
+ .okr-stats-bar { display: flex; justify-content: center; gap: 2rem; margin: 2rem 0; flex-wrap: wrap; }
90
+ .stat-card { background: var(--stat-card-bg); backdrop-filter: blur(10px); border: 1px solid var(--stat-card-border); border-radius: 16px; padding: 1.5rem; text-align: center; color: var(--header-text-color); min-width: 140px; transition: all 0.3s ease; }
91
+ .stat-card:hover { transform: translateY(-2px); background: var(--stat-card-bg-hover); box-shadow: 0 8px 32px var(--content-shadow); }
92
+ .stat-number { font-size: 2rem; font-weight: 700; margin-bottom: 0.25rem; color: var(--stat-number-color); }
93
+ .stat-label { font-size: 0.9rem; opacity: 0.9; text-transform: uppercase; letter-spacing: 1px; }
94
+ .okr-content { background: var(--content-bg); border-radius: 24px; padding: 0; box-shadow: 0 20px 40px var(--content-shadow); overflow: hidden; margin-top: 2rem; }
95
+ .okr-objective { background: var(--objective-card-bg); border-left: 6px solid var(--objective-card-border); margin: 2rem; border-radius: 16px; overflow: hidden; box-shadow: var(--objective-shadow); transition: all 0.3s ease; }
96
+ .okr-objective:hover { transform: translateY(-2px); box-shadow: var(--objective-shadow-hover); }
97
+ .objective-header { padding: 2rem; background: var(--objective-header-bg); border-bottom: 1px solid var(--key-result-border); position: relative; }
98
+ .objective-title { font-size: 1.5rem; font-weight: 700; margin-bottom: 0.75rem; position: relative; z-index: 1; color: var(--objective-title-color); }
99
+ .objective-meta { display: flex; gap: 2rem; margin-top: 1rem; flex-wrap: wrap; position: relative; z-index: 1; }
100
+ .meta-item { display: flex; align-items: center; gap: 0.5rem; font-size: 0.9rem; color: var(--objective-meta-text-color); }
101
+ .meta-icon { width: 16px; height: 16px; opacity: 0.8; }
102
+ .key-results-container { padding: 2rem; }
103
+ .key-result { background: var(--key-result-bg); border: 2px solid var(--key-result-border); border-radius: 12px; margin: 1.5rem 0; overflow: hidden; transition: all 0.3s ease; }
104
+ .key-result:hover { border-color: var(--key-result-border-hover); box-shadow: 0 4px 12px rgba(59, 130, 246, 0.1); }
105
+ .kr-header { background: var(--kr-header-bg); padding: 1.5rem; border-bottom: 1px solid var(--key-result-border); }
106
+ .kr-title { font-size: 1.2rem; font-weight: 600; color: var(--kr-title-color); margin-bottom: 0.75rem; }
107
+ .kr-metrics { display: flex; gap: 1.5rem; flex-wrap: wrap; margin-top: 1rem; }
108
+ .kr-metric { background: var(--kr-metric-bg); color: var(--kr-metric-color); padding: 0.5rem 1rem; border-radius: 8px; font-size: 0.85rem; font-weight: 500; border: 1px solid var(--kr-metric-border); }
109
+ .tasks-section { padding: 1.5rem; }
110
+ .tasks-title { font-size: 1rem; font-weight: 600; color: var(--task-detail-label-color); margin-bottom: 1rem; display: flex; align-items: center; gap: 0.5rem; }
111
+ .task-item { background: var(--task-item-bg); border: 1px solid var(--task-item-border); border-radius: 8px; padding: 1.25rem; margin: 1rem 0; transition: all 0.2s ease; }
112
+ .task-item:hover { background: var(--task-item-bg-hover); border-color: var(--task-item-border-hover); }
113
+ .task-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 1rem; gap: 1rem; }
114
+ .task-title { font-weight: 600; color: var(--task-title-color); flex: 1; line-height: 1.4; }
115
+ .task-priority { padding: 0.25rem 0.75rem; border-radius: 12px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; white-space: nowrap; }
116
+ .priority-high { background: var(--priority-high-bg); color: var(--priority-high-color); border: 1px solid var(--priority-high-border); }
117
+ .priority-medium { background: var(--priority-medium-bg); color: var(--priority-medium-color); border: 1px solid var(--priority-medium-border); }
118
+ .priority-low { background: var(--priority-low-bg); color: var(--priority-low-color); border: 1px solid var(--priority-low-border); }
119
+ .task-details { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-top: 1rem; }
120
+ .task-detail-item { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; color: var(--task-detail-text-color); }
121
+ .task-detail-label { font-weight: 500; color: var(--task-detail-label-color); min-width: 80px; }
122
+ .task-description { margin-top: 1rem; padding: 1rem; background: var(--task-description-bg); border-radius: 6px; border-left: 3px solid var(--task-description-border); font-size: 0.9rem; line-height: 1.5; color: var(--task-description-color); }
123
+ .empty-state { text-align: center; padding: 4rem 2rem; color: var(--task-detail-text-color); }
124
+ .empty-state-icon { font-size: 3rem; margin-bottom: 1rem; }
125
+ .empty-state-title { font-size: 1.5rem; font-weight: 600; margin-bottom: 0.5rem; color: var(--objective-title-color); }
126
+ .loading-spinner { display: inline-block; width: 20px; height: 20px; border: 3px solid var(--task-item-bg-hover); border-radius: 50%; border-top-color: var(--objective-card-border); animation: spin 1s ease-in-out infinite; }
127
+ @keyframes spin { to { transform: rotate(360deg); } }
128
 
129
+ /* ----------------------------------------- */
130
+ /* --- DARK MODE OVERRIDES (DIRECT) --- */
131
+ /* ----------------------------------------- */
132
+ html.dark .okr-title-content { background: linear-gradient(45deg, #e5e7eb, #9ca3af); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
133
+ html.dark .okr-header { color: #e5e7eb; }
134
+ html.dark .stat-card { background: rgba(28, 28, 28, 0.7); border-color: rgba(50, 50, 50, 0.8); box-shadow: 0 8px 32px rgba(0,0,0,0.6); }
135
+ html.dark .okr-content { background: #0d1117; box-shadow: 0 20px 40px rgba(0,0,0,0.6); }
136
+ html.dark .okr-objective { background: #161b22; border-left-color: #3b82f6; box-shadow: 0 8px 24px rgba(0,0,0,0.5); }
137
+ html.dark .okr-objective:hover { box-shadow: 0 10px 28px rgba(0,0,0,0.6); }
138
+ html.dark .objective-header { border-bottom-color: #30363d; }
139
+ html.dark .objective-title { color: #58a6ff; }
140
+ html.dark .meta-item { color: #8b949e; }
141
+ html.dark .key-result { background: #161b22; border-color: #30363d; }
142
+ html.dark .key-result:hover { border-color: #58a6ff; box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2); }
143
+ html.dark .kr-header { background: #161b22; border-bottom-color: #30363d; }
144
+ html.dark .kr-title { color: #c9d1d9; }
145
+ html.dark .kr-metric { background: rgba(56, 139, 253, 0.15); color: #58a6ff; border-color: rgba(56, 139, 253, 0.4); }
146
+ html.dark .tasks-title { color: #8b949e; }
147
+ html.dark .task-item { background: #21262d; border-color: #30363d; }
148
+ html.dark .task-item:hover { background: #30363d; border-color: #8b949e; }
149
+ html.dark .task-title { color: #c9d1d9; }
150
+ html.dark .task-detail-label { color: #8b949e; }
151
+ html.dark .task-detail-item { color: #8b949e; }
152
+ html.dark .task-description { background: #0d1117; color: #8b949e; border-left-color: #30363d; }
153
+ html.dark .priority-high { background: rgba(248, 81, 73, 0.15); color: #ff7b72; border-color: rgba(248, 81, 73, 0.4); }
154
+ html.dark .priority-medium { background: rgba(210, 153, 34, 0.15); color: #d29922; border-color: rgba(210, 153, 34, 0.4); }
155
+ html.dark .priority-low { background: rgba(63, 185, 80, 0.15); color: #56d364; border-color: rgba(63, 185, 80, 0.4); }
156
+ html.dark .empty-state { color: #8b949e; }
157
+ html.dark .empty-state-title { color: #58a6ff; }
158
+ html.dark .loading-spinner { border-color: #30363d; border-top-color: #58a6ff; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
 
160
  /* Responsive Adjustments */
161
  @media (max-width: 768px) {
162
+ .okr-container { padding: 1rem; }
163
+ .okr-title { font-size: 2rem; }
164
+ .okr-stats-bar { gap: 1rem; }
165
+ .stat-card { min-width: 120px; padding: 1rem; }
166
+ .objective-meta { flex-direction: column; gap: 1rem; }
167
+ .task-details { grid-template-columns: 1fr; }
168
+ .task-header { flex-direction: column; align-items: flex-start; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
  }
170
  </style>
171
  <script>
172
  function syncThemeWithParent() {
173
  // This script runs inside the Gradio iframe. It looks at the parent page's
174
  // <html> tag to see if the 'dark' class is present and applies it to the
175
+ // iframe's own <html> tag, ensuring the CSS rules for dark mode are activated.
176
  try {
177
  const parentHtml = window.parent.document.querySelector('html');
178
  if (parentHtml) {
 
199
  console.error("Could not set up theme MutationObserver:", e);
200
  }
201
 
202
+ // Also run the sync function once when the iframe's content has loaded,
203
+ // and a few times after as a fallback for timing issues.
204
+ document.addEventListener('DOMContentLoaded', () => {
205
+ syncThemeWithParent();
206
+ setTimeout(syncThemeWithParent, 50);
207
+ setTimeout(syncThemeWithParent, 250);
208
+ });
209
  </script>
210
  """
211