diff --git a/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js index 3c3e4286e..be0c28319 100644 --- a/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js +++ b/cypress/support/step_definitions/UserProfile.SocialMedia/I_delete_the_social_media_link_{string}.js @@ -7,6 +7,6 @@ defineStep('I delete the social media link {string}', (link) => { .should("be.visible") cy.get('[data-test="confirm-button"]') .click() - cy.get('.ds-list-item-content > a') + cy.get(`.ds-list-item a[href="${link}"]`) .should('not.exist') }) diff --git a/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js b/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js index 709f45831..7c6c9404e 100644 --- a/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js +++ b/cypress/support/step_definitions/UserProfile.SocialMedia/I_have_added_the_social_media_link_{string}.js @@ -8,6 +8,6 @@ defineStep('I have added the social media link {string}', (link) => { .type(link) .get('[data-test="add-save-button"]') .click() - cy.get('.ds-list-item-content > a') + cy.get('.ds-list-item a') .contains(link) }) diff --git a/packages/ui/KATALOG.md b/packages/ui/KATALOG.md index 0165d7001..f6b783d0d 100644 --- a/packages/ui/KATALOG.md +++ b/packages/ui/KATALOG.md @@ -9,46 +9,37 @@ ### Übersicht ``` -Phase 0: Analyse ██████████ 100% (8/8 Schritte) -Phase 3: Migration ██████████ 100% (132/132 Buttons) ✅ -─────────────────────────────────────────── -Phase 3 ABGESCHLOSSEN: M4a ✅, M4b ✅, M4c ✅ — 0 verbleibend +Phase 0: Analyse ██████████ 100% (8/8 Schritte) ✅ +Phase 3: OsButton ██████████ 100% (133/133 Buttons) ✅ +Phase 4: Tier 1 ██████████ 100% (OsButton, OsIcon, OsSpinner, OsCard) ✅ +Phase 4: Tier A → HTML ██████████ 100% (10 ds-* Wrapper → Plain HTML) ✅ +Phase 4: Tier B → HTML ░░░░░░░░░░ 0% (ds-chip, ds-number, ds-grid, ds-radio) +Phase 4: Tier 2-4 ░░░░░░░░░░ 0% (OsModal, OsInput, OsMenu, OsSelect, OsTable) ``` ### Statistiken | Metrik | Wert | |--------|------| | Webapp Komponenten | 139 | -| Styleguide Komponenten | 38 | +| Styleguide Komponenten | 38 (23 in Webapp genutzt) | | **Gesamt** | **177** | -| Detailiert analysiert | 3 Familien (Button, Modal, Menu) | -| Duplikate gefunden | 5 direkte + 3 Familien | -| Zur Migration priorisiert | 15 Kern-Komponenten | +| ✅ UI-Library | OsButton, OsIcon, OsSpinner, OsCard (4) | +| ✅ → Plain HTML | Section, Placeholder, Tag, List, ListItem, Container, Heading, Text, Space, Flex, FlexItem (11) | +| ⬜ → Plain HTML | Chip, Number, Grid, GridItem, Radio (5) — Tier B | +| ⬜ → UI-Library | Modal, Input, Menu, MenuItem, Select, Table (6) — Tier 2-4 | +| ⬜ Offen | Form (18 Dateien — HTML oder OsForm?) | +| ⬜ Nicht in Webapp | Code, CopyField, FormItem, InputError, InputLabel, Page, PageTitle, Logo, Avatar, TableCol, TableHeadCol (11) | ### OsButton Migration (Phase 3) ✅ -| Status | Anzahl | Details | -|--------|--------|---------| -| ✅ Migriert | 132 | 78 Dateien, alle `` ersetzt | -| ⬜ Verbleibend | 0 | Nur BaseButton.vue Definition + Test/Snapshot-Dateien | -| **Gesamt** | **132** | **100% erledigt** | -**Alle 132 Buttons migriert in 78 Dateien ✅** - -Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-Templates. +**133 Buttons migriert in 79 Dateien ✅** — BaseButton.vue gelöscht, base-components.js Plugin entfernt. **Erkenntnisse aus der Migration:** - `type="submit"` muss explizit gesetzt werden (OsButton Default: `type="button"`) - DsForm `errors` ist ein Objekt → `!!errors` für Boolean-Cast bei `:disabled` - CSS `.base-button` Selektoren → `> button` oder `button` -- Position/Dimensions brauchen `!important` für Tailwind-Override - Filter-Buttons nutzen `:appearance="condition ? 'filled' : 'outline'"` Pattern -- Circle-Buttons mit Icon: `` - -**Verbleibende Cleanup-Aufgaben:** -- [ ] Snapshot-Dateien aktualisieren (enthalten noch `base-button` Referenzen) -- [ ] Test-Dateien aktualisieren (Selektoren `.base-button` → `button` oder `os-button-stub`) -- [ ] BaseButton.vue Komponente ggf. entfernen (wenn nicht mehr referenziert) -- [ ] CSS-Selektor `.base-button` in ImageUploader.vue entfernen +- Circle-Buttons mit Icon: `` --- @@ -58,62 +49,62 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T > Live: http://styleguide.ocelot.social/ ### Data Display -| # | Komponente | Status | Webapp-Duplikat | Varianten | Priorität | Notizen | -|---|------------|--------|-----------------|-----------|-----------|---------| -| 1 | Avatar | ⬜ Ausstehend | | | | | -| 2 | Card | ⬜ Ausstehend | BaseCard? | | | | -| 3 | Chip | ⬜ Ausstehend | | | | | -| 4 | Code | ⬜ Ausstehend | | | | | -| 5 | Icon | ⬜ Ausstehend | BaseIcon? | | | | -| 6 | Number | ⬜ Ausstehend | | | | | -| 7 | Placeholder | ⬜ Ausstehend | | | | | -| 8 | Spinner | ⬜ Ausstehend | LoadingSpinner? | | | | -| 9 | Table | ⬜ Ausstehend | | | | | -| 10 | TableCol | ⬜ Ausstehend | | | | | -| 11 | TableHeadCol | ⬜ Ausstehend | | | | | -| 12 | Tag | ⬜ Ausstehend | | | | | +| # | Komponente | Status | Notizen | +|---|------------|--------|---------| +| 1 | Avatar | ⬜ Nicht genutzt | Webapp nutzt eigenes ProfileAvatar | +| 2 | Card | ✅ UI-Library | → OsCard (BaseCard gelöscht) | +| 3 | Chip | ⬜ Tier B | 5 Dateien → Plain HTML `` | +| 4 | Code | ⬜ Nicht genutzt | Nicht in Webapp verwendet | +| 5 | Icon | ✅ UI-Library | → OsIcon (BaseIcon gelöscht, 82 Ocelot-Icons) | +| 6 | Number | ⬜ Tier B | 5 Dateien → Plain HTML `
` | +| 7 | Placeholder | ✅ → HTML | Tier A: `
` | +| 8 | Spinner | ✅ UI-Library | → OsSpinner (LoadingSpinner gelöscht) | +| 9 | Table | ⬜ Tier 4 | 7 Dateien → OsTable | +| 10 | TableCol | ⬜ Tier 4 | Intern von Table genutzt | +| 11 | TableHeadCol | ⬜ Tier 4 | Intern von Table genutzt | +| 12 | Tag | ✅ → HTML | Tier A: `` | ### Data Input -| # | Komponente | Status | Webapp-Duplikat | Varianten | Priorität | Notizen | -|---|------------|--------|-----------------|-----------|-----------|---------| -| 13 | Button | ⏳ Migration | BaseButton, CustomButton, ActionButton, ... | | | → OsButton (41/90 migriert) | -| 14 | CopyField | ⬜ Ausstehend | | | | | -| 15 | Form | ⬜ Ausstehend | | | | | -| 16 | FormItem | ⬜ Ausstehend | | | | | -| 17 | Input | ⬜ Ausstehend | SearchableInput, LinkInput | | | | -| 18 | InputError | ⬜ Ausstehend | | | | | -| 19 | InputLabel | ⬜ Ausstehend | | | | | -| 20 | Radio | ⬜ Ausstehend | | | | | -| 21 | Select | ⬜ Ausstehend | Dropdown, LocationSelect | | | | +| # | Komponente | Status | Notizen | +|---|------------|--------|---------| +| 13 | Button | ✅ UI-Library | → OsButton (133 Buttons in 79 Dateien, BaseButton gelöscht) | +| 14 | CopyField | ⬜ Nicht genutzt | Nicht in Webapp verwendet | +| 15 | Form | ⬜ Offen | 18 Dateien — HTML `
` oder OsForm? | +| 16 | FormItem | ⬜ Nicht genutzt | Nicht in Webapp verwendet | +| 17 | Input | ⬜ Tier 2 | 23 Dateien → OsInput (gekoppelt mit Form) | +| 18 | InputError | ⬜ Nicht genutzt | Intern von Input genutzt | +| 19 | InputLabel | ⬜ Nicht genutzt | Intern von Input genutzt | +| 20 | Radio | ⬜ Tier B | 1 Datei → native `` | +| 21 | Select | ⬜ Tier 4 | 3 Dateien → OsSelect | ### Layout -| # | Komponente | Status | Webapp-Duplikat | Varianten | Priorität | Notizen | -|---|------------|--------|-----------------|-----------|-----------|---------| -| 22 | Container | ⬜ Ausstehend | | | | | -| 23 | Flex | ⬜ Ausstehend | | | | | -| 24 | FlexItem | ⬜ Ausstehend | | | | | -| 25 | Grid | ⬜ Ausstehend | MasonryGrid? | | | | -| 26 | GridItem | ⬜ Ausstehend | MasonryGridItem? | | | | -| 27 | Modal | ⬜ Ausstehend | Modal, ConfirmModal, ... | | | | -| 28 | Page | ⬜ Ausstehend | InternalPage? | | | | -| 29 | PageTitle | ⬜ Ausstehend | | | | | -| 30 | Section | ⬜ Ausstehend | | | | | -| 31 | Space | ⬜ Ausstehend | | | | | +| # | Komponente | Status | Notizen | +|---|------------|--------|---------| +| 22 | Container | ✅ → HTML | Tier A: `
` | +| 23 | Flex | ✅ → HTML | Tier A: Plain HTML + CSS @media Queries | +| 24 | FlexItem | ✅ → HTML | Tier A: Plain HTML + CSS @media Queries | +| 25 | Grid | ⬜ Tier B | 2 Dateien → CSS Grid | +| 26 | GridItem | ⬜ Tier B | 8 Dateien → CSS Grid | +| 27 | Modal | ⬜ Tier 2 | 7 Dateien → OsModal | +| 28 | Page | ⬜ Nicht genutzt | Nicht direkt in Webapp verwendet | +| 29 | PageTitle | ⬜ Nicht genutzt | Nicht direkt in Webapp verwendet | +| 30 | Section | ✅ → HTML | Tier A: `
` | +| 31 | Space | ✅ → HTML | Tier A: `
` / `
` | ### Navigation -| # | Komponente | Status | Webapp-Duplikat | Varianten | Priorität | Notizen | -|---|------------|--------|-----------------|-----------|-----------|---------| -| 32 | List | ⬜ Ausstehend | | | | | -| 33 | ListItem | ⬜ Ausstehend | | | | | -| 34 | Logo | ⬜ Ausstehend | Logo | | | DUPLIKAT | -| 35 | Menu | ⬜ Ausstehend | HeaderMenu, ContentMenu, ... | | | | -| 36 | MenuItem | ⬜ Ausstehend | | | | | +| # | Komponente | Status | Notizen | +|---|------------|--------|---------| +| 32 | List | ✅ → HTML | Tier A: `
    ` | +| 33 | ListItem | ✅ → HTML | Tier A: `
  • ` | +| 34 | Logo | ⬜ Nicht genutzt | Webapp nutzt eigenes Logo | +| 35 | Menu | ⬜ Tier 3 | 11 Dateien → OsMenu | +| 36 | MenuItem | ⬜ Tier 3 | 6 Dateien → OsMenuItem | ### Typography -| # | Komponente | Status | Webapp-Duplikat | Varianten | Priorität | Notizen | -|---|------------|--------|-----------------|-----------|-----------|---------| -| 37 | Heading | ⬜ Ausstehend | SearchHeading? | | | | -| 38 | Text | ⬜ Ausstehend | | | | | +| # | Komponente | Status | Notizen | +|---|------------|--------|---------| +| 37 | Heading | ✅ → HTML | Tier A: `` | +| 38 | Text | ✅ → HTML | Tier A: `

    ` | --- @@ -132,7 +123,7 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T ### A-B | # | Komponente | Status | Kategorie | Styleguide-Pendant | Notizen | |---|------------|--------|-----------|-------------------|---------| -| 1 | ActionButton | ⬜ Ausstehend | Button | Button | 🔄 Button-Familie | +| 1 | ActionButton | ✅ Migriert | Button | Button | 🔄 Button-Familie, nutzt OsButton | | 2 | ActionRadiusSelect | ⬜ Ausstehend | Input | | | | 3 | AddChatRoomByUserSearch | ⬜ Ausstehend | Feature | | Chat-spezifisch | | 4 | AddGroupMember | ⬜ Ausstehend | Feature | | Group-spezifisch | @@ -141,21 +132,21 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T | 7 | BadgeSelection | ⬜ Ausstehend | Input | | | | 8 | Badges | ⬜ Ausstehend | Display | | | | 9 | BadgesSection | ⬜ Ausstehend | Display | | | -| 10 | BaseButton | ⏳ Migration | Button | Button | 🔄 → OsButton (41/90 migriert) | -| 11 | BaseCard | ⬜ Ausstehend | Layout | Card | 🔗 DUPLIKAT | -| 12 | BaseIcon | ⬜ Ausstehend | Display | Icon | 🔗 DUPLIKAT | +| 10 | ~~BaseButton~~ | ✅ Gelöscht | Button | Button | → OsButton (133 Buttons, Komponente gelöscht) | +| 11 | ~~BaseCard~~ | ✅ Gelöscht | Layout | Card | → OsCard (~30 Dateien, Komponente gelöscht) | +| 12 | ~~BaseIcon~~ | ✅ Gelöscht | Display | Icon | → OsIcon (131 Nutzungen, Komponente gelöscht) | ### C | # | Komponente | Status | Kategorie | Styleguide-Pendant | Notizen | |---|------------|--------|-----------|-------------------|---------| | 13 | CategoriesFilter | ⬜ Ausstehend | Filter | | | | 14 | CategoriesMenu | ⬜ Ausstehend | Navigation | Menu | | -| 15 | CategoriesSelect | ⏳ Teilweise | Input | Select | Buttons → OsButton (icon) | +| 15 | CategoriesSelect | ✅ Migriert | Input | Select | Buttons → OsButton (icon) | | 16 | ChangePassword | ⬜ Ausstehend | Feature | | Auth-spezifisch | | 17 | Change | ⬜ Ausstehend | Feature | | | | 18 | Chat | ⬜ Ausstehend | Feature | | Chat-spezifisch | | 19 | ChatNotificationMenu | ⬜ Ausstehend | Feature | | Chat-spezifisch | -| 20 | CommentCard | ⏳ Teilweise | Display | Card | 1/2 Buttons → OsButton | +| 20 | CommentCard | ✅ Migriert | Display | Card | Buttons → OsButton, BaseCard → OsCard | | 21 | CommentForm | ⬜ Ausstehend | Input | Form | | | 22 | CommentList | ⬜ Ausstehend | Display | List | | | 23 | ComponentSlider | ⬜ Ausstehend | Layout | | | @@ -163,31 +154,31 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T | 25 | ContentMenu | ⬜ Ausstehend | Navigation | Menu | | | 26 | ContentViewer | ⬜ Ausstehend | Display | | | | 27 | ContextMenu | ⬜ Ausstehend | Navigation | Menu | | -| 28 | ContributionForm | ⏳ Teilweise | Feature | Form | Cancel → OsButton | +| 28 | ContributionForm | ✅ Migriert | Feature | Form | Buttons → OsButton, ds-* → HTML | | 29 | CounterIcon | ⬜ Ausstehend | Display | Icon | | | 30 | CountTo | ⬜ Ausstehend | Display | Number | Animation | | 31 | CreateInvitation | ⬜ Ausstehend | Feature | | | -| 32 | CtaJoinLeaveGroup | ⬜ Ausstehend | Button | Button | 🔄 Button-Familie | -| 33 | CtaUnblockAuthor | ✅ Migriert | Button | Button | Button → OsButton (icon) | -| 34 | CustomButton | ⬜ Ausstehend | Button | Button | 🔄 Button-Familie | +| 32 | CtaJoinLeaveGroup | ✅ Migriert | Button | Button | 🔄 Button-Familie, nutzt OsButton | +| 33 | CtaUnblockAuthor | ✅ Migriert | Button | Button | Nutzt OsButton (icon, as="nuxt-link") | +| 34 | CustomButton | ✅ Migriert | Button | Button | 🔄 Button-Familie, nutzt OsButton | ### D-E | # | Komponente | Status | Kategorie | Styleguide-Pendant | Notizen | |---|------------|--------|-----------|-------------------|---------| | 35 | DateTimeRange | ⬜ Ausstehend | Input | | | | 36 | DeleteData | ⬜ Ausstehend | Feature | | | -| 37 | DeleteUserModal | ⏳ Teilweise | Feedback | Modal | 🔄 Modal-Familie, Buttons → OsButton | -| 38 | DisableModal | ⏳ Teilweise | Feedback | Modal | 🔄 Modal-Familie, Buttons → OsButton | +| 37 | DeleteUserModal | ✅ Migriert | Feedback | Modal | 🔄 Modal-Familie, Buttons → OsButton | +| 38 | DisableModal | ✅ Migriert | Feedback | Modal | 🔄 Modal-Familie, Buttons → OsButton | | 39 | DonationInfo | ✅ Migriert | Display | | Button → OsButton | | 40 | Dropdown | ⬜ Ausstehend | Input | Select | | | 41 | DropdownFilter | ⬜ Ausstehend | Filter | Select | | | 42 | Editor | ⬜ Ausstehend | Input | | Rich-Text | | 43 | EmailDisplayAndVerify | ⬜ Ausstehend | Feature | | | -| 44 | EmbedComponent | ⏳ Teilweise | Display | | 2/3 Buttons → OsButton | -| 45 | EmotionButton | ⬜ Ausstehend | Button | Button | | +| 44 | EmbedComponent | ✅ Migriert | Display | | Buttons → OsButton | +| 45 | EmotionButton | ✅ Migriert | Button | Button | Nutzt OsButton intern | | 46 | Emotions | ⬜ Ausstehend | Feature | | | | 47 | Empty | ⬜ Ausstehend | Feedback | Placeholder | | -| 48 | EnterNonce | ⏳ Teilweise | Feature | | Auth, Submit → OsButton | +| 48 | EnterNonce | ✅ Migriert | Feature | | Auth, Submit → OsButton | ### F-G | # | Komponente | Status | Kategorie | Styleguide-Pendant | Notizen | @@ -197,12 +188,12 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T | 51 | FilterMenu | ⬜ Ausstehend | Navigation | Menu | | | 52 | FilterMenuComponent | ⬜ Ausstehend | Navigation | Menu | | | 53 | FilterMenuSection | ⬜ Ausstehend | Navigation | Menu | | -| 54 | FollowButton | ⬜ Ausstehend | Button | Button | | +| 54 | FollowButton | ✅ Migriert | Button | Button | Nutzt OsButton intern | | 55 | FollowingFilter | ⬜ Ausstehend | Filter | | | | 56 | FollowList | ⬜ Ausstehend | Display | List | | -| 57 | GroupButton | ⬜ Ausstehend | Button | Button | | +| 57 | GroupButton | ✅ Migriert | Button | Button | Nutzt OsButton intern | | 58 | GroupContentMenu | ⬜ Ausstehend | Navigation | Menu | | -| 59 | GroupForm | ⏳ Teilweise | Input | Form | 1/2 Buttons → OsButton | +| 59 | GroupForm | ✅ Migriert | Input | Form | Buttons → OsButton | | 60 | GroupLink | ⬜ Ausstehend | Navigation | | | | 61 | GroupList | ⬜ Ausstehend | Display | List | | | 62 | GroupMember | ✅ Migriert | Display | | Button → OsButton | @@ -213,41 +204,41 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T |---|------------|--------|-----------|-------------------|---------| | 64 | Hashtag | ⬜ Ausstehend | Display | Tag/Chip | | | 65 | HashtagsFilter | ⬜ Ausstehend | Filter | | | -| 66 | HeaderButton | ⬜ Ausstehend | Button | Button | 🔄 Button-Familie | +| 66 | HeaderButton | ✅ Migriert | Button | Button | 🔄 Button-Familie, nutzt OsButton | | 67 | HeaderMenu | ⬜ Ausstehend | Navigation | Menu | | -| 68 | ImageUploader | ⏳ Teilweise | Input | | Crop-Buttons → OsButton | +| 68 | ImageUploader | ✅ Migriert | Input | | Crop-Buttons → OsButton, Spinner → OsSpinner | | 69 | index | ⬜ Ausstehend | ? | | Prüfen | | 70 | InternalPage | ⬜ Ausstehend | Layout | Page | | | 71 | Invitation | ⬜ Ausstehend | Feature | | | | 72 | InvitationList | ⬜ Ausstehend | Display | List | | -| 73 | InviteButton | ⬜ Ausstehend | Button | Button | | -| 74 | JoinLeaveButton | ⬜ Ausstehend | Button | Button | | -| 75 | LabeledButton | ⬜ Ausstehend | Button | Button | 🔄 Button-Familie | +| 73 | InviteButton | ✅ Migriert | Button | Button | Nutzt OsButton intern | +| 74 | JoinLeaveButton | ✅ Migriert | Button | Button | Nutzt OsButton intern | +| 75 | LabeledButton | ✅ Migriert | Button | Button | 🔄 Button-Familie, nutzt OsButton | | 76 | LinkInput | ⬜ Ausstehend | Input | Input | | -| 77 | LoadingSpinner | ⬜ Ausstehend | Feedback | Spinner | 🔗 DUPLIKAT | +| 77 | ~~LoadingSpinner~~ | ✅ Gelöscht | Feedback | Spinner | → OsSpinner (Komponente gelöscht) | | 78 | LocaleSwitch | ⬜ Ausstehend | Navigation | | | | 79 | LocationInfo | ⬜ Ausstehend | Display | | | -| 80 | LocationSelect | ⏳ Teilweise | Input | Select | Close-Button → OsButton (icon) | +| 80 | LocationSelect | ✅ Migriert | Input | Select | Close-Button → OsButton (icon) | | 81 | LocationTeaser | ⬜ Ausstehend | Display | Card | | -| 82 | LoginButton | ⬜ Ausstehend | Button | Button | | +| 82 | LoginButton | ✅ Migriert | Button | Button | Nutzt OsButton intern | | 83 | LoginForm | ⬜ Ausstehend | Feature | Form | Auth | -| 84 | Logo | ⬜ Ausstehend | Display | Logo | 🔗 DUPLIKAT | +| 84 | Logo | ⬜ Ausstehend | Display | Logo | 🔗 DUPLIKAT (noch ungelöst) | ### M-O | # | Komponente | Status | Kategorie | Styleguide-Pendant | Notizen | |---|------------|--------|-----------|-------------------|---------| -| 85 | MapButton | ⬜ Ausstehend | Button | Button | | +| 85 | MapButton | ✅ Migriert | Button | Button | Nutzt OsButton intern | | 86 | MapStylesButtons | ✅ Migriert | Button | Button | Button → OsButton | | 87 | MasonryGrid | ⬜ Ausstehend | Layout | Grid | | | 88 | MasonryGridItem | ⬜ Ausstehend | Layout | GridItem | | | 89 | MenuBar | ⬜ Ausstehend | Navigation | Menu | | -| 90 | MenuBarButton | ⬜ Ausstehend | Button | Button | 🔄 Button-Familie | +| 90 | MenuBarButton | ✅ Migriert | Button | Button | 🔄 Button-Familie, nutzt OsButton | | 91 | MenuLegend | ⬜ Ausstehend | Navigation | | | | 92 | Modal | ⬜ Ausstehend | Feedback | Modal | 🔗 DUPLIKAT | -| 93 | MySomethingList | ⏳ Teilweise | Display | List | Cancel → OsButton | -| 94 | NotificationMenu | ⏳ Teilweise | Navigation | Menu | 2/3 Buttons → OsButton | +| 93 | MySomethingList | ✅ Migriert | Display | List | Buttons → OsButton | +| 94 | NotificationMenu | ✅ Migriert | Navigation | Menu | Buttons → OsButton | | 95 | NotificationsTable | ⬜ Ausstehend | Display | Table | | -| 96 | ObserveButton | ⬜ Ausstehend | Button | Button | | +| 96 | ObserveButton | ✅ Migriert | Button | Button | Nutzt OsButton intern | | 97 | OrderByFilter | ⬜ Ausstehend | Filter | | | ### P-R @@ -267,10 +258,10 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T | 109 | RegistrationSlideNonce | ⬜ Ausstehend | Feature | | Auth | | 110 | RegistrationSlideNoPublic | ⬜ Ausstehend | Feature | | Auth | | 111 | RegistrationSlider | ⬜ Ausstehend | Feature | | Auth | -| 112 | ReleaseModal | ⏳ Teilweise | Feedback | Modal | 🔄 Modal-Familie, Cancel → OsButton | +| 112 | ReleaseModal | ✅ Migriert | Feedback | Modal | 🔄 Modal-Familie, Buttons → OsButton | | 113 | ReportList | ⬜ Ausstehend | Display | List | | | 114 | ReportModal | ⬜ Ausstehend | Feedback | Modal | 🔄 Modal-Familie | -| 115 | ReportRow | ⏳ Teilweise | Display | | More Details → OsButton | +| 115 | ReportRow | ✅ Migriert | Display | | More Details → OsButton | | 116 | ReportsTable | ⬜ Ausstehend | Display | Table | | | 117 | Request | ⬜ Ausstehend | Feature | | | | 118 | ResponsiveImage | ⬜ Ausstehend | Display | | | @@ -285,7 +276,7 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T | 123 | SearchPost | ⬜ Ausstehend | Feature | | Search | | 124 | SearchResults | ⬜ Ausstehend | Feature | | Search | | 125 | SelectUserSearch | ⬜ Ausstehend | Input | Select | | -| 126 | ShoutButton | ⬜ Ausstehend | Button | Button | | +| 126 | ShoutButton | ✅ Migriert | Button | Button | Nutzt OsButton intern | | 127 | ShowPassword | ⬜ Ausstehend | Input | | | | 128 | Signup | ⬜ Ausstehend | Feature | | Auth | | 129 | SocialMedia | ⬜ Ausstehend | Display | | | @@ -307,36 +298,35 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T ## Identifizierte Duplikate & Konsolidierung ### Direkte Duplikate (Webapp ↔ Styleguide) -| Webapp | Styleguide | Aktion | -|--------|------------|--------| -| Logo | Logo | Konsolidieren zu OsLogo | -| Modal | Modal | Konsolidieren zu OsModal | -| BaseCard | Card | Konsolidieren zu OsCard | -| BaseIcon | Icon | Konsolidieren zu OsIcon | -| LoadingSpinner | Spinner | Konsolidieren zu OsSpinner | +| Webapp | Styleguide | Aktion | Status | +|--------|------------|--------|--------| +| Logo | Logo | Konsolidieren zu OsLogo | ⬜ Ausstehend | +| Modal | Modal | Konsolidieren zu OsModal | ⬜ Ausstehend | +| ~~BaseCard~~ | Card | → OsCard | ✅ Erledigt (BaseCard gelöscht) | +| ~~BaseIcon~~ | Icon | → OsIcon | ✅ Erledigt (BaseIcon gelöscht) | +| ~~LoadingSpinner~~ | Spinner | → OsSpinner | ✅ Erledigt (LoadingSpinner gelöscht) | -### Button-Familie (zur Konsolidierung) -| Komponente | Beschreibung | Ziel | -|------------|--------------|------| -| Button (Styleguide) | Basis-Button | OsButton | -| BaseButton | Basis-Button | → OsButton | -| CustomButton | Angepasster Button | → OsButton variant | -| ActionButton | Aktions-Button | → OsButton variant | -| HeaderButton | Header-Button | → OsButton variant | -| LabeledButton | Button mit Label | → OsButton + Label | -| MenuBarButton | Menü-Button | → OsButton variant | -| FollowButton | Follow-Aktion | Feature-spezifisch | -| GroupButton | Gruppen-Aktion | Feature-spezifisch | -| InviteButton | Einladen | Feature-spezifisch | -| LoginButton | Login | Feature-spezifisch | -| ShoutButton | Shout-Aktion | Feature-spezifisch | -| ObserveButton | Beobachten | Feature-spezifisch | -| EmotionButton | Emotion | Feature-spezifisch | -| JoinLeaveButton | Beitreten/Verlassen | Feature-spezifisch | -| MapButton | Karten-Button | Feature-spezifisch | -| MapStylesButtons | Kartenstile | ✅ → OsButton | -| CtaJoinLeaveGroup | CTA | Feature-spezifisch | -| CtaUnblockAuthor | CTA | Feature-spezifisch | +### Button-Familie ✅ (alle nutzen OsButton) +| Komponente | Status | Notizen | +|------------|--------|---------| +| ~~Button (Styleguide)~~ | ✅ Ersetzt | → OsButton | +| ~~BaseButton~~ | ✅ Gelöscht | → OsButton (133 Buttons) | +| CustomButton | ✅ Nutzt OsButton | Feature-Wrapper | +| ActionButton | ✅ Nutzt OsButton | Feature-Wrapper | +| HeaderButton | ✅ Nutzt OsButton | Feature-Wrapper | +| LabeledButton | ✅ Nutzt OsButton | Feature-Wrapper | +| MenuBarButton | ✅ Nutzt OsButton | Feature-Wrapper | +| FollowButton | ✅ Nutzt OsButton | Feature-spezifisch | +| GroupButton | ✅ Nutzt OsButton | Feature-spezifisch | +| InviteButton | ✅ Nutzt OsButton | Feature-spezifisch | +| LoginButton | ✅ Nutzt OsButton | Feature-spezifisch | +| EmotionButton | ✅ Nutzt OsButton | Feature-spezifisch | +| JoinLeaveButton | ✅ Nutzt OsButton | Feature-spezifisch | +| MapButton | ✅ Nutzt OsButton | Feature-spezifisch | +| MapStylesButtons | ✅ Nutzt OsButton | Feature-spezifisch | +| PaginationButtons | ✅ Nutzt OsButton | Feature-spezifisch | +| CtaJoinLeaveGroup | ✅ Nutzt OsButton | Feature-spezifisch | +| CtaUnblockAuthor | ✅ Nutzt OsButton | Feature-spezifisch | ### Modal-Familie (zur Konsolidierung) | Komponente | Beschreibung | Ziel | @@ -366,24 +356,26 @@ Migration vollständig abgeschlossen. 0 `` Tags verbleiben in Vue-T ## Kategorisierung -### Basis-Komponenten (hohe Priorität) -Diese sollten zuerst migriert werden: -- Button → OsButton -- Card → OsCard -- Icon → OsIcon +### Basis-Komponenten — UI-Library ✅ +- ~~Button → OsButton~~ ✅ +- ~~Card → OsCard~~ ✅ +- ~~Icon → OsIcon~~ ✅ +- ~~Spinner → OsSpinner~~ ✅ + +### Basis-Komponenten — UI-Library (ausstehend) - Modal → OsModal - Input → OsInput - Select → OsSelect -- Avatar → OsAvatar -- Spinner → OsSpinner +- Avatar → OsAvatar (falls benötigt) -### Layout-Komponenten -- Container, Flex, Grid, Page, Section, Space +### Layout & Typography — → Plain HTML ✅ (Tier A) +- ~~Container, Flex, FlexItem, Section, Space~~ ✅ → HTML + CSS +- ~~Heading, Text, List, ListItem, Tag, Placeholder~~ ✅ → HTML + CSS -### Typography -- Heading, Text +### Noch zu migrieren (Tier B → Plain HTML) +- Chip, Number, Grid, GridItem, Radio -### Feature-Komponenten (niedrigere Priorität) +### Feature-Komponenten (bleiben in Webapp) - Chat, Group, Registration, Search, etc. --- @@ -409,6 +401,9 @@ Diese sollten zuerst migriert werden: | 2026-02-09 | Claude | **Milestone 4a abgeschlossen** | 6 weitere: donations, profile (2x), badges, notifications/index, ReportRow | | 2026-02-11 | Claude | **M4b: icon + circle** | icon-Slot implementiert, circle-Prop mit CVA | | 2026-02-11 | Claude | **9 icon-Buttons migriert (M4c)** | DisableModal, DeleteUserModal, CtaUnblockAuthor, LocationSelect, CategoriesSelect, my-email-address, profile Chat, PaginationButtons (2x circle) | +| 2026-02-11→18 | Claude | **Sessions 12-26** | OsButton M4c abgeschlossen, OsIcon, OsSpinner, OsCard implementiert + Webapp-Migration, BaseButton/BaseCard/BaseIcon/LoadingSpinner gelöscht | +| 2026-02-19 | Claude | **Tier A Migration** | 10 ds-* Vue-Wrapper → Plain HTML + CSS, _ds-compat.scss, ~450 Nutzungen in ~90 Dateien | +| 2026-02-19 | Claude | **Katalog konsolidiert** | Styleguide- und Webapp-Tabellen aktualisiert, veraltete Status korrigiert | --- @@ -417,40 +412,40 @@ Diese sollten zuerst migriert werden: ### Phase 0: Analyse ✅ 1. [x] Webapp-Komponenten auflisten 2. [x] Styleguide-Komponenten auflisten -3. [x] Offensichtliche Duplikate identifizieren -4. [x] Button-Familie im Detail analysieren -5. [x] Modal-Familie im Detail analysieren -6. [x] Menu-Familie im Detail analysieren -7. [x] Priorisierung festlegen -8. [x] Konsolidierungsplan finalisieren +3. [x] Duplikate und Familien identifizieren +4. [x] Button/Modal/Menu im Detail analysieren +5. [x] Priorisierung und Konsolidierungsplan -### Phase 3: OsButton Migration (in Arbeit) -9. [x] OsButton entwickeln (CVA, vue-demi) -10. [x] Webapp-Integration (Jest, Docker, CI) -11. [x] 16 Buttons migrieren (validiert ✅) +### Phase 3: OsButton Migration ✅ +6. [x] OsButton entwickeln (CVA, vue-demi) +7. [x] 133 Buttons in 79 Dateien migriert +8. [x] BaseButton.vue gelöscht, base-components.js Plugin entfernt -**Milestone 4a: 14 Buttons ohne neue Props** ✅ -12. [x] Modal Cancel-Buttons (3) -13. [x] Form Cancel/Submit-Buttons (3) -14. [x] ImageUploader Crop-Buttons (2) -15. [x] Page Buttons (6) +### Phase 4: Tier 1 — UI-Library Kern ✅ +9. [x] OsIcon + 82 Ocelot-Icons, BaseIcon gelöscht +10. [x] OsSpinner + Webapp-Migration, LoadingSpinner gelöscht +11. [x] OsCard + Webapp-Migration, BaseCard gelöscht -**Milestone 4b: Props für ~49 Buttons hinzufügen** -16. [x] icon-Slot zu OsButton hinzufügen ✅ -17. [x] circle-Variant zu OsButton hinzufügen ✅ -18. [ ] loading-Prop zu OsButton hinzufügen +### Phase 4: Tier A — ds-* → Plain HTML ✅ +12. [x] _ds-compat.scss Utility-Klassen +13. [x] 10 ds-* Wrapper → HTML + CSS (~450 Nutzungen, ~90 Dateien) -**Milestone 4c: ~49 Buttons mit neuen Props migrieren** -19. [ ] Button-Komponenten (~15) -20. [ ] Navigation (~8) -21. [ ] Editor (~15) -22. [ ] Filter/Chat (~10) -23. [ ] Forms/Modals (~5) -24. [ ] Features/Pages (~12) +### Phase 4: Tier B — ds-* → Plain HTML (ausstehend) +14. [ ] ds-chip (5 Dateien) → `` +15. [ ] ds-number (5 Dateien) → `

    ` +16. [ ] ds-grid / ds-grid-item (10 Dateien) → CSS Grid +17. [ ] ds-radio (1 Datei) → native `` + +### Phase 4: Tier 2-4 — UI-Library (ausstehend) +18. [ ] OsModal (7 Dateien) +19. [ ] OsInput (23 Dateien, gekoppelt mit ds-form) +20. [ ] OsMenu / OsMenuItem (17 Dateien) +21. [ ] OsSelect (3 Dateien), OsTable (7 Dateien) +22. [ ] ds-form → HTML `` oder OsForm (18 Dateien) --- -**✅ Phase 0 abgeschlossen!** Phase 3 zu 27% erledigt (24/90 Buttons migriert). Milestone 4a: 8/14 Buttons. +**✅ Phase 0-3 abgeschlossen. Phase 4: Tier 1 + Tier A ✅, Tier B + Tier 2-4 ausstehend.** --- @@ -544,66 +539,47 @@ Diese sollten zuerst migriert werden: --- -### Feature-Buttons (Business-Logik) +### Feature-Buttons (Business-Logik) ✅ -Diese Buttons enthalten Business-Logik und sollten **nicht** in OsButton konsolidiert werden: +Feature-Buttons behalten Business-Logik, nutzen aber intern alle OsButton: -| Komponente | Beschreibung | Migration | -|------------|--------------|-----------| -| FollowButton | Folgen/Entfolgen Logik | Bleibt Feature-Komponente | -| GroupButton | Gruppen-Aktionen | Bleibt Feature-Komponente | -| InviteButton | Einladungs-Logik | Bleibt Feature-Komponente | -| LoginButton | Auth-Logik | Bleibt Feature-Komponente | -| ShoutButton | Shout-Logik | Bleibt Feature-Komponente | -| ObserveButton | Beobachten-Logik | Bleibt Feature-Komponente | -| EmotionButton | Reaktions-Logik | Bleibt Feature-Komponente | -| JoinLeaveButton | Gruppen Beitreten/Verlassen | Bleibt Feature-Komponente | -| MapButton | Karten-Toggle | Bleibt Feature-Komponente | -| MapStylesButtons | Kartenstil-Auswahl | Bleibt Feature-Komponente | -| PaginationButtons | Seitennavigation | Bleibt Feature-Komponente | +| Komponente | Status | +|------------|--------| +| FollowButton | ✅ Nutzt OsButton | +| GroupButton | ✅ Nutzt OsButton | +| InviteButton | ✅ Nutzt OsButton | +| LoginButton | ✅ Nutzt OsButton | +| ShoutButton | ✅ Nutzt OsButton | +| ObserveButton | ✅ Nutzt OsButton | +| EmotionButton | ✅ Nutzt OsButton | +| JoinLeaveButton | ✅ Nutzt OsButton | +| MapButton | ✅ Nutzt OsButton | +| MapStylesButtons | ✅ Nutzt OsButton | +| PaginationButtons | ✅ Nutzt OsButton | --- -### Konsolidierungsvorschlag: OsButton +### Konsolidierungsvorschlag: OsButton ✅ IMPLEMENTIERT +> **Hinweis:** Die tatsächliche API weicht vom ursprünglichen Vorschlag ab. +> Siehe `packages/ui/src/components/OsButton/OsButton.vue` für die aktuelle Implementierung. + +**Implementierte API (CVA-basiert):** ```typescript interface OsButtonProps { - // Variante - variant?: 'default' | 'primary' | 'secondary' | 'danger' - - // Stil - filled?: boolean // Gefüllter Hintergrund (default: false = outline) - ghost?: boolean // Komplett transparent - - // Größe - size?: 'tiny' | 'small' | 'base' | 'large' - - // Form - circle?: boolean // Runder Button - fullWidth?: boolean // Volle Breite - - // Icon - icon?: string - iconPosition?: 'left' | 'right' - - // Zustände + variant?: 'default' | 'primary' | 'secondary' | 'danger' | 'warning' | 'success' | 'info' + appearance?: 'filled' | 'outline' | 'ghost' // statt separate booleans + size?: 'sm' | 'md' | 'lg' | 'xl' // vereinfachte Größen + circle?: boolean + fullWidth?: boolean loading?: boolean disabled?: boolean - - // Link-Support - to?: string | RouteLocationRaw // Router-Link - href?: string // Externer Link - - // Button-Typ - type?: 'button' | 'submit' + as?: 'button' | 'a' | 'nuxt-link' | 'router-link' | Component // polymorphes Rendering + type?: 'button' | 'submit' | 'reset' + // Icon: slot-basiert ( @@ -69,3 +69,20 @@ export default { }, } + + diff --git a/webapp/pages/admin/donations.vue b/webapp/pages/admin/donations.vue index 5cee3260d..bc13f3afc 100644 --- a/webapp/pages/admin/donations.vue +++ b/webapp/pages/admin/donations.vue @@ -2,12 +2,12 @@

    {{ $t('admin.donations.name') }}

    - +

    - +

    @@ -70,3 +70,22 @@ export default { }, } + + diff --git a/webapp/pages/admin/invite.vue b/webapp/pages/admin/invite.vue index c5cda51fb..dfb9b592c 100644 --- a/webapp/pages/admin/invite.vue +++ b/webapp/pages/admin/invite.vue @@ -1,13 +1,13 @@ + + diff --git a/webapp/pages/groups/edit/_id.vue b/webapp/pages/groups/edit/_id.vue index 35a2afc63..bdae345b2 100644 --- a/webapp/pages/groups/edit/_id.vue +++ b/webapp/pages/groups/edit/_id.vue @@ -1,25 +1,25 @@ @@ -87,3 +87,20 @@ export default { margin-top: 0; } + + diff --git a/webapp/pages/groups/edit/_id/__snapshots__/invites.spec.js.snap b/webapp/pages/groups/edit/_id/__snapshots__/invites.spec.js.snap index b1994d956..023fdbbd4 100644 --- a/webapp/pages/groups/edit/_id/__snapshots__/invites.spec.js.snap +++ b/webapp/pages/groups/edit/_id/__snapshots__/invites.spec.js.snap @@ -13,8 +13,7 @@ exports[`invites.vue renders 1`] = `
    - {{ $t('group.general') }} - +

    {{ $t('group.general') }}

    +
    diff --git a/webapp/pages/groups/edit/_id/invites.vue b/webapp/pages/groups/edit/_id/invites.vue index 04c8087ff..e69a658d6 100644 --- a/webapp/pages/groups/edit/_id/invites.vue +++ b/webapp/pages/groups/edit/_id/invites.vue @@ -1,8 +1,8 @@ - +
    - +
    - +
    - +
    - - +
    +
    diff --git a/webapp/pages/index.vue b/webapp/pages/index.vue index dd00d59f8..6a907e3ba 100644 --- a/webapp/pages/index.vue +++ b/webapp/pages/index.vue @@ -138,8 +138,8 @@ diff --git a/webapp/pages/logout.vue b/webapp/pages/logout.vue index c0fe2e81f..8820ee032 100644 --- a/webapp/pages/logout.vue +++ b/webapp/pages/logout.vue @@ -1,16 +1,16 @@ + + diff --git a/webapp/pages/notifications/index.vue b/webapp/pages/notifications/index.vue index 66db34287..1054cce20 100644 --- a/webapp/pages/notifications/index.vue +++ b/webapp/pages/notifications/index.vue @@ -1,17 +1,17 @@ @@ -157,6 +157,12 @@ export default { } diff --git a/webapp/pages/post/edit/_id.vue b/webapp/pages/post/edit/_id.vue index de6b7d2e0..f0d19a1b2 100644 --- a/webapp/pages/post/edit/_id.vue +++ b/webapp/pages/post/edit/_id.vue @@ -1,14 +1,14 @@ @@ -89,4 +89,18 @@ export default { .ds-heading { margin-top: 0; } + +.post-edit-layout__main, +.post-edit-layout__aside { + flex: 0 0 100%; + width: 100%; +} +@media #{$media-query-medium} { + .post-edit-layout__main { + flex: 3 0 0; + } + .post-edit-layout__aside { + flex: 1 0 0; + } +} diff --git a/webapp/pages/profile/_id/__snapshots__/_slug.spec.js.snap b/webapp/pages/profile/_id/__snapshots__/_slug.spec.js.snap index c830c6efc..9e1ac9a37 100644 --- a/webapp/pages/profile/_id/__snapshots__/_slug.spec.js.snap +++ b/webapp/pages/profile/_id/__snapshots__/_slug.spec.js.snap @@ -4,17 +4,14 @@ exports[`ProfileSlug given an authenticated user given another profile user and

    @undefined @@ -269,7 +265,7 @@ exports[`ProfileSlug given an authenticated user given another profile user and

    profile.memberSince @@ -284,7 +280,6 @@ exports[`ProfileSlug given an authenticated user given another profile user and >

    profile.network.title @@ -457,8 +449,7 @@ exports[`ProfileSlug given an authenticated user given another profile user and />

    @undefined @@ -1014,7 +996,7 @@ exports[`ProfileSlug given an authenticated user given another profile user and

    profile.memberSince @@ -1023,8 +1005,7 @@ exports[`ProfileSlug given an authenticated user given another profile user and

    @@ -1066,7 +1047,6 @@ exports[`ProfileSlug given an authenticated user given another profile user and >

    profile.network.title @@ -1239,8 +1216,7 @@ exports[`ProfileSlug given an authenticated user given another profile user and />

    @undefined @@ -1733,7 +1700,7 @@ exports[`ProfileSlug given an authenticated user given the logged in user as pro

    profile.memberSince @@ -1748,7 +1715,6 @@ exports[`ProfileSlug given an authenticated user given the logged in user as pro >

    profile.network.title @@ -1844,8 +1807,7 @@ exports[`ProfileSlug given an authenticated user given the logged in user as pro />

    @undefined @@ -2376,7 +2329,7 @@ exports[`ProfileSlug given an authenticated user given the logged in user as pro

    profile.memberSince @@ -2385,8 +2338,7 @@ exports[`ProfileSlug given an authenticated user given the logged in user as pro

    profile.network.title @@ -2529,8 +2477,7 @@ exports[`ProfileSlug given an authenticated user given the logged in user as pro />

    settings.notifications.post @@ -28,8 +26,7 @@ exports[`notifications.vue mount renders 1`] = ` class="notifcation-settings-section" >

    settings.notifications.group @@ -82,8 +76,7 @@ exports[`notifications.vue mount renders 1`] = ` class="notifcation-settings-section" >