diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/LICENSE @@ -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 diff --git a/README.md b/README.md index 852c948..5ed6ccb 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.2-16a34a?style=flat-square)](#-schnellstart) +[![Version](https://img.shields.io/badge/Version-v0.3-16a34a?style=flat-square)](#-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.
Gebaut für Klarheit, Geschwindigkeit und digitale Souveränität. diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c0f45f8..0cc2664 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -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", diff --git a/frontend/package.json b/frontend/package.json index 2d22bc8..f575e46 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,8 @@ { "name": "mindsift-frontend", "private": true, - "version": "0.2.0", + "version": "0.3.0", + "license": "Unlicense", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/components/AboutModal.tsx b/frontend/src/components/AboutModal.tsx index f1b24d5..5c5044a 100644 --- a/frontend/src/components/AboutModal.tsx +++ b/frontend/src/components/AboutModal.tsx @@ -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 }) => ( diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index f89107d..e34d886 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -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)', diff --git a/screenshots/Listen_desktop.png b/screenshots/Listen_desktop.png index 42e2749..c478202 100644 Binary files a/screenshots/Listen_desktop.png and b/screenshots/Listen_desktop.png differ diff --git a/screenshots/Mobile_Triage.png b/screenshots/Mobile_Triage.png index 21d99e8..94a9428 100644 Binary files a/screenshots/Mobile_Triage.png and b/screenshots/Mobile_Triage.png differ diff --git a/screenshots/Triage_desktop.png b/screenshots/Triage_desktop.png index e2bf035..db0996f 100644 Binary files a/screenshots/Triage_desktop.png and b/screenshots/Triage_desktop.png differ diff --git a/screenshots/aufgaben_desktop.png b/screenshots/aufgaben_desktop.png index 19c888f..8a46fcb 100644 Binary files a/screenshots/aufgaben_desktop.png and b/screenshots/aufgaben_desktop.png differ diff --git a/screenshots/workspace_desktop.png b/screenshots/workspace_desktop.png index 446d387..b8f8575 100644 Binary files a/screenshots/workspace_desktop.png and b/screenshots/workspace_desktop.png differ