Commit Graph
84 Commits
Author SHA1 Message Date
Linus Rath de09da137b Merge branch 'feat/do-menu-winctl' into feat/do-menu-fixes 2026-11-04 07:50:16 +01:00
Linus Rath e29a6553e6 fix: keep notices and the offline bar clear of the window's controls, give each a close, and put a pane's close first where it would sit beside the window's 2026-11-04 07:02:53 +01:00
Linus Rath 3a9ec61232 fix: mark the row a menu is open for, and leave the item under the pointer alone until it moves 2026-11-04 07:00:56 +01:00
Linus Rath 277e1aa55d Merge branch 'feat/do-menu-altbar' into feat/do-menu-fixes 2026-11-04 06:19:29 +01:00
Linus Rath f7c6f6b7b1 Merge branch 'feat/do-menu-overflow' into feat/do-menu-fixes 2026-11-04 06:12:13 +01:00
Linus Rath ea274b02e9 fix: end a field's text in an ellipsis when it doesn't fit, instead of cutting it mid-word 2026-11-04 05:58:48 +01:00
Linus Rath e74d2aaa72 fix: keep the app's own buttons out from under the window's controls and move a pane's close away from the window's 2026-11-04 05:27:57 +01:00
Linus Rath ff0e16c755 feat: show the desktop app's menu bar as a row at the top on Alt, or always 2026-11-04 05:20:02 +01:00
Linus Rath 529d334496 Merge branch 'fix/ui-bug-hunt' 2026-11-03 19:44:46 +01:00
Linus Rath 383e579eec feat: run the app to the top of the window, with the window's controls in its own toolbars
The desktop app and an installed PWA had a row across the whole window
with the title and the window controls. That row is gone. The rail,
sidebar, list and reader run to the top of the window in their own
colours, and the controls sit in the top row of whatever is rightmost.

- `lib/window-controls-overlay.ts` finds and marks those rows before
  paint, and they reserve the controls' width through
  `--titlebar-right-inset`
- the rows and the rail are the drag area, everything clickable is
  `no-drag`, and an invisible band lets a page with no row still move
- settings and the admin shell get a row only under the overlay, Pro's
  tab strip and Mountain View's bar match the controls' height
- Alt floats the menu over the top left, in `window-menu-bar.tsx`
- skeletons carry the same marks, so nothing shifts when the app loads
2026-11-03 16:52:42 +01:00
Linus Rath d09e400d04 fix: keep the tab bar on the mail list on a phone held sideways, hiding it only over what fills the window 2026-11-03 16:11:16 +01:00
Linus Rath 24ab29db73 fix: keep typed text in a narrow Mountain View search field clear of the clear button 2026-11-03 16:06:49 +01:00
Linus Rath d65e5b9794 fix: dock the Mountain View compose window beside the side panel at every text size 2026-11-03 16:02:10 +01:00
Linus Rath d9c9fc03f7 feat: give the desktop app a native menu bar and native right-click menus built from the webmail's own 2026-11-03 10:44:03 +01:00
Linus Rath 0b0e161e4c fix: hide the tab bar over an open message or composer on a phone held sideways 2026-11-03 09:36:10 +01:00
Linus Rath b086f45511 fix: give the Mountain View search field the free width and keep it clear of the bell at large text 2026-11-03 08:30:10 +01:00
Linus Rath c11f383fd7 fix: keep the Mountain View account card on screen on small phones 2026-11-03 07:41:54 +01:00
Linus Rath 3c1d179191 fix: dock the Mountain View compose window beside the side panel instead of over it 2026-11-03 07:33:22 +01:00
Linus Rath bb2393cf04 feat: open messages and drafts in their own windows and save all attachments to a folder
An installed app had no title bar of its own, no way to save attachments
except a zip, and "pop out" stayed inside the page. A new window was a
second copy of the app that had to restore the session itself, and on
start-up that evicts any login made without "Remember me" from the list
every window shares.

- Title bar: `display_override` with `window-controls-overlay`, one
  `--titlebar-inset` variable at the page roots and skeletons, and a drag
  strip with the window title. 0 without an overlay, so nothing moves.
