From c6f31da8d1804a38cfcb3aad22a3b3384ea4edba Mon Sep 17 00:00:00 2001 From: Mao Nakamoto <41178744+catomean@users.noreply.github.com> Date: Mon, 31 Aug 2026 09:49:54 +0200 Subject: [PATCH 1/6] chore: add a formatter, matching the style this repo already writes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit singleQuote=true was chosen by counting this repo's own imports, not by fleet decree. The fleet is genuinely split and the two repos that already had a .prettierrc disagreed with each other, so there was no standard to restore. Quote style does not cross repo boundaries; having a gate does. Markdown is ignored for now — prettier rewraps prose, which would bury the real diff. Co-Authored-By: Claude Opus 5 --- .prettierignore | 31 +++++++++++++++++++++++++++++++ .prettierrc | 9 +++++++++ package-lock.json | 17 +++++++++++++++++ package.json | 7 +++++-- 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..b6986633c --- /dev/null +++ b/.prettierignore @@ -0,0 +1,31 @@ +# Build output and vendored trees — formatting these is noise. +node_modules +.next +dist +build +out +coverage +.turbo +.vercel +*.min.js +*.min.css + +# Generated during a build, so it is absent locally and present in CI — which +# makes a clean local --check no evidence at all. Contentlayer's output also +# uses import assertions, which prettier's parser rejects outright. +.contentlayer +.astro +.svelte-kit +storybook-static +test-results +playwright-report + +# Lockfiles are generated; prettier would rewrite them wholesale. +package-lock.json +pnpm-lock.yaml +yarn.lock + +# Markdown is deliberately out of scope for now. Prettier rewraps prose, which +# is where it is most opinionated and least useful, and it would bury the real +# diff. Remove this line when you want docs formatted too. +*.md diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..616247af0 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "semi": true, + "singleQuote": true, + "printWidth": 100, + "tabWidth": 2, + "trailingComma": "all", + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/package-lock.json b/package-lock.json index e4ac66bdf..f5366d774 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,6 +88,7 @@ "lint-staged": "^17.3.0", "npm-run-all": "^4.1.5", "postcss": "^8.5.26", + "prettier": "3.9.6", "tailwindcss": "^4.3.0", "typescript": "^5.3.3" }, @@ -16743,6 +16744,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", diff --git a/package.json b/package.json index 55cb2c67a..6927d65bd 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "deploy:selfhost": "bash scripts/selfhost-deploy-revampit.sh", "ship": "bash scripts/ship.sh", "typecheck": "tsc -p tsconfig.json --noEmit", - "verify": "npm run lint && npm run lint:umlauts && npm run lint:chrome && npm run lint:docs && npm run compliance:ci && npm run typecheck && npm run test && npm run build", + "verify": "npm run format:check && npm run lint && npm run lint:umlauts && npm run lint:chrome && npm run lint:docs && npm run compliance:ci && npm run typecheck && npm run test && npm run build", "prod:build": "docker build -f Dockerfile.prod -t revampit-app:latest .", "prod:up": "docker compose -f docker-compose.prod.yml up -d", "prod:down": "docker compose -f docker-compose.prod.yml down", @@ -93,7 +93,9 @@ "prepare": "husky", "i18n:stale": "node scripts/i18n-stale.mjs", "i18n:stale-update": "node scripts/i18n-stale.mjs --update", - "compliance:i18n-stale": "node scripts/i18n-stale.mjs" + "compliance:i18n-stale": "node scripts/i18n-stale.mjs", + "format": "prettier --write .", + "format:check": "prettier --check ." }, "dependencies": { "@auth/pg-adapter": "^1.11.3", @@ -178,6 +180,7 @@ "lint-staged": "^17.3.0", "npm-run-all": "^4.1.5", "postcss": "^8.5.26", + "prettier": "3.9.6", "tailwindcss": "^4.3.0", "typescript": "^5.3.3" }, From 68dc0914d70d63eec885d513faf9ae80c35a8ec9 Mon Sep 17 00:00:00 2001 From: Mao Nakamoto <41178744+catomean@users.noreply.github.com> Date: Mon, 31 Aug 2026 10:36:13 +0200 Subject: [PATCH 2/6] style: format with prettier, and close a comment that was never closed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The formatter refused this repo outright, which turned out to be a real defect rather than a tooling complaint. kivitendo-intake.css opens a header comment, and line 17 contains an inner /* ⚠ PRÜFEN */ — CSS comments do not nest, so that inner terminator CLOSES the header. Everything after it is parsed as CSS until the stray */ on line 20. A browser mis-parses it the same way. The file exists in two places (public/presentations/ and deliverables/), both carrying the same defect; fixing one still failed the gate, which is how the duplicate surfaced at all. Mechanical otherwise. This SHA is listed in .git-blame-ignore-revs. --- .github/FUNDING.yml | 2 +- .github/ISSUE_TEMPLATE/bug_report.yml | 6 +- .github/ISSUE_TEMPLATE/feature_request.yml | 6 +- .github/dependabot.yml | 70 +- __mocks__/next-intl.js | 42 +- .../handoff.html | 791 +- .../kivitendo-intake.css | 174 +- .../mockup.html | 733 +- docker-compose.prod.yml | 33 +- docker-compose.yml | 32 +- drizzle.config.ts | 4 +- drizzle/meta/0000_snapshot.json | 1571 +- drizzle/meta/0001_snapshot.json | 1615 +- drizzle/meta/_journal.json | 2 +- eslint.config.mjs | 91 +- examples/nextjs-basic/pages/admin.tsx | 79 +- examples/nextjs-basic/pages/index.tsx | 128 +- jest.config.js | 32 +- jest.setup.js | 46 +- messages/de.json | 69 +- messages/en.json | 69 +- messages/es.json | 69 +- messages/fr.json | 69 +- messages/it.json | 69 +- messages/ja.json | 97 +- messages/ko.json | 193 +- messages/ru.json | 51 +- next.config.js | 12 +- packages/ai-native-cms-core/package.json | 4 +- .../src/ai/TemplateInstructionGenerator.ts | 120 +- packages/ai-native-cms-core/src/ai/index.ts | 24 +- .../src/ai/templates/index.ts | 80 +- .../src/core/AINativeCMS.ts | 281 +- packages/ai-native-cms-core/src/index.ts | 42 +- .../ConsoleNotificationProvider.ts | 86 +- .../DiscordNotificationProvider.ts | 145 +- .../EmailNotificationProvider.ts | 181 +- .../SlackNotificationProvider.ts | 116 +- .../WebhookNotificationProvider.ts | 160 +- .../src/notifications/index.ts | 86 +- .../src/storage/MemoryStorageAdapter.ts | 114 +- .../src/storage/PostgreSQLStorageAdapter.ts | 228 +- .../ai-native-cms-core/src/storage/index.ts | 34 +- .../ai-native-cms-core/src/types/events.ts | 60 +- .../ai-native-cms-core/src/types/index.ts | 226 +- .../src/utils/RateLimiter.ts | 78 +- packages/ai-native-cms-react/package.json | 2 +- .../src/components/AdminDashboard.tsx | 255 +- .../src/components/SuggestionWidget.tsx | 298 +- .../src/hooks/useAINativeCMS.ts | 72 +- .../src/hooks/useSuggestions.ts | 205 +- packages/ai-native-cms-react/src/index.ts | 18 +- .../src/providers/AINativeCMSProvider.tsx | 96 +- .../src/styles/AdminDashboard.css | 58 +- .../src/styles/SuggestionWidget.css | 23 +- packages/saldo/scripts/add-js-ext.mjs | 16 +- packages/saldo/scripts/rename.mjs | 96 +- packages/saldo/src/brand.ts | 4 +- packages/saldo/src/categories.ts | 22 +- packages/saldo/src/holidays.ts | 56 +- packages/saldo/src/index.ts | 10 +- packages/saldo/src/saldo.ts | 155 +- packages/saldo/src/schedule.ts | 89 +- packages/saldo/test/saldo.test.ts | 284 +- public/data/hirn/income_2015.json | 2 +- public/data/hirn/income_2016.json | 2 +- public/data/hirn/income_2017.json | 2 +- public/data/hirn/income_2018.json | 2 +- public/data/hirn/income_2019.json | 2 +- public/data/hirn/income_2020.json | 2 +- public/data/hirn/income_2021.json | 2 +- public/data/hirn/income_2022.json | 2 +- public/data/hirn/income_2023.json | 2 +- public/data/hirn/income_2024.json | 2 +- public/data/hirn/income_2025.json | 2 +- public/data/hirn/summary.json | 25 +- .../presentations/_assets/pptxgen.bundle.js | 18426 +++++++++++++++- public/presentations/aoz-wohnen/index.html | 2965 ++- .../bewerbung-koch-original/index.html | 3230 ++- .../bewerbung-koch-vorschlag/index.html | 3463 ++- .../presentations/bewerbung-koch/index.html | 3654 ++- .../ki-nachhaltigkeit/index.html | 3823 ++-- .../presentations/kivitendo-intake/index.html | 803 +- .../kivitendo-intake/kivitendo-intake.css | 174 +- .../presentations/kivvi-plattform/index.html | 1180 +- .../revamp-info-plattform/index.html | 1214 +- .../presentations/revampit-portal/index.html | 1253 +- .../swico-monitor-upcycling/index.html | 3274 ++- public/saldo/index.html | 1865 +- public/test-button.html | 72 +- scripts/add-sample-products.ts | 80 +- scripts/auto-process-refunds.js | 169 +- scripts/baselines/i18n-missing.json | 10 +- scripts/db/seed-org-numbers.ts | 81 +- scripts/dev-banner.js | 42 +- scripts/dev-mint-session.ts | 51 +- scripts/dev/auth-unlock-user.ts | 85 +- scripts/e2e-seed.ts | 111 +- scripts/fix-contrast-issues.mjs | 95 +- scripts/generate-admin-hash.js | 36 +- scripts/generate-og-images.mjs | 44 +- scripts/hirn-ingest-api-routes.ts | 212 +- scripts/hirn-ingest-schema.ts | 181 +- scripts/hirn-ingest.ts | 125 +- scripts/i18n-apply-leaks.mjs | 72 +- scripts/i18n-apply.mjs | 124 +- scripts/i18n-audit.mjs | 101 +- scripts/i18n-businessplan-parity.mjs | 122 +- scripts/i18n-hardcoded-audit.mjs | 508 +- scripts/i18n-leaks.mjs | 134 +- scripts/i18n-merge-chunks.mjs | 40 +- scripts/i18n-missing.mjs | 62 +- scripts/i18n-split-chunks.mjs | 34 +- scripts/i18n-stale.mjs | 105 +- .../maintenance/hr-application-retention.ts | 16 +- scripts/ops/r2-backup-upload.cjs | 110 +- scripts/optimize-minisite-photos.mjs | 47 +- scripts/pci-data-cleanup.js | 113 +- scripts/populate-sample-pages.js | 33 +- scripts/prune-businessplan-archive.mjs | 117 +- scripts/reindex-listings.ts | 9 +- scripts/setup-admin.ts | 55 +- scripts/setup-all-admins.ts | 106 +- scripts/setup-test-data.js | 27 +- scripts/ssot-audit.mjs | 68 +- scripts/sync-businessplan-locales.mjs | 90 +- scripts/test-email.ts | 6 +- scripts/test-hirn-chat.ts | 82 +- scripts/test-hirn-retrieval.ts | 38 +- scripts/transcribe-local-audio.mjs | 120 +- src/app/[locale]/abos/AbosPageClient.tsx | 59 +- src/app/[locale]/abos/CreatePoolModal.tsx | 114 +- src/app/[locale]/abos/PoolCard.tsx | 95 +- src/app/[locale]/abos/page.tsx | 18 +- src/app/[locale]/abos/types.ts | 42 +- src/app/[locale]/abos/useAbosPage.ts | 80 +- src/app/[locale]/about/content.tsx | 51 +- src/app/[locale]/about/finances/page.tsx | 6 +- src/app/[locale]/about/impact/page.tsx | 6 +- src/app/[locale]/about/page.tsx | 24 +- src/app/[locale]/about/press/page.tsx | 6 +- src/app/[locale]/agb/page.tsx | 49 +- src/app/[locale]/ai/page.tsx | 18 +- src/app/[locale]/blog/(index)/loading.tsx | 2 +- src/app/[locale]/blog/(index)/page.tsx | 266 +- .../[locale]/blog/[slug]/BlogPasswordGate.tsx | 44 +- .../[locale]/blog/[slug]/BlogUnavailable.tsx | 21 +- src/app/[locale]/blog/[slug]/actions.ts | 26 +- src/app/[locale]/blog/[slug]/page.tsx | 97 +- src/app/[locale]/blog/error.tsx | 34 +- src/app/[locale]/blog/layout.tsx | 22 +- .../blog/submit/BlogSubmitPageClient.tsx | 152 +- src/app/[locale]/blog/submit/page.tsx | 6 +- src/app/[locale]/changelog/page.tsx | 42 +- src/app/[locale]/contact/ContactForm.tsx | 79 +- src/app/[locale]/contact/page.tsx | 68 +- src/app/[locale]/datenschutz/page.tsx | 65 +- src/app/[locale]/error.tsx | 32 +- src/app/[locale]/faq/page.tsx | 162 +- src/app/[locale]/get-involved/donate/page.tsx | 138 +- .../get-involved/internships/page.tsx | 68 +- .../get-involved/involvement-page-layout.tsx | 43 +- .../get-involved/it-hilfe-techniker/page.tsx | 71 +- .../[locale]/get-involved/kontakt/page.tsx | 48 +- src/app/[locale]/get-involved/page.tsx | 113 +- .../get-involved/partnerships/page.tsx | 70 +- .../get-involved/technical-experts/page.tsx | 71 +- .../[locale]/get-involved/volunteer/page.tsx | 68 +- .../get-involved/work-reintegration/page.tsx | 71 +- src/app/[locale]/impressum/page.tsx | 59 +- src/app/[locale]/invite/page.tsx | 277 +- .../[locale]/it-hilfe/ITHilfeHubClient.tsx | 62 +- src/app/[locale]/it-hilfe/ItHilfeFilters.tsx | 73 +- .../[locale]/it-hilfe/ItHilfePageClient.tsx | 93 +- src/app/[locale]/it-hilfe/[id]/edit/page.tsx | 370 +- src/app/[locale]/it-hilfe/[id]/layout.tsx | 44 +- src/app/[locale]/it-hilfe/[id]/page.tsx | 158 +- .../[locale]/it-hilfe/accept/AcceptButton.tsx | 73 +- src/app/[locale]/it-hilfe/accept/page.tsx | 102 +- src/app/[locale]/it-hilfe/anfragen/page.tsx | 6 +- src/app/[locale]/it-hilfe/create/page.tsx | 410 +- src/app/[locale]/it-hilfe/error.tsx | 34 +- src/app/[locale]/it-hilfe/layout.tsx | 24 +- src/app/[locale]/it-hilfe/loading.tsx | 8 +- src/app/[locale]/it-hilfe/my/offers/page.tsx | 108 +- src/app/[locale]/it-hilfe/my/page.tsx | 146 +- src/app/[locale]/it-hilfe/page.tsx | 4 +- .../it-hilfe/techniker/TechnicianCard.tsx | 40 +- .../techniker/TechnikerListClient.tsx | 135 +- .../techniker/[id]/TechnikerProfileView.tsx | 143 +- .../[locale]/it-hilfe/techniker/[id]/page.tsx | 61 +- src/app/[locale]/it-hilfe/techniker/page.tsx | 24 +- .../[locale]/karriere/CareersListClient.tsx | 65 +- .../karriere/[slug]/CareerDetailClient.tsx | 63 +- src/app/[locale]/karriere/[slug]/page.tsx | 40 +- src/app/[locale]/karriere/page.tsx | 39 +- src/app/[locale]/knowhow/page.tsx | 172 +- src/app/[locale]/layout.tsx | 46 +- .../marketplace/MarketplacePageClient.tsx | 125 +- .../marketplace/[id]/ListingActionButtons.tsx | 135 +- .../marketplace/[id]/ListingDetailClient.tsx | 84 +- .../marketplace/[id]/ListingDetails.tsx | 97 +- .../marketplace/[id]/ListingImageGallery.tsx | 73 +- .../marketplace/[id]/ListingInfoPanel.tsx | 50 +- .../marketplace/[id]/ListingSellerCard.tsx | 39 +- .../[locale]/marketplace/[id]/ReportModal.tsx | 46 +- .../marketplace/[id]/RevampitTrustStrip.tsx | 26 +- .../marketplace/[id]/SimilarListings.tsx | 41 +- src/app/[locale]/marketplace/[id]/error.tsx | 34 +- src/app/[locale]/marketplace/[id]/layout.tsx | 105 +- src/app/[locale]/marketplace/[id]/page.tsx | 88 +- src/app/[locale]/marketplace/[id]/types.ts | 2 +- .../marketplace/[id]/useListingActions.ts | 199 +- .../marketplace/__tests__/page.test.tsx | 22 +- .../marketplace/cart/CartPageClient.tsx | 250 +- src/app/[locale]/marketplace/cart/page.tsx | 4 +- .../[listingId]/CheckoutPageClient.tsx | 131 +- .../marketplace/checkout/[listingId]/page.tsx | 29 +- .../success/CheckoutSuccessPageClient.tsx | 158 +- .../marketplace/checkout/success/page.tsx | 6 +- src/app/[locale]/marketplace/error.tsx | 34 +- src/app/[locale]/marketplace/layout.tsx | 26 +- src/app/[locale]/marketplace/loading.tsx | 8 +- src/app/[locale]/marketplace/page.tsx | 8 +- .../sell/MarketplaceSellPageClient.tsx | 139 +- src/app/[locale]/marketplace/sell/page.tsx | 6 +- src/app/[locale]/members/[id]/page.tsx | 4 +- src/app/[locale]/mitglied-werden/page.tsx | 88 +- src/app/[locale]/not-found.tsx | 27 +- src/app/[locale]/opengraph-image.tsx | 14 +- src/app/[locale]/page.tsx | 152 +- src/app/[locale]/projects/[slug]/page.tsx | 85 +- src/app/[locale]/projects/page.tsx | 55 +- src/app/[locale]/reparaturbonus/data.ts | 22 +- src/app/[locale]/reparaturbonus/page.tsx | 64 +- src/app/[locale]/sellers/[id]/layout.tsx | 89 +- src/app/[locale]/sellers/[id]/page.tsx | 4 +- .../[locale]/services/ServicesPageClient.tsx | 128 +- .../[locale]/services/[service]/layout.tsx | 26 +- src/app/[locale]/services/[service]/page.tsx | 117 +- .../[locale]/services/ai-robotics/page.tsx | 38 +- .../computer-repair-upgrades/page.tsx | 8 +- .../services/data-recovery-transfer/page.tsx | 8 +- src/app/[locale]/services/data.ts | 50 +- src/app/[locale]/services/error.tsx | 32 +- src/app/[locale]/services/layout.tsx | 24 +- .../services/linux-open-source/page.tsx | 194 +- .../open-source-solutions/[slug]/page.tsx | 40 +- .../components/AlternativeCard.tsx | 48 +- .../components/AlternativeDetail.tsx | 127 +- .../components/MaturityBadge.tsx | 20 +- .../components/MigrationDifficultyBadge.tsx | 23 +- .../components/PlatformIcons.tsx | 26 +- .../components/RegistrySearch.tsx | 73 +- .../components/RelatedAlternatives.tsx | 24 +- .../components/RevampITServicesCTA.tsx | 24 +- .../services/open-source-solutions/page.tsx | 74 +- src/app/[locale]/services/page.tsx | 18 +- .../services/web-design-development/page.tsx | 53 +- .../sections/BenefitsSection.tsx | 39 +- .../sections/CTASection.tsx | 14 +- .../sections/PhilosophySection.tsx | 69 +- .../sections/ProcessSection.tsx | 28 +- .../sections/ServicesSection.tsx | 51 +- .../sections/TechnologiesClient.tsx | 122 +- .../sections/TechnologiesSection.tsx | 103 +- .../sections/ValuesSection.tsx | 24 +- .../sections/WhyOpenSourceSection.tsx | 39 +- .../[locale]/shop/category/[slug]/page.tsx | 16 +- src/app/[locale]/shop/error.tsx | 34 +- src/app/[locale]/shop/loading.tsx | 8 +- src/app/[locale]/shop/page.tsx | 8 +- src/app/[locale]/shop/product/[uuid]/page.tsx | 16 +- src/app/[locale]/shop/search/loading.tsx | 8 +- src/app/[locale]/shop/search/page.tsx | 12 +- src/app/[locale]/so-funktionierts/data.ts | 16 +- src/app/[locale]/so-funktionierts/page.tsx | 50 +- src/app/[locale]/space/page.tsx | 6 +- src/app/[locale]/techniker/[id]/page.tsx | 10 +- src/app/[locale]/techniker/page.tsx | 8 +- src/app/[locale]/transparenz/co2/page.tsx | 202 +- .../[locale]/transparenz/kennzahlen/page.tsx | 6 +- src/app/[locale]/transparenz/page.tsx | 68 +- .../[locale]/transparenz/statuten/page.tsx | 75 +- src/app/[locale]/vision/content.tsx | 67 +- src/app/[locale]/vision/page.tsx | 24 +- .../workshops/WorkshopBrowseClient.tsx | 203 +- src/app/[locale]/workshops/[slug]/data.ts | 117 +- src/app/[locale]/workshops/[slug]/page.tsx | 83 +- .../[locale]/workshops/[slug]/sections.tsx | 171 +- src/app/[locale]/workshops/error.tsx | 32 +- src/app/[locale]/workshops/layout.tsx | 8 +- src/app/[locale]/workshops/loading.tsx | 6 +- src/app/[locale]/workshops/page.tsx | 103 +- .../propose/WorkshopProposalPageClient.tsx | 97 +- .../propose/components/BasicInfoSection.tsx | 53 +- .../components/LearningObjectivesSection.tsx | 33 +- .../propose/components/LocationSection.tsx | 82 +- .../propose/components/MaterialsSection.tsx | 29 +- .../components/PracticalDetailsSection.tsx | 55 +- .../propose/components/TermsSection.tsx | 16 +- .../components/WorkshopProposalForm.tsx | 272 +- src/app/[locale]/workshops/propose/page.tsx | 6 +- src/app/admin/AdminLayoutClient.tsx | 58 +- src/app/admin/AdminSidebar.tsx | 374 +- src/app/admin/RequestAccessSection.tsx | 37 +- src/app/admin/UserMenuDropdown.tsx | 77 +- src/app/admin/analyse/finanzen/page.tsx | 224 +- src/app/admin/analyse/kennzahlen/page.tsx | 152 +- src/app/admin/analyse/loading.tsx | 4 +- src/app/admin/analyse/page.tsx | 198 +- src/app/admin/analyse/transparenz/page.tsx | 79 +- src/app/admin/analyse/wirkung/page.tsx | 162 +- .../appointments/AssignRepairerSelect.tsx | 94 +- src/app/admin/appointments/[id]/page.tsx | 76 +- src/app/admin/appointments/page.tsx | 102 +- src/app/admin/approvals/loading.tsx | 4 +- src/app/admin/approvals/page.tsx | 123 +- src/app/admin/content/blog/BlogListClient.tsx | 135 +- src/app/admin/content/blog/[id]/page.tsx | 105 +- src/app/admin/content/blog/actions.ts | 61 +- .../blog/comments/CommentModerationClient.tsx | 112 +- src/app/admin/content/blog/comments/page.tsx | 74 +- src/app/admin/content/blog/new/page.tsx | 20 +- src/app/admin/content/blog/page.tsx | 236 +- .../admin/content/categories/[id]/page.tsx | 58 +- src/app/admin/content/categories/new/page.tsx | 16 +- src/app/admin/content/categories/page.tsx | 176 +- src/app/admin/content/loading.tsx | 4 +- src/app/admin/content/media/page.tsx | 89 +- src/app/admin/content/page.tsx | 67 +- src/app/admin/content/pages/[id]/page.tsx | 84 +- src/app/admin/content/pages/new/page.tsx | 108 +- src/app/admin/content/pages/page.tsx | 157 +- src/app/admin/content/submissions/page.tsx | 28 +- .../admin/decisions/DecisionListClient.tsx | 70 +- .../decisions/[id]/DecisionDetailClient.tsx | 12 +- .../decisions/[id]/DecisionHeaderCard.tsx | 19 +- .../admin/decisions/[id]/DiscussionThread.tsx | 20 +- .../decisions/[id]/ParticipationCard.tsx | 46 +- src/app/admin/decisions/[id]/ResultsPanel.tsx | 73 +- .../[id]/edit/DecisionEditFormClient.tsx | 65 +- src/app/admin/decisions/[id]/edit/page.tsx | 26 +- .../[id]/edit/useDecisionEditForm.ts | 81 +- .../[id]/header/CancelConfirmPanel.tsx | 6 +- .../[id]/header/CloseConfirmPanel.tsx | 6 +- .../decisions/[id]/header/HeaderActions.tsx | 33 +- .../decisions/[id]/header/OptionsDisplay.tsx | 21 +- src/app/admin/decisions/[id]/page.tsx | 54 +- .../decisions/[id]/useDecisionDetailClient.ts | 2 +- .../__tests__/DecisionListClient.test.tsx | 39 +- src/app/admin/decisions/loading.tsx | 4 +- .../admin/decisions/new/AdvancedSettings.tsx | 31 +- .../decisions/new/DecisionFormClient.tsx | 63 +- .../decisions/new/DecisionOptionsEditor.tsx | 11 +- .../decisions/new/DecisionTypeSelector.tsx | 12 +- .../decisions/new/ParticipantSelector.tsx | 32 +- src/app/admin/decisions/new/page.tsx | 18 +- .../admin/decisions/new/useDecisionForm.ts | 132 +- src/app/admin/decisions/page.tsx | 43 +- .../[id]/DeliverableReviewClient.tsx | 269 +- src/app/admin/deliverables/[id]/page.tsx | 34 +- .../new/DeliverableFormClient.tsx | 67 +- src/app/admin/deliverables/new/page.tsx | 24 +- src/app/admin/deliverables/page.tsx | 56 +- .../admin/donations/DonationsPageClient.tsx | 20 +- src/app/admin/donations/page.tsx | 12 +- .../admin/erfassung/[id]/factsheet/page.tsx | 172 +- .../erfassung/page-sections/BulkSection.tsx | 42 +- .../erfassung/page-sections/CaptureSteps.tsx | 39 +- .../page-sections/ErfassungHeader.tsx | 47 +- .../page-sections/SingleCaptureForm.tsx | 55 +- src/app/admin/erfassung/page.tsx | 223 +- src/app/admin/error.tsx | 30 +- src/app/admin/feedback/SiteFeedbackList.tsx | 122 +- src/app/admin/feedback/actions.ts | 18 +- src/app/admin/feedback/page.tsx | 28 +- src/app/admin/hirn/HirnPageClient.tsx | 45 +- src/app/admin/hirn/loading.tsx | 4 +- src/app/admin/hirn/page.tsx | 12 +- .../applications/HrApplicationsPageClient.tsx | 46 +- src/app/admin/hr/applications/page.tsx | 22 +- .../hr/vacancies/HrVacanciesPageClient.tsx | 43 +- .../[id]/VacancyDetailPageClient.tsx | 102 +- src/app/admin/hr/vacancies/[id]/page.tsx | 16 +- .../hr/vacancies/new/NewVacancyPageClient.tsx | 56 +- src/app/admin/hr/vacancies/new/page.tsx | 12 +- src/app/admin/hr/vacancies/page.tsx | 18 +- src/app/admin/intake/ChecklistGroup.tsx | 321 +- src/app/admin/intake/IntakeClient.tsx | 58 +- src/app/admin/intake/IntakeDetailView.tsx | 104 +- src/app/admin/intake/IntakeKanban.tsx | 155 +- src/app/admin/intake/IntakePipelineCards.tsx | 90 +- src/app/admin/intake/IntakePipelineView.tsx | 156 +- src/app/admin/intake/[id]/label/page.tsx | 102 +- .../__tests__/deriveIntakeHeroState.test.ts | 150 +- src/app/admin/intake/capture/page.tsx | 2 +- .../intake/detail/IntakeChecklistSection.tsx | 45 +- .../intake/detail/IntakeDeviceSummary.tsx | 31 +- src/app/admin/intake/detail/IntakeHeader.tsx | 79 +- .../intake/detail/IntakePublishSection.tsx | 65 +- .../admin/intake/detail/IntakeQcStatus.tsx | 357 +- .../intake/detail/IntakeTierChangeDialog.tsx | 63 +- .../admin/intake/detail/IntakeTimeline.tsx | 28 +- src/app/admin/intake/loading.tsx | 4 +- src/app/admin/intake/page.tsx | 16 +- src/app/admin/intake/types.ts | 137 +- src/app/admin/intake/useIntakeDetail.ts | 245 +- src/app/admin/intake/useIntakePipeline.ts | 104 +- src/app/admin/it-hilfe/EditRequestModal.tsx | 70 +- src/app/admin/it-hilfe/HelperActionModal.tsx | 58 +- src/app/admin/it-hilfe/HelpersTab.tsx | 161 +- src/app/admin/it-hilfe/ITHilfeAdminClient.tsx | 140 +- src/app/admin/it-hilfe/RequestsTab.tsx | 195 +- .../__tests__/deriveHeroState.test.ts | 179 +- src/app/admin/it-hilfe/loading.tsx | 4 +- src/app/admin/it-hilfe/page.tsx | 16 +- src/app/admin/it-hilfe/shared.tsx | 62 +- src/app/admin/it-hilfe/types.ts | 116 +- src/app/admin/it-hilfe/useITHilfeAdmin.ts | 222 +- src/app/admin/layout.tsx | 48 +- src/app/admin/loading.tsx | 4 +- src/app/admin/locations/[id]/page.tsx | 183 +- src/app/admin/locations/loading.tsx | 4 +- src/app/admin/locations/new/page.tsx | 55 +- src/app/admin/locations/page.tsx | 104 +- .../admin/marketplace/EditListingModal.tsx | 59 +- .../admin/marketplace/HandleReportModal.tsx | 64 +- src/app/admin/marketplace/ListingsTab.tsx | 219 +- .../marketplace/MarketplaceAdminClient.tsx | 89 +- src/app/admin/marketplace/OrdersTab.tsx | 103 +- src/app/admin/marketplace/QuestionsTab.tsx | 85 +- src/app/admin/marketplace/ReportsTab.tsx | 117 +- src/app/admin/marketplace/StatusBadge.tsx | 20 +- src/app/admin/marketplace/VerifyActions.tsx | 83 +- .../__tests__/deriveHeroState.test.ts | 136 +- src/app/admin/marketplace/loading.tsx | 4 +- src/app/admin/marketplace/page.tsx | 16 +- src/app/admin/marketplace/types.ts | 146 +- .../admin/marketplace/useMarketplaceAdmin.ts | 289 +- .../admin/membership/MemberPaymentAction.tsx | 67 +- src/app/admin/membership/page.tsx | 136 +- src/app/admin/page.tsx | 152 +- src/app/admin/payroll/page.tsx | 26 +- .../admin/presentations/CopyLinkButton.tsx | 50 +- .../presentations/PresentationsBrowser.tsx | 86 +- .../presentations/feedback/FeedbackList.tsx | 130 +- .../admin/presentations/feedback/actions.ts | 18 +- src/app/admin/presentations/feedback/page.tsx | 32 +- src/app/admin/presentations/page.tsx | 35 +- src/app/admin/projects/[slug]/page.tsx | 51 +- src/app/admin/projects/page.tsx | 97 +- .../admin/promo-codes/PromoCodesClient.tsx | 253 +- src/app/admin/promo-codes/page.tsx | 24 +- .../admin/protocols/ProtocolListClient.tsx | 49 +- .../protocols/[id]/ProtocolDetailClient.tsx | 86 +- .../__tests__/ProtocolDetailClient.test.tsx | 100 +- .../[id]/detail/ProtocolAttendeeMapping.tsx | 68 +- .../[id]/detail/ProtocolDeleteDialog.tsx | 18 +- .../[id]/detail/ProtocolDetailFooter.tsx | 48 +- .../[id]/detail/ProtocolEmptyState.tsx | 8 +- .../[id]/detail/ProtocolErrorBanner.tsx | 8 +- .../[id]/detail/ProtocolFinalizeDialog.tsx | 92 +- .../[id]/detail/ProtocolFooterActions.tsx | 23 +- .../[id]/detail/ProtocolPipelineHeader.tsx | 50 +- .../[id]/detail/ProtocolProcessingCard.tsx | 4 +- .../[id]/detail/ProtocolSummaryCard.tsx | 16 +- .../[id]/detail/ProtocolTranscriptSource.tsx | 17 +- src/app/admin/protocols/[id]/page.tsx | 122 +- src/app/admin/protocols/loading.tsx | 4 +- .../protocols/new/ProtocolFormClient.tsx | 175 +- .../new/__tests__/ProtocolFormClient.test.tsx | 57 +- src/app/admin/protocols/new/page.tsx | 40 +- src/app/admin/protocols/page.tsx | 590 +- src/app/admin/reviews/page.tsx | 81 +- src/app/admin/rueckmeldungen/page.tsx | 181 +- src/app/admin/services/[id]/edit/page.tsx | 42 +- src/app/admin/services/loading.tsx | 4 +- src/app/admin/services/new/page.tsx | 22 +- src/app/admin/services/page.tsx | 174 +- src/app/admin/settings/email/page.tsx | 16 +- src/app/admin/settings/loading.tsx | 4 +- src/app/admin/settings/page.tsx | 55 +- src/app/admin/tasks/TaskFiltersClient.tsx | 114 +- src/app/admin/tasks/TaskTable.tsx | 83 +- src/app/admin/tasks/[id]/TaskAIChat.tsx | 44 +- .../admin/tasks/[id]/TaskActionsClient.tsx | 82 +- .../tasks/[id]/TaskRequestResponseButtons.tsx | 69 +- .../admin/tasks/[id]/detail/TaskAlerts.tsx | 22 +- .../admin/tasks/[id]/detail/TaskHeader.tsx | 30 +- .../tasks/[id]/detail/TaskMainContent.tsx | 38 +- .../admin/tasks/[id]/detail/TaskSidebar.tsx | 72 +- .../tasks/[id]/edit/TaskEditFormClient.tsx | 8 +- src/app/admin/tasks/[id]/edit/page.tsx | 50 +- src/app/admin/tasks/[id]/error.tsx | 26 +- src/app/admin/tasks/[id]/page.tsx | 61 +- src/app/admin/tasks/__tests__/data.test.ts | 20 +- src/app/admin/tasks/analytics/page.tsx | 6 +- src/app/admin/tasks/data.ts | 126 +- src/app/admin/tasks/loading.tsx | 4 +- src/app/admin/tasks/new/TaskFormClient.tsx | 133 +- src/app/admin/tasks/new/page.tsx | 20 +- src/app/admin/tasks/page.tsx | 160 +- src/app/admin/tasks/projects/[id]/page.tsx | 153 +- src/app/admin/tasks/projects/new/page.tsx | 87 +- src/app/admin/tasks/projects/page.tsx | 117 +- src/app/admin/team/TeamListClient.tsx | 31 +- .../team/[id]/TeamProfileDetailClient.tsx | 12 +- src/app/admin/team/[id]/edit/page.tsx | 120 +- src/app/admin/team/[id]/page.tsx | 141 +- .../team/activity/ActivityPageClient.tsx | 40 +- src/app/admin/team/activity/page.tsx | 28 +- src/app/admin/team/approvals/page.tsx | 36 +- src/app/admin/team/board/page.tsx | 314 +- .../admin/team/digest/DigestPageClient.tsx | 72 +- src/app/admin/team/digest/page.tsx | 28 +- .../team/help/HelpRequestsPageClient.tsx | 115 +- src/app/admin/team/help/page.tsx | 96 +- src/app/admin/team/loading.tsx | 4 +- src/app/admin/team/me/edit/page.tsx | 54 +- src/app/admin/team/me/page.tsx | 141 +- src/app/admin/team/new/page.tsx | 52 +- src/app/admin/team/page.tsx | 164 +- .../team/report/[userId]/[month]/page.tsx | 55 +- src/app/admin/teams/[slug]/edit/page.tsx | 32 +- src/app/admin/teams/[slug]/page.tsx | 122 +- src/app/admin/teams/assignment/page.tsx | 30 +- src/app/admin/teams/new/page.tsx | 22 +- src/app/admin/teams/page.tsx | 153 +- src/app/admin/users/UsersListClient.tsx | 26 +- src/app/admin/users/[id]/page.tsx | 153 +- src/app/admin/users/loading.tsx | 4 +- src/app/admin/users/page.tsx | 92 +- .../admin/workshops/instances/[id]/page.tsx | 162 +- src/app/admin/workshops/instances/page.tsx | 40 +- src/app/admin/workshops/loading.tsx | 4 +- src/app/admin/workshops/new/page.tsx | 4 +- src/app/admin/workshops/page.tsx | 161 +- .../admin/workshops/proposals/[id]/page.tsx | 70 +- src/app/admin/workshops/proposals/page.tsx | 4 +- src/app/admin/zeiterfassung/page.tsx | 63 +- src/app/ai-cms/page.tsx | 35 +- .../ai-cms/sections/AccessControlSection.tsx | 31 +- src/app/ai-cms/sections/CTASection.tsx | 11 +- src/app/ai-cms/sections/ComparisonSection.tsx | 16 +- src/app/ai-cms/sections/FeaturesSection.tsx | 46 +- src/app/ai-cms/sections/HeroSection.tsx | 18 +- src/app/ai-cms/sections/ProblemSection.tsx | 16 +- src/app/ai-cms/sections/StatusSection.tsx | 48 +- .../sections/SuggestionTypesSection.tsx | 39 +- src/app/ai-cms/sections/WorkflowSection.tsx | 30 +- .../__tests__/route.test.ts | 120 +- .../api/admin/ai/smart-product-entry/route.ts | 90 +- .../admin/appointments/[id]/assign/route.ts | 145 +- src/app/api/admin/appointments/route.ts | 30 +- .../approvals/[id]/__tests__/route.test.ts | 290 +- src/app/api/admin/approvals/[id]/route.ts | 87 +- .../api/admin/auth/__tests__/route.test.ts | 91 +- src/app/api/admin/auth/route.ts | 12 +- .../admin/blog/[id]/__tests__/route.test.ts | 269 +- src/app/api/admin/blog/[id]/route.ts | 134 +- .../api/admin/blog/[id]/translate/route.ts | 34 +- .../api/admin/blog/__tests__/route.test.ts | 207 +- .../categories/[id]/__tests__/route.test.ts | 314 +- .../api/admin/blog/categories/[id]/route.ts | 87 +- .../blog/categories/__tests__/route.test.ts | 220 +- src/app/api/admin/blog/categories/route.ts | 50 +- src/app/api/admin/blog/route.ts | 102 +- .../submissions/[id]/__tests__/route.test.ts | 275 +- .../api/admin/blog/submissions/[id]/route.ts | 108 +- .../donations/[id]/__tests__/route.test.ts | 298 +- src/app/api/admin/donations/[id]/route.ts | 115 +- .../admin/donations/__tests__/route.test.ts | 306 +- src/app/api/admin/donations/route.ts | 99 +- .../donations/users/__tests__/route.test.ts | 134 +- src/app/api/admin/donations/users/route.ts | 40 +- src/app/api/admin/email/diagnostics/route.ts | 56 +- .../admin/erfassung/__tests__/route.test.ts | 174 +- .../bulk-enrich/__tests__/route.test.ts | 140 +- .../api/admin/erfassung/bulk-enrich/route.ts | 76 +- .../bulk-save/__tests__/route.test.ts | 171 +- .../api/admin/erfassung/bulk-save/route.ts | 102 +- .../bulk-text/__tests__/route.test.ts | 114 +- .../api/admin/erfassung/bulk-text/route.ts | 34 +- .../bulk-upload/__tests__/route.test.ts | 134 +- .../api/admin/erfassung/bulk-upload/route.ts | 66 +- src/app/api/admin/erfassung/image/route.ts | 38 +- src/app/api/admin/erfassung/route.ts | 49 +- .../erfassung/text/__tests__/route.test.ts | 116 +- src/app/api/admin/erfassung/text/route.ts | 36 +- .../erfassung/voice/__tests__/route.test.ts | 123 +- src/app/api/admin/erfassung/voice/route.ts | 6 +- .../actions/execute/__tests__/route.test.ts | 128 +- .../api/admin/hirn/actions/execute/route.ts | 67 +- .../admin/hirn/chat/__tests__/route.test.ts | 126 +- src/app/api/admin/hirn/chat/route.ts | 53 +- .../hirn/documents/__tests__/route.test.ts | 171 +- src/app/api/admin/hirn/documents/route.ts | 52 +- .../hirn/history/__tests__/route.test.ts | 135 +- src/app/api/admin/hirn/history/route.ts | 38 +- .../admin/hirn/init/__tests__/route.test.ts | 110 +- src/app/api/admin/hirn/init/route.ts | 97 +- .../hirn/providers/__tests__/route.test.ts | 246 +- src/app/api/admin/hirn/providers/route.ts | 85 +- .../admin/hr/applications/[id]/hire/route.ts | 54 +- .../api/admin/hr/applications/[id]/route.ts | 24 +- .../hr/applications/[id]/transition/route.ts | 51 +- src/app/api/admin/hr/applications/route.ts | 30 +- src/app/api/admin/hr/stats/route.ts | 18 +- .../hr/vacancies/[id]/duplicate/route.ts | 30 +- src/app/api/admin/hr/vacancies/[id]/route.ts | 79 +- .../hr/vacancies/[id]/transition/route.ts | 46 +- src/app/api/admin/hr/vacancies/route.ts | 54 +- .../admin/intake/[id]/__tests__/route.test.ts | 272 +- .../[id]/change-tier/__tests__/route.test.ts | 228 +- .../admin/intake/[id]/change-tier/route.ts | 72 +- .../[id]/checklist/__tests__/route.test.ts | 429 +- .../api/admin/intake/[id]/checklist/route.ts | 127 +- .../[id]/publish/__tests__/route.test.ts | 229 +- .../api/admin/intake/[id]/publish/route.ts | 122 +- src/app/api/admin/intake/[id]/route.ts | 160 +- .../api/admin/intake/__tests__/route.test.ts | 305 +- src/app/api/admin/intake/route.ts | 285 +- .../inventory/[id]/__tests__/route.test.ts | 421 +- src/app/api/admin/inventory/[id]/route.ts | 264 +- .../admin/inventory/__tests__/route.test.ts | 231 +- src/app/api/admin/inventory/route.ts | 97 +- .../it-hilfe/[id]/__tests__/route.test.ts | 292 +- src/app/api/admin/it-hilfe/[id]/route.ts | 374 +- .../admin/it-hilfe/__tests__/route.test.ts | 162 +- .../helpers/[id]/__tests__/route.test.ts | 205 +- .../api/admin/it-hilfe/helpers/[id]/route.ts | 181 +- .../it-hilfe/helpers/__tests__/route.test.ts | 179 +- src/app/api/admin/it-hilfe/helpers/route.ts | 68 +- src/app/api/admin/it-hilfe/route.ts | 62 +- .../it-hilfe/stats/__tests__/route.test.ts | 146 +- src/app/api/admin/it-hilfe/stats/route.ts | 30 +- .../[id]/verify/__tests__/route.test.ts | 186 +- .../api/admin/listings/[id]/verify/route.ts | 128 +- .../marketplace/[id]/__tests__/route.test.ts | 303 +- src/app/api/admin/marketplace/[id]/route.ts | 277 +- .../admin/marketplace/__tests__/route.test.ts | 183 +- .../orders/__tests__/route.test.ts | 176 +- src/app/api/admin/marketplace/orders/route.ts | 48 +- .../questions/[id]/__tests__/route.test.ts | 203 +- .../admin/marketplace/questions/[id]/route.ts | 83 +- .../questions/__tests__/route.test.ts | 153 +- .../api/admin/marketplace/questions/route.ts | 48 +- .../reports/[id]/__tests__/route.test.ts | 209 +- .../admin/marketplace/reports/[id]/route.ts | 82 +- .../reports/__tests__/route.test.ts | 168 +- .../api/admin/marketplace/reports/route.ts | 48 +- src/app/api/admin/marketplace/route.ts | 77 +- .../marketplace/stats/__tests__/route.test.ts | 154 +- src/app/api/admin/marketplace/stats/route.ts | 26 +- src/app/api/admin/membership/[id]/route.ts | 113 +- .../members/__tests__/route.test.ts | 104 +- src/app/api/admin/membership/members/route.ts | 20 +- .../admin/migrate/shopware-drafts/route.ts | 215 +- src/app/api/admin/pages/[id]/route.ts | 139 +- src/app/api/admin/pages/route.ts | 54 +- .../dashboard/__tests__/route.test.ts | 154 +- src/app/api/admin/payments/dashboard/route.ts | 211 +- .../payroll/batches/[id]/export.csv/route.ts | 331 +- src/app/api/admin/payroll/batches/route.ts | 30 +- src/app/api/admin/payroll/close/route.ts | 86 +- .../request/__tests__/route.test.ts | 193 +- .../api/admin/permissions/request/route.ts | 75 +- .../requests/[id]/__tests__/route.test.ts | 235 +- .../admin/permissions/requests/[id]/route.ts | 93 +- .../requests/__tests__/route.test.ts | 152 +- .../api/admin/permissions/requests/route.ts | 34 +- .../[slug]/contributions/[id]/route.ts | 117 +- .../admin/projects/[slug]/needs/[id]/route.ts | 133 +- .../api/admin/projects/[slug]/needs/route.ts | 90 +- src/app/api/admin/promo-codes/[id]/route.ts | 39 +- src/app/api/admin/promo-codes/route.ts | 134 +- .../promote-user/__tests__/route.test.ts | 150 +- src/app/api/admin/promote-user/route.ts | 41 +- .../refunds/[id]/__tests__/route.test.ts | 315 +- src/app/api/admin/refunds/[id]/route.ts | 122 +- .../api/admin/refunds/__tests__/route.test.ts | 166 +- src/app/api/admin/refunds/route.ts | 45 +- .../__tests__/route.test.ts | 139 +- .../[id]/recalculate-ratings/route.ts | 41 +- .../api/admin/reviews/[id]/moderate/route.ts | 101 +- src/app/api/admin/reviews/route.ts | 59 +- .../search-index/__tests__/route.test.ts | 126 +- src/app/api/admin/search-index/route.ts | 131 +- .../services/[id]/__tests__/route.test.ts | 179 +- src/app/api/admin/services/[id]/route.ts | 120 +- .../admin/services/__tests__/route.test.ts | 159 +- src/app/api/admin/services/route.ts | 47 +- src/app/api/admin/storage-locations/route.ts | 42 +- .../admin/tax-reports/__tests__/route.test.ts | 132 +- src/app/api/admin/tax-reports/route.ts | 269 +- .../team/activity/__tests__/route.test.ts | 137 +- src/app/api/admin/team/activity/route.ts | 128 +- .../updates/[id]/__tests__/route.test.ts | 262 +- .../admin/team/activity/updates/[id]/route.ts | 95 +- .../activity/updates/__tests__/route.test.ts | 243 +- .../api/admin/team/activity/updates/route.ts | 81 +- .../admin/team/digest/__tests__/route.test.ts | 152 +- src/app/api/admin/team/digest/route.ts | 166 +- .../[id]/__tests__/route.test.ts | 244 +- .../[id]/resolve/__tests__/route.test.ts | 196 +- .../team/help-requests/[id]/resolve/route.ts | 61 +- .../admin/team/help-requests/[id]/route.ts | 88 +- .../help-requests/__tests__/route.test.ts | 278 +- src/app/api/admin/team/help-requests/route.ts | 99 +- src/app/api/admin/team/leave/[id]/route.ts | 53 +- .../profiles/[id]/__tests__/route.test.ts | 285 +- .../[id]/focus/__tests__/route.test.ts | 165 +- .../admin/team/profiles/[id]/focus/route.ts | 49 +- .../admin/team/profiles/[id]/leave/route.ts | 221 +- src/app/api/admin/team/profiles/[id]/route.ts | 93 +- .../team/profiles/__tests__/route.test.ts | 280 +- .../admin/team/profiles/me/bootstrap/route.ts | 34 +- src/app/api/admin/team/profiles/me/route.ts | 44 +- src/app/api/admin/team/profiles/route.ts | 115 +- src/app/api/admin/team/zeit/[userId]/route.ts | 235 +- src/app/api/admin/teams/[id]/focus/route.ts | 49 +- .../admin/teams/[id]/goals/[goalId]/route.ts | 80 +- src/app/api/admin/teams/[id]/goals/route.ts | 68 +- .../api/admin/teams/[id]/invitations/route.ts | 69 +- .../[id]/members/[membershipId]/route.ts | 82 +- src/app/api/admin/teams/[id]/members/route.ts | 106 +- .../teams/[id]/metrics/[metricId]/route.ts | 80 +- src/app/api/admin/teams/[id]/metrics/route.ts | 68 +- src/app/api/admin/teams/[id]/route.ts | 113 +- src/app/api/admin/teams/candidates/route.ts | 20 +- src/app/api/admin/teams/invite/route.ts | 38 +- src/app/api/admin/teams/route.ts | 42 +- src/app/api/admin/time-off/[id]/route.ts | 34 +- src/app/api/admin/time-off/route.ts | 18 +- .../api/admin/timecards/[id]/reopen/route.ts | 47 +- src/app/api/admin/timecards/[id]/route.ts | 177 +- .../api/admin/timecards/[id]/submit/route.ts | 146 +- .../api/admin/timecards/bulk-review/route.ts | 71 +- src/app/api/admin/timecards/for-user/route.ts | 32 +- src/app/api/admin/timecards/route.ts | 41 +- .../admin/users/[id]/__tests__/route.test.ts | 343 +- .../[id]/permissions/__tests__/route.test.ts | 208 +- .../api/admin/users/[id]/permissions/route.ts | 102 +- src/app/api/admin/users/[id]/route.ts | 139 +- .../api/admin/users/__tests__/route.test.ts | 140 +- src/app/api/admin/users/route.ts | 64 +- .../materials/__tests__/route.test.ts | 214 +- .../workshops/[workshopId]/materials/route.ts | 194 +- .../instances/[id]/__tests__/route.test.ts | 277 +- .../admin/workshops/instances/[id]/route.ts | 364 +- .../instances/__tests__/route.test.ts | 232 +- .../api/admin/workshops/instances/route.ts | 97 +- .../workshops/list/__tests__/route.test.ts | 138 +- src/app/api/admin/workshops/list/route.ts | 33 +- .../materials/[id]/__tests__/route.test.ts | 207 +- .../admin/workshops/materials/[id]/route.ts | 212 +- .../proposals/[id]/__tests__/route.test.ts | 246 +- .../[id]/approve/__tests__/route.test.ts | 246 +- .../workshops/proposals/[id]/approve/route.ts | 421 +- .../[id]/history/__tests__/route.test.ts | 110 +- .../workshops/proposals/[id]/history/route.ts | 69 +- .../admin/workshops/proposals/[id]/route.ts | 357 +- .../proposals/__tests__/route.test.ts | 160 +- .../api/admin/workshops/proposals/route.ts | 51 +- .../[id]/__tests__/route.test.ts | 228 +- .../workshops/registrations/[id]/route.ts | 233 +- .../__tests__/route.test.ts | 211 +- .../workshops/send-feedback-requests/route.ts | 107 +- .../send-reminders/__tests__/route.test.ts | 223 +- .../admin/workshops/send-reminders/route.ts | 101 +- .../analyze-product/__tests__/route.test.ts | 234 +- src/app/api/ai/analyze-product/route.ts | 178 +- .../api/ai/extract/__tests__/route.test.ts | 255 +- src/app/api/ai/extract/route.ts | 61 +- src/app/api/ai/form-assist/route.ts | 20 +- src/app/api/ai/protocol-advisor/route.ts | 113 +- src/app/api/ai/task-advisor/route.ts | 54 +- .../ai/vote-advisor/__tests__/route.test.ts | 235 +- src/app/api/ai/vote-advisor/route.ts | 83 +- .../appointments/[id]/__tests__/route.test.ts | 361 +- .../[id]/pay/__tests__/route.test.ts | 308 +- src/app/api/appointments/[id]/pay/route.ts | 124 +- src/app/api/appointments/[id]/route.ts | 422 +- .../api/appointments/__tests__/route.test.ts | 317 +- src/app/api/appointments/route.ts | 171 +- src/app/api/auth/[...nextauth]/route.ts | 4 +- .../forgot-password/__tests__/route.test.ts | 202 +- src/app/api/auth/forgot-password/route.ts | 70 +- .../auth/login-status/__tests__/route.test.ts | 96 +- src/app/api/auth/login-status/route.ts | 26 +- .../api/auth/register/__tests__/route.test.ts | 174 +- src/app/api/auth/register/route.ts | 73 +- .../auth/resend-code/__tests__/route.test.ts | 175 +- src/app/api/auth/resend-code/route.ts | 77 +- .../reset-password/__tests__/route.test.ts | 216 +- src/app/api/auth/reset-password/route.ts | 78 +- .../auth/verify-code/__tests__/route.test.ts | 175 +- src/app/api/auth/verify-code/route.ts | 78 +- .../auth/verify-email/__tests__/route.test.ts | 198 +- src/app/api/auth/verify-email/route.ts | 100 +- src/app/api/blog/[slug]/comments/route.ts | 85 +- .../blog/categories/__tests__/route.test.ts | 122 +- src/app/api/blog/categories/route.ts | 18 +- src/app/api/blog/comments/[id]/route.ts | 73 +- .../my-submissions/__tests__/route.test.ts | 235 +- src/app/api/blog/my-submissions/route.ts | 77 +- .../[id]/resubmit/__tests__/route.test.ts | 212 +- .../blog/submissions/[id]/resubmit/route.ts | 167 +- .../api/blog/submit/__tests__/route.test.ts | 190 +- src/app/api/blog/submit/route.ts | 41 +- src/app/api/careers/[slug]/apply/route.ts | 85 +- src/app/api/careers/[slug]/route.ts | 34 +- src/app/api/careers/route.ts | 24 +- src/app/api/careers/upload-cv/route.ts | 50 +- .../close-decisions/__tests__/route.test.ts | 185 +- src/app/api/cron/close-decisions/route.ts | 97 +- .../__tests__/route.test.ts | 188 +- .../api/cron/close-it-hilfe-requests/route.ts | 28 +- src/app/api/cron/prune-audit-log/route.ts | 33 +- .../release-escrow/__tests__/route.test.ts | 167 +- src/app/api/cron/release-escrow/route.ts | 61 +- src/app/api/cron/timecard-reminders/route.ts | 34 +- .../api/cron/wake-recurring-tasks/route.ts | 70 +- .../decisions/[id]/__tests__/route.test.ts | 260 +- .../[commentId]/__tests__/route.test.ts | 195 +- .../[id]/comments/[commentId]/route.ts | 116 +- .../[id]/comments/__tests__/route.test.ts | 198 +- src/app/api/decisions/[id]/comments/route.ts | 103 +- .../[id]/create-task/__tests__/route.test.ts | 118 +- .../api/decisions/[id]/create-task/route.ts | 85 +- src/app/api/decisions/[id]/route.ts | 188 +- .../send-invitations/__tests__/route.test.ts | 231 +- .../decisions/[id]/send-invitations/route.ts | 208 +- .../[id]/transition/__tests__/route.test.ts | 198 +- .../api/decisions/[id]/transition/route.ts | 144 +- .../[id]/votes/__tests__/route.test.ts | 195 +- .../participation/__tests__/route.test.ts | 117 +- .../[id]/votes/participation/route.ts | 44 +- src/app/api/decisions/[id]/votes/route.ts | 108 +- src/app/api/decisions/__tests__/route.test.ts | 214 +- src/app/api/decisions/route.ts | 81 +- .../deliverables/[id]/agent-brief/route.ts | 43 +- src/app/api/deliverables/[id]/ask/route.ts | 77 +- .../api/deliverables/[id]/feedback/route.ts | 114 +- .../api/deliverables/[id]/reindex/route.ts | 47 +- src/app/api/deliverables/[id]/route.ts | 135 +- src/app/api/deliverables/[id]/share/route.ts | 43 +- src/app/api/deliverables/route.ts | 92 +- .../donations/dropoff/__tests__/route.test.ts | 146 +- src/app/api/donations/dropoff/route.ts | 69 +- src/app/api/health/__tests__/route.test.ts | 137 +- .../health/auth-db/__tests__/route.test.ts | 123 +- src/app/api/health/auth-db/route.ts | 44 +- .../api/health/auth/__tests__/route.test.ts | 135 +- src/app/api/health/auth/route.ts | 40 +- src/app/api/health/route.ts | 73 +- src/app/api/hirn/chat/route.ts | 48 +- src/app/api/inquiry/__tests__/route.test.ts | 174 +- src/app/api/inquiry/route.ts | 56 +- .../import-csv/__tests__/route.test.ts | 308 +- src/app/api/inventory/import-csv/route.ts | 70 +- .../api/invoices/[id]/__tests__/route.test.ts | 433 +- .../invoices/[id]/pdf/__tests__/route.test.ts | 287 +- src/app/api/invoices/[id]/pdf/route.ts | 66 +- src/app/api/invoices/[id]/route.ts | 133 +- src/app/api/invoices/__tests__/route.test.ts | 281 +- src/app/api/invoices/route.ts | 129 +- src/app/api/it-hilfe/__tests__/offers.test.ts | 525 +- .../api/it-hilfe/__tests__/requests.test.ts | 366 +- .../__tests__/route.test.ts | 228 +- .../it-hilfe/accept-offer-via-token/route.ts | 77 +- .../matching-requests/__tests__/route.test.ts | 22 +- .../helper/matching-requests/route.ts | 6 +- .../helper/my-offers/__tests__/route.test.ts | 22 +- .../api/it-hilfe/helper/my-offers/route.ts | 9 +- .../my-offers/__tests__/route.test.ts | 170 +- src/app/api/it-hilfe/my-offers/route.ts | 46 +- .../my-requests/__tests__/route.test.ts | 209 +- src/app/api/it-hilfe/my-requests/route.ts | 46 +- .../requests/[id]/__tests__/route.test.ts | 299 +- .../[id]/complete/__tests__/route.test.ts | 288 +- .../it-hilfe/requests/[id]/complete/route.ts | 256 +- .../confirm-review/__tests__/route.test.ts | 277 +- .../requests/[id]/confirm-review/route.ts | 358 +- .../[id]/conversation/__tests__/route.test.ts | 134 +- .../requests/[id]/conversation/route.ts | 71 +- .../[id]/matches/__tests__/route.test.ts | 191 +- .../it-hilfe/requests/[id]/matches/route.ts | 206 +- .../offers/[offerId]/__tests__/route.test.ts | 235 +- .../[offerId]/accept/__tests__/route.test.ts | 290 +- .../[id]/offers/[offerId]/accept/route.ts | 49 +- .../[offerId]/decline/__tests__/route.test.ts | 261 +- .../[id]/offers/[offerId]/decline/route.ts | 70 +- .../requests/[id]/offers/[offerId]/route.ts | 76 +- .../[id]/offers/__tests__/route.test.ts | 627 +- .../it-hilfe/requests/[id]/offers/route.ts | 186 +- src/app/api/it-hilfe/requests/[id]/route.ts | 205 +- .../it-hilfe/requests/__tests__/route.test.ts | 402 +- src/app/api/it-hilfe/requests/route.ts | 335 +- .../api/listings/[id]/__tests__/route.test.ts | 772 +- .../[id]/contact/__tests__/route.test.ts | 316 +- src/app/api/listings/[id]/contact/route.ts | 164 +- .../[id]/duplicate/__tests__/route.test.ts | 253 +- src/app/api/listings/[id]/duplicate/route.ts | 160 +- .../[id]/favorite/__tests__/route.test.ts | 226 +- src/app/api/listings/[id]/favorite/route.ts | 108 +- .../questions/[questionId]/answer/route.ts | 117 +- src/app/api/listings/[id]/questions/route.ts | 177 +- .../[id]/report/__tests__/route.test.ts | 264 +- src/app/api/listings/[id]/report/route.ts | 91 +- src/app/api/listings/[id]/route.ts | 433 +- src/app/api/listings/__tests__/route.test.ts | 459 +- .../favorites/__tests__/route.test.ts | 217 +- src/app/api/listings/favorites/route.ts | 7 +- .../api/listings/mine/__tests__/route.test.ts | 212 +- src/app/api/listings/mine/route.ts | 13 +- src/app/api/listings/route.ts | 159 +- .../listings/similar/__tests__/route.test.ts | 157 +- src/app/api/listings/similar/route.ts | 14 +- .../locations/[id]/__tests__/route.test.ts | 385 +- .../[id]/approve/__tests__/route.test.ts | 282 +- src/app/api/locations/[id]/approve/route.ts | 118 +- .../[id]/bookings/__tests__/route.test.ts | 455 +- src/app/api/locations/[id]/bookings/route.ts | 170 +- src/app/api/locations/[id]/route.ts | 188 +- src/app/api/locations/__tests__/route.test.ts | 337 +- src/app/api/locations/route.ts | 115 +- .../cart/checkout/__tests__/route.test.ts | 256 +- .../api/marketplace/cart/checkout/route.ts | 165 +- .../cart/validate/__tests__/route.test.ts | 78 +- .../api/marketplace/cart/validate/route.ts | 50 +- .../orders/[id]/__tests__/route.test.ts | 480 +- .../confirm-receipt/__tests__/route.test.ts | 335 +- .../orders/[id]/confirm-receipt/route.ts | 354 +- .../[id]/review/__tests__/route.test.ts | 306 +- .../marketplace/orders/[id]/review/route.ts | 317 +- src/app/api/marketplace/orders/[id]/route.ts | 463 +- .../orders/__tests__/route.test.ts | 520 +- src/app/api/marketplace/orders/route.ts | 157 +- .../me/preferences/__tests__/route.test.ts | 142 +- src/app/api/me/preferences/route.ts | 43 +- src/app/api/members/[id]/route.ts | 9 +- .../membership/apply/__tests__/route.test.ts | 236 +- src/app/api/membership/apply/route.ts | 90 +- .../[conversationId]/__tests__/route.test.ts | 172 +- .../api/messages/[conversationId]/route.ts | 185 +- src/app/api/messages/__tests__/route.test.ts | 262 +- .../conversations/__tests__/route.test.ts | 200 +- src/app/api/messages/conversations/route.ts | 80 +- src/app/api/messages/route.ts | 147 +- .../confirm/__tests__/route.test.ts | 117 +- src/app/api/newsletter/confirm/route.ts | 79 +- .../subscribe/__tests__/route.test.ts | 330 +- src/app/api/newsletter/subscribe/route.ts | 114 +- .../[id]/__tests__/route.test.ts | 106 +- src/app/api/notifications/[id]/route.ts | 72 +- .../api/notifications/__tests__/route.test.ts | 203 +- src/app/api/notifications/route.ts | 38 +- .../api/org-numbers/__tests__/route.test.ts | 162 +- src/app/api/org-numbers/route.ts | 52 +- .../escrow/[id]/__tests__/route.test.ts | 403 +- src/app/api/payments/escrow/[id]/route.ts | 248 +- src/app/api/payments/mock-redirect/route.ts | 70 +- .../__tests__/route.test.ts | 149 +- .../payments/payrexx-mock-redirect/route.ts | 5 +- .../payrexx-webhook/__tests__/route.test.ts | 216 +- src/app/api/payments/payrexx-webhook/route.ts | 31 +- src/app/api/payments/providers/route.ts | 14 +- .../payments/refund/__tests__/route.test.ts | 344 +- src/app/api/payments/refund/route.ts | 138 +- .../api/payments/webhook/[provider]/route.ts | 69 +- .../api/pools/[id]/__tests__/route.test.ts | 250 +- .../pools/[id]/join/__tests__/route.test.ts | 262 +- src/app/api/pools/[id]/join/route.ts | 180 +- .../pools/[id]/leave/__tests__/route.test.ts | 177 +- src/app/api/pools/[id]/leave/route.ts | 86 +- src/app/api/pools/[id]/route.ts | 99 +- src/app/api/pools/__tests__/route.test.ts | 257 +- src/app/api/pools/my/__tests__/route.test.ts | 130 +- src/app/api/pools/my/route.ts | 28 +- src/app/api/pools/route.ts | 53 +- src/app/api/presentations/comments/route.ts | 92 +- src/app/api/profiles/[id]/route.ts | 23 +- .../projects/[slug]/contributions/route.ts | 98 +- src/app/api/projects/[slug]/needs/route.ts | 62 +- .../protocols/[id]/__tests__/route.test.ts | 279 +- .../[id]/actions/__tests__/route.test.ts | 211 +- src/app/api/protocols/[id]/actions/route.ts | 164 +- .../[id]/finalize/__tests__/route.test.ts | 126 +- src/app/api/protocols/[id]/finalize/route.ts | 68 +- .../[id]/import-tasks/__tests__/route.test.ts | 193 +- .../api/protocols/[id]/import-tasks/route.ts | 123 +- .../process-notes/__tests__/route.test.ts | 199 +- .../api/protocols/[id]/process-notes/route.ts | 121 +- .../protocols/[id]/process-sources/route.ts | 348 +- src/app/api/protocols/[id]/route.ts | 190 +- src/app/api/protocols/__tests__/route.test.ts | 234 +- src/app/api/protocols/route.ts | 68 +- .../templates/__tests__/route.test.ts | 132 +- src/app/api/protocols/templates/route.ts | 16 +- .../blog/submit/__tests__/route.test.ts | 314 +- src/app/api/public/blog/submit/route.ts | 114 +- src/app/api/public/claim/route.ts | 32 +- .../public/financials/__tests__/route.test.ts | 124 +- src/app/api/public/financials/route.ts | 26 +- src/app/api/public/share/[token]/ask/route.ts | 48 +- src/app/api/public/share/[token]/route.ts | 48 +- src/app/api/referral/invite/route.ts | 34 +- src/app/api/referral/my-code/route.ts | 19 +- .../dashboard/__tests__/route.test.ts | 276 +- src/app/api/repairer/dashboard/route.ts | 105 +- .../api/reviews/[id]/__tests__/route.test.ts | 544 +- .../[id]/response/__tests__/route.test.ts | 499 +- src/app/api/reviews/[id]/response/route.ts | 437 +- src/app/api/reviews/[id]/route.ts | 361 +- .../reviews/[id]/vote/__tests__/route.test.ts | 258 +- src/app/api/reviews/[id]/vote/route.ts | 250 +- src/app/api/reviews/__tests__/route.test.ts | 506 +- src/app/api/reviews/route.ts | 230 +- src/app/api/search-index/route.ts | 150 +- .../search/listings/__tests__/route.test.ts | 117 +- src/app/api/search/listings/route.ts | 40 +- .../api/sellers/[id]/__tests__/route.test.ts | 245 +- src/app/api/sellers/[id]/route.ts | 41 +- .../api/sellers/me/__tests__/route.test.ts | 305 +- src/app/api/sellers/me/route.ts | 2 +- src/app/api/services/__tests__/route.test.ts | 140 +- src/app/api/services/route.ts | 36 +- .../stats/community/__tests__/route.test.ts | 118 +- src/app/api/stats/community/route.ts | 43 +- .../api/stats/impact/__tests__/route.test.ts | 156 +- src/app/api/stats/impact/route.ts | 76 +- .../api/suggestions/__tests__/route.test.ts | 170 +- src/app/api/suggestions/route.ts | 100 +- .../task-analytics/__tests__/route.test.ts | 189 +- src/app/api/task-analytics/route.ts | 34 +- .../[id]/__tests__/route.test.ts | 284 +- src/app/api/task-projects/[id]/route.ts | 338 +- .../api/task-projects/__tests__/route.test.ts | 225 +- src/app/api/task-projects/route.ts | 10 +- .../[id]/__tests__/route.test.ts | 254 +- src/app/api/task-requests/[id]/route.ts | 228 +- .../api/task-requests/__tests__/route.test.ts | 143 +- src/app/api/task-requests/route.ts | 18 +- .../api/tasks/[id]/__tests__/route.test.ts | 336 +- .../[id]/attention/__tests__/route.test.ts | 146 +- src/app/api/tasks/[id]/attention/route.ts | 119 +- .../[id]/complete/__tests__/route.test.ts | 151 +- src/app/api/tasks/[id]/complete/route.ts | 122 +- .../[id]/request/__tests__/route.test.ts | 235 +- src/app/api/tasks/[id]/request/route.ts | 161 +- src/app/api/tasks/[id]/route.ts | 493 +- src/app/api/tasks/__tests__/route.test.ts | 250 +- src/app/api/tasks/route.ts | 16 +- src/app/api/team/reminder/route.ts | 32 +- .../report/[userId]/[month]/share/route.ts | 77 +- src/app/api/team/schedule/route.ts | 38 +- .../technicians/[id]/__tests__/route.test.ts | 110 +- src/app/api/technicians/[id]/route.ts | 28 +- .../api/technicians/__tests__/route.test.ts | 205 +- src/app/api/technicians/route.ts | 112 +- src/app/api/time-off/[id]/route.ts | 24 +- src/app/api/time-off/route.ts | 40 +- src/app/api/timecards/route.ts | 75 +- src/app/api/timecards/saldo/route.ts | 32 +- src/app/api/uploads/__tests__/route.test.ts | 224 +- src/app/api/uploads/route.ts | 117 +- .../change-password/__tests__/route.test.ts | 252 +- src/app/api/user/change-password/route.ts | 56 +- .../user/donations/__tests__/route.test.ts | 184 +- src/app/api/user/donations/route.ts | 104 +- .../user/export-data/__tests__/route.test.ts | 127 +- src/app/api/user/export-data/route.ts | 145 +- .../api/user/profile/__tests__/route.test.ts | 137 +- src/app/api/user/profile/route.ts | 32 +- .../api/user/reviews/__tests__/route.test.ts | 151 +- src/app/api/user/reviews/route.ts | 91 +- .../__tests__/route.test.ts | 235 +- src/app/api/user/technician-profile/route.ts | 69 +- .../__tests__/route.test.ts | 152 +- .../api/user/workshop-registrations/route.ts | 28 +- src/app/api/version/route.ts | 8 +- src/app/api/vote/[id]/__tests__/route.test.ts | 273 +- src/app/api/vote/[id]/route.ts | 129 +- .../webhooks/kivvi/__tests__/route.test.ts | 209 +- src/app/api/webhooks/kivvi/route.ts | 33 +- .../[slug]/instances/__tests__/route.test.ts | 114 +- .../api/workshops/[slug]/instances/route.ts | 55 +- .../[slug]/materials/__tests__/route.test.ts | 203 +- .../api/workshops/[slug]/materials/route.ts | 104 +- .../__tests__/route.test.ts | 368 +- .../[slug]/register-with-payment/route.ts | 216 +- .../[slug]/reviews/__tests__/route.test.ts | 125 +- src/app/api/workshops/[slug]/reviews/route.ts | 82 +- src/app/api/workshops/__tests__/route.test.ts | 210 +- .../workshops/propose/__tests__/route.test.ts | 306 +- src/app/api/workshops/propose/route.ts | 115 +- .../register/__tests__/route.test.ts | 321 +- src/app/api/workshops/register/route.ts | 152 +- .../[instanceId]/__tests__/route.test.ts | 128 +- .../registration/[instanceId]/route.ts | 54 +- .../[id]/__tests__/route.test.ts | 234 +- .../api/workshops/registrations/[id]/route.ts | 177 +- src/app/api/workshops/route.ts | 97 +- src/app/auth/error.tsx | 36 +- src/app/auth/forgot-password/layout.tsx | 12 +- src/app/auth/forgot-password/page.tsx | 73 +- src/app/auth/layout.tsx | 26 +- src/app/auth/loading.tsx | 4 +- src/app/auth/login/layout.tsx | 12 +- src/app/auth/login/page.tsx | 32 +- src/app/auth/logout/page.tsx | 64 +- src/app/auth/register/layout.tsx | 12 +- src/app/auth/register/page.tsx | 32 +- src/app/auth/reset-password/layout.tsx | 12 +- src/app/auth/reset-password/page.tsx | 146 +- src/app/auth/verify-email/layout.tsx | 12 +- src/app/auth/verify-email/page.tsx | 74 +- src/app/d/[token]/SharedFeedbackForm.tsx | 109 +- src/app/d/[token]/layout.tsx | 16 +- src/app/d/[token]/page.tsx | 60 +- src/app/dashboard/appointments/[id]/page.tsx | 34 +- .../dashboard/appointments/[id]/sections.tsx | 14 +- .../[id]/sections/BookingHeaderCard.tsx | 163 +- .../appointments/[id]/sections/DatesCard.tsx | 44 +- .../[id]/sections/LocationCard.tsx | 20 +- .../appointments/[id]/sections/RatingCard.tsx | 18 +- .../[id]/sections/ServiceDetailsCard.tsx | 75 +- .../[id]/sections/StarDisplay.tsx | 6 +- .../[id]/sections/TechnicianCard.tsx | 23 +- .../appointments/[id]/sections/shared.ts | 5 +- .../appointments/[id]/useBookingDetail.ts | 215 +- src/app/dashboard/appointments/error.tsx | 24 +- src/app/dashboard/appointments/page.tsx | 193 +- .../BlogSubmissionsClient.tsx | 171 +- .../dashboard/blog-submissions/loading.tsx | 4 +- src/app/dashboard/blog-submissions/page.tsx | 24 +- src/app/dashboard/bookings/[id]/page.tsx | 10 +- src/app/dashboard/bookings/page.tsx | 6 +- .../decisions/[id]/BackgroundSection.tsx | 14 +- src/app/dashboard/decisions/[id]/page.tsx | 181 +- src/app/dashboard/decisions/page.tsx | 91 +- src/app/dashboard/donations/page.tsx | 195 +- src/app/dashboard/error.tsx | 24 +- src/app/dashboard/favorites/page.tsx | 162 +- src/app/dashboard/layout.tsx | 24 +- src/app/dashboard/listings/page.tsx | 63 +- src/app/dashboard/loading.tsx | 4 +- src/app/dashboard/membership/page.tsx | 117 +- src/app/dashboard/messages/loading.tsx | 4 +- src/app/dashboard/messages/page.tsx | 121 +- src/app/dashboard/orders/[id]/error.tsx | 24 +- src/app/dashboard/orders/[id]/page.tsx | 39 +- src/app/dashboard/orders/[id]/sections.tsx | 20 +- .../orders/[id]/sections/ActionsCard.tsx | 116 +- .../orders/[id]/sections/CounterpartyCard.tsx | 18 +- .../orders/[id]/sections/ListingInfoCard.tsx | 87 +- .../orders/[id]/sections/OrderHeader.tsx | 24 +- .../[id]/sections/PendingPaymentBanner.tsx | 26 +- .../[id]/sections/PriceBreakdownCard.tsx | 30 +- .../orders/[id]/sections/ReviewCard.tsx | 35 +- .../[id]/sections/ShippingAddressCard.tsx | 24 +- .../[id]/sections/StatusTimelineCard.tsx | 27 +- .../dashboard/orders/[id]/sections/shared.ts | 10 +- src/app/dashboard/orders/page.tsx | 176 +- src/app/dashboard/page.tsx | 82 +- .../components/PersonalInfoSection.tsx | 28 +- .../components/PublicProfileSection.tsx | 47 +- .../components/ServiceProviderSection.tsx | 44 +- .../dashboard/profile/hooks/useProfileData.ts | 112 +- .../dashboard/profile/hooks/useProfileForm.ts | 60 +- src/app/dashboard/profile/page.tsx | 62 +- src/app/dashboard/profile/seller/page.tsx | 53 +- src/app/dashboard/reviews/error.tsx | 24 +- src/app/dashboard/reviews/page.tsx | 235 +- src/app/dashboard/seller/loading.tsx | 4 +- src/app/dashboard/seller/page.tsx | 4 +- .../settings/components/AccountSection.tsx | 76 +- .../components/NotificationsSection.tsx | 30 +- .../settings/components/PrivacySection.tsx | 106 +- src/app/dashboard/settings/page.tsx | 62 +- src/app/dashboard/shift/page.tsx | 4 +- src/app/dashboard/techniker/page.tsx | 265 +- src/app/dashboard/timecards/page.tsx | 4 +- src/app/dashboard/workshops/loading.tsx | 4 +- src/app/dashboard/workshops/page.tsx | 96 +- src/app/einladung/[token]/ClaimForm.tsx | 95 +- src/app/einladung/[token]/page.tsx | 45 +- src/app/error.tsx | 27 +- src/app/feed.xml/route.ts | 35 +- src/app/globals.css | 860 +- src/app/layout.tsx | 58 +- src/app/not-found.tsx | 22 +- src/app/opengraph-image.tsx | 14 +- src/app/presentations/[slug]/route.ts | 50 +- src/app/profil/error.tsx | 24 +- src/app/profil/layout.tsx | 16 +- src/app/profil/techniker/page.tsx | 131 +- src/app/r/[token]/layout.tsx | 16 +- src/app/r/[token]/page.tsx | 30 +- src/app/robots.ts | 6 +- src/app/saldo/route.ts | 14 +- src/app/services/[service]/page.tsx | 106 +- .../components/BenefitsSection.tsx | 29 +- .../components/CTASection.tsx | 50 +- .../components/ComparisonCard.tsx | 77 +- .../components/ComparisonSection.tsx | 35 +- .../components/ServicesSection.tsx | 35 +- .../services/open-source-solutions/data.ts | 285 +- .../services/open-source-solutions/page.tsx | 43 +- src/app/sitemap.ts | 156 +- src/app/vote/[id]/PublicVoteClient.tsx | 154 +- src/app/vote/[id]/page.tsx | 159 +- src/app/vote/layout.tsx | 16 +- src/auth.ts | 359 +- src/components/about/AboutCTA.tsx | 35 +- src/components/about/AboutSection.tsx | 66 +- src/components/about/GeschichteSection.tsx | 18 +- src/components/about/index.ts | 8 +- src/components/admin/AdminButton.tsx | 65 +- src/components/admin/AdminFilterBar.tsx | 57 +- src/components/admin/AdminHeading.tsx | 4 +- src/components/admin/AdminHeroStatus.tsx | 84 +- src/components/admin/AdminListShell.tsx | 51 +- src/components/admin/AdminPageGuide.tsx | 86 +- src/components/admin/AdminPageWrapper.tsx | 36 +- src/components/admin/AdminSectionHeader.tsx | 30 +- src/components/admin/AdminStatsStrip.tsx | 65 +- src/components/admin/AdminStatusBadge.tsx | 22 +- src/components/admin/AdminTable.tsx | 42 +- src/components/admin/AdminTopBar.tsx | 48 +- src/components/admin/AudienceBadge.tsx | 22 +- src/components/admin/BlogPostForm.tsx | 69 +- src/components/admin/CategoryForm.tsx | 158 +- src/components/admin/CommandBar.tsx | 286 +- src/components/admin/EditHistoryView.tsx | 30 +- src/components/admin/HirnChat.tsx | 285 +- src/components/admin/HirnFloatingButton.tsx | 22 +- src/components/admin/HirnProviderSelector.tsx | 203 +- src/components/admin/HirnSidebar.tsx | 92 +- src/components/admin/HirnSlideOver.tsx | 70 +- src/components/admin/IconPicker.tsx | 60 +- src/components/admin/MobileBottomNav.tsx | 33 +- src/components/admin/NotificationBell.tsx | 223 +- .../admin/PermissionRequestForm.tsx | 81 +- .../admin/PermissionRequestsManager.tsx | 170 +- src/components/admin/ServiceForm.tsx | 197 +- .../admin/UserPermissionsEditor.tsx | 329 +- .../admin/__tests__/AdminHeroStatus.test.tsx | 138 +- .../admin/approvals/ApprovalTabs.tsx | 24 +- .../admin/approvals/InlineDecisionActions.tsx | 69 +- .../approvals/LocationApprovalsSection.tsx | 81 +- .../approvals/WorkshopProposalsSection.tsx | 84 +- src/components/admin/blog/BlogPostEditor.tsx | 48 +- src/components/admin/blog/BlogPostSidebar.tsx | 117 +- .../admin/blog/BlogTranslationTabs.tsx | 62 +- .../admin/blog/EditSubmissionModal.tsx | 19 +- src/components/admin/blog/RichTextEditor.tsx | 229 +- src/components/admin/blog/index.ts | 17 +- .../admin/blog/submissions/RejectModal.tsx | 39 +- .../blog/submissions/RequestChangesModal.tsx | 39 +- .../blog/submissions/SubmissionDetail.tsx | 73 +- .../blog/submissions/SubmissionFilters.tsx | 30 +- .../admin/blog/submissions/SubmissionList.tsx | 33 +- .../admin/blog/submissions/index.ts | 14 +- .../admin/blog/submissions/types.ts | 60 +- .../admin/blog/submissions/useSubmissions.ts | 98 +- src/components/admin/blog/types.ts | 74 +- src/components/admin/blog/useBlogPostForm.ts | 251 +- .../admin/command-bar/ResultsList.tsx | 44 +- .../admin/command-bar/build-results.tsx | 50 +- src/components/admin/command-bar/types.ts | 48 +- .../admin/dashboard/CreateStrip.tsx | 20 +- .../admin/dashboard/DashboardModeToggle.tsx | 30 +- .../admin/dashboard/InlineActionButton.tsx | 37 +- .../admin/dashboard/MissionMetrics.tsx | 113 +- .../admin/dashboard/Monatsueberblick.tsx | 51 +- .../admin/dashboard/PersonalSection.tsx | 95 +- .../admin/dashboard/SystemHealthBar.tsx | 24 +- .../admin/dashboard/TeamActivityFeed.tsx | 33 +- .../admin/dashboard/TeamCurrentWidget.tsx | 33 +- .../admin/dashboard/UnifiedQueue.tsx | 45 +- .../admin/dashboard/VotingBanner.tsx | 47 +- .../admin/dashboard/WeeklyActivitySection.tsx | 20 +- .../__tests__/buildActionItems.test.ts | 100 +- .../admin/dashboard/buildActionItems.ts | 52 +- .../admin/dashboard/buildQuickActions.ts | 33 +- .../admin/dashboard/buildUnifiedQueue.ts | 14 +- src/components/admin/dashboard/format.ts | 10 +- .../admin/dashboard/getDashboardStats.ts | 144 +- src/components/admin/dashboard/index.ts | 35 +- src/components/admin/dashboard/skeletons.tsx | 8 +- src/components/admin/dashboard/types.ts | 94 +- .../admin/donations/DonationFilters.tsx | 36 +- .../admin/donations/DonationFormModal.tsx | 457 +- .../admin/donations/DonationStatsCards.tsx | 21 +- .../admin/donations/DonationsTable.tsx | 81 +- .../admin/donations/UserSearchField.tsx | 30 +- src/components/admin/donations/index.ts | 14 +- src/components/admin/donations/types.ts | 96 +- .../admin/donations/useDonations.ts | 184 +- .../admin/hr/ApplicationComponents.tsx | 142 +- src/components/admin/hr/VacancyCard.tsx | 63 +- src/components/admin/hr/VacancyFormFields.tsx | 60 +- src/components/admin/hr/index.ts | 12 +- src/components/admin/hr/types.ts | 118 +- src/components/admin/hr/useHrApplications.ts | 138 +- src/components/admin/hr/useHrVacancies.ts | 138 +- .../LocationAccessibilitySection.tsx | 34 +- .../location-form/LocationAddressSection.tsx | 41 +- .../LocationBasicInfoSection.tsx | 54 +- .../location-form/LocationContactSection.tsx | 20 +- .../LocationFacilitiesSection.tsx | 24 +- .../admin/locations/location-form/index.ts | 16 +- .../admin/locations/location-form/types.ts | 84 +- .../location-form/useLocationForm.ts | 44 +- .../admin/payroll/PayrollClient.tsx | 220 +- .../admin/projects/ContributionsPanel.tsx | 146 +- src/components/admin/projects/NeedsPanel.tsx | 193 +- .../admin/protocols/CaptureAlternatives.tsx | 164 +- .../admin/protocols/DecisionBridge.tsx | 133 +- .../admin/protocols/ProtocolAIChat.tsx | 40 +- .../protocols/ProtocolActionItemsList.tsx | 157 +- .../admin/protocols/ProtocolAttendeesCard.tsx | 122 +- .../admin/protocols/ProtocolConsent.tsx | 44 +- .../admin/protocols/ProtocolDraftInput.tsx | 39 +- .../admin/protocols/ProtocolFollowUps.tsx | 18 +- .../admin/protocols/ProtocolProgressStrip.tsx | 51 +- .../protocols/ProtocolReprocessSection.tsx | 64 +- .../protocols/ProtocolReviewChecklist.tsx | 42 +- .../admin/protocols/ProtocolReviewQueue.tsx | 135 +- .../admin/protocols/ProtocolTopicsSection.tsx | 20 +- .../admin/protocols/RecordButton.tsx | 144 +- .../admin/protocols/SourceUploader.tsx | 110 +- .../__tests__/SourceUploader.test.tsx | 174 +- .../protocols/action-items/ActionRow.tsx | 80 +- .../action-items/AddCustomTaskRow.tsx | 52 +- .../protocols/action-items/BucketHeader.tsx | 12 +- src/components/admin/protocols/index.ts | 24 +- src/components/admin/protocols/types.ts | 22 +- .../admin/protocols/useProtocolDetail.ts | 338 +- .../admin/service-form/CollapsibleSection.tsx | 26 +- .../admin/service-form/FeaturesSection.tsx | 36 +- .../admin/service-form/PricingSection.tsx | 38 +- .../admin/service-form/ProcessSection.tsx | 33 +- src/components/admin/service-form/index.ts | 10 +- src/components/admin/service-form/types.ts | 54 +- .../admin/settings/EmailDiagnostics.tsx | 144 +- src/components/admin/team/MemberBoardCard.tsx | 80 +- src/components/admin/team/MemberTeamsCard.tsx | 113 +- src/components/admin/team/PeopleTeamsTabs.tsx | 36 +- .../admin/team/TeamAvailabilitySection.tsx | 87 +- .../admin/team/TeamBasicInfoSection.tsx | 22 +- .../admin/team/TeamCompensationSection.tsx | 89 +- .../admin/team/TeamEmergencySection.tsx | 22 +- src/components/admin/team/TeamFilters.tsx | 31 +- .../admin/team/TeamHRNotesSection.tsx | 18 +- .../admin/team/TeamLeavePeriodsCard.tsx | 187 +- src/components/admin/team/TeamMemberCard.tsx | 42 +- .../admin/team/TeamProfileActivityTab.tsx | 76 +- src/components/admin/team/TeamProfileForm.tsx | 97 +- src/components/admin/team/TeamProfileTabs.tsx | 159 +- .../admin/team/TeamProfileTasksTab.tsx | 73 +- .../admin/team/TeamProfileTimecardsTab.tsx | 166 +- src/components/admin/team/TeamProfileView.tsx | 82 +- .../admin/team/TeamTalentSection.tsx | 85 +- .../admin/team/WorkingHoursDisplay.tsx | 26 +- src/components/admin/team/ZeitPensumPanel.tsx | 219 +- .../admin/team/activity/ActivityCard.tsx | 88 +- .../admin/team/activity/ActivityFeed.tsx | 78 +- .../admin/team/activity/AddActivityModal.tsx | 57 +- .../team/activity/CreateHelpRequestModal.tsx | 71 +- .../admin/team/activity/CurrentFocusInput.tsx | 102 +- .../admin/team/activity/HelpRequestCard.tsx | 86 +- src/components/admin/team/activity/index.ts | 24 +- src/components/admin/team/activity/types.ts | 185 +- .../admin/team/activity/useActivityStream.ts | 69 +- .../admin/team/activity/useActivityUpdates.ts | 163 +- .../admin/team/activity/useCurrentFocus.ts | 36 +- .../admin/team/activity/useDigest.ts | 32 +- .../admin/team/activity/useHelpRequests.ts | 178 +- src/components/admin/team/index.ts | 28 +- src/components/admin/team/types.ts | 82 +- .../admin/team/useTeamProfileForm.ts | 268 +- src/components/admin/team/useTeamProfiles.ts | 126 +- .../admin/teams/AssignmentBoard.tsx | 198 +- .../admin/teams/InviteByEmailForm.tsx | 76 +- .../admin/teams/MembershipManager.tsx | 175 +- .../admin/teams/MoveMemberModal.tsx | 127 +- .../admin/teams/PlaceholderInviteButton.tsx | 68 +- src/components/admin/teams/TeamFocusInput.tsx | 86 +- src/components/admin/teams/TeamFormClient.tsx | 95 +- .../admin/teams/TeamGoalsSection.tsx | 158 +- src/components/admin/teams/TeamJoinButton.tsx | 26 +- .../admin/teams/TeamMetricsSection.tsx | 199 +- src/components/admin/teams/TeamWorkPanels.tsx | 63 +- .../admin/timecards/TimeOffApprovals.tsx | 85 +- .../timecards/TimecardApprovalsClient.tsx | 198 +- .../admin/timecards/TimecardReviewDrawer.tsx | 298 +- .../timecards/approvals/ApprovalsBanners.tsx | 10 +- .../timecards/approvals/ApprovalsBulkBar.tsx | 34 +- .../approvals/ApprovalsFilterBar.tsx | 68 +- .../timecards/approvals/ApprovalsQueue.tsx | 80 +- .../admin/timecards/approvals/types.ts | 34 +- .../admin/users/DeleteUserModal.tsx | 33 +- .../admin/users/EditProfileModal.tsx | 34 +- src/components/admin/users/UserFilters.tsx | 22 +- src/components/admin/users/UserTableRow.tsx | 107 +- .../admin/users/UsersTableClient.tsx | 33 +- src/components/admin/users/index.ts | 16 +- src/components/admin/users/types.ts | 18 +- .../admin/users/useUserManagement.ts | 132 +- .../admin/workshops/EditProposalModal.tsx | 21 +- .../workshops/instances/InstanceFilters.tsx | 48 +- .../workshops/instances/InstanceFormModal.tsx | 234 +- .../workshops/instances/InstanceList.tsx | 86 +- .../admin/workshops/instances/index.ts | 10 +- .../admin/workshops/instances/types.ts | 30 +- .../instances/useWorkshopInstances.ts | 151 +- src/components/ai/AIAdvisorChat.tsx | 86 +- src/components/ai/AIFieldIndicator.tsx | 85 +- src/components/ai/AIFormAssist.tsx | 152 +- src/components/analyse/AnalyseTabs.tsx | 22 +- src/components/analyse/MissingDataBanner.tsx | 37 +- .../analyse/charts/ChartWrapper.tsx | 22 +- .../analyse/charts/RevenueAreaChart.tsx | 78 +- .../analyse/charts/RevenuePieChart.tsx | 116 +- .../analyse/charts/TrendBarChart.tsx | 87 +- src/components/analyse/charts/index.tsx | 28 +- src/components/analyse/index.ts | 8 +- src/components/analyse/kpi/KPICard.tsx | 66 +- src/components/analyse/kpi/KPIGrid.tsx | 28 +- src/components/analyse/kpi/index.ts | 4 +- src/components/auth/AuthenticatedRedirect.tsx | 36 +- src/components/auth/LoginForm.tsx | 137 +- .../auth/RegistrationCompletionScreen.tsx | 42 +- src/components/auth/RegistrationWizard.tsx | 187 +- src/components/auth/SessionProvider.tsx | 52 +- src/components/auth/UserMenu.tsx | 292 +- src/components/auth/steps/AccountStep.tsx | 98 +- src/components/auth/steps/VerifyStep.tsx | 132 +- src/components/auth/steps/index.ts | 4 +- src/components/blog/BlogByline.tsx | 18 +- src/components/blog/BlogComments.tsx | 126 +- src/components/blog/BlogFeaturedGrid.tsx | 42 +- src/components/blog/BlogHero.tsx | 40 +- src/components/blog/BlogLatestList.tsx | 34 +- src/components/blog/BlogNavigationClient.tsx | 187 +- src/components/blog/BlogPostContent.tsx | 272 +- src/components/blog/BlogPostHeader.tsx | 43 +- src/components/blog/BlogPrevNext.tsx | 20 +- src/components/blog/BlogTableOfContents.tsx | 32 +- src/components/blog/NewsletterSignup.tsx | 58 +- src/components/blog/RelatedPosts.tsx | 45 +- src/components/blog/ShareButtons.tsx | 70 +- src/components/blog/UnlistedBadge.tsx | 8 +- src/components/careers/CareerApplyForm.tsx | 141 +- src/components/changelog/ChangelogHero.tsx | 12 +- .../changelog/ChangelogLatestBar.tsx | 14 +- .../changelog/ChangelogMobileNav.tsx | 19 +- src/components/changelog/ChangelogRelease.tsx | 21 +- .../changelog/ChangelogVersionRail.tsx | 20 +- src/components/commerce/MissionStrip.tsx | 37 +- src/components/common/EmptyState.tsx | 34 +- src/components/common/ErrorAlert.tsx | 47 +- src/components/common/LoadingState.tsx | 25 +- src/components/community/BenefitCard.tsx | 35 +- src/components/community/CopyButton.tsx | 22 +- src/components/community/InfoSection.tsx | 53 +- src/components/community/InquiryForm.tsx | 110 +- src/components/community/NewsletterSignup.tsx | 71 +- src/components/community/PageSection.tsx | 12 +- .../dashboard/DashboardMobileNav.tsx | 152 +- src/components/dashboard/DeviceJourney.tsx | 87 +- .../dashboard/EmailVerificationBanner.tsx | 68 +- .../dashboard/OnboardingChecklist.tsx | 64 +- .../dashboard/TechnicianActiveToggle.tsx | 34 +- src/components/dashboard/TechnikerBadges.tsx | 30 +- .../timecards/TimecardHistorySidebar.tsx | 75 +- .../decisions/BeschlussPdfExport.tsx | 34 +- .../decisions/DecisionTemplateSelector.tsx | 2 +- src/components/decisions/VoteAIAdvisor.tsx | 91 +- src/components/decisions/VotingPanel.tsx | 142 +- .../__tests__/ballot-coverage.test.tsx | 30 +- .../decisions/voting/ApprovalVote.tsx | 2 +- .../decisions/voting/ConsentVote.tsx | 10 +- src/components/decisions/voting/DotVote.tsx | 11 +- .../decisions/voting/OptionCard.tsx | 23 +- .../decisions/voting/RankedChoiceVote.tsx | 6 +- src/components/decisions/voting/ScoreVote.tsx | 11 +- .../decisions/voting/SimpleMajorityVote.tsx | 6 +- .../deliverables/DeliverableChat.tsx | 73 +- .../deliverables/DeliverableFiles.tsx | 54 +- src/components/deliverables/Markdown.tsx | 16 +- src/components/divisions/DivisionPage.tsx | 49 +- src/components/donate/DropoffForm.tsx | 128 +- src/components/erfassung/BulkActionBar.tsx | 30 +- src/components/erfassung/BulkDetailPanel.tsx | 104 +- .../erfassung/BulkSuccessScreen.tsx | 75 +- src/components/erfassung/BulkTable.tsx | 163 +- .../erfassung/CaptureDestinationFields.tsx | 132 +- src/components/erfassung/DataEntryTabs.tsx | 317 +- .../erfassung/ErfassungSubmitBar.tsx | 61 +- src/components/erfassung/ImageCapture.tsx | 312 +- .../erfassung/ProductBasicFields.tsx | 92 +- .../erfassung/ProductDimensionFields.tsx | 69 +- src/components/erfassung/ProductForm.tsx | 53 +- .../erfassung/ProductImageSection.tsx | 41 +- .../erfassung/ProductProfileFields.tsx | 31 +- .../erfassung/ProductSpecFields.tsx | 39 +- .../erfassung/StorageLocationSelect.tsx | 120 +- src/components/erfassung/SuccessScreen.tsx | 131 +- src/components/erfassung/VoiceEntry.tsx | 66 +- .../data-entry-tabs/CollapseHeader.tsx | 28 +- .../data-entry-tabs/FileUploadPanel.tsx | 29 +- .../data-entry-tabs/QuickTextPanel.tsx | 32 +- .../erfassung/data-entry-tabs/TabHeaders.tsx | 14 +- .../erfassung/data-entry-tabs/tabs-config.tsx | 22 +- src/components/erfassung/useErfassungForm.ts | 403 +- .../feedback/FleetCrownFeedbackEmbed.tsx | 28 +- src/components/hirn/HirnChatPanel.tsx | 215 +- src/components/hirn/HirnPublicFab.tsx | 54 +- .../it-hilfe-create/LocationSection.tsx | 41 +- .../it-hilfe-create/ProblemDetailsSection.tsx | 84 +- .../it-hilfe-create/SkillsSection.tsx | 32 +- src/components/it-hilfe-create/types.ts | 4 +- src/components/it-hilfe/AIDiagnosisCard.tsx | 28 +- .../it-hilfe/ITHilfeImageUpload.tsx | 94 +- src/components/it-hilfe/RequestCard.tsx | 113 +- src/components/it-hilfe/TechnicianMapList.tsx | 160 +- .../it-hilfe/TechnicianMatchCard.tsx | 154 +- .../TechnicianProfileCompletenessBanner.tsx | 36 +- .../it-hilfe/detail/ConfirmReviewCard.tsx | 65 +- .../it-hilfe/detail/MarkCompletedCard.tsx | 22 +- .../it-hilfe/detail/MatchedTechnicianCard.tsx | 30 +- src/components/it-hilfe/detail/OfferForm.tsx | 87 +- src/components/it-hilfe/detail/OffersList.tsx | 94 +- .../it-hilfe/detail/OwnerNoOffersNudge.tsx | 24 +- .../it-hilfe/detail/RequestHeader.tsx | 60 +- .../it-hilfe/detail/RequestSidebar.tsx | 121 +- src/components/it-hilfe/detail/UserOffer.tsx | 32 +- src/components/it-hilfe/detail/index.ts | 20 +- src/components/it-hilfe/detail/types.ts | 108 +- .../it-hilfe/detail/useITHilfeDetail.ts | 486 +- src/components/layout/BottomNav.tsx | 36 +- src/components/layout/Breadcrumbs.tsx | 122 +- .../layout/ConditionalMainLayout.tsx | 24 +- src/components/layout/Footer.tsx | 88 +- src/components/layout/MainLayout.tsx | 22 +- src/components/layout/MobileMenu.tsx | 196 +- src/components/layout/PageHero.tsx | 41 +- src/components/layout/PageShell.tsx | 14 +- src/components/layout/Section.tsx | 31 +- src/components/layout/header/Header.tsx | 149 +- .../layout/header/MegaMenuContent.tsx | 131 +- src/components/layout/header/NavItem.tsx | 174 +- .../layout/header/__tests__/nav-i18n.test.ts | 25 +- src/components/layout/header/index.ts | 10 +- src/components/layout/header/nav-i18n.ts | 37 +- src/components/layout/header/utils.ts | 26 +- .../layout/mobile-menu/MobileMenuFooter.tsx | 64 +- .../layout/mobile-menu/MobileMenuNav.tsx | 102 +- .../layout/mobile-menu/MobileSubLink.tsx | 53 +- src/components/legal/StatutenBody.tsx | 10 +- src/components/map/LeafletMap.tsx | 16 +- src/components/map/LeafletMapInner.tsx | 98 +- .../marketplace-sell/ImageUploadGrid.tsx | 41 +- .../marketplace-sell/ListingFormFields.tsx | 154 +- .../marketplace-sell/ListingPreview.tsx | 135 +- .../marketplace-sell/SpecFields.tsx | 65 +- src/components/marketplace-sell/types.ts | 9 +- .../marketplace/ActiveFilterChips.tsx | 152 +- src/components/marketplace/CO2Badge.tsx | 32 +- src/components/marketplace/FilterPill.tsx | 26 +- src/components/marketplace/ListingCard.tsx | 158 +- src/components/marketplace/ListingImage.tsx | 31 +- .../marketplace/ListingQuestions.tsx | 162 +- src/components/marketplace/ListingReviews.tsx | 88 +- .../marketplace/MarketplaceBrowseFacets.tsx | 55 +- .../marketplace/MarketplaceFilterBar.tsx | 28 +- .../marketplace/MarketplaceFilterSidebar.tsx | 152 +- .../marketplace/OrderReviewForm.tsx | 93 +- .../marketplace/OrderStatusTimeline.tsx | 125 +- src/components/marketplace/OsInstallHint.tsx | 24 +- .../marketplace/RatingBreakdown.tsx | 28 +- src/components/marketplace/ReviewForm.tsx | 87 +- src/components/marketplace/SellerReviews.tsx | 70 +- .../ai-camera/AIAnalysisLoader.tsx | 22 +- .../ai-camera/AICameraProductListing.tsx | 60 +- .../ai-camera/AIProductResults.tsx | 37 +- .../marketplace/ai-camera/CameraCapture.tsx | 94 +- .../ai-camera/ProductSuccessModal.tsx | 38 +- .../ai-camera/ProductSuggestionCard.tsx | 56 +- .../marketplace/ai-camera/config.ts | 47 +- src/components/marketplace/ai-camera/types.ts | 42 +- .../marketplace/cart/AddToCartButton.tsx | 32 +- .../marketplace/cart/CartDrawer.tsx | 94 +- src/components/marketplace/cart/CartIcon.tsx | 18 +- .../marketplace/cart/CartProvider.tsx | 100 +- .../cart/__tests__/CartProvider.test.tsx | 200 +- .../checkout/ShippingAddressFields.tsx | 69 +- .../membership/MembershipApplicationForm.tsx | 141 +- src/components/messages/ConversationList.tsx | 107 +- src/components/messages/MessageThread.tsx | 168 +- src/components/messaging/MessageButton.tsx | 49 +- src/components/messaging/MessageSidebar.tsx | 434 +- .../payments/PaymentMethodPicker.tsx | 83 +- .../payments/PaymentReturnBanner.tsx | 66 +- src/components/profile/AvatarUpload.tsx | 145 +- src/components/profile/ProfileHeader.tsx | 76 +- src/components/profile/ProfileOfferings.tsx | 94 +- src/components/profile/ProfileReputation.tsx | 20 +- src/components/profile/ProfileSkeleton.tsx | 2 +- src/components/profile/PublicProfile.tsx | 34 +- src/components/profile/profile-cards.tsx | 53 +- src/components/profile/useProfileData.ts | 48 +- .../providers/CsrfFetchProvider.tsx | 46 +- src/components/providers/ThemeProvider.tsx | 8 +- src/components/providers/providers.tsx | 22 +- .../search/CommandPaletteTrigger.tsx | 26 +- src/components/search/UserCommandPalette.tsx | 383 +- .../services/AppointmentBookingForm.tsx | 377 +- src/components/services/ServiceCTA.tsx | 25 +- src/components/services/ServiceFeatures.tsx | 30 +- src/components/services/ServiceHero.tsx | 38 +- src/components/services/ServicePricing.tsx | 47 +- src/components/services/ServiceProcess.tsx | 37 +- src/components/team/MonthlyReportSheet.tsx | 158 +- src/components/team/ReportPrintButton.tsx | 20 +- src/components/team/ReportShareCard.tsx | 114 +- src/components/timecards/HourRangePicker.tsx | 173 +- src/components/timecards/NoScheduleNotice.tsx | 51 +- src/components/timecards/ReminderSetting.tsx | 55 +- src/components/timecards/SaldoStrip.tsx | 117 +- src/components/timecards/ShiftWidget.tsx | 199 +- src/components/timecards/TimeOffPanel.tsx | 148 +- src/components/timecards/TimecardActions.tsx | 34 +- src/components/timecards/TimecardBulkBar.tsx | 38 +- .../timecards/TimecardDayEditor.tsx | 115 +- src/components/timecards/TimecardHeader.tsx | 24 +- .../timecards/TimecardMonthGrid.tsx | 174 +- src/components/timecards/TimecardsClient.tsx | 149 +- .../timecards/WeeklyScheduleEditor.tsx | 120 +- .../__tests__/HourRangePicker.test.tsx | 130 +- .../__tests__/TimecardMonthGrid.test.tsx | 294 +- .../timecards/client/TimecardActionBar.tsx | 52 +- .../timecards/client/TimecardEntryTools.tsx | 20 +- .../timecards/client/TimecardExtras.tsx | 32 +- .../timecards/client/TimecardMonthToolbar.tsx | 42 +- .../timecards/client/TimecardViewBar.tsx | 80 +- src/components/timecards/draft-utils.ts | 16 +- src/components/timecards/types.ts | 18 +- src/components/timecards/useCellSelection.ts | 78 +- .../timecards/useGridPointerInput.ts | 188 +- src/components/timecards/useTimecardDraft.ts | 655 +- src/components/ui/AiFormBar.tsx | 50 +- src/components/ui/Avatar.tsx | 45 +- src/components/ui/ConfirmDialog.tsx | 66 +- src/components/ui/CookieBanner.tsx | 49 +- src/components/ui/Drawer.tsx | 54 +- src/components/ui/EmptyState.tsx | 35 +- src/components/ui/Eyebrow.tsx | 12 +- src/components/ui/FilterBar.tsx | 45 +- src/components/ui/FilterableGrid.tsx | 44 +- src/components/ui/FilterableSection.tsx | 70 +- src/components/ui/Heading.tsx | 38 +- src/components/ui/IconBadge.tsx | 26 +- src/components/ui/LoadingSpinner.tsx | 6 +- src/components/ui/LocaleSwitcher.tsx | 96 +- src/components/ui/Logo.tsx | 16 +- src/components/ui/Modal.tsx | 40 +- src/components/ui/Pagination.tsx | 113 +- src/components/ui/Panel.tsx | 46 +- src/components/ui/StarRating.tsx | 36 +- src/components/ui/Stepper.tsx | 69 +- src/components/ui/Tabs.tsx | 26 +- src/components/ui/ThemeToggle.tsx | 34 +- .../ui/__tests__/form-primitives.test.tsx | 226 +- .../__tests__/overlays-are-accessible.test.ts | 44 +- .../ui/__tests__/status-badge.test.tsx | 86 +- .../ui/__tests__/status-banner.test.tsx | 102 +- src/components/ui/button-class.ts | 28 +- src/components/ui/button.tsx | 66 +- src/components/ui/card.tsx | 49 +- src/components/ui/contact-link.tsx | 34 +- src/components/ui/context-menu.tsx | 100 +- src/components/ui/form-field.tsx | 36 +- src/components/ui/input.tsx | 20 +- src/components/ui/select.tsx | 22 +- src/components/ui/status-badge.tsx | 26 +- src/components/ui/status-banner.tsx | 49 +- src/components/ui/textarea.tsx | 24 +- src/components/workshops/PaymentForm.tsx | 41 +- .../workshops/RegistrationSuccessCard.tsx | 35 +- .../workshops/WorkshopInstanceCard.tsx | 28 +- .../workshops/WorkshopLoginPrompt.tsx | 28 +- .../workshops/WorkshopMaterials.tsx | 135 +- .../workshops/WorkshopRegistrationForm.tsx | 209 +- src/components/workshops/WorkshopReviews.tsx | 99 +- src/components/workshops/index.ts | 10 +- src/components/workshops/types.ts | 296 +- src/config/__tests__/activity.test.ts | 122 +- .../__tests__/admin-sections-i18n.test.ts | 84 +- src/config/__tests__/analyse-metrics.test.ts | 126 +- src/config/__tests__/approval-status.test.ts | 168 +- src/config/__tests__/booking-status.test.ts | 98 +- .../__tests__/canton-coordinates.test.ts | 134 +- src/config/__tests__/co2-impact.test.ts | 127 +- .../contact-address-reachable.test.ts | 66 +- src/config/__tests__/dashboard.test.ts | 100 +- src/config/__tests__/decisions.test.ts | 90 +- .../donations-activity-config.test.ts | 336 +- src/config/__tests__/donations.test.ts | 162 +- .../__tests__/e2e-test-accounts.test.ts | 20 +- src/config/__tests__/editable-fields.test.ts | 84 +- src/config/__tests__/email.test.ts | 164 +- src/config/__tests__/erfassung-config.test.ts | 388 +- .../__tests__/erfassung-spec-profiles.test.ts | 296 +- .../__tests__/hirn-page-contexts.test.ts | 26 +- .../__tests__/i18n-array-parity.test.ts | 72 +- src/config/__tests__/intake-checklist.test.ts | 639 +- src/config/__tests__/intake-status.test.ts | 68 +- src/config/__tests__/intake-workflow.test.ts | 24 +- .../inventory-routes-match-services.test.ts | 33 +- .../it-hilfe-marketplace-config.test.ts | 380 +- src/config/__tests__/it-hilfe.test.ts | 200 +- src/config/__tests__/lifecycle-stage.test.ts | 78 +- src/config/__tests__/lifecycle-status.test.ts | 258 +- .../__tests__/local-asset-urls-exist.test.ts | 46 +- .../__tests__/marketplace-config.test.ts | 140 +- .../__tests__/marketplace-status.test.ts | 84 +- src/config/__tests__/marketplace.test.ts | 164 +- src/config/__tests__/misc-config.test.ts | 285 +- src/config/__tests__/nav-i18n-keys.test.ts | 28 +- .../navigation-links-resolve.test.ts | 32 +- .../no-brand-suffix-in-message-titles.test.ts | 38 +- .../__tests__/no-doubled-title-brand.test.ts | 73 +- .../__tests__/open-source-registry.test.ts | 162 +- .../__tests__/oss-protocols-config.test.ts | 297 +- .../__tests__/page-titles-not-doubled.test.ts | 30 +- src/config/__tests__/payrexx.test.ts | 96 +- src/config/__tests__/promo-codes.test.ts | 123 +- src/config/__tests__/protocols.test.ts | 98 +- .../registration-and-profile.test.ts | 83 +- src/config/__tests__/remaining-config.test.ts | 431 +- src/config/__tests__/review-status.test.ts | 102 +- src/config/__tests__/sections.test.ts | 180 +- .../__tests__/service-categories.test.ts | 104 +- src/config/__tests__/service-icons.test.ts | 136 +- src/config/__tests__/services-nav.test.ts | 54 +- src/config/__tests__/status-config.test.ts | 314 +- src/config/__tests__/status-helpers.test.ts | 108 +- src/config/__tests__/status-misc.test.ts | 79 +- src/config/__tests__/system-constants.test.ts | 240 +- src/config/__tests__/tasks.test.ts | 90 +- src/config/__tests__/tax-ssot.test.ts | 46 +- src/config/__tests__/team.test.ts | 94 +- src/config/__tests__/terminology.test.ts | 16 +- src/config/__tests__/upcycling-routes.test.ts | 18 +- src/config/__tests__/urls.test.ts | 58 +- .../workshops-config-matches-messages.test.ts | 36 +- src/config/__tests__/workshops.test.ts | 138 +- src/config/activity.ts | 38 +- src/config/admin-content.ts | 4 +- src/config/ai-forms.ts | 8 +- src/config/analyse/__tests__/metrics.test.ts | 82 +- src/config/analyse/metrics.ts | 56 +- src/config/api-defaults.ts | 6 +- src/config/appointment-status.ts | 8 +- src/config/approval-sources.ts | 32 +- src/config/approval-status.ts | 39 +- src/config/auth-ui.ts | 8 +- src/config/blog-authors.ts | 22 +- src/config/blog-comments.ts | 8 +- src/config/blog.ts | 14 +- src/config/booking-status.ts | 123 +- src/config/brand.ts | 2 +- src/config/btcpay.ts | 14 +- src/config/build-computer.ts | 64 +- src/config/canton-coordinates.ts | 56 +- src/config/changelog.ts | 16 +- src/config/co2-impact.ts | 84 +- src/config/community.ts | 2 +- src/config/content-audience.ts | 12 +- src/config/content-status.ts | 4 +- src/config/customer-journeys.ts | 29 +- src/config/dashboard.ts | 159 +- src/config/database.ts | 39 +- src/config/decisions.ts | 90 +- src/config/deliverables.ts | 59 +- src/config/divisions.ts | 50 +- src/config/donations.ts | 120 +- src/config/e2e-test-accounts.ts | 11 +- src/config/editable-fields.ts | 20 +- src/config/email.ts | 2 +- .../erfassung/__tests__/categories.test.ts | 188 +- .../erfassung/__tests__/conditions.test.ts | 156 +- .../erfassung/__tests__/profiles.test.ts | 112 +- .../__tests__/spec-templates.test.ts | 114 +- .../__tests__/storage-locations.test.ts | 30 +- src/config/erfassung/bulk.ts | 116 +- src/config/erfassung/categories.ts | 75 +- src/config/erfassung/conditions.ts | 104 +- src/config/erfassung/index.ts | 15 +- src/config/erfassung/profiles.ts | 47 +- src/config/erfassung/spec-templates.ts | 42 +- src/config/erfassung/storage-locations.ts | 16 +- src/config/error-messages.ts | 31 +- src/config/evig-projects.ts | 26 +- src/config/gateway-status.ts | 4 +- src/config/helper-status.ts | 2 +- src/config/hirn/page-contexts.ts | 198 +- src/config/holidays.ts | 56 +- src/config/hr-application-status.ts | 30 +- src/config/hr-vacancies.ts | 116 +- src/config/intake-checklist.ts | 202 +- src/config/intake-status.ts | 24 +- src/config/intake-workflow.ts | 21 +- src/config/integrations.ts | 18 +- src/config/invoice-status.ts | 8 +- src/config/it-hilfe.ts | 503 +- src/config/lifecycle-stage.ts | 84 +- src/config/limits.ts | 12 +- src/config/location-status.ts | 30 +- src/config/map.ts | 22 +- src/config/marketplace-status.ts | 46 +- src/config/marketplace.ts | 268 +- .../__tests__/condition-criteria.test.ts | 92 +- src/config/marketplace/condition-criteria.ts | 27 +- src/config/membership-status.ts | 12 +- src/config/navigation.tsx | 46 +- src/config/notifications.ts | 12 +- src/config/open-source-registry.ts | 1622 +- src/config/org.ts | 30 +- src/config/page-content.ts | 7 +- src/config/pagination.ts | 4 +- src/config/payment-providers.ts | 54 +- src/config/payment-status.ts | 10 +- src/config/payrexx.ts | 27 +- src/config/permission-request-status.ts | 3 +- src/config/pillars.ts | 14 +- src/config/presentations.ts | 32 +- src/config/profile.ts | 40 +- src/config/projects.ts | 38 +- src/config/promo-codes.ts | 82 +- src/config/protocol-status.ts | 2 +- src/config/protocols.ts | 54 +- src/config/redis.ts | 2 +- src/config/refund.ts | 16 +- src/config/registration.ts | 8 +- src/config/repairer-status.ts | 14 +- src/config/report-status.ts | 2 +- src/config/review-status.ts | 44 +- src/config/routes.ts | 239 +- src/config/sections.ts | 223 +- src/config/security.ts | 14 +- src/config/service-appointments.ts | 2 +- src/config/service-categories.ts | 38 +- src/config/service-icons.ts | 20 +- src/config/services-nav.ts | 24 +- src/config/services.ts | 2 +- src/config/statuten.ts | 36 +- src/config/swiss-cantons.ts | 35 +- src/config/taler.ts | 14 +- src/config/tasks.ts | 9 +- src/config/tax.ts | 8 +- src/config/team.ts | 86 +- src/config/teams.ts | 63 +- src/config/terminology.ts | 10 +- src/config/time-off.ts | 24 +- src/config/timecards.ts | 87 +- src/config/transcription.ts | 26 +- src/config/ui-colors.ts | 46 +- src/config/ui/buttons.ts | 33 +- src/config/ui/index.ts | 10 +- src/config/ui/layouts.ts | 2 +- src/config/ui/spacing.ts | 2 +- src/config/ui/status.ts | 4 +- src/config/ui/typography.ts | 2 +- src/config/upcycling-assets.ts | 16 +- src/config/upcycling-evidence.ts | 6 +- src/config/upcycling-routes.ts | 26 +- src/config/urls.ts | 19 +- src/config/workshop-registration-status.ts | 29 +- src/config/workshops.ts | 161 +- src/data/about.ts | 163 +- src/data/pricing.ts | 12 +- src/data/upcycling-status.ts | 34 +- src/db/index.ts | 8 +- src/db/schema/activity.ts | 60 +- src/db/schema/applications.ts | 144 +- src/db/schema/auth.ts | 445 +- src/db/schema/content.ts | 434 +- src/db/schema/customer.ts | 2 +- src/db/schema/decisions.ts | 264 +- src/db/schema/deliverables.ts | 116 +- src/db/schema/donations.ts | 104 +- src/db/schema/hirn.ts | 229 +- src/db/schema/hr-vacancies.ts | 42 +- src/db/schema/index.ts | 62 +- src/db/schema/inventory.ts | 631 +- src/db/schema/itHilfe.ts | 280 +- src/db/schema/locations.ts | 163 +- src/db/schema/marketplace.ts | 726 +- src/db/schema/messaging.ts | 302 +- src/db/schema/misc.ts | 20 +- src/db/schema/newsletters.ts | 66 +- src/db/schema/org-numbers.ts | 44 +- src/db/schema/payments.ts | 955 +- src/db/schema/projects.ts | 141 +- src/db/schema/promo-codes.ts | 88 +- src/db/schema/protocols.ts | 114 +- src/db/schema/referral.ts | 101 +- src/db/schema/reviews.ts | 332 +- src/db/schema/services.ts | 670 +- src/db/schema/storage-locations.ts | 40 +- src/db/schema/subscriptions.ts | 177 +- src/db/schema/tasks.ts | 216 +- src/db/schema/team.ts | 688 +- src/db/schema/teams.ts | 208 +- src/db/schema/timecards.ts | 187 +- src/db/schema/workshops.ts | 416 +- src/env.ts | 22 +- src/global.d.ts | 4 +- src/hooks/__tests__/useAICamera.test.tsx | 191 +- src/hooks/__tests__/useAIFormAssist.test.tsx | 528 +- .../__tests__/useAIProductAnalysis.test.tsx | 393 +- src/hooks/__tests__/useAppointments.test.tsx | 120 +- src/hooks/__tests__/useAudioPlayback.test.tsx | 242 +- .../__tests__/useBlogCategories.test.tsx | 378 +- src/hooks/__tests__/useDebounce.test.tsx | 162 +- src/hooks/__tests__/useFiltering.test.tsx | 344 +- src/hooks/__tests__/useFocusTrap.test.tsx | 140 +- src/hooks/__tests__/useFormHandler.test.tsx | 488 +- .../__tests__/useMarketplaceListings.test.tsx | 634 +- .../__tests__/useProductAnalysis.test.tsx | 217 +- src/hooks/__tests__/useRegistration.test.tsx | 298 +- .../__tests__/useReviewManagement.test.tsx | 500 +- src/hooks/__tests__/useVoiceProduct.test.tsx | 226 +- .../__tests__/useVoiceRecording.test.tsx | 436 +- src/hooks/useAICamera.ts | 28 +- src/hooks/useAIFormAssist.ts | 242 +- src/hooks/useAIProductAnalysis.ts | 234 +- src/hooks/useAdminLocations.ts | 139 +- src/hooks/useAdminReviews.ts | 172 +- src/hooks/useAdminWorkshopInstance.ts | 87 +- src/hooks/useAdminWorkshops.ts | 143 +- src/hooks/useAppointments.ts | 157 +- src/hooks/useAsyncAction.ts | 37 +- src/hooks/useAudioPlayback.ts | 62 +- src/hooks/useBlogCategories.ts | 133 +- src/hooks/useBlogSubmissions.ts | 119 +- src/hooks/useBlogSubmitForm.ts | 130 +- src/hooks/useCheckout.ts | 93 +- src/hooks/useCreateITHilfeForm.ts | 181 +- src/hooks/useDecisionHeaderCard.ts | 97 +- src/hooks/useDecisionList.ts | 153 +- src/hooks/useEditITHilfeForm.ts | 190 +- src/hooks/useEditStaticPage.ts | 104 +- src/hooks/useFiltering.ts | 111 +- src/hooks/useFocusTrap.ts | 64 +- src/hooks/useFormHandler.ts | 211 +- src/hooks/useITHilfeRequests.ts | 143 +- src/hooks/useListingSellForm.ts | 260 +- src/hooks/useLocationDetail.ts | 157 +- src/hooks/useMarketplaceListings.ts | 319 +- src/hooks/useMyListings.ts | 154 +- src/hooks/useMyOffers.ts | 126 +- src/hooks/useNewsletterSubscribe.ts | 48 +- src/hooks/useOrderDetail.ts | 183 +- src/hooks/usePaymentReturnBanner.ts | 64 +- src/hooks/useProductAnalysis.ts | 83 +- src/hooks/useProtocolForm.ts | 194 +- src/hooks/useRegistration.ts | 72 +- src/hooks/useReviewManagement.ts | 244 +- src/hooks/useScrollSpy.ts | 30 +- src/hooks/useSellerProfile.ts | 136 +- src/hooks/useShippingAddress.ts | 111 +- src/hooks/useTaskActions.ts | 145 +- src/hooks/useTaskForm.ts | 172 +- src/hooks/useTechnicianList.ts | 127 +- src/hooks/useTechnicianProfile.ts | 104 +- src/hooks/useTechnicianProfileStatus.ts | 32 +- src/hooks/useTimecardIntl.ts | 40 +- src/hooks/useUsersList.ts | 97 +- src/hooks/useVoiceProduct.ts | 63 +- src/hooks/useVoiceRecording.ts | 223 +- src/hooks/useVoteState.ts | 56 +- src/hooks/useWorkshopProposalDetail.ts | 44 +- src/hooks/useWorkshopRegistrations.ts | 114 +- src/i18n/navigation.ts | 6 +- src/i18n/request.ts | 62 +- src/i18n/routing.ts | 12 +- src/instrumentation.ts | 6 +- src/lib/__tests__/activity.test.ts | 100 +- src/lib/__tests__/api-helpers.test.ts | 154 +- src/lib/__tests__/blog-access.test.ts | 77 +- src/lib/__tests__/blog-db.test.ts | 254 +- src/lib/__tests__/blog-utils.test.ts | 120 +- src/lib/__tests__/blog.test.ts | 386 +- src/lib/__tests__/date-formats.test.ts | 248 +- src/lib/__tests__/design-system.test.ts | 283 +- src/lib/__tests__/detect-multi.test.ts | 132 +- src/lib/__tests__/logger.test.ts | 194 +- .../__tests__/org-numbers.defaults.test.ts | 94 +- src/lib/__tests__/org-numbers.test.ts | 236 +- src/lib/__tests__/permissions.test.ts | 260 +- src/lib/__tests__/pricing.test.ts | 178 +- src/lib/__tests__/swiss-postal-codes.test.ts | 170 +- src/lib/__tests__/uiEvents.test.ts | 108 +- src/lib/__tests__/utils.test.ts | 156 +- src/lib/activity.ts | 38 +- src/lib/admin-ui.ts | 135 +- src/lib/admin/__tests__/edit-utils.test.ts | 225 +- .../admin/__tests__/inventory-actions.test.ts | 275 +- src/lib/admin/actions.ts | 61 +- src/lib/admin/edit-utils.ts | 18 +- src/lib/admin/guards.ts | 30 +- src/lib/admin/inventory-actions.ts | 75 +- src/lib/ai/__tests__/callWithFallback.test.ts | 234 +- .../ai/__tests__/decisions-narrative.test.ts | 181 +- src/lib/ai/__tests__/extract.test.ts | 284 +- .../ai/__tests__/fill-prompt-template.test.ts | 73 +- .../ai/__tests__/no-retired-models.test.ts | 57 +- src/lib/ai/__tests__/prompt-helpers.test.ts | 225 +- .../ai/__tests__/protocol-processing.test.ts | 54 +- src/lib/ai/__tests__/provider-config.test.ts | 130 +- src/lib/ai/__tests__/providers-pure.test.ts | 140 +- src/lib/ai/__tests__/refine-templates.test.ts | 24 +- src/lib/ai/__tests__/schema-to-prompt.test.ts | 154 +- src/lib/ai/config/prompts.ts | 2 +- src/lib/ai/config/prompts/content.ts | 40 +- src/lib/ai/config/prompts/decisions.ts | 59 +- src/lib/ai/config/prompts/erfassung.ts | 53 +- src/lib/ai/config/prompts/index.ts | 216 +- src/lib/ai/config/prompts/shared.ts | 2 +- src/lib/ai/decisions-narrative.ts | 32 +- src/lib/ai/extract.ts | 261 +- src/lib/ai/protocol-processing.ts | 136 +- src/lib/ai/providers.ts | 593 +- src/lib/ai/schema-to-prompt.ts | 18 +- src/lib/api/__tests__/client.test.ts | 173 +- src/lib/api/__tests__/cron-auth.test.ts | 86 +- .../api/__tests__/cron-routes-guarded.test.ts | 34 +- src/lib/api/__tests__/helpers.test.ts | 204 +- src/lib/api/__tests__/middleware.test.ts | 212 +- .../__tests__/money-routes-guarded.test.ts | 40 +- .../api/__tests__/response-helpers.test.ts | 276 +- src/lib/api/__tests__/task-helpers.test.ts | 91 +- src/lib/api/ai-product-analysis.ts | 14 +- src/lib/api/client.ts | 54 +- src/lib/api/cron-auth.ts | 33 +- src/lib/api/csrf-client.ts | 24 +- src/lib/api/deprecated-endpoint.ts | 4 +- src/lib/api/helpers.ts | 87 +- src/lib/api/keyset.ts | 47 +- src/lib/api/middleware.ts | 51 +- src/lib/api/parse-multipart.ts | 70 +- src/lib/api/swr.ts | 17 +- src/lib/api/task-helpers.ts | 27 +- src/lib/api/types.ts | 34 +- src/lib/approvals/counts.ts | 97 +- src/lib/auth/__tests__/audit.test.ts | 393 +- src/lib/auth/__tests__/config.test.ts | 364 +- src/lib/auth/__tests__/csrf.test.ts | 125 +- src/lib/auth/__tests__/db-connection.test.ts | 315 +- src/lib/auth/__tests__/db-roles.test.ts | 273 +- src/lib/auth/__tests__/db-services.test.ts | 91 +- src/lib/auth/__tests__/db-users.test.ts | 292 +- .../auth/__tests__/db-verification.test.ts | 376 +- src/lib/auth/__tests__/db-workshops.test.ts | 132 +- src/lib/auth/__tests__/password.test.ts | 126 +- src/lib/auth/__tests__/permissions.test.ts | 258 +- src/lib/auth/__tests__/rate-limiter.test.ts | 278 +- src/lib/auth/audit.ts | 227 +- src/lib/auth/config.ts | 171 +- src/lib/auth/csrf.ts | 148 +- src/lib/auth/db-connection.ts | 141 +- src/lib/auth/db-roles.ts | 219 +- src/lib/auth/db-services.ts | 58 +- src/lib/auth/db-users.ts | 309 +- src/lib/auth/db-verification.ts | 198 +- src/lib/auth/db-workshops.ts | 109 +- src/lib/auth/db.ts | 32 +- src/lib/auth/password.ts | 65 +- src/lib/auth/rate-limiter.ts | 230 +- src/lib/auth/redis.ts | 75 +- src/lib/blog-access.ts | 10 +- src/lib/blog-db.ts | 168 +- src/lib/blog-merge.ts | 22 +- src/lib/blog-toc.ts | 30 +- src/lib/blog-unlisted-auth.ts | 30 +- src/lib/blog-utils.ts | 40 +- src/lib/blog.ts | 138 +- src/lib/blog/author.ts | 30 +- src/lib/changelog.ts | 28 +- src/lib/constants.ts | 16 +- src/lib/content-access.ts | 21 +- src/lib/contexts/DropdownContext.tsx | 284 +- src/lib/dashboard/__tests__/techniker.test.ts | 206 +- src/lib/dashboard/personal-section.ts | 88 +- src/lib/dashboard/system-health.ts | 26 +- src/lib/dashboard/team-activity.ts | 28 +- src/lib/dashboard/team-current.ts | 36 +- src/lib/dashboard/techniker.ts | 197 +- src/lib/dashboard/voting.ts | 32 +- src/lib/date-formats.ts | 50 +- src/lib/deliverables/ai.ts | 123 +- src/lib/design-system.ts | 163 +- src/lib/design/nav.ts | 19 +- src/lib/design/tokens.ts | 38 +- src/lib/domain/__tests__/it-hilfe.test.ts | 138 +- src/lib/domain/__tests__/marketplace.test.ts | 148 +- src/lib/domain/__tests__/onboarding.test.ts | 56 +- .../__tests__/technician-profile.test.ts | 30 +- .../__tests__/technician-visibility.test.ts | 44 +- .../upcycling-status-helpers.test.ts | 61 +- src/lib/domain/hr/application-transitions.ts | 12 +- src/lib/domain/hr/hire.ts | 34 +- src/lib/domain/hr/vacancy-transitions.ts | 21 +- src/lib/domain/it-hilfe.ts | 16 +- src/lib/domain/marketplace.ts | 39 +- src/lib/domain/onboarding.ts | 42 +- src/lib/domain/technician-profile.ts | 22 +- src/lib/domain/technician-visibility.ts | 28 +- src/lib/domain/upcycling-status-helpers.ts | 67 +- src/lib/email/__tests__/index.test.ts | 170 +- src/lib/email/__tests__/listmonk.test.ts | 276 +- .../template-subject-interpolation.test.ts | 29 +- .../email/__tests__/templates-admin.test.ts | 77 +- .../__tests__/templates-appointments.test.ts | 131 +- .../email/__tests__/templates-auth.test.ts | 196 +- .../email/__tests__/templates-blog.test.ts | 116 +- .../email/__tests__/templates-content.test.ts | 82 +- .../__tests__/templates-decisions.test.ts | 74 +- .../email/__tests__/templates-inquiry.test.ts | 87 +- .../__tests__/templates-it-hilfe.test.ts | 248 +- .../__tests__/templates-locations.test.ts | 65 +- .../__tests__/templates-marketplace.test.ts | 252 +- .../email/__tests__/templates-misc.test.ts | 223 +- .../__tests__/templates-newsletter.test.ts | 42 +- .../__tests__/templates-notification.test.ts | 46 +- .../email/__tests__/templates-reviews.test.ts | 84 +- .../email/__tests__/templates-sellers.test.ts | 36 +- .../email/__tests__/templates-teams.test.ts | 74 +- .../__tests__/templates-workshop.test.ts | 347 +- src/lib/email/index.ts | 8 +- src/lib/email/listmonk.ts | 6 +- src/lib/email/templates/admin.ts | 6 +- src/lib/email/templates/appointments.ts | 30 +- src/lib/email/templates/auth.ts | 8 +- src/lib/email/templates/base-styles.ts | 5 +- src/lib/email/templates/blog.ts | 13 +- src/lib/email/templates/content.ts | 4 +- src/lib/email/templates/decisions.ts | 63 +- src/lib/email/templates/donation-dropoff.ts | 48 +- src/lib/email/templates/index.ts | 14 +- src/lib/email/templates/inquiry.ts | 39 +- src/lib/email/templates/it-hilfe.ts | 80 +- src/lib/email/templates/locations.ts | 20 +- src/lib/email/templates/marketplace.ts | 60 +- src/lib/email/templates/notification.ts | 16 +- src/lib/email/templates/projects.ts | 42 +- src/lib/email/templates/referral.ts | 29 +- src/lib/email/templates/reviews.ts | 2 +- src/lib/email/templates/sellers.ts | 5 +- src/lib/email/templates/teams.ts | 38 +- src/lib/email/templates/workshop.ts | 26 +- .../__tests__/ai-classification.test.ts | 406 +- .../erfassung/__tests__/ai-extraction.test.ts | 227 +- .../__tests__/ai-field-mapping.test.ts | 296 +- .../__tests__/bulk-extraction.test.ts | 306 +- .../__tests__/create-product.test.ts | 390 +- .../erfassung/__tests__/detect-multi.test.ts | 179 +- .../erfassung/__tests__/file-parser.test.ts | 166 +- src/lib/erfassung/ai-classification.ts | 154 +- src/lib/erfassung/ai-extraction.ts | 145 +- src/lib/erfassung/ai-field-mapping.ts | 173 +- src/lib/erfassung/bulk-extraction.ts | 162 +- src/lib/erfassung/create-product.ts | 237 +- src/lib/erfassung/detect-multi.ts | 42 +- src/lib/erfassung/file-parser.ts | 130 +- src/lib/erfassung/voice-to-product.ts | 50 +- src/lib/hirn/__tests__/action-cockpit.test.ts | 28 +- .../action-executor-contracts.test.ts | 114 +- .../hirn/__tests__/action-executor.test.ts | 22 +- src/lib/hirn/__tests__/chat.test.ts | 227 +- src/lib/hirn/__tests__/chunking.test.ts | 178 +- src/lib/hirn/__tests__/format.test.ts | 135 +- .../hirn/__tests__/free-model-default.test.ts | 24 +- src/lib/hirn/__tests__/ingestion.test.ts | 297 +- src/lib/hirn/__tests__/provider-impls.test.ts | 437 +- src/lib/hirn/__tests__/providers.test.ts | 283 +- src/lib/hirn/__tests__/retrieval.test.ts | 191 +- src/lib/hirn/action-cockpit.ts | 41 +- src/lib/hirn/action-executor-contracts.ts | 17 +- src/lib/hirn/action-executor.ts | 137 +- src/lib/hirn/chat.ts | 143 +- src/lib/hirn/chunking.ts | 402 +- src/lib/hirn/data/__tests__/analysis.test.ts | 333 +- .../data/__tests__/financial-loader.test.ts | 479 +- .../data/__tests__/methodology-ssot.test.ts | 214 +- src/lib/hirn/data/analysis.ts | 73 +- src/lib/hirn/data/financial-loader.ts | 93 +- src/lib/hirn/data/methodology-ssot.ts | 176 +- src/lib/hirn/format.ts | 6 +- src/lib/hirn/index.ts | 30 +- src/lib/hirn/ingestion.ts | 186 +- src/lib/hirn/providers/groq.ts | 91 +- src/lib/hirn/providers/index.ts | 144 +- src/lib/hirn/providers/ollama.ts | 156 +- src/lib/hirn/providers/openrouter.ts | 96 +- src/lib/hirn/providers/types.ts | 60 +- src/lib/hirn/public-prompt.ts | 10 +- src/lib/hirn/retrieval.ts | 165 +- src/lib/hirn/system-prompt.ts | 38 +- src/lib/hr/notifications.ts | 16 +- src/lib/hr/public-urls.ts | 6 +- src/lib/i18n/db-content.ts | 31 +- src/lib/i18n/plural-de.ts | 2 +- src/lib/images/__tests__/downscale.test.ts | 22 +- src/lib/images/downscale.ts | 88 +- src/lib/impact-stats.ts | 58 +- src/lib/intake/__tests__/timeline.test.ts | 138 +- src/lib/intake/timeline-types.ts | 20 +- src/lib/intake/timeline.ts | 28 +- .../inventory/__tests__/csv-analysis.test.ts | 248 +- src/lib/inventory/csv-analysis.ts | 124 +- src/lib/invoices/pdf-template.ts | 114 +- .../find-or-create-anonymous-user.test.ts | 72 +- .../it-hilfe/__tests__/notifications.test.ts | 205 +- .../__tests__/offer-accept-tokens.test.ts | 232 +- .../it-hilfe/__tests__/request-mapper.test.ts | 202 +- src/lib/it-hilfe/accept-offer.ts | 179 +- src/lib/it-hilfe/conversation.ts | 23 +- .../it-hilfe/find-or-create-anonymous-user.ts | 22 +- src/lib/it-hilfe/notifications.ts | 223 +- src/lib/it-hilfe/offer-accept-tokens.ts | 66 +- src/lib/it-hilfe/request-mapper.ts | 72 +- src/lib/it-hilfe/sql.ts | 13 +- src/lib/it-hilfe/technician.ts | 10 +- src/lib/kivvi/__tests__/client.test.ts | 398 +- src/lib/kivvi/client.ts | 124 +- src/lib/kivvi/sync-product.ts | 92 +- src/lib/legal/statuten-body.ts | 36 +- src/lib/lifecycle/__tests__/dispatch.test.ts | 137 +- .../__tests__/guarded-transition.test.ts | 97 +- .../__tests__/review-workflow.test.ts | 199 +- .../lifecycle/__tests__/state-machine.test.ts | 147 +- src/lib/lifecycle/dispatch.ts | 103 +- src/lib/lifecycle/guarded-transition.ts | 47 +- src/lib/lifecycle/index.ts | 4 +- src/lib/lifecycle/review-workflow.ts | 198 +- src/lib/lifecycle/state-machine.ts | 43 +- src/lib/logger.ts | 49 +- .../__tests__/complete-order.test.ts | 67 +- .../__tests__/listing-helpers.test.ts | 182 +- .../marketplace/__tests__/spec-utils.test.ts | 88 +- src/lib/marketplace/checkout-listing.ts | 26 +- src/lib/marketplace/complete-order.ts | 28 +- src/lib/marketplace/listing-detail.ts | 130 +- src/lib/marketplace/listing-helpers.ts | 11 +- .../marketplace/publish-revampit-listing.ts | 126 +- src/lib/marketplace/resolve-legacy-product.ts | 50 +- src/lib/marketplace/spec-utils.ts | 14 +- .../messaging/__tests__/send-message.test.ts | 224 +- src/lib/messaging/send-message.ts | 87 +- .../__tests__/pci-compliance.test.ts | 400 +- src/lib/middleware/pci-compliance.ts | 142 +- src/lib/og/brand-card.tsx | 16 +- src/lib/org-numbers.defaults.ts | 298 +- src/lib/org-numbers.ts | 55 +- src/lib/payments/__tests__/currency.test.ts | 220 +- .../payments/__tests__/payment-flow.test.ts | 452 +- .../__tests__/payments-escrow.test.ts | 118 +- .../payments/__tests__/payments-fees.test.ts | 146 +- .../__tests__/payments-gateway.test.ts | 209 +- .../__tests__/payments-invoice.test.ts | 218 +- .../payments/__tests__/payrexx-client.test.ts | 234 +- .../payments/__tests__/security-misc.test.ts | 202 +- src/lib/payments/__tests__/security.test.ts | 196 +- .../payments/__tests__/tax-compliance.test.ts | 277 +- src/lib/payments/currency.ts | 147 +- .../gateways/__tests__/gateways.test.ts | 262 +- src/lib/payments/gateways/btcpay.ts | 100 +- src/lib/payments/gateways/index.ts | 37 +- src/lib/payments/gateways/mock.ts | 30 +- src/lib/payments/gateways/payrexx.ts | 69 +- src/lib/payments/gateways/taler.ts | 107 +- src/lib/payments/gateways/types.ts | 48 +- src/lib/payments/payment-flow.ts | 161 +- src/lib/payments/payment-return.ts | 24 +- src/lib/payments/payments-escrow.ts | 46 +- src/lib/payments/payments-fees.ts | 39 +- src/lib/payments/payments-gateway.ts | 79 +- src/lib/payments/payments-invoice.ts | 68 +- src/lib/payments/payrexx-client.ts | 42 +- src/lib/payments/security.ts | 168 +- src/lib/payments/tax-compliance.ts | 242 +- src/lib/permissions.ts | 147 +- src/lib/pricing/__tests__/index.test.ts | 160 +- src/lib/pricing/index.ts | 36 +- .../__tests__/audio-validation.test.ts | 50 +- src/lib/protocols/__tests__/review.test.ts | 28 +- src/lib/protocols/__tests__/upload.test.ts | 118 +- src/lib/protocols/__tests__/workflow.test.ts | 50 +- src/lib/protocols/audio-validation.ts | 32 +- src/lib/protocols/review.ts | 134 +- src/lib/protocols/upload.ts | 61 +- src/lib/protocols/workflow.ts | 57 +- src/lib/referral.ts | 236 +- src/lib/responsive.ts | 44 +- .../reviews/__tests__/create-review.test.ts | 179 +- .../reviews/__tests__/review-service.test.ts | 223 +- src/lib/reviews/create-review.ts | 94 +- src/lib/reviews/review-service.ts | 70 +- src/lib/schemas/__tests__/activity.test.ts | 325 +- src/lib/schemas/__tests__/admin.test.ts | 580 +- src/lib/schemas/__tests__/ai.test.ts | 61 +- .../schemas/__tests__/appointments.test.ts | 254 +- src/lib/schemas/__tests__/auth.test.ts | 217 +- src/lib/schemas/__tests__/blog.test.ts | 121 +- src/lib/schemas/__tests__/common.test.ts | 212 +- src/lib/schemas/__tests__/decisions.test.ts | 360 +- src/lib/schemas/__tests__/donations.test.ts | 422 +- src/lib/schemas/__tests__/erfassung.test.ts | 278 +- .../schemas/__tests__/hr-vacancies.test.ts | 54 +- src/lib/schemas/__tests__/intake.test.ts | 325 +- src/lib/schemas/__tests__/inventory.test.ts | 176 +- src/lib/schemas/__tests__/it-hilfe.test.ts | 402 +- src/lib/schemas/__tests__/locations.test.ts | 284 +- src/lib/schemas/__tests__/marketplace.test.ts | 407 +- src/lib/schemas/__tests__/messages.test.ts | 94 +- src/lib/schemas/__tests__/newsletter.test.ts | 121 +- src/lib/schemas/__tests__/payments.test.ts | 210 +- src/lib/schemas/__tests__/protocols.test.ts | 377 +- src/lib/schemas/__tests__/repairer.test.ts | 114 +- src/lib/schemas/__tests__/reviews.test.ts | 170 +- src/lib/schemas/__tests__/seller.test.ts | 66 +- src/lib/schemas/__tests__/tasks.test.ts | 302 +- src/lib/schemas/__tests__/team.test.ts | 228 +- .../schemas/__tests__/teams-invite.test.ts | 52 +- src/lib/schemas/__tests__/timecards.test.ts | 112 +- .../__tests__/user-profile-null.test.ts | 59 +- src/lib/schemas/__tests__/user.test.ts | 148 +- src/lib/schemas/__tests__/validation.test.ts | 445 +- src/lib/schemas/__tests__/workshops.test.ts | 155 +- src/lib/schemas/activity.ts | 33 +- src/lib/schemas/admin.ts | 59 +- src/lib/schemas/ai.ts | 24 +- src/lib/schemas/appointments.ts | 103 +- src/lib/schemas/auth.ts | 67 +- src/lib/schemas/blog.ts | 21 +- src/lib/schemas/common.ts | 18 +- src/lib/schemas/decisions.ts | 43 +- src/lib/schemas/deliverables.ts | 116 +- src/lib/schemas/donations.ts | 51 +- src/lib/schemas/erfassung.ts | 23 +- src/lib/schemas/hirn.ts | 2 +- src/lib/schemas/hr-vacancies.ts | 73 +- src/lib/schemas/index.ts | 10 +- src/lib/schemas/intake.ts | 128 +- src/lib/schemas/inventory.ts | 21 +- src/lib/schemas/it-hilfe.ts | 150 +- src/lib/schemas/locations.ts | 75 +- src/lib/schemas/marketplace.ts | 199 +- src/lib/schemas/messages.ts | 21 +- src/lib/schemas/newsletter.ts | 13 +- src/lib/schemas/payments.ts | 24 +- src/lib/schemas/protocols.ts | 108 +- src/lib/schemas/repairer.ts | 14 +- src/lib/schemas/reviews.ts | 38 +- src/lib/schemas/seller.ts | 8 +- src/lib/schemas/static-pages.ts | 11 +- src/lib/schemas/tasks.ts | 29 +- src/lib/schemas/team.ts | 187 +- src/lib/schemas/teams.ts | 180 +- src/lib/schemas/time-off.ts | 52 +- src/lib/schemas/timecards.ts | 151 +- src/lib/schemas/user.ts | 28 +- src/lib/schemas/workshops.ts | 16 +- src/lib/search/__tests__/meilisearch.test.ts | 256 +- src/lib/search/meilisearch.ts | 60 +- src/lib/section-labels.ts | 28 +- src/lib/security/__tests__/rate-limit.test.ts | 166 +- src/lib/security/__tests__/sanitize.test.ts | 217 +- src/lib/security/rate-limit.ts | 10 +- src/lib/security/sanitize.ts | 18 +- src/lib/seo/__tests__/json-ld.test.ts | 40 +- src/lib/seo/__tests__/listing-json-ld.test.ts | 80 +- src/lib/seo/json-ld.ts | 2 +- src/lib/seo/listing-json-ld.ts | 36 +- .../__tests__/appointment-actions.test.ts | 493 +- .../__tests__/blog-submission.test.ts | 288 +- .../services/__tests__/blog-translate.test.ts | 69 +- .../__tests__/blog-translations.test.ts | 82 +- src/lib/services/__tests__/db.test.ts | 396 +- .../__tests__/decisions-comments.test.ts | 259 +- .../services/__tests__/decisions-crud.test.ts | 587 +- .../__tests__/decisions-helpers.test.ts | 108 +- .../__tests__/decisions-transitions.test.ts | 280 +- .../__tests__/decisions-voting.test.ts | 86 +- .../execute-appointment-update.test.ts | 83 +- src/lib/services/__tests__/index.test.ts | 277 +- .../services/__tests__/notifications.test.ts | 303 +- .../__tests__/payment-webhook.test.ts | 753 +- .../services/__tests__/presentation.test.ts | 147 +- .../__tests__/protocol-decision-tasks.test.ts | 37 +- .../__tests__/protocols-linking.test.ts | 182 +- .../__tests__/protocols-processing.test.ts | 330 +- .../__tests__/protocols-queries.test.ts | 328 +- .../__tests__/team-profile-update.test.ts | 67 +- .../__tests__/technician-service.test.ts | 206 +- .../__tests__/time-off-review.test.ts | 131 +- .../timecards-review-workflow.test.ts | 257 +- src/lib/services/appointment-actions.ts | 178 +- src/lib/services/appointments.ts | 89 +- src/lib/services/blog-submission.ts | 200 +- src/lib/services/blog-translate.ts | 140 +- src/lib/services/blog-translations.ts | 53 +- src/lib/services/db.ts | 294 +- src/lib/services/decisions-comments.ts | 25 +- src/lib/services/decisions-crud.ts | 88 +- src/lib/services/decisions-public.ts | 2 +- src/lib/services/decisions-transitions.ts | 115 +- src/lib/services/decisions-voting.ts | 117 +- src/lib/services/decisions.ts | 18 +- src/lib/services/deliverables.ts | 198 +- src/lib/services/hr-analytics.ts | 38 +- src/lib/services/hr-applications.ts | 216 +- src/lib/services/hr-vacancies.ts | 224 +- src/lib/services/index.ts | 138 +- src/lib/services/notifications.ts | 163 +- src/lib/services/onboarding-state.ts | 51 +- src/lib/services/payment-webhook.ts | 522 +- src/lib/services/presentation.ts | 35 +- src/lib/services/profile-service.ts | 210 +- src/lib/services/promo-codes.ts | 81 +- src/lib/services/protocol-decision-tasks.ts | 144 +- src/lib/services/protocols-linking.ts | 74 +- src/lib/services/protocols-processing.ts | 286 +- src/lib/services/protocols-queries.ts | 206 +- src/lib/services/protocols.ts | 10 +- src/lib/services/report-shares.ts | 46 +- src/lib/services/report.ts | 91 +- src/lib/services/saldo.ts | 157 +- src/lib/services/seller-service.ts | 2 +- src/lib/services/team-coordination.ts | 95 +- src/lib/services/team-invites.ts | 187 +- src/lib/services/team-profiles.ts | 134 +- src/lib/services/team-space.ts | 56 +- src/lib/services/teams.ts | 237 +- src/lib/services/technician-service.ts | 185 +- src/lib/services/time-off-materialize.ts | 187 +- src/lib/services/time-off.ts | 104 +- src/lib/services/timecards.ts | 509 +- src/lib/services/types.ts | 160 +- .../storage/__tests__/image-upload.test.ts | 92 +- src/lib/storage/document-upload.ts | 20 +- src/lib/storage/image-upload.ts | 105 +- src/lib/swiss-postal-codes.ts | 10 +- src/lib/tasks/task-detail.ts | 48 +- .../team/__tests__/focus-freshness.test.ts | 44 +- src/lib/team/__tests__/saldo.test.ts | 201 +- src/lib/team/__tests__/schedule.test.ts | 102 +- .../team/__tests__/timecard-approvers.test.ts | 28 +- .../__tests__/timecard-period-label.test.ts | 24 +- src/lib/team/__tests__/timecard-utils.test.ts | 22 +- src/lib/team/focus-freshness.ts | 39 +- src/lib/team/metric-progress.ts | 12 +- src/lib/team/saldo.ts | 14 +- src/lib/team/schedule.ts | 204 +- src/lib/team/timecard-approvers.ts | 22 +- src/lib/team/timecard-display.ts | 14 +- src/lib/team/timecard-intl.ts | 52 +- src/lib/team/timecard-period-label.ts | 14 +- src/lib/team/timecard-utils.ts | 54 +- .../__tests__/transcribe.test.ts | 92 +- src/lib/transcription/segment-audio.ts | 88 +- src/lib/transcription/transcribe.ts | 120 +- src/lib/types/hr.ts | 14 +- src/lib/ui/uiEvents.ts | 18 +- src/lib/upcycling/dossier-auth.ts | 30 +- src/lib/utils.ts | 30 +- src/lib/utils/__tests__/date.test.ts | 100 +- src/lib/utils/__tests__/error.test.ts | 50 +- src/lib/utils/__tests__/escape-html.test.ts | 44 +- src/lib/utils/__tests__/safe-redirect.test.ts | 18 +- src/lib/utils/__tests__/slug.test.ts | 96 +- src/lib/utils/element-selector.ts | 8 +- src/lib/utils/escape-html.ts | 2 +- src/lib/utils/safe-redirect.ts | 10 +- src/lib/utils/slug.ts | 14 +- src/proxy.ts | 133 +- src/sentry.edge.config.ts | 4 +- src/sentry.server.config.ts | 4 +- src/types/__tests__/erfassung.test.ts | 132 +- src/types/common.ts | 35 +- src/types/erfassung.ts | 27 +- src/types/it-hilfe-form.ts | 38 +- src/types/jest-dom.d.ts | 2 +- src/types/listing-form.ts | 46 +- src/types/technician.ts | 48 +- tests/chatbot-accessibility.spec.ts | 20 +- tests/e2e/appointments.spec.ts | 34 +- tests/e2e/auth-smoke.spec.ts | 58 +- tests/e2e/cms-journey.spec.ts | 68 +- tests/e2e/dashboard-timecards.spec.ts | 55 +- tests/e2e/decisions-journey.spec.ts | 80 +- tests/e2e/feature-inventory.spec.ts | 121 +- tests/e2e/global-setup.ts | 54 +- tests/e2e/helpers/api-csrf.ts | 34 +- tests/e2e/helpers/auth.ts | 129 +- tests/e2e/helpers/cms.ts | 65 +- tests/e2e/helpers/decisions.ts | 76 +- tests/e2e/helpers/hr-vacancies.ts | 62 +- tests/e2e/helpers/intake.ts | 114 +- tests/e2e/helpers/inventory-routes.ts | 329 +- tests/e2e/helpers/it-hilfe.ts | 183 +- tests/e2e/helpers/marketplace.ts | 117 +- tests/e2e/helpers/protocols.ts | 72 +- tests/e2e/helpers/route-smoke.ts | 174 +- tests/e2e/helpers/service-appointments.ts | 62 +- tests/e2e/helpers/tasks.ts | 81 +- tests/e2e/helpers/timecards.ts | 94 +- tests/e2e/helpers/ui.ts | 24 +- tests/e2e/helpers/workshop-proposals.ts | 77 +- tests/e2e/helpers/workshops.ts | 84 +- tests/e2e/hr-vacancy-journey.spec.ts | 98 +- tests/e2e/intake-journey.spec.ts | 202 +- tests/e2e/it-hilfe-journey.spec.ts | 204 +- ...hilfe-preferred-technician-journey.spec.ts | 58 +- tests/e2e/it-hilfe.spec.ts | 237 +- .../e2e/marketplace-checkout-journey.spec.ts | 189 +- tests/e2e/marketplace.spec.ts | 8 +- tests/e2e/notification-hrefs.spec.ts | 36 +- tests/e2e/payment-return.spec.ts | 26 +- tests/e2e/prod-protocols-smoke.spec.ts | 83 +- tests/e2e/protocols-journey.spec.ts | 79 +- tests/e2e/security.spec.ts | 58 +- tests/e2e/service-appointment-journey.spec.ts | 73 +- tests/e2e/tasks-journey.spec.ts | 62 +- tests/e2e/timecard-journey.spec.ts | 74 +- tests/e2e/timecards.spec.ts | 42 +- tests/e2e/user-admin-flows.spec.ts | 233 +- tests/e2e/workshop-proposal-journey.spec.ts | 70 +- tests/e2e/workshops-journey.spec.ts | 92 +- tests/multi-role-system.spec.ts | 224 +- tests/repairer.spec.ts | 176 +- tests/suggestion-button.spec.ts | 6 +- tsconfig.json | 24 +- 2552 files changed, 186954 insertions(+), 138792 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index a6dd73d1f..fd4b2eeb0 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -4,4 +4,4 @@ # options. We do not run a GitHub Sponsors / Patreon / Ko-fi page — # we're a Swiss Verein, not an individual maintainer. -custom: ["https://revamp-it.ch/get-involved/donate"] +custom: ['https://revamp-it.ch/get-involved/donate'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 806b270de..9f136b607 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,7 +1,7 @@ name: 🐛 Bug Report description: Create a report to help us fix a bug -title: "[Bug]: " -labels: ["bug", "needs-triage"] +title: '[Bug]: ' +labels: ['bug', 'needs-triage'] body: - type: markdown attributes: @@ -84,4 +84,4 @@ body: attributes: label: Additional Context description: Add any other context about the problem here - placeholder: Any additional information that might help us understand the issue \ No newline at end of file + placeholder: Any additional information that might help us understand the issue diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 906d66cd3..601826364 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,7 +1,7 @@ name: ✨ Feature Request description: Suggest an idea for RevampIT -title: "[Feature]: " -labels: ["enhancement", "needs-triage"] +title: '[Feature]: ' +labels: ['enhancement', 'needs-triage'] body: - type: markdown attributes: @@ -74,4 +74,4 @@ body: options: - label: I'd be willing to implement this feature myself - label: I'd be willing to help with testing - - label: I'd be willing to help with documentation \ No newline at end of file + - label: I'd be willing to help with documentation diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 54fe8c06e..b88f072c7 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,76 +1,76 @@ version: 2 updates: # JavaScript/TypeScript dependencies (npm) - - package-ecosystem: "npm" - directory: "/" + - package-ecosystem: 'npm' + directory: '/' schedule: - interval: "weekly" - day: "monday" + interval: 'weekly' + day: 'monday' open-pull-requests-limit: 10 # tiptap's packages share one version and break TypeScript's command # augmentation when bumped separately — they must move as one PR. groups: tiptap: patterns: - - "@tiptap/*" + - '@tiptap/*' # react-dom and the @types packages peer-pin react's major — a half-bump # (react without react-dom, or code types split) cannot even npm ci. react: patterns: - - "react" - - "react-dom" - - "@types/react" - - "@types/react-dom" + - 'react' + - 'react-dom' + - '@types/react' + - '@types/react-dom' # eslint-config-next is version-locked to next; a half-bump breaks lint. next: patterns: - - "next" - - "eslint-config-next" + - 'next' + - 'eslint-config-next' # @auth/pg-adapter peer-depends on next-auth — the pair that produced the # 2026-08 advisories must move together or neither installs. next-auth: patterns: - - "next-auth" - - "@auth/*" + - 'next-auth' + - '@auth/*' # Tailwind v4 splits the engine from the PostCSS plugin; they share a # version and a config format. tailwind: patterns: - - "tailwindcss" - - "@tailwindcss/*" - - "postcss" + - 'tailwindcss' + - '@tailwindcss/*' + - 'postcss' eslint: patterns: - - "eslint" - - "@eslint/*" - - "eslint-plugin-*" + - 'eslint' + - '@eslint/*' + - 'eslint-plugin-*' jest: patterns: - - "jest" - - "jest-environment-*" - - "@types/jest" - - "@testing-library/*" + - 'jest' + - 'jest-environment-*' + - '@types/jest' + - '@testing-library/*' ignore: # @types/node must track the RUNTIME major, not the newest release. CI # (ci.yml NODE_VERSION) and the self-host deploy both pin Node 20, so a # major bump types APIs production does not have — it also fails `verify`. # Raise this deliberately when the runtime moves. (PR #356 closed for this.) - - dependency-name: "@types/node" - update-types: ["version-update:semver-major"] + - dependency-name: '@types/node' + update-types: ['version-update:semver-major'] commit-message: - prefix: "deps" + prefix: 'deps' labels: - - "dependencies" - - "security" + - 'dependencies' + - 'security' # GitHub Actions - - package-ecosystem: "github-actions" - directory: "/" + - package-ecosystem: 'github-actions' + directory: '/' schedule: - interval: "weekly" - day: "monday" + interval: 'weekly' + day: 'monday' commit-message: - prefix: "ci" + prefix: 'ci' labels: - - "ci" - - "dependencies" + - 'ci' + - 'dependencies' diff --git a/__mocks__/next-intl.js b/__mocks__/next-intl.js index cd78add93..898bee40f 100644 --- a/__mocks__/next-intl.js +++ b/__mocks__/next-intl.js @@ -7,40 +7,44 @@ * mock this module locally with jest.mock('next-intl', ...). */ -const useTranslations = (_namespace) => (key, _params) => key +const useTranslations = (_namespace) => (key, _params) => key; -const useLocale = () => 'de' +const useLocale = () => 'de'; -const useMessages = () => ({}) +const useMessages = () => ({}); const useFormatter = () => ({ dateTime: (date) => String(date), number: (n) => String(n), relativeTime: (date) => String(date), list: (items) => items.join(', '), -}) +}); -const NextIntlClientProvider = ({ children }) => children +const NextIntlClientProvider = ({ children }) => children; -const getTranslations = async (_namespace) => (key, _params) => key +const getTranslations = async (_namespace) => (key, _params) => key; -const getMessages = async () => ({}) +const getMessages = async () => ({}); -const getLocale = async () => 'de' +const getLocale = async () => 'de'; -const defineRouting = (config) => config +const defineRouting = (config) => config; const createNavigation = (_routing) => { const Link = ({ href, children, className, ...props }) => { - const React = require('react') - return React.createElement('a', { href: typeof href === 'string' ? href : href?.pathname ?? '#', className, ...props }, children) - } - const redirect = jest.fn() - const usePathname = () => '/' - const useRouter = () => ({ push: jest.fn(), replace: jest.fn(), refresh: jest.fn() }) - const getPathname = ({ href }) => (typeof href === 'string' ? href : href?.pathname ?? '/') - return { Link, redirect, usePathname, useRouter, getPathname } -} + const React = require('react'); + return React.createElement( + 'a', + { href: typeof href === 'string' ? href : (href?.pathname ?? '#'), className, ...props }, + children, + ); + }; + const redirect = jest.fn(); + const usePathname = () => '/'; + const useRouter = () => ({ push: jest.fn(), replace: jest.fn(), refresh: jest.fn() }); + const getPathname = ({ href }) => (typeof href === 'string' ? href : (href?.pathname ?? '/')); + return { Link, redirect, usePathname, useRouter, getPathname }; +}; module.exports = { useTranslations, @@ -53,4 +57,4 @@ module.exports = { getLocale, defineRouting, createNavigation, -} +}; diff --git a/deliverables/2026-07-13-kivitendo-intake-ui/handoff.html b/deliverables/2026-07-13-kivitendo-intake-ui/handoff.html index bfc7d6efa..b3bef35cb 100644 --- a/deliverables/2026-07-13-kivitendo-intake-ui/handoff.html +++ b/deliverables/2026-07-13-kivitendo-intake-ui/handoff.html @@ -1,187 +1,545 @@ @@ -189,9 +547,11 @@

