Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8c2775b
WIP
simonabler Mar 15, 2026
c656aa6
feat: migrate to NX monorepo — Angular 20 standalone + NestJS 11
claude Mar 15, 2026
5ba5f39
docs: add CLAUDE.md handoff context for Claude Code
Mar 15, 2026
0dc9b4f
feat: first migration
simonabler Mar 17, 2026
5923461
feat: first migration
simonabler Mar 17, 2026
6cd1f7e
test: add tests
simonabler Mar 17, 2026
ec71a22
test: add tests
simonabler Mar 17, 2026
93ae3cd
fest: design
simonabler Mar 18, 2026
2d2c4a4
feat: update
simonabler Mar 18, 2026
39ee257
fix: findinds 1 2
simonabler Mar 19, 2026
2294742
fix: some findings and improve funktions
simonabler Mar 22, 2026
de31e45
feat: configure pdfs Phase1
simonabler Mar 22, 2026
e481daf
feat: Phase 2
simonabler Mar 22, 2026
6995af1
Phase 3
simonabler Mar 23, 2026
e766a74
Phase 4
simonabler Mar 23, 2026
c0a08f3
Phase 5
simonabler Mar 23, 2026
4e6309f
feat: pdf upload template
simonabler Mar 23, 2026
b8e79e5
feat: add kpi total value
simonabler May 1, 2026
21a8554
feat: add dynamic article import
simonabler May 1, 2026
dd50e0a
feat: add onbarcodescaned
simonabler May 1, 2026
60aefe4
feat: add email and style to pdf
simonabler May 1, 2026
93e64df
feat: add deutsch language
simonabler May 1, 2026
ee07b44
feat: sort cutomers
simonabler May 1, 2026
315098e
feat: add sorting tabel in frontend only
simonabler May 1, 2026
e52abe5
feat: stock track fix
simonabler May 1, 2026
150d6c4
feat: WIP printer
simonabler May 1, 2026
9c824a2
feat: update config
simonabler May 15, 2026
b960a4f
feat: update env replace
simonabler May 15, 2026
f14ae6e
feat: withHash
simonabler May 15, 2026
f02b6d6
feat: add sql loggin
simonabler May 15, 2026
f7d6ad7
feat: add edit and delete annotation
simonabler May 15, 2026
b58e10b
feat: add clearance if no generated template is used
simonabler May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"permissions": {
"allow": [
"Bash(grep -i article find apps/server/src -name \"*.controller.ts\")"
]
}
}
139 changes: 139 additions & 0 deletions .claude/skills/abler-design/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
---
name: abler-design
description: >
Design- und Entwicklungs-Skill für das abler.tirol Ökosystem.
Verwende diesen Skill immer wenn du für Simon Abler eine neue Seite,
Komponente, Frontend, Landing Page oder UI-Element unter einer der
abler.tirol Subdomains erstellst oder bearbeitest — also für
abler.tirol, api.abler.tirol, barcode.abler.tirol, pdf.abler.tirol,
klara.abler.tirol, sims.abler.tirol oder jede neue *.abler.tirol Domain.
Auch beim Erstellen neuer Subdomains, beim Anpassen von Docker/nginx-Configs,
beim Schreiben von READMEs für abler.tirol Repos, oder wenn das Gespräch
Designentscheidungen für dieses Ökosystem betrifft. Trigger auch bei
Fragen wie "wie soll X bei abler.tirol aussehen" oder "erstelle mir
eine Seite im abler-Stil".
---

# abler.tirol — Design & Development Skill

Dieses Skill definiert das vollständige Design-System und die Entwicklungsregeln
für das `abler.tirol` Ökosystem. Es gilt für alle bestehenden und neuen Produkte.

---

## Schritt 1: Subdomain identifizieren

Bevor du anfängst, stelle fest für welche Subdomain du arbeitest.
Lies dann die entsprechende Referenzdatei:

| Subdomain | Referenzdatei | Produkt-Typ |
|---|---|---|
| `abler.tirol` | `references/abler-tirol.md` | Landing / Static |
| `api.abler.tirol` | `references/api.md` | API + Minimal-Frontend |
| `barcode.abler.tirol` | `references/barcode.md` | Pure Frontend |
| `pdf.abler.tirol` | `references/pdf.md` | Pure Frontend |
| `klara.abler.tirol` | `references/klara.md` | Fullstack |
| `sims.abler.tirol` | `references/sims.md` | Fullstack |
| Neue Subdomain | `references/new-product.md` | Checkliste |

**Neue Subdomain?** → Lies `references/new-product.md` für die Checkliste.

---

## Schritt 2: Universelle Regeln (gelten für ALLE Subdomains)

### Typografie — unveränderlich

```html
<!-- IMMER über api.abler.tirol — nie Google Fonts -->
<link rel="preconnect" href="https://api.abler.tirol" />
<link rel="stylesheet" href="https://api.abler.tirol/fonts/abler-stack.css" />
```

