fix(ui): die Seite rechnet die Höhe der HoneyOS-Leiste ab

Die Leiste liegt fest am oberen Rand und schiebt den Inhalt herunter. Wer
danach noch mit 100vh rechnete, war genau um ihre Höhe zu hoch — am Rechner
eine Bildlaufleiste, die es vorher nicht gab. Und wer selbst fest am oberen
Rand klebte (Seitenleiste am Handy, Vorschau, Office), lag darunter und war
verdeckt.

--honeybar-h setzt die Leiste selbst auf <html>; ohne sie ist der Wert 0 und
alles bleibt wie zuvor. Drei Hilfsklassen in index.css halten das an einer
Stelle zusammen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-24 23:40:34 +02:00
1 parent 57156a6394
commit d6b9d6a1ce
8 files changed
+20 -8

No files matched your search

+1 -1
View File
@@ -45,7 +45,7 @@ function AuthedApp() {
if (loading) { if (loading) {
return ( return (
<div style={{ minHeight: '100vh', display: 'flex', alignItems: 'center', justifyContent: 'center' }}> <div className="aether-minvh" style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
<div style={{ <div style={{
width: 32, height: 32, width: 32, height: 32,
border: '2px solid var(--color-primary)', border: '2px solid var(--color-primary)',
+1 -1
View File
@@ -172,7 +172,7 @@ export default function FilePreview({ file, onPrev, onNext, onClose, onSaved, se
<div <div
onClick={tryClose} onClick={tryClose}
style={{ style={{
position: 'fixed', inset: 0, zIndex: 100, position: 'fixed', inset: 'var(--honeybar-h) 0 0 0', zIndex: 100,
background: 'rgba(0,0,0,0.82)', background: 'rgba(0,0,0,0.82)',
display: 'flex', flexDirection: 'column', display: 'flex', flexDirection: 'column',
}} }}
+1 -1
View File
@@ -53,7 +53,7 @@ export default function OfficeEditor({ file, onClose }: {
return ( return (
<div style={{ <div style={{
position: 'fixed', inset: 0, zIndex: 120, position: 'fixed', inset: 'var(--honeybar-h) 0 0 0', zIndex: 120,
background: 'var(--color-background)', display: 'flex', flexDirection: 'column', background: 'var(--color-background)', display: 'flex', flexDirection: 'column',
}}> }}>
<div style={{ <div style={{
+1 -1
View File
@@ -61,7 +61,7 @@ export default function Shell({ user, onLogout, onUserChanged }: Props) {
onLogout, onLogout,
onOpenSidebar: () => setSidebarOpen(true), onOpenSidebar: () => setSidebarOpen(true),
}}> }}>
<div style={{ display: 'flex', height: '100vh', overflow: 'hidden' }}> <div className="aether-vh" style={{ display: 'flex', overflow: 'hidden' }}>
{/* Mobile overlay */} {/* Mobile overlay */}
{sidebarOpen && ( {sidebarOpen && (
<div <div
+2 -2
View File
@@ -761,14 +761,14 @@ export default function Sidebar({ user, view, activeTagId, onOpenTag, onTrashDro
flex-direction: column; flex-direction: column;
background: var(--color-surface); background: var(--color-surface);
border-right: 1px solid var(--color-border); border-right: 1px solid var(--color-border);
height: 100vh; height: calc(100vh - var(--honeybar-h));
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
} }
@media (max-width: 767px) { @media (max-width: 767px) {
.aether-sidebar { .aether-sidebar {
position: fixed; position: fixed;
top: 0; left: 0; top: var(--honeybar-h); left: 0;
z-index: 50; z-index: 50;
transform: translateX(-100%); transform: translateX(-100%);
transition: transform 0.2s ease; transition: transform 0.2s ease;
+12
View File
@@ -60,8 +60,20 @@ body {
--safe-top: 0px; --safe-top: 0px;
--safe-bottom: 0px; --safe-bottom: 0px;
--safe-left: 0px; --safe-left: 0px;
/* Höhe der HoneyOS-Leiste. Sie setzt den Wert selbst auf <html>, sobald sie
da ist; hier steht er, damit calc() auch ohne sie aufgeht. */
--honeybar-h: 0px;
} }
/* Die Leiste liegt fest am oberen Rand und schiebt den Seiteninhalt herunter.
Wer mit der vollen Fensterhöhe rechnet, muss sie abziehen — sonst ist die
Seite genau um die Leistenhöhe zu hoch und bekommt eine Bildlaufleiste.
Wer fest am oberen Rand klebt, muss unter ihr anfangen — sonst verdeckt sie
ihn (am Handy fällt das sofort auf, dort ist jede Zeile kostbar). */
.aether-vh { height: calc(100vh - var(--honeybar-h)); }
.aether-minvh { min-height: calc(100vh - var(--honeybar-h)); }
.aether-full { position: fixed; inset: var(--honeybar-h) 0 0 0; }
@media (display-mode: standalone) { @media (display-mode: standalone) {
:root { :root {
--safe-top: env(safe-area-inset-top, 0px); --safe-top: env(safe-area-inset-top, 0px);
+1 -1
View File
@@ -34,7 +34,7 @@ export default function LoginPage({ onLogin }: Props) {
} }
return ( return (
<div className="min-h-screen flex items-center justify-center px-4"> <div className="aether-minvh flex items-center justify-center px-4">
<div className="w-full max-w-sm"> <div className="w-full max-w-sm">
{/* Logo / branding */} {/* Logo / branding */}
<div className="text-center mb-8"> <div className="text-center mb-8">
+1 -1
View File
@@ -59,7 +59,7 @@ export default function SharePage({ token }: Props) {
return ( return (
<div style={{ <div style={{
minHeight: '100vh', minHeight: 'calc(100vh - var(--honeybar-h))',
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
alignItems: 'center', alignItems: 'center',