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)
|
[](#-schnellstart)
|
||||||
[](#-deine-daten-gehören-dir)
|
[](#-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.
|
**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
|
```yaml
|
||||||
services:
|
services:
|
||||||
mindsift:
|
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
|
restart: unless-stopped
|
||||||
ports: ["8080:8080"]
|
ports: ["8080:8080"]
|
||||||
volumes: ["./data:/data"]
|
volumes: ["./data:/data"]
|
||||||
@@ -185,7 +185,7 @@ npm run test:run # Komponententests (Vitest, jsdom)
|
|||||||
npm run build # Produktions-Build
|
npm run build # Produktions-Build
|
||||||
cd ..
|
cd ..
|
||||||
e2e/run.sh # Browser-Tests (Playwright, zwei Benutzer) gegen ein frisch gebautes Image
|
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.
|
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
|
## 🔒 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).
|
* 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
|
## 📄 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">
|
<div align="center">
|
||||||
<sub>Gebaut für Klarheit, Geschwindigkeit und digitale Souveränität.</sub>
|
<sub>Gebaut für Klarheit, Geschwindigkeit und digitale Souveränität.</sub>
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "mindsift-frontend",
|
"name": "mindsift-frontend",
|
||||||
"version": "0.2.0",
|
"version": "0.3.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "mindsift-frontend",
|
"name": "mindsift-frontend",
|
||||||
"version": "0.2.0",
|
"version": "0.3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/prismjs": "^1.26.6",
|
"@types/prismjs": "^1.26.6",
|
||||||
"emoji-picker-react": "^4.12.0",
|
"emoji-picker-react": "^4.12.0",
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "mindsift-frontend",
|
"name": "mindsift-frontend",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.2.0",
|
"version": "0.3.0",
|
||||||
|
"license": "Unlicense",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { ReadingModal } from './ReadingModal';
|
|||||||
|
|
||||||
// Project facts shown in "Über MindSift"; change here when the repository or license changes
|
// 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_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 }) => (
|
export const AboutModal: React.FC<{ onClose: () => void }> = ({ onClose }) => (
|
||||||
<ReadingModal title="Über MindSift" onClose={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} */
|
/** @type {import('tailwindcss').Config} */
|
||||||
export default {
|
export default {
|
||||||
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
|
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
|
||||||
@@ -5,48 +13,57 @@ export default {
|
|||||||
theme: {
|
theme: {
|
||||||
extend: {
|
extend: {
|
||||||
colors: {
|
colors: {
|
||||||
canvas: 'var(--bg-app)',
|
canvas: v('--bg-app'),
|
||||||
panel: {
|
panel: {
|
||||||
DEFAULT: 'var(--bg-panel)',
|
DEFAULT: v('--bg-panel'),
|
||||||
elevated: 'var(--bg-panel-elevated)',
|
elevated: v('--bg-panel-elevated'),
|
||||||
hover: 'var(--bg-panel-hover)',
|
hover: v('--bg-panel-hover'),
|
||||||
},
|
},
|
||||||
surface: {
|
surface: {
|
||||||
DEFAULT: 'var(--bg-panel)',
|
DEFAULT: v('--bg-panel'),
|
||||||
elevated: 'var(--bg-panel-elevated)',
|
elevated: v('--bg-panel-elevated'),
|
||||||
hover: 'var(--bg-panel-hover)',
|
hover: v('--bg-panel-hover'),
|
||||||
border: 'var(--border-color)',
|
border: v('--border-color'),
|
||||||
},
|
},
|
||||||
input: 'var(--bg-input)',
|
input: v('--bg-input'),
|
||||||
overlay: 'var(--bg-overlay)',
|
overlay: v('--bg-overlay'),
|
||||||
code: 'var(--bg-code)',
|
code: v('--bg-code'),
|
||||||
main: 'var(--text-main)',
|
main: v('--text-main'),
|
||||||
muted: 'var(--text-muted)',
|
muted: v('--text-muted'),
|
||||||
faint: 'var(--text-faint)',
|
faint: v('--text-faint'),
|
||||||
'on-accent': 'var(--text-on-accent)',
|
'on-accent': v('--text-on-accent'),
|
||||||
accent: {
|
accent: {
|
||||||
DEFAULT: 'var(--accent-primary)',
|
DEFAULT: v('--accent-primary'),
|
||||||
hover: 'var(--accent-hover)',
|
hover: v('--accent-hover'),
|
||||||
dim: 'var(--accent-dim)',
|
dim: v('--accent-dim'),
|
||||||
border: 'var(--accent-border)',
|
border: v('--accent-border'),
|
||||||
},
|
},
|
||||||
brand: {
|
brand: {
|
||||||
DEFAULT: 'var(--accent-primary)',
|
DEFAULT: v('--accent-primary'),
|
||||||
hover: 'var(--accent-hover)',
|
hover: v('--accent-hover'),
|
||||||
dark: 'var(--accent-primary)',
|
dark: v('--accent-primary'),
|
||||||
},
|
},
|
||||||
status: {
|
status: {
|
||||||
ok: 'var(--color-success)',
|
ok: v('--color-success'),
|
||||||
'ok-bg': 'var(--bg-success)',
|
'ok-bg': v('--bg-success'),
|
||||||
'ok-border': 'var(--border-success)',
|
'ok-border': v('--border-success'),
|
||||||
err: 'var(--color-danger)',
|
err: v('--color-danger'),
|
||||||
'err-bg': 'var(--bg-danger)',
|
'err-bg': v('--bg-danger'),
|
||||||
'err-border': 'var(--border-danger)',
|
'err-border': v('--border-danger'),
|
||||||
warn: 'var(--color-warning)',
|
warn: v('--color-warning'),
|
||||||
'warn-bg': 'var(--bg-warning)',
|
'warn-bg': v('--bg-warning'),
|
||||||
'warn-border': 'var(--border-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: {
|
borderColor: {
|
||||||
DEFAULT: 'var(--border-color)',
|
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 |