- Save all to a folder: `showDirectoryPicker`, asking the device policy
  before the picker and before each file, with the zip as the fallback.
- Pop-out routes `/popout/message/<id>` and `/popout/compose`, on offer in
  an installed app or when the desktop bridge has windows. Hidden in Lite.
- A pop-out borrows the main window's session and never evicts or starts a
  token timer. Every renewal now takes a Web Lock, so two windows can't
  send the same refresh token, which Stalwart 1.0 may treat as a replay.
- A draft moves to its window under the same id. A closing window hands
  unsaved text to the main window to save, since its own request wouldn't
  survive the close.
- Read state, drafts, theme and language follow across windows, and
  `html[data-desktop]` gates the app-like behaviour in `app/desktop.css`.
2026-11-03 06:50:21 +01:00
Linus Rath 72117c8a71 Merge branch 'main' into feat/proofreading
# Conflicts:
#	components/admin/admin-shell.tsx
2026-11-02 21:27:17 +01:00
Linus Rath 6055dac1cb fix: keep proofreading text from plugins that shouldn't get it, and work it by keyboard #1397
A security and an accessibility review of the proofreading hook found
gaps, fixed here.

What leaves the browser:
- A checker gets a name for each composer of its own, not the composer's
  id, so it can't reach the message through the other api.composer calls
  after proofreading stops.
- Checking pauses while a plugin that can sign or encrypt is turned on but
  still starting, and while the policy couldn't be fetched (the built-in
  defaults could undo an admin's lock).
- No plugin can hold up turning proofreading off (onBeforeSettingChange).
- Suggestions can't carry zero-width, bidi or line-separator characters;
  messages lose bidi overrides; a flood of annotations is cut off early.
- The notices name the plugin as installed, not a label it chose, and say
  that text written before signing or encryption was turned on may
  already have been checked.
- A checker registered during start-up no longer fails its first check.

Keyboard and screen readers:
- Escape in the issue panel closes the panel, not the message.
- Underlines carry aria-invalid, as the browser's own markers do.
- The focus goes somewhere sensible when a button or an issue goes away,
  Tab past the popup's edges goes back to the text, and the shortcuts work
  in the popup and the panel.
- Ctrl+' and Ctrl+; follow the character typed, so other layouts keep
  their own keys (Ctrl+S on Dvorak), with Ä and Ö on German keyboards.
- The popup is described by its message, sits inside a modal composer,
  fits narrow screens, and the panel fits a phone.
2026-11-02 20:26:21 +01:00
Linus Rath d37624a314 feat: underline spelling and grammar issues from checker plugins #1397 2026-11-01 19:39:37 +01:00
Linus Rath 8d790b29fd feat: show the page's skeleton on Lite pages while their language loads 2026-11-01 18:41:58 +01:00
Linus Rath ea604ab8a1 fix: keep the open folder regular weight in mountain view so bold only means unread #1469 2026-10-31 16:31:15 +01:00
Linus Rath 2de0ee8e30 fix: keep tag text readable on unread, selected and hovered rows 2026-10-31 02:20:40 +01:00
Linus Rath 1706f951bb fix: open menus in place with reduced motion instead of flashing in the corner first 2026-10-31 02:00:15 +01:00
Linus Rath 9f6c7b99c9 fix: raise text contrast to 4.5:1 in every built-in theme, light and dark 2026-10-29 19:38:45 +01:00
Linus Rath 1111dd6709 fix: show the focus outline on menu items, grid cells and other roving-focus controls 2026-10-29 19:38:44 +01:00
Linus Rath 8008393e59 feat: add an Accessibility page to Settings
Settings get a page of their own for accessibility, with presets on top
(screen reader, low vision, dyslexia, focus, keyboard and motor, motion
and seizure safe, deaf and hard of hearing) that change several options
at once and can be undone, then the options by topic, and a reset.

Text size used to be a fixed 14/16/18px on the root, which threw away
the size people set in their browser. It is now a percentage of the
browser's size, from 87.5% to 200%. Motion, contrast and transparency
follow the system by default and can be overridden either way; the
old Animations switch becomes Reduce motion. The visual options are
applied before the first paint, so the page no longer flashes at the
wrong size.