Übergabe · Revamp-IT

Kivitendo Auftragserfassung, tablet-tauglich

-

Ein reines Aussehen-Update für die Verkaufsauftrags-Maske: grössere Schrift, - ruhigere Kontraste, Touch-Ziele ab 44 px und eine Positions-Tabelle, die auf dem Tablet - scrollt statt abzuschneiden. Die Kivitendo-Struktur bleibt unangetastet.

+

+ Ein reines Aussehen-Update für die Verkaufsauftrags-Maske: grössere Schrift, ruhigere + Kontraste, Touch-Ziele ab 44 px und eine Positions-Tabelle, die auf dem Tablet scrollt + statt abzuschneiden. Die Kivitendo-Struktur bleibt unangetastet. +

CSS-only Update-sicher @@ -210,17 +570,26 @@

Kivitendo Auftragserfassung, tablet-tauglich

ANSEHEN

Die Live-Vorschau

-

Direkt hier unten — das Ziel-Aussehen, umschaltbar zwischen Desktop und Tablet. Nichts installieren.

+

+ Direkt hier unten — das Ziel-Aussehen, umschaltbar zwischen Desktop und Tablet. Nichts + installieren. +

EINBINDEN

Ein Stylesheet

-

Eine eigene .css nach der main.css laden. Kein Eingriff in Kivitendo, überlebt Updates.

