/** * Modul: Aufgaben (Tasks) * Zweck: Styles für Listenansicht, Task-Cards, Subtasks, Filter-Panel, Modal * Abhängigkeiten: tokens.css, layout.css */ /* -------------------------------------------------------- * Seiten-Layout * -------------------------------------------------------- */ .tasks-page { padding: var(--space-4); padding-bottom: calc(var(--nav-height-mobile) + var(--safe-area-inset-bottom) + var(--space-16)); max-width: var(--content-max-width); margin: 0 auto; } @media (min-width: 1024px) { .tasks-page { padding: var(--space-8); padding-bottom: var(--space-16); } } /* -------------------------------------------------------- * Header + Toolbar * -------------------------------------------------------- */ .tasks-toolbar { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-4); flex-wrap: wrap; } .tasks-toolbar__title { font-size: var(--text-2xl); font-weight: var(--font-weight-bold); flex: 1; min-width: 0; } .tasks-toolbar__actions { display: flex; align-items: center; gap: var(--space-2); } /* Gruppierungs-Toggle */ .group-toggle { display: flex; background-color: var(--color-surface-2); border-radius: var(--radius-sm); padding: 3px; gap: 2px; } .group-toggle__btn { padding: var(--space-1) var(--space-3); border-radius: calc(var(--radius-sm) - 2px); font-size: var(--text-sm); font-weight: var(--font-weight-medium); color: var(--color-text-secondary); transition: background-color var(--transition-fast), color var(--transition-fast); min-height: unset; cursor: pointer; } .group-toggle__btn--active { background-color: var(--color-surface); color: var(--color-text-primary); box-shadow: var(--shadow-sm); } /* -------------------------------------------------------- * Filter-Leiste * -------------------------------------------------------- */ .tasks-filters { display: flex; gap: var(--space-2); margin-bottom: var(--space-4); overflow-x: auto; padding-bottom: var(--space-1); -webkit-overflow-scrolling: touch; scrollbar-width: none; } .tasks-filters::-webkit-scrollbar { display: none; } .filter-chip { display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-1) var(--space-3); border-radius: var(--radius-full); font-size: var(--text-sm); font-weight: var(--font-weight-medium); white-space: nowrap; cursor: pointer; border: 1.5px solid var(--color-border); background-color: var(--color-surface); color: var(--color-text-secondary); transition: all var(--transition-fast); min-height: 34px; } .filter-chip--active { background-color: var(--color-accent-light); border-color: var(--color-accent); color: var(--color-accent); } .filter-chip__remove { width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; border-radius: var(--radius-full); background-color: var(--color-accent); color: #fff; font-size: 10px; line-height: 1; } /* -------------------------------------------------------- * Gruppen-Überschriften * -------------------------------------------------------- */ .task-group { margin-bottom: var(--space-6); } .task-group__header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-2); padding: 0 var(--space-1); } .task-group__title { font-size: var(--text-sm); font-weight: var(--font-weight-semibold); color: var(--color-text-secondary); text-transform: uppercase; letter-spacing: 0.05em; } .task-group__count { font-size: var(--text-xs); color: var(--color-text-disabled); background-color: var(--color-surface-2); padding: 2px var(--space-2); border-radius: var(--radius-full); } /* -------------------------------------------------------- * Task-Card * -------------------------------------------------------- */ .task-card { background-color: var(--color-surface); border-radius: var(--radius-md); box-shadow: var(--shadow-sm); margin-bottom: var(--space-2); overflow: hidden; transition: box-shadow var(--transition-fast); } .task-card:hover { box-shadow: var(--shadow-md); } .task-card--done { opacity: 0.6; } .task-card__main { display: flex; align-items: flex-start; gap: var(--space-3); padding: var(--space-4); } /* Status-Checkbox */ .task-status-btn { width: 22px; height: 22px; border-radius: var(--radius-full); border: 2px solid var(--color-border); background: none; cursor: pointer; flex-shrink: 0; margin-top: 1px; display: flex; align-items: center; justify-content: center; transition: border-color var(--transition-fast), background-color var(--transition-fast); min-height: unset; } .task-status-btn--done { border-color: var(--color-success); background-color: var(--color-success); } .task-status-btn--in_progress { border-color: var(--color-warning); } .task-status-btn__check { width: 12px; height: 12px; color: #fff; display: none; } .task-status-btn--done .task-status-btn__check { display: block; } .task-card__body { flex: 1; min-width: 0; } .task-card__title { font-size: var(--text-base); font-weight: var(--font-weight-medium); color: var(--color-text-primary); margin-bottom: var(--space-1); cursor: pointer; } .task-card--done .task-card__title { text-decoration: line-through; color: var(--color-text-secondary); } .task-card__meta { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; } /* Prioritäts-Badge */ .priority-badge { display: inline-flex; align-items: center; gap: 4px; font-size: var(--text-xs); font-weight: var(--font-weight-semibold); padding: 2px var(--space-2); border-radius: var(--radius-xs); } .priority-badge--low { color: var(--color-priority-low); background-color: #8E8E9322; } .priority-badge--medium { color: var(--color-priority-medium); background-color: #FF950022; } .priority-badge--high { color: var(--color-priority-high); background-color: #FF6B3522; } .priority-badge--urgent { color: var(--color-priority-urgent); background-color: #FF3B3022; } .priority-dot { width: 6px; height: 6px; border-radius: var(--radius-full); flex-shrink: 0; } .priority-dot--low { background-color: var(--color-priority-low); } .priority-dot--medium { background-color: var(--color-priority-medium); } .priority-dot--high { background-color: var(--color-priority-high); } .priority-dot--urgent { background-color: var(--color-priority-urgent); } /* Fälligkeitsdatum */ .due-date { font-size: var(--text-xs); color: var(--color-text-secondary); display: flex; align-items: center; gap: 3px; } .due-date--overdue { color: var(--color-danger); font-weight: var(--font-weight-semibold); } .due-date--today { color: var(--color-warning); font-weight: var(--font-weight-semibold); } /* Avatar */ .task-avatar { width: 28px; height: 28px; border-radius: var(--radius-full); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: var(--font-weight-bold); color: #fff; flex-shrink: 0; } /* Subtask-Fortschrittsbalken */ .subtask-progress { padding: 0 var(--space-4) var(--space-3); display: flex; align-items: center; gap: var(--space-2); cursor: pointer; } .subtask-progress__bar-wrap { flex: 1; height: 4px; background-color: var(--color-border); border-radius: var(--radius-full); overflow: hidden; } .subtask-progress__bar-fill { height: 100%; background-color: var(--color-success); border-radius: var(--radius-full); transition: width var(--transition-slow); } .subtask-progress__text { font-size: var(--text-xs); color: var(--color-text-secondary); white-space: nowrap; } /* Subtask-Liste (eingeklappt/ausgeklappt) */ .subtask-list { border-top: 1px solid var(--color-border); padding: var(--space-2) var(--space-4); display: none; } .subtask-list--visible { display: block; } .subtask-item { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) 0; border-bottom: 1px solid var(--color-border); } .subtask-item:last-child { border-bottom: none; } .subtask-item__checkbox { width: 18px; height: 18px; border-radius: var(--radius-xs); border: 1.5px solid var(--color-border); background: none; cursor: pointer; flex-shrink: 0; display: flex; align-items: center; justify-content: center; transition: all var(--transition-fast); min-height: unset; } .subtask-item__checkbox--done { background-color: var(--color-success); border-color: var(--color-success); } .subtask-item__title { font-size: var(--text-sm); color: var(--color-text-primary); flex: 1; } .subtask-item--done .subtask-item__title { text-decoration: line-through; color: var(--color-text-secondary); } .subtask-item__add { width: 100%; padding: var(--space-2); font-size: var(--text-sm); color: var(--color-text-secondary); background: none; border: 1.5px dashed var(--color-border); border-radius: var(--radius-sm); cursor: pointer; text-align: left; margin-top: var(--space-2); min-height: unset; transition: border-color var(--transition-fast), color var(--transition-fast); } .subtask-item__add:hover { border-color: var(--color-accent); color: var(--color-accent); } /* -------------------------------------------------------- * Task-Modal (Erstellen / Bearbeiten) * -------------------------------------------------------- */ .modal-backdrop { position: fixed; inset: 0; background-color: rgba(0, 0, 0, 0.4); z-index: var(--z-modal); display: flex; align-items: flex-end; justify-content: center; animation: backdrop-in 0.2s ease; } @media (min-width: 640px) { .modal-backdrop { align-items: center; } } @keyframes backdrop-in { from { opacity: 0; } to { opacity: 1; } } .modal { background-color: var(--color-surface); border-radius: var(--radius-lg) var(--radius-lg) 0 0; width: 100%; max-height: 92dvh; overflow-y: auto; padding: var(--space-6); padding-bottom: calc(var(--space-6) + var(--safe-area-inset-bottom)); animation: modal-in 0.25s ease; } @media (min-width: 640px) { .modal { border-radius: var(--radius-lg); max-width: 540px; max-height: 85dvh; padding-bottom: var(--space-6); } } @keyframes modal-in { from { transform: translateY(24px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .modal__header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-5); } .modal__title { font-size: var(--text-xl); font-weight: var(--font-weight-bold); } .modal__close { width: 32px; height: 32px; border-radius: var(--radius-full); background-color: var(--color-surface-2); display: flex; align-items: center; justify-content: center; cursor: pointer; min-height: unset; color: var(--color-text-secondary); } .modal__actions { display: flex; gap: var(--space-3); margin-top: var(--space-6); } .modal__actions .btn { flex: 1; } /* -------------------------------------------------------- * Overdue-Badge (Navigation) * -------------------------------------------------------- */ .nav-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; border-radius: var(--radius-full); background-color: var(--color-danger); color: #fff; font-size: 10px; font-weight: var(--font-weight-bold); margin-left: auto; } /* -------------------------------------------------------- * Leer-Zustand * -------------------------------------------------------- */ .tasks-empty { padding: var(--space-12) var(--space-4); text-align: center; } .tasks-empty__icon { width: 56px; height: 56px; color: var(--color-text-disabled); margin: 0 auto var(--space-4); } .tasks-empty__title { font-size: var(--text-lg); font-weight: var(--font-weight-semibold); margin-bottom: var(--space-2); } .tasks-empty__desc { font-size: var(--text-sm); color: var(--color-text-secondary); margin-bottom: var(--space-6); }