54aa1c9e84
User: Sonderzeichen in einen Button packen mit Popover-Box, neue
Optionen (Frame around text, Horizontal to view, Rotation, Mask
margins), und Phase 2 = mixed-fonts via Rich-Text.
Frontend (TextEditorApp.jsx):
- Sonderzeichen-Reihe weg, ersetzt durch [Symbole] Pill-Button mit
Popover-Box. Symbols gruppiert (Mathematik, Pfeile, Auszeichnung)
- Toolbar Reihe 3 neu: [Rahmen ▼] [Mask ____ m] [Rot ____ °]
[Zur Kamera Toggle] [Symbole Popover]
- htmlToRuns(rootEl): walks contentEditable DOM, extrahiert Format-
Runs (text, font, color, bold, italic, underline, sup, sub) basierend
auf Tag-Hierarchie (b/i/u/sup/sub/font/span style)
- onCommit sendet jetzt zusaetzlich runs[] + frame/horizontalToView/
rotation/maskMargin in settings
Backend (text_editor.py):
- _commit: setzt Plane mit Rotation um Z (math.radians + Plane.Rotate)
- MaskFrame: NoFrame/RectFrame/CapsuleFrame ueber TextMaskFrame-Enum
- MaskEnabled+MaskOffset+MaskUsesViewportColor wenn maskMargin>0
- te.DrawForward = horizontalToView (Text steht zur Kamera)
- _runs_to_rtf(runs, default_font): Phase 2 — generiert Rhinos RTF aus
den Runs. Triviale Runs (alle plain, ein Font) → None (PlainText
fallback). Sonst: \rtf1 + fonttbl + colortbl + Format-Codes pro Run
(\f \cf \b \i \ul \super \sub \nosupersub). _rtf_escape handelt \,
{, }, \n und non-ASCII (\u-Notation). te.RichText = rtf, Fallback
auf PlainText wenn das fehlschlaegt.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>