feat: comprehensive Wino Mail updates

- ReaderView: complete rewrite with CSS styling, headers, attachments, zoom, find, dark mode, image blocking
- Categories: DAO + UI tree widget with colors, nested categories, assignment
- Rules engine: DAO + evaluation + actions (move, mark read, flag, delete, category, forward)
- Templates: DAO + editor + manager with variables support
- Signatures: DAO + manager + auto-per-account + manual selector in compose
- ComposeView: signature combo, template selector, auto-signature on new email
- MainWindow: frameless with rounded corners, 1px border, resize from edges, no status bar
- Database: new tables (Category, MailCategory, Rule, Template, Signature) with indexes
This commit is contained in:
2026-08-23 14:49:58 +02:00
parent 5fcedfa129
commit 0bb8738607
7399 changed files with 44711 additions and 209 deletions
@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<circle cx="17" cy="18" r="4" stroke="black" stroke-width="1.5"/>
<path d="M20 15L14 21" stroke="black" stroke-width="1.5"/>
<path d="M14 20.8344C13.3663 20.9421 12.695 21 12 21C8.13401 21 5 19.2091 5 17C5 14.7909 8.13401 13 12 13C13.7135 13 15.2832 13.3518 16.5 13.9359" stroke="black" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 476 B

@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M15 13.3271C14.0736 13.1162 13.0609 13 12 13C7.58172 13 4 15.0147 4 17.5C4 19.9853 4 22 12 22C17.6874 22 19.3315 20.9817 19.8068 19.5" stroke="black" stroke-width="1.5"/>
<path d="M15.1715 18.8284C15.8954 19.5523 16.8954 20 18 20C20.2091 20 22 18.2091 22 16C22 14.8954 21.5523 13.8954 20.8284 13.1715M15.1715 18.8284C14.4477 18.1045 14 17.1046 14 16C14 13.7909 15.7909 12 18 12C19.1046 12 20.1045 12.4477 20.8284 13.1715M15.1715 18.8284L20.8284 13.1715" stroke="black" stroke-width="1.5" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 691 B

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<circle cx="17" cy="18" r="4" stroke="black" stroke-width="1.5"/>
<path d="M15.6665 18.0002L16.5 19.0002L18.3332 17.1113" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14 20.8344C13.3663 20.9421 12.695 21 12 21C8.13401 21 5 19.2091 5 17C5 14.7909 8.13401 13 12 13C13.7135 13 15.2832 13.3518 16.5 13.9359" stroke="black" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 556 B

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<circle cx="18" cy="16" r="4" stroke="black" stroke-width="1.5"/>
<path d="M16.6665 16.0002L17.5 17.0002L19.3332 15.1113" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M15 13.3271C14.0736 13.1162 13.0609 13 12 13C7.58172 13 4 15.0147 4 17.5C4 19.9853 4 22 12 22C17.6874 22 19.3315 20.9817 19.8068 19.5" stroke="black" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 553 B

@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="9" r="3" stroke="black" stroke-width="1.5"/>
<circle cx="12" cy="12" r="10" stroke="black" stroke-width="1.5"/>
<path d="M17.9692 20C17.8101 17.1085 16.9248 15 12 15C7.07527 15 6.18997 17.1085 6.03082 20" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 387 B

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M14 20.8344C13.3663 20.9421 12.695 21 12 21C8.13401 21 5 19.2091 5 17C5 14.7909 8.13401 13 12 13C13.7135 13 15.2832 13.3518 16.5 13.9359" stroke="black" stroke-width="1.5"/>
<circle cx="17" cy="18" r="4" stroke="black" stroke-width="1.5"/>
<path d="M15.6665 16.6665L18.3332 19.3332M18.3335 16.6665L15.6668 19.3332" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 575 B

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M15 13.3271C14.0736 13.1162 13.0609 13 12 13C7.58172 13 4 15.0147 4 17.5C4 19.9853 4 22 12 22C17.6874 22 19.3315 20.9817 19.8068 19.5" stroke="black" stroke-width="1.5"/>
<circle cx="18" cy="16" r="4" stroke="black" stroke-width="1.5"/>
<path d="M16.6665 14.6665L19.3332 17.3332M19.3335 14.6665L16.6668 17.3332" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 572 B

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 13H16M8 13V18C8 19.8856 8 20.8284 8.58579 21.4142C9.17157 22 10.1144 22 12 22C13.8856 22 14.8284 22 15.4142 21.4142C16 20.8284 16 19.8856 16 18V13M8 13C5.2421 12.3871 3.06717 10.2687 2.38197 7.52787L2 6M16 13C17.7107 13 19.1506 14.2804 19.3505 15.9795L20 21.5" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 500 B

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 13H16M8 13V18C8 19.8856 8 20.8284 8.58579 21.4142C9.17157 22 10.1144 22 12 22C13.8856 22 14.8284 22 15.4142 21.4142C16 20.8284 16 19.8856 16 18V13M8 13C6.28928 13 4.84936 14.2804 4.64948 15.9795L4 21.5M16 13C17.7107 13 19.1506 14.2804 19.3505 15.9795L20 21.5" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 499 B

