diff --git a/packages/ui/PROJEKT.md b/packages/ui/PROJEKT.md index 96fedf07e..f3a992e48 100644 --- a/packages/ui/PROJEKT.md +++ b/packages/ui/PROJEKT.md @@ -81,10 +81,10 @@ Phase 0: ██████████ 100% (6/6 Aufgaben) ✅ Phase 1: ██████████ 100% (6/6 Aufgaben) ✅ Phase 2: ██████████ 100% (26/26 Aufgaben) ✅ Phase 3: ██████████ 100% (24/24 Aufgaben) ✅ - Webapp-Integration komplett -Phase 4: █░░░░░░░░░ 6% (1/17 Aufgaben) - OsButton ✅ +Phase 4: ██░░░░░░░░ 18% (3/17 Aufgaben) - OsButton ✅, OsIcon ✅, System-Icons ✅ Phase 5: ░░░░░░░░░░ 0% (0/7 Aufgaben) ─────────────────────────────────────── -Gesamt: ████████░░ 74% (63/86 Aufgaben) +Gesamt: ████████░░ 76% (65/86 Aufgaben) ``` ### Katalogisierung (Details in KATALOG.md) @@ -115,21 +115,49 @@ OsButton Features: as-Prop Migration: 15 /-Wrapper in 15 Webapp-Dateien → as="nuxt-link"/as="a" ``` +### OsIcon (Phase 4) +``` +OsIcon Features: +├─ name: ✅ System-Icon per Name (check, close, plus) +├─ icon: ✅ Custom Vue-Komponente (hat Vorrang vor name) +├─ size: ✅ xs, sm, md, lg, xl, 2xl (em-basiert) +├─ a11y: ✅ decorative (default) / semantic (mit aria-label) +├─ color: ✅ fill-current (erbt von Parent) +└─ svg-plugin: ✅ vite-svg-icon (SVG → Vue Component via ?icon) + +System-Icons: +├─ check.svg (Checkmark) +├─ close.svg (Close/X) +└─ plus.svg (Plus/Add) + +Ocelot-Icons (separates Entry-Point): +└─ angle-down.svg (Dropdown-Pfeil) +``` + --- ## Aktueller Stand -**Letzte Aktualisierung:** 2026-02-14 (Session 20) +**Letzte Aktualisierung:** 2026-02-15 (Session 21) -**Aktuelle Phase:** Phase 3 ✅ ABGESCHLOSSEN + Code-Review-Feedback + `as`-Prop-Migration +**Aktuelle Phase:** Phase 4 - OsIcon ✅ implementiert, System-Icons eingerichtet -**Abgeschlossene Phasen:** -- [x] Phase 0: Analyse (177 Komponenten katalogisiert) -- [x] Phase 1: Vue 2.7 Upgrade (2.6.14 → 2.7.16, 979 Tests ✅) -- [x] Phase 2: Projekt-Setup (Vite, vue-demi, Tailwind v4, CVA, Storybook 10, CI/CD, 100% Coverage) -- [x] Phase 3: Webapp-Integration — 133 os-button in 79 Dateien, 0 base-button/ds-button verbleibend +**Zuletzt abgeschlossen (Session 21 - OsIcon Komponente, System-Icons, Ocelot-Umbenennung):** +- [x] OsIcon Komponente implementiert (name, icon, size Props; Vue 2/3 via vue-demi h()) +- [x] System-Icons: check, close, plus (SVG, viewBox 0 0 32 32, stroke-basiert) +- [x] Custom vite-svg-icon Plugin: SVG → Vue Render-Function via `?icon` Query +- [x] Icon-Größen: xs(0.75em), sm(0.875em), md(1.2em), lg(1.5em), xl(2em), 2xl(2.5em) +- [x] A11y: decorative (aria-hidden, default) / semantic (role="img" + aria-label) +- [x] fill-current für Farbvererbung vom Parent +- [x] OsButton nutzt OsIcon statt inline SVG für Icon-Rendering +- [x] Ocelot-Icons: separates Entry-Point (ocelot.mjs) mit dynamischem Loading via import.meta.glob +- [x] `src/webapp/` → `src/ocelot/` umbenannt (konsistentes Naming) +- [x] check-completeness erweitert: unterstützt ocelot/ Verzeichnis +- [x] OsIcon: 211 Zeilen Unit-Tests, Visual Tests mit checkA11y(), Keyboard A11y +- [x] 100% Test-Coverage für OsIcon +- [x] OsButton Stories bereinigt (OsIcon statt Inline-SVGs) -**Zuletzt abgeschlossen (Session 20 - `as`-Prop + nuxt-link Migration):** +**Zuvor abgeschlossen (Session 20 - `as`-Prop + nuxt-link Migration):** - [x] OsButton: `as` Prop implementiert (polymorphe Komponente: `button`, `a`, `nuxt-link`, `router-link`, Custom-Komponenten) - [x] Naming-Konvention: `tag` → `as` (moderner Standard: Headless UI, Radix Vue, Chakra UI, PrimeVue) - [x] `disabled`/`type`/`loading` nur bei `as="button"` (Links haben kein natives `disabled`-Attribut) @@ -146,246 +174,34 @@ as-Prop Migration: 15 /-Wrapper in 15 Webapp-Dateien → as="nuxt - NotificationMenu.vue (3 Instanzen, 2 zu einem Button konsolidiert via counter-icon) - [x] Verifiziert: 0 verbleibende ``/``-Wrapper um `` in Webapp -**Zuvor abgeschlossen (Session 19 - CodeRabbit Review Feedback: Cleanup, Accessibility, Bugfixes):** -- [x] donations.vue: Redundantes `:checked="showDonations"` entfernt (v-model setzt checked bereits) -- [x] MySomethingList.vue: Disabled-Logik vereinfacht `!(!isEditing || (isEditing && !disabled))` → `isEditing && disabled` -- [x] button.variants.ts: Hardcoded Fallback `#e5e3e8` entfernt → `var(--color-disabled)` (konsistent mit filled/index.css) -- [x] CommentCard.vue: `aria-label` auf icon-only Reply-Button -- [x] HashtagsFilter.vue: `aria-label` auf icon-only Clear-Button -- [x] ReleaseModal.vue: `$emit('close')` im catch-Block ergänzt (fehlte im Fehlerfall) -- [x] Chat.vue: `aria-label` auf Expand- und Close-Buttons -- [x] i18n: `chat.expandChat` + `chat.closeChat` in allen 9 Sprachdateien (vollständig übersetzt) -- [x] ChatNotificationMenu.vue: `aria-label` auf icon-only Chat-Button -- [x] SearchableInput.vue: `aria-label` auf icon-only Close-Button -- [x] GroupButton.vue: `aria-label` auf icon-only Groups-Button -- [x] MapButton.vue: `aria-label` auf icon-only Map-Button -- [x] EmotionButton.vue: `aria-label` auf icon-only Emoji-Button (`