Merge dev into main (v0.63.2)
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 30s

This commit is contained in:
sandrodach committed 2026-11-02 21:24:02 +01:00
commit d524b3d9ac
5 files changed
+33 -11

No files matched your search

+7 -1
View File
@@ -6,6 +6,11 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V
## [Unreleased] ## [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 ## [0.63.1] - 2026-11-02
### Fixed ### 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. - 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. - 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.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.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 [0.62.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.61.0...v0.62.0
+1 -1
View File
@@ -6,7 +6,7 @@
[![Self-Hosted](https://img.shields.io/badge/100%25-Self--Hosted-2563eb?style=flat-square)](#) [![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) [![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) [![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. **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.
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "mindsift-frontend", "name": "mindsift-frontend",
"version": "0.63.1", "version": "0.63.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "mindsift-frontend", "name": "mindsift-frontend",
"version": "0.63.1", "version": "0.63.2",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"dependencies": { "dependencies": {
"@fontsource-variable/inter": "5.3.0", "@fontsource-variable/inter": "5.3.0",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "mindsift-frontend", "name": "mindsift-frontend",
"private": true, "private": true,
"version": "0.63.1", "version": "0.63.2",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"type": "module", "type": "module",
"scripts": { "scripts": {
+22 -6
View File
@@ -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 { AnimatePresence, motion } from 'framer-motion';
import { import {
Check, Check,
@@ -605,17 +605,33 @@ export const TasksView: React.FC<TasksViewProps> = ({
const multi = tops.size > 1; const multi = tops.size > 1;
setKanbanMultiRow(multi); setKanbanMultiRow(multi);
setKanbanPerRow(colTops.filter((t) => t === Math.min(...colTops)).length); 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(); 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); 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]); }, [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<HTMLElement>('[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), // 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 // 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 + // never got past the first one. A column whose cards can still scroll that way scrolls first; Ctrl +