@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<ellipse cx="9" cy="17" rx="7" ry="4" stroke="black" stroke-width="1.5"/>
<path d="M17.0885 12.5385L17.5435 11.9423L17.0885 12.5385ZM18 8.64354L17.4681 9.17232C17.6089 9.31392 17.8003 9.39354 18 9.39354C18.1997 9.39354 18.3911 9.31392 18.5319 9.17232L18 8.64354ZM18.9115 12.5385L18.4565 11.9423L18.9115 12.5385ZM17.5435 11.9423C17.0571 11.571 16.619 11.274 16.2659 10.8891C15.9387 10.5324 15.75 10.1638 15.75 9.69973H14.25C14.25 10.6481 14.6642 11.362 15.1606 11.9031C15.6311 12.4161 16.2372 12.8322 16.6335 13.1347L17.5435 11.9423ZM15.75 9.69973C15.75 9.28775 15.9898 8.95469 16.2973 8.81862C16.5635 8.7008 16.9874 8.68874 17.4681 9.17232L18.5319 8.11476C17.6627 7.24047 16.5865 7.0503 15.6903 7.44694C14.8352 7.82533 14.25 8.69929 14.25 9.69973H15.75ZM16.6335 13.1347C16.7825 13.2483 16.9756 13.3959 17.1793 13.5111C17.3832 13.6265 17.6656 13.75 18 13.75V12.25C18.0344 12.25 18.0168 12.2615 17.9179 12.2056C17.8187 12.1495 17.7061 12.0663 17.5435 11.9423L16.6335 13.1347ZM19.3665 13.1347C19.7628 12.8322 20.3689 12.4161 20.8394 11.9031C21.3358 11.362 21.75 10.6481 21.75 9.69973H20.25C20.25 10.1638 20.0613 10.5324 19.7341 10.8891C19.381 11.274 18.9429 11.571 18.4565 11.9423L19.3665 13.1347ZM21.75 9.69973C21.75 8.69929 21.1648 7.82533 20.3097 7.44694C19.4135 7.0503 18.3373 7.24047 17.4681 8.11476L18.5319 9.17232C19.0126 8.68874 19.4365 8.7008 19.7027 8.81862C20.0102 8.95469 20.25 9.28775 20.25 9.69973H21.75ZM18.4565 11.9423C18.2939 12.0663 18.1813 12.1495 18.0821 12.2056C17.9832 12.2615 17.9656 12.25 18 12.25V13.75C18.3344 13.75 18.6168 13.6265 18.8207 13.5111C19.0244 13.3959 19.2175 13.2483 19.3665 13.1347L18.4565 11.9423Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="10" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M18 17.5C18 19.9853 18 22 10 22C2 22 2 19.9853 2 17.5C2 15.0147 5.58172 13 10 13C14.4183 13 18 15.0147 18 17.5Z" stroke="black" stroke-width="1.5"/>
<path d="M18.0885 12.5385L18.5435 11.9423L18.0885 12.5385ZM19 8.64354L18.4681 9.17232C18.6089 9.31392 18.8003 9.39354 19 9.39354C19.1997 9.39354 19.3911 9.31392 19.5319 9.17232L19 8.64354ZM19.9115 12.5385L19.4565 11.9423L19.9115 12.5385ZM18.5435 11.9423C18.0571 11.571 17.619 11.274 17.2659 10.8891C16.9387 10.5324 16.75 10.1638 16.75 9.69973H15.25C15.25 10.6481 15.6642 11.362 16.1606 11.9031C16.6311 12.4161 17.2372 12.8322 17.6335 13.1347L18.5435 11.9423ZM16.75 9.69973C16.75 9.28775 16.9898 8.95469 17.2973 8.81862C17.5635 8.7008 17.9874 8.68874 18.4681 9.17232L19.5319 8.11476C18.6627 7.24047 17.5865 7.0503 16.6903 7.44694C15.8352 7.82533 15.25 8.69929 15.25 9.69973H16.75ZM17.6335 13.1347C17.7825 13.2483 17.9756 13.3959 18.1793 13.5111C18.3832 13.6265 18.6656 13.75 19 13.75V12.25C19.0344 12.25 19.0168 12.2615 18.9179 12.2056C18.8187 12.1495 18.7061 12.0663 18.5435 11.9423L17.6335 13.1347ZM20.3665 13.1347C20.7628 12.8322 21.3689 12.4161 21.8394 11.9031C22.3358 11.362 22.75 10.6481 22.75 9.69973H21.25C21.25 10.1638 21.0613 10.5324 20.7341 10.8891C20.381 11.274 19.9429 11.571 19.4565 11.9423L20.3665 13.1347ZM22.75 9.69973C22.75 8.69929 22.1648 7.82533 21.3097 7.44694C20.4135 7.0503 19.3373 7.24047 18.4681 8.11476L19.5319 9.17232C20.0126 8.68874 20.4365 8.7008 20.7027 8.81862C21.0102 8.95469 21.25 9.28775 21.25 9.69973H22.75ZM19.4565 11.9423C19.2939 12.0663 19.1813 12.1495 19.0821 12.2056C18.9832 12.2615 18.9656 12.25 19 12.25V13.75C19.3344 13.75 19.6168 13.6265 19.8207 13.5111C20.0244 13.3959 20.2175 13.2483 20.3665 13.1347L19.4565 11.9423Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1,8 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="9" r="2" stroke="black" stroke-width="1.5"/>
<path d="M13 15C13 16.1046 13 17 9 17C5 17 5 16.1046 5 15C5 13.8954 6.79086 13 9 13C11.2091 13 13 13.8954 13 15Z" stroke="black" stroke-width="1.5"/>
<path d="M2 12C2 8.22876 2 6.34315 3.17157 5.17157C4.34315 4 6.22876 4 10 4H14C17.7712 4 19.6569 4 20.8284 5.17157C22 6.34315 22 8.22876 22 12C22 15.7712 22 17.6569 20.8284 18.8284C19.6569 20 17.7712 20 14 20H10C6.22876 20 4.34315 20 3.17157 18.8284C2 17.6569 2 15.7712 2 12Z" stroke="black" stroke-width="1.5"/>
<path d="M19 12H15" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<path d="M19 9H14" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<path d="M19 15H16" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 866 B

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<circle cx="17" cy="18" r="4" stroke="black" stroke-width="1.5"/>
<path d="M16 18L18 18" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14 20.8344C13.3663 20.9421 12.695 21 12 21C8.13401 21 5 19.2091 5 17C5 14.7909 8.13401 13 12 13C13.7135 13 15.2832 13.3518 16.5 13.9359" stroke="black" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 523 B

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M15 13.3271C14.0736 13.1162 13.0609 13 12 13C7.58172 13 4 15.0147 4 17.5C4 19.9853 4 22 12 22C17.6874 22 19.3315 20.9817 19.8068 19.5" stroke="black" stroke-width="1.5"/>
<circle cx="18" cy="16" r="4" stroke="black" stroke-width="1.5"/>
<path d="M17 16H19" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 517 B

