diff --git a/apps/picture/apps/web/src/lib/components/board/CanvasToolbar.svelte b/apps/picture/apps/web/src/lib/components/board/CanvasToolbar.svelte
index c099f086d..52c6c0032 100644
--- a/apps/picture/apps/web/src/lib/components/board/CanvasToolbar.svelte
+++ b/apps/picture/apps/web/src/lib/components/board/CanvasToolbar.svelte
@@ -17,7 +17,7 @@
deselectAll,
} from '$lib/stores/canvas';
import { boardSettings } from '$lib/stores/boards';
- import Button from '$lib/components/ui/Button.svelte';
+ import { Button } from '@manacore/shared-ui';
import Konva from 'konva';
import {
CaretLeft,
diff --git a/apps/picture/apps/web/src/lib/components/board/ImagePickerModal.svelte b/apps/picture/apps/web/src/lib/components/board/ImagePickerModal.svelte
index 187c29141..645e12e3e 100644
--- a/apps/picture/apps/web/src/lib/components/board/ImagePickerModal.svelte
+++ b/apps/picture/apps/web/src/lib/components/board/ImagePickerModal.svelte
@@ -5,9 +5,7 @@
import { canvasItems, addCanvasItem } from '$lib/stores/canvas';
import { getImages } from '$lib/api/images';
import { addBoardItem } from '$lib/api/boardItems';
- import { toastStore } from '@manacore/shared-ui';
- import Modal from '$lib/components/ui/Modal.svelte';
- import Button from '$lib/components/ui/Button.svelte';
+ import { toastStore, Modal, Button } from '@manacore/shared-ui';
import { MagnifyingGlass, Image as ImageIcon, Check } from '@manacore/shared-icons';
interface Props {
diff --git a/apps/picture/apps/web/src/lib/components/board/ImagePropertiesPanel.svelte b/apps/picture/apps/web/src/lib/components/board/ImagePropertiesPanel.svelte
index f2e914ef5..c73055c5a 100644
--- a/apps/picture/apps/web/src/lib/components/board/ImagePropertiesPanel.svelte
+++ b/apps/picture/apps/web/src/lib/components/board/ImagePropertiesPanel.svelte
@@ -1,8 +1,7 @@
-
-
diff --git a/apps/picture/apps/web/src/lib/components/ui/Card.svelte b/apps/picture/apps/web/src/lib/components/ui/Card.svelte
deleted file mode 100644
index 0d1ad28ad..000000000
--- a/apps/picture/apps/web/src/lib/components/ui/Card.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children()}
-
diff --git a/apps/picture/apps/web/src/routes/app/board/+page.svelte b/apps/picture/apps/web/src/routes/app/board/+page.svelte
index 3907416bf..174da2b48 100644
--- a/apps/picture/apps/web/src/routes/app/board/+page.svelte
+++ b/apps/picture/apps/web/src/routes/app/board/+page.svelte
@@ -14,10 +14,7 @@
removeBoardFromList,
} from '$lib/stores/boards';
import { getBoards, deleteBoard, duplicateBoard } from '$lib/api/boards';
- import { PageHeader } from '@manacore/shared-ui';
- import Button from '$lib/components/ui/Button.svelte';
- import Modal from '$lib/components/ui/Modal.svelte';
- import { toastStore } from '@manacore/shared-ui';
+ import { PageHeader, Button, Modal, toastStore } from '@manacore/shared-ui';
import { Plus, SquaresFour, Image, Trash } from '@manacore/shared-icons';
let loadingMore = $state(false);
diff --git a/docs/CONSOLIDATION_OPPORTUNITIES.md b/docs/CONSOLIDATION_OPPORTUNITIES.md
index ceb88a646..ba5c18920 100644
--- a/docs/CONSOLIDATION_OPPORTUNITIES.md
+++ b/docs/CONSOLIDATION_OPPORTUNITIES.md
@@ -12,7 +12,7 @@
| ~~**HOCH**~~ | ~~App Settings Stores~~ | ~~600-700 LOC~~ ✅ **323 LOC entfernt** | ~~Mittel~~ |
| **HOCH** | Main.ts/CORS Patterns | 1.800 LOC | Mittel |
| ~~**MITTEL**~~ | ~~TypeScript Configs~~ | ~~400 LOC~~ ✅ **~280 LOC entfernt** | ~~Niedrig~~ |
-| **MITTEL** | UI Component Cleanup | 400 LOC | Niedrig |
+| ~~**MITTEL**~~ | ~~UI Component Cleanup~~ | ~~400 LOC~~ ✅ **~74 LOC entfernt** | ~~Niedrig~~ |
| ~~**MITTEL**~~ | ~~Vite Configs~~ | ~~300 LOC~~ ✅ **~350 LOC entfernt** | ~~Niedrig~~ |
| ~~**MITTEL**~~ | ~~Navigation Stores~~ | ~~50 LOC~~ ✅ **~50 LOC entfernt** | ~~Niedrig~~ |
| ~~**NIEDRIG**~~ | ~~Drizzle Configs~~ | ~~200 LOC~~ ✅ **~160 LOC entfernt** | ~~Niedrig~~ |
@@ -238,17 +238,18 @@ export const { isSidebarMode, isNavCollapsed } = createSimpleNavigationStores({
---
-### 3.2 MITTEL: Sofort löschbare Duplikate (144 LOC)
+### ~~3.2 MITTEL: Sofort löschbare Duplikate~~ ✅ TEILWEISE ERLEDIGT
-**Picture App hat lokale Kopien von shared-ui Komponenten:**
+**Picture App - Status (29.01.2026):**
-| Datei | LOC | shared-ui Alternative |
-|-------|-----|----------------------|
-| `apps/picture/apps/web/src/lib/components/ui/Button.svelte` | 53 | `@manacore/shared-ui/Button` |
-| `apps/picture/apps/web/src/lib/components/ui/Input.svelte` | 70 | `@manacore/shared-ui/Input` |
-| `apps/picture/apps/web/src/lib/components/ui/Card.svelte` | 21 | `@manacore/shared-ui/Card` |
+| Datei | LOC | Status |
+|-------|-----|--------|
+| ~~`Button.svelte`~~ | ~~53~~ | ✅ Migriert zu `@manacore/shared-ui` |
+| ~~`Card.svelte`~~ | ~~21~~ | ✅ Gelöscht (unbenutzt) |
+| ~~`Input.svelte`~~ | ~~70~~ | ✅ Bereits vorher gelöscht |
-**Aktion:** Lösche lokale Dateien, importiere aus shared-ui.
+**Verbleibendes:**
+- `Modal.svelte` könnte migriert werden, aber hat unterschiedliche API (`open` vs `visible`)
---
@@ -430,7 +431,7 @@ export default createDrizzleConfig({ dbName: 'chat' });
| ~~Metrics zu shared-nestjs-metrics migrieren (6 Backends)~~ | ~~350~~ → **709** | ~~Niedrig~~ | ✅ Erledigt |
| ~~Picture Input.svelte löschen (unbenutzt)~~ | ~~70~~ | ~~Niedrig~~ | ✅ Erledigt |
| ~~Sleep-Duplikat entfernen~~ | ~~8~~ | ~~Minimal~~ | ✅ Erledigt |
-| Picture UI-Komponenten (Button/Card) | 74 | Niedrig | Offen |
+| ~~Picture UI-Komponenten (Button/Card)~~ | ~~74~~ → **74** | ~~Niedrig~~ | ✅ Erledigt |
| AppSlider Wrapper evaluieren (8 Apps) | - | Niedrig | Nicht nötig (sind Lokalisierungs-Wrapper) |
### Phase 2: Stores & Configs (3-5 Tage, ~1.500 LOC)