+

+ Eine eigene .css nach der main.css laden. Kein Eingriff in + Kivitendo, überlebt Updates. +

PRÜFEN

2 Minuten mit F12

-

Ich sehe eure Live-DOM nicht. Alle unsicheren Selektoren sind mit ⚠ PRÜFEN markiert.

+

+ Ich sehe eure Live-DOM nicht. Alle unsicheren Selektoren sind mit + ⚠ PRÜFEN markiert. +

@@ -230,7 +599,10 @@

2 Minuten mit F12

02

Live-Vorschau

-

Das exakte Ziel-Aussehen. Schalte auf Tablet um — die Kopffelder stapeln, die Positions-Tabelle scrollt waagrecht.

+

+ Das exakte Ziel-Aussehen. Schalte auf Tablet um — die Kopffelder stapeln, die + Positions-Tabelle scrollt waagrecht. +

@@ -244,7 +616,12 @@

Live-Vorschau

- +
@@ -256,7 +633,10 @@

Live-Vorschau

03

Einbinden — update-sicher

-

Nicht in main.css schreiben (wird bei Updates überschrieben). Als eigene Datei laden.

+

+ Nicht in main.css schreiben (wird bei Updates überschrieben). Als eigene + Datei laden. +

    @@ -264,30 +644,43 @@

    Einbinden — update-sicher

    1

    Datei ablegen

    -

    Speichere kivitendo-intake.css unter css/kivitendo/revamp-intake.css (oder einem eigenen Ordner deiner Wahl).

    +

    + Speichere kivitendo-intake.css unter + css/kivitendo/revamp-intake.css (oder einem eigenen Ordner deiner Wahl). +

  1. 2

    Nach der main.css laden

    -

    Im Layout-Template referenzieren — nach der main.css, damit dein Stil gewinnt. So bleibt ein Kivitendo-Update unberührt.

    +

    + Im Layout-Template referenzieren — nach der main.css, + damit dein Stil gewinnt. So bleibt ein Kivitendo-Update unberührt. +

  2. 3

    Öffnen & kurz prüfen

    -

    Auftragsmaske öffnen. Passt alles, bist du fertig. Greift ein Block nicht: F12 → echten Klassen-/ID-Namen ablesen → im CSS ersetzen.

    +

    + Auftragsmaske öffnen. Passt alles, bist du fertig. Greift ein Block nicht: F12 → echten + Klassen-/ID-Namen ablesen → im CSS ersetzen. +