| Rolle | Font | Verwendung |
|---|---|---|
| Headlines | `DM Serif Display` | Hero-Titel, H1/H2 |
| Body / UI | `Inter` | Fließtext, Labels |
| Code / Mono | `DM Mono` | Tags, Badges, Code, Terminal |

```css
--text-display: clamp(3rem, 8vw, 6rem);
--text-h1: clamp(2.2rem, 5vw, 3.75rem);
--text-h2: clamp(1.8rem, 3.5vw, 3rem);
--text-body: 0.95rem;
--text-label: 0.72rem; /* DM Mono + uppercase + letter-spacing: 0.18em */
```

### Geteilte Neutrals

```css
:root {
--white: #ffffff;
--bg-light: #f7f7f4;
--bg-subtle: #fbfbf9;
--ink: #0f172a;
--ink-2: #475569;
--ink-3: #94a3b8;
--border: #e2e8f0;
--border-sub: rgba(226,232,240,0.7);
--radius-xl: 2rem;
--radius-lg: 1.5rem;
--shadow-card: 0 25px 80px -30px rgba(15,23,42,0.18);
--shadow-sm: 0 1px 3px rgba(15,23,42,0.06);
--sans: 'Inter', sans-serif;
--mono: 'DM Mono', monospace;
--serif: 'DM Serif Display', serif;
}
```

### Layout

- Max-Width: `72rem` · Section-Padding: `5rem` Desktop / `3rem` Mobile
- Seitenabstand: `1.5rem` Mobile · `2.5rem` Tablet+

### Komponenten

Buttons immer Pill-Form (`border-radius: 999px`), nie eckig.
Cards hover: `transform: translateY(-4px)` + Shadow.
Tags: `DM Mono`, `border-radius: 999px`.
Nav: sticky, max. 4–5 Einträge, Logo in `DM Mono uppercase`.

### Animationen

```css
@keyframes fadeUp { from { opacity:0; transform:translateY(18px); } to { opacity:1; transform:translateY(0); } }
/* Stagger: 0.05s–0.15s · max duration: 0.7s · kein Parallax, kein Bounce */
```

### Zweisprachigkeit DE/EN

```html
<body class="de">
<p data-lang="de">Text</p> <p data-lang="en">Text</p>
```
```css
[data-lang], span[data-lang] { display: none !important; }
body.de [data-lang="de"], body.de span[data-lang="de"] { display: revert !important; }
body.en [data-lang="en"], body.en span[data-lang="en"] { display: revert !important; }
body.de span[data-lang="de"], body.en span[data-lang="en"] { display: inline !important; }
```

### Docker / Traefik

Pure Frontend → `nginx:alpine`. Jede Domain bekommt einen **eigenen Traefik-Router**
(separates TLS-Zertifikat pro Domain, nie mehrere Domains in einem Router).

---

## Schritt 3: Subdomain-Referenz lesen

Lies jetzt die passende Datei aus `references/` für Farben, Charakter
und subdomain-spezifische Eigenheiten.

---

## Verbotsliste (alle Subdomains)

❌ Fonts von Google · ❌ Lila/Violette Gradienten · ❌ System-Fonts
❌ Eckige Buttons · ❌ `#000` als Textfarbe · ❌ >2 Akzentfarben gleichzeitig
❌ Hardcodierte Farbwerte · ❌ Überfüllte Nav · ❌ Parallax / Bounce
51 changes: 51 additions & 0 deletions .claude/skills/abler-design/references/abler-tirol.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# abler.tirol — Landing Page

## Charakter
Sachlich, übergeordnet, verbindend. Der Anker des Ökosystems.
Kein starker Farbakzent — die Subdomains bringen Farbe.

## Akzentfarben
```css
--accent-primary: #0f172a; /* Slate 900 */
--accent-secondary: #334155; /* Slate 700 */
```

## Produkttyp: Landing / Static
- Reines HTML/CSS/JS — kein Framework, kein Build-Step
- Kein eigenes Backend, kein API-Zugriff
- Docker: `nginx:alpine` mit `index.html`

## Hero-Stil
Hell (`--bg-light`), Dashboard-Widget rechts, fadeUp-Animationen.
Kein Dark Hero — neutrales Intro das alle Produkte zusammenhält.

## Typografie-Gewicht
Ausgewogen. `DM Serif Display` italic für einzelne Wort-Akzente im Hero-Titel.
`Inter` für Body. `DM Mono` für Labels und Nav-Logo.

## Besonderheiten
- Zeigt alle aktiven Produkte als Cards im 2-Spalten-Grid
- 5. oder weitere Cards: `card-wide` (full-width, horizontal Layout Desktop)
- Hero-Widget zeigt Anzahl aktiver Produkte + Status-Zeilen
- Nav-Badges verlinken direkt zu den Subdomains
- Sprach-Toggle DE/EN oben rechts

