{# Vendor-Assets via asset()-Helper. Default-Mode = CDN (jsDelivr) mit SRI; #} {# wenn `ntasker assets fetch` lief und `assets_mode=local|auto`, kommen sie #} {# stattdessen aus dem User-Data-Dir unter /static/vendor. SRI wird in beiden #} {# Modi mitgesendet (auch lokal als Tamper-Detection). `crossorigin` ist nur #} {# bei CDN-Loading nötig (Same-Origin braucht's nicht), schadet aber nicht. #}
{# 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. #}