feat(opportunities): Konfetti beim Wechsel auf Zusage
Kleines Canvas-Konfetti ohne Abhaengigkeit (src/lib/confetti.ts), ausgeloest beim Phasenwechsel in der Pipeline und beim Speichern im Dialog. Entfaellt bei prefers-reduced-motion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
e35c7518db
commit
59b962d66b
@@ -459,6 +459,10 @@ bestätigt, aber noch nicht beauftragt. *Beauftragt* und *Absage* sind das Ende.
|
||||
Der Filter *Nur offene* nutzt genau diese Grenze, ebenso die Pipeline-Summe in
|
||||
der Kopfzeile.
|
||||
|
||||
Landet eine Opportunity auf *Zusage* - per Ziehen in der Pipeline, über das
|
||||
Phasenmenü der Karte oder beim Speichern im Dialog -, gibt es kurz Konfetti.
|
||||
Wer im Betriebssystem „Bewegung reduzieren" eingestellt hat, sieht keins.
|
||||
|
||||
> Bei der Umstellung am 18.08.2026 wurden **alle vorhandenen Opportunities auf
|
||||
> „Neu" gesetzt**. Der alte Trichter (Qualifizierung, Angebot, Verhandlung,
|
||||
> Gewonnen, Verloren) ließ nicht erkennen, in welcher der neuen Phasen ein
|
||||
|
||||
@@ -425,6 +425,7 @@ Warum genau diese Konstanten festgelegt sind, steht in
|
||||
| `components/ui/Modal.tsx` | `Modal` und `ConfirmDialog`; `useDismiss()` schließt per Escape und per Klick in den Hintergrund. Escape trifft nur den obersten Dialog (Stapel `openModals`), der Hintergrundklick muss dort beginnen **und** enden. `ConfirmDialog` kennt zwei Tonlagen: `tone="danger"` (Standard, rot - es geht etwas verloren) und `tone="neutral"` (grün, bloße Rückfrage, z. B. beim Wiederherstellen) |
|
||||
| `components/Toast.tsx` | `useToast().addToast(text, kind)` mit `success`, `error` oder `info` |
|
||||
| `components/ui/DictationField.tsx` | Mikrofon-Knopf, Hinweisbox, Textfeld mit Diktat |
|
||||
| `lib/confetti.ts` | `fireConfetti()`: Canvas-Konfetti ohne Abhängigkeit, räumt sich nach 4,5 s selbst weg, entfällt bei `prefers-reduced-motion`. Aufgerufen beim Phasenwechsel auf *Zusage* (`Opportunities.changeStage`, `OpportunityModal.handleSubmit`) |
|
||||
| `lib/imageCompress.ts` | `compressImage(datei)` auf 256 px, WebP → JPEG → PNG; `compressImageSource(dataUrl)` geht denselben Weg für ein Bild, das nicht aus einer Datei kommt (LinkedIn-Foto) |
|
||||
|
||||
### `src/types.ts`
|
||||
|
||||
Reference in New Issue
Block a user