@@ -0,0 +1,7 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<circle cx="17" cy="18" r="4" stroke="black" stroke-width="1.5"/>
<path d="M17 16.6665V19.3332" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M15.6665 18L18.3332 18" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14 20.8344C13.3663 20.9421 12.695 21 12 21C8.13401 21 5 19.2091 5 17C5 14.7909 8.13401 13 12 13C13.7135 13 15.2832 13.3518 16.5 13.9359" stroke="black" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 646 B

@@ -0,0 +1,7 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M15 13.3271C14.0736 13.1162 13.0609 13 12 13C7.58172 13 4 15.0147 4 17.5C4 19.9853 4 22 12 22C17.6874 22 19.3315 20.9817 19.8068 19.5" stroke="black" stroke-width="1.5"/>
<circle cx="18" cy="16" r="4" stroke="black" stroke-width="1.5"/>
<path d="M18 14.6665V17.3332" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16.6665 16L19.3332 16" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 643 B

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<ellipse cx="12" cy="17" rx="7" ry="4" stroke="black" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 243 B

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="10" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<ellipse cx="10" cy="17" rx="7" ry="4" stroke="black" stroke-width="1.5"/>
<path d="M19 2C19 2 21 3.2 21 6C21 8.8 19 10 19 10" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<path d="M17 4C17 4 18 4.6 18 6C18 7.4 17 8 17 8" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 463 B

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="10" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M18 17.5C18 19.9853 18 22 10 22C2 22 2 19.9853 2 17.5C2 15.0147 5.58172 13 10 13C14.4183 13 18 15.0147 18 17.5Z" stroke="black" stroke-width="1.5"/>
<path d="M19 2C19 2 21 3.2 21 6C21 8.8 19 10 19 10" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<path d="M17 4C17 4 18 4.6 18 6C18 7.4 17 8 17 8" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 546 B

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M20 17.5C20 19.9853 20 22 12 22C4 22 4 19.9853 4 17.5C4 15.0147 7.58172 13 12 13C16.4183 13 20 15.0147 20 17.5Z" stroke="black" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 326 B

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M15 9C16.6569 9 18 7.65685 18 6C18 4.34315 16.6569 3 15 3" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<ellipse cx="9" cy="17" rx="7" ry="4" stroke="black" stroke-width="1.5"/>
<path d="M18 14C19.7542 14.3847 21 15.3589 21 16.5C21 17.5293 19.9863 18.4229 18.5 18.8704" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 519 B

@@ -0,0 +1,8 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="6" r="4" stroke="black" stroke-width="1.5"/>
<path d="M18 9C19.6569 9 21 7.88071 21 6.5C21 5.11929 19.6569 4 18 4" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<path d="M6 9C4.34315 9 3 7.88071 3 6.5C3 5.11929 4.34315 4 6 4" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<ellipse cx="12" cy="17" rx="6" ry="4" stroke="black" stroke-width="1.5"/>
<path d="M20 19C21.7542 18.6153 23 17.6411 23 16.5C23 15.3589 21.7542 14.3847 20 14" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
<path d="M4 19C2.24575 18.6153 1 17.6411 1 16.5C1 15.3589 2.24575 14.3847 4 14" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 779 B