import type { ReactNode } from 'react' import UserMenu, { useSidebarToggle } from './UserMenu' import { wideEnough } from '../breakpoints' /** * Die Kopfleiste jeder Ansicht. * * Vorher gab es zwei Muster nebeneinander: Dateien, Papierkorb und * Freigabe-Links hatten eine feste Leiste, „Geteilt mit mir", Admin und Profil * dagegen eine große Überschrift im Scrollbereich. Beim Umschalten sprang * dadurch der Inhalt – und schon zwischen den drei Leisten war die Höhe * unterschiedlich, weil sie sich aus dem jeweils höchsten Bedienelement ergab. * * Deshalb hier eine feste Höhe statt einer gewachsenen: Die Leiste ist überall * gleich hoch, egal was darin steht. */ export const headerHeight = 57 /** * Ab dieser Breite passt alles in eine Zeile. * * Darunter wird umgebrochen statt gequetscht: Auf 390 px stand die Brotkrume * als einzelner Strich da, das Suchfeld schob sich über die Sortierauswahl, der * Ansichts-Umschalter war ganz verschwunden und der Nutzerbereich am rechten * Rand abgeschnitten. Eine Zeile, die nicht umbrechen kann, quetscht – und * ausgerechnet auf dem Gerät, mit dem man unterwegs einen Beleg sucht. * * Dieselbe Grenze schaltet die Seitenleiste um; sie steht deshalb in * `breakpoints.ts` und nicht mehr hier. Re-exportiert, weil sie hier gesucht * wird. */ export { wideEnough } interface Props { /** Strichsymbol, 18 × 18 – dasselbe wie in der Seitenleiste. */ icon?: ReactNode title?: string /** Nebenangabe in gedämpfter Schrift, etwa „12 items". */ meta?: ReactNode /** Statt Symbol und Titel: eigener Inhalt links, z. B. die Brotkrumen. */ left?: ReactNode /** Bedienelemente – sitzen rechts. */ children?: ReactNode } export default function PageHeader({ icon, title, meta, left, children }: Props) { const openSidebar = useSidebarToggle() return (
{/* Die Seitenleiste wird auf dem Handy von hier geöffnet. Vorher stand dafür eine **zweite** Leiste darüber, die nichts weiter enthielt als dieses Symbol und den Namen der Cloud. Gemessen kostete sie 57 der 915 Pixel Höhe – und der Name stand ohnehin schon in der Seitenleiste, die sie öffnete. */} {openSidebar && ( )} {left ?? ( <> {icon && ( // strokeLinecap/-join hier statt an jedem Symbol: Beide Eigenschaften // vererben sich, und ein Symbol ohne eigene Angabe übernimmt sie // damit. Vorher hatten Papierkorb und Freigabe-Links eckige Enden, // „Geteilt mit mir" runde – nebeneinander wirkt das unruhig. {icon} )} {title && ( {title} )} )} {meta && ( {meta} )} {/* Rechte Gruppe: erst die Bedienelemente der Ansicht, dann – durch eine Trennlinie abgesetzt – der Nutzerbereich. Er steht bewusst in *jeder* Ansicht an derselben Stelle; ein Zugang, den man je nach Seite woanders sucht, ist keiner. */}
{children}
{/* Der Nutzerbereich steht **außerhalb** der Bedienelemente. Auf dem Handy gehört er in die Titelzeile nach rechts – dorthin, wo man den eigenen Zugang sucht. Vorher stand er in der Reihe mit „+ Folder" und „Upload" und sah dort aus wie ein weiterer Knopf für eine Handlung, die er nicht ist. Umgestellt wird über `order`, nicht über einen zweiten Baum: Zwei Nutzermenüs nebeneinander hießen zwei Klappmenüs, von denen eines immer versteckt ist. */}
{children && ( )}
) }