diff --git a/AGENTS.md b/AGENTS.md index a5dcc63..2d68f31 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -85,7 +85,7 @@ Fremde Branches (z. B. von anderen Agenten) werden vor dem Mergen geprüft. ## Oberfläche - **Einheitliche Bedienelemente:** Personen-Suche, Profilbild-Stapel, Zähler und weitere Muster stehen in [Doku/ui-patterns.md](Doku/ui-patterns.md). Vorhandene Komponenten verwenden statt neuer Varianten; neue gemeinsame Muster dort ergänzen. -- **Handy und Desktop:** Unter `sm` ist Handy-Layout, ab `lg` die volle Desktop-Ansicht (z. B. Seitenleiste neben der Notiz). Wird nur das Handy geändert, bleiben die Werte ab `sm`/`lg` exakt wie vorher. +- **Handy und Desktop:** Unter `sm` ist Handy-Layout, ab `lg` die volle Desktop-Ansicht (z. B. Seitenleiste neben der Notiz). `sm` liegt bei **768 px**, nicht bei Tailwinds 640 px (Handys quer und kleine Tablets bekommen das Handy-Layout); `md` ist gleich `sm`. Im Code dafür `isPhoneWidth()` aus `lib/breakpoints.ts` verwenden, keine feste Pixelzahl. Wird nur das Handy geändert, bleiben die Werte ab `sm`/`lg` exakt wie vorher. - **Antippen am Handy:** Ziele mindestens 44 px hoch (`h-11 sm:h-…`). Auf reinen Touch-Geräten gibt es kein HTML5-Drag-&-Drop; Kanban nutzt dafür `useKanbanTouchDrag`, die Notizen die Leiste über der Tastatur (`MobileOutlineBar`). - **Themes:** Farben nur über die Theme-Variablen bzw. Klassen (`bg-panel`, `bg-canvas`, `text-main`, `text-muted`, `border-border`, `bg-accent` …), keine festen Farben. Rahmen mit `bg-panel`/`bg-canvas` bekommen die Ecken des Themes automatisch; liegt darin ein Kopfbereich mit eigenem Hintergrund, braucht der Rahmen `overflow-hidden`, sonst ragen bei runden Ecken die Kanten heraus. - **Installierte App (PWA):** Manifest-Änderungen (Farben, Verknüpfungen) übernimmt Android erst, wenn es die App aktualisiert (bis etwa einen Tag) oder nach Neuinstallation; normaler App-Code kommt beim nächsten Start. Ändert sich der Cache-Inhalt des Service Workers, `VERSION` in `frontend/public/sw.js` erhöhen. diff --git a/CHANGELOG.md b/CHANGELOG.md index 31dded0..8c83c02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V ## [Unreleased] +## [0.57.0] - 2026-11-02 + +### Changed +- Die Handy-Ansicht gilt jetzt bis 767 px Breite (bisher bis 639 px). Handys im Querformat, kleine Tablets im Hochformat (z. B. iPad mini) und schmale Fenster bekommen damit die Ansicht mit großen Tippzielen und unterer Navigation statt einer gedrängten Desktop-Ansicht. + +### Fixed +- Desktop: Die Quick-Dump-Leiste steht genau mittig im Kopf und bleibt stehen, wenn der Verbindungsstatus wechselt (z. B. von „online“ zu „eingeschränkt“) oder der Name lang ist. + ## [0.56.0] - 2026-11-02 ### Added @@ -828,7 +836,8 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V - Geteilte Listen (Einkaufs-, Pack- und Checklisten) mit `#Kategorie`-Gruppierung, Mengenangaben und Echtzeit-Abhaken. - Benutzer-, Gruppen- und Admin-Verwaltung (Ersteinrichtungs-Assistent, Einladungscodes, Profilbilder, persönliche API-Keys & Webhook-Ingest `/api/v1/webhooks/ingest`, JSON-Datenexport) sowie CSS-Theme-Engine mit 4 Themes (`Dark`, `Light`, `High Contrast`, `Soft`) und PWA-Unterstützung. -[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.56.0...dev +[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.57.0...dev +[0.57.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.56.0...v0.57.0 [0.56.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.55.0...v0.56.0 [0.55.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.54.0...v0.55.0 [0.54.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.53.0...v0.54.0 diff --git a/README.md b/README.md index 24d6051..949fdcc 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Self-Hosted](https://img.shields.io/badge/100%25-Self--Hosted-2563eb?style=flat-square)](#) [![Docker](https://img.shields.io/badge/Deployment-Single%20Container-2496ed?style=flat-square&logo=docker&logoColor=white)](#-schnellstart) [![SQLite](https://img.shields.io/badge/Daten-SQLite-003b57?style=flat-square&logo=sqlite&logoColor=white)](#-deine-daten-gehören-dir) -[![Version](https://img.shields.io/badge/Version-v0.56.0-16a34a?style=flat-square)](CHANGELOG.md) +[![Version](https://img.shields.io/badge/Version-v0.57.0-16a34a?style=flat-square)](CHANGELOG.md) **MindSift** ist eine selbst gehostete Schaltstelle für spontane Gedanken, Aufgaben mit Kanban-Board, hierarchische Outliner-Notizen, die mehrere Personen gleichzeitig bearbeiten können, und gemeinsame Listen. Alles läuft als ein einzelner Container mit eingebetteter SQLite-Datenbank, auf deinem eigenen Server. diff --git a/frontend/package-lock.json b/frontend/package-lock.json index fcc30a7..75e688a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mindsift-frontend", - "version": "0.56.0", + "version": "0.57.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mindsift-frontend", - "version": "0.56.0", + "version": "0.57.0", "license": "AGPL-3.0-only", "dependencies": { "@fontsource-variable/inter": "5.3.0", diff --git a/frontend/package.json b/frontend/package.json index 0cc5c76..aecf55a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "mindsift-frontend", "private": true, - "version": "0.56.0", + "version": "0.57.0", "license": "AGPL-3.0-only", "type": "module", "scripts": { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 6e8c3c8..5b5416b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -82,6 +82,7 @@ import { consumePendingShares, formatSharedThought } from './lib/shareTarget'; import { APP_VERSION } from './version'; import { readViewSession, writeViewSession } from './lib/viewSession'; import { setVoicePreference } from './lib/voice'; +import { isPhoneWidth } from './lib/breakpoints'; // Connection status at the profile (useConnectionState); full class names for Tailwind const CONNECTION_STATUS = { @@ -302,7 +303,7 @@ export const App: React.FC = () => { // pendingShortcut above re-runs this effect and must not cancel the timer) window.setTimeout(() => { if (target === 'triage') handleTriggerAddButton(); - else if (window.innerWidth < 640 || target === 'lists') primaryActionRef.current?.(); + else if (isPhoneWidth() || target === 'lists') primaryActionRef.current?.(); }, 400); }, [pendingShortcut, user?.id, activeTab]); @@ -465,7 +466,7 @@ export const App: React.FC = () => { // Immediately offer Web-App installation on mobile if not yet running as installed standalone app useEffect(() => { if (!user || isStandaloneApp) return; - if (window.innerWidth < 640 && !sessionStorage.getItem('mindsift_pwa_dismissed')) { + if (isPhoneWidth() && !sessionStorage.getItem('mindsift_pwa_dismissed')) { setShowPwaInstallModal(true); } }, [user?.id, isStandaloneApp]); @@ -828,7 +829,7 @@ export const App: React.FC = () => { const handleTriggerAddButton = () => { triggerHaptic(20); - if (window.innerWidth < 640) { + if (isPhoneWidth()) { openMobileTriageCapture(); } else { window.scrollTo({ top: 0, behavior: 'smooth' }); @@ -1008,15 +1009,16 @@ export const App: React.FC = () => { - {/* Desktop Header: 3-column Layout (Logo, InstantCaptureBar, Profile Pill) */} -
+ {/* Desktop Header: 3-column grid (Logo, InstantCaptureBar, Profile Pill) with equal outer columns, so + the capture bar stays exactly centred whatever name or status stands on the right */} +
{/* Logo & Headline */}
{ setActiveTab('triage'); handleTriggerAddButton(); }} - className="h-9 flex items-center gap-2.5 cursor-pointer group select-none flex-shrink-0" + className="h-9 flex items-center gap-2.5 cursor-pointer group select-none flex-shrink-0 justify-self-start" >
@@ -1039,7 +1041,7 @@ export const App: React.FC = () => {
{/* Quick-Capture Input Bubble directly in Header (above Tabs) */} -
+
{
{/* User Profile Pill & Dropdown Menu */} -
+