flowchart TD
    A["HyprTile Launcher"] -->|"F12"| B["overlay_calculator"]

    B --> State["CalculatorState"]
    State --> Visible["visible"]
    State --> Expr["expr bis 256 Zeichen"]
    State --> Result["result"]
    State --> Error["error"]
    State --> HasResult["has_result"]

    B --> UI["Rechner Overlay UI"]
    UI --> Shade["Abgedunkelter Hintergrund"]
    UI --> Panel["Zentriertes Panel"]
    UI --> Display["Displaybereich"]
    UI --> Keypad["24-Tasten-Keypad"]

    Display --> ExprView["Aktueller Ausdruck"]
    Display --> ResultView["Ergebniszeile"]
    Display --> ErrorView["Fehleranzeige"]

    Keypad --> Digits["Zahlen 0-9"]
    Keypad --> Operators["+  -  *  /"]
    Keypad --> Brackets["(  )"]
    Keypad --> Percent["%"]
    Keypad --> Decimal[". und ,"]
    Keypad --> Clear["C"]
    Keypad --> Backspace["←"]
    Keypad --> Equal["="]
    Keypad --> Accept["A"]
    Keypad --> Escape["Esc"]

    B --> Input["Eingabequellen"]
    Input --> Keyboard["Tastatur"]
    Input --> Mouse["Maus / Klick"]
    Input --> Clipboard["Clipboard Paste"]

    Keyboard --> Append["calculator_append_text"]
    Clipboard --> Paste["calculator_paste_clipboard"]
    Mouse --> MouseHandler["handle_calculator_mouse_button"]

    MouseHandler -->|"Zahl / Operator"| Append
    MouseHandler -->|"C"| ClearFunc["calculator_clear"]
    MouseHandler -->|"←"| BackFunc["calculator_backspace"]
    MouseHandler -->|"="| Eval["calculator_evaluate"]
    MouseHandler -->|"A"| AcceptFunc["calculator_accept_result_as_expr"]
    MouseHandler -->|"Esc / Klick außerhalb"| Close["Overlay schließen"]

    Append --> Sanitize["Zeichen filtern"]
    Sanitize --> Allowed["0-9 + - * / ( ) % . , Leerzeichen"]
    Sanitize --> XToMul["x/X wird zu *"]
    Allowed --> Expr

    Eval --> Parser["interner Parser"]
    Parser --> ParseExpr["Expression: + und -"]
    ParseExpr --> ParseTerm["Term: * und /"]
    ParseTerm --> ParseFactor["Factor: Vorzeichen, Klammern, Zahl, Prozent"]
    ParseFactor --> ParseNumber["Zahl mit . oder ,"]

    Parser --> PercentLogic["Prozentlogik"]
    PercentLogic --> PercentAdd["100 + 10% = 110"]
    PercentLogic --> PercentSub["100 - 10% = 90"]

    Parser --> Validation["Validierung"]
    Validation --> DivZero["Division durch 0"]
    Validation --> Invalid["Ungültiger Ausdruck"]
    Validation --> Empty["Bitte Rechnung eingeben"]
    Validation --> Success["Ergebnis mit %.12g"]

    Success --> Result
    Success --> HasResult
    DivZero --> Error
    Invalid --> Error
    Empty --> Error

    AcceptFunc -->|"wenn has_result"| Expr
    AcceptFunc --> ClearResult["Result/Error zurücksetzen"]

    B --> Render["render_calculator_overlay"]
    Render --> Layout["820x460, responsiv begrenzt"]
    Render --> DrawDisplay["Ausdruck und Ergebnis rendern"]
    Render --> DrawKeys["Keypad rendern + Hover"]