From daafde24b039bfde94e1d7fb3efebaf11eab527a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 19 Feb 2026 02:51:05 +0100 Subject: [PATCH] refactor(package/ui): os-spinner (#9245) --- packages/ui/PROJEKT.md | 66 ++++- .../ui/src/components/OsButton/OsButton.vue | 49 +-- .../components/OsButton/button.variants.ts | 3 + packages/ui/src/components/OsButton/index.ts | 2 +- .../components/OsSpinner/OsSpinner.spec.ts | 149 ++++++++++ .../components/OsSpinner/OsSpinner.stories.ts | 113 +++++++ .../OsSpinner/OsSpinner.visual.spec.ts | 101 +++++++ .../ui/src/components/OsSpinner/OsSpinner.vue | 120 ++++++++ .../__screenshots__/chromium/all-sizes.png | Bin 0 -> 6305 bytes .../chromium/inherit-color.png | Bin 0 -> 4208 bytes .../__screenshots__/chromium/inline-text.png | Bin 0 -> 7997 bytes packages/ui/src/components/OsSpinner/index.ts | 2 + .../components/OsSpinner/spinner.variants.ts | 13 + packages/ui/src/components/index.ts | 3 +- packages/ui/src/types.d.ts | 12 +- webapp/Dockerfile | 5 +- webapp/Dockerfile.maintenance | 5 +- webapp/components/Uploader/ImageUploader.vue | 7 +- .../LoadingSpinner/LoadingSpinner.story.js | 11 - .../generic/LoadingSpinner/LoadingSpinner.vue | 48 --- webapp/pages/admin/index.vue | 91 +++--- .../_id/__snapshots__/_slug.spec.js.snap | 280 ++++++++++++++---- webapp/pages/groups/_id/_slug.vue | 13 +- webapp/pages/index.vue | 7 +- .../_id/__snapshots__/_slug.spec.js.snap | 112 +++++-- webapp/pages/profile/_id/_slug.vue | 13 +- 26 files changed, 976 insertions(+), 249 deletions(-) create mode 100644 packages/ui/src/components/OsSpinner/OsSpinner.spec.ts create mode 100644 packages/ui/src/components/OsSpinner/OsSpinner.stories.ts create mode 100644 packages/ui/src/components/OsSpinner/OsSpinner.visual.spec.ts create mode 100644 packages/ui/src/components/OsSpinner/OsSpinner.vue create mode 100644 packages/ui/src/components/OsSpinner/__screenshots__/chromium/all-sizes.png create mode 100644 packages/ui/src/components/OsSpinner/__screenshots__/chromium/inherit-color.png create mode 100644 packages/ui/src/components/OsSpinner/__screenshots__/chromium/inline-text.png create mode 100644 packages/ui/src/components/OsSpinner/index.ts create mode 100644 packages/ui/src/components/OsSpinner/spinner.variants.ts delete mode 100644 webapp/components/_new/generic/LoadingSpinner/LoadingSpinner.story.js delete mode 100644 webapp/components/_new/generic/LoadingSpinner/LoadingSpinner.vue diff --git a/packages/ui/PROJEKT.md b/packages/ui/PROJEKT.md index 874b40636..4ff7c5493 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: ██░░░░░░░░ 24% (4/17 Aufgaben) - OsButton ✅, OsIcon ✅, System-Icons ✅, BaseIcon→OsIcon Migration ✅ +Phase 4: ████░░░░░░ 35% (6/17 Aufgaben) - OsButton ✅, OsIcon ✅, System-Icons ✅, BaseIcon→OsIcon Migration ✅, OsSpinner ✅, Spinner Webapp-Migration ✅ Phase 5: ░░░░░░░░░░ 0% (0/7 Aufgaben) ─────────────────────────────────────── -Gesamt: ████████░░ 77% (66/86 Aufgaben) +Gesamt: ████████░░ 79% (68/86 Aufgaben) ``` ### Katalogisierung (Details in KATALOG.md) @@ -133,6 +133,25 @@ System-Icons: Ocelot-Icons (separates Entry-Point): └─ 82 Icons (Feature-Icons + Kategorie-Icons aus Webapp migriert) +OsSpinner: +├─ size: ✅ xs, sm, md, lg, xl, 2xl (em-basiert) +├─ color: ✅ currentColor (erbt von Parent) +├─ a11y: ✅ role="status", aria-label="Loading" (customizable) +├─ decorative: ✅ aria-hidden="true" suppresses role/aria-label +├─ os-button: ✅ OsButton nutzt OsSpinner als Komponente (decorative) +├─ vue-compat: ✅ h() Render-Function mit isVue2 +└─ webapp: ✅ 4 Spinner migriert (DsSpinner + LoadingSpinner → OsSpinner) + +DsSpinner/LoadingSpinner → OsSpinner Webapp-Migration: ✅ +├─ ImageUploader.vue: LoadingSpinner → OsSpinner (size="lg") +├─ pages/profile: ds-spinner → os-spinner (size="lg") +├─ pages/groups: ds-spinner → os-spinner (size="lg") +├─ pages/admin: ds-spinner → os-spinner (size="xl") + ApolloQuery→apollo Option +├─ LoadingSpinner Komponente gelöscht +├─ ds-space centered → div+padding (Bugfix in 3 Seiten) +├─ Admin: ApolloQuery→$apollo.loading (Spinner war wg. SSR-Prefetch unsichtbar) +└─ infinite-loading: OsSpinner im spinner-Slot (index, profile, groups) + BaseIcon → OsIcon Webapp-Migration: ✅ ├─ 131 in 70+ Dateien → ├─ 82 SVGs in ocelot/icons/svgs/ (inkl. 17 Kategorie-Icons) @@ -147,11 +166,35 @@ BaseIcon → OsIcon Webapp-Migration: ✅ ## Aktueller Stand -**Letzte Aktualisierung:** 2026-02-15 (Session 22) +**Letzte Aktualisierung:** 2026-02-18 (Session 24) -**Aktuelle Phase:** Phase 4 - OsIcon ✅, BaseIcon → OsIcon Webapp-Migration ✅ +**Aktuelle Phase:** Phase 4 - OsIcon ✅, BaseIcon → OsIcon Migration ✅, OsSpinner ✅, Spinner Webapp-Migration ✅ -**Zuletzt abgeschlossen (Session 22 - BaseIcon → OsIcon Webapp-Migration):** +**Zuletzt abgeschlossen (Session 24 - OsSpinner Webapp-Migration + Refactoring):** +- [x] OsButton refactored: nutzt `h(OsSpinner, { 'aria-hidden': 'true' })` statt Inline-SVG +- [x] OsSpinner: Decorative-Modus (`aria-hidden="true"` unterdrückt role/aria-label) +- [x] `ButtonSize` Type exportiert (sm/md/lg/xl), `types.d.ts` Kommentar aktualisiert +- [x] `createSpinnerSvg.ts` wieder in OsSpinner.vue inlined (nur noch 1 Nutzer) +- [x] Webapp-Migration: 4 Spinner ersetzt (ImageUploader, profile, groups, admin) +- [x] LoadingSpinner Komponente gelöscht (ersetzt durch OsSpinner) +- [x] `` → `
` Bugfix in 3 Seiten +- [x] Admin-Seite: `` → `apollo`-Option + `$apollo.loading` (Spinner war wg. SSR-Prefetch unsichtbar) +- [x] `filterStatistics()` mutiert nicht mehr Originalobjekt (Destructuring statt `delete`) +- [x] `infinite-loading` Spinner-Slot: OsSpinner in allen 3 Nutzungen (index, profile, groups) +- [x] Einheitliches Spinner-Design: vue-infinite-loading Default-Spinner → OsSpinner + +**Zuvor abgeschlossen (Session 23 - OsSpinner Komponente):** +- [x] OsSpinner Komponente implementiert (size prop, currentColor, role="status", aria-label) +- [x] Vue 2/3 kompatibel via `h()` Render-Function mit `isVue2` +- [x] Storybook Stories: Playground, AllSizes, InheritColor, InlineWithText +- [x] Unit Tests: 23 Tests (rendering, size, accessibility, decorative mode, css, keyboard) +- [x] Visual Tests: 4 Tests (all-sizes, inherit-color, inline-text, keyboard a11y) +- [x] Accessibility: `role="status"`, `aria-label="Loading"` (customizable), axe-core checks +- [x] 100% Test-Coverage (Statements, Branches, Functions, Lines) +- [x] Completeness Check bestanden +- [x] OsButton Visual Tests: 19/19 bestanden (kein Regression durch Refactoring) + +**Zuvor abgeschlossen (Session 22 - BaseIcon → OsIcon Webapp-Migration):** - [x] 131 `` Nutzungen in 70+ Dateien → `` migriert - [x] 82 Ocelot-Icons in `packages/ui/src/ocelot/icons/svgs/` (von 1 auf 82) - [x] 17 Kategorie-Icons aus Webapp kopiert (networking, energy, psyche, movement, finance, child, mobility, shopping-cart, peace, politics, nature, science, health, media, spirituality, culture, miscellaneous) @@ -219,7 +262,7 @@ BaseIcon → OsIcon Webapp-Migration: ✅ - [x] Session 11: Wasserfarben-Farbschema, Stories konsolidiert, Keyboard A11y **Nächste Schritte:** -- [ ] OsSpinner Komponente (vereint DsSpinner + LoadingSpinner) +- [x] OsSpinner Webapp-Migration (DsSpinner + LoadingSpinner → OsSpinner) ✅ - [ ] OsCard Komponente (vereint DsCard + BaseCard) - [ ] Weitere Tier 1 Komponenten - [ ] Browser-Fehler untersuchen: `TypeError: Cannot read properties of undefined (reading 'heartO')` (ocelotIcons undefined im Browser trotz korrekter Webpack-Aliase) @@ -473,7 +516,8 @@ Jeder migrierte Button muss manuell geprüft werden: Normal, Hover, Focus, Activ **Tier 1: Kern-Komponenten** - [x] OsIcon (vereint DsIcon + BaseIcon) ✅ System-Icons + vite-svg-icon Plugin -- [ ] OsSpinner (vereint DsSpinner + LoadingSpinner) +- [x] OsSpinner (vereint DsSpinner + LoadingSpinner) ✅ OsButton nutzt OsSpinner als Komponente +- [x] OsSpinner Webapp-Migration ✅ 4 Spinner migriert, LoadingSpinner gelöscht, Admin ApolloQuery→$apollo.loading - [x] OsButton (vereint DsButton + BaseButton) ✅ Entwickelt in Phase 2 - [ ] OsCard (vereint DsCard + BaseCard) @@ -1577,6 +1621,14 @@ Bei der Migration werden: | 2026-02-15 | **8 Snapshots gelöscht** | Stale Snapshot-Dateien entfernt nach BaseIcon → OsIcon Migration | | 2026-02-15 | **CSS Migration** | `.base-icon` → `.os-icon` in main.scss und Category/index.vue | | 2026-02-15 | **Jest Mock ocelot** | `test/__mocks__/@ocelot-social/ui/ocelot.js` für ocelotIcons in Jest-Umgebung | +| 2026-02-18 | **OsSpinner Komponente** | Neue Komponente: size (xs-2xl, em-basiert), currentColor, role="status", aria-label; Vue 2/3 via h() + isVue2 | +| 2026-02-18 | **OsSpinner Decorative** | `aria-hidden="true"` unterdrückt role/aria-label; OsButton nutzt OsSpinner als Komponente (decorative) | +| 2026-02-18 | **ButtonSize Type** | `ButtonSize` (sm/md/lg/xl) exportiert aus button.variants.ts; types.d.ts Kommentar: Size ist Vokabular, nicht Pflicht | +| 2026-02-18 | **OsSpinner Webapp-Migration** | 4 Stellen migriert: ImageUploader, profile, groups, admin; LoadingSpinner gelöscht | +| 2026-02-18 | **ds-space centered Bugfix** | `` → `
` in 3 Seiten (Styleguide-Bug) | +| 2026-02-18 | **Admin Spinner Fix** | `` → `apollo`-Option + `$apollo.loading`; SSR-Prefetch verhinderte Loading-State im Client | +| 2026-02-18 | **filterStatistics Fix** | `delete data.__typename` → Destructuring `{ __typename, ...rest }` (keine Mutation des Originalobjekts) | +| 2026-02-18 | **infinite-loading Spinner-Slot** | OsSpinner im `spinner`-Slot von vue-infinite-loading in 3 Seiten (index, profile, groups); einheitliches Spinner-Design | --- diff --git a/packages/ui/src/components/OsButton/OsButton.vue b/packages/ui/src/components/OsButton/OsButton.vue index e85c268bd..98899ff98 100644 --- a/packages/ui/src/components/OsButton/OsButton.vue +++ b/packages/ui/src/components/OsButton/OsButton.vue @@ -1,11 +1,12 @@ diff --git a/packages/ui/src/components/OsSpinner/__screenshots__/chromium/all-sizes.png b/packages/ui/src/components/OsSpinner/__screenshots__/chromium/all-sizes.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7a638234f1549c194255f82ed386439a6585c4 GIT binary patch literal 6305 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 literal 0 HcmV?d00001 diff --git a/packages/ui/src/components/OsSpinner/__screenshots__/chromium/inherit-color.png b/packages/ui/src/components/OsSpinner/__screenshots__/chromium/inherit-color.png new file mode 100644 index 0000000000000000000000000000000000000000..5476d1e6856c8ea036960c8ef1fb396e67c6b739 GIT binary patch literal 4208 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 JjpoCc{{hlb{}KQI literal 0 HcmV?d00001 diff --git a/packages/ui/src/components/OsSpinner/__screenshots__/chromium/inline-text.png b/packages/ui/src/components/OsSpinner/__screenshots__/chromium/inline-text.png new file mode 100644 index 0000000000000000000000000000000000000000..7fdbe2ad4aa54d7aaff6db18b0a9b233cfc3f6b3 GIT binary patch literal 7997 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 literal 0 HcmV?d00001 diff --git a/packages/ui/src/components/OsSpinner/index.ts b/packages/ui/src/components/OsSpinner/index.ts new file mode 100644 index 000000000..9eb190167 --- /dev/null +++ b/packages/ui/src/components/OsSpinner/index.ts @@ -0,0 +1,2 @@ +export { default as OsSpinner } from './OsSpinner.vue' +export { SPINNER_SIZES } from './spinner.variants' diff --git a/packages/ui/src/components/OsSpinner/spinner.variants.ts b/packages/ui/src/components/OsSpinner/spinner.variants.ts new file mode 100644 index 000000000..7b3e78cc0 --- /dev/null +++ b/packages/ui/src/components/OsSpinner/spinner.variants.ts @@ -0,0 +1,13 @@ +import type { Size } from '#src/types' + +/** + * Spinner size classes (em-based, scales with parent font-size) + */ +export const SPINNER_SIZES: Record = { + xs: 'h-[0.75em] w-[0.75em]', + sm: 'h-[1em] w-[1em]', + md: 'h-[1.5em] w-[1.5em]', + lg: 'h-[2em] w-[2em]', + xl: 'h-[2.5em] w-[2.5em]', + '2xl': 'h-[3em] w-[3em]', +} diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index 3cea2d04d..f416e68f3 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -7,7 +7,7 @@ * - Registered globally when using the plugin: app.use(OcelotUI) */ -export { OsButton, buttonVariants, type ButtonVariants } from './OsButton' +export { OsButton, buttonVariants, type ButtonSize, type ButtonVariants } from './OsButton' export { OsIcon, ICON_SIZES, @@ -17,3 +17,4 @@ export { SYSTEM_ICONS, type SystemIconName, } from './OsIcon' +export { OsSpinner, SPINNER_SIZES } from './OsSpinner' diff --git a/packages/ui/src/types.d.ts b/packages/ui/src/types.d.ts index dbd3bf433..8e30fe21d 100644 --- a/packages/ui/src/types.d.ts +++ b/packages/ui/src/types.d.ts @@ -1,13 +1,15 @@ /** - * Component prop types based on Tailwind CSS scales + * Shared vocabulary types for component props. * - * These types ensure consistency across all components. - * When a component supports a prop, it must support all values of that scale. + * These types define a common naming convention across components. + * Components pick the subset that makes sense for them: + * - OsIcon/OsSpinner: all 6 sizes (inline elements, em-based) + * - OsButton: sm–xl (interactive element, pixel-based touch targets) */ /** - * Size scale for components (buttons, inputs, avatars, etc.) - * Maps to Tailwind's text/spacing scale + * Size vocabulary shared across components. + * Each component supports the subset that makes sense for its context. */ export type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' diff --git a/webapp/Dockerfile b/webapp/Dockerfile index 3f2110311..e192d33f1 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -13,9 +13,8 @@ RUN apk --no-cache add git python3 make g++ RUN mkdir -p /app WORKDIR /app COPY packages/ui . -RUN --mount=type=cache,target=/yarn-cache,sharing=locked \ - yarn install --production=false --frozen-lockfile --non-interactive --cache-folder /yarn-cache -RUN yarn run build +RUN npm ci +RUN npm run build FROM node:25.6.1-alpine AS base LABEL org.label-schema.name="ocelot.social:webapp" diff --git a/webapp/Dockerfile.maintenance b/webapp/Dockerfile.maintenance index da2d12173..f673c91ef 100644 --- a/webapp/Dockerfile.maintenance +++ b/webapp/Dockerfile.maintenance @@ -23,9 +23,8 @@ RUN apk --no-cache add git python3 make g++ RUN mkdir -p /app WORKDIR /app COPY packages/ui . -RUN --mount=type=cache,target=/yarn-cache,sharing=locked \ - yarn install --production=false --frozen-lockfile --non-interactive --cache-folder /yarn-cache -RUN yarn run build +RUN npm ci +RUN npm run build FROM node:25.6.1-alpine AS build ENV NODE_ENV="production" diff --git a/webapp/components/Uploader/ImageUploader.vue b/webapp/components/Uploader/ImageUploader.vue index 2a6241ea0..9de81a605 100644 --- a/webapp/components/Uploader/ImageUploader.vue +++ b/webapp/components/Uploader/ImageUploader.vue @@ -7,7 +7,7 @@ :use-custom-slot="true" @vdropzone-file-added="fileAdded" > - +
{{ $t('contribution.teaserImage.supportedFormats') }} @@ -58,20 +58,19 @@ - - diff --git a/webapp/pages/admin/index.vue b/webapp/pages/admin/index.vue index 84cc85199..91657da8f 100644 --- a/webapp/pages/admin/index.vue +++ b/webapp/pages/admin/index.vue @@ -1,69 +1,70 @@