-

Die Positions-Tabelle #row_table_id füllt Kivitendo — an der Struktur ändern wir nichts. - Das CSS stylt sie nur um: grössere Zellen, fixierte Kopfzeile beim Scrollen, Zeilenstreifen, rechtsbündige Zahlen, - waagrechtes Scrollen auf dem Tablet. Diese ID ist bestätigt; die übrigen mit ⚠ PRÜFEN markierten - Selektoren (Kopf-Wrapper, Summen-Container, Zahlen-Klasse) sind sichere Annahmen für 3.9.x — bei Bedarf mit F12 gegenprüfen.

+

+ Die Positions-Tabelle #row_table_id füllt Kivitendo — an der + Struktur ändern wir nichts. Das CSS stylt sie nur um: grössere Zellen, fixierte Kopfzeile + beim Scrollen, Zeilenstreifen, rechtsbündige Zahlen, waagrechtes Scrollen auf dem Tablet. + Diese ID ist bestätigt; die übrigen mit ⚠ PRÜFEN markierten Selektoren + (Kopf-Wrapper, Summen-Container, Zahlen-Klasse) sind sichere Annahmen für 3.9.x — bei Bedarf + mit F12 gegenprüfen. +

@@ -315,23 +708,41 @@

Das CSS zum Kopieren

