main
css 704 lines 14.2 KB
Raw
1 /* Scheduler Styles */
2
3 /* ==========================================================================
4 Status Badges
5 ========================================================================== */
6
7 .scheduler-status-badge {
8 display: inline-block;
9 padding: 4px 8px;
10 border-radius: 4px;
11 font-size: 12px;
12 font-weight: 500;
13 text-transform: capitalize;
14 white-space: nowrap;
15 cursor: pointer;
16 }
17
18 .scheduler-status-idle {
19 background-color: rgba(0, 100, 0, 0.2);
20 color: #2a9d8f;
21 border: 1px solid rgba(42, 157, 143, 0.3);
22 }
23
24 .scheduler-status-running {
25 background-color: rgba(0, 60, 120, 0.2);
26 color: #4361ee;
27 border: 1px solid rgba(67, 97, 238, 0.3);
28 }
29
30 .scheduler-status-disabled {
31 background-color: rgba(70, 70, 70, 0.2);
32 color: #6c757d;
33 border: 1px solid rgba(108, 117, 125, 0.3);
34 }
35
36 .scheduler-status-error {
37 background-color: rgba(120, 0, 0, 0.2);
38 color: #e63946;
39 border: 1px solid rgba(230, 57, 70, 0.3);
40 }
41
42 .scheduler-status-badge-small {
43 font-size: 10px;
44 padding: 2px 6px;
45 margin-right: 5px;
46 min-width: 40px;
47 text-align: center;
48 }
49
50 /* Status badge selected state */
51 .scheduler-status-selected {
52 opacity: 1 !important;
53 box-shadow: 0 0 0 2px var(--color-bg), 0 0 0 4px var(--color-border);
54 border: 1px solid var(--color-border) !important;
55 outline: none;
56 }
57
58 /* Light mode status badges */
59 .light-mode .scheduler-status-idle {
60 background-color: rgba(42, 157, 143, 0.1);
61 color: #1a6f65;
62 }
63
64 .light-mode .scheduler-status-running {
65 background-color: rgba(67, 97, 238, 0.1);
66 color: #2540b3;
67 }
68
69 .light-mode .scheduler-status-disabled {
70 background-color: rgba(108, 117, 125, 0.1);
71 color: #495057;
72 }
73
74 .light-mode .scheduler-status-error {
75 background-color: rgba(230, 57, 70, 0.1);
76 color: #c5283d;
77 }
78
79 .light-mode .scheduler-status-selected {
80 box-shadow: 0 0 0 2px var(--color-bg-light), 0 0 0 4px var(--color-accent);
81 }
82
83 /* ==========================================================================
84 Container & Layout
85 ========================================================================== */
86
87 .scheduler-container {
88 width: 100%;
89 box-sizing: border-box;
90 display: block;
91 padding: 0.5rem 0;
92 }
93
94 .scheduler-loading {
95 text-align: center;
96 padding: 40px 0;
97 color: var(--color-text-secondary);
98 }
99
100 .task-container-vertical {
101 display: flex;
102 flex-direction: column;
103 width: 100%;
104 gap: 6px;
105 }
106
107 /* ==========================================================================
108 Task List Table
109 ========================================================================== */
110
111 .scheduler-task-list {
112 width: 100%;
113 min-width: 100%;
114 margin: 0;
115 border-collapse: separate;
116 border-spacing: 0;
117 white-space: nowrap;
118 padding-bottom: 8px;
119 table-layout: fixed;
120 }
121
122 .scheduler-task-list th,
123 .scheduler-task-list td {
124 padding: 8px 12px;
125 text-align: left;
126 vertical-align: middle;
127 border-bottom: 1px solid var(--color-border);
128 }
129
130 /* Column styles */
131 .scheduler-task-list .col-name {
132 width: 30%;
133 overflow: hidden;
134 text-overflow: ellipsis;
135 }
136
137 .scheduler-task-list .col-state {
138 width: 12%;
139 }
140
141 .scheduler-task-list .col-project {
142 width: 20%;
143 }
144
145 .scheduler-task-list .col-lastrun {
146 width: 20%;
147 }
148
149 .scheduler-task-list .col-actions {
150 width: 18%;
151 text-align: right;
152 }
153
154 /* Task actions container */
155 .scheduler-task-actions {
156 display: flex;
157 justify-content: flex-end;
158 gap: 10px;
159 flex-wrap: nowrap;
160 }
161
162 /* Task action buttons */
163 .scheduler-task-action {
164 display: inline-flex;
165 align-items: center;
166 justify-content: center;
167 background-color: transparent;
168 border: 1px solid var(--color-border);
169 color: var(--color-text);
170 padding: 4px;
171 border-radius: 4px;
172 cursor: pointer;
173 transition: all 0.2s ease;
174 width: 28px;
175 height: 28px;
176 flex-shrink: 0;
177 }
178
179 .scheduler-task-action:hover {
180 background-color: var(--color-secondary);
181 }
182
183 /* ==========================================================================
184 Form Styles
185 ========================================================================== */
186
187 .scheduler-form {
188 display: flex;
189 flex-direction: column;
190 gap: 1.5rem;
191 padding: 1rem 0;
192 }
193
194 .scheduler-form-header {
195 display: flex;
196 padding-bottom: var(--spacing-sm);
197 border-bottom: 1px solid var(--color-border);
198 justify-content: space-between;
199 }
200
201 .scheduler-form-title {
202 font-size: 1.25rem;
203 font-weight: bold;
204 color: var(--color-primary);
205 margin: 0;
206 }
207
208 .scheduler-form-actions {
209 display: flex;
210 gap: 0.8rem;
211 justify-content: flex-end;
212 align-items: center;
213 }
214
215 .scheduler-form-grid {
216 display: grid;
217 grid-template-columns: 1fr;
218 gap: 1.5rem;
219 overflow-x: auto;
220 }
221
222 .scheduler-form-field {
223 display: grid;
224 grid-template-columns: 1fr 2fr;
225 gap: 1rem;
226 align-items: flex-start;
227 }
228
229 .full-width {
230 grid-column: 1 / -1;
231 }
232
233 .scheduler-form-label {
234 font-weight: bold;
235 color: var(--color-primary);
236 margin-bottom: 0.25rem;
237 }
238
239 .scheduler-form-help {
240 color: var(--color-text);
241 font-size: 0.875rem;
242 opacity: 0.8;
243 margin: 0.25rem 0 0.5rem 0;
244 }
245
246 /* Label and help text wrapper for tighter grouping */
247 .label-help-wrapper {
248 display: flex;
249 flex-direction: column;
250 gap: 2px;
251 margin-bottom: 0.5rem;
252 }
253
254 .label-help-wrapper .scheduler-form-label {
255 margin-bottom: 2px;
256 }
257
258 .label-help-wrapper .scheduler-form-help {
259 margin-top: 0;
260 margin-bottom: 0;
261 }
262
263 /* ==========================================================================
264 Detail View
265 ========================================================================== */
266
267 .scheduler-detail-view {
268 background-color: var(--color-bg-secondary);
269 border-radius: 4px;
270 margin-bottom: var(--spacing-md);
271 animation: fadeIn 0.3s ease;
272 }
273
274 .scheduler-detail-header {
275 display: flex;
276 justify-content: space-between;
277 align-items: center;
278 flex-wrap: wrap;
279 gap: 10px;
280 margin: var(--spacing-md) 0;
281 width: 100%;
282 }
283
284 .scheduler-detail-header-left {
285 display: flex;
286 align-items: center;
287 gap: 10px;
288 flex-wrap: wrap;
289 }
290
291 .scheduler-detail-header-left .scheduler-detail-title {
292 margin: 0;
293 }
294
295 .scheduler-detail-header .scheduler-detail-title {
296 font-size: 1.4rem;
297 font-weight: 500;
298 margin: 0;
299 margin-right: auto;
300 }
301
302 .scheduler-detail-header .scheduler-status-badge {
303 margin-right: 10px;
304 }
305
306 .scheduler-detail-header-actions {
307 display: flex;
308 align-items: center;
309 gap: 0.5rem;
310 }
311
312 .scheduler-detail-header .btn-action-header {
313 padding: 0.4rem 0.6rem;
314 display: flex;
315 align-items: center;
316 justify-content: space-between;
317 background: var(--color-bg-secondary);
318 border: 1px solid var(--color-border);
319 color: var(--color-text);
320 cursor: pointer;
321 }
322
323 .scheduler-detail-header .btn-action-header .btn-cancel {
324 margin-left: var(--spacing-sm);
325 }
326
327 .scheduler-detail-header .btn-action-header:hover {
328 border-color: var(--color-primary);
329 color: var(--color-primary);
330 }
331
332 .scheduler-detail-header .btn-action-header.danger:hover {
333 border-color: var(--color-accent);
334 color: var(--color-accent);
335 }
336
337 .scheduler-detail-header .btn-action-header .material-symbols-outlined {
338 font-size: 18px;
339 }
340
341 .scheduler-detail-content {
342 margin-bottom: 20px;
343 }
344
345 .scheduler-details-grid {
346 display: grid;
347 grid-template-columns: 120px 1fr;
348 gap: 8px 16px;
349 margin-top: var(--spacing-md);
350 }
351
352 .scheduler-details-label {
353 font-weight: 500;
354 color: var(--color-text-secondary);
355 display: flex;
356 align-items: center;
357 }
358
359 .scheduler-details-value {
360 color: var(--color-text);
361 word-break: break-word;
362 }
363
364 .scheduler-details-actions {
365 display: flex;
366 justify-content: flex-end;
367 gap: 8px;
368 }
369
370 /* ==========================================================================
371 State Selector
372 ========================================================================== */
373
374 .scheduler-state-selector {
375 display: flex;
376 gap: 10px;
377 flex-wrap: wrap;
378 }
379
380 .scheduler-state-selector .scheduler-status-badge {
381 cursor: pointer;
382 transition: all 0.2s ease;
383 opacity: 0.5;
384 border: 1px solid transparent;
385 }
386
387 .scheduler-state-selector .scheduler-status-badge:hover {
388 opacity: 0.9;
389 }
390
391 /* Make status badges in selector more prominent */
392 .scheduler-state-selector .scheduler-status-idle,
393 .scheduler-state-selector .scheduler-status-running,
394 .scheduler-state-selector .scheduler-status-disabled,
395 .scheduler-state-selector .scheduler-status-error {
396 font-weight: 600;
397 padding: 6px 12px;
398 }
399
400 /* State explanation styling */
401 .scheduler-state-explanation {
402 margin-top: 10px;
403 font-size: 0.85rem;
404 color: var(--color-text-secondary);
405 line-height: 1.4;
406 min-height: 1.4em;
407 transition: all 0.2s ease;
408 }
409
410 .scheduler-state-explanation span {
411 display: block;
412 padding: 4px 8px;
413 background-color: rgba(0, 0, 0, 0.05);
414 border-radius: 4px;
415 margin-top: 8px;
416 }
417
418 .light-mode .scheduler-state-explanation span {
419 background-color: rgba(255, 255, 255, 0.3);
420 }
421
422 /* ==========================================================================
423 Schedule Builder (for scheduled tasks)
424 ========================================================================== */
425
426 .scheduler-schedule-builder {
427 display: grid;
428 grid-template-columns: repeat(5, 1fr);
429 gap: 10px;
430 width: 100%;
431 margin-bottom: 10px;
432 }
433
434 .scheduler-schedule-field {
435 display: flex;
436 flex-direction: column;
437 gap: 4px;
438 max-width: 70px;
439 }
440
441 .scheduler-schedule-field input {
442 width: 100%;
443 min-width: 0;
444 font-size: 0.9rem;
445 }
446
447 .scheduler-schedule-label {
448 font-size: 0.8rem;
449 margin-bottom: 5px;
450 color: var(--color-text);
451 opacity: 0.8;
452 }
453
454 .scheduler-no-schedule {
455 color: var(--color-text-secondary);
456 opacity: 0.7;
457 font-style: italic;
458 }
459
460 /* ==========================================================================
461 Plan Builder (for planned tasks)
462 ========================================================================== */
463
464 .scheduler-plan-builder {
465 width: 100%;
466 margin-bottom: 10px;
467 border: 1px solid var(--color-border);
468 border-radius: 8px;
469 padding: 10px;
470 background-color: rgba(0, 0, 0, 0.2);
471 }
472
473 .scheduler-plan-todo {
474 display: flex;
475 flex-direction: column;
476 }
477
478 .scheduler-plan-label {
479 font-size: 0.9rem;
480 margin-bottom: 10px;
481 color: var(--color-text);
482 font-weight: bold;
483 }
484
485 .scheduler-todo-list {
486 display: flex;
487 flex-direction: column;
488 gap: 10px;
489 margin-top: 8px;
490 max-height: 200px;
491 overflow-y: auto;
492 }
493
494 .scheduler-todo-item {
495 display: flex;
496 align-items: center;
497 justify-content: space-between;
498 background-color: var(--color-background);
499 border-radius: 6px;
500 padding: 8px 12px;
501 border: 1px solid var(--color-border);
502 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
503 }
504
505 .scheduler-todo-item span {
506 flex: 1;
507 font-size: 14px;
508 }
509
510 .scheduler-add-todo {
511 margin-top: 12px;
512 display: flex;
513 gap: 8px;
514 align-items: center;
515 }
516
517 .scheduler-add-todo input {
518 flex: 1;
519 }
520
521 .scheduler-add-todo input[type="datetime-local"] {
522 flex: 1;
523 min-width: 0;
524 padding: 8px 12px;
525 border-radius: 6px;
526 border: 1px solid var(--color-border);
527 background-color: var(--color-background);
528 color: var(--color-text);
529 }
530
531 .scheduler-add-todo-button {
532 display: flex;
533 align-items: center;
534 justify-content: center;
535 background-color: var(--color-accent);
536 color: white;
537 border: none;
538 border-radius: 6px;
539 padding: 8px 12px;
540 cursor: pointer;
541 transition: background-color 0.2s ease;
542 font-weight: 500;
543 }
544
545 .scheduler-add-todo-button:hover {
546 background-color: var(--color-accent-dark);
547 }
548
549 .scheduler-todo-remove {
550 display: flex;
551 align-items: center;
552 justify-content: center;
553 background-color: transparent;
554 color: var(--color-text);
555 border: none;
556 border-radius: 4px;
557 width: 24px;
558 height: 24px;
559 cursor: pointer;
560 transition: background-color 0.2s ease;
561 margin-left: 8px;
562 }
563
564 .scheduler-todo-remove:hover {
565 background-color: var(--color-accent-light);
566 color: var(--color-accent-dark);
567 }
568
569 .scheduler-empty-plan {
570 padding: 12px;
571 color: var(--color-text-muted);
572 font-style: italic;
573 text-align: center;
574 border: 1px dashed var(--color-border);
575 border-radius: 6px;
576 margin-top: 8px;
577 }
578
579 .light-mode .scheduler-todo-item {
580 background-color: var(--color-background-light);
581 border-color: var(--color-border-light);
582 }
583
584 .light-mode .scheduler-todo-remove:hover {
585 background-color: #e0e0e0;
586 color: #d32f2f;
587 }
588
589 /* ==========================================================================
590 Input Group (for token field with generate button)
591 ========================================================================== */
592
593 .input-group {
594 display: flex;
595 gap: 8px;
596 width: 100%;
597 }
598
599 .input-group input[type="text"] {
600 flex: 1;
601 min-width: 0;
602 }
603
604 /* Specific styling for the Generate button in token field */
605 .input-group .scheduler-task-action {
606 white-space: nowrap;
607 padding: 4px 10px;
608 width: auto;
609 height: auto;
610 background-color: var(--color-secondary);
611 font-size: 0.9rem;
612 }
613
614 .input-group .scheduler-task-action:hover {
615 background-color: var(--color-accent);
616 color: var(--color-bg);
617 }
618
619 /* Ensure parent container allows proper flow */
620 .scheduler-form-field .input-group {
621 max-width: 100%;
622 overflow: hidden;
623 }
624
625 /* ==========================================================================
626 Responsive Design
627 ========================================================================== */
628
629 @media (max-width: 768px) {
630 /* Task list column visibility */
631 .scheduler-task-list .col-project,
632 .scheduler-task-list .col-lastrun {
633 display: none;
634 }
635
636 .scheduler-task-list .col-name {
637 width: 50%;
638 }
639
640 .scheduler-task-list .col-state {
641 width: 25%;
642 }
643
644 .scheduler-task-list .col-actions {
645 width: 25%;
646 }
647
648 /* Form responsiveness */
649 .scheduler-form-header {
650 flex-direction: column;
651 align-items: flex-start;
652 gap: 1rem;
653 }
654
655 .scheduler-form-actions {
656 align-self: flex-end;
657 }
658
659 .scheduler-form-field {
660 grid-template-columns: 1fr;
661 gap: 0.5rem;
662 }
663
664 .scheduler-form-grid {
665 grid-template-columns: 1fr;
666 }
667
668 /* Detail header responsiveness */
669 .scheduler-detail-header {
670 gap: 0.75rem;
671 }
672
673 .scheduler-detail-actions {
674 width: 100%;
675 flex-wrap: wrap;
676 gap: 0.5rem;
677 }
678
679 /* Schedule builder responsiveness */
680 .scheduler-schedule-builder {
681 grid-template-columns: 1fr 1fr;
682 }
683
684 /* Input group responsiveness */
685 .input-group .scheduler-task-action {
686 padding: 4px 8px;
687 font-size: 0.8rem;
688 }
689
690 /* Plan builder responsiveness */
691 .scheduler-add-todo {
692 flex-direction: column;
693 }
694 }
695
696 @media (max-width: 480px) {
697 .input-group {
698 flex-direction: column;
699 }
700
701 .input-group .scheduler-task-action {
702 align-self: flex-start;
703 }
704 }