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/frontend/src/App.tsx b/frontend/src/App.tsx index db401f8..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,16 +1009,16 @@ export const App: React.FC = () => { - {/* Desktop Header: 3-column Layout (Logo, InstantCaptureBar, Profile Pill). From md a grid with equal - outer columns, so the capture bar stays exactly centred whatever name or status stands on the right */} -
+ {/* 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 md:justify-self-start" + className="h-9 flex items-center gap-2.5 cursor-pointer group select-none flex-shrink-0 justify-self-start" >
@@ -1040,7 +1041,7 @@ export const App: React.FC = () => {
{/* Quick-Capture Input Bubble directly in Header (above Tabs) */} -
+
{
{/* User Profile Pill & Dropdown Menu */} -
+