Files
d e516d007c8 Integrated email server (#12)
## messenger-style email with full backend integration

Implements M8SH Mail — a complete messenger UI for email built on top of the Gitea fork's integrated email server.

Features:

- All 17 endpoints (`/api/v1/mail/*`) — thread list with cursor pagination, message send/forward/delete, pin/unread, block list, group rename/members, attachment serving with Range support
- RFC 5322 parsing with multipart support, HTML detection/correction, reply quote stripping (Gmail/Outlook patterns), plain-text preview extraction via `golang.org/x/net/html`
- M8SH HTTP fast-path for same-domain, SMTP MX fallback for external recipients, DKIM signing, `From:` display name from Gitea Full Name
- Internal-domain users (`@m8sh.su`) auto-activated and get Chats tab; external users get activation email via integrated mail server (MX → SMTP)
- Vue 3 SPA with ThreadList (infinite scroll, context menu, delete confirmation), ChatPane (message bubbles, HTML cards, audio player, in-thread search, scroll-up pagination), avatar resolution pipeline (Gitea → Gravatar → favicon.ico → favicon.png → default)
- Plain text only — no JSON/ForwardedContent trees, fully RFC 5322 compatible
- Music player, video player, image viewer are integrated into chat UI and they make content easily downloadable
 ![img](https://m8sh.su/attachments/cfdd773e-b1c3-4207-a66f-36360ca6f8e6)Reviewed-on: #12
2026-07-18 19:36:17 +00:00

31 lines
1.0 KiB
CSS

/* M8SH Messenger — layout: make #messenger-app fill viewport below navbar.
The actual component styles are scoped in MessengerApp.vue.
This CSS ensures the height chain works: body > .full.height > .page-content > #messenger-app */
/* .full.height is a flex item in body (flex column). Make it also a flex container
so its children (navbar + page-content) can fill height. */
.full.height:has(#messenger-app) {
display: flex;
flex-direction: column;
padding-bottom: 0 !important; /* cancel the 64px bottom padding */
}
/* .page-content contains #messenger-app. Make it fill remaining height. */
.page-content:has(#messenger-app) {
flex: 1;
display: flex;
flex-direction: column;
margin-top: 0 !important; /* cancel the 16px page-spacing margin-top */
padding: 0 !important;
min-height: 0; /* allow inner scroll areas to work */
overflow: hidden;
}
/* #messenger-app is the Vue mount point — fill its parent */
#messenger-app {
flex: 1;
display: flex;
min-height: 0;
overflow: hidden;
}