- `lib/accessibility-settings.ts`: the new settings, their allowed
  values, and the code that writes them onto `<html>`
- `app/accessibility.css`: bundled fonts (Atkinson Hyperlegible Next,
  Lexend, OpenDyslexic), text spacing, a focus outline that survives
  Windows contrast themes, more-contrast colours on any theme, reduced
  transparency, a large pointer
- admins can preset every new option but lock only shortcuts, send
  confirmation and the notification duration; a lock on text size or
  another reading aid works as a default
- always-light mail and toolbar labels now sync, and imports drop
  values the page doesn't know
- font size and animations move off Appearance, the plain text font
  off Reading; everyday settings such as conversation view and undo
  send show on both their own page and Accessibility
2026-10-29 17:53:32 +01:00
pcatapan 9e00896043 feat(composer): collapse quoted reply history behind an ellipsis 2026-10-29 11:00:58 +01:00
Linus Rath 39eb38a0fa fix: give the mail, calendar, contacts, files and settings headers one search field and one button style 2026-10-28 22:16:48 +01:00
Linus Rath 67b44fd5de fix: keep the inner edge of color bars straight on rounded events, tasks and notes 2026-10-28 21:50:29 +01:00
Linus Rath 1c8579fdbc fix: keep a setting row's shape and divider when the settings search highlights it 2026-10-28 20:00:41 +01:00
Linus Rath 295c0d6c49 fix: show menus and dialogs at once with reduced motion on, so they take focus 2026-10-28 02:31:58 +01:00
Linus Rath a4d8192f9c fix: point the reply and forward arrows the right way in right-to-left languages 2026-10-28 01:49:22 +01:00
Linus Rath 03304a3cdc fix: show toasts above the phone's bottom bars, newest at the bottom, and let a swipe dismiss them 2026-10-28 01:48:36 +01:00
Linus Rath cbea8755d6 fix: let border colours from the theme utilities show in the standard theme 2026-10-28 01:26:19 +01:00
Linus Rath 38c983a886 fix: open the mention card on click and show on hover that the chip is clickable 2026-10-19 00:38:01 +02:00
Linus Rath fbae8acfb8 feat: turn @mentions into chips with a hover card 2026-10-18 17:52:11 +02:00
Linus Rath b811ad93cb fix: use the theme's sans font for the whole app #1278 2026-10-18 13:46:47 +02:00
Linus Rath 3d5c46bbcf fix: make plugin sidebar rows as tall as folder rows on phones 2026-10-14 18:49:56 +02:00
Linus Rath 1bd4f743a1 feat: give plugins the app's own controls and draw their dialogs like the app's dialogs 2026-10-14 11:10:14 +02:00
Linus Rath f160dae25c fix: stop the panes sliding when animations are turned off #1215 2026-10-12 01:55:57 +02:00
Linus Rath c652fec371 feat: give Mountain View's compose window Gmail's title bar and bottom bar 2026-10-12 01:26:03 +02:00
Linus Rath 1980de68c8 feat: give Mountain View's open message Gmail's toolbar, pager and header 2026-10-12 01:10:10 +02:00
Linus Rath 20b52a060f feat: draw Mountain View's message rows like Gmail's 2026-10-12 01:01:09 +02:00
Linus Rath cf558e7e9f feat: lay out Mountain View's navigation like Gmail's, with a Labels section 2026-10-12 00:46:48 +02:00
Linus Rath ae151cec25 feat: set Mountain View's content on a rounded card over a tinted canvas 2026-10-12 00:37:59 +02:00
lucamzanon ade30622f2 Merge remote-tracking branch 'origin/main' into up/feat/mountain-view-layout
# Conflicts:
#	components/mail/mail-app.tsx
2026-10-08 10:05:29 +02:00
Gerwin Kuijntjes 682fc086d1 fix: show the pointer cursor on buttons and other controls
Tailwind v4's preflight no longer gives buttons a pointer cursor, so most
buttons, menu items, tabs, switches and selects showed the arrow. A base-layer
rule in globals.css gives them the pointer again and gives disabled ones
not-allowed. Cursor utilities on components still take precedence.
2026-10-06 21:31:11 +02:00