Merge dev into main for v0.3
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m23s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No files matched your search
@@ -0,0 +1,24 @@
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <https://unlicense.org>
|
||||
@@ -6,7 +6,7 @@
|
||||
[](#)
|
||||
[](#-schnellstart)
|
||||
[](#-deine-daten-gehören-dir)
|
||||
[](#-schnellstart)
|
||||
[](#-schnellstart)
|
||||
|
||||
**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.
|
||||
|
||||
@@ -128,7 +128,7 @@ Minimal:
|
||||
```yaml
|
||||
services:
|
||||
mindsift:
|
||||
image: git.dsit.me/sandrodach/mindsift:stable # oder feste Version (:v0.2); :latest = main, :dev = Entwicklungsstand
|
||||
image: git.dsit.me/sandrodach/mindsift:stable # oder feste Version (:v0.3); :latest = main, :dev = Entwicklungsstand
|
||||
restart: unless-stopped
|
||||
ports: ["8080:8080"]
|
||||
volumes: ["./data:/data"]
|
||||
@@ -185,7 +185,7 @@ npm run test:run # Komponententests (Vitest, jsdom)
|
||||
npm run build # Produktions-Build
|
||||
cd ..
|
||||
e2e/run.sh # Browser-Tests (Playwright, zwei Benutzer) gegen ein frisch gebautes Image
|
||||
APP_VERSION=v0.2 e2e/screenshots.sh # Screenshots dieser README neu erzeugen (Demo-Daten)
|
||||
APP_VERSION=v0.3 e2e/screenshots.sh # Screenshots dieser README neu erzeugen (Demo-Daten)
|
||||
```
|
||||
|
||||
Für das Binary wird das gebaute Frontend nach `cmd/server/dist` kopiert (`go:embed`); das mehrstufige `Dockerfile` erledigt das und führt Typprüfung, Frontend-Tests, Go-Vet und Go-Tests beim Image-Build aus.
|
||||
@@ -203,13 +203,13 @@ Die technische Doku liegt unter [Doku/](Doku/README.md): Architektur, Datenbank,
|
||||
## 🔒 Deine Daten gehören dir
|
||||
|
||||
* Selbst gehostet, keine Telemetrie, keine Fremddienste. Ausgehende Verbindungen gibt es nur zu den Alarm-Zielen, die du selbst einrichtest (SMTP, Discord, Webhook).
|
||||
* Alle Inhalte liegen in einer einzigen SQLite-Datei; Notizen lassen sich als Markdown exportieren, alle Daten eines Benutzers als JSON.
|
||||
* Alle Inhalte liegen in einer einzigen SQLite-Datei; der ganze Workspace lässt sich als Obsidian-kompatibles Markdown-Archiv (ZIP) exportieren, alle Daten eines Benutzers als JSON.
|
||||
|
||||
---
|
||||
|
||||
## 📄 Lizenz
|
||||
|
||||
Im Repository liegt derzeit keine `LICENSE`-Datei; die Lizenz ist damit nicht festgelegt.
|
||||
MindSift ist gemeinfrei unter [The Unlicense](LICENSE): Du darfst den Code ohne jede Bedingung nutzen, ändern, weitergeben und verkaufen, auch ohne Namensnennung. Es gibt keine Gewährleistung.
|
||||
|
||||
<div align="center">
|
||||
<sub>Gebaut für Klarheit, Geschwindigkeit und digitale Souveränität.</sub>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "mindsift-frontend",
|
||||
"version": "0.2.0",
|
||||
"version": "0.3.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "mindsift-frontend",
|
||||
"version": "0.2.0",
|
||||
"version": "0.3.0",
|
||||
"dependencies": {
|
||||
"@types/prismjs": "^1.26.6",
|
||||
"emoji-picker-react": "^4.12.0",
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"name": "mindsift-frontend",
|
||||
"private": true,
|
||||
"version": "0.2.0",
|
||||
"version": "0.3.0",
|
||||
"license": "Unlicense",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -5,7 +5,7 @@ import { ReadingModal } from './ReadingModal';
|
||||
|
||||
// Project facts shown in "Über MindSift"; change here when the repository or license changes
|
||||
export const PROJECT_REPO_URL = 'https://git.dsit.me/sandrodach/MindSift';
|
||||
export const PROJECT_LICENSE = 'Noch nicht festgelegt (keine LICENSE-Datei im Repository)';
|
||||
export const PROJECT_LICENSE = 'The Unlicense – gemeinfrei, ohne Bedingungen';
|
||||
|
||||
export const AboutModal: React.FC<{ onClose: () => void }> = ({ onClose }) => (
|
||||
<ReadingModal title="Über MindSift" onClose={onClose}>
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
// Theme colours are CSS variables, so Tailwind cannot apply opacity modifiers (bg-accent/15) by itself.
|
||||
// v() mixes the variable with transparent for a modifier; plain classes keep the bare variable, so only
|
||||
// the tints depend on color-mix() support.
|
||||
const v = (name) => ({ opacityValue }) =>
|
||||
opacityValue === undefined || opacityValue === '1' || String(opacityValue).startsWith('var(')
|
||||
? `var(${name})`
|
||||
: `color-mix(in srgb, var(${name}) calc(${opacityValue} * 100%), transparent)`;
|
||||
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
export default {
|
||||
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
|
||||
@@ -5,48 +13,57 @@ export default {
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
canvas: 'var(--bg-app)',
|
||||
canvas: v('--bg-app'),
|
||||
panel: {
|
||||
DEFAULT: 'var(--bg-panel)',
|
||||
elevated: 'var(--bg-panel-elevated)',
|
||||
hover: 'var(--bg-panel-hover)',
|
||||
DEFAULT: v('--bg-panel'),
|
||||
elevated: v('--bg-panel-elevated'),
|
||||
hover: v('--bg-panel-hover'),
|
||||
},
|
||||
surface: {
|
||||
DEFAULT: 'var(--bg-panel)',
|
||||
elevated: 'var(--bg-panel-elevated)',
|
||||
hover: 'var(--bg-panel-hover)',
|
||||
border: 'var(--border-color)',
|
||||
DEFAULT: v('--bg-panel'),
|
||||
elevated: v('--bg-panel-elevated'),
|
||||
hover: v('--bg-panel-hover'),
|
||||
border: v('--border-color'),
|
||||
},
|
||||
input: 'var(--bg-input)',
|
||||
overlay: 'var(--bg-overlay)',
|
||||
code: 'var(--bg-code)',
|
||||
main: 'var(--text-main)',
|
||||
muted: 'var(--text-muted)',
|
||||
faint: 'var(--text-faint)',
|
||||
'on-accent': 'var(--text-on-accent)',
|
||||
input: v('--bg-input'),
|
||||
overlay: v('--bg-overlay'),
|
||||
code: v('--bg-code'),
|
||||
main: v('--text-main'),
|
||||
muted: v('--text-muted'),
|
||||
faint: v('--text-faint'),
|
||||
'on-accent': v('--text-on-accent'),
|
||||
accent: {
|
||||
DEFAULT: 'var(--accent-primary)',
|
||||
hover: 'var(--accent-hover)',
|
||||
dim: 'var(--accent-dim)',
|
||||
border: 'var(--accent-border)',
|
||||
DEFAULT: v('--accent-primary'),
|
||||
hover: v('--accent-hover'),
|
||||
dim: v('--accent-dim'),
|
||||
border: v('--accent-border'),
|
||||
},
|
||||
brand: {
|
||||
DEFAULT: 'var(--accent-primary)',
|
||||
hover: 'var(--accent-hover)',
|
||||
dark: 'var(--accent-primary)',
|
||||
DEFAULT: v('--accent-primary'),
|
||||
hover: v('--accent-hover'),
|
||||
dark: v('--accent-primary'),
|
||||
},
|
||||
status: {
|
||||
ok: 'var(--color-success)',
|
||||
'ok-bg': 'var(--bg-success)',
|
||||
'ok-border': 'var(--border-success)',
|
||||
err: 'var(--color-danger)',
|
||||
'err-bg': 'var(--bg-danger)',
|
||||
'err-border': 'var(--border-danger)',
|
||||
warn: 'var(--color-warning)',
|
||||
'warn-bg': 'var(--bg-warning)',
|
||||
'warn-border': 'var(--border-warning)',
|
||||
ok: v('--color-success'),
|
||||
'ok-bg': v('--bg-success'),
|
||||
'ok-border': v('--border-success'),
|
||||
err: v('--color-danger'),
|
||||
'err-bg': v('--bg-danger'),
|
||||
'err-border': v('--border-danger'),
|
||||
warn: v('--color-warning'),
|
||||
'warn-bg': v('--bg-warning'),
|
||||
'warn-border': v('--border-warning'),
|
||||
info: v('--accent-hover'),
|
||||
danger: v('--color-danger'),
|
||||
},
|
||||
border: 'var(--border-color)',
|
||||
border: v('--border-color'),
|
||||
// Aliases for names used in components (e.g. avatar initials), mapped to theme colours
|
||||
primary: v('--accent-primary'),
|
||||
secondary: v('--text-muted'),
|
||||
info: v('--accent-hover'),
|
||||
success: v('--color-success'),
|
||||
warning: v('--color-warning'),
|
||||
danger: v('--color-danger'),
|
||||
},
|
||||
borderColor: {
|
||||
DEFAULT: 'var(--border-color)',
|
||||
|
||||
|
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 228 KiB |
|
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 254 KiB |
|
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 344 KiB |
|
Before Width: | Height: | Size: 362 KiB After Width: | Height: | Size: 362 KiB |