05

Feintuning

-

Ganz oben im CSS gibt es einen :root-Block mit Stellschrauben.

+

+ Ganz oben im CSS gibt es einen :root-Block + mit Stellschrauben. +

-
--ri-text: 17pxBasis-Schriftgrösse. Älteren Augen zuliebe hochsetzen.
-
--ri-text-lg: 19pxBeschriftungen & wichtige Felder.
-
--ri-accent: #0b6b5fRevamp-Grün für Fokus & Primäraktion.
-
--ri-touch: 44pxMindest-Touchfläche fürs Tablet.
-
body.ri-xlKlasse am <body> setzen → +2px überall.
-
--ri-radius: 8pxEcken-Rundung von Feldern & Buttons.
+
+ --ri-text: 17pxBasis-Schriftgrösse. Älteren Augen zuliebe hochsetzen. +
+
+ --ri-text-lg: 19pxBeschriftungen & wichtige Felder. +
+
+ --ri-accent: #0b6b5fRevamp-Grün für Fokus & Primäraktion. +
+
+ --ri-touch: 44pxMindest-Touchfläche fürs Tablet. +
+
+ body.ri-xlKlasse am <body> setzen → +2px überall. +
+
+ --ri-radius: 8pxEcken-Rundung von Feldern & Buttons. +