{# Tabler CSS + Icons (vendored, offline-faehig — siehe static/vendor/LICENSES.md) #} {# `?v=` query string is a cache-buster: a version bump in app.py forces #} {# clients to refetch instead of replaying stale CSS/JS from disk cache. #}
{# Sidebar: project + tag filter (full-width checkboxes). Hidden on mobile (<768px). #} {# Sticky-positioned aside outside the .page wrapper. Tabler/Bootstrap surface #} {# variables drive the bg so dark-mode behaves correctly. Sidebar lives in its #} {# own scroll context; main page-wrapper scrolls independently. #} {# Main content (full-width inside its column) #}
{# Tabler page-header: title left, actions (tag cleanup) right #}
{# Banner: projects_dir nicht konfiguriert. Auto-versteckt sobald gesetzt. #} {# CAVE: x-show MUSS auf einem Wrapper-Element ohne Bootstrap-Display-Utility #} {# (`d-flex`, `d-block`, ...) sitzen. AlpineJS setzt `style="display: none"` #} {# ohne `!important`; Tabler/Bootstrap setzt `.d-flex { display: flex !important }`. #} {# Direkt auf demselben Element gewinnt das Utility und der Banner bleibt sichtbar, #} {# obwohl projectsDirMissing === false. Loesung: Wrapper traegt x-show + x-cloak, #} {# Inner-Div traegt das d-flex. #}
Bitte Projekte-Verzeichnis konfigurieren — sonst bleibt die Projekt-Liste leer.
zu den Einstellungen
{# New-task form #}

Neue Aufgabe

{# Tag-Input: AlpineJS-driven combobox. Tags as badges, free-text input, autocomplete dropdown. #}
{# Filter bar: search only — project, tag, phase filters live in the sidebar. #}
{# Tabs #} {# Task list #}

Keine Aufgaben

{# Edit modal #}
{# Toast container (Tabler/Bootstrap-compatible). Toasts injected by app.js. #}