mirror of
https://github.com/priyanshujain/margin-mail.git
synced 2026-10-02 19:17:05 +00:00
The client itself: the sync engine and mirror, the Gmail and IMAP providers, the screener, the three boxes and two piles, compose and send, the sanitiser and tracker stripping, contacts, clips, backup, notifications and the guide. The pipeline that ships it. Three runners now build in parallel and the publish gate wants all four platform keys in latest.json before a release leaves draft. Linux gets two more packages Tauri does not build: a flatpak repackaged from the deb against GNOME 48, and a Nix package that relinks the deb against nixpkgs so it runs as a native Wayland client rather than through Xwayland. CI runs the Rust suite on all three desktops rather than on Linux alone, and rebuilds the flatpak manifest on every push to main. Two things that were only ever exercised on macOS and were wrong everywhere else. The menu bar was built by adjusting the submenus macOS is given, so on a platform whose default menu has no File or View the new File menu landed after Edit, Check for Updates landed nowhere, and the three places and the reading pane had no menu at all. The deb declared libwebkit2gtk-4.1-0 and libgtk-3-0 twice, because tauri.conf.json named the dependencies Tauri already emits. The updater key exists now, so releases can sign their artifacts.
128 lines
3.8 KiB
CSS
128 lines
3.8 KiB
CSS
/* The stylesheet inside a message's iframe.
|
|
*
|
|
* It is served raw out of public/ rather than bundled, because the frame is a document of its own
|
|
* and cannot see the app's stylesheets. Every value it uses is a custom property that
|
|
* src/screens/MessageBody.tsx writes onto the frame's root from the app's own computed tokens, so
|
|
* this file holds the shape of a message body and no colour, no face and no size of its own.
|
|
*
|
|
* The two faces are declared again for the same reason: a child document does not inherit the
|
|
* parent's @font-face rules, and without these a message renders in Georgia. They are the two
|
|
* default slots; a face chosen in settings needs its declaration here as well. */
|
|
|
|
@font-face {
|
|
font-family: "Hanken Grotesk";
|
|
src: url("/fonts/HankenGrotesk-VF.ttf") format("truetype-variations");
|
|
font-weight: 100 900;
|
|
font-style: normal;
|
|
font-display: block;
|
|
}
|
|
|
|
@font-face {
|
|
font-family: "Literata";
|
|
src: url("/fonts/Literata-VF.ttf") format("truetype-variations");
|
|
font-weight: 200 900;
|
|
font-style: normal;
|
|
font-display: block;
|
|
}
|
|
|
|
@font-face {
|
|
font-family: "Literata";
|
|
src: url("/fonts/Literata-Italic-VF.ttf") format("truetype-variations");
|
|
font-weight: 200 900;
|
|
font-style: italic;
|
|
font-display: block;
|
|
}
|
|
|
|
html {
|
|
/* The parent measures scrollHeight to size the frame, so nothing in here may scroll itself. */
|
|
overflow: hidden;
|
|
/* What this document is, in its own words: `only light` for a page the sender painted and ours
|
|
for everything else. It decides the canvas the browser paints before the body does, the colours
|
|
it gives anything it draws itself, and what a rule inside the message would be told about
|
|
`prefers-color-scheme`. Written from MessageBody.tsx the way every other value here is.
|
|
|
|
The `only light` half is the one no mail client ships. A body pinned to a white page in a dark
|
|
window is still a document, and a document with nothing to say about its own scheme gets the
|
|
machine's, which puts a dark canvas and dark user agent colours under a page we just painted
|
|
white. */
|
|
color-scheme: var(--m-color-scheme);
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
max-width: var(--m-measure);
|
|
/* Painted rather than left transparent, because a message that painted its own page is pinned to
|
|
the light surface in both palettes and has to bring that surface with it. On the theme the
|
|
value is the app's own paper and this rule is invisible. */
|
|
background: var(--m-paper);
|
|
color: var(--m-ink);
|
|
font-family: var(--m-font-text);
|
|
font-size: var(--m-size);
|
|
/* 1.5 rather than the 1.6 this was drawn at. At 15px that is 22.5px a line against 24px, which
|
|
is worth more on a long message than every margin in the pane put together, and it is still
|
|
prose rather than a spreadsheet. Anything tighter than 1.45 and the text face stops being
|
|
worth having. */
|
|
line-height: 1.5;
|
|
overflow-wrap: break-word;
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
|
|
/* Transactional mail is data rather than prose, so it reads in the interface face. */
|
|
body[data-plain] {
|
|
font-family: var(--m-font-ui);
|
|
font-size: var(--m-size-plain);
|
|
line-height: 1.55;
|
|
}
|
|
|
|
p {
|
|
margin: 0 0 12px;
|
|
}
|
|
|
|
p:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
a {
|
|
color: inherit;
|
|
text-decoration: underline;
|
|
text-underline-offset: 2px;
|
|
}
|
|
|
|
/* A sender's image is whatever size the sender made it, and the pane is not that wide. */
|
|
img {
|
|
max-width: 100%;
|
|
height: auto;
|
|
}
|
|
|
|
table {
|
|
max-width: 100%;
|
|
border-collapse: collapse;
|
|
}
|
|
|
|
blockquote {
|
|
margin: 0 0 12px;
|
|
padding-left: 14px;
|
|
border-left: 2px solid var(--m-line);
|
|
color: var(--m-faint);
|
|
}
|
|
|
|
pre,
|
|
code {
|
|
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
font-size: 0.92em;
|
|
}
|
|
|
|
pre {
|
|
padding: 10px 12px;
|
|
border-radius: 5px;
|
|
background: var(--m-wash);
|
|
overflow-x: auto;
|
|
}
|
|
|
|
hr {
|
|
height: 1px;
|
|
margin: 16px 0;
|
|
border: 0;
|
|
background: var(--m-line);
|
|
}
|