relay UI overhaul, favicon, settings, admin last-seen, fixes

Relay:
  - Inbox/shared/sent split into own view-inbox (nav button + poll).
    Compose is now single-column, centered.
  - Header logo links to compose. Inbox badge stays fresh on all
    views via a quiet loadInbox on every view switch.
  - Mobile menu: full-height sheet below header, larger buttons
    (15px font, 14px padding), full width.
  - Login form wrapped in <form> with name attributes + for/id on
    labels so password managers can autofill.
  - Admin user list shows "last seen <relative time>" per user.
    last_seen_at column on tenants, updated on every authenticated
    request (session + client API).
  - Cache-busting on style.css + app.js via filemtime.
  - View persistence in localStorage (survives reload).
  - Shared-bucket cards show title only (preview line removed).

Favicon:
  - favicon.svg added to project root + copied to public/, relay/,
    website/. Linked via <link rel="icon" type="image/svg+xml"> in
    all three <head> sections.

Settings:
  - New toggle: "Show shopping list items in task collector"
    (default off). collectTasks skips #einkauf/#shopping cards when
    disabled.

Fixes:
  - card-spinner gets display:inline-block so it rotates outside
    flex containers (shopping save spinner).
  - Tim tab test opens the plugin before checking active state.
  - Compose view centered with margin:auto on desktop.

Bumps to 1.9.29.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
thandClaude Opus 4.6 committed 2026-04-17 13:16:23 +02:00
1 parent 8e738ed9d4
commit d50f9fe789
19 files changed
+209 -101

No files matched your search

+23 -42
View File
@@ -232,13 +232,8 @@ label.checkbox input[type="checkbox"] { accent-color:var(--accent); cursor:point
#view-compose:not(.hidden) {
display: flex; flex-direction: column; gap: 16px;
}
/* Same 16 px rhythm between inbox / shared / sent on mobile as
between compose and inbox — desktop re-declares this inside the
grid rule further down. */
#compose-sidebar {
display: flex;
flex-direction: column;
gap: 16px;
#view-inbox:not(.hidden) {
display: flex; flex-direction: column; gap: 16px;
}
.compose-attachments {
display: flex; flex-wrap: wrap; gap: 6px; min-height: 0;
@@ -677,23 +672,28 @@ header .nav-btn .ph { font-size:11px; vertical-align:-1px; margin-right:2px; }
display:flex !important;
flex-direction:column;
align-items:stretch;
position:absolute;
top:100%;
right:12px;
margin-top:6px;
position:fixed;
top: 48px;
left: 0;
right: 0;
bottom: 0;
margin: 0;
background:var(--surface);
border:1px solid var(--border);
border-radius:var(--radius-lg);
box-shadow: var(--shadow-popover);
padding:6px;
gap:4px;
min-width:180px;
z-index:50;
border-top:1px solid var(--border);
border-radius: 0;
padding: 12px 16px;
gap: 6px;
z-index:100;
}
#nav-buttons.menu-open .nav-btn {
text-align:left;
width:100%;
padding: 8px 12px;
padding: 14px 16px;
font-size: 15px;
}
#nav-buttons.menu-open .nav-btn .ph {
font-size: 16px;
margin-right: 8px;
}
#view-admin .section {
@@ -757,18 +757,11 @@ header .nav-btn .ph { font-size:11px; vertical-align:-1px; margin-right:2px; }
border-radius: var(--radius);
}
/* Compose view: 2 columns. Left is the compose editor. Right is a
sidebar with inbox → shared → sent stacked vertically. */
/* Compose view: single column, centered. Inbox/shared/sent are in
their own view now — no sidebar to fill the right-hand space. */
#view-compose:not(.hidden) {
display: grid !important;
grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr);
gap: 24px;
align-items: start;
}
#compose-sidebar {
display: flex;
flex-direction: column;
gap: 16px;
max-width: 720px;
margin: 0 auto;
}
/* Cards: depth via shadow + larger padding */
@@ -810,18 +803,6 @@ header .nav-btn .ph { font-size:11px; vertical-align:-1px; margin-right:2px; }
font-size: 12px;
}
/* Inbox card sticks under the header */
#inbox-section {
position: sticky;
top: 24px;
transition: box-shadow .15s;
}
#inbox-section:hover {
box-shadow:
0 1px 2px rgba(0,0,0,0.3),
0 12px 32px -8px rgba(0,0,0,0.5),
0 0 0 1px color-mix(in srgb, var(--accent) 20%, transparent);
}
/* Admin: 2-column grid */
#view-admin:not(.hidden) .section {