From 85f19fc44760f82f0d848c259d2ead27752f967b Mon Sep 17 00:00:00 2001 From: Sandro Date: Mon, 2 Nov 2026 21:21:58 +0100 Subject: [PATCH 1/2] fix(tasks): Kanban columns get their full height right after stretching the board The one-row overflow correction was measured before the new height was on the page, so the two tall rows from before counted as overflow and squeezed the columns to their minimum until the window was resized. It now runs after the new height is committed (layout effect), and the board measures again when its width animation ends. Co-Authored-By: Claude Opus 5.5 --- frontend/src/features/triage/TasksView.tsx | 28 +++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/frontend/src/features/triage/TasksView.tsx b/frontend/src/features/triage/TasksView.tsx index 45c8ed3..2af2451 100644 --- a/frontend/src/features/triage/TasksView.tsx +++ b/frontend/src/features/triage/TasksView.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState, useRef, useMemo, useCallback } from 'react'; +import React, { useEffect, useLayoutEffect, useState, useRef, useMemo, useCallback } from 'react'; import { AnimatePresence, motion } from 'framer-motion'; import { Check, @@ -605,17 +605,33 @@ export const TasksView: React.FC = ({ const multi = tops.size > 1; setKanbanMultiRow(multi); setKanbanPerRow(colTops.filter((t) => t === Math.min(...colTops)).length); - if (multi) return; - // One row: take back what still overflows (paddings), so the page does not scroll - const over = area ? area.scrollHeight - area.clientHeight : document.documentElement.scrollHeight - window.innerHeight; - if (over > 0) setKanbanColHeight((h) => (h ? Math.max(KANBAN_MIN_COL_HEIGHT, h - over) : h)); }); }; fit(); + // The board's width animates when it is stretched to full width or back: measure again at the end + const board = kanbanBoardRef.current; + const onTransitionEnd = (e: TransitionEvent) => { + if (e.target === board) fit(); + }; window.addEventListener('resize', fit); - return () => window.removeEventListener('resize', fit); + board?.addEventListener('transitionend', onTransitionEnd); + return () => { + window.removeEventListener('resize', fit); + board?.removeEventListener('transitionend', onTransitionEnd); + }; }, [isKanban, isKanbanWide, boardColumns.length, selectedListId, loading]); + // One row on the desktop: take back what still overflows (paddings), so the page does not scroll. Measured + // only once the new height is on the page; measured right away, the old layout (e.g. two tall rows before + // stretching the board to full width) counted as overflow and squeezed the columns to their minimum. + useLayoutEffect(() => { + if (!kanbanColHeight || kanbanMultiRow || kanbanPhoneSnap) return; + const area = kanbanBoardRef.current?.closest('[data-app-scroll]'); + if (!area) return; + const over = area.scrollHeight - area.clientHeight; + if (over > 0) setKanbanColHeight((h) => (h ? Math.max(KANBAN_MIN_COL_HEIGHT, h - over) : h)); + }, [kanbanColHeight, kanbanMultiRow, kanbanPhoneSnap]); + // Several rows: one wheel step moves to the next row (or back up to the previous row / the page top), // smoothly. The browser's own snapping goes back to the nearest point, so a wheel step shorter than a row // never got past the first one. A column whose cards can still scroll that way scrolls first; Ctrl + From 5b711730a7eb1313229d6dcedfe2f1687d50ef62 Mon Sep 17 00:00:00 2001 From: Sandro Date: Mon, 2 Nov 2026 21:21:58 +0100 Subject: [PATCH 2/2] chore: release v0.63.2 Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 8 +++++++- README.md | 2 +- frontend/package-lock.json | 4 ++-- frontend/package.json | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b34faaf..096f097 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V ## [Unreleased] +## [0.63.2] - 2026-11-02 + +### Fixed +- Kanban: Nach „Board auf volle Breite strecken“ waren die Spalten nur etwa halb so hoch wie der Platz, bis man das Fenster in der Größe änderte. Jetzt haben sie sofort die volle Höhe. + ## [0.63.1] - 2026-11-02 ### Fixed @@ -907,7 +912,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.63.1...dev +[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.63.2...dev +[0.63.2]: https://git.dsit.me/sandrodach/MindSift/compare/v0.63.1...v0.63.2 [0.63.1]: https://git.dsit.me/sandrodach/MindSift/compare/v0.63.0...v0.63.1 [0.63.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.62.0...v0.63.0 [0.62.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.61.0...v0.62.0 diff --git a/README.md b/README.md index d3217ef..0bfe134 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.63.1-16a34a?style=flat-square)](CHANGELOG.md) +[![Version](https://img.shields.io/badge/Version-v0.63.2-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 9b92804..db2b0a1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mindsift-frontend", - "version": "0.63.1", + "version": "0.63.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mindsift-frontend", - "version": "0.63.1", + "version": "0.63.2", "license": "AGPL-3.0-only", "dependencies": { "@fontsource-variable/inter": "5.3.0", diff --git a/frontend/package.json b/frontend/package.json index b45a875..4cbc585 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "mindsift-frontend", "private": true, - "version": "0.63.1", + "version": "0.63.2", "license": "AGPL-3.0-only", "type": "module", "scripts": {