## Card-Farben pro Produkt
```css
/* api */ linear-gradient(135deg, #0f172a, #334155)
/* klara */ linear-gradient(135deg, #064e3b, #065f46)
/* barcode */ linear-gradient(135deg, #78350f, #92400e)
/* pdf */ linear-gradient(135deg, #1e1b4b, #312e81)
/* sims */ linear-gradient(135deg, #134e4a, #0f3d3a)
/* daedalus */ linear-gradient(135deg, #1a1a2e, #16213e)
```

## Repo
`github.com/simonabler/abler-tirol`

## Neue Produkte hinzufügen
1. CSS-Variable `--<name>-from` / `--<name>-to` in `:root` ergänzen
2. `.card-top-<name>` CSS-Klasse mit Gradient anlegen
3. Card-HTML im Products-Grid einfügen
4. Widget-Zähler erhöhen, Widget-Row ergänzen
5. Nav-Badge optional hinzufügen
68 changes: 68 additions & 0 deletions .claude/skills/abler-design/references/api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# api.abler.tirol — Zentrale REST-API

## Charakter
Technisch, präzise, terminal-nah. `DM Mono` dominiert sichtbarer als
bei anderen Produkten. Dark Hero mit Terminal-Widget. Developer-First.

## Akzentfarben
```css
--accent-primary: #0f172a; /* Slate 900 */
--accent-secondary: #1e3a5f; /* Deep Blue-Slate */
--accent-highlight: #5bffc3; /* Terminal Green — Cursor, Live-Indikatoren */
--accent-code: #3b8fff; /* Code Blue — Syntax-Highlighting */
--bg-dark: #0b0d11; /* Hero / Terminal backgrounds */
```

## Produkttyp: API + Minimal-Frontend
- NestJS Backend (Port 3000)
- Angular Frontend (Port 80)
- Eigene Datenbank (SQLite / PostgreSQL)
- CORS: `*` — öffentlich nutzbar
- Fonts werden hier **gehostet** und an alle anderen Subdomains ausgeliefert

## Font-Server Endpunkte
```
GET /fonts/abler-stack.css → kombiniertes @font-face CSS
GET /fonts/files/:filename → individuelle woff2-Dateien
```
Font-Dateien liegen in `apps/server/src/assets/fonts/files/` (woff2 aus `@fontsource`).
NestJS GlobalPrefix ist `api` — `/fonts/*` ist davon **ausgenommen** (`exclude: ['fonts/(.*)']`).

## Hero-Stil
Dark Hero (`--bg-dark`) mit Grid-Overlay, Glow-Effekten und Terminal-Widget.
Terminal zeigt Live-Curl-Beispiele mit animiertem Cursor (`blink 1.1s step-end`).

## Typografie-Gewicht
Mono-lastig. `DM Mono` für Labels, Badges, Terminal, alle technischen Texte.
`DM Serif Display` wird hier nicht oder sehr sparsam eingesetzt.

## Swagger / API Docs
Swagger UI unter `/api` — beide Domains als Server eingetragen:
```ts
.addServer('https://api.abler.tirol')
.addServer('https://hub.abler.tirol') // Legacy, bleibt aktiv
```

## Traefik — beide Domains, getrennte Router
```yaml
# Frontend: hub + api → selber Service, 2 Router für 2 Zertifikate
hub-frontend: Host(`hub.abler.tirol`) && PathPrefix(`/`)
api-frontend: Host(`api.abler.tirol`) && PathPrefix(`/`)
# Backend: /api/* und /fonts/* → NestJS
hub-backend: Host(`hub.abler.tirol`) && (PathPrefix(`/api`) || PathPrefix(`/fonts`))
api-backend: Host(`api.abler.tirol`) && (PathPrefix(`/api`) || PathPrefix(`/fonts`))
```

## Repo
`github.com/simonabler/simonapi` (NX Monorepo: `apps/server` + `apps/simonapi`)

## API-Endpunkte (Übersicht)
`/api/qr` · `/api/barcode` · `/api/barcode/gs1` · `/api/crypto`
`/api/watermark` · `/api/signpacks` · `/api/utils` · `/api/locks`
`/fonts/abler-stack.css` · `/fonts/files/:filename`

## Besonderheiten beim Entwickeln
- Neue Endpunkte: eigenes NestJS Module in `apps/server/src/app/<name>/`
- Font-Assets: woff2 aus `@fontsource` in `apps/server/src/assets/fonts/files/`
- Webpack kopiert `src/assets/` automatisch nach `dist/`
- API-Keys: 3 Tiers — Free (10/min), Pro (`sk_pro_`), Industrial (`sk_ind_`)
58 changes: 58 additions & 0 deletions .claude/skills/abler-design/references/barcode.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# barcode.abler.tirol — Barcode & QR Generator

## Charakter
Industriell, präzise, physisch-nah. Erinnert an Etiketten, Scanner,
Lagerlogistik. Helles Layout mit Amber-Akzenten.
Primäre Zielgruppe: Logistik, Handel, Produktion — keine Developer.

## Akzentfarben
```css
--accent-primary: #78350f; /* Amber 900 */
--accent-secondary: #92400e; /* Amber 800 */
--accent-highlight: #f59e0b; /* Amber 500 — aktive Zustände, Scan-Indikator */
--accent-light: #fef3c7; /* Amber 100 — subtile Hintergründe */
```

## Produkttyp: Pure Frontend
- Reines HTML/CSS/JS oder Angular SPA
- **Kein eigenes Backend** — alle Daten via `fetch()` von `api.abler.tirol`
- Docker: `nginx:alpine`
- Fonts: `api.abler.tirol/fonts/abler-stack.css`

## API-Aufrufe (Beispiele)
```js
// QR Code generieren
const res = await fetch('https://api.abler.tirol/api/qr', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ type: 'url', payload: { url: input }, format: 'svg' })
});

// Standard Barcode
const url = `https://api.abler.tirol/api/barcode/svg?type=code128&text=${encodeURIComponent(input)}&includetext=true`;

// GS1 (benötigt API-Key für Pro-Endpunkte)
const res = await fetch('https://api.abler.tirol/api/barcode/gs1/render', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-api-key': key },
body: JSON.stringify({ symbology: 'gs1-128', format: 'png', items: [...] })
});
```

## Hero-Stil
Hell (`--bg-light`), Amber-Akzente. Generator-UI im Vordergrund —
kein langer Marketing-Text, direkt zum Tool.

## Typografie-Gewicht
`DM Serif Display` + `Inter`. Kein Terminal-Look.
Eyebrows und Tags in `DM Mono`.

## UI-Besonderheiten
- Generator steht sofort im Viewport — kein Scroll nötig
- Live-Preview des Barcodes während der Eingabe (debounced, ~300ms)
- Download-Button für PNG/SVG direkt neben der Vorschau
- Amber-Akzent als Scan-Linie / aktiver Rahmen bei der Preview
- Typ-Auswahl: QR / Code128 / EAN / GS1 als Pill-Tabs

## Repo
`github.com/simonabler/barcode-abler-tirol`
48 changes: 48 additions & 0 deletions .claude/skills/abler-design/references/klara.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# klara.abler.tirol — Dokumentationstool für Lehrkräfte

## Charakter
Ruhig, warm, menschlich. Betont Vertrauen und Datenschutz.
Helles Layout, viel Weißraum, Serif-Titel (kursiv).
Wenig technischer Jargon — spricht Lehrkräfte an, nicht Developer.

## Akzentfarben
```css
--accent-primary: #064e3b; /* Emerald 900 */
--accent-secondary: #065f46; /* Emerald 800 */
--accent-highlight: #10b981; /* Emerald 500 — aktive Elemente, Icons */
--accent-light: #ecfdf5; /* Emerald 50 — subtile Hintergründe */
```

## Produkttyp: Fullstack (eigenständig)
- **Eigenes NestJS Backend** + PostgreSQL/SQLite
- **Eigene Authentifizierung** (Google OAuth + JWT)
- Kein Zugriff auf `api.abler.tirol` — vollständig unabhängig
- Self-Hosted: Nutzer betreiben eigene Instanz
- Fonts: `api.abler.tirol/fonts/abler-stack.css`

## Hero-Stil
Sehr hell, viel Weißraum. `DM Serif Display` italic dominant im Titel
("Dokumentation, die *endlich* mitdenkt.").
Kein Dark Hero, kein Terminal-Widget.

## Typografie-Gewicht
Serif-dominant. `DM Serif Display` italic für Haupttitel.
`Inter` light (300) für Fließtext — ruhig, lesbar.
`DM Mono` nur für technische Labels (DSGVO-Badges, Status).

## DSGVO / Datenschutz
Klara ist DSGVO-konform by design — das ist ein Kernelement des Brandings:
- "Self-hosted" Badge prominent
- "Keine Daten bei Drittanbietern"
- "Open Source — jede Zeile Code öffentlich"
Datenschutz-Section ist Pflichtbestandteil jeder Seite.

## UI-Besonderheiten
- App-Interface: Angular, Bootstrap 5
- Schülerprofile, Notizen, Leistungen als separate Bereiche
- Keine komplexen Mega-Menüs — Reduktion ist Kernwert
- Testimonials von Lehrkräften auf der Landing Page
- CTA: "Klara jetzt ausprobieren →" + "Selbst hosten"

## Repo
`github.com/simonabler/